etisserant@203: #!/usr/bin/env python etisserant@203: # -*- coding: utf-8 -*- etisserant@203: etisserant@203: #This file is part of Beremiz, a Integrated Development Environment for etisserant@203: #programming IEC 61131-3 automates supporting plcopen standard and CanFestival. etisserant@203: # etisserant@203: #Copyright (C) 2007: Edouard TISSERANT and Laurent BESSARD etisserant@203: # etisserant@203: #See COPYING file for copyrights details. etisserant@203: # etisserant@203: #This library is free software; you can redistribute it and/or etisserant@203: #modify it under the terms of the GNU General Public etisserant@203: #License as published by the Free Software Foundation; either etisserant@203: #version 2.1 of the License, or (at your option) any later version. etisserant@203: # etisserant@203: #This library is distributed in the hope that it will be useful, etisserant@203: #but WITHOUT ANY WARRANTY; without even the implied warranty of etisserant@203: #MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU etisserant@203: #General Public License for more details. etisserant@203: # etisserant@203: #You should have received a copy of the GNU General Public etisserant@203: #License along with this library; if not, write to the Free Software etisserant@203: #Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA etisserant@203: etisserant@203: import wx etisserant@203: from Zeroconf import * etisserant@203: import socket etisserant@203: import wx.lib.mixins.listctrl as listmix etisserant@203: etisserant@203: class TestListCtrl(wx.ListCtrl, listmix.ListCtrlAutoWidthMixin): etisserant@203: def __init__(self, parent, ID, pos=wx.DefaultPosition, etisserant@203: size=wx.DefaultSize, style=0): etisserant@203: wx.ListCtrl.__init__(self, parent, ID, pos, size, style) etisserant@203: listmix.ListCtrlAutoWidthMixin.__init__(self) etisserant@203: etisserant@203: class DiscoveryDialog(wx.Dialog, listmix.ColumnSorterMixin): etisserant@203: def __init__(self, parent, id=-1, title='Service Discovery'): etisserant@203: self.my_result=None etisserant@203: self.itemDataMap = {} etisserant@203: wx.Dialog.__init__(self, parent, id, title, size=(600,600), style=wx.DEFAULT_DIALOG_STYLE) etisserant@203: etisserant@203: self.list = TestListCtrl(self, -1, etisserant@203: pos=(50,20), etisserant@203: size=(500,300), etisserant@203: style=wx.LC_REPORT etisserant@203: | wx.LC_EDIT_LABELS etisserant@203: | wx.LC_SORT_ASCENDING etisserant@203: ) etisserant@203: self.PopulateList() etisserant@203: etisserant@203: self.Bind(wx.EVT_LIST_ITEM_SELECTED, self.OnItemSelected, self.list) etisserant@203: self.Bind(wx.EVT_LIST_ITEM_DESELECTED, self.OnItemDeselected, self.list) etisserant@203: self.Bind(wx.EVT_LIST_ITEM_ACTIVATED, self.OnItemActivated, self.list) etisserant@203: self.Bind(wx.EVT_LIST_DELETE_ITEM, self.OnItemDelete, self.list) etisserant@203: self.Bind(wx.EVT_LIST_COL_CLICK, self.OnColClick, self.list) etisserant@203: self.list.Bind(wx.EVT_LEFT_DCLICK, self.OnDoubleClick) etisserant@203: etisserant@203: b = wx.Button(self,20, "Connect", (175, 500)) etisserant@203: self.Bind(wx.EVT_BUTTON, self.OnConnect, b) etisserant@203: b.SetSize(b.GetBestSize()) etisserant@203: etisserant@203: b = wx.Button(self, 40, "Cancel", (350, 500)) etisserant@203: self.Bind(wx.EVT_BUTTON, self.OnClose, b) etisserant@203: b.SetSize(b.GetBestSize()) etisserant@203: etisserant@203: #type = "_http._tcp.local." etisserant@203: type = "_PYRO._tcp.local." etisserant@203: self.r = Zeroconf() etisserant@203: browser = ServiceBrowser(self.r, type, self) etisserant@203: etisserant@203: listmix.ColumnSorterMixin.__init__(self, 4) etisserant@203: # Used by the ColumnSorterMixin, see wx/lib/mixins/listctrl.py etisserant@203: def GetListCtrl(self): etisserant@203: return self.list etisserant@203: etisserant@203: def PopulateList(self): etisserant@203: self.list.InsertColumn(0, 'NAME') etisserant@203: self.list.InsertColumn(1, 'TYPE') etisserant@203: self.list.InsertColumn(2, 'IP') etisserant@203: self.list.InsertColumn(3, 'PORT') etisserant@203: self.list.SetColumnWidth(0, 150) etisserant@203: self.list.SetColumnWidth(1, 150) etisserant@203: self.list.SetColumnWidth(2, 150) etisserant@203: self.list.SetColumnWidth(3, 150) etisserant@203: etisserant@203: def getColumnText(self, index, col): etisserant@203: item = self.list.GetItem(index, col) etisserant@203: return item.GetText() etisserant@203: etisserant@203: def OnItemSelected(self, event): etisserant@203: self.currentItem = event.m_itemIndex etisserant@203: print "OnItemSelected: %s, %s, %s, %s\n"%(self.currentItem, etisserant@203: self.list.GetItemText(self.currentItem), etisserant@203: self.getColumnText(self.currentItem, 1), etisserant@203: self.getColumnText(self.currentItem, 2)) etisserant@203: event.Skip() etisserant@203: etisserant@203: etisserant@203: def OnItemDeselected(self, evt): etisserant@203: item = evt.GetItem() etisserant@203: print "OnItemDeselected: %d" % evt.m_itemIndex etisserant@203: etisserant@203: def OnItemActivated(self, event): etisserant@203: self.currentItem = event.m_itemIndex etisserant@203: print "OnItemActivated: %s\nTopItem: %s" %(self.list.GetItemText(self.currentItem), self.list.GetTopItem()) etisserant@203: etisserant@203: def OnItemDelete(self, event): etisserant@203: print "OnItemDelete\n" etisserant@203: etisserant@203: def OnColClick(self, event): etisserant@203: print "OnColClick: %d\n" % event.GetColumn() etisserant@203: event.Skip() etisserant@203: etisserant@203: def OnColRightClick(self, event): etisserant@203: item = self.list.GetColumn(event.GetColumn()) etisserant@203: print "OnColRightClick: %d %s\n" %(event.GetColumn(), (item.GetText(), item.GetAlign(), etisserant@203: item.GetWidth(), item.GetImage())) etisserant@203: def OnDoubleClick(self, event): etisserant@203: connect_type = self.getColumnText(self.currentItem, 1) etisserant@203: connect_address = self.getColumnText(self.currentItem, 2) etisserant@203: connect_port = self.getColumnText(self.currentItem, 3) etisserant@203: etisserant@203: uri = self.CreateURI(connect_type, connect_address, connect_port) etisserant@203: self.my_result=uri etisserant@203: event.Skip() etisserant@203: etisserant@203: def GetResult(self): etisserant@203: return self.my_result etisserant@203: etisserant@203: def OnClick(self, event): etisserant@203: print "Click! (%d)\n" %event.GetId() etisserant@203: index = self.list.GetFocusedItem() etisserant@203: self.list.DeleteItem(index) etisserant@203: print "Service", name, "removed" etisserant@203: etisserant@203: def removeService(self, zeroconf, type, name): etisserant@203: index = self.list.GetFocusedItem() etisserant@203: etisserant@203: def addService(self, zeroconf, type, name): etisserant@203: info = self.r.getServiceInfo(type, name) etisserant@203: typename = type.split(".")[0][1:] etisserant@203: num_items = self.list.GetItemCount() etisserant@203: self.itemDataMap[num_items] = (name, "%s"%type, "%s"%str(socket.inet_ntoa(info.getAddress())), "%s"%info.getPort()) etisserant@203: self.list.InsertStringItem(num_items, name.split(".")[0]) etisserant@203: self.list.SetStringItem(num_items, 1, "%s"%typename) etisserant@203: self.list.SetStringItem(num_items, 2, "%s"%str(socket.inet_ntoa(info.getAddress()))) etisserant@203: self.list.SetStringItem(num_items, 3, "%s"%info.getPort()) etisserant@203: etisserant@203: def CreateURI(self, connect_type, connect_address, connect_port): etisserant@203: uri = "%s://%s:%s"%(connect_type, connect_address, connect_port) etisserant@203: print uri etisserant@203: return uri etisserant@203: etisserant@203: def OnAdd(self, event): etisserant@203: num_items = self.list.GetItemCount() etisserant@203: self.list.InsertStringItem(num_items, self.tc1.GetValue()) etisserant@203: self.list.SetStringItem(num_items, 1, self.tc2.GetValue()) etisserant@203: etisserant@203: def OnRemove(self, event): etisserant@203: index = self.list.GetFocusedItem() etisserant@203: self.list.DeleteItem(index) etisserant@203: etisserant@203: def OnConnect(self, event): etisserant@203: index = self.list.GetFocusedItem() etisserant@203: print self.list.GetItemData(index) etisserant@203: etisserant@203: def OnClose(self, event): etisserant@203: self.Close() etisserant@203: etisserant@203: def OnClear(self, event): etisserant@203: self.list.DeleteAllItems()