def __init__(self): SimplePanel.__init__(self) panel = HorizontalPanel() panel.setBorderWidth(1) panel.setHorizontalAlignment(HasAlignment.ALIGN_CENTER) panel.setVerticalAlignment(HasAlignment.ALIGN_MIDDLE) part1 = Label("Part 1") part2 = Label("Part 2") part3 = Label("Part 3") part4 = Label("Part 4") panel.add(part1) panel.add(part2) panel.add(part3) panel.add(part4) panel.setCellWidth(part1, "10%") panel.setCellWidth(part2, "70%") panel.setCellWidth(part3, "10%") panel.setCellWidth(part4, "10%") panel.setCellVerticalAlignment(part3, HasAlignment.ALIGN_BOTTOM) panel.setWidth("100%") panel.setHeight("200px") self.add(panel)
class RichTextEditor(Composite): def run(self): try: self.getSelection() rng = Selection.getRange() if (self.m_timerRange is None) or (not self.m_timerRange.equals(rng)): self.onSelectionChange(rng) self.m_timerRange = rng except: GWT.log("Error in timer selection", ex) def __init__(self): Composite.__init__(self) self.m_isInText = False self.m_lastText = "" self.trigger = False self.m_lastRange = None # Timer for trying real time selection change stuff self.m_timerRange = None self.m_selTimer = Timer() self.m_mainPanel = DockPanel() self.m_toolbarPanel = HorizontalPanel() self.m_toolbarPanel.setWidth("100%") self.m_toolbarPanel.setHeight("25px") self.m_toolbarPanel.setBorderWidth(1) self.m_toolbarPanel.addStyleName("timeline-RichTextToolbar") self.m_textW = RichTextArea() self.m_textW.addClickListener(self) self.m_textW.addKeyboardListener(self) self.m_textW.addFocusListener(self) self.m_textW.addMouseListener(self) # According to gwt doc, these do need to be set because this is a frame self.m_textW.setHeight("100%") self.m_textW.setWidth("100%") # Add buttons self.m_formatter = self.getFormatter() self.m_boldW = self.addToggleButton(self.m_toolbarPanel, Icons.bold_icon, "Bold") self.m_italicW = self.addToggleButton(self.m_toolbarPanel, Icons.italics_icon, "Italic") self.m_underlineW = self.addToggleButton(self.m_toolbarPanel, Icons.underline_icon, "Underline") self.m_subscriptW = self.addToggleButton(self.m_toolbarPanel, Icons.subscript_icon, "Subscript") self.m_superscriptW = self.addToggleButton(self.m_toolbarPanel, Icons.superscript_icon, "Superscript") self.m_strikethroughW = self.addToggleButton(self.m_toolbarPanel, Icons.strikethrough_icon, "Strikethrough") self.m_indentW = self.addPushButton(self.m_toolbarPanel, Icons.indentmore_icon, "Indent Right") self.m_outdentW = self.addPushButton(self.m_toolbarPanel, Icons.indentless_icon, "Indent Left") self.m_justifyLeftW = self.addPushButton(self.m_toolbarPanel, Icons.justifyleft_icon, "Justify Left") self.m_justifyCenterW = self.addPushButton(self.m_toolbarPanel, Icons.justifycenter_icon, "Justify Center") self.m_justifyRightW = self.addPushButton(self.m_toolbarPanel, Icons.justifyright_icon, "Justify Right") self.m_hrW = self.addPushButton(self.m_toolbarPanel, Icons.horizontalrule_icon, "Horizontal Rule") self.m_olW = self.addPushButton(self.m_toolbarPanel, Icons.numberedlist_icon, "Numbered List") self.m_ulW = self.addPushButton(self.m_toolbarPanel, Icons.list_icon, "List") self.m_newLinkW = self.addPushButton(self.m_toolbarPanel, Icons.link_icon, "Link Document") self.m_removeFormatW = self.addPushButton(self.m_toolbarPanel, Icons.noformat_icon, "No Format") self.m_mainPanel.add(self.m_toolbarPanel, DockPanel.NORTH) self.m_mainPanel.add(self.m_textW, DockPanel.CENTER) self.initWidget(self.m_mainPanel) self.sinkEvents(Event.ONCLICK) def getFormatter(self): return self.m_textW.getExtendedFormatter() def getRichTextArea(self): return self.m_textW def addPushButton(self, panel, imagep, tip): img = Image(imagep) img.setWidth("20px") img.setHeight("20px") pb = PushButton(img) self.addAnyButton(panel, pb, tip) return pb def addToggleButton(self, panel, imagep, tip): img = Image(imagep) img.setWidth("20px") img.setHeight("20px") tb = ToggleButton(img) self.addAnyButton(panel, tb, tip) return tb def addAnyButton(self, panel, button, tip): button.addStyleName("richText-button") button.setTitle(tip) button.setWidth(BUTTON_WIDTH) button.setHeight("100%") panel.add(button) panel.setCellWidth(button, BUTTON_WIDTH) button.addClickListener(self) def onClick(self, sender): if sender == self.m_boldW: self.m_formatter.toggleBold() elif sender == self.m_italicW: self.m_formatter.toggleItalic() elif sender == self.m_underlineW: self.m_formatter.toggleUnderline() elif sender == self.m_subscriptW: self.m_formatter.toggleSubscript() elif sender == self.m_superscriptW: self.m_formatter.toggleSuperscript() elif sender == self.m_strikethroughW: self.m_formatter.toggleStrikethrough() elif sender == self.m_indentW: self.m_formatter.rightIndent() elif sender == self.m_outdentW: self.m_formatter.leftIndent() elif sender == self.m_justifyLeftW: self.m_formatter.setJustification(RichTextArea.Justification.LEFT) elif sender == self.m_justifyCenterW: self.m_formatter.setJustification( RichTextArea.Justification.CENTER) elif sender == self.m_justifyRightW: self.m_formatter.setJustification(RichTextArea.Justification.RIGHT) elif sender == self.m_hrW: self.m_formatter.insertHorizontalRule() elif sender == self.m_olW: self.m_formatter.insertOrderedList() elif sender == self.m_ulW: self.m_formatter.insertUnorderedList() elif sender == self.m_removeFormatW: self.m_formatter.removeFormat() elif sender == self.m_newLinkW: EventLinkPopup.open(self) elif sender == self.m_textW: self.updateStatus() self.checkForChange() def onKeyDown(self, sender, keycode, modifiers): pass def onKeyUp(self, sender, keycode, modifiers): if sender == self.m_textW: self.updateStatus() self.checkForChange() def onMouseLeave(self, event): pass def onMouseEnter(self, event): pass def onMouseUp(self, event, x, y): pass def onMouseMove(self, event, x, y): pass def onMouseDown(self, event, x, y): self.trigger = True def onFocus(self, event): pass def onLostFocus(self, event): self.checkForChange() def onMouseOut(self, event): if self.m_isInText and self.isOnTextBorder(event): self.m_isInText = False self.captureSelection() self.endSelTimer() def onMouseOver(self, event): if not self.m_isInText: self.m_isInText = True self.m_textW.setFocus(True) self.m_lastRange = None self.startSelTimer() """* * This captures the selection when the mouse leaves the RTE, because in IE * the selection indicating the cursor position is lost once another widget * gains focus. Could be implemented for IE only. """ def captureSelection(self): try: self.getSelection() self.m_lastRange = Selection.getRange() except: GWT.log("Error capturing selection for IE", ex) # Gets run every time the selection is changed def onSelectionChange(self, sel): pass def isOnTextBorder(self, event): sender = event.getSource() twX = self.m_textW.getAbsoluteLeft() twY = self.m_textW.getAbsoluteTop() x = event.getClientX() - twX y = event.getClientY() - twY width = self.m_textW.getOffsetWidth() height = self.m_textW.getOffsetHeight() return ((sender == self.m_textW) and ((x <= 0) or (x >= width) or (y <= 0) or (y >= height))) def startSelTimer(self): self.m_selTimer.scheduleRepeating(250) def endSelTimer(self): self.m_selTimer.cancel() def getRange(self): if self.m_lastRange is None: self.getSelection() return Selection.getRange() else: return self.m_lastRange def getSelection(self): res = None try: window = self.getWindow() Selection.getSelection(window) except: print "Error getting the selection" traceback.print_exc() def getWindow(self, iFrame=None): if iFrame is None: iFrame = self.m_textW.getElement() iFrameWin = iFrame.contentWindow or iFrame.contentDocument if not iFrameWin.document: iFrameWin = iFrameWin.parentNode # FBJS version of parentNode #print "getWindow", iFrameWin, dir(iFrameWin) return iFrameWin def getDocument(self): return Selection.getDocument(self.getWindow()) def setHtml(self, text): self.m_textW.setHTML(text) self.m_lastText = text def getHtml(self): return self.m_textW.getHTML() def checkForChange(self): text = self.m_textW.getHTML() if text != self.m_lastText: nEvt = doc().createEvent("HTMLEvents") nEvt.initEvent("change", False, True) self.getElement().dispatchEvent(nEvt) self.m_lastText = text # Update edit buttons based on current cursor location def updateStatus(self): if self.m_formatter is None: return self.m_boldW.setDown(self.m_formatter.isBold()) self.m_italicW.setDown(self.m_formatter.isItalic()) self.m_underlineW.setDown(self.m_formatter.isUnderlined()) self.m_subscriptW.setDown(self.m_formatter.isSubscript()) self.m_superscriptW.setDown(self.m_formatter.isSuperscript()) self.m_strikethroughW.setDown(self.m_formatter.isStrikethrough()) def addChangeHandler(self, handler): return addDomHandler(handler, ChangeEvent.getType())
class InfoDirectory: def onModuleLoad(self): self.remote = InfoServicePython() self.tree_width = 200 self.tp = HorizontalPanel() self.tp.setWidth("%dpx" % (self.tree_width)) self.treeview = Trees() self.treeview.fTree.addTreeListener(self) self.sp = ScrollPanel() self.tp.add(self.treeview) self.sp.add(self.tp) self.sp.setHeight("100%") self.horzpanel1 = HorizontalPanel() self.horzpanel1.setSize("100%", "100%") self.horzpanel1.setBorderWidth(1) self.horzpanel1.setSpacing("10px") self.rp = RightPanel() self.rps = ScrollPanel() self.rps.add(self.rp) self.rps.setWidth("100%") self.rp.setWidth("100%") self.cp1 = CollapserPanel(self) self.cp1.setWidget(self.sp) self.cp1.setHTML(" ") self.midpanel = MidPanel(self) self.cp2 = CollapserPanel(self) self.cp2.setWidget(self.midpanel) self.cp2.setHTML(" ") self.horzpanel1.add(self.cp1) self.horzpanel1.add(self.cp2) self.horzpanel1.add(self.rps) self.cp1.setInitialWidth("%dpx" % self.tree_width) self.cp2.setInitialWidth("200px") RootPanel().add(self.horzpanel1) width = Window.getClientWidth() height = Window.getClientHeight() self.onWindowResized(width, height) Window.addWindowResizeListener(self) def setCollapserWidth(self, widget, width): self.horzpanel1.setCellWidth(widget, width) def onWindowResized(self, width, height): #self.hp.setWidth("%dpx" % (width - self.tree_width)) #self.hp.setHeight("%dpx" % (height - 20)) self.cp1.setHeight("%dpx" % (height - 30)) self.cp2.setHeight("%dpx" % (height - 30)) self.rps.setHeight("%dpx" % (height - 30)) self.horzpanel1.setHeight("%dpx" % (height - 20)) def onTreeItemStateChanged(self, item): if item.isSelected(): self.onTreeItemSelected(item) def onTreeItemSelected(self, item): obj = item.getUserObject() if len(obj.children) != 0: self.clear_mid_panel() return self.remote.get_midpanel_data(obj.root + "/" + obj.text, self) self.cp2.setHTML(obj.text) self.clear_right_panel() def clear_right_panel(self): self.horzpanel1.remove(2) self.horzpanel1.insert(HTML(""), 2) self.rp.setTitle(" ") def clear_mid_panel(self): self.clear_right_panel() #self.horzpanel2.setLeftWidget(HTML("")) def set_mid_panel(self, response): self.midpanel.set_items(response) self.cp2.setWidget(self.midpanel) def select_right_grid(self, location, name): self.horzpanel1.remove(2) self.horzpanel1.insert(self.rps, 2) self.rp.setTitle(name) self.remote.get_rightpanel_datanames(location, self) def get_rightpanel_datasets(self, datasets): self.rp.clear_items() self.rp.setup_panels(datasets) for i in range(len(datasets)): item = datasets[i] fname = item[0] self.remote.get_rightpanel_data(fname, fname, i, self) def fill_right_grid(self, data): index = data.get('index') name = data.get('name') if data.has_key('items'): self.rp.add_items(data.get('items'), name, index) elif data.has_key('html'): self.rp.add_html(data.get('html'), name, index) def onRemoteResponse(self, response, request_info): method = request_info.method if method == "get_midpanel_data": self.set_mid_panel(response) elif method == "get_rightpanel_datanames": self.get_rightpanel_datasets(response) elif method == "get_rightpanel_data": self.fill_right_grid(response) def onRemoteError(self, code, message, request_info): RootPanel().add(HTML("Server Error or Invalid Response: ERROR " + code)) RootPanel().add(HTML(message))
class InfoDirectory: def onModuleLoad(self): self.remote = InfoServicePython() self.tree_width = 200 self.tp = HorizontalPanel() self.tp.setWidth("%dpx" % (self.tree_width)) self.treeview = Trees() self.treeview.fTree.addTreeListener(self) self.sp = ScrollPanel() self.tp.add(self.treeview) self.sp.add(self.tp) self.sp.setHeight("100%") self.horzpanel1 = HorizontalPanel() self.horzpanel1.setSize("100%", "100%") self.horzpanel1.setBorderWidth(1) self.horzpanel1.setSpacing("10px") self.rp = RightPanel() self.rps = ScrollPanel() self.rps.add(self.rp) self.rps.setWidth("100%") self.rp.setWidth("100%") self.cp1 = CollapserPanel(self) self.cp1.setWidget(self.sp) self.cp1.setHTML(" ") self.midpanel = MidPanel(self) self.cp2 = CollapserPanel(self) self.cp2.setWidget(self.midpanel) self.cp2.setHTML(" ") self.horzpanel1.add(self.cp1) self.horzpanel1.add(self.cp2) self.horzpanel1.add(self.rps) self.cp1.setInitialWidth("%dpx" % self.tree_width) self.cp2.setInitialWidth("200px") RootPanel().add(self.horzpanel1) width = Window.getClientWidth() height = Window.getClientHeight() self.onWindowResized(width, height) Window.addWindowResizeListener(self) def setCollapserWidth(self, widget, width): self.horzpanel1.setCellWidth(widget, width) def onWindowResized(self, width, height): #self.hp.setWidth("%dpx" % (width - self.tree_width)) #self.hp.setHeight("%dpx" % (height - 20)) self.cp1.setHeight("%dpx" % (height - 30)) self.cp2.setHeight("%dpx" % (height - 30)) self.rps.setHeight("%dpx" % (height - 30)) self.horzpanel1.setHeight("%dpx" % (height - 20)) def onTreeItemStateChanged(self, item): if item.isSelected(): self.onTreeItemSelected(item) def onTreeItemSelected(self, item): obj = item.getUserObject() if len(obj.children) != 0: self.clear_mid_panel() return self.remote.get_midpanel_data(obj.root + "/" + obj.text, self) self.cp2.setHTML(obj.text) self.clear_right_panel() def clear_right_panel(self): self.horzpanel1.remove(2) self.horzpanel1.insert(HTML(""), 2) self.rp.setTitle(" ") def clear_mid_panel(self): self.clear_right_panel() #self.horzpanel2.setLeftWidget(HTML("")) def set_mid_panel(self, response): self.midpanel.set_items(response) self.cp2.setWidget(self.midpanel) def select_right_grid(self, location, name): self.horzpanel1.remove(2) self.horzpanel1.insert(self.rps, 2) self.rp.setTitle(name) self.remote.get_rightpanel_datanames(location, self) def get_rightpanel_datasets(self, datasets): self.rp.clear_items() self.rp.setup_panels(datasets) for i in range(len(datasets)): item = datasets[i] fname = item[0] self.remote.get_rightpanel_data(fname, fname, i, self) def fill_right_grid(self, data): index = data.get('index') name = data.get('name') if data.has_key('items'): self.rp.add_items(data.get('items'), name, index) elif data.has_key('html'): self.rp.add_html(data.get('html'), name, index) def onRemoteResponse(self, response, request_info): method = request_info.method if method == "get_midpanel_data": self.set_mid_panel(response) elif method == "get_rightpanel_datanames": self.get_rightpanel_datasets(response) elif method == "get_rightpanel_data": self.fill_right_grid(response) def onRemoteError(self, code, message, request_info): RootPanel().add(HTML("Server Error or Invalid Response: ERROR " + code)) RootPanel().add(HTML(message))
class Trees(Sink): pathdict = {} reduceFiles = None def __init__(self, parent = None): Sink.__init__(self, parent) self.reduceFiles = [] if True: HTTPRequest().asyncGet("datadir.xml", DirDictLoader(self), ) dock = DockPanel(HorizontalAlignment=HasAlignment.ALIGN_LEFT, Spacing=10, Size=("100%","100%")) self.dock = dock self.fProto = [] self.fTree = Tree() self.prPanel = VerticalPanel(Size=("50%", "")) self.treePanel = HorizontalPanel(Size=("50%", "100%")) self.treePanel.add(self.fTree) dock.add(self.treePanel, DockPanel.WEST) self.treePanel.setBorderWidth(1) self.treePanel.setWidth("100%") self.prPanel.setBorderWidth(1) self.prPanel.setWidth("100%") # prepare panel self.prepareReduce = HTML("<tt> .. none yet .. </tt>", True, ) self.recipeList = ListBox() self.recipeList.addChangeListener(getattr(self, "onRecipeSelected")) self.recipeList.addItem("None") HTTPRequest().asyncGet("recipes.xml", RecipeListLoader(self)) #EO prepare panel self.reduceCLPanel = DockPanel(Spacing = 5) self.reduceCLPanel.add(HTML("<i>Reduce Command Line</i>:"), DockPanel.NORTH) self.reduceCLPanel.add(self.prepareReduce, DockPanel.NORTH) self.reduceFilesPanel = DockPanel(Spacing = 5) self.reduceFilesPanel.add(HTML("<b>Datasets</b>:"), DockPanel.WEST) self.reduceFiles = ListBox() self.reduceFiles.setVisibleItemCount(5) self.reduceFilesPanel.add(self.reduceFiles, DockPanel.WEST) self.clearReduceFilesButton = Button("<b>Clear List</b>", listener = getattr(self, "onClearReduceFiles")) self.reduceFilesPanel.add(self.clearReduceFilesButton, DockPanel.SOUTH) self.recipeListPanel = DockPanel(Spacing = 5) self.recipeListPanel.add(HTML("<b>Recipes List</b>:"),DockPanel.WEST) self.recipeListPanel.add(self.recipeList, DockPanel.WEST) self.runReduceButton = Button("<b>RUN REDUCE</b>", listener = getattr(self, "onRunReduce")) self.adInfo = HTML("file info...") # major sub panels self.prPanel.add(self.reduceCLPanel) self.prPanel.add(self.reduceFilesPanel) self.prPanel.add(self.recipeListPanel) self.prPanel.add(self.runReduceButton) self.prPanel.add(self.adInfo) dock.add(self.prPanel,DockPanel.EAST) dock.setCellWidth(self.treePanel, "50%") dock.setCellWidth(self.prPanel, "50%") for i in range(len(self.fProto)): self.createItem(self.fProto[i]) self.fTree.addItem(self.fProto[i].item) self.fTree.addTreeListener(self) self.initWidget(self.dock) if False: #self.parent.filexml != None: DirDictLoader(self).onCompletion(self.parent.filexml) def onTreeItemSelected(self, item): pathdict = self.pathdict tfile = item.getText() #check if already in for i in range(0, self.reduceFiles.getItemCount()): fname = self.reduceFiles.getItemText(i) if fname == tfile: return self.reduceFiles.addItem(tfile) self.updateReduceCL() filename = tfile if filename in pathdict: if pathdict[filename]["filetype"] == "fileEntry": HTTPRequest().asyncGet("adinfo?filename=%s" % self.pathdict[item.getText()]["path"], ADInfoLoader(self), ) else: self.adInfo.setHTML(""" <b style="font-size:200%%">%s</b>""" % pathdict[filename]["filetype"]) else: self.adInfo.setHTML("unknown node") return # self.prepareReduce.setHTML('<a href="runreduce?p=-r&p=callen&p=%(fname)s">reduce -r callen %(fname)s</a>' % # {"fname":item.getText()}) pass def onRecipeSelected(self, event): self.updateReduceCL() def onClearReduceFiles(self, event): self.reduceFiles.clear() self.adInfo.setHTML("file info...") self.updateReduceCL() def updateReduceCL(self): recipe = self.recipeList.getItemText(self.recipeList.getSelectedIndex()) if recipe=="None": rstr = "" else: rstr = "-r "+recipe rfiles = [] for i in range(0, self.reduceFiles.getItemCount()): fname = self.reduceFiles.getItemText(i) rfiles.append(fname) filesstr = " ".join(rfiles) self.prepareReduce.setHTML('<b>reduce</b> %(recipe)s %(files)s' % { "recipe":rstr, "files":filesstr}) def onRunReduce(self): recipe = self.recipeList.getItemText(self.recipeList.getSelectedIndex()) if recipe=="None": rstr = "" else: rstr = "p=-r"+recipe rfiles = [] for i in range(0, self.reduceFiles.getItemCount()): fname = self.reduceFiles.getItemText(i) rfiles.append(quote(self.pathdict[fname]["path"])) filesstr = "&p=".join(rfiles) cl = "/runreduce?%s&p=%s" % (rstr, filesstr) JS("window.open(cl)") def onTreeItemSelected(self, item): pathdict = self.pathdict tfile = item.getText() #check if already in if tfile in pathdict: ftype = pathdict[tfile]["filetype"] if ftype != "fileEntry": item.setState(True) return else: return for i in range(0, self.reduceFiles.getItemCount()): fname = self.reduceFiles.getItemText(i) if fname == tfile: return self.reduceFiles.addItem(tfile) self.updateReduceCL() filename = tfile if filename in pathdict: if pathdict[filename]["filetype"] == "fileEntry": HTTPRequest().asyncGet("adinfo?filename=%s" % self.pathdict[item.getText()]["path"], ADInfoLoader(self), ) else: self.adInfo.setHTML(""" <b style="font-size:200%%">%s</b>""" % pathdict[filename]["filetype"]) else: self.adInfo.setHTML("unknown node") return # self.prepareReduce.setHTML('<a href="runreduce?p=-r&p=callen&p=%(fname)s">reduce -r callen %(fname)s</a>' % # {"fname":item.getText()}) pass def onTreeItemStateChanged(self, item): child = item.getChild(0) if hasattr(child, "isPendingItem"): item.removeItem(child) proto = item.getUserObject() for i in range(len(proto.children)): self.createItem(proto.children[i]) index = self.getSortIndex(item, proto.children[i].text) # demonstrate insertItem. addItem is easy. item.insertItem(proto.children[i].item, index) item.setState(True) def getSortIndex(self, parent, text): nodes = parent.getChildCount() node = 0 text = text.lower() while node < nodes: item = parent.getChild(node) if cmp(text, item.getText().lower()) < 0: break; else: node += 1 return node def createProto(self, node): #if node.nodeType != node.ELEMENT_NODE: # return pathdict = self.pathdict if not node.hasChildNodes(): if node.nodeType != 1: return None newproto = Proto(str(node.getAttribute("name"))) if node.tagName == "fileEntry": pathdict.update({node.getAttribute("name"): { "path":node.getAttribute("fullpath"), "filetype": node.tagName }}) elif node.tagName == "dirEntry": pathdict.update({node.getAttribute("name"): { "path":node.getAttribute("name"), "filetype": node.tagName}}) else: pathdict.update({node.getAttribute("name"): { "path": "NOPATH", "filetype": node.tagName}}) self.createItem(newproto) return newproto else: cprotos = [] for i in range(0, node.childNodes.length): childnode = node.childNodes.item(i) ncproto = self.createProto(childnode) if ncproto != None: ncitem = self.createItem(ncproto) cprotos.append(ncproto) if len(cprotos)>0: newproto = Proto(str(node.getAttribute("name")),cprotos) else: newproto = Proto(str(node.getAttribute("name"))) if node.tagName == "fileEntry": pathdict.update({node.getAttribute("name"): { "path":node.getAttribute("fullpath"), "filetype": node.tagName }}) elif node.tagName == "dirEntry": pathdict.update({node.getAttribute("name"): { "path":node.getAttribute("name"), "filetype": node.tagName}}) else: pathdict.update({node.getAttribute("name"): { "path": "NOPATH", "filetype": node.tagName}}) self.createItem(newproto) return newproto def fromXML(self,text): doc = create_xml_doc(text) #node = doc.firstChild #node = doc.getElementById("topDirectory") nodes = doc.getElementsByTagName("dirEntry") node = nodes.item(0) s = repr(node) newproto = self.createProto(node) plist = [newproto] #plist = [Proto(node.tagName)] for i in range(len(plist)): num = str(len(plist)) # self.createItem(plist[i]) self.fTree.addItem(plist[i].item) plist[i].item.setState(True) def onShow(self): if False: for item in self.fTree.treeItemIterator(): key = repr(item.tree) if key != "null": item.setState(True) else: JS("alert(item.getText())") pass def createItem(self, proto): proto.item = TreeItem(proto.text) proto.item.setUserObject(proto) if len(proto.children) > 0: proto.item.addItem(PendingItem())
class RichTextEditor(Composite): def run(self): try: self.getSelection() rng = Selection.getRange() if (self.m_timerRange is None) or (not self.m_timerRange.equals(rng)): self.onSelectionChange(rng) self.m_timerRange = rng except: GWT.log("Error in timer selection", ex) def __init__(self): Composite.__init__(self) self.m_isInText = False self.m_lastText = "" self.trigger = False self.m_lastRange = None # Timer for trying real time selection change stuff self.m_timerRange = None self.m_selTimer = Timer() self.m_mainPanel = DockPanel() self.m_toolbarPanel = HorizontalPanel() self.m_toolbarPanel.setWidth("100%") self.m_toolbarPanel.setHeight("25px") self.m_toolbarPanel.setBorderWidth(1) self.m_toolbarPanel.addStyleName("timeline-RichTextToolbar") self.m_textW = RichTextArea() self.m_textW.addClickListener(self) self.m_textW.addKeyboardListener(self) self.m_textW.addFocusListener(self) self.m_textW.addMouseListener(self) # According to gwt doc, these do need to be set because this is a frame self.m_textW.setHeight("100%") self.m_textW.setWidth("100%") # Add buttons self.m_formatter = self.getFormatter() self.m_boldW = self.addToggleButton(self.m_toolbarPanel, Icons.bold_icon, "Bold") self.m_italicW = self.addToggleButton(self.m_toolbarPanel, Icons.italics_icon, "Italic") self.m_underlineW = self.addToggleButton(self.m_toolbarPanel, Icons.underline_icon, "Underline") self.m_subscriptW = self.addToggleButton(self.m_toolbarPanel, Icons.subscript_icon, "Subscript") self.m_superscriptW = self.addToggleButton(self.m_toolbarPanel, Icons.superscript_icon, "Superscript") self.m_strikethroughW = self.addToggleButton(self.m_toolbarPanel, Icons.strikethrough_icon, "Strikethrough") self.m_indentW = self.addPushButton(self.m_toolbarPanel, Icons.indentmore_icon, "Indent Right") self.m_outdentW = self.addPushButton(self.m_toolbarPanel, Icons.indentless_icon, "Indent Left") self.m_justifyLeftW = self.addPushButton(self.m_toolbarPanel, Icons.justifyleft_icon, "Justify Left") self.m_justifyCenterW = self.addPushButton(self.m_toolbarPanel, Icons.justifycenter_icon, "Justify Center") self.m_justifyRightW = self.addPushButton(self.m_toolbarPanel, Icons.justifyright_icon, "Justify Right") self.m_hrW = self.addPushButton(self.m_toolbarPanel, Icons.horizontalrule_icon, "Horizontal Rule") self.m_olW = self.addPushButton(self.m_toolbarPanel, Icons.numberedlist_icon, "Numbered List") self.m_ulW = self.addPushButton(self.m_toolbarPanel, Icons.list_icon, "List") self.m_newLinkW = self.addPushButton(self.m_toolbarPanel, Icons.link_icon, "Link Document") self.m_removeFormatW = self.addPushButton(self.m_toolbarPanel, Icons.noformat_icon, "No Format") self.m_mainPanel.add(self.m_toolbarPanel, DockPanel.NORTH) self.m_mainPanel.add(self.m_textW, DockPanel.CENTER) self.initWidget(self.m_mainPanel) self.sinkEvents(Event.ONCLICK) def getFormatter(self): return self.m_textW.getExtendedFormatter() def getRichTextArea(self): return self.m_textW def addPushButton(self, panel, imagep, tip): img = Image(imagep) img.setWidth("20px") img.setHeight("20px") pb = PushButton(img) self.addAnyButton(panel, pb, tip) return pb def addToggleButton(self, panel, imagep, tip): img = Image(imagep) img.setWidth("20px") img.setHeight("20px") tb = ToggleButton(img) self.addAnyButton(panel, tb, tip) return tb def addAnyButton(self, panel, button, tip): button.addStyleName("richText-button") button.setTitle(tip) button.setWidth(BUTTON_WIDTH) button.setHeight("100%") panel.add(button) panel.setCellWidth(button, BUTTON_WIDTH) button.addClickListener(self) def onClick(self, sender): if sender == self.m_boldW: self.m_formatter.toggleBold() elif sender == self.m_italicW: self.m_formatter.toggleItalic() elif sender == self.m_underlineW: self.m_formatter.toggleUnderline() elif sender == self.m_subscriptW: self.m_formatter.toggleSubscript() elif sender == self.m_superscriptW: self.m_formatter.toggleSuperscript() elif sender == self.m_strikethroughW: self.m_formatter.toggleStrikethrough() elif sender == self.m_indentW: self.m_formatter.rightIndent() elif sender == self.m_outdentW: self.m_formatter.leftIndent() elif sender == self.m_justifyLeftW: self.m_formatter.setJustification(RichTextArea.Justification.LEFT) elif sender == self.m_justifyCenterW: self.m_formatter.setJustification(RichTextArea.Justification.CENTER) elif sender == self.m_justifyRightW: self.m_formatter.setJustification(RichTextArea.Justification.RIGHT) elif sender == self.m_hrW: self.m_formatter.insertHorizontalRule() elif sender == self.m_olW: self.m_formatter.insertOrderedList() elif sender == self.m_ulW: self.m_formatter.insertUnorderedList() elif sender == self.m_removeFormatW: self.m_formatter.removeFormat() elif sender == self.m_newLinkW: EventLinkPopup.open(self) elif sender == self.m_textW: self.updateStatus() self.checkForChange() def onKeyDown(self, sender, keycode, modifiers): pass def onKeyUp(self, sender, keycode, modifiers): if sender == self.m_textW: self.updateStatus() self.checkForChange() def onMouseLeave(self, event): pass def onMouseEnter(self, event): pass def onMouseUp(self, event, x, y): pass def onMouseMove(self, event, x, y): pass def onMouseDown(self, event, x, y): self.trigger = True def onFocus(self, event): pass def onLostFocus(self, event): self.checkForChange() def onMouseOut(self, event): if self.m_isInText and self.isOnTextBorder(event): self.m_isInText = False self.captureSelection() self.endSelTimer() def onMouseOver(self, event): if not self.m_isInText: self.m_isInText = True self.m_textW.setFocus(True) self.m_lastRange = None self.startSelTimer() """* * This captures the selection when the mouse leaves the RTE, because in IE * the selection indicating the cursor position is lost once another widget * gains focus. Could be implemented for IE only. """ def captureSelection(self): try: self.getSelection() self.m_lastRange = Selection.getRange() except: GWT.log("Error capturing selection for IE", ex) # Gets run every time the selection is changed def onSelectionChange(self, sel): pass def isOnTextBorder(self, event): sender = event.getSource() twX = self.m_textW.getAbsoluteLeft() twY = self.m_textW.getAbsoluteTop() x = event.getClientX() - twX y = event.getClientY() - twY width = self.m_textW.getOffsetWidth() height = self.m_textW.getOffsetHeight() return ((sender == self.m_textW) and ((x <= 0) or (x >= width) or (y <= 0) or (y >= height))) def startSelTimer(self): self.m_selTimer.scheduleRepeating(250) def endSelTimer(self): self.m_selTimer.cancel() def getRange(self): if self.m_lastRange is None: self.getSelection() return Selection.getRange() else: return self.m_lastRange def getSelection(self): res = None try: window = self.getWindow() Selection.getSelection(window) except: print "Error getting the selection" traceback.print_exc() def getWindow(self, iFrame=None): if iFrame is None: iFrame = self.m_textW.getElement() iFrameWin = iFrame.contentWindow or iFrame.contentDocument if not iFrameWin.document: iFrameWin = iFrameWin.parentNode # FBJS version of parentNode #print "getWindow", iFrameWin, dir(iFrameWin) return iFrameWin def getDocument(self): return Selection.getDocument(self.getWindow()) def setHtml(self, text): self.m_textW.setHTML(text) self.m_lastText = text def getHtml(self): return self.m_textW.getHTML() def checkForChange(self): text = self.m_textW.getHTML() if text != self.m_lastText: nEvt = doc().createEvent("HTMLEvents") nEvt.initEvent("change", False, True) self.getElement().dispatchEvent(nEvt) self.m_lastText = text # Update edit buttons based on current cursor location def updateStatus(self): if self.m_formatter is None: return self.m_boldW.setDown(self.m_formatter.isBold()) self.m_italicW.setDown(self.m_formatter.isItalic()) self.m_underlineW.setDown(self.m_formatter.isUnderlined()) self.m_subscriptW.setDown(self.m_formatter.isSubscript()) self.m_superscriptW.setDown(self.m_formatter.isSuperscript()) self.m_strikethroughW.setDown(self.m_formatter.isStrikethrough()) def addChangeHandler(self, handler): return addDomHandler(handler, ChangeEvent.getType())