80a6bf4740371c8f2bc03a02eea8414f5ba54eeb
[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         self.leftcap = CaptionPanel("Available nodes")
34         self.leftlist = ListBox(MultipleSelect=True, VisibleItemCount=20)
35         self.leftcap.add(self.leftlist)
36         leftpanel.add(self.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         self.rightcap = CaptionPanel("Selected nodes")
47         self.rightlist = ListBox(MultipleSelect=True, VisibleItemCount=20)
48         self.rightcap.add(self.rightlist)
49         rightpanel.add(self.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         self.rightcap.setCaption("Selected nodes (%s)" % len(slivers))
76         all = rspec.get_node_list()
77         available = self.sortNodes(filter(lambda x:x not in slivers,all))
78         self.leftcap.setCaption("Available nodes (%s)" % len(available))
79
80         if self.availableRegex:
81             pattern = re.compile(self.availableRegex)
82             available = filter(pattern.search, available)
83
84         if self.selectedRegex:
85             pattern = re.compile(self.selectedRegex)
86             slivers = filter(pattern.search, slivers)
87
88         self.leftlist.clear()
89         for i in available:
90             self.leftlist.addItem(i)
91         self.rightlist.clear()
92         for i in slivers:
93             self.rightlist.addItem(i)
94
95     def onShow(self):
96         pass
97
98     def sortNodes(self, nodes):
99         nodes.sort()
100         return nodes
101
102     def getSelected(self, listbox):
103         got = []
104         for i in range(listbox.getItemCount()):
105             if listbox.isItemSelected(i):
106                 got.append(listbox.getItemText(i))
107         return got
108
109     def addNodes(self, sender):
110         rspec = self.sfadata.getRSpec()
111         nodes = self.getSelected(self.leftlist)
112         for node in nodes:
113             rspec.add_sliver(node)
114         self.refresh()
115
116     def removeNodes(self, sender):
117         rspec = self.sfadata.getRSpec()
118         nodes = self.getSelected(self.rightlist)
119         for node in nodes:
120             rspec.remove_sliver(node)
121         self.refresh()
122
123     def filterLeft(self, sender):
124         self.availableRegex = self.leftRegExBox.getText()
125         self.refresh()
126
127     def filterRight(self, sender):
128         self.selectedRegex = self.rightRegExBox.getText()
129         self.refresh()