Tweaks for first demo of GUI
[sfa-gui.git] / NodePanel.py
1 from pyjamas.ui.HorizontalPanel import HorizontalPanel
2 from pyjamas.ui.VerticalPanel import VerticalPanel
3 from pyjamas.ui.DockPanel import DockPanel
4 from pyjamas.ui.CaptionPanel import CaptionPanel
5 from pyjamas.ui.Button import Button
6 from pyjamas.ui.Composite import Composite
7 from pyjamas.ui.ListBox import ListBox
8 from pyjamas.ui.TextBox import TextBox
9 from pyjamas.ui.HTML import HTML
10 from pyjamas.ui import HasAlignment
11 from SfaData import ViniData
12 import re
13
14 def faster_clear(self):
15     count = self.getItemCount()
16     while count > 0:
17         self.removeItem(0)
18         count -= 1
19 ListBox.clear = faster_clear            
20
21 class NodePanel(DockPanel):
22     def __init__(self, sfadata):
23         DockPanel.__init__(self)
24         self.sfadata = sfadata
25
26         self.setSize("100%", "100%")
27         self.setHorizontalAlignment(HasAlignment.ALIGN_CENTER)
28         self.setVerticalAlignment(HasAlignment.ALIGN_MIDDLE)
29         self.availableRegex = None
30         self.selectedRegex = None
31
32         leftpanel = VerticalPanel()
33         leftcap = CaptionPanel("Available nodes")
34         self.leftlist = ListBox(MultipleSelect=True, VisibleItemCount=20)
35         leftcap.add(self.leftlist)
36         leftpanel.add(leftcap)
37
38         hp1 = HorizontalPanel()
39         filterButton = Button("Filter", self.filterLeft)
40         self.leftRegExBox = TextBox()
41         hp1.add(filterButton)
42         hp1.add(self.leftRegExBox)
43         leftpanel.add(hp1)
44
45         rightpanel = VerticalPanel()
46         rightcap = CaptionPanel("Selected nodes")
47         self.rightlist = ListBox(MultipleSelect=True, VisibleItemCount=20)
48         rightcap.add(self.rightlist)
49         rightpanel.add(rightcap)
50
51         hp2 = HorizontalPanel()
52         filterButton = Button("Filter", self.filterRight)
53         self.rightRegExBox = TextBox()
54         hp2.add(filterButton)
55         hp2.add(self.rightRegExBox)
56         rightpanel.add(hp2)
57
58         addButton = Button(">>", self.addNodes)
59         removeButton = Button("<<", self.removeNodes)
60         vertpanel = VerticalPanel()
61         vertpanel.setVerticalAlignment(HasAlignment.ALIGN_MIDDLE)
62         vertpanel.add(addButton)
63         vertpanel.add(removeButton)
64
65         self.add(leftpanel, DockPanel.WEST)
66         self.add(rightpanel, DockPanel.EAST)
67         self.add(vertpanel, DockPanel.CENTER)
68
69         self.refresh()
70
71     def refresh(self):
72         rspec = self.sfadata.getRSpec()
73
74         slivers = self.sortNodes(rspec.get_sliver_list())
75         all = rspec.get_node_list()
76         available = self.sortNodes(filter(lambda x:x not in slivers,all))
77
78         if self.availableRegex:
79             pattern = re.compile(self.availableRegex)
80             available = filter(pattern.search, available)
81
82         if self.selectedRegex:
83             pattern = re.compile(self.selectedRegex)
84             slivers = filter(pattern.search, slivers)
85
86         self.leftlist.clear()
87         for i in available:
88             self.leftlist.addItem(i)
89         self.rightlist.clear()
90         for i in slivers:
91             self.rightlist.addItem(i)
92
93     def onShow(self):
94         pass
95
96     def sortNodes(self, nodes):
97         nodes.sort()
98         return nodes
99
100     def getSelected(self, listbox):
101         got = []
102         for i in range(listbox.getItemCount()):
103             if listbox.isItemSelected(i):
104                 got.append(listbox.getItemText(i))
105         return got
106
107     def addNodes(self, sender):
108         rspec = self.sfadata.getRSpec()
109         nodes = self.getSelected(self.leftlist)
110         for node in nodes:
111             rspec.add_sliver(node)
112         self.refresh()
113
114     def removeNodes(self, sender):
115         rspec = self.sfadata.getRSpec()
116         nodes = self.getSelected(self.rightlist)
117         for node in nodes:
118             rspec.remove_sliver(node)
119         self.refresh()
120
121     def filterLeft(self, sender):
122         self.availableRegex = self.leftRegExBox.getText()
123         self.refresh()
124
125     def filterRight(self, sender):
126         self.selectedRegex = self.rightRegExBox.getText()
127         self.refresh()