| 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 |