class FileUploadPanel(SimplePanel): def __init__(self): SimplePanel.__init__(self) self.form = FormPanel() self.form.setEncoding(FormPanel.ENCODING_MULTIPART) self.form.setMethod(FormPanel.METHOD_POST) self.url = "http://localhost/pyjamas_upload_demo" self.form.setAction(self.url) self.form.setTarget("results") vPanel = VerticalPanel() hPanel = HorizontalPanel() hPanel.setSpacing(5) hPanel.add(Label("Upload file:")) self.field = FileUpload() self.field.setName("file") hPanel.add(self.field) hPanel.add(Button("Submit", getattr(self, "onBtnClick"))) vPanel.add(hPanel) self.simple = CheckBox("Simple mode? ") #self.simple.setChecked(True) vPanel.add(self.simple) self.progress = Label('0%') results = NamedFrame("results") vPanel.add(results) vPanel.add(self.progress) self.form.add(vPanel) self.add(self.form) def onBtnClick(self, event): self.progress.setText('0%') if self.simple.isChecked(): self.form.submit() else: if AsyncUpload.is_old_browser(): Window.alert("Hmmm, your browser doesn't support this.") else: el = self.field.getElement() files = getattr(el, 'files') #TODO implement loop for multiple file uploads file = JS("@{{files}}[0]") #otherwise pyjs thinks it's a string? AsyncUpload.asyncUpload(self.url, file, self) def onload(self, status): self.progress.setText('100%') def onerror(self, status): Window.alert("oh noes we got an " + str(status)) def onprogress(self, loaded, total): if self.progress.getText() == '100%': return progress = (loaded / total) p = int(progress * 100) self.progress.setText(str(p) + '%')
class FileOpenDlg(DialogBox): files = None def __init__(self, left = 50, top = 50, fileLocation = None): global has_getAsText try: DialogBox.__init__(self, modal = False) self.filename = None self.data = None self.setPopupPosition(left, top) self.dockPanel = DockPanel() self.dockPanel.setSpacing(4) self.setText("File Open") if not fileLocation is None: msg = HTML("Loading file...", True) self.dockPanel.add(msg, DockPanel.NORTH) location = fileLocation if fileLocation.find("://") < 0: base = Window.getLocation().getHref() if base.find('/') >= 0: sep = '/' else: sep = '\\' base = sep.join(base.split(sep)[:-1]) + sep location = base + fileLocation self.iframe = Frame(location) self.dockPanel.add(self.iframe, DockPanel.CENTER) else: msg = HTML("Choose a file", True) self.browseFile = FileUpload() elem = self.browseFile.getElement() if False and has_getAsText and hasattr(elem, 'files'): self.iframe = None self.files = elem.files self.dockPanel.add(self.browseFile, DockPanel.CENTER) else: self.browseFile = None self.files = None base = '' + doc().location if base.find('/') >= 0: sep = '/' else: sep = '\\' if not base.lower()[:5] == "file:": base = "file:///C:/" msg = HTML("You'll have to place the application on a local file system, otherwise the browser forbids access.", True) else: base = sep.join(base.split(sep)[:-1]) + sep self.iframe = Frame(base) self.dockPanel.add(self.iframe, DockPanel.CENTER) self.dockPanel.add(msg, DockPanel.NORTH) if self.iframe: self.iframe.setWidth("36em") hpanel = HorizontalPanel() self.openBtn = Button("Open", self.onClickOpen) hpanel.add(self.openBtn) self.cancelBtn = Button("Cancel", self.onClickCancel) hpanel.add(self.cancelBtn) self.dockPanel.add(hpanel, DockPanel.SOUTH) self.setWidget(self.dockPanel) except: raise def onClickCancel(self, sender): self.hide() def onClickOpen(self, sender): global has_getAsText data = None filename = None if self.files: if self.files.length == 0: return if self.files.length > 1: alert("Cannot open more than one file") return file = self.files.item(0) filename = file.fileName try: data = file.getAsText("") except AttributeError, e: has_getAsText = False alert("Sorry. cannot retrieve file in this browser.\nTry again.") else:
class PopupOpenState(Popup): def __init__(self, okClick, cancelClick, title='Abrir', options=CONFIRM_CANCEL): Popup.__init__(self, title, okClick, cancelClick, options) def draw(self): Popup.draw(self) namePanel = HorizontalPanel() #namePanel.add(Label('Crie um arquivo')) if self.title == 'Abrir': self.enableOkButton(False) namePanel.add(HTML("""<div class=""gwt-Label"" style=""white-space: normal;""> Abra o arquivo salvo, copie<br>e cole aqui o conteudo:</div>""")) self.field = FileUpload() self.field.setName('file') self.field.setID('files') self.center.add(self.field) element = self.field.getElement() JS("""function handleFileSelect(evt) {@{{self}}.enableOkButton(evt.target.files[0]!=null);} @{{element}}.addEventListener('change', handleFileSelect, false);""") #http://www.javascriptkit.com/javatutors/loadjavascriptcss.shtml else: namePanel.add(HTML("""<div class=""gwt-Label"" style=""white-space: normal;""> Crie um arquivo txt e copie<br>e cole o conteudo a seguir:</div>""")) self.textBox = TextBox() self.textBox.setStyleAttribute('marginLeft', 10) namePanel.add(self.textBox) self.center.add(namePanel) self.textBox.addInputListener(self) self.onInput() def enableOkButton(self, enable): if enable: self.okButton.removeStyleName('disabled') else: self.okButton.addStyleName('disabled') def onInput(self, sender): self.enableOkButton(self.textBox.getText().count(' ') != len(self.textBox.getText())) def myOkClick(self): if 'disabled' not in self.okButton.getStyleName(): Popup.myOkClick(self) if self.okClick is not None: if self.title == 'Abrir': files = getattr(self.field.getElement(), 'files') file = JS("@{{files}}[0]") if file: JS("""var reader = new FileReader(); reader.onload = function(e) {@{{self}}.okClick(e.target.result);} reader.readAsBinaryString(@{{file}});""") #self.okClick(str) else: self.okClick(self.textBox.getText()) def myCancelClick(self): Popup.myCancelClick(self) if self.cancelClick is not None: self.cancelClick() def show(self): Popup.show(self) if self.title != 'Abrir': self.textBox.setFocus(True) else: pass
class FileUploadPanel(SimplePanel): def __init__(self): SimplePanel.__init__(self) self.form = FormPanel() self.form.setEncoding(FormPanel.ENCODING_MULTIPART) self.form.setMethod(FormPanel.METHOD_POST) self.url = "http://localhost/pyjamas_upload_demo" self.form.setAction(self.url) self.form.setTarget("results") vPanel = VerticalPanel() hPanel = HorizontalPanel() hPanel.setSpacing(5) hPanel.add(Label("Upload file:")) self.field = FileUpload() self.field.setName("file") hPanel.add(self.field) hPanel.add(Button("Submit", getattr(self, "onBtnClick"))) vPanel.add(hPanel) self.simple = CheckBox("Simple mode? ") #self.simple.setChecked(True) vPanel.add(self.simple) self.progress = Label('0%') results = NamedFrame("results") vPanel.add(results) vPanel.add(self.progress) self.form.add(vPanel) self.add(self.form) def onBtnClick(self, event): self.progress.setText('0%') if self.simple.isChecked(): self.form.submit() else: if AsyncUpload.is_old_browser(): Window.alert("Hmmm, your browser doesn't support this.") else: el = self.field.getElement() files = getattr(el, 'files') #TODO implement loop for multiple file uploads file = JS( "@{{files}}[0]") #otherwise pyjs thinks it's a string? AsyncUpload.asyncUpload(self.url, file, self) def onload(self, status): self.progress.setText('100%') def onerror(self, status): Window.alert("oh noes we got an " + str(status)) def onprogress(self, loaded, total): if self.progress.getText() == '100%': return progress = (loaded / total) p = int(progress * 100) self.progress.setText(str(p) + '%')
class FileOpenDlg(DialogBox): files = None def __init__(self, left=50, top=50, fileLocation=None): global has_getAsText try: DialogBox.__init__(self, modal=False) self.filename = None self.data = None self.setPopupPosition(left, top) self.dockPanel = DockPanel() self.dockPanel.setSpacing(4) self.setText("File Open") if not fileLocation is None: msg = HTML("Loading file...", True) self.dockPanel.add(msg, DockPanel.NORTH) location = fileLocation if fileLocation.find("://") < 0: base = Window.getLocation().getHref() if base.find('/') >= 0: sep = '/' else: sep = '\\' base = sep.join(base.split(sep)[:-1]) + sep location = base + fileLocation self.iframe = Frame(location) self.dockPanel.add(self.iframe, DockPanel.CENTER) else: msg = HTML("Choose a file", True) self.browseFile = FileUpload() elem = self.browseFile.getElement() if False and has_getAsText and hasattr(elem, 'files'): self.iframe = None self.files = elem.files self.dockPanel.add(self.browseFile, DockPanel.CENTER) else: self.browseFile = None self.files = None base = '' + doc().location if base.find('/') >= 0: sep = '/' else: sep = '\\' if not base.lower()[:5] == "file:": base = "file:///C:/" msg = HTML( "You'll have to place the application on a local file system, otherwise the browser forbids access.", True) else: base = sep.join(base.split(sep)[:-1]) + sep self.iframe = Frame(base) self.dockPanel.add(self.iframe, DockPanel.CENTER) self.dockPanel.add(msg, DockPanel.NORTH) if self.iframe: self.iframe.setWidth("36em") hpanel = HorizontalPanel() self.openBtn = Button("Open", self.onClickOpen) hpanel.add(self.openBtn) self.cancelBtn = Button("Cancel", self.onClickCancel) hpanel.add(self.cancelBtn) self.dockPanel.add(hpanel, DockPanel.SOUTH) self.setWidget(self.dockPanel) except: raise def onClickCancel(self, sender): self.hide() def onClickOpen(self, sender): global has_getAsText data = None filename = None if self.files: if self.files.length == 0: return if self.files.length > 1: alert("Cannot open more than one file") return file = self.files.item(0) filename = file.fileName try: data = file.getAsText("") except AttributeError, e: has_getAsText = False alert( "Sorry. cannot retrieve file in this browser.\nTry again.") else:
class FileOpenDlg(DialogBox): files = None def __init__(self, left=50, top=50, fileLocation=None): global has_getAsText try: DialogBox.__init__(self, modal=False) self.setPopupPosition(left, top) self.dockPanel = DockPanel() self.dockPanel.setSpacing(4) self.setText("File Open") if not fileLocation is None: msg = HTML("Loading file...", True) self.dockPanel.add(msg, DockPanel.NORTH) location = fileLocation if fileLocation.find("://") < 0: base = Window.getLocation().getHref() print base if base.find("/") >= 0: sep = "/" else: sep = "\\" base = sep.join(base.split(sep)[:-1]) + sep location = base + fileLocation self.iframe = Frame(location) self.dockPanel.add(self.iframe, DockPanel.CENTER) else: msg = HTML("Choose a file", True) self.browseFile = FileUpload() elem = self.browseFile.getElement() if False and has_getAsText and hasattr(elem, "files"): self.iframe = None self.files = elem.files self.dockPanel.add(self.browseFile, DockPanel.CENTER) else: self.browseFile = None self.files = None base = "" + doc().location if base.find("/") >= 0: sep = "/" else: sep = "\\" if not base.lower()[:5] == "file:": base = "file:///C:/" msg = HTML( "You'll have to place the application on a local file system, otherwise the browser forbids access.", True, ) else: base = sep.join(base.split(sep)[:-1]) + sep self.iframe = Frame(base) self.dockPanel.add(self.iframe, DockPanel.CENTER) self.dockPanel.add(msg, DockPanel.NORTH) if self.iframe: self.iframe.setWidth("36em") hpanel = HorizontalPanel() self.openBtn = Button("Open", self) hpanel.add(self.openBtn) self.cancelBtn = Button("Cancel", self) hpanel.add(self.cancelBtn) self.dockPanel.add(hpanel, DockPanel.SOUTH) self.setWidget(self.dockPanel) except: raise def onClick(self, sender): global has_getAsText if sender == self.cancelBtn: self.hide() elif sender == self.openBtn: data = None filename = None if self.files: if self.files.length == 0: return if self.files.length > 1: alert("Cannot open more than one file") return file = self.files.item(0) filename = file.fileName try: data = file.getAsText("") except AttributeError, e: has_getAsText = False alert("Sorry. cannot retrieve file in this browser.\nTry again.") else: elem = self.iframe.getElement() # On firefox, this runs into: # Permission denied to get property Window.document # when the file is not in the current domain body = elem.contentWindow.document.body try: filename = "" + elem.contentWindow.location except: filename = None if body.childNodes.length == 1: data = "" + body.childNodes.item(0).innerHTML else: data = "" + body.innerHTML self.hide() if data: self.mediator.sendNotification(Notification.FILE_LOADED, (filename, data))