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 from SfaData import ViniData 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): DockPanel.__init__(self) self.sfadata = sfadata self.setHorizontalAlignment(HasAlignment.ALIGN_CENTER) self.setVerticalAlignment(HasAlignment.ALIGN_MIDDLE) self.availableRegex = None self.selectedRegex = None leftpanel = VerticalPanel() self.leftcap = CaptionPanel("Available nodes") self.leftlist = ListBox(MultipleSelect=True, VisibleItemCount=20) self.leftcap.add(self.leftlist) leftpanel.add(self.leftcap) hp1 = HorizontalPanel() filterButton = Button("Filter", self.filterLeft) self.leftRegExBox = TextBox() hp1.add(filterButton) hp1.add(self.leftRegExBox) leftpanel.add(hp1) rightpanel = VerticalPanel() self.rightcap = CaptionPanel("Selected nodes") self.rightlist = ListBox(MultipleSelect=True, VisibleItemCount=20) self.rightcap.add(self.rightlist) rightpanel.add(self.rightcap) hp2 = HorizontalPanel() filterButton = Button("Filter", self.filterRight) self.rightRegExBox = TextBox() hp2.add(filterButton) hp2.add(self.rightRegExBox) 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.setStyleName("ks-layouts") self.refresh() def refresh(self): rspec = self.sfadata.getRSpec() slivers = self.sortNodes(rspec.get_sliver_list()) self.rightcap.setCaption("Selected nodes (%s)" % len(slivers)) all = rspec.get_node_list() available = self.sortNodes(filter(lambda x:x not in slivers,all)) self.leftcap.setCaption("Available nodes (%s)" % len(available)) if self.availableRegex: pattern = re.compile(self.availableRegex) available = filter(pattern.search, available) if self.selectedRegex: pattern = re.compile(self.selectedRegex) slivers = filter(pattern.search, slivers) 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): rspec = self.sfadata.getRSpec() nodes = self.getSelected(self.leftlist) for node in nodes: rspec.add_sliver(node) self.refresh() def removeNodes(self, sender): rspec = self.sfadata.getRSpec() nodes = self.getSelected(self.rightlist) for node in nodes: rspec.remove_sliver(node) self.refresh() def filterLeft(self, sender): self.availableRegex = self.leftRegExBox.getText() self.refresh() def filterRight(self, sender): self.selectedRegex = self.rightRegExBox.getText() self.refresh()