+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):
+ # Call sfi.py create via ViniData object
+ pass
+
+ def reset(self, sender):
+ self.rspec = self.data.getRSpec()
+ self.refresh()
+
+ def filter(self, sender):
+ self.regex = self.regExBox.getText()
+ self.refresh()