| Index: third_party/twisted_8_1/twisted/words/im/gtkchat.py | 
| diff --git a/third_party/twisted_8_1/twisted/words/im/gtkchat.py b/third_party/twisted_8_1/twisted/words/im/gtkchat.py | 
| deleted file mode 100644 | 
| index 9c1a426884b170c6db271851facc5b00dc0be8bc..0000000000000000000000000000000000000000 | 
| --- a/third_party/twisted_8_1/twisted/words/im/gtkchat.py | 
| +++ /dev/null | 
| @@ -1,413 +0,0 @@ | 
| -# Copyright (c) 2001-2004 Twisted Matrix Laboratories. | 
| -# See LICENSE for details. | 
| - | 
| - | 
| -import string | 
| -import time | 
| - | 
| -import gtk | 
| - | 
| -from twisted.words.im.gtkcommon import GLADE_FILE, autoConnectMethods, InputOutputWindow, openGlade | 
| - | 
| -class ContactsList: | 
| -    def __init__(self, chatui, xml): | 
| -        self.xml = xml# openGlade(GLADE_FILE, root="ContactsWidget") | 
| -        # self.widget = self.xml.get_widget("ContactsWidget") | 
| -        self.people = [] | 
| -        self.onlinePeople = [] | 
| -        self.countOnline = 0 | 
| -        autoConnectMethods(self) | 
| -        self.selectedPerson = None | 
| -        self.xml.get_widget("OnlineCount").set_text("Online: 0") | 
| -        self.chat = chatui | 
| - | 
| -        # Construct Menu for Account Selection | 
| -        self.optionMenu = self.xml.get_widget("AccountsListPopup") | 
| -        self.accountMenuItems = [] | 
| -        self.currentAccount = None | 
| - | 
| - | 
| -    def registerAccountClient(self, account): | 
| -        print 'registering account client', self, account | 
| -        self.accountMenuItems.append(account) | 
| -        self._updateAccountMenu() | 
| -        self.chat._accountmanager.refreshAccounts() | 
| - | 
| -    def _updateAccountMenu(self): | 
| -        # This seems to be necessary -- I don't understand gtk's handling of | 
| -        # GtkOptionMenus | 
| -        print 'updating account menu', self.accountMenuItems | 
| -        self.accountMenu = gtk.GtkMenu() | 
| -        for account in self.accountMenuItems: | 
| -            i = gtk.GtkMenuItem(account.accountName) | 
| -            i.connect('activate', self.on_AccountsListPopup_activate, account) | 
| -            self.accountMenu.append(i) | 
| -        if self.accountMenuItems: | 
| -            print "setting default account to", self.accountMenuItems[0] | 
| -            self.currentAccount = self.accountMenuItems[0] | 
| -        self.accountMenu.show_all() | 
| -        self.optionMenu.set_menu(self.accountMenu) | 
| - | 
| -    def on_AccountsListPopup_activate(self, w, account): | 
| -        print 'setting current account', account | 
| -        self.currentAccount = account | 
| - | 
| -    def on_AddContactButton_clicked(self, b): | 
| -        self.currentAccount.addContact( | 
| -            self.xml.get_widget("ContactNameEntry").get_text()) | 
| - | 
| -    def unregisterAccountClient(self,account): | 
| -        print 'unregistering account client', self, account | 
| -        self.accountMenuItems.remove(account) | 
| -        self._updateAccountMenu() | 
| - | 
| -    def setContactStatus(self, person): | 
| -        if person not in self.people: | 
| -            self.people.append(person) | 
| -        self.refreshContactsLists() | 
| - | 
| -    def on_OnlineContactsTree_select_row(self, w, row, column, event): | 
| -        self.selectedPerson = self.onlinePeople[row] | 
| -        entry = self.xml.get_widget("ContactNameEntry") | 
| -        entry.set_text(self.selectedPerson.name) | 
| -        self.currentAccount = self.selectedPerson.account.client | 
| -        idx = self.accountMenuItems.index(self.currentAccount) | 
| -        self.accountMenu.set_active(idx) | 
| -        self.optionMenu.remove_menu() | 
| -        self.optionMenu.set_menu(self.accountMenu) | 
| - | 
| -    def on_PlainSendIM_clicked(self, b): | 
| -        self.chat.getConversation( | 
| -            self.currentAccount.getPerson( | 
| -            self.xml.get_widget("ContactNameEntry").get_text())) | 
| -##         if self.selectedPerson: | 
| -##             c = self.chat.getConversation(self.selectedPerson) | 
| - | 
| -    def on_PlainJoinChat_clicked(self, b): | 
| -        ## GroupJoinWindow(self.chat) | 
| -        name = self.xml.get_widget("ContactNameEntry").get_text() | 
| -        self.currentAccount.joinGroup(name) | 
| - | 
| -    def refreshContactsLists(self): | 
| -        # HIDEOUSLY inefficient | 
| -        online = self.xml.get_widget("OnlineContactsTree") | 
| -        offline = self.xml.get_widget("OfflineContactsList") | 
| -        online.freeze() | 
| -        offline.freeze() | 
| -        online.clear() | 
| -        offline.clear() | 
| -        self.countOnline = 0 | 
| -        self.onlinePeople = [] | 
| -        self.people.sort(lambda x, y: cmp(x.name, y.name)) | 
| -        for person in self.people: | 
| -            if person.isOnline(): | 
| -                self.onlinePeople.append(person) | 
| -                online.append([person.name, str(person.getStatus()), | 
| -                               person.getIdleTime(), | 
| -                               person.account.accountName]) | 
| -                self.countOnline = self.countOnline + 1 | 
| -            offline.append([person.name, person.account.accountName, | 
| -                            'Aliasing Not Implemented', 'Groups Not Implemented']) | 
| -        self.xml.get_widget("OnlineCount").set_text("Online: %d" % self.countOnline) | 
| -        online.thaw() | 
| -        offline.thaw() | 
| - | 
| - | 
| - | 
| -def colorhash(name): | 
| -    h = hash(name) | 
| -    l = [0x5555ff, | 
| -         0x55aa55, | 
| -         0x55aaff, | 
| -         0xff5555, | 
| -         0xff55ff, | 
| -         0xffaa55] | 
| -    index = l[h % len(l)] | 
| -    return '%06.x' % (abs(hash(name)) & index) | 
| - | 
| - | 
| -def _msgDisplay(output, name, text, color, isEmote): | 
| -    text = string.replace(text, '\n', '\n\t') | 
| -    ins = output.insert | 
| -    ins(None, color, None, "[ %s ] " % time.strftime("%H:%M:%S")) | 
| -    if isEmote: | 
| -        ins(None, color, None, "* %s " % name) | 
| -        ins(None, None, None, "%s\n" % text) | 
| -    else: | 
| -        ins(None, color, None, "<%s> " % name) | 
| -        ins(None, None, None, "%s\n" % text) | 
| - | 
| - | 
| -class Conversation(InputOutputWindow): | 
| -    """GUI representation of a conversation. | 
| -    """ | 
| -    def __init__(self, person): | 
| -        InputOutputWindow.__init__(self, | 
| -                                   "ConversationWidget", | 
| -                                   "ConversationMessageEntry", | 
| -                                   "ConversationOutput") | 
| -        self.person = person | 
| -        alloc_color = self.output.get_colormap().alloc | 
| -        self.personColor = alloc_color("#%s" % colorhash(person.name)) | 
| -        self.myColor = alloc_color("#0000ff") | 
| -        print "allocated my color %s and person color %s" % ( | 
| -            self.myColor, self.personColor) | 
| - | 
| -    def getTitle(self): | 
| -        return "Conversation - %s (%s)" % (self.person.name, | 
| -                                           self.person.account.accountName) | 
| - | 
| -    # Chat Interface Implementation | 
| - | 
| -    def sendText(self, text): | 
| -        metadata = None | 
| -        if text[:4] == "/me ": | 
| -            text = text[4:] | 
| -            metadata = {"style": "emote"} | 
| -        self.person.sendMessage(text, metadata).addCallback(self._cbTextSent, text, metadata) | 
| - | 
| -    def showMessage(self, text, metadata=None): | 
| -        _msgDisplay(self.output, self.person.name, text, self.personColor, | 
| -                    (metadata and metadata.get("style", None) == "emote")) | 
| - | 
| -    # Internal | 
| - | 
| -    def _cbTextSent(self, result, text, metadata=None): | 
| -        _msgDisplay(self.output, self.person.account.client.name, | 
| -                    text, self.myColor, | 
| -                    (metadata and metadata.get("style", None) == "emote")) | 
| - | 
| -class GroupConversation(InputOutputWindow): | 
| -    def __init__(self, group): | 
| -        InputOutputWindow.__init__(self, | 
| -                                   "GroupChatBox", | 
| -                                   "GroupInput", | 
| -                                   "GroupOutput") | 
| -        self.group = group | 
| -        self.members = [] | 
| -        self.membersHidden = 0 | 
| -        self._colorcache = {} | 
| -        alloc_color = self.output.get_colormap().alloc | 
| -        self.myColor = alloc_color("#0000ff") | 
| -        # TODO: we shouldn't be getting group conversations randomly without | 
| -        # names, but irc autojoin appears broken. | 
| -        self.xml.get_widget("NickLabel").set_text( | 
| -            getattr(self.group.account.client,"name","(no name)")) | 
| -        participantList = self.xml.get_widget("ParticipantList") | 
| -        groupBox = self.xml.get_widget("GroupActionsBox") | 
| -        for method in group.getGroupCommands(): | 
| -            b = gtk.GtkButton(method.__name__) | 
| -            b.connect("clicked", self._doGroupAction, method) | 
| -            groupBox.add(b) | 
| -        self.setTopic("No Topic Yet", "No Topic Author Yet") | 
| - | 
| -    # GTK Event Handlers | 
| - | 
| -    def on_HideButton_clicked(self, b): | 
| -        self.membersHidden = not self.membersHidden | 
| -        self.xml.get_widget("GroupHPaned").set_position(self.membersHidden and -1 or 20000) | 
| - | 
| -    def on_LeaveButton_clicked(self, b): | 
| -        self.win.destroy() | 
| -        self.group.leave() | 
| - | 
| -    def on_AddContactButton_clicked(self, b): | 
| -        lw = self.xml.get_widget("ParticipantList") | 
| - | 
| -        if lw.selection: | 
| -            self.group.client.addContact(self.members[lw.selection[0]]) | 
| - | 
| -    def on_TopicEntry_focus_out_event(self, w, e): | 
| -        self.xml.get_widget("TopicEntry").set_text(self._topic) | 
| - | 
| -    def on_TopicEntry_activate(self, e): | 
| -        print "ACTIVATING TOPIC!!" | 
| -        self.group.setTopic(e.get_text()) | 
| -        # self.xml.get_widget("TopicEntry").set_editable(0) | 
| -        self.xml.get_widget("GroupInput").grab_focus() | 
| - | 
| -    def on_ParticipantList_unselect_row(self, w, row, column, event): | 
| -        print 'row unselected' | 
| -        personBox = self.xml.get_widget("PersonActionsBox") | 
| -        for child in personBox.children(): | 
| -            personBox.remove(child) | 
| - | 
| -    def on_ParticipantList_select_row(self, w, row, column, event): | 
| -        self.selectedPerson = self.group.account.client.getPerson(self.members[row]) | 
| -        print 'selected', self.selectedPerson | 
| -        personBox = self.xml.get_widget("PersonActionsBox") | 
| -        personFrame = self.xml.get_widget("PersonFrame") | 
| -        # clear out old buttons | 
| -        for child in personBox.children(): | 
| -            personBox.remove(child) | 
| -        personFrame.set_label("Person: %s" % self.selectedPerson.name) | 
| -        for method in self.selectedPerson.getPersonCommands(): | 
| -            b = gtk.GtkButton(method.__name__) | 
| -            b.connect("clicked", self._doPersonAction, method) | 
| -            personBox.add(b) | 
| -            b.show() | 
| -        for method in self.group.getTargetCommands(self.selectedPerson): | 
| -            b = gtk.GtkButton(method.__name__) | 
| -            b.connect("clicked", self._doTargetAction, method, | 
| -                      self.selectedPerson) | 
| -            personBox.add(b) | 
| -            b.show() | 
| - | 
| -    def _doGroupAction(self, evt, method): | 
| -        method() | 
| - | 
| -    def _doPersonAction(self, evt, method): | 
| -        method() | 
| - | 
| -    def _doTargetAction(self, evt, method, person): | 
| -        method(person) | 
| - | 
| -    def hidden(self, w): | 
| -        InputOutputWindow.hidden(self, w) | 
| -        self.group.leave() | 
| - | 
| -    def getTitle(self): | 
| -        return "Group Conversation - " + self.group.name | 
| - | 
| -    # Chat Interface Implementation | 
| -    def sendText(self, text): | 
| -        metadata = None | 
| -        if text[:4] == "/me ": | 
| -            text = text[4:] | 
| -            metadata = {"style": "emote"} | 
| -        self.group.sendGroupMessage(text, metadata).addCallback(self._cbTextSent, text, metadata=metadata) | 
| - | 
| -    def showGroupMessage(self, sender, text, metadata=None): | 
| -        _msgDisplay(self.output, sender, text, self._cacheColorHash(sender), | 
| -                    (metadata and metadata.get("style", None) == "emote")) | 
| - | 
| - | 
| -    def setGroupMembers(self, members): | 
| -        self.members = members | 
| -        self.refreshMemberList() | 
| - | 
| -    def setTopic(self, topic, author): | 
| -        self._topic = topic | 
| -        self._topicAuthor = author | 
| -        self.xml.get_widget("TopicEntry").set_text(topic) | 
| -        self.xml.get_widget("AuthorLabel").set_text(author) | 
| - | 
| -    def memberJoined(self, member): | 
| -        self.members.append(member) | 
| -        self.output.insert_defaults("> %s joined <\n" % member) | 
| -        self.refreshMemberList() | 
| - | 
| -    def memberChangedNick(self, member, newnick): | 
| -        self.members.remove(member) | 
| -        self.members.append(newnick) | 
| -        self.output.insert_defaults("> %s becomes %s <\n" % (member, newnick)) | 
| -        self.refreshMemberList() | 
| - | 
| -    def memberLeft(self, member): | 
| -        self.members.remove(member) | 
| -        self.output.insert_defaults("> %s left <\n" % member) | 
| -        self.refreshMemberList() | 
| - | 
| - | 
| - | 
| -    # Tab Completion | 
| - | 
| -    def tabComplete(self, word): | 
| -        """InputOutputWindow calls me when tab is pressed.""" | 
| -        if not word: | 
| -            return [] | 
| -        potentialMatches = [] | 
| -        for nick in self.members: | 
| -            if string.lower(nick[:len(word)]) == string.lower(word): | 
| -                potentialMatches.append(nick + ": ") #colon is a nick-specific thing | 
| -        return potentialMatches | 
| - | 
| -    # Internal | 
| - | 
| -    def _cbTextSent(self, result, text, metadata=None): | 
| -        _msgDisplay(self.output, self.group.account.client.name, | 
| -                    text, self.myColor, | 
| -                    (metadata and metadata.get("style", None) == "emote")) | 
| - | 
| -    def refreshMemberList(self): | 
| -        pl = self.xml.get_widget("ParticipantList") | 
| -        pl.freeze() | 
| -        pl.clear() | 
| -        self.members.sort(lambda x,y: cmp(string.lower(x), string.lower(y))) | 
| -        for member in self.members: | 
| -            pl.append([member]) | 
| -        pl.thaw() | 
| - | 
| -    def _cacheColorHash(self, name): | 
| -        if self._colorcache.has_key(name): | 
| -            return self._colorcache[name] | 
| -        else: | 
| -            alloc_color = self.output.get_colormap().alloc | 
| -            c = alloc_color('#%s' % colorhash(name)) | 
| -            self._colorcache[name] = c | 
| -            return c | 
| - | 
| - | 
| - | 
| - | 
| -class GtkChatClientUI: | 
| -    def __init__(self,xml): | 
| -        self.conversations = {}         # cache of all direct windows | 
| -        self.groupConversations = {}    # cache of all group windows | 
| -        self.personCache = {}           # keys are (name, account) | 
| -        self.groupCache = {}            # cache of all groups | 
| -        self.theContactsList = ContactsList(self,xml) | 
| -        self.onlineAccounts = []     # list of message sources currently online | 
| - | 
| -    def registerAccountClient(self,account): | 
| -        print 'registering account client' | 
| -        self.onlineAccounts.append(account) | 
| -        self.getContactsList().registerAccountClient(account) | 
| - | 
| -    def unregisterAccountClient(self,account): | 
| -        print 'unregistering account client' | 
| -        self.onlineAccounts.remove(account) | 
| -        self.getContactsList().unregisterAccountClient(account) | 
| - | 
| -    def contactsListClose(self, w, evt): | 
| -        return gtk.TRUE | 
| - | 
| -    def getContactsList(self): | 
| -        return self.theContactsList | 
| - | 
| -    def getConversation(self, person): | 
| -        conv = self.conversations.get(person) | 
| -        if not conv: | 
| -            conv = Conversation(person) | 
| -            self.conversations[person] = conv | 
| -        conv.show() | 
| -        return conv | 
| - | 
| -    def getGroupConversation(self, group, stayHidden=0): | 
| -        conv = self.groupConversations.get(group) | 
| -        if not conv: | 
| -            conv = GroupConversation(group) | 
| -            self.groupConversations[group] = conv | 
| -        if not stayHidden: | 
| -            conv.show() | 
| -        else: | 
| -            conv.hide() | 
| -        return conv | 
| - | 
| -    # ??? Why doesn't this inherit the basechat.ChatUI implementation? | 
| - | 
| -    def getPerson(self, name, client): | 
| -        account = client.account | 
| -        p = self.personCache.get((name, account)) | 
| -        if not p: | 
| -            p = account.getPerson(name) | 
| -            self.personCache[name, account] = p | 
| -        return p | 
| - | 
| -    def getGroup(self, name, client): | 
| -        account = client.account | 
| -        g = self.groupCache.get((name, account)) | 
| -        if g is None: | 
| -            g = account.getGroup(name) | 
| -            self.groupCache[name, account] = g | 
| -        return g | 
|  |