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 |