| 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) |
|---|