1
# Copyright (c) 2001-2004 Twisted Matrix Laboratories.
2
# See LICENSE for details.
5
from twisted.words.im.basechat import ContactsList, Conversation, GroupConversation,\
7
from twisted.words.im.locals import OFFLINE, ONLINE, AWAY
9
from java.awt import GridLayout, FlowLayout, BorderLayout, Container
11
from java.awt.event import ActionListener
12
from javax.swing import JTextField, JPasswordField, JComboBox, JPanel, JLabel,\
13
JTextArea, JFrame, JButton, BoxLayout, JTable, JScrollPane, \
15
from javax.swing.table import DefaultTableModel
20
class UneditableTableModel(DefaultTableModel):
21
def isCellEditable(self, x, y):
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()
34
buttons.add(JButton("OK", actionPerformed=self.add))
35
buttons.add(JButton("Cancel", actionPerformed=self.cancel))
37
acct = JPanel(GridLayout(1, 2), doublebuffered)
38
acct.add(JLabel("Account"))
39
acct.add(self.account)
41
mainpane = self.mainframe.getContentPane()
42
mainpane.setLayout(BoxLayout(mainpane, BoxLayout.Y_AXIS))
43
mainpane.add(self.contactname)
51
acct = self.contactslist.clientsByName[self.account.getSelectedItem()]
52
acct.addContact(self.contactname.getText())
53
self.mainframe.dispose()
56
self.mainframe.dispose()
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)
74
def setContactStatus(self, person):
75
ContactsList.setContactStatus(self, person)
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
83
def unregisterAccount(self, client):
84
ContactsList.unregisterAccountClient(self, client)
85
if client.accountName in self.clientsByName.keys():
86
del self.clientsByName[client.accountName]
88
def contactChangedNick(self, person, newnick):
89
ContactsList.contactChangedNick(self, person, newnick)
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))
99
mainpane = self.mainframe.getContentPane()
100
mainpane.setLayout(BoxLayout(mainpane, BoxLayout.Y_AXIS))
101
mainpane.add(JScrollPane(self.table))
102
mainpane.add(buttons)
107
for contact in self.onlineContacts.values():
108
if contact.status == AWAY:
112
contactdata.append([contact.name, stat, contact.getIdleTime(),
113
contact.client.accountName])
114
self.data.setDataVector(contactdata, self.headers)
116
#callable actionlisteners
117
def message(self, ae):
118
row = self.table.getSelectedRow()
120
print "Trying to send IM to person, but no person selected"
122
person = self.onlineContacts[self.data.getValueAt(row, 0)]
123
self.chat.getConversation(person)
125
def addContact(self, ae):
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,
142
self.typepad = JTextField()
147
buttons = JPanel(doublebuffered)
148
buttons.add(JButton("Send", actionPerformed=self.send))
149
buttons.add(JButton("Hide", actionPerformed=self.hidewindow))
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)
159
self.mainframe.pack()
160
self.mainframe.show()
163
self.mainframe.hide()
165
def sendText(self, text):
166
self.displayText("\n"+self.person.client.name+": "+text)
167
Conversation.sendText(self, text)
169
def showMessage(self, text, metadata=None):
170
self.displayText("\n"+self.person.name+": "+text)
172
def contactChangedNick(self, person, newnick):
173
Conversation.contactChangedNick(self, person, newnick)
174
self.mainframe.setTitle("Conversation with "+newnick)
177
def displayText(self, text):
178
self.lentext = self.lentext + len(text)
179
self.display.append(text)
180
self.display.setCaretPosition(self.lentext)
183
def hidewindow(self, ae):
187
text = self.typepad.getText()
188
self.typepad.setText("")
189
if text != "" and text != None:
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()
206
self.mainframe.pack()
207
self.mainframe.show()
210
self.mainframe.hide()
212
def showGroupMessage(self, sender, text, metadata=None):
213
self.displayText(sender + ": " + text)
215
def setGroupMembers(self, members):
216
GroupConversation.setGroupMembers(self, members)
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)
224
def memberJoined(self, member):
225
GroupConversation.memberJoined(self, member)
228
def memberChangedNick(self, oldnick, newnick):
229
GroupConversation.memberChangedNick(self, oldnick, newnick)
232
def memberLeft(self, member):
233
GroupConversation.memberLeft(self, member)
238
buttons = JPanel(doublebuffered)
239
buttons.add(JButton("Hide", actionPerformed=self.hidewindow))
241
memberpane = JTable(self.memberdata)
242
memberframe = JScrollPane(memberpane)
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)
251
mainpane = self.mainframe.getContentPane()
252
mainpane.setLayout(BoxLayout(mainpane, BoxLayout.X_AXIS))
254
mainpane.add(memberframe)
256
def displayText(self, text):
257
self.lentext = self.lentext + len(text)
258
self.display.append(text)
259
self.display.setCaretPosition(self.lentext)
261
def updatelist(self):
262
self.memberdata.setDataVector([self.members], self.headers)
266
text = self.typepad.getText()
267
self.typepad.setText("")
268
if text != "" and text != None:
269
GroupConversation.sendText(self, text)
271
def hidewindow(self, ae):
274
class JyChatUI(ChatUI):
276
ChatUI.__init__(self)
277
self.contactsList = ContactsListGUI(self)
279
def getConversation(self, person, stayHidden=0):
280
return ChatUI.getGroupConversation(self, person, ConversationWindow,
283
def getGroupConversation(self, group, stayHidden=0):
284
return ChatUI.getGroupConversation(self, group,
285
GroupConversationWindow,