discovery.py
changeset 221 451bb2c1d157
parent 203 cb9901076a21
child 226 f301f4ed4717
equal deleted inserted replaced
220:ad3292145fc2 221:451bb2c1d157
    34         listmix.ListCtrlAutoWidthMixin.__init__(self)
    34         listmix.ListCtrlAutoWidthMixin.__init__(self)
    35 
    35 
    36 class DiscoveryDialog(wx.Dialog, listmix.ColumnSorterMixin):
    36 class DiscoveryDialog(wx.Dialog, listmix.ColumnSorterMixin):
    37     def __init__(self, parent, id=-1, title='Service Discovery'):
    37     def __init__(self, parent, id=-1, title='Service Discovery'):
    38         self.my_result=None
    38         self.my_result=None
    39         self.itemDataMap = {}
       
    40         wx.Dialog.__init__(self, parent, id, title, size=(600,600), style=wx.DEFAULT_DIALOG_STYLE)
    39         wx.Dialog.__init__(self, parent, id, title, size=(600,600), style=wx.DEFAULT_DIALOG_STYLE)
    41 
    40 
       
    41         sizer = wx.FlexGridSizer(2, 1, 2, 2)  # rows, cols, vgap, hgap
       
    42         sizer.AddGrowableRow(0)
       
    43         sizer.AddGrowableCol(0)
       
    44 
    42         self.list = TestListCtrl(self, -1,
    45         self.list = TestListCtrl(self, -1,
    43                                  pos=(50,20), 
    46                                  #pos=(50,20), 
    44                                  size=(500,300),
    47                                  #size=(500,300),
    45                                  style=wx.LC_REPORT 
    48                                  style=wx.LC_REPORT 
    46                                 | wx.LC_EDIT_LABELS
    49                                 | wx.LC_EDIT_LABELS
    47                                 | wx.LC_SORT_ASCENDING
    50                                 | wx.LC_SORT_ASCENDING
    48                                 )
    51                                 )
       
    52         sizer.Add(self.list, 1, wx.EXPAND)
       
    53 
       
    54         btsizer = wx.FlexGridSizer(1, 6, 2, 2)  # rows, cols, vgap, hgap
       
    55         
       
    56         sizer.Add(btsizer, 1, wx.EXPAND)
       
    57 
    49         self.PopulateList()
    58         self.PopulateList()
    50 
    59 
    51         self.Bind(wx.EVT_LIST_ITEM_SELECTED, self.OnItemSelected, self.list)
    60         self.Bind(wx.EVT_LIST_ITEM_SELECTED, self.OnItemSelected, self.list)
    52         self.Bind(wx.EVT_LIST_ITEM_DESELECTED, self.OnItemDeselected, self.list)
       
    53         self.Bind(wx.EVT_LIST_ITEM_ACTIVATED, self.OnItemActivated, self.list)
    61         self.Bind(wx.EVT_LIST_ITEM_ACTIVATED, self.OnItemActivated, self.list)
    54         self.Bind(wx.EVT_LIST_DELETE_ITEM, self.OnItemDelete, self.list)
       
    55         self.Bind(wx.EVT_LIST_COL_CLICK, self.OnColClick, self.list)
       
    56         self.list.Bind(wx.EVT_LEFT_DCLICK, self.OnDoubleClick)
       
    57 
    62 
    58         b = wx.Button(self,20, "Connect", (175, 500))
    63         local_id = wx.NewId()
    59         self.Bind(wx.EVT_BUTTON, self.OnConnect, b)
    64         b = wx.Button(self, local_id, "Refresh")
    60         b.SetSize(b.GetBestSize())
    65         self.Bind(wx.EVT_BUTTON, self.OnRefreshButton, b)
       
    66         btsizer.Add(b)
    61 
    67 
    62         b = wx.Button(self, 40, "Cancel", (350, 500))
    68         btsizer.AddSpacer(0)
    63         self.Bind(wx.EVT_BUTTON, self.OnClose, b)
    69         btsizer.AddGrowableCol(1)
    64         b.SetSize(b.GetBestSize())
    70 
       
    71         local_id = wx.NewId()
       
    72         b = wx.Button(self, local_id, "Local")
       
    73         self.Bind(wx.EVT_BUTTON, self.ChooseLocalID, b)
       
    74         btsizer.Add(b)
       
    75 
       
    76         btsizer.AddSpacer(0)
       
    77         btsizer.AddGrowableCol(3)
       
    78 
       
    79         b = wx.Button(self, wx.ID_CANCEL, "Cancel")
       
    80         #self.Bind(wx.EVT_BUTTON, self.OnClose, b)
       
    81         btsizer.Add(b)
       
    82 
       
    83         b = wx.Button(self, wx.ID_OK, "OK")
       
    84         #self.Bind(wx.EVT_BUTTON, self.OnConnect, b)
       
    85         b.SetDefault()
       
    86         btsizer.Add(b)
       
    87 
       
    88         self.SetSizer(sizer)
       
    89 
       
    90         listmix.ColumnSorterMixin.__init__(self, 4)
    65 
    91 
    66         #type = "_http._tcp.local."
    92         #type = "_http._tcp.local."
       
    93         self.zConfInstance = Zeroconf()
       
    94         self.RefreshList()
       
    95 
       
    96     def RefreshList(self):
    67         type = "_PYRO._tcp.local."
    97         type = "_PYRO._tcp.local."
    68         self.r = Zeroconf()	
    98         browser = ServiceBrowser(self.zConfInstance, type, self)        
    69         browser = ServiceBrowser(self.r, type, self)		
       
    70 
    99 
    71         listmix.ColumnSorterMixin.__init__(self, 4)
   100     def OnRefreshButton(self, event):
       
   101         self.list.DeleteAllItems()
       
   102         self.RefreshList()
       
   103 
    72     # Used by the ColumnSorterMixin, see wx/lib/mixins/listctrl.py
   104     # Used by the ColumnSorterMixin, see wx/lib/mixins/listctrl.py
    73     def GetListCtrl(self):
   105     def GetListCtrl(self):
    74         return self.list
   106         return self.list
    75 
   107 
    76     def PopulateList(self):
   108     def PopulateList(self):
    77  	self.list.InsertColumn(0, 'NAME')
   109         self.list.InsertColumn(0, 'NAME')
    78         self.list.InsertColumn(1, 'TYPE')
   110         self.list.InsertColumn(1, 'TYPE')
    79         self.list.InsertColumn(2, 'IP')
   111         self.list.InsertColumn(2, 'IP')
    80         self.list.InsertColumn(3, 'PORT')
   112         self.list.InsertColumn(3, 'PORT')
    81         self.list.SetColumnWidth(0, 150)
   113         self.list.SetColumnWidth(0, 150)
    82         self.list.SetColumnWidth(1, 150)
   114         self.list.SetColumnWidth(1, 150)
    87         item = self.list.GetItem(index, col)
   119         item = self.list.GetItem(index, col)
    88         return item.GetText()
   120         return item.GetText()
    89 
   121 
    90     def OnItemSelected(self, event):
   122     def OnItemSelected(self, event):
    91         self.currentItem = event.m_itemIndex
   123         self.currentItem = event.m_itemIndex
    92         print "OnItemSelected: %s, %s, %s, %s\n"%(self.currentItem,
   124         self.setresult()
    93                             self.list.GetItemText(self.currentItem),
       
    94                             self.getColumnText(self.currentItem, 1),
       
    95                             self.getColumnText(self.currentItem, 2))
       
    96         event.Skip()
   125         event.Skip()
    97 
       
    98 
       
    99     def OnItemDeselected(self, evt):
       
   100         item = evt.GetItem()
       
   101         print "OnItemDeselected: %d" % evt.m_itemIndex
       
   102 
   126 
   103     def OnItemActivated(self, event):
   127     def OnItemActivated(self, event):
   104         self.currentItem = event.m_itemIndex
   128         self.currentItem = event.m_itemIndex
   105         print "OnItemActivated: %s\nTopItem: %s" %(self.list.GetItemText(self.currentItem), self.list.GetTopItem())
   129         self.setresult()
   106 
   130         self.Close()
   107     def OnItemDelete(self, event):
       
   108         print "OnItemDelete\n"
       
   109 
       
   110     def OnColClick(self, event):
       
   111         print "OnColClick: %d\n" % event.GetColumn()
       
   112         event.Skip()
   131         event.Skip()
   113 
   132 
   114     def OnColRightClick(self, event):
   133     def setresult(self):
   115         item = self.list.GetColumn(event.GetColumn())
       
   116         print "OnColRightClick: %d %s\n" %(event.GetColumn(), (item.GetText(), item.GetAlign(),
       
   117                                                 item.GetWidth(), item.GetImage()))
       
   118     def OnDoubleClick(self, event):
       
   119         connect_type = self.getColumnText(self.currentItem, 1)
   134         connect_type = self.getColumnText(self.currentItem, 1)
   120         connect_address = self.getColumnText(self.currentItem, 2)
   135         connect_address = self.getColumnText(self.currentItem, 2)
   121         connect_port = self.getColumnText(self.currentItem, 3)
   136         connect_port = self.getColumnText(self.currentItem, 3)
   122         
   137         
   123         uri = self.CreateURI(connect_type, connect_address, connect_port)
   138         uri = self.CreateURI(connect_type, connect_address, connect_port)
   125         event.Skip()
   140         event.Skip()
   126 
   141 
   127     def GetResult(self):
   142     def GetResult(self):
   128         return self.my_result
   143         return self.my_result
   129         
   144         
   130     def OnClick(self, event):
       
   131         print "Click! (%d)\n" %event.GetId()
       
   132         index = self.list.GetFocusedItem()
       
   133         self.list.DeleteItem(index)	
       
   134         print "Service", name, "removed"
       
   135 
       
   136     def removeService(self, zeroconf, type, name):
   145     def removeService(self, zeroconf, type, name):
   137         index = self.list.GetFocusedItem()       
   146         pass
   138 	
   147 	
   139     def addService(self, zeroconf, type, name):
   148     def addService(self, zeroconf, type, name):
   140         info = self.r.getServiceInfo(type, name)
   149         info = self.zConfInstance.getServiceInfo(type, name)
   141         typename = type.split(".")[0][1:]
   150         typename = type.split(".")[0][1:]
   142         num_items = self.list.GetItemCount()
   151         num_items = self.list.GetItemCount()
   143         self.itemDataMap[num_items] = (name, "%s"%type, "%s"%str(socket.inet_ntoa(info.getAddress())), "%s"%info.getPort())
       
   144         self.list.InsertStringItem(num_items, name.split(".")[0])
   152         self.list.InsertStringItem(num_items, name.split(".")[0])
   145         self.list.SetStringItem(num_items, 1, "%s"%typename)
   153         self.list.SetStringItem(num_items, 1, "%s"%typename)
   146         self.list.SetStringItem(num_items, 2, "%s"%str(socket.inet_ntoa(info.getAddress())))
   154         self.list.SetStringItem(num_items, 2, "%s"%str(socket.inet_ntoa(info.getAddress())))
   147         self.list.SetStringItem(num_items, 3, "%s"%info.getPort())
   155         self.list.SetStringItem(num_items, 3, "%s"%info.getPort())
   148 
   156 
   149     def CreateURI(self, connect_type, connect_address, connect_port):
   157     def CreateURI(self, connect_type, connect_address, connect_port):
   150         uri = "%s://%s:%s"%(connect_type, connect_address, connect_port)
   158         uri = "%s://%s:%s"%(connect_type, connect_address, connect_port)
   151         print uri
       
   152         return uri
   159         return uri
   153 
   160 
   154     def OnAdd(self, event):
   161     def ChooseLocalID(self, event):
   155         num_items = self.list.GetItemCount()
   162         self.my_result = "PYRO://localhost:3000"
   156         self.list.InsertStringItem(num_items, self.tc1.GetValue())
       
   157         self.list.SetStringItem(num_items, 1, self.tc2.GetValue())
       
   158 
       
   159     def OnRemove(self, event):
       
   160         index = self.list.GetFocusedItem()
       
   161         self.list.DeleteItem(index)
       
   162 
       
   163     def OnConnect(self, event):
       
   164         index = self.list.GetFocusedItem()
       
   165         print self.list.GetItemData(index)
       
   166 
       
   167     def OnClose(self, event):
       
   168         self.Close()
   163         self.Close()
   169 
       
   170     def OnClear(self, event):
       
   171         self.list.DeleteAllItems()