Tweaks
[sfa-gui.git] / LinkPanel.py
index cc36bc3..9c3a7d7 100644 (file)
 from pyjamas.ui.VerticalPanel import VerticalPanel
+from pyjamas.ui.Grid import Grid
+from pyjamas.ui.DockPanel import DockPanel
 from pyjamas.ui.HorizontalPanel import HorizontalPanel
 from pyjamas.ui.CaptionPanel import CaptionPanel
-from pyjamas.ui.ListBox import ListBox
+from pyjamas.ui.CheckBox import CheckBox
 from pyjamas.ui.TextBox import TextBox
 from pyjamas.ui.Button import Button
 from pyjamas.ui.HTML import HTML
+from pyjamas.ui.Image import Image
 from pyjamas.ui import HasAlignment
 
-class AddPanel(CaptionPanel):
-    def __init__(self, top):
-        CaptionPanel.__init__(self, "Add virtual link")
+class TopPanel(DockPanel):
+    def __init__(self, top, bw, active = False):
+        DockPanel.__init__(self)
         self.top = top
-
+        self.setWidth("100%")
+        self.cb = CheckBox("Use virtual topology")
+        self.cb.setChecked(active)
+        self.cb.addClickListener(self)
         hp = HorizontalPanel()
-        self.end1 = ListBox()
-        self.end1.addItem("Endpoint 1")
-        for sliver in self.top.rspec.get_sliver_list():
-            self.end1.addItem(sliver)
-
-        self.end2 = ListBox()
-        self.end2.addItem("Endpoint 2")
-        for sliver in self.top.rspec.get_sliver_list():
-            self.end2.addItem(sliver)
-
-        self.bw = TextBox()
-        self.bw.setText("1000")
-
-        hp.add(self.end1)
-        hp.add(self.end2)
-        hp.add(self.bw)
-        hp.add(Button("Add", self.go))
-
-        self.add(hp)
-
-    def go(self, sender):
-        end1 = self.end1.getItemText(self.end1.getSelectedIndex())
-        end2 = self.end2.getItemText(self.end2.getSelectedIndex())
-        bw = self.bw.getText()
-
-        self.top.refresh()
+        self.tb = TextBox()
+        self.tb.setVisibleLength(8)
+        self.tb.setTextAlignment(self.tb.ALIGN_RIGHT)
+        self.tb.setText(bw)
+        hp.add(HTML("Default bandwidth: "))
+        hp.add(self.tb)
+        hp.add(HTML(" kbps"))
+
+        self.add(self.cb, DockPanel.WEST)
+        self.add(hp, DockPanel.EAST)
+        self.setCellHorizontalAlignment(hp, HasAlignment.ALIGN_RIGHT)
+
+    def onClick(self, sender):
+        if sender == self.cb:
+            if sender.isChecked():
+                self.top.build_topology()
+                self.top.refresh()
+            else:
+                self.top.clear_vlinks()
+                ## Unset vini_topo attribute?
+                self.top.refresh()
+
+    def getDefaultBW(self):
+        bw = self.tb.getText()
+        return bw
         
-
-class VlinkPanel(HorizontalPanel):
-    def __init__(self, top, description, bw):
-        HorizontalPanel.__init__(self)
+class VlinkPanel(DockPanel):
+    def __init__(self, top, handle, description, bw):
+        DockPanel.__init__(self)
+        self.handle = handle
         self.description = description
         self.bw = bw
         self.top = top
 
-        self.setSpacing(5)
-        self.setVerticalAlignment(HasAlignment.ALIGN_MIDDLE)
-        b = Button("X", self.delete)
-        self.add(b)
-        self.add(HTML("%s (%s kbps)" % (self.description, self.bw)))
-
-    def delete(self, sender):
+        hp1 = HorizontalPanel()
+        delete = Image("./images/cancel.png")
+        delete.addClickListener(self)
+        hp1.add(delete)
+        hp1.add(HTML(" %s" % self.description))
+        
+        hp2 = HorizontalPanel()
+        tb = TextBox()
+        tb.setVisibleLength(8)
+        tb.setTextAlignment(tb.ALIGN_RIGHT)
+        tb.setText(bw)
+        hp2.add(tb)
+        hp2.add(HTML(" kbps"))
+
+        self.add(hp1, DockPanel.WEST)
+        self.setCellHorizontalAlignment(hp1, HasAlignment.ALIGN_LEFT)
+        self.setCellWidth(hp1, "100%")
+
+        self.add(hp2, DockPanel.EAST)
+        self.setCellHorizontalAlignment(hp2, HasAlignment.ALIGN_RIGHT)
+        self.setWidth("100%")
+
+    def onClick(self, sender):
+        rspec = self.top.sfadata.getRSpec()
+        rspec.remove_vlink(self.handle)
         self.top.refresh()
 
 
 class LinkPanel(VerticalPanel):
-    def __init__(self, sfadata, rspec):
+    def __init__(self, sfadata):
         VerticalPanel.__init__(self)
-        self.data = sfadata
-        self.rspec = rspec
-
+        self.sfadata = sfadata
+        self.defaultbw = 1000
+        self.setStyleName("ks-layouts")
         self.refresh()
 
     def refresh(self):
         self.clear()
-        self.add(AddPanel(self))
+        rspec = self.sfadata.getRSpec()
+        vlinks = rspec.get_vlink_list()
+
+        self.toppanel = TopPanel(self, self.defaultbw, (len(vlinks) > 0))
+        self.add(self.toppanel)
 
         cp = CaptionPanel("Virtual links")
         vp = VerticalPanel()
-        vlinks = self.rspec.get_vlink_list()
-        for (desc, bw) in vlinks:
-            vp.add(VlinkPanel(self, desc, bw))
+        vp.setWidth("100%")
+        for (handle, desc, bw) in vlinks:
+            vp.add(VlinkPanel(self, handle, desc, bw))
         cp.add(vp)
         self.add(cp)
+
+    def clear_vlinks(self):
+        rspec = self.sfadata.getRSpec()
+        vlinks = rspec.get_vlink_list()
+        for (handle, desc, bw) in vlinks:
+            rspec.remove_vlink(handle)
+
+    def build_topology(self):
+        rspec = self.sfadata.getRSpec()
+        nodes = rspec.get_sliver_list()
+        links = rspec.get_link_list()
+        self.defaultbw = self.toppanel.getDefaultBW()
+
+        for (name, end1nodes, end2nodes) in links:
+            for node1 in end1nodes:
+                for node2 in end2nodes:
+                    if (node1 in nodes) and (node2 in nodes):
+                        rspec.add_vlink(node1, node2, self.defaultbw)