root/trunk/RBPrivate/Prototypes/ChatClient/MainframeBuddyList.py

Revision 65, 6.2 kB (checked in by sholloway, 7 years ago)

Subject Observer Updates

Line 
1 #~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
2 #~ Imports
3 #~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
4
5 import weakref
6 from wxPython import wx
7 from Foundation.Skinning import SkinFile
8 from Foundation.SubjectObserver.Observer import Observer
9
10 #~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
11 #~ Definitions
12 #~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
13
14 class BuddyListEntryBase:
15     def __init__(self, ListOwner, JC):
16         self.JC = weakref.ref(JC)
17         self.ListOwner = weakref.ref(ListOwner)
18         self.winBuddyList = self.ListOwner().winBuddyList
19
20     def SetupDisplay(self):
21         self.idxBuddyList = self.ListOwner().AddBuddyEntry(self)
22         self.winBuddyList.InsertStringItem(self.idxBuddyList, '')
23         self.UpdateDisplay() # Call to Update Content
24
25     def UpdateDisplay(self):
26         pass
27
28     def OnItemRClick(self, evt):
29         print "Item Right Clicked", self.__class__.__name__
30        
31     def OnItemDblClick(self, evt):
32         print "Item Double Clicked", self.__class__.__name__
33
34 #~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
35
36 class JIDBuddyListEntry(BuddyListEntryBase):
37     def __init__(self, RosterItem, PresenceItem, ListOwner, JC):
38         BuddyListEntryBase.__init__(self, ListOwner, JC)
39         self.RosterItem = RosterItem
40         self.PresenceItem = PresenceItem
41
42     def UpdateDisplay(self):
43         # Get Data
44         if self.PresenceItem:
45             strJID = self.PresenceItem.from_
46             strPresence = self.PresenceItem.type
47             strName = getattr(self.RosterItem, 'name', strJID)
48         else:
49             strJID = self.RosterItem.jid
50             strName = getattr(self.RosterItem, 'name', strJID)
51             strPresence = "unavailable"
52        
53         # Set Data
54         self.winBuddyList.SetStringItem(self.idxBuddyList, 0, '   %s' % strName)
55         self.winBuddyList.SetStringItem(self.idxBuddyList, 1, strPresence)
56         self.winBuddyList.SetStringItem(self.idxBuddyList, 2, strJID)
57
58         # Set Colors
59         item = self.winBuddyList.GetItem(self.idxBuddyList)
60         if strPresence != "unavailable":
61             item.SetTextColour(wx.wxColour(0, 64, 128))
62         else:
63             item.SetTextColour(wx.wxColour(160, 128, 128))
64         self.winBuddyList.SetItem(item)
65    
66     def OnItemRClick(self, evt):
67         print "Item Right Clicked", self.__class__.__name__
68        
69     def OnItemDblClick(self, evt):
70         if self.PresenceItem: strJID = self.PresenceItem.from_
71         else: strJID = self.RosterItem.jid
72
73         skin = SkinFile('ChatFrame.skin', self.ListOwner().context._OwnerContext('application'), JC=self.JC, ChatJID=strJID, ChatType='chat')
74
75 #~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
76        
77 class JCBuddyListEntry(BuddyListEntryBase):
78     def __init__(self, ListOwner, AccountName, JC):
79         BuddyListEntryBase.__init__(self, ListOwner, JC)
80         self.AccountName = AccountName
81         self.JC().Roster.AddObserver(self.Update)
82         self.JC().PresenceCtr.Map.AddObserver(self.Update)
83
84     def Update(self, subject, **UpdateDict):
85         if 'Roster' in UpdateDict:
86             #print UpdateDict['Roster']
87             self.ListOwner().UpdateBuddyList()
88         elif 'PresenceFrom' in UpdateDict:
89             #print subject.Map[UpdateDict['PresenceFrom']]._toPrettyXML()
90             self.ListOwner().UpdateBuddyList()
91
92     def UpdateDisplay(self):
93         self.winBuddyList.SetStringItem(self.idxBuddyList, 0, self.AccountName)
94         item = self.winBuddyList.GetItem(self.idxBuddyList)
95         item.SetBackgroundColour(wx.wxColour(0, 64, 128))
96         item.SetTextColour(wx.wxColour(212, 212, 255))
97         self.winBuddyList.SetItem(item)
98        
99     def SetupDisplay(self):
100         BuddyListEntryBase.SetupDisplay(self)
101  
102         PresenceMap = self.JC().PresenceCtr.Map.ByResource
103         Roster = self.JC().Roster.ByJID
104         self.BuddyListEntries = []
105         for RosterItem in Roster.itervalues():
106             for PresenceItem in PresenceMap.get(RosterItem.jid, {'':None}).itervalues():
107                 self.BuddyListEntries.append(JIDBuddyListEntry(RosterItem, PresenceItem, self.ListOwner(), self.JC()))
108                 self.BuddyListEntries[-1].SetupDisplay()
109
110 #~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
111
112 class MainframeBuddyList:
113     def __init__(self, node):
114         self.context = node.context
115         self.winBuddyList = node.parent().object
116         self.Initialize()
117
118     def Initialize(self):
119         self.winBuddyList.SetBackgroundColour(wx.wxColour(224, 224, 224))
120         wx.EVT_LIST_ITEM_ACTIVATED(self.winBuddyList, self.winBuddyList.GetId(), self.OnItemDblClick)
121         wx.EVT_LIST_ITEM_RIGHT_CLICK(self.winBuddyList, self.winBuddyList.GetId(), self.OnItemRClick)
122
123         self.dictBuddyLists = {}
124         self.context.Model.AddObserver('JabberClients', self.Update)
125
126     def OnItemRClick(self, evt):
127         BuddyListEntry = self.BuddyListEntries.get(evt.GetIndex(), None)
128         if BuddyListEntry:
129             BuddyListEntry.OnItemRClick(evt)
130         else: evt.Skip()
131
132     def OnItemDblClick(self, evt):
133         BuddyListEntry = self.BuddyListEntries.get(evt.GetIndex(), None)
134         if BuddyListEntry:
135             BuddyListEntry.OnItemDblClick(evt)
136         else: evt.Skip()
137
138     def Update(self, subject, **UpdateDict):
139         if 'JabberClients' in UpdateDict:
140             JabberClients = UpdateDict['JabberClients']
141
142             if JabberClients:
143                 # Add new jabber clients
144                 for AccountName, JC in JabberClients.iteritems():
145                     if AccountName not in self.dictBuddyLists:
146                         self.dictBuddyLists[AccountName] = JCBuddyListEntry(self, AccountName, JC)
147             else:
148                 self.dictBuddyLists = {}
149
150     def AddBuddyEntry(self, BuddyEntry):
151         idx = self.winBuddyList.GetItemCount()
152         self.BuddyListEntries[idx] = BuddyEntry
153         return idx
154        
155     def UpdateBuddyList(self):
156         self.winBuddyList.DeleteAllItems()
157         self.BuddyListEntries = {}
158
159         for BuddyList in self.dictBuddyLists.itervalues():
160             BuddyList.SetupDisplay()
161
162         self.winBuddyList.SetColumnWidth(0, wx.wxLIST_AUTOSIZE)
163         self.winBuddyList.SetColumnWidth(1, wx.wxLIST_AUTOSIZE)
164         self.winBuddyList.SetColumnWidth(2, wx.wxLIST_AUTOSIZE)
Note: See TracBrowser for help on using the browser.