from pyjamas.ui.HorizontalPanel import HorizontalPanel from pyjamas.ui.VerticalPanel import VerticalPanel from pyjamas.ui.DockPanel import DockPanel from pyjamas.ui.CaptionPanel import CaptionPanel from pyjamas.ui.Button import Button from pyjamas.ui.Composite import Composite from pyjamas.ui.ListBox import ListBox from pyjamas.ui.TextBox import TextBox from pyjamas.ui.HTML import HTML from pyjamas.ui import HasAlignment import re def faster_clear(self): count = self.getItemCount() while count > 0: self.removeItem(0) count -= 1 ListBox.clear = faster_clear class NodePanel(DockPanel): def __init__(self, sfadata, rspec): DockPanel.__init__(self) self.data = sfadata self.rspec = rspec self.setSize("100%", "100%") self.setHorizontalAlignment(HasAlignment.ALIGN_CENTER) self.setVerticalAlignment(HasAlignment.ALIGN_MIDDLE) self.regex = None leftpanel = VerticalPanel() leftcap = CaptionPanel("Available nodes") self.leftlist = ListBox(MultipleSelect=True, VisibleItemCount=20) leftcap.add(self.leftlist) leftpanel.add(leftcap) hp1 = HorizontalPanel() filterButton = Button("Filter", self.filter) self.regExBox = TextBox() hp1.add(filterButton) hp1.add(self.regExBox) leftpanel.add(hp1) rightpanel = VerticalPanel() rightcap = CaptionPanel("Selected nodes") self.rightlist = ListBox(MultipleSelect=True, VisibleItemCount=20) rightcap.add(self.rightlist) rightpanel.add(rightcap) hp2 = HorizontalPanel() applyButton = Button("Apply", self.apply) resetButton = Button("Reset", self.reset) hp2.add(applyButton) hp2.add(resetButton) rightpanel.add(hp2) addButton = Button(">>", self.addNodes) removeButton = Button("<<", self.removeNodes) vertpanel = VerticalPanel() vertpanel.setVerticalAlignment(HasAlignment.ALIGN_MIDDLE) vertpanel.add(addButton) vertpanel.add(removeButton) self.add(leftpanel, DockPanel.WEST) self.add(rightpanel, DockPanel.EAST) self.add(vertpanel, DockPanel.CENTER) self.refresh() def refresh(self): slivers = self.sortNodes(self.rspec.get_sliver_list()) all = self.rspec.get_node_list() available = self.sortNodes(filter(lambda x:x not in slivers,all)) if self.regex: pattern = re.compile(self.regex) available = filter(pattern.search, available) self.leftlist.clear() for i in available: self.leftlist.addItem(i) self.rightlist.clear() for i in slivers: self.rightlist.addItem(i) def onShow(self): pass def sortNodes(self, nodes): nodes.sort() return nodes def getSelected(self, listbox): got = [] for i in range(listbox.getItemCount()): if listbox.isItemSelected(i): got.append(listbox.getItemText(i)) return got def addNodes(self, sender): nodes = self.getSelected(self.leftlist) for node in nodes: self.rspec.add_sliver(node) self.refresh() def removeNodes(self, sender): nodes = self.getSelected(self.rightlist) for node in nodes: self.rspec.remove_sliver(node) self.refresh() def apply(self, sender): self.data.applyRSpec(self.rspec) def reset(self, sender): self.rspec = self.data.getRSpec() self.refresh() def filter(self, sender): self.regex = self.regExBox.getText() self.refresh()