Changeset 61

Show
Ignore:
Timestamp:
03/13/02 22:23:38 (7 years ago)
Author:
sholloway
Message:

*** empty log message ***

Files:

Legend:

Unmodified
Added
Removed
Modified
Copied
Moved
  • trunk/RBJabber/RBJabber/Client.py

    r59 r61  
    139139            strXML += '<body>%s</body>'  % escape(body)  
    140140        strXML += '</message>' 
    141         self.SendXML(strXML) 
     141        return self.SendXML(strXML) 
    142142 
    143143    def Presence(self, toJID='', status='', show='', type='available'): 
     
    152152            strXML += '<status>%s</status>' % escape(status) 
    153153        strXML += '</presence>' 
    154         self.SendXML(strXML) 
     154        return self.SendXML(strXML) 
    155155 
    156156#~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 
  • trunk/RBJabber/RBJabber/JabberConnection.py

    r53 r61  
    6666    def SendXML(self, xmlData): 
    6767        self._sendData += xmlData 
     68        return xmlData 
    6869 
    6970    def Shutdown(self): 
  • trunk/RBPrivate/Prototypes/ChatClient/ChatFrame.skin

    r59 r61  
    44        <py:script contextvar='Mediator' module='ChatMediator' call='ChatMediator' /> 
    55        <layout sizerOption='1' sizerFlag='wxEXPAND'> 
    6             <text sizerOption='1' sizerFlag='wxEXPAND' style='wxTE_RICH | wxTE_MULTILINE | wxTE_READONLY | wxTE_AUTO_URL' > 
    7                 <py:obj_variable owner='Mediator' name='ChatOutput' /> 
    8             </text> 
     6            <notebook sizerOption='1' sizerFlag='wxEXPAND'> 
     7                <text pagename='Text' style='wxTE_RICH | wxTE_MULTILINE | wxTE_READONLY | wxTE_AUTO_URL' > 
     8                    <py:obj_variable owner='Mediator' name='ChatOutput' /> 
     9                </text> 
     10                <text pagename='XML' style='wxTE_RICH | wxTE_MULTILINE | wxTE_READONLY | wxTE_AUTO_URL' > 
     11                    <py:obj_variable owner='Mediator' name='XMLChatOutput' /> 
     12                </text> 
     13            </notebook> 
    914            <line size='5,5' sizerFlag='wxEXPAND'/> 
    1015            <layout sizerFlag='wxEXPAND'> 
  • trunk/RBPrivate/Prototypes/ChatClient/ChatMediator.py

    r60 r61  
    2727            strBodyText = ''.join([str(x) for x in getattr(message, 'body', [])]) 
    2828            self._AddOutputText(strFrom, strBodyText, 0) 
     29            self._AddOutputXML(''.join(message._toXML()), 0) 
    2930 
    3031    def Initialize(self): 
     
    5556        self.ChatInput.SetValue('') 
    5657        if strBodyText: 
    57             self.JC().Message(self._ChatJID, body=strBodyText, type=self._ChatType, xml='<thread>%s</thread>' % self._Thread) 
     58            xml = self.JC().Message(self._ChatJID, body=strBodyText, type=self._ChatType, xml='<thread>%s</thread>' % self._Thread) 
     59            self._AddOutputXML(xml, 1) 
    5860            self._AddOutputText(self.JC().information.username, strBodyText, 1) 
    5961 
    6062    def OnCloseFrame(self, evt): 
    6163        self.context.frame.Show(0) 
     64 
     65    def _AddOutputXML(self, xml, bStyleSet): 
     66        style = self.XMLChatOutput.GetDefaultStyle() 
     67        if bStyleSet: style.SetTextColour(wx.wxColour(0, 128, 64)) 
     68        else: style.SetTextColour(wx.wxColour(0, 64, 128)) 
     69        self.XMLChatOutput.SetDefaultStyle(style) 
     70        self.XMLChatOutput.AppendText('%s%s' % (xml, os.linesep)) 
    6271 
    6372    def _AddOutputText(self, strFrom, strBodyText, bStyleSet): 
  • trunk/RBPrivate/Prototypes/ChatClient/MainFrame.skin

    r56 r61  
    11<?xml version='1.0'?>  
    22<skin:skin xmlns:skin='http://namespaces.runeblade.com/skin' xmlns:py='http://namespaces.runeblade.com/xmlPython' xmlns='http://namespaces.runeblade.com/wxPythonSkin'> 
    3     <frame title='RuneBlade Chat Client' show='1'
     3    <frame title='RuneBlade Chat Client' show='1' style='wxCLIP_CHILDREN | wxDEFAULT_FRAME_STYLE'
    44        <py:script contextvar='Mediator' module='MainframeMediator' call='MainframeMediator' /> 
    55        <menu_bar> 
     
    3737        <layout sizerFit='1' sizerOption='1' sizerFlag='wxEXPAND'> 
    3838            <layout sizerOption='1' sizerFlag='wxEXPAND'> 
    39                 <notebook size='(200, 400)' sizerOption='1' sizerFlag='wxEXPAND'> 
     39                <notebook size='(200, 400)' style='wxCLIP_CHILDREN' sizerOption='1' sizerFlag='wxEXPAND'> 
    4040                    <column_list pagename='Buddy List' bgcolor='(250, 250, 255)' columns='"Contact", "Status", "JID"' > 
    4141                        <py:script module='MainframeBuddyList' call='MainframeBuddyList'> 
  • trunk/RBPrivate/Prototypes/ChatClient/MainframeBuddyList.py

    r59 r61  
    55import weakref 
    66from wxPython import wx 
     7from Foundation.Skinning import SkinFile 
    78 
    89#~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 
     
    1011#~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 
    1112 
    12 class BuddyList: 
    13     def __init__(self, Owner, JC): 
    14         self.Owner = weakref.ref(Owner) 
     13class BuddyListEntryBase: 
     14    def __init__(self, ListOwner, JC): 
    1515        self.JC = weakref.ref(JC) 
     16        self.ListOwner = weakref.ref(ListOwner) 
     17        self.winBuddyList = self.ListOwner().winBuddyList 
     18 
     19    def SetupDisplay(self): 
     20        self.idxBuddyList = self.ListOwner().AddBuddyEntry(self) 
     21        self.winBuddyList.InsertStringItem(self.idxBuddyList, '') 
     22        self.UpdateDisplay() # Call to Update Content 
     23 
     24    def UpdateDisplay(self): 
     25        pass 
     26 
     27    def OnItemRClick(self, evt): 
     28        print "Item Right Clicked", self.__class__.__name__ 
     29         
     30    def OnItemDblClick(self, evt): 
     31        print "Item Double Clicked", self.__class__.__name__ 
     32 
     33#~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 
     34 
     35class JIDBuddyListEntry(BuddyListEntryBase): 
     36    def __init__(self, RosterItem, PresenceItem, ListOwner, JC): 
     37        BuddyListEntryBase.__init__(self, ListOwner, JC) 
     38        self.RosterItem = RosterItem  
     39        self.PresenceItem = PresenceItem  
     40 
     41    def UpdateDisplay(self): 
     42        # Get Data 
     43        if self.PresenceItem:  
     44            strJID = self.PresenceItem.from_ 
     45            strPresence = self.PresenceItem.type 
     46            strName = getattr(self.RosterItem, 'name', strJID) 
     47        else:  
     48            strJID = self.RosterItem.jid 
     49            strName = getattr(self.RosterItem, 'name', strJID) 
     50            strPresence = "unavailable" 
     51         
     52        # Set Data 
     53        self.winBuddyList.SetStringItem(self.idxBuddyList, 0, '   %s' % strName) 
     54        self.winBuddyList.SetStringItem(self.idxBuddyList, 1, strPresence) 
     55        self.winBuddyList.SetStringItem(self.idxBuddyList, 2, strJID) 
     56 
     57        # Set Colors 
     58        item = self.winBuddyList.GetItem(self.idxBuddyList) 
     59        if strPresence != "unavailable":  
     60            item.SetTextColour(wx.wxColour(0, 64, 128)) 
     61        else:  
     62            item.SetTextColour(wx.wxColour(160, 128, 128)) 
     63        self.winBuddyList.SetItem(item) 
     64     
     65    def OnItemRClick(self, evt): 
     66        print "Item Right Clicked", self.__class__.__name__ 
     67         
     68    def OnItemDblClick(self, evt): 
     69        if self.PresenceItem: strJID = self.PresenceItem.from_ 
     70        else: strJID = self.RosterItem.jid 
     71 
     72        skin = SkinFile('ChatFrame.skin', self.ListOwner().context._OwnerContext('application'), JC=self.JC, ChatJID=strJID, ChatType='chat') 
     73 
     74#~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 
     75         
     76class JCBuddyListEntry(BuddyListEntryBase): 
     77    def __init__(self, ListOwner, AccountName, JC): 
     78        BuddyListEntryBase.__init__(self, ListOwner, JC) 
     79        self.AccountName = AccountName 
    1680        self.JC().Roster.AddObserver(self) 
    1781        self.JC().PresenceCtr.Map.AddObserver(self) 
     
    2084        if 'Roster' in UpdateDict: 
    2185            #print UpdateDict['Roster'] 
    22             self.Owner().UpdateBuddyList() 
     86            self.ListOwner().UpdateBuddyList() 
    2387        elif 'PresenceFrom' in UpdateDict: 
    2488            #print subject.Map[UpdateDict['PresenceFrom']]._toPrettyXML() 
    25             self.Owner().UpdateBuddyList() 
     89            self.ListOwner().UpdateBuddyList() 
    2690 
    27     def UpdateBuddyList(self, winList, idx): 
     91    def UpdateDisplay(self): 
     92        self.winBuddyList.SetStringItem(self.idxBuddyList, 0, self.AccountName) 
     93        item = self.winBuddyList.GetItem(self.idxBuddyList) 
     94        item.SetBackgroundColour(wx.wxColour(0, 64, 128)) 
     95        item.SetTextColour(wx.wxColour(212, 212, 255)) 
     96        self.winBuddyList.SetItem(item) 
     97         
     98    def SetupDisplay(self): 
     99        BuddyListEntryBase.SetupDisplay(self) 
     100  
    28101        PresenceMap = self.JC().PresenceCtr.Map.ByResource 
    29102        Roster = self.JC().Roster.ByJID 
    30         for each in Roster.itervalues(): 
    31             winList.InsertStringItem(idx, '   %s' % getattr(each, 'name', each.jid)) 
    32             if each.jid in PresenceMap: 
    33                 lstTypes = [x.type for x in PresenceMap[each.jid].itervalues() if x.type != "unavailable"] 
    34                 bAvailable = lstTypes and 1 or 0 
    35                 winList.SetStringItem(idx, 1, lstTypes and lstTypes[0] or "unavailable") 
    36             else:  
    37                 winList.SetStringItem(idx, 1, "unavailable") 
    38                 bAvailable = 0 
    39             winList.SetStringItem(idx, 2, each.jid) 
    40  
    41             item = winList.GetItem(idx) 
    42             if bAvailable:  
    43                 item.SetBackgroundColour(wx.wxColour(224, 224, 224)) 
    44                 item.SetTextColour(wx.wxColour(0, 64, 128)) 
    45             else:  
    46                 item.SetBackgroundColour(wx.wxColour(224, 224, 224)) 
    47                 item.SetTextColour(wx.wxColour(160, 128, 128)) 
    48             winList.SetItem(item) 
    49  
    50             idx += 1 
    51         return idx 
     103        self.BuddyListEntries = [] 
     104        for RosterItem in Roster.itervalues(): 
     105            for PresenceItem in PresenceMap.get(RosterItem.jid, {'':None}).itervalues(): 
     106                self.BuddyListEntries.append(JIDBuddyListEntry(RosterItem, PresenceItem, self.ListOwner(), self.JC())) 
     107                self.BuddyListEntries[-1].SetupDisplay() 
    52108 
    53109#~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 
     
    60116 
    61117    def Initialize(self): 
     118        self.winBuddyList.SetBackgroundColour(wx.wxColour(224, 224, 224)) 
     119        wx.EVT_LIST_ITEM_ACTIVATED(self.winBuddyList, self.winBuddyList.GetId(), self.OnItemDblClick) 
     120        wx.EVT_LIST_ITEM_RIGHT_CLICK(self.winBuddyList, self.winBuddyList.GetId(), self.OnItemRClick) 
     121 
    62122        self.dictBuddyLists = {} 
    63123        self.context.Model.AddObserver('JabberClients', self) 
     124 
     125    def OnItemRClick(self, evt): 
     126        BuddyListEntry = self.BuddyListEntries.get(evt.GetIndex(), None) 
     127        if BuddyListEntry: 
     128            BuddyListEntry.OnItemRClick(evt) 
     129        else: evt.Skip() 
     130 
     131    def OnItemDblClick(self, evt): 
     132        BuddyListEntry = self.BuddyListEntries.get(evt.GetIndex(), None) 
     133        if BuddyListEntry: 
     134            BuddyListEntry.OnItemDblClick(evt) 
     135        else: evt.Skip() 
    64136 
    65137    def Update(self, subject, UpdateDict): 
     
    71143                for AccountName, JC in JabberClients.iteritems(): 
    72144                    if AccountName not in self.dictBuddyLists: 
    73                         self.dictBuddyLists[AccountName] = BuddyList(self, JC) 
     145                        self.dictBuddyLists[AccountName] = JCBuddyListEntry(self, AccountName, JC) 
    74146            else: 
    75147                self.dictBuddyLists = {} 
    76148 
    77     def UpdateBuddyList(self, winList=None, idx=0): 
    78         winList = winList or self.winBuddyList 
    79         winList.DeleteAllItems() 
    80         for AccountName, BuddyList in self.dictBuddyLists.iteritems(): 
    81             winList.InsertStringItem(idx, AccountName) 
    82             item = winList.GetItem(idx) 
    83             item.SetBackgroundColour(wx.wxColour(0, 64, 128)) 
    84             item.SetTextColour(wx.wxColour(212, 212, 255)) 
    85             winList.SetItem(item) 
    86   
    87             idx = BuddyList.UpdateBuddyList(winList, idx+1) 
     149    def AddBuddyEntry(self, BuddyEntry): 
     150        idx = self.winBuddyList.GetItemCount() 
     151        self.BuddyListEntries[idx] = BuddyEntry 
     152        return idx 
     153         
     154    def UpdateBuddyList(self): 
     155        self.winBuddyList.DeleteAllItems() 
     156        self.BuddyListEntries = {} 
    88157 
    89         winList.SetColumnWidth(0, wx.wxLIST_AUTOSIZE) 
    90         winList.SetColumnWidth(1, wx.wxLIST_AUTOSIZE) 
    91         winList.SetColumnWidth(2, wx.wxLIST_AUTOSIZE) 
    92         return idx 
     158        for BuddyList in self.dictBuddyLists.itervalues(): 
     159            BuddyList.SetupDisplay() 
     160 
     161        self.winBuddyList.SetColumnWidth(0, wx.wxLIST_AUTOSIZE) 
     162        self.winBuddyList.SetColumnWidth(1, wx.wxLIST_AUTOSIZE) 
     163        self.winBuddyList.SetColumnWidth(2, wx.wxLIST_AUTOSIZE)