| OLD | NEW |
| (Empty) |
| 1 # Copyright (c) 2001-2004 Twisted Matrix Laboratories. | |
| 2 # See LICENSE for details. | |
| 3 | |
| 4 # | |
| 5 from twisted.words.im.basechat import ContactsList, Conversation, GroupConversat
ion,\ | |
| 6 ChatUI | |
| 7 from twisted.words.im.locals import OFFLINE, ONLINE, AWAY | |
| 8 | |
| 9 from java.awt import GridLayout, FlowLayout, BorderLayout, Container | |
| 10 import sys | |
| 11 from java.awt.event import ActionListener | |
| 12 from javax.swing import JTextField, JPasswordField, JComboBox, JPanel, JLabel,\ | |
| 13 JTextArea, JFrame, JButton, BoxLayout, JTable, JScrollPane, \ | |
| 14 ListSelectionModel | |
| 15 from javax.swing.table import DefaultTableModel | |
| 16 | |
| 17 doublebuffered = 0 | |
| 18 | |
| 19 | |
| 20 class UneditableTableModel(DefaultTableModel): | |
| 21 def isCellEditable(self, x, y): | |
| 22 return 0 | |
| 23 | |
| 24 class _AccountAdder: | |
| 25 def __init__(self, contactslist): | |
| 26 self.contactslist = contactslist | |
| 27 self.mainframe = JFrame("Add New Contact") | |
| 28 self.account = JComboBox(self.contactslist.clientsByName.keys()) | |
| 29 self.contactname = JTextField() | |
| 30 self.buildpane() | |
| 31 | |
| 32 def buildpane(self): | |
| 33 buttons = JPanel() | |
| 34 buttons.add(JButton("OK", actionPerformed=self.add)) | |
| 35 buttons.add(JButton("Cancel", actionPerformed=self.cancel)) | |
| 36 | |
| 37 acct = JPanel(GridLayout(1, 2), doublebuffered) | |
| 38 acct.add(JLabel("Account")) | |
| 39 acct.add(self.account) | |
| 40 | |
| 41 mainpane = self.mainframe.getContentPane() | |
| 42 mainpane.setLayout(BoxLayout(mainpane, BoxLayout.Y_AXIS)) | |
| 43 mainpane.add(self.contactname) | |
| 44 mainpane.add(acct) | |
| 45 mainpane.add(buttons) | |
| 46 self.mainframe.pack() | |
| 47 self.mainframe.show() | |
| 48 | |
| 49 #action listeners | |
| 50 def add(self, ae): | |
| 51 acct = self.contactslist.clientsByName[self.account.getSelectedItem()] | |
| 52 acct.addContact(self.contactname.getText()) | |
| 53 self.mainframe.dispose() | |
| 54 | |
| 55 def cancel(self, ae): | |
| 56 self.mainframe.dispose() | |
| 57 | |
| 58 class ContactsListGUI(ContactsList): | |
| 59 """A GUI object that displays a contacts list""" | |
| 60 def __init__(self, chatui): | |
| 61 ContactsList.__init__(self, chatui) | |
| 62 self.clientsByName = {} | |
| 63 self.mainframe = JFrame("Contacts List") | |
| 64 self.headers = ["Contact", "Status", "Idle", "Account"] | |
| 65 self.data = UneditableTableModel([], self.headers) | |
| 66 self.table = JTable(self.data, | |
| 67 columnSelectionAllowed = 0, #cannot select columns | |
| 68 selectionMode = ListSelectionModel.SINGLE_SELECTION) | |
| 69 | |
| 70 self.buildpane() | |
| 71 self.mainframe.pack() | |
| 72 self.mainframe.show() | |
| 73 | |
| 74 def setContactStatus(self, person): | |
| 75 ContactsList.setContactStatus(self, person) | |
| 76 self.update() | |
| 77 | |
| 78 def registerAccountClient(self, client): | |
| 79 ContactsList.registerAccountClient(self, client) | |
| 80 if not client.accountName in self.clientsByName.keys(): | |
| 81 self.clientsByName[client.accountName] = client | |
| 82 | |
| 83 def unregisterAccount(self, client): | |
| 84 ContactsList.unregisterAccountClient(self, client) | |
| 85 if client.accountName in self.clientsByName.keys(): | |
| 86 del self.clientsByName[client.accountName] | |
| 87 | |
| 88 def contactChangedNick(self, person, newnick): | |
| 89 ContactsList.contactChangedNick(self, person, newnick) | |
| 90 self.update() | |
| 91 | |
| 92 #GUI code | |
| 93 def buildpane(self): | |
| 94 buttons = JPanel(FlowLayout(), doublebuffered) | |
| 95 buttons.add(JButton("Send Message", actionPerformed=self.message)) | |
| 96 buttons.add(JButton("Add Contact", actionPerformed=self.addContact)) | |
| 97 #buttons.add(JButton("Quit", actionPerformed=self.quit)) | |
| 98 | |
| 99 mainpane = self.mainframe.getContentPane() | |
| 100 mainpane.setLayout(BoxLayout(mainpane, BoxLayout.Y_AXIS)) | |
| 101 mainpane.add(JScrollPane(self.table)) | |
| 102 mainpane.add(buttons) | |
| 103 self.update() | |
| 104 | |
| 105 def update(self): | |
| 106 contactdata = [] | |
| 107 for contact in self.onlineContacts.values(): | |
| 108 if contact.status == AWAY: | |
| 109 stat = "(away)" | |
| 110 else: | |
| 111 stat = "(active)" | |
| 112 contactdata.append([contact.name, stat, contact.getIdleTime(), | |
| 113 contact.client.accountName]) | |
| 114 self.data.setDataVector(contactdata, self.headers) | |
| 115 | |
| 116 #callable actionlisteners | |
| 117 def message(self, ae): | |
| 118 row = self.table.getSelectedRow() | |
| 119 if row < 0: | |
| 120 print "Trying to send IM to person, but no person selected" | |
| 121 else: | |
| 122 person = self.onlineContacts[self.data.getValueAt(row, 0)] | |
| 123 self.chat.getConversation(person) | |
| 124 | |
| 125 def addContact(self, ae): | |
| 126 _AccountAdder(self) | |
| 127 | |
| 128 def quit(self, ae): | |
| 129 sys.exit() | |
| 130 | |
| 131 | |
| 132 class ConversationWindow(Conversation): | |
| 133 """A GUI window of a conversation with a specific person""" | |
| 134 def __init__(self, person, chatui): | |
| 135 """ConversationWindow(basesupport.AbstractPerson:person)""" | |
| 136 Conversation.__init__(self, person, chatui) | |
| 137 self.mainframe = JFrame("Conversation with "+person.name) | |
| 138 self.display = JTextArea(columns=100, | |
| 139 rows=15, | |
| 140 editable=0, | |
| 141 lineWrap=1) | |
| 142 self.typepad = JTextField() | |
| 143 self.buildpane() | |
| 144 self.lentext = 0 | |
| 145 | |
| 146 def buildpane(self): | |
| 147 buttons = JPanel(doublebuffered) | |
| 148 buttons.add(JButton("Send", actionPerformed=self.send)) | |
| 149 buttons.add(JButton("Hide", actionPerformed=self.hidewindow)) | |
| 150 | |
| 151 mainpane = self.mainframe.getContentPane() | |
| 152 mainpane.setLayout(BoxLayout(mainpane, BoxLayout.Y_AXIS)) | |
| 153 mainpane.add(JScrollPane(self.display)) | |
| 154 self.typepad.actionPerformed = self.send | |
| 155 mainpane.add(self.typepad) | |
| 156 mainpane.add(buttons) | |
| 157 | |
| 158 def show(self): | |
| 159 self.mainframe.pack() | |
| 160 self.mainframe.show() | |
| 161 | |
| 162 def hide(self): | |
| 163 self.mainframe.hide() | |
| 164 | |
| 165 def sendText(self, text): | |
| 166 self.displayText("\n"+self.person.client.name+": "+text) | |
| 167 Conversation.sendText(self, text) | |
| 168 | |
| 169 def showMessage(self, text, metadata=None): | |
| 170 self.displayText("\n"+self.person.name+": "+text) | |
| 171 | |
| 172 def contactChangedNick(self, person, newnick): | |
| 173 Conversation.contactChangedNick(self, person, newnick) | |
| 174 self.mainframe.setTitle("Conversation with "+newnick) | |
| 175 | |
| 176 #GUI code | |
| 177 def displayText(self, text): | |
| 178 self.lentext = self.lentext + len(text) | |
| 179 self.display.append(text) | |
| 180 self.display.setCaretPosition(self.lentext) | |
| 181 | |
| 182 #actionlisteners | |
| 183 def hidewindow(self, ae): | |
| 184 self.hide() | |
| 185 | |
| 186 def send(self, ae): | |
| 187 text = self.typepad.getText() | |
| 188 self.typepad.setText("") | |
| 189 if text != "" and text != None: | |
| 190 self.sendText(text) | |
| 191 | |
| 192 | |
| 193 class GroupConversationWindow(GroupConversation): | |
| 194 """A GUI window of a conversation witha group of people""" | |
| 195 def __init__(self, group, chatui): | |
| 196 GroupConversation.__init__(self, group, chatui) | |
| 197 self.mainframe = JFrame(self.group.name) | |
| 198 self.headers = ["Member"] | |
| 199 self.memberdata = UneditableTableModel([], self.headers) | |
| 200 self.display = JTextArea(columns=100, rows=15, editable=0, lineWrap=1) | |
| 201 self.typepad = JTextField() | |
| 202 self.buildpane() | |
| 203 self.lentext = 0 | |
| 204 | |
| 205 def show(self): | |
| 206 self.mainframe.pack() | |
| 207 self.mainframe.show() | |
| 208 | |
| 209 def hide(self): | |
| 210 self.mainframe.hide() | |
| 211 | |
| 212 def showGroupMessage(self, sender, text, metadata=None): | |
| 213 self.displayText(sender + ": " + text) | |
| 214 | |
| 215 def setGroupMembers(self, members): | |
| 216 GroupConversation.setGroupMembers(self, members) | |
| 217 self.updatelist() | |
| 218 | |
| 219 def setTopic(self, topic, author): | |
| 220 topictext = "Topic: " + topic + ", set by " + author | |
| 221 self.mainframe.setTitle(self.group.name + ": " + topictext) | |
| 222 self.displayText(topictext) | |
| 223 | |
| 224 def memberJoined(self, member): | |
| 225 GroupConversation.memberJoined(self, member) | |
| 226 self.updatelist() | |
| 227 | |
| 228 def memberChangedNick(self, oldnick, newnick): | |
| 229 GroupConversation.memberChangedNick(self, oldnick, newnick) | |
| 230 self.updatelist() | |
| 231 | |
| 232 def memberLeft(self, member): | |
| 233 GroupConversation.memberLeft(self, member) | |
| 234 self.updatelist() | |
| 235 | |
| 236 #GUI code | |
| 237 def buildpane(self): | |
| 238 buttons = JPanel(doublebuffered) | |
| 239 buttons.add(JButton("Hide", actionPerformed=self.hidewindow)) | |
| 240 | |
| 241 memberpane = JTable(self.memberdata) | |
| 242 memberframe = JScrollPane(memberpane) | |
| 243 | |
| 244 chat = JPanel(doublebuffered) | |
| 245 chat.setLayout(BoxLayout(chat, BoxLayout.Y_AXIS)) | |
| 246 chat.add(JScrollPane(self.display)) | |
| 247 self.typepad.actionPerformed = self.send | |
| 248 chat.add(self.typepad) | |
| 249 chat.add(buttons) | |
| 250 | |
| 251 mainpane = self.mainframe.getContentPane() | |
| 252 mainpane.setLayout(BoxLayout(mainpane, BoxLayout.X_AXIS)) | |
| 253 mainpane.add(chat) | |
| 254 mainpane.add(memberframe) | |
| 255 | |
| 256 def displayText(self, text): | |
| 257 self.lentext = self.lentext + len(text) | |
| 258 self.display.append(text) | |
| 259 self.display.setCaretPosition(self.lentext) | |
| 260 | |
| 261 def updatelist(self): | |
| 262 self.memberdata.setDataVector([self.members], self.headers) | |
| 263 | |
| 264 #actionListener | |
| 265 def send(self, ae): | |
| 266 text = self.typepad.getText() | |
| 267 self.typepad.setText("") | |
| 268 if text != "" and text != None: | |
| 269 GroupConversation.sendText(self, text) | |
| 270 | |
| 271 def hidewindow(self, ae): | |
| 272 self.hide() | |
| 273 | |
| 274 class JyChatUI(ChatUI): | |
| 275 def __init__(self): | |
| 276 ChatUI.__init__(self) | |
| 277 self.contactsList = ContactsListGUI(self) | |
| 278 | |
| 279 def getConversation(self, person, stayHidden=0): | |
| 280 return ChatUI.getGroupConversation(self, person, ConversationWindow, | |
| 281 stayHidden) | |
| 282 | |
| 283 def getGroupConversation(self, group, stayHidden=0): | |
| 284 return ChatUI.getGroupConversation(self, group, | |
| 285 GroupConversationWindow, | |
| 286 stayHidden) | |
| OLD | NEW |