b7333ba12eb716ae0a68ced061807937d9d23728
[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 import re
12
13 def faster_clear(self):
14     count = self.getItemCount()
15     while count > 0:
16         self.removeItem(0)
17         count -= 1
18 ListBox.clear = faster_clear            
19
20 class NodePanel(DockPanel):
21     def __init__(self, sfadata, rspec):
22         DockPanel.__init__(self)
23         self.data = sfadata
24         self.rspec = rspec
25
26         self.setSize("100%", "100%")
27         self.setHorizontalAlignment(HasAlignment.ALIGN_CENTER)
28         self.setVerticalAlignment(HasAlignment.ALIGN_MIDDLE)
29         self.regex = None
30
31         leftpanel = VerticalPanel()
32         leftcap = CaptionPanel("Available nodes")
33         self.leftlist = ListBox(MultipleSelect=True, VisibleItemCount=20)
34         leftcap.add(self.leftlist)
35         leftpanel.add(leftcap)
36
37         hp1 = HorizontalPanel()
38         filterButton = Button("Filter", self.filter)
39         self.regExBox = TextBox()
40         hp1.add(filterButton)
41         hp1.add(self.regExBox)
42         leftpanel.add(hp1)
43
44         rightpanel = VerticalPanel()
45         rightcap = CaptionPanel("Selected nodes")
46         self.rightlist = ListBox(MultipleSelect=True, VisibleItemCount=20)
47         rightcap.add(self.rightlist)
48         rightpanel.add(rightcap)
49
50         hp2 = HorizontalPanel()
51         applyButton = Button("Apply", self.apply)
52         resetButton = Button("Reset", self.reset)
53         hp2.add(applyButton)
54         hp2.add(resetButton)
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.refresh()
69
70     def refresh(self):
71         slivers = self.sortNodes(self.rspec.get_sliver_list())
72         all = self.rspec.get_node_list()
73         available = self.sortNodes(filter(lambda x:x not in slivers,all))
74         if self.regex:
75             pattern = re.compile(self.regex)
76             available = filter(pattern.search, available)
77         self.leftlist.clear()
78         for i in available:
79             self.leftlist.addItem(i)
80         self.rightlist.clear()
81         for i in slivers:
82             self.rightlist.addItem(i)
83
84     def onShow(self):
85         pass
86
87     def sortNodes(self, nodes):
88         nodes.sort()
89         return nodes
90
91     def getSelected(self, listbox):
92         got = []
93         for i in range(listbox.getItemCount()):
94             if listbox.isItemSelected(i):
95                 got.append(listbox.getItemText(i))
96         return got
97
98     def addNodes(self, sender):
99         nodes = self.getSelected(self.leftlist)
100         for node in nodes:
101             self.rspec.add_sliver(node)
102         self.refresh()
103
104     def removeNodes(self, sender):
105         nodes = self.getSelected(self.rightlist)
106         for node in nodes:
107             self.rspec.remove_sliver(node)
108         self.refresh()
109
110     def apply(self, sender):
111         # Call sfi.py create via ViniData object
112         pass
113
114     def reset(self, sender):
115         self.rspec = self.data.getRSpec()
116         self.refresh()
117
118     def filter(self, sender):
119         self.regex = self.regExBox.getText()
120         self.refresh()