1 from Sink import Sink, SinkInfo
2 from pyjamas.ui.Tree import Tree, TreeItem
3 from pyjamas.ui.PopupPanel import PopupPanel
4 from pyjamas.ui.HTML import HTML
5 from SfaData import PlanetLabData
7 class PopupRecord(PopupPanel):
8 def __init__(self, record):
9 PopupPanel.__init__(self, True)
10 contents = HTML("<pre>" + record + "</pre>")
11 self.setWidget(contents)
13 self.setStyleName("ks-popups-Popup")
15 class SfaItem(TreeItem):
16 def __init__(self, hrn, kind):
19 last = hrn.split('.')[-1]
20 if self.kind == "(authority)":
21 self.label = "<b>%s</b>" % last
22 elif self.kind == "(slice)":
23 self.label = "<u><i>%s</i></u>" % last
24 elif self.kind == "(user)":
25 self.label = "%s" % last
27 self.label = "<b>%s</b>" % last
29 TreeItem.__init__(self, self.label)
31 if self.kind == "(authority)":
32 self.addItem(PendingItem())
34 class PendingItem(TreeItem):
36 TreeItem.__init__(self, "Please wait...")
38 def isPendingItem(self):
41 class SfaBrowser(Sink):
46 self.data = PlanetLabData()
50 item = SfaItem("plc", "(authority)")
51 self.tree.addItem(item)
53 item = SfaItem("ple", "(authority)")
54 self.tree.addItem(item)
56 self.tree.addTreeListener(self)
58 self.initWidget(self.tree)
61 def onTreeItemSelected(self, item):
62 record = self.data.getRecord(item.hrn)
63 p = PopupRecord(record)
64 left = item.getAbsoluteLeft() + 10
65 top = item.getAbsoluteTop() + 10
66 p.setPopupPosition(left, top)
69 def onTreeItemStateChanged(self, item):
70 self.tree.moveFocus(item)
71 child = item.getChild(0)
72 if hasattr(child, "isPendingItem"):
73 item.removeItem(child)
74 hrns = sorted(self.data.listChildren(item.hrn),
75 key=lambda hrn: hrn[0])
76 for (hrn, kind) in hrns:
77 item.addItem(SfaItem(hrn, kind))
84 return SinkInfo("Browse SFA", "SFA Hierarchy Browser", SfaBrowser)