OLD | NEW |
| (Empty) |
1 | |
2 # Copyright (c) 2001-2004 Twisted Matrix Laboratories. | |
3 # See LICENSE for details. | |
4 | |
5 | |
6 import gtk | |
7 import string | |
8 | |
9 from twisted.spread import pb | |
10 from twisted import copyright | |
11 from twisted.python import reflect | |
12 from twisted.cred.credentials import UsernamePassword | |
13 | |
14 normalFont = gtk.load_font("-adobe-courier-medium-r-normal-*-*-120-*-*-m-*-iso88
59-1") | |
15 boldFont = gtk.load_font("-adobe-courier-bold-r-normal-*-*-120-*-*-m-*-iso8859-1
") | |
16 errorFont = gtk.load_font("-adobe-courier-medium-o-normal-*-*-120-*-*-m-*-iso885
9-1") | |
17 | |
18 | |
19 def selectAll(widget,event): | |
20 widget.select_region(0,-1) | |
21 | |
22 def cbutton(name, callback): | |
23 b = gtk.GtkButton(name) | |
24 b.connect('clicked', callback) | |
25 return b | |
26 | |
27 class ButtonBar: | |
28 barButtons = None | |
29 def getButtonList(self, prefix='button_', container=None): | |
30 result = [] | |
31 buttons = self.barButtons or \ | |
32 reflect.prefixedMethodNames(self.__class__, prefix) | |
33 for b in buttons: | |
34 bName = string.replace(b, '_', ' ') | |
35 result.append(cbutton(bName, getattr(self,prefix+b))) | |
36 if container: | |
37 map(container.add, result) | |
38 return result | |
39 | |
40 def scrollify(widget): | |
41 #widget.set_word_wrap(gtk.TRUE) | |
42 scrl=gtk.GtkScrolledWindow() | |
43 scrl.add(widget) | |
44 scrl.set_policy(gtk.POLICY_NEVER, gtk.POLICY_ALWAYS) | |
45 # scrl.set_update_policy(gtk.POLICY_AUTOMATIC) | |
46 return scrl | |
47 | |
48 def defocusify(widget): | |
49 widget.unset_flags(gtk.CAN_FOCUS) | |
50 | |
51 class GetString(gtk.GtkWindow): | |
52 def __init__(self, im, desc): | |
53 gtk.GtkWindow.__init__(self, gtk.WINDOW_TOPLEVEL) | |
54 self.set_title(desc) | |
55 self.im = im | |
56 button = cbutton(desc, self.clicked) | |
57 self.entry = gtk.GtkEntry() | |
58 self.entry.connect('activate', self.clicked) | |
59 hb = gtk.GtkHBox() | |
60 hb.add(self.entry) | |
61 hb.add(button) | |
62 self.add(hb) | |
63 self.show_all() | |
64 | |
65 def clicked(self, btn): | |
66 raise NotImplementedError | |
67 | |
68 | |
69 class Login(gtk.GtkWindow): | |
70 | |
71 _resetTimeout = None | |
72 | |
73 def __init__(self, callback, | |
74 referenceable=None, | |
75 initialUser="guest", initialPassword="guest", | |
76 initialHostname="localhost",initialPortno=str(pb.portno), | |
77 initialService="", initialPerspective=""): | |
78 gtk.GtkWindow.__init__(self,gtk.WINDOW_TOPLEVEL) | |
79 version_label = gtk.GtkLabel("Twisted v%s" % copyright.version) | |
80 self.pbReferenceable = referenceable | |
81 self.pbCallback = callback | |
82 # version_label.show() | |
83 self.username = gtk.GtkEntry() | |
84 self.password = gtk.GtkEntry() | |
85 self.service = gtk.GtkEntry() | |
86 self.perspective = gtk.GtkEntry() | |
87 self.hostname = gtk.GtkEntry() | |
88 self.port = gtk.GtkEntry() | |
89 self.password.set_visibility(gtk.FALSE) | |
90 | |
91 self.username.set_text(initialUser) | |
92 self.password.set_text(initialPassword) | |
93 self.service.set_text(initialService) | |
94 self.perspective.set_text(initialPerspective) | |
95 self.hostname.set_text(initialHostname) | |
96 self.port.set_text(str(initialPortno)) | |
97 | |
98 userlbl=gtk.GtkLabel("Username:") | |
99 passlbl=gtk.GtkLabel("Password:") | |
100 servicelbl=gtk.GtkLabel("Service:") | |
101 perspeclbl=gtk.GtkLabel("Perspective:") | |
102 hostlbl=gtk.GtkLabel("Hostname:") | |
103 portlbl=gtk.GtkLabel("Port #:") | |
104 self.allLabels = [ | |
105 userlbl, passlbl, servicelbl, perspeclbl, hostlbl, portlbl | |
106 ] | |
107 self.logstat = gtk.GtkLabel("Protocol PB-%s" % pb.Broker.version) | |
108 self.okbutton = cbutton("Log In", self.login) | |
109 self.okbutton["can_default"] = 1 | |
110 self.okbutton["receives_default"] = 1 | |
111 | |
112 okbtnbx = gtk.GtkHButtonBox() | |
113 okbtnbx.add(self.okbutton) | |
114 | |
115 vbox = gtk.GtkVBox() | |
116 vbox.add(version_label) | |
117 table = gtk.GtkTable(2,6) | |
118 row=0 | |
119 for label, entry in [(userlbl, self.username), | |
120 (passlbl, self.password), | |
121 (hostlbl, self.hostname), | |
122 (servicelbl, self.service), | |
123 (perspeclbl, self.perspective), | |
124 (portlbl, self.port)]: | |
125 table.attach(label, 0, 1, row, row+1) | |
126 table.attach(entry, 1, 2, row, row+1) | |
127 row = row+1 | |
128 | |
129 vbox.add(table) | |
130 vbox.add(self.logstat) | |
131 vbox.add(okbtnbx) | |
132 self.add(vbox) | |
133 self.username.grab_focus() | |
134 self.okbutton.grab_default() | |
135 for fld in self.username, self.password, self.hostname, self.service, se
lf.perspective: | |
136 fld.signal_connect('activate',self.login) | |
137 fld.signal_connect('focus_in_event',selectAll) | |
138 self.signal_connect('destroy',gtk.mainquit,None) | |
139 | |
140 def loginReset(self): | |
141 print 'doing login reset' | |
142 self.logstat.set_text("Idle.") | |
143 self._resetTimeout = None | |
144 return 0 | |
145 | |
146 def loginReport(self, txt): | |
147 print 'setting login report',repr(txt) | |
148 self.logstat.set_text(txt) | |
149 if not (self._resetTimeout is None): | |
150 gtk.timeout_remove(self._resetTimeout) | |
151 | |
152 self._resetTimeout = gtk.timeout_add(59000, self.loginReset) | |
153 | |
154 def login(self, btn): | |
155 host = self.hostname.get_text() | |
156 port = self.port.get_text() | |
157 service = self.service.get_text() | |
158 perspective = self.perspective.get_text() | |
159 # Maybe we're connecting to a unix socket, so don't make any | |
160 # assumptions | |
161 try: | |
162 port = int(port) | |
163 except: | |
164 pass | |
165 user = self.username.get_text() | |
166 pswd = self.password.get_text() | |
167 self.loginReport("connecting...") | |
168 # putting this off to avoid a stupid bug in gtk where it won't redraw | |
169 # if you input_add a connecting socket (!??) | |
170 self.user_tx = user | |
171 self.pswd_tx = pswd | |
172 self.host_tx = host | |
173 self.port_tx = port | |
174 self.service_tx = service | |
175 self.perspective_tx = perspective or user | |
176 afterOneTimeout(10, self.__actuallyConnect) | |
177 | |
178 def __actuallyConnect(self): | |
179 from twisted.application import internet | |
180 | |
181 f = pb.PBClientFactory() | |
182 internet.TCPClient(self.host_tx, self.port_tx, f) | |
183 creds = UsernamePassword(self.user_tx, self.pswd_tx) | |
184 f.login(creds, self.pbReferenceable | |
185 ).addCallbacks(self.pbCallback, self.couldNotConnect | |
186 ).setTimeout(30 | |
187 ) | |
188 | |
189 def couldNotConnect(self, msg): | |
190 self.loginReport("couldn't connect: %s" % str(msg)) | |
191 | |
192 | |
193 class _TimerOuter: | |
194 def __init__(self, timeout, cmd, args): | |
195 self.args = args | |
196 self.cmd = cmd | |
197 self.tid = gtk.timeout_add(timeout, self.doIt) | |
198 | |
199 def doIt(self): | |
200 gtk.timeout_remove(self.tid) | |
201 apply(self.cmd, self.args) | |
202 | |
203 def afterOneTimeout(timeout, cmd, *args): | |
204 _TimerOuter(timeout, cmd, args) | |
OLD | NEW |