OLD | NEW |
| (Empty) |
1 # Copyright (c) 2001-2004 Twisted Matrix Laboratories. | |
2 # See LICENSE for details. | |
3 | |
4 | |
5 try: | |
6 import cPickle as pickle | |
7 except ImportError: | |
8 import pickle | |
9 | |
10 import gtk | |
11 | |
12 from twisted.words.im.gtkcommon import GLADE_FILE, SETTINGS_FILE, autoConnectMet
hods,\ | |
13 openGlade | |
14 | |
15 from twisted.words.im import gtkchat | |
16 | |
17 ### This generic stuff uses the word "account" in a very different way -- chat | |
18 ### accounts are potential sources of messages, InstanceMessenger accounts are | |
19 ### individual network connections. | |
20 | |
21 class AccountManager: | |
22 def __init__(self): | |
23 self.xml = openGlade(GLADE_FILE, root="MainIMWindow") | |
24 self.chatui = gtkchat.GtkChatClientUI(self.xml) | |
25 self.chatui._accountmanager = self # TODO: clean this up... it's used in
gtkchat | |
26 print self.xml._o | |
27 autoConnectMethods(self, self.chatui.theContactsList) | |
28 self.widget = self.xml.get_widget("AccountManWidget") | |
29 self.widget.show_all() | |
30 try: | |
31 f = open(SETTINGS_FILE) | |
32 self.accounts = pickle.load(f) | |
33 print 'loaded!' | |
34 self.refreshAccounts() | |
35 except IOError: | |
36 self.accounts = [] | |
37 print 'initialized!' | |
38 | |
39 def on_ConsoleButton_clicked(self, b): | |
40 #### For debugging purposes... | |
41 from twisted.manhole.ui.pywidgets import LocalInteraction | |
42 l = LocalInteraction() | |
43 l.localNS['chat'] = self.chatui | |
44 l.show_all() | |
45 | |
46 def created(self, acct): | |
47 self.accounts.append(acct) | |
48 self.refreshAccounts() | |
49 | |
50 def refreshAccounts(self): | |
51 w = self.xml.get_widget("accountsList") | |
52 w.clear() | |
53 for acct in self.accounts: | |
54 l = [acct.accountName, acct.isOnline() and 'yes' or 'no', | |
55 acct.autoLogin and 'yes' or 'no', acct.gatewayType] | |
56 w.append(l) | |
57 | |
58 def lockNewAccount(self, b): | |
59 self.xml.get_widget("NewAccountButton").set_sensitive(not b) | |
60 | |
61 def on_NewAccountButton_clicked(self, b): | |
62 NewAccount(self) | |
63 | |
64 def on_MainIMWindow_destroy(self, w): | |
65 print 'Saving...' | |
66 pickle.dump(self.accounts, open(SETTINGS_FILE,'wb')) | |
67 print 'Saved.' | |
68 gtk.mainquit() | |
69 | |
70 | |
71 def on_DeleteAccountButton_clicked(self, b): | |
72 lw = self.xml.get_widget("accountsList") | |
73 if lw.selection: | |
74 del self.accounts[lw.selection[0]] | |
75 self.refreshAccounts() | |
76 | |
77 def on_LogOnButton_clicked(self, b): | |
78 lw = self.xml.get_widget("accountsList") | |
79 if lw.selection: | |
80 self.accounts[lw.selection[0]].logOn(self.chatui) | |
81 | |
82 | |
83 class DummyAccountForm: | |
84 def __init__(self, manager): | |
85 self.widget = gtk.GtkButton("HELLO") | |
86 | |
87 def create(self, sname, autoLogin): | |
88 return None | |
89 | |
90 | |
91 class NewAccount: | |
92 def __init__(self, manager): | |
93 self.manager = manager | |
94 self.manager.lockNewAccount(1) | |
95 self.xml = openGlade(GLADE_FILE, root="NewAccountWindow") | |
96 autoConnectMethods(self) | |
97 self.widget = self.xml.get_widget("NewAccountWindow") | |
98 self.frame = self.xml.get_widget("GatewayFrame") | |
99 # Making up for a deficiency in glade. | |
100 widgetMenu = self.xml.get_widget("GatewayOptionMenu") | |
101 m = gtk.GtkMenu() | |
102 activ = 0 | |
103 self.currentGateway = None | |
104 for name, klas in registeredTypes: | |
105 i = gtk.GtkMenuItem(name) | |
106 m.append(i) | |
107 k = klas(self.manager) | |
108 i.connect("activate", self.gatewaySelected, k) | |
109 if not activ: | |
110 activ = 1 | |
111 self.gatewaySelected(None, k) | |
112 widgetMenu.set_menu(m) | |
113 self.widget.show_all() | |
114 | |
115 def gatewaySelected(self, ig, k): | |
116 if self.currentGateway: | |
117 self.frame.remove(self.currentGateway.widget) | |
118 self.currentGateway = k | |
119 self.frame.add(k.widget) | |
120 k.widget.show_all() | |
121 | |
122 def createAccount(self, b): | |
123 autoLogin = self.xml.get_widget("AutoLogin").get_active() | |
124 accountName = self.xml.get_widget("accountName").get_text() | |
125 x = self.currentGateway.create(accountName, autoLogin) | |
126 if x: | |
127 self.manager.created(x) | |
128 self.destroyMe() | |
129 | |
130 def destroyMe(self, b=None): | |
131 self.widget.destroy() | |
132 | |
133 def on_NewAccountWindow_destroy(self, w): | |
134 self.manager.lockNewAccount(0) | |
135 | |
136 from twisted.words.im.pbsupport import PBAccount | |
137 from twisted.words.im.tocsupport import TOCAccount | |
138 from twisted.words.im.ircsupport import IRCAccount | |
139 | |
140 | |
141 class PBAccountForm: | |
142 def __init__(self, manager): | |
143 self.manager = manager | |
144 self.xml = openGlade(GLADE_FILE, root="PBAccountWidget") | |
145 autoConnectMethods(self) | |
146 self.widget = self.xml.get_widget("PBAccountWidget") | |
147 self.on_serviceType_changed() | |
148 self.selectedRow = None | |
149 | |
150 def addPerspective(self, b): | |
151 stype = self.xml.get_widget("serviceType").get_text() | |
152 sname = self.xml.get_widget("serviceName").get_text() | |
153 pname = self.xml.get_widget("perspectiveName").get_text() | |
154 self.xml.get_widget("serviceList").append([stype, sname, pname]) | |
155 | |
156 def removePerspective(self, b): | |
157 if self.selectedRow is not None: | |
158 self.xml.get_widget("serviceList").remove(self.selectedRow) | |
159 | |
160 def on_serviceType_changed(self, w=None): | |
161 self.xml.get_widget("serviceName").set_text(self.xml.get_widget("service
Type").get_text()) | |
162 self.xml.get_widget("perspectiveName").set_text(self.xml.get_widget("ide
ntity").get_text()) | |
163 | |
164 on_identity_changed = on_serviceType_changed | |
165 | |
166 def on_serviceList_select_row(self, slist, row, column, event): | |
167 self.selectedRow = row | |
168 | |
169 def create(self, accName, autoLogin): | |
170 host = self.xml.get_widget("hostname").get_text() | |
171 port = self.xml.get_widget("portno").get_text() | |
172 user = self.xml.get_widget("identity").get_text() | |
173 pasw = self.xml.get_widget("password").get_text() | |
174 serviceList = self.xml.get_widget("serviceList") | |
175 services = [] | |
176 for r in xrange(0, serviceList.rows): | |
177 row = [] | |
178 for c in xrange(0, serviceList.columns): | |
179 row.append(serviceList.get_text(r, c)) | |
180 services.append(row) | |
181 if not services: | |
182 services.append([ | |
183 self.xml.get_widget("serviceType").get_text(), | |
184 self.xml.get_widget("serviceName").get_text(), | |
185 self.xml.get_widget("perspectiveName").get_text()]) | |
186 return PBAccount(accName, autoLogin, user, pasw, host, int(port), | |
187 services) | |
188 | |
189 | |
190 class TOCAccountForm: | |
191 def __init__(self, maanger): | |
192 self.xml = openGlade(GLADE_FILE, root="TOCAccountWidget") | |
193 self.widget = self.xml.get_widget("TOCAccountWidget") | |
194 | |
195 def create(self, accountName, autoLogin): | |
196 return TOCAccount( | |
197 accountName, autoLogin, | |
198 self.xml.get_widget("TOCName").get_text(), | |
199 self.xml.get_widget("TOCPass").get_text(), | |
200 self.xml.get_widget("TOCHost").get_text(), | |
201 int(self.xml.get_widget("TOCPort").get_text()) ) | |
202 | |
203 | |
204 class IRCAccountForm: | |
205 def __init__(self, maanger): | |
206 self.xml = openGlade(GLADE_FILE, root="IRCAccountWidget") | |
207 self.widget = self.xml.get_widget("IRCAccountWidget") | |
208 | |
209 def create(self, accountName, autoLogin): | |
210 return IRCAccount( | |
211 accountName, autoLogin, | |
212 self.xml.get_widget("ircNick").get_text(), | |
213 self.xml.get_widget("ircPassword").get_text(), | |
214 self.xml.get_widget("ircServer").get_text(), | |
215 int(self.xml.get_widget("ircPort").get_text()), | |
216 self.xml.get_widget("ircChannels").get_text(), | |
217 ) | |
218 | |
219 | |
220 | |
221 registeredTypes = [ ("Twisted", PBAccountForm), | |
222 ("AOL Instant Messenger", TOCAccountForm), | |
223 ["IRC", IRCAccountForm], | |
224 ("Dummy", DummyAccountForm) ] | |
OLD | NEW |