Added Node selection and Sliver (attribute) configuration panels to
[sfa-gui.git] / NodePanel.py
diff --git a/NodePanel.py b/NodePanel.py
new file mode 100644 (file)
index 0000000..b7333ba
--- /dev/null
@@ -0,0 +1,120 @@
+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()