typo
[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.setHorizontalAlignment(HasAlignment.ALIGN_CENTER)
27         self.setVerticalAlignment(HasAlignment.ALIGN_MIDDLE)
28         self.availableRegex = None
29         self.selectedRegex = None
30
31         leftpanel = VerticalPanel()
32         self.leftcap = CaptionPanel("Available nodes")
33         self.leftlist = ListBox(MultipleSelect=True, VisibleItemCount=20)
34         self.leftcap.add(self.leftlist)
35         leftpanel.add(self.leftcap)
36
37         hp1 = HorizontalPanel()
38         filterButton = Button("Filter", self.filterLeft)
39         self.leftRegExBox = TextBox()
40         hp1.add(filterButton)
41         hp1.add(self.leftRegExBox)
42         leftpanel.add(hp1)
43
44         rightpanel = VerticalPanel()
45         self.rightcap = CaptionPanel("Selected nodes")
46         self.rightlist = ListBox(MultipleSelect=True, VisibleItemCount=20)
47         self.rightcap.add(self.rightlist)
48         rightpanel.add(self.rightcap)
49
50         hp2 = HorizontalPanel()
51         filterButton = Button("Filter", self.filterRight)
52         self.rightRegExBox = TextBox()
53         hp2.add(filterButton)
54         hp2.add(self.rightRegExBox)
55         rightpanel.add(hp2)
56
57         addButton = Button(">>", self.addNodes)
58         removeButton = Button("<<", self.removeNodes)
59         vertpanel = VerticalPanel()
60         vertpanel.setVerticalAlignment(HasAlignment.ALIGN_MIDDLE)
61         vertpanel.add(addButton)
62         vertpanel.add(removeButton)
63
64         self.add(leftpanel, DockPanel.WEST)
65         self.add(rightpanel, DockPanel.EAST)
66         self.add(vertpanel, DockPanel.CENTER)
67
68         self.setStyleName("ks-layouts")
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()