1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34 import gtk
35 import gobject
36 import os, sys
37 import common.config
38 import common.sleepy
39 from common.i18n import Q_
40
41 import gtkgui_helpers
42 import dialogs
43 import cell_renderer_image
44 import message_control
45 import chat_control
46 import dataforms_widget
47
48 try:
49 import gtkspell
50 HAS_GTK_SPELL = True
51 except ImportError:
52 HAS_GTK_SPELL = False
53
54 from common import helpers
55 from common import gajim
56 from common import connection
57 from common import passwords
58 from common.zeroconf import connection_zeroconf
59 from common import dataforms
60 from common import GnuPG
61 from common import ged
62
63 try:
64 from common.multimedia_helpers import AudioInputManager, AudioOutputManager
65 from common.multimedia_helpers import VideoInputManager, VideoOutputManager
66 HAS_GST = True
67 except ImportError:
68 HAS_GST = False
69
70 from common.exceptions import GajimGeneralException
71
72
74 """
75 Class for Preferences window
76 """
77
83
86
88 """
89 Initialize Preferences window
90 """
91 self.xml = gtkgui_helpers.get_gtk_builder('preferences_window.ui')
92 self.window = self.xml.get_object('preferences_window')
93 self.window.set_transient_for(gajim.interface.roster.window)
94 self.notebook = self.xml.get_object('preferences_notebook')
95 self.one_window_type_combobox =\
96 self.xml.get_object('one_window_type_combobox')
97 self.iconset_combobox = self.xml.get_object('iconset_combobox')
98 self.notify_on_signin_checkbutton = self.xml.get_object(
99 'notify_on_signin_checkbutton')
100 self.notify_on_signout_checkbutton = self.xml.get_object(
101 'notify_on_signout_checkbutton')
102 self.auto_popup_away_checkbutton = self.xml.get_object(
103 'auto_popup_away_checkbutton')
104 self.sound_dnd_checkbutton = self.xml.get_object('sound_dnd_checkbutton')
105 self.auto_away_checkbutton = self.xml.get_object('auto_away_checkbutton')
106 self.auto_away_time_spinbutton = self.xml.get_object(
107 'auto_away_time_spinbutton')
108 self.auto_away_message_entry = self.xml.get_object(
109 'auto_away_message_entry')
110 self.auto_xa_checkbutton = self.xml.get_object('auto_xa_checkbutton')
111 self.auto_xa_time_spinbutton = self.xml.get_object(
112 'auto_xa_time_spinbutton')
113 self.auto_xa_message_entry = self.xml.get_object('auto_xa_message_entry')
114
115
116
117 st = gajim.config.get('show_avatars_in_roster')
118 self.xml.get_object('show_avatars_in_roster_checkbutton'). \
119 set_active(st)
120
121
122 st = gajim.config.get('show_status_msgs_in_roster')
123 self.xml.get_object('show_status_msgs_in_roster_checkbutton'). \
124 set_active( st)
125
126
127 st = gajim.config.get('show_mood_in_roster')
128 self.xml.get_object('show_mood_in_roster_checkbutton'). \
129 set_active(st)
130
131
132 st = gajim.config.get('show_activity_in_roster')
133 self.xml.get_object('show_activity_in_roster_checkbutton'). \
134 set_active(st)
135
136
137 st = gajim.config.get('show_tunes_in_roster')
138 self.xml.get_object('show_tunes_in_roster_checkbutton'). \
139 set_active(st)
140
141
142 st = gajim.config.get('show_location_in_roster')
143 self.xml.get_object('show_location_in_roster_checkbutton'). \
144 set_active(st)
145
146
147 st = gajim.config.get('sort_by_show_in_roster')
148 self.xml.get_object('sort_by_show_in_roster_checkbutton').set_active(st)
149 st = gajim.config.get('sort_by_show_in_muc')
150 self.xml.get_object('sort_by_show_in_muc_checkbutton').set_active(st)
151
152
153 emoticons_combobox = self.xml.get_object('emoticons_combobox')
154 emoticons_list = os.listdir(os.path.join(gajim.DATA_DIR, 'emoticons'))
155
156 if os.path.isdir(gajim.MY_EMOTS_PATH):
157 emoticons_list += os.listdir(gajim.MY_EMOTS_PATH)
158 renderer_text = gtk.CellRendererText()
159 emoticons_combobox.pack_start(renderer_text, True)
160 emoticons_combobox.add_attribute(renderer_text, 'text', 0)
161 model = gtk.ListStore(str)
162 emoticons_combobox.set_model(model)
163 l = []
164 for dir_ in emoticons_list:
165 if not os.path.isdir(os.path.join(gajim.DATA_DIR, 'emoticons', dir_)) \
166 and not os.path.isdir(os.path.join(gajim.MY_EMOTS_PATH, dir_)) :
167 continue
168 if dir_ != '.svn':
169 l.append(dir_)
170 l.append(_('Disabled'))
171 for i in xrange(len(l)):
172 model.append([l[i]])
173 if gajim.config.get('emoticons_theme') == l[i]:
174 emoticons_combobox.set_active(i)
175 if not gajim.config.get('emoticons_theme'):
176 emoticons_combobox.set_active(len(l)-1)
177
178
179 choices = common.config.opt_one_window_types
180 type_ = gajim.config.get('one_message_window')
181 if type_ in choices:
182 self.one_window_type_combobox.set_active(choices.index(type_))
183 else:
184 self.one_window_type_combobox.set_active(0)
185
186
187 st = gajim.config.get('compact_view')
188 self.xml.get_object('compact_view_checkbutton').set_active(st)
189
190
191 st = gajim.config.get('ignore_incoming_xhtml')
192 self.xml.get_object('xhtml_checkbutton').set_active(st)
193
194
195 if HAS_GTK_SPELL:
196 st = gajim.config.get('use_speller')
197 self.xml.get_object('speller_checkbutton').set_active(st)
198 else:
199 self.xml.get_object('speller_checkbutton').set_sensitive(False)
200
201
202
203 theme_combobox = self.xml.get_object('theme_combobox')
204 cell = gtk.CellRendererText()
205 theme_combobox.pack_start(cell, True)
206 theme_combobox.add_attribute(cell, 'text', 0)
207 self.update_theme_list()
208
209
210 iconsets_list = os.listdir(os.path.join(gajim.DATA_DIR, 'iconsets'))
211 if os.path.isdir(gajim.MY_ICONSETS_PATH):
212 iconsets_list += os.listdir(gajim.MY_ICONSETS_PATH)
213
214 model = gtk.ListStore(gtk.Image, str)
215 renderer_image = cell_renderer_image.CellRendererImage(0, 0)
216 renderer_text = gtk.CellRendererText()
217 renderer_text.set_property('xpad', 5)
218 self.iconset_combobox.pack_start(renderer_image, expand = False)
219 self.iconset_combobox.pack_start(renderer_text, expand = True)
220 self.iconset_combobox.set_attributes(renderer_text, text = 1)
221 self.iconset_combobox.add_attribute(renderer_image, 'image', 0)
222 self.iconset_combobox.set_model(model)
223 l = []
224 for dir in iconsets_list:
225 if not os.path.isdir(os.path.join(gajim.DATA_DIR, 'iconsets', dir)) \
226 and not os.path.isdir(os.path.join(gajim.MY_ICONSETS_PATH, dir)):
227 continue
228 if dir != '.svn' and dir != 'transports':
229 l.append(dir)
230 if l.count == 0:
231 l.append(' ')
232 for i in xrange(len(l)):
233 preview = gtk.Image()
234 files = []
235 files.append(os.path.join(helpers.get_iconset_path(l[i]), '16x16',
236 'online.png'))
237 files.append(os.path.join(helpers.get_iconset_path(l[i]), '16x16',
238 'online.gif'))
239 for file_ in files:
240 if os.path.exists(file_):
241 preview.set_from_file(file_)
242 model.append([preview, l[i]])
243 if gajim.config.get('iconset') == l[i]:
244 self.iconset_combobox.set_active(i)
245
246
247 st = gajim.config.get('use_transports_iconsets')
248 self.xml.get_object('transports_iconsets_checkbutton').set_active(st)
249
250
251 self.draw_color_widgets()
252
253
254 font = gajim.config.get('conversation_font')
255
256 fontbutton = self.xml.get_object('conversation_fontbutton')
257 if font == '':
258 fontbutton.set_sensitive(False)
259 self.xml.get_object('default_chat_font').set_active(True)
260 else:
261 fontbutton.set_font_name(font)
262
263
264
265 st = gajim.config.get('outgoing_chat_state_notifications')
266 combo = self.xml.get_object('outgoing_chat_states_combobox')
267 if st == 'all':
268 combo.set_active(0)
269 elif st == 'composing_only':
270 combo.set_active(1)
271 else:
272 combo.set_active(2)
273
274
275 st = gajim.config.get('displayed_chat_state_notifications')
276 combo = self.xml.get_object('displayed_chat_states_combobox')
277 if st == 'all':
278 combo.set_active(0)
279 elif st == 'composing_only':
280 combo.set_active(1)
281 else:
282 combo.set_active(2)
283
284
285
286
287 on_event_combobox = self.xml.get_object('on_event_combobox')
288 if gajim.config.get('autopopup'):
289 on_event_combobox.set_active(0)
290 elif gajim.config.get('notify_on_new_message'):
291 on_event_combobox.set_active(1)
292 else:
293 on_event_combobox.set_active(2)
294
295
296 st = gajim.config.get('notify_on_signin')
297 self.notify_on_signin_checkbutton.set_active(st)
298
299
300 st = gajim.config.get('notify_on_signout')
301 self.notify_on_signout_checkbutton.set_active(st)
302
303
304 st = gajim.config.get('autopopupaway')
305 self.auto_popup_away_checkbutton.set_active(st)
306
307
308 st = gajim.config.get('sounddnd')
309 self.sound_dnd_checkbutton.set_active(st)
310
311
312 systray_combobox = self.xml.get_object('systray_combobox')
313 if gajim.config.get('trayicon') == 'never':
314 systray_combobox.set_active(0)
315 elif gajim.config.get('trayicon') == 'on_event':
316 systray_combobox.set_active(1)
317 else:
318 systray_combobox.set_active(2)
319
320
321 if gajim.config.get('sounds_on'):
322 self.xml.get_object('play_sounds_checkbutton').set_active(True)
323 else:
324 self.xml.get_object('manage_sounds_button').set_sensitive(False)
325
326
327
328 frame_gmail = self.xml.get_object('frame_gmail')
329 notify_gmail_checkbutton = self.xml.get_object('notify_gmail_checkbutton')
330 notify_gmail_extra_checkbutton = self.xml.get_object(
331 'notify_gmail_extra_checkbutton')
332
333 for account in gajim.config.get_per('accounts'):
334 jid = gajim.get_jid_from_account(account)
335 if gajim.get_server_from_jid(jid) in gajim.gmail_domains:
336 frame_gmail.set_sensitive(True)
337 st = gajim.config.get('notify_on_new_gmail_email')
338 notify_gmail_checkbutton.set_active(st)
339 st = gajim.config.get('notify_on_new_gmail_email_extra')
340 notify_gmail_extra_checkbutton.set_active(st)
341 break
342
343
344
345 st = gajim.config.get('autoaway')
346 self.auto_away_checkbutton.set_active(st)
347
348
349 st = gajim.config.get('autoawaytime')
350 self.auto_away_time_spinbutton.set_value(st)
351 self.auto_away_time_spinbutton.set_sensitive(gajim.config.get('autoaway'))
352
353
354 st = gajim.config.get('autoaway_message')
355 self.auto_away_message_entry.set_text(st)
356 self.auto_away_message_entry.set_sensitive(gajim.config.get('autoaway'))
357
358
359 st = gajim.config.get('autoxa')
360 self.auto_xa_checkbutton.set_active(st)
361
362
363 st = gajim.config.get('autoxatime')
364 self.auto_xa_time_spinbutton.set_value(st)
365 self.auto_xa_time_spinbutton.set_sensitive(gajim.config.get('autoxa'))
366
367
368 st = gajim.config.get('autoxa_message')
369 self.auto_xa_message_entry.set_text(st)
370 self.auto_xa_message_entry.set_sensitive(gajim.config.get('autoxa'))
371
372 from common import sleepy
373 if not sleepy.SUPPORTED:
374 self.xml.get_object('autoaway_table').set_sensitive(False)
375
376
377 st = gajim.config.get('ask_online_status')
378 self.xml.get_object('prompt_online_status_message_checkbutton').\
379 set_active(st)
380 st = gajim.config.get('ask_offline_status')
381 self.xml.get_object('prompt_offline_status_message_checkbutton').\
382 set_active(st)
383
384
385 self.default_msg_tree = self.xml.get_object('default_msg_treeview')
386 col2 = self.default_msg_tree.rc_get_style().bg[gtk.STATE_ACTIVE].\
387 to_string()
388
389 model = gtk.ListStore(str, str, str, bool)
390 self.default_msg_tree.set_model(model)
391 col = gtk.TreeViewColumn(_('Status'))
392 col.set_resizable(True)
393 self.default_msg_tree.append_column(col)
394 renderer = gtk.CellRendererText()
395 col.pack_start(renderer, False)
396 col.set_attributes(renderer, text = 1)
397 col = gtk.TreeViewColumn(_('Default Message'))
398 col.set_resizable(True)
399 self.default_msg_tree.append_column(col)
400 renderer = gtk.CellRendererText()
401 col.pack_start(renderer, True)
402 col.set_attributes(renderer, text = 2)
403 renderer.connect('edited', self.on_default_msg_cell_edited)
404 renderer.set_property('editable', True)
405 renderer.set_property('cell-background', col2)
406 col = gtk.TreeViewColumn(_('Enabled'))
407 col.set_resizable(True)
408 self.default_msg_tree.append_column(col)
409 renderer = gtk.CellRendererToggle()
410 col.pack_start(renderer, False)
411 col.set_attributes(renderer, active = 3)
412 renderer.set_property('activatable', True)
413 renderer.connect('toggled', self.default_msg_toggled_cb)
414 self.fill_default_msg_treeview()
415
416
417 self.msg_tree = self.xml.get_object('msg_treeview')
418 model = gtk.ListStore(str, str)
419 self.msg_tree.set_model(model)
420 col = gtk.TreeViewColumn('name')
421 self.msg_tree.append_column(col)
422 renderer = gtk.CellRendererText()
423 col.pack_start(renderer, True)
424 col.set_attributes(renderer, text = 0)
425 renderer.connect('edited', self.on_msg_cell_edited)
426 renderer.set_property('editable', True)
427 self.fill_msg_treeview()
428 buf = self.xml.get_object('msg_textview').get_buffer()
429 buf.connect('changed', self.on_msg_textview_changed)
430
431
432 def create_av_combobox(opt_name, device_dict, config_name=None,
433 key=None):
434 combobox = self.xml.get_object(opt_name + '_combobox')
435 cell = gtk.CellRendererText()
436 combobox.pack_start(cell, True)
437 combobox.add_attribute(cell, 'text', 0)
438 model = gtk.ListStore(str, str)
439 combobox.set_model(model)
440 if config_name:
441 config = gajim.config.get(config_name)
442 else:
443 config = gajim.config.get(opt_name + '_device')
444
445 for index, (name, value) in enumerate(sorted(device_dict.\
446 iteritems(), key=key)):
447 model.append((name, value))
448 if config == value:
449 combobox.set_active(index)
450
451 if HAS_GST:
452 create_av_combobox('audio_input', AudioInputManager().get_devices())
453 create_av_combobox('audio_output', AudioOutputManager().get_devices(
454 ))
455 create_av_combobox('video_input', VideoInputManager().get_devices())
456 create_av_combobox('video_output', VideoOutputManager().get_devices(
457 ))
458
459 create_av_combobox('video_framerate', {_('Default'): '',
460 '15fps': '15/1', '10fps': '10/1', '5fps': '5/1',
461 '2.5fps': '5/2'}, 'video_framerate', key=lambda x: -1 if \
462 not x[1] else float(x[0][:-3]))
463 create_av_combobox('video_size', {_('Default'): '',
464 '800x600': '800x600', '640x480': '640x480',
465 '320x240': '320x240'}, 'video_size', key=lambda x: -1 if \
466 not x[1] else int(x[0][:3]))
467
468 else:
469 for opt_name in ('audio_input', 'audio_output', 'video_input',
470 'video_output', 'video_framerate', 'video_size'):
471 combobox = self.xml.get_object(opt_name + '_combobox')
472 combobox.set_sensitive(False)
473
474
475 cb = self.xml.get_object('stun_checkbutton')
476 st = gajim.config.get('use_stun_server')
477 cb.set_active(st)
478
479 entry = self.xml.get_object('stun_server_entry')
480 entry.set_text(gajim.config.get('stun_server'))
481 if not st:
482 entry.set_sensitive(False)
483
484
485
486 if os.name == 'nt':
487 applications_frame = self.xml.get_object('applications_frame')
488 applications_frame.set_no_show_all(True)
489 applications_frame.hide()
490 else:
491 self.applications_combobox = self.xml.get_object(
492 'applications_combobox')
493 self.xml.get_object('custom_apps_frame').hide()
494 self.xml.get_object('custom_apps_frame').set_no_show_all(True)
495
496 if gajim.config.get('autodetect_browser_mailer'):
497 self.applications_combobox.set_active(0)
498
499
500 elif gajim.config.get('openwith') == 'gnome-open':
501 self.applications_combobox.set_active(1)
502 elif gajim.config.get('openwith') == 'kfmclient exec':
503 self.applications_combobox.set_active(2)
504 elif gajim.config.get('openwith') == 'exo-open':
505 self.applications_combobox.set_active(3)
506 elif gajim.config.get('openwith') == 'custom':
507 self.applications_combobox.set_active(4)
508 self.xml.get_object('custom_apps_frame').show()
509
510 self.xml.get_object('custom_browser_entry').set_text(
511 gajim.config.get('custombrowser'))
512 self.xml.get_object('custom_mail_client_entry').set_text(
513 gajim.config.get('custommailapp'))
514 self.xml.get_object('custom_file_manager_entry').set_text(
515 gajim.config.get('custom_file_manager'))
516
517
518 st = gajim.config.get('log_contact_status_changes')
519 self.xml.get_object('log_show_changes_checkbutton').set_active(st)
520
521
522 w = self.xml.get_object('log_encrypted_chats_checkbutton')
523 st = self.get_per_account_option('log_encrypted_sessions')
524 if st == 'mixed':
525 w.set_inconsistent(True)
526 else:
527 w.set_active(st)
528
529
530 w = self.xml.get_object('send_os_info_checkbutton')
531 st = self.get_per_account_option('send_os_info')
532 if st == 'mixed':
533 w.set_inconsistent(True)
534 else:
535 w.set_active(st)
536
537
538 w = self.xml.get_object('send_idle_time_checkbutton')
539 st = self.get_per_account_option('send_idle_time')
540 if st == 'mixed':
541 w.set_inconsistent(True)
542 else:
543 w.set_active(st)
544
545
546 st = gajim.config.get('check_if_gajim_is_default')
547 self.xml.get_object('check_default_client_checkbutton').set_active(st)
548
549
550 w = self.xml.get_object('ignore_events_from_unknown_contacts_checkbutton')
551 st = self.get_per_account_option('ignore_unknown_contacts')
552 if st == 'mixed':
553 w.set_inconsistent(True)
554 else:
555 w.set_active(st)
556
557 self.xml.connect_signals(self)
558
559 self.msg_tree.get_model().connect('row-changed',
560 self.on_msg_treemodel_row_changed)
561 self.msg_tree.get_model().connect('row-deleted',
562 self.on_msg_treemodel_row_deleted)
563 self.default_msg_tree.get_model().connect('row-changed',
564 self.on_default_msg_treemodel_row_changed)
565
566 self.theme_preferences = None
567 self.sounds_preferences = None
568
569 self.notebook.set_current_page(0)
570
571 self.window.show_all()
572 gtkgui_helpers.possibly_move_window_in_current_desktop(self.window)
573
575 if event.keyval == gtk.keysyms.Escape:
576 self.window.hide()
577
594
602
612
619
627
631
637
644
650
654
658
662
666
679
686
693
700
704
715
725
750
762
764 theme_combobox = self.xml.get_object('theme_combobox')
765 model = gtk.ListStore(str)
766 theme_combobox.set_model(model)
767 i = 0
768 for config_theme in gajim.config.get_per('themes'):
769 theme = config_theme.replace('_', ' ')
770 model.append([theme])
771 if gajim.config.get('roster_theme') == config_theme:
772 theme_combobox.set_active(i)
773 i += 1
774
781
789
793
807
809 active = widget.get_active()
810 if active == 0:
811 gajim.config.set('displayed_chat_state_notifications', 'all')
812 elif active == 1:
813 gajim.config.set('displayed_chat_state_notifications',
814 'composing_only')
815 else:
816 gajim.config.set('displayed_chat_state_notifications', 'disabled')
817
821
833
836
839
842
845
862
865
869
875
882
889
898
900 """
901 Update text font in opened chat windows
902 """
903 for ctrl in self._get_all_controls():
904 ctrl.update_font()
905
908
911
914
917
920
923
926
928 font_widget = self.xml.get_object('conversation_fontbutton')
929 if widget.get_active():
930 font_widget.set_sensitive(False)
931 font_widget = None
932 else:
933 font_widget.set_sensitive(True)
934 self.on_preference_widget_font_set(font_widget, 'conversation_font')
935
965
979
980 - def _set_color(self, state, widget_name, option):
991
996
1001
1005
1013
1015 gajim.config.set('autoaway_message', widget.get_text().decode('utf-8'))
1016
1020
1028
1030 gajim.config.set('autoxa_message', widget.get_text().decode('utf-8'))
1031
1034
1037
1039 model = self.default_msg_tree.get_model()
1040 model.clear()
1041 status = []
1042 for status_ in gajim.config.get_per('defaultstatusmsg'):
1043 status.append(status_)
1044 status.sort()
1045 for status_ in status:
1046 msg = gajim.config.get_per('defaultstatusmsg', status_, 'message')
1047 msg = helpers.from_one_line(msg)
1048 enabled = gajim.config.get_per('defaultstatusmsg', status_, 'enabled')
1049 iter_ = model.append()
1050 uf_show = helpers.get_uf_show(status_)
1051 model.set(iter_, 0, status_, 1, uf_show, 2, msg, 3, enabled)
1052
1054 model = self.default_msg_tree.get_model()
1055 iter_ = model.get_iter_from_string(row)
1056 model.set_value(iter_, 2, new_text)
1057
1059 model = self.default_msg_tree.get_model()
1060 model[path][3] = not model[path][3]
1061
1069
1071 eventbox = self.xml.get_object('default_status_eventbox')
1072 vbox = self.xml.get_object('status_vbox')
1073 vbox.set_child_packing(eventbox, not expander.get_expanded(), True, 0,
1074 gtk.PACK_START)
1075
1090
1093
1096
1098 model = combobox.get_model()
1099 active = combobox.get_active()
1100 device = model[active][1].decode('utf-8')
1101 gajim.config.set(config_name, device)
1102
1105
1108
1111
1114
1117
1120
1124
1126 gajim.config.set('stun_server', widget.get_text().decode('utf-8'))
1127
1129 gajim.config.set('autodetect_browser_mailer', False)
1130 if widget.get_active() == 4:
1131 self.xml.get_object('custom_apps_frame').show()
1132 gajim.config.set('openwith', 'custom')
1133 else:
1134 if widget.get_active() == 0:
1135 gajim.config.set('autodetect_browser_mailer', True)
1136 elif widget.get_active() == 1:
1137 gajim.config.set('openwith', 'gnome-open')
1138 elif widget.get_active() == 2:
1139 gajim.config.set('openwith', 'kfmclient exec')
1140 elif widget.get_active() == 3:
1141 gajim.config.set('openwith', 'exo-open')
1142 self.xml.get_object('custom_apps_frame').hide()
1143 gajim.interface.save_config()
1144
1146 gajim.config.set('custombrowser', widget.get_text().decode('utf-8'))
1147 gajim.interface.save_config()
1148
1150 gajim.config.set('custommailapp', widget.get_text().decode('utf-8'))
1151 gajim.interface.save_config()
1152
1154 gajim.config.set('custom_file_manager', widget.get_text().decode('utf-8'))
1155 gajim.interface.save_config()
1156
1159
1163
1167
1171
1174
1177
1180
1182 self.xml.get_object('delete_msg_button').set_sensitive(False)
1183 model = self.msg_tree.get_model()
1184 model.clear()
1185 preset_status = []
1186 for msg_name in gajim.config.get_per('statusmsg'):
1187 if msg_name.startswith('_last_'):
1188 continue
1189 preset_status.append(msg_name)
1190 preset_status.sort()
1191 for msg_name in preset_status:
1192 msg_text = gajim.config.get_per('statusmsg', msg_name, 'message')
1193 msg_text = helpers.from_one_line(msg_text)
1194 iter_ = model.append()
1195 model.set(iter_, 0, msg_name, 1, msg_text)
1196
1198 model = self.msg_tree.get_model()
1199 iter_ = model.get_iter_from_string(row)
1200 model.set_value(iter_, 0, new_text)
1201
1203 (model, iter_) = self.msg_tree.get_selection().get_selected()
1204 if not iter_:
1205 return
1206 self.xml.get_object('delete_msg_button').set_sensitive(True)
1207 buf = self.xml.get_object('msg_textview').get_buffer()
1208 msg = model[iter_][1]
1209 buf.set_text(msg)
1210
1216
1225
1226 - def on_msg_textview_changed(self, widget, data = None):
1227 (model, iter_) = self.msg_tree.get_selection().get_selected()
1228 if not iter_:
1229 return
1230 buf = self.xml.get_object('msg_textview').get_buffer()
1231 first_iter, end_iter = buf.get_bounds()
1232 model.set_value(iter_, 1, buf.get_text(first_iter, end_iter))
1233
1237
1244
1245
1248 self.xml = gtkgui_helpers.get_gtk_builder('manage_proxies_window.ui')
1249 self.window = self.xml.get_object('manage_proxies_window')
1250 self.window.set_transient_for(gajim.interface.roster.window)
1251 self.proxies_treeview = self.xml.get_object('proxies_treeview')
1252 self.proxyname_entry = self.xml.get_object('proxyname_entry')
1253 self.proxytype_combobox = self.xml.get_object('proxytype_combobox')
1254
1255 self.init_list()
1256 self.block_signal = False
1257 self.xml.connect_signals(self)
1258 self.window.show_all()
1259
1260 self.show_bosh_fields()
1261
1263 if show:
1264 self.xml.get_object('boshuri_entry').show()
1265 self.xml.get_object('boshuri_label').show()
1266 self.xml.get_object('boshuseproxy_checkbutton').show()
1267 else:
1268 cb = self.xml.get_object('boshuseproxy_checkbutton')
1269 cb.hide()
1270 cb.set_active(True)
1271 self.on_boshuseproxy_checkbutton_toggled(cb)
1272 self.xml.get_object('boshuri_entry').hide()
1273 self.xml.get_object('boshuri_label').hide()
1274
1275
1277 model = self.proxies_treeview.get_model()
1278 model.clear()
1279 iter_ = model.append()
1280 model.set(iter_, 0, _('None'))
1281 for p in gajim.config.get_per('proxies'):
1282 iter_ = model.append()
1283 model.set(iter_, 0, p)
1284
1286 self.xml.get_object('remove_proxy_button').set_sensitive(False)
1287 self.proxytype_combobox.set_sensitive(False)
1288 self.xml.get_object('proxy_table').set_sensitive(False)
1289 model = gtk.ListStore(str)
1290 self.proxies_treeview.set_model(model)
1291 col = gtk.TreeViewColumn('Proxies')
1292 self.proxies_treeview.append_column(col)
1293 renderer = gtk.CellRendererText()
1294 col.pack_start(renderer, True)
1295 col.set_attributes(renderer, text = 0)
1296 self.fill_proxies_treeview()
1297 self.xml.get_object('proxytype_combobox').set_active(0)
1298
1304
1315
1327
1330
1339
1348
1350
1351
1352 proxyhost_entry = self.xml.get_object('proxyhost_entry')
1353 proxyport_entry = self.xml.get_object('proxyport_entry')
1354 proxyuser_entry = self.xml.get_object('proxyuser_entry')
1355 proxypass_entry = self.xml.get_object('proxypass_entry')
1356 boshuri_entry = self.xml.get_object('boshuri_entry')
1357 useauth_checkbutton = self.xml.get_object('useauth_checkbutton')
1358 boshuseproxy_checkbutton = self.xml.get_object('boshuseproxy_checkbutton')
1359 self.block_signal = True
1360 proxyhost_entry.set_text('')
1361 proxyport_entry.set_text('')
1362 proxyuser_entry.set_text('')
1363 proxypass_entry.set_text('')
1364 boshuri_entry.set_text('')
1365
1366
1367
1368
1369
1370
1371
1372 (model, iter_) = widget.get_selection().get_selected()
1373 if not iter_:
1374 self.xml.get_object('proxyname_entry').set_text('')
1375 self.xml.get_object('proxytype_combobox').set_sensitive(False)
1376 self.xml.get_object('proxy_table').set_sensitive(False)
1377 self.block_signal = False
1378 return
1379
1380 proxy = model[iter_][0]
1381 self.xml.get_object('proxyname_entry').set_text(proxy)
1382
1383 if proxy == _('None'):
1384 self.show_bosh_fields(False)
1385 self.proxyname_entry.set_editable(False)
1386 self.xml.get_object('remove_proxy_button').set_sensitive(False)
1387 self.xml.get_object('proxytype_combobox').set_sensitive(False)
1388 self.xml.get_object('proxy_table').set_sensitive(False)
1389 else:
1390 proxytype = gajim.config.get_per('proxies', proxy, 'type')
1391
1392 self.show_bosh_fields(proxytype=='bosh')
1393
1394 self.proxyname_entry.set_editable(True)
1395 self.xml.get_object('remove_proxy_button').set_sensitive(True)
1396 self.xml.get_object('proxytype_combobox').set_sensitive(True)
1397 self.xml.get_object('proxy_table').set_sensitive(True)
1398 proxyhost_entry.set_text(gajim.config.get_per('proxies', proxy,
1399 'host'))
1400 proxyport_entry.set_text(unicode(gajim.config.get_per('proxies',
1401 proxy, 'port')))
1402 proxyuser_entry.set_text(gajim.config.get_per('proxies', proxy,
1403 'user'))
1404 proxypass_entry.set_text(gajim.config.get_per('proxies', proxy,
1405 'pass'))
1406 boshuri_entry.set_text(gajim.config.get_per('proxies', proxy,
1407 'bosh_uri'))
1408 types = ['http', 'socks5', 'bosh']
1409 self.proxytype_combobox.set_active(types.index(proxytype))
1410 boshuseproxy_checkbutton.set_active(
1411 gajim.config.get_per('proxies', proxy, 'bosh_useproxy'))
1412 useauth_checkbutton.set_active(
1413 gajim.config.get_per('proxies', proxy, 'useauth'))
1414 self.block_signal = False
1415
1419
1421 if self.block_signal:
1422 return
1423 (model, iter_) = self.proxies_treeview.get_selection().get_selected()
1424 if not iter_:
1425 return
1426 old_name = model.get_value(iter_, 0).decode('utf-8')
1427 new_name = widget.get_text().decode('utf-8')
1428 if new_name == '':
1429 return
1430 if new_name == old_name:
1431 return
1432 config = gajim.config.get_per('proxies', old_name)
1433 gajim.config.del_per('proxies', old_name)
1434 gajim.config.add_per('proxies', new_name)
1435 for option in config:
1436 gajim.config.set_per('proxies', new_name, option,
1437 config[option][common.config.OPT_VAL])
1438 model.set_value(iter_, 0, new_name)
1439
1441 if self.block_signal:
1442 return
1443 types = ['http', 'socks5', 'bosh']
1444 type_ = self.proxytype_combobox.get_active()
1445 self.show_bosh_fields(types[type_]=='bosh')
1446 proxy = self.proxyname_entry.get_text().decode('utf-8')
1447 gajim.config.set_per('proxies', proxy, 'type', types[type_])
1448
1450 if self.block_signal:
1451 return
1452 value = widget.get_text().decode('utf-8')
1453 proxy = self.proxyname_entry.get_text().decode('utf-8')
1454 gajim.config.set_per('proxies', proxy, 'host', value)
1455
1457 if self.block_signal:
1458 return
1459 value = widget.get_text().decode('utf-8')
1460 proxy = self.proxyname_entry.get_text().decode('utf-8')
1461 gajim.config.set_per('proxies', proxy, 'port', value)
1462
1464 if self.block_signal:
1465 return
1466 value = widget.get_text().decode('utf-8')
1467 proxy = self.proxyname_entry.get_text().decode('utf-8')
1468 gajim.config.set_per('proxies', proxy, 'user', value)
1469
1470 - def on_boshuri_entry_changed(self, widget):
1471 if self.block_signal:
1472 return
1473 value = widget.get_text().decode('utf-8')
1474 proxy = self.proxyname_entry.get_text().decode('utf-8')
1475 gajim.config.set_per('proxies', proxy, 'bosh_uri', value)
1476
1478 if self.block_signal:
1479 return
1480 value = widget.get_text().decode('utf-8')
1481 proxy = self.proxyname_entry.get_text().decode('utf-8')
1482 gajim.config.set_per('proxies', proxy, 'pass', value)
1483
1484
1485
1487 """
1488 Class for accounts window: list of accounts
1489 """
1490
1493
1497
1499 self.xml = gtkgui_helpers.get_gtk_builder('accounts_window.ui')
1500 self.window = self.xml.get_object('accounts_window')
1501 self.window.set_transient_for(gajim.interface.roster.window)
1502 self.accounts_treeview = self.xml.get_object('accounts_treeview')
1503 self.remove_button = self.xml.get_object('remove_button')
1504 self.rename_button = self.xml.get_object('rename_button')
1505 path_to_kbd_input_img = gtkgui_helpers.get_icon_path('gajim-kbd_input')
1506 img = self.xml.get_object('rename_image')
1507 img.set_from_file(path_to_kbd_input_img)
1508 self.notebook = self.xml.get_object('notebook')
1509
1510 model = gtk.ListStore(str)
1511 self.accounts_treeview.set_model(model)
1512
1513 renderer = gtk.CellRendererText()
1514 self.accounts_treeview.insert_column_with_attributes(-1, _('Name'),
1515 renderer, text=0)
1516
1517 self.current_account = None
1518
1519 self.ignore_events = False
1520 self.need_relogin = False
1521 self.resend_presence = False
1522
1523 self.update_proxy_list()
1524 self.xml.connect_signals(self)
1525 self.init_accounts()
1526 self.window.show_all()
1527
1528
1529 st = gajim.config.get('mergeaccounts')
1530 checkbutton = self.xml.get_object('merge_checkbutton')
1531 checkbutton.set_active(st)
1532
1533
1534 checkbutton.connect('toggled', self.on_merge_checkbutton_toggled)
1535
1536 self.avahi_available = True
1537 try:
1538 import avahi
1539 except ImportError:
1540 self.avahi_available = False
1541
1546
1548 model = self.accounts_treeview.get_model()
1549 iter_ = model.get_iter_root()
1550 while iter_:
1551 acct = model[iter_][0].decode('utf-8')
1552 if account == acct:
1553 self.accounts_treeview.set_cursor(model.get_path(iter_))
1554 return
1555 iter_ = model.iter_next(iter_)
1556
1558 """
1559 Initialize listStore with existing accounts
1560 """
1561 self.remove_button.set_sensitive(False)
1562 self.rename_button.set_sensitive(False)
1563 self.current_account = None
1564 model = self.accounts_treeview.get_model()
1565 model.clear()
1566 for account in gajim.config.get_per('accounts'):
1567 iter_ = model.append()
1568 model.set(iter_, 0, account)
1569
1576
1594
1595 def relog(account):
1596 self.dialog.destroy()
1597 show_before = gajim.SHOW_LIST[gajim.connections[account].connected]
1598 status_before = gajim.connections[account].status
1599 gajim.interface.roster.send_status(account, 'offline',
1600 _('Be right back.'))
1601 gobject.timeout_add(500, login, account, show_before, status_before)
1602
1603 def on_yes(checked, account):
1604 relog(account)
1605 def on_no(account):
1606 if self.resend_presence:
1607 self.resend(account)
1608 if self.current_account in gajim.connections:
1609 self.dialog = dialogs.YesNoDialog(_('Relogin now?'),
1610 _('If you want all the changes to apply instantly, '
1611 'you must relogin.'), on_response_yes=(on_yes,
1612 self.current_account), on_response_no=(on_no,
1613 self.current_account))
1614 elif self.resend_presence:
1615 self.resend(self.current_account)
1616
1617 self.need_relogin = False
1618 self.resend_presence = False
1619
1621 """
1622 Activate modify buttons when a row is selected, update accounts info
1623 """
1624 sel = self.accounts_treeview.get_selection()
1625 (model, iter_) = sel.get_selected()
1626 if iter_:
1627 account = model[iter_][0].decode('utf-8')
1628 else:
1629 account = None
1630 if self.current_account and self.current_account == account:
1631
1632 return
1633
1634
1635 if self.current_account and self.window.get_focus():
1636 focused_widget = self.window.get_focus()
1637 focused_widget_name = focused_widget.get_name()
1638 if focused_widget_name in ('jid_entry1', 'resource_entry1',
1639 'custom_port_entry', 'cert_entry1'):
1640 if focused_widget_name == 'jid_entry1':
1641 func = self.on_jid_entry1_focus_out_event
1642 elif focused_widget_name == 'resource_entry1':
1643 func = self.on_resource_entry1_focus_out_event
1644 elif focused_widget_name == 'custom_port_entry':
1645 func = self.on_custom_port_entry_focus_out_event
1646 elif focused_widget_name == 'cert_entry1':
1647 func = self.on_cert_entry1_focus_out_event
1648 if func(focused_widget, None):
1649
1650
1651 self.select_account(self.current_account)
1652 return True
1653 self.window.set_focus(widget)
1654
1655 self.check_resend_relog()
1656
1657 if account:
1658 self.remove_button.set_sensitive(True)
1659 self.rename_button.set_sensitive(True)
1660 else:
1661 self.remove_button.set_sensitive(False)
1662 self.rename_button.set_sensitive(False)
1663 if iter_:
1664 self.current_account = account
1665 if account == gajim.ZEROCONF_ACC_NAME:
1666 self.remove_button.set_sensitive(False)
1667 self.init_account()
1668 self.update_proxy_list()
1669
1678
1679 def on_cancel(widget):
1680 self.dialog.destroy()
1681
1682 path_to_clientcert_file = self.xml.get_object('cert_entry1').get_text()
1683 self.dialog = dialogs.ClientCertChooserDialog(path_to_clientcert_file,
1684 on_ok, on_cancel)
1685
1687 if self.current_account:
1688 our_proxy = gajim.config.get_per('accounts', self.current_account,
1689 'proxy')
1690 else:
1691 our_proxy = ''
1692
1693 if not our_proxy:
1694 our_proxy = _('None')
1695 proxy_combobox = self.xml.get_object('proxies_combobox1')
1696 model = gtk.ListStore(str)
1697 proxy_combobox.set_model(model)
1698 l = gajim.config.get_per('proxies')
1699 l.insert(0, _('None'))
1700 for i in xrange(len(l)):
1701 model.append([l[i]])
1702 if our_proxy == l[i]:
1703 proxy_combobox.set_active(i)
1704
1706 if not self.current_account:
1707 self.notebook.set_current_page(0)
1708 return
1709 if gajim.config.get_per('accounts', self.current_account, 'is_zeroconf'):
1710 self.ignore_events = True
1711 self.init_zeroconf_account()
1712 self.ignore_events = False
1713 self.notebook.set_current_page(2)
1714 return
1715 self.ignore_events = True
1716 self.init_normal_account()
1717 self.ignore_events = False
1718 self.notebook.set_current_page(1)
1719
1721 active = gajim.config.get_per('accounts', gajim.ZEROCONF_ACC_NAME,
1722 'active')
1723 self.xml.get_object('enable_zeroconf_checkbutton2').set_active(active)
1724 if not gajim.HAVE_ZEROCONF:
1725 self.xml.get_object('enable_zeroconf_checkbutton2').set_sensitive(
1726 False)
1727 self.xml.get_object('zeroconf_notebook').set_sensitive(active)
1728
1729 st = gajim.config.get_per('accounts', gajim.ZEROCONF_ACC_NAME,
1730 'autoconnect')
1731 self.xml.get_object('autoconnect_checkbutton2').set_active(st)
1732
1733 list_no_log_for = gajim.config.get_per('accounts',
1734 gajim.ZEROCONF_ACC_NAME, 'no_log_for').split()
1735 if gajim.ZEROCONF_ACC_NAME in list_no_log_for:
1736 self.xml.get_object('log_history_checkbutton2').set_active(0)
1737 else:
1738 self.xml.get_object('log_history_checkbutton2').set_active(1)
1739
1740 st = gajim.config.get_per('accounts', gajim.ZEROCONF_ACC_NAME,
1741 'sync_with_global_status')
1742 self.xml.get_object('sync_with_global_status_checkbutton2').set_active(st)
1743
1744 st = gajim.config.get_per('accounts', gajim.ZEROCONF_ACC_NAME,
1745 'use_custom_host')
1746 self.xml.get_object('custom_port_checkbutton2').set_active(st)
1747 self.xml.get_object('custom_port_entry2').set_sensitive(st)
1748
1749 st = gajim.config.get_per('accounts', gajim.ZEROCONF_ACC_NAME,
1750 'custom_port')
1751 if not st:
1752 gajim.config.set_per('accounts', gajim.ZEROCONF_ACC_NAME,
1753 'custom_port', '5298')
1754 st = '5298'
1755 self.xml.get_object('custom_port_entry2').set_text(str(st))
1756
1757
1758 gpg_key_label = self.xml.get_object('gpg_key_label2')
1759 if gajim.ZEROCONF_ACC_NAME in gajim.connections and \
1760 gajim.connections[gajim.ZEROCONF_ACC_NAME].gpg:
1761 self.xml.get_object('gpg_choose_button2').set_sensitive(True)
1762 self.init_account_gpg()
1763 else:
1764 gpg_key_label.set_text(_('OpenPGP is not usable on this computer'))
1765 self.xml.get_object('gpg_choose_button2').set_sensitive(False)
1766
1767 for opt in ('first_name', 'last_name', 'jabber_id', 'email'):
1768 st = gajim.config.get_per('accounts', gajim.ZEROCONF_ACC_NAME,
1769 'zeroconf_' + opt)
1770 self.xml.get_object(opt + '_entry2').set_text(st)
1771
1773 account = self.current_account
1774 keyid = gajim.config.get_per('accounts', account, 'keyid')
1775 keyname = gajim.config.get_per('accounts', account, 'keyname')
1776 use_gpg_agent = gajim.config.get('use_gpg_agent')
1777
1778 if account == gajim.ZEROCONF_ACC_NAME:
1779 widget_name_add = '2'
1780 else:
1781 widget_name_add = '1'
1782
1783 gpg_key_label = self.xml.get_object('gpg_key_label' + widget_name_add)
1784 gpg_name_label = self.xml.get_object('gpg_name_label' + widget_name_add)
1785 use_gpg_agent_checkbutton = self.xml.get_object(
1786 'use_gpg_agent_checkbutton' + widget_name_add)
1787
1788 if not keyid:
1789 use_gpg_agent_checkbutton.set_sensitive(False)
1790 gpg_key_label.set_text(_('No key selected'))
1791 gpg_name_label.set_text('')
1792 return
1793
1794 gpg_key_label.set_text(keyid)
1795 gpg_name_label.set_text(keyname)
1796 use_gpg_agent_checkbutton.set_sensitive(True)
1797 use_gpg_agent_checkbutton.set_active(use_gpg_agent)
1798
1800 account = self.current_account
1801 self.ignore_events = True
1802 active = gajim.config.get_per('accounts', account, 'active')
1803 self.xml.get_object('enable_checkbutton1').set_active(active)
1804 self.xml.get_object('normal_notebook1').set_sensitive(active)
1805 if gajim.config.get_per('accounts', account, 'anonymous_auth'):
1806 self.xml.get_object('anonymous_checkbutton1').set_active(True)
1807 self.xml.get_object('jid_label1').set_text(_('Server:'))
1808 save_password = self.xml.get_object('save_password_checkbutton1')
1809 save_password.set_active(False)
1810 save_password.set_sensitive(False)
1811 password_entry = self.xml.get_object('password_entry1')
1812 password_entry.set_text('')
1813 password_entry.set_sensitive(False)
1814 jid = gajim.config.get_per('accounts', account, 'hostname')
1815 else:
1816 self.xml.get_object('anonymous_checkbutton1').set_active(False)
1817 self.xml.get_object('jid_label1').set_text(_('Jabber ID:'))
1818 savepass = gajim.config.get_per('accounts', account, 'savepass')
1819 save_password = self.xml.get_object('save_password_checkbutton1')
1820 save_password.set_sensitive(True)
1821 save_password.set_active(savepass)
1822 password_entry = self.xml.get_object('password_entry1')
1823 if savepass:
1824 passstr = passwords.get_password(account) or ''
1825 password_entry.set_sensitive(True)
1826 else:
1827 passstr = ''
1828 password_entry.set_sensitive(False)
1829 password_entry.set_text(passstr)
1830
1831 jid = gajim.config.get_per('accounts', account, 'name') \
1832 + '@' + gajim.config.get_per('accounts', account, 'hostname')
1833 self.xml.get_object('jid_entry1').set_text(jid)
1834 self.ignore_events = False
1835
1837 account = self.current_account
1838
1839 self.draw_normal_jid()
1840 self.xml.get_object('resource_entry1').set_text(gajim.config.get_per(
1841 'accounts', account, 'resource'))
1842
1843 client_cert = gajim.config.get_per('accounts', account, 'client_cert')
1844 self.xml.get_object('cert_entry1').set_text(client_cert)
1845
1846 self.xml.get_object('adjust_priority_with_status_checkbutton1').\
1847 set_active(gajim.config.get_per('accounts', account,
1848 'adjust_priority_with_status'))
1849 spinbutton = self.xml.get_object('priority_spinbutton1')
1850 if gajim.config.get('enable_negative_priority'):
1851 spinbutton.set_range(-128, 127)
1852 else:
1853 spinbutton.set_range(0, 127)
1854 spinbutton.set_value(gajim.config.get_per('accounts', account,
1855 'priority'))
1856
1857
1858 use_env_http_proxy = gajim.config.get_per('accounts', account,
1859 'use_env_http_proxy')
1860 self.xml.get_object('use_env_http_proxy_checkbutton1').set_active(
1861 use_env_http_proxy)
1862 self.xml.get_object('proxy_hbox1').set_sensitive(not use_env_http_proxy)
1863
1864 warn_when_insecure_ssl = gajim.config.get_per('accounts', account,
1865 'warn_when_insecure_ssl_connection')
1866 self.xml.get_object('warn_when_insecure_connection_checkbutton1').\
1867 set_active(warn_when_insecure_ssl)
1868
1869 self.xml.get_object('send_keepalive_checkbutton1').set_active(
1870 gajim.config.get_per('accounts', account, 'keep_alives_enabled'))
1871
1872 use_custom_host = gajim.config.get_per('accounts', account,
1873 'use_custom_host')
1874 self.xml.get_object('custom_host_port_checkbutton1').set_active(
1875 use_custom_host)
1876 custom_host = gajim.config.get_per('accounts', account, 'custom_host')
1877 if not custom_host:
1878 custom_host = gajim.config.get_per('accounts', account, 'hostname')
1879 gajim.config.set_per('accounts', account, 'custom_host', custom_host)
1880 self.xml.get_object('custom_host_entry1').set_text(custom_host)
1881 custom_port = gajim.config.get_per('accounts', account, 'custom_port')
1882 if not custom_port:
1883 custom_port = 5222
1884 gajim.config.set_per('accounts', account, 'custom_port', custom_port)
1885 self.xml.get_object('custom_port_entry1').set_text(unicode(custom_port))
1886
1887
1888 gpg_key_label = self.xml.get_object('gpg_key_label1')
1889 if gajim.HAVE_GPG:
1890 self.xml.get_object('gpg_choose_button1').set_sensitive(True)
1891 self.init_account_gpg()
1892 else:
1893 gpg_key_label.set_text(_('OpenPGP is not usable on this computer'))
1894 self.xml.get_object('gpg_choose_button1').set_sensitive(False)
1895
1896
1897 self.xml.get_object('autoconnect_checkbutton1').set_active(gajim.config.\
1898 get_per('accounts', account, 'autoconnect'))
1899 self.xml.get_object('autoreconnect_checkbutton1').set_active(gajim.
1900 config.get_per('accounts', account, 'autoreconnect'))
1901
1902 list_no_log_for = gajim.config.get_per('accounts', account,
1903 'no_log_for').split()
1904 if account in list_no_log_for:
1905 self.xml.get_object('log_history_checkbutton1').set_active(False)
1906 else:
1907 self.xml.get_object('log_history_checkbutton1').set_active(True)
1908
1909 self.xml.get_object('sync_with_global_status_checkbutton1').set_active(
1910 gajim.config.get_per('accounts', account, 'sync_with_global_status'))
1911 self.xml.get_object('use_ft_proxies_checkbutton1').set_active(
1912 gajim.config.get_per('accounts', account, 'use_ft_proxies'))
1913
1923
1961 if win_opened:
1962 dialogs.ConfirmationDialog(
1963 _('You have opened chat in account %s') % account,
1964 _('All chat and groupchat windows will be closed. Do you want to '
1965 'continue?'),
1966 on_response_ok = (remove, account))
1967 else:
1968 remove(account)
1969
2071
2072 title = _('Rename Account')
2073 message = _('Enter a new name for account %s') % self.current_account
2074 old_text = self.current_account
2075 dialogs.InputDialog(title, message, old_text, is_modal=False,
2076 ok_handler=(on_renamed, self.current_account))
2077
2081
2082 - def on_jid_entry1_focus_out_event(self, widget, event):
2083 if self.ignore_events:
2084 return
2085 jid = widget.get_text()
2086
2087 try:
2088 jid = helpers.parse_jid(jid)
2089 except helpers.InvalidFormat, s:
2090 if not widget.is_focus():
2091 pritext = _('Invalid Jabber ID')
2092 dialogs.ErrorDialog(pritext, str(s))
2093 gobject.idle_add(lambda: widget.grab_focus())
2094 return True
2095
2096 jid_splited = jid.split('@', 1)
2097 if len(jid_splited) != 2 and not gajim.config.get_per('accounts',
2098 self.current_account, 'anonymous_auth'):
2099 if not widget.is_focus():
2100 pritext = _('Invalid Jabber ID')
2101 sectext = _('A Jabber ID must be in the form "user@servername".')
2102 dialogs.ErrorDialog(pritext, sectext)
2103 gobject.idle_add(lambda: widget.grab_focus())
2104 return True
2105
2106
2107 if gajim.config.get_per('accounts', self.current_account,
2108 'anonymous_auth'):
2109 gajim.config.set_per('accounts', self.current_account, 'hostname',
2110 jid_splited[0])
2111 if self.option_changed('hostname', jid_splited[0]):
2112 self.need_relogin = True
2113 else:
2114 if self.option_changed('name', jid_splited[0]) or \
2115 self.option_changed('hostname', jid_splited[1]):
2116 self.need_relogin = True
2117
2118 gajim.config.set_per('accounts', self.current_account, 'name',
2119 jid_splited[0])
2120 gajim.config.set_per('accounts', self.current_account, 'hostname',
2121 jid_splited[1])
2122
2123 - def on_cert_entry1_focus_out_event(self, widget, event):
2124 if self.ignore_events:
2125 return
2126 client_cert = widget.get_text()
2127 if self.option_changed('client_cert', client_cert):
2128 self.need_relogin = True
2129 gajim.config.set_per('accounts', self.current_account, 'client_cert',
2130 client_cert)
2131
2139
2141 if self.ignore_events:
2142 return
2143 passwords.save_password(self.current_account, widget.get_text().decode(
2144 'utf-8'))
2145
2158
2160 if self.ignore_events:
2161 return
2162 resource = self.xml.get_object('resource_entry1').get_text().decode(
2163 'utf-8')
2164 try:
2165 resource = helpers.parse_resource(resource)
2166 except helpers.InvalidFormat, s:
2167 if not widget.is_focus():
2168 pritext = _('Invalid Jabber ID')
2169 dialogs.ErrorDialog(pritext, str(s))
2170 gobject.idle_add(lambda: widget.grab_focus())
2171 return True
2172
2173 if self.option_changed('resource', resource):
2174 self.need_relogin = True
2175
2176 gajim.config.set_per('accounts', self.current_account, 'resource',
2177 resource)
2178
2184
2192
2199
2207
2208 try:
2209 dialogs.ChangePasswordDialog(self.current_account, on_changed)
2210 except GajimGeneralException:
2211
2212 return
2213
2219
2225
2227 if self.ignore_events:
2228 return
2229 list_no_log_for = gajim.config.get_per('accounts', self.current_account,
2230 'no_log_for').split()
2231 if self.current_account in list_no_log_for:
2232 list_no_log_for.remove(self.current_account)
2233
2234 if not widget.get_active():
2235 list_no_log_for.append(self.current_account)
2236 gajim.config.set_per('accounts', self.current_account, 'no_log_for',
2237 ' '.join(list_no_log_for))
2238
2245
2251
2259
2261 active = widget.get_active()
2262 proxy = widget.get_model()[active][0].decode('utf-8')
2263 if proxy == _('None'):
2264 proxy = ''
2265
2266 if self.option_changed('proxy', proxy):
2267 self.need_relogin = True
2268
2269 gajim.config.set_per('accounts', self.current_account, 'proxy', proxy)
2270
2276
2283
2291
2300
2302 if self.ignore_events:
2303 return
2304 host = widget.get_text().decode('utf-8')
2305 if self.option_changed('custom_host', host):
2306 self.need_relogin = True
2307 gajim.config.set_per('accounts', self.current_account, 'custom_host',
2308 host)
2309
2311 if self.ignore_events:
2312 return
2313 custom_port = widget.get_text()
2314 try:
2315 custom_port = int(custom_port)
2316 except Exception:
2317 if not widget.is_focus():
2318 dialogs.ErrorDialog(_('Invalid entry'),
2319 _('Custom port must be a port number.'))
2320 gobject.idle_add(lambda: widget.grab_focus())
2321 return True
2322 if self.option_changed('custom_port', custom_port):
2323 self.need_relogin = True
2324 gajim.config.set_per('accounts', self.current_account, 'custom_port',
2325 custom_port)
2326
2374
2375 dialogs.ChooseGPGKeyDialog(_('OpenPGP Key Selection'),
2376 _('Choose your OpenPGP key'), secret_keys, on_key_selected)
2377
2380
2401
2413
2421
2452
2497
2534
2558
2566
2568 if self.ignore_events:
2569 return
2570 name = widget.get_text().decode('utf-8')
2571 if self.option_changed('zeroconf_first_name', name):
2572 self.need_relogin = True
2573 gajim.config.set_per('accounts', self.current_account,
2574 'zeroconf_first_name', name)
2575
2577 if self.ignore_events:
2578 return
2579 name = widget.get_text().decode('utf-8')
2580 if self.option_changed('zeroconf_last_name', name):
2581 self.need_relogin = True
2582 gajim.config.set_per('accounts', self.current_account,
2583 'zeroconf_last_name', name)
2584
2586 if self.ignore_events:
2587 return
2588 id_ = widget.get_text().decode('utf-8')
2589 if self.option_changed('zeroconf_jabber_id', id_):
2590 self.need_relogin = True
2591 gajim.config.set_per('accounts', self.current_account,
2592 'zeroconf_jabber_id', id_)
2593
2594 - def on_email_entry2_changed(self, widget):
2595 if self.ignore_events:
2596 return
2597 email = widget.get_text().decode('utf-8')
2598 if self.option_changed('zeroconf_email', email):
2599 self.need_relogin = True
2600 gajim.config.set_per('accounts', self.current_account,
2601 'zeroconf_email', email)
2602
2650
2652 """
2653 Class for Service registration window. Window that appears when we want to
2654 subscribe to a service if is_form we use dataforms_widget else we use
2655 service_registarion_window
2656 """
2657 - def __init__(self, service, infos, account, is_form):
2658 self.service = service
2659 self.account = account
2660 self.is_form = is_form
2661 self.xml = gtkgui_helpers.get_gtk_builder('service_registration_window.ui')
2662 self.window = self.xml.get_object('service_registration_window')
2663 self.window.set_transient_for(gajim.interface.roster.window)
2664 if self.is_form:
2665 dataform = dataforms.ExtendForm(node = infos)
2666 self.data_form_widget = dataforms_widget.DataFormWidget(dataform)
2667 if self.data_form_widget.title:
2668 self.window.set_title('%s - Gajim' % self.data_form_widget.title)
2669 table = self.xml.get_object('table')
2670 table.attach(self.data_form_widget, 0, 2, 0, 1)
2671 else:
2672 if 'registered' in infos:
2673 self.window.set_title(_('Edit %s') % service)
2674 else:
2675 self.window.set_title(_('Register to %s') % service)
2676 self.data_form_widget = FakeDataForm(infos)
2677 table = self.xml.get_object('table')
2678 table.attach(self.data_form_widget, 0, 2, 0, 1)
2679
2680 self.xml.connect_signals(self)
2681 self.window.show_all()
2682
2685
2701
2703
2704 - def __init__(self, account, room_jid, form = None):
2705 self.account = account
2706 self.room_jid = room_jid
2707 self.form = form
2708 self.remove_button = {}
2709 self.affiliation_treeview = {}
2710 self.start_users_dict = {}
2711 self.affiliation_labels = {'outcast': _('Ban List'),
2712 'member': _('Member List'),
2713 'owner': _('Owner List'),
2714 'admin':_('Administrator List')}
2715
2716 self.xml = gtkgui_helpers.get_gtk_builder('data_form_window.ui', 'data_form_window')
2717 self.window = self.xml.get_object('data_form_window')
2718 self.window.set_transient_for(gajim.interface.roster.window)
2719
2720 if self.form:
2721 config_vbox = self.xml.get_object('config_vbox')
2722 dataform = dataforms.ExtendForm(node = self.form)
2723 self.data_form_widget = dataforms_widget.DataFormWidget(dataform)
2724
2725
2726 sw = self.data_form_widget.xml.get_object('single_form_scrolledwindow')
2727 sw.set_policy(gtk.POLICY_NEVER, gtk.POLICY_NEVER)
2728
2729 self.data_form_widget.show()
2730 config_vbox.pack_start(self.data_form_widget)
2731
2732
2733 add_on_vbox = self.xml.get_object('add_on_vbox')
2734
2735 for affiliation in self.affiliation_labels.keys():
2736 self.start_users_dict[affiliation] = {}
2737 hbox = gtk.HBox(spacing = 5)
2738 add_on_vbox.pack_start(hbox, False)
2739
2740 label = gtk.Label(self.affiliation_labels[affiliation])
2741 hbox.pack_start(label, False)
2742
2743 bb = gtk.HButtonBox()
2744 bb.set_layout(gtk.BUTTONBOX_END)
2745 bb.set_spacing(5)
2746 hbox.pack_start(bb)
2747 add_button = gtk.Button(stock = gtk.STOCK_ADD)
2748 add_button.connect('clicked', self.on_add_button_clicked, affiliation)
2749 bb.pack_start(add_button)
2750 self.remove_button[affiliation] = gtk.Button(stock = gtk.STOCK_REMOVE)
2751 self.remove_button[affiliation].set_sensitive(False)
2752 self.remove_button[affiliation].connect('clicked',
2753 self.on_remove_button_clicked, affiliation)
2754 bb.pack_start(self.remove_button[affiliation])
2755
2756 liststore = gtk.ListStore(str, str, str, str)
2757 self.affiliation_treeview[affiliation] = gtk.TreeView(liststore)
2758 self.affiliation_treeview[affiliation].get_selection().set_mode(
2759 gtk.SELECTION_MULTIPLE)
2760 self.affiliation_treeview[affiliation].connect('cursor-changed',
2761 self.on_affiliation_treeview_cursor_changed, affiliation)
2762 renderer = gtk.CellRendererText()
2763 col = gtk.TreeViewColumn(_('JID'), renderer)
2764 col.add_attribute(renderer, 'text', 0)
2765 col.set_resizable(True)
2766 col.set_sort_column_id(0)
2767 self.affiliation_treeview[affiliation].append_column(col)
2768
2769 if affiliation == 'outcast':
2770 renderer = gtk.CellRendererText()
2771 renderer.set_property('editable', True)
2772 renderer.connect('edited', self.on_cell_edited)
2773 col = gtk.TreeViewColumn(_('Reason'), renderer)
2774 col.add_attribute(renderer, 'text', 1)
2775 col.set_resizable(True)
2776 col.set_sort_column_id(1)
2777 self.affiliation_treeview[affiliation].append_column(col)
2778 elif affiliation == 'member':
2779 renderer = gtk.CellRendererText()
2780 col = gtk.TreeViewColumn(_('Nick'), renderer)
2781 col.add_attribute(renderer, 'text', 2)
2782 col.set_resizable(True)
2783 col.set_sort_column_id(2)
2784 self.affiliation_treeview[affiliation].append_column(col)
2785 renderer = gtk.CellRendererText()
2786 col = gtk.TreeViewColumn(_('Role'), renderer)
2787 col.add_attribute(renderer, 'text', 3)
2788 col.set_resizable(True)
2789 col.set_sort_column_id(3)
2790 self.affiliation_treeview[affiliation].append_column(col)
2791
2792 sw = gtk.ScrolledWindow()
2793 sw.set_policy(gtk.POLICY_AUTOMATIC, gtk.POLICY_NEVER)
2794 sw.add(self.affiliation_treeview[affiliation])
2795 add_on_vbox.pack_start(sw)
2796 gajim.connections[self.account].get_affiliation_list(self.room_jid,
2797 affiliation)
2798
2799 self.xml.connect_signals(self)
2800 self.window.show_all()
2801
2804
2806 model = self.affiliation_treeview['outcast'].get_model()
2807 new_text = new_text.decode('utf-8')
2808 iter_ = model.get_iter(path)
2809 model[iter_][1] = new_text
2810
2837 dialogs.InputDialog(title, prompt, ok_handler=on_ok)
2838
2851
2853 self.remove_button[affiliation].set_sensitive(True)
2854
2856 """
2857 Fill the affiliation treeview
2858 """
2859 for jid in users_dict:
2860 affiliation = users_dict[jid]['affiliation']
2861 if affiliation not in self.affiliation_labels.keys():
2862
2863 continue
2864 self.start_users_dict[affiliation][jid] = users_dict[jid]
2865 tv = self.affiliation_treeview[affiliation]
2866 model = tv.get_model()
2867 reason = users_dict[jid].get('reason', '')
2868 nick = users_dict[jid].get('nick', '')
2869 role = users_dict[jid].get('role', '')
2870 model.append((jid, reason, nick, role))
2871
2874
2904
2905
2963
2964 if self.account in gajim.connections and \
2965 gajim.connections[self.account].connected:
2966 dialogs.ConfirmationDialog(
2967 _('Account "%s" is connected to the server') % self.account,
2968 _('If you remove it, the connection will be lost.'),
2969 on_response_ok=remove)
2970 else:
2971 remove()
2972
2976
3024
3025
3028 self.xml = gtkgui_helpers.get_gtk_builder('manage_bookmarks_window.ui')
3029 self.window = self.xml.get_object('manage_bookmarks_window')
3030 self.window.set_transient_for(gajim.interface.roster.window)
3031
3032
3033
3034 self.treestore = gtk.TreeStore(str, str, str, bool, bool, str, str, str)
3035 self.treestore.set_sort_column_id(1, gtk.SORT_ASCENDING)
3036
3037
3038 for account in gajim.connections:
3039 if gajim.connections[account].connected <= 1:
3040 continue
3041 if gajim.connections[account].is_zeroconf:
3042 continue
3043 if not gajim.connections[account].private_storage_supported:
3044 continue
3045 iter_ = self.treestore.append(None, [None, account, None, None,
3046 None, None, None, None])
3047
3048 for bookmark in gajim.connections[account].bookmarks:
3049 if bookmark['name'] == '':
3050
3051
3052 name = bookmark['jid'].split("@")[0]
3053 bookmark['name'] = name
3054
3055
3056 autojoin = helpers.from_xs_boolean_to_python_boolean(
3057 bookmark['autojoin'])
3058
3059 minimize = helpers.from_xs_boolean_to_python_boolean(
3060 bookmark['minimize'])
3061
3062 print_status = bookmark.get('print_status', '')
3063 if print_status not in ('', 'all', 'in_and_out', 'none'):
3064 print_status = ''
3065 self.treestore.append(iter_, [
3066 account,
3067 bookmark['name'],
3068 bookmark['jid'],
3069 autojoin,
3070 minimize,
3071 bookmark['password'],
3072 bookmark['nick'],
3073 print_status ])
3074
3075 self.print_status_combobox = self.xml.get_object('print_status_combobox')
3076 model = gtk.ListStore(str, str)
3077
3078 self.option_list = {'': _('Default'), 'all': Q_('?print_status:All'),
3079 'in_and_out': _('Enter and leave only'),
3080 'none': Q_('?print_status:None')}
3081 opts = sorted(self.option_list.keys())
3082 for opt in opts:
3083 model.append([self.option_list[opt], opt])
3084
3085 self.print_status_combobox.set_model(model)
3086 self.print_status_combobox.set_active(1)
3087
3088 self.view = self.xml.get_object('bookmarks_treeview')
3089 self.view.set_model(self.treestore)
3090 self.view.expand_all()
3091
3092 renderer = gtk.CellRendererText()
3093 column = gtk.TreeViewColumn('Bookmarks', renderer, text=1)
3094 self.view.append_column(column)
3095
3096 self.selection = self.view.get_selection()
3097 self.selection.connect('changed', self.bookmark_selected)
3098
3099
3100 self.title_entry = self.xml.get_object('title_entry')
3101 self.title_entry.connect('changed', self.on_title_entry_changed)
3102 self.nick_entry = self.xml.get_object('nick_entry')
3103 self.nick_entry.connect('changed', self.on_nick_entry_changed)
3104 self.server_entry = self.xml.get_object('server_entry')
3105 self.server_entry.connect('changed', self.on_server_entry_changed)
3106 self.room_entry = self.xml.get_object('room_entry')
3107 self.room_entry.connect('changed', self.on_room_entry_changed)
3108 self.pass_entry = self.xml.get_object('pass_entry')
3109 self.pass_entry.connect('changed', self.on_pass_entry_changed)
3110 self.autojoin_checkbutton = self.xml.get_object('autojoin_checkbutton')
3111 self.minimize_checkbutton = self.xml.get_object('minimize_checkbutton')
3112
3113 self.xml.connect_signals(self)
3114 self.window.show_all()
3115
3125
3128
3155
3170
3172 """
3173 Check if all neccessary fields are entered correctly
3174 """
3175 (model, iter_) = self.selection.get_selected()
3176
3177 if not model.iter_parent(iter_):
3178
3179 return
3180
3181 if self.server_entry.get_text().decode('utf-8') == '' or \
3182 self.room_entry.get_text().decode('utf-8') == '':
3183 dialogs.ErrorDialog(_('This bookmark has invalid data'),
3184 _('Please be sure to fill out server and room fields or remove this'
3185 ' bookmark.'))
3186 return False
3187
3188 return True
3189
3220
3223
3225 """
3226 Fill in the bookmark's data into the fields.
3227 """
3228 (model, iter_) = selection.get_selected()
3229
3230 if not iter_:
3231
3232
3233 return
3234
3235 widgets = [ self.title_entry, self.nick_entry, self.room_entry,
3236 self.server_entry, self.pass_entry, self.autojoin_checkbutton,
3237 self.minimize_checkbutton, self.print_status_combobox]
3238
3239 if model.iter_parent(iter_):
3240
3241 for field in widgets:
3242 field.set_sensitive(True)
3243 else:
3244
3245
3246 self.clear_fields()
3247 for field in widgets:
3248 field.set_sensitive(False)
3249 return
3250
3251
3252 self.title_entry.set_text(model[iter_][1])
3253 room_jid = model[iter_][2].decode('utf-8')
3254 try:
3255 (room, server) = room_jid.split('@')
3256 except ValueError:
3257
3258 room = ''
3259 server = ''
3260 self.room_entry.set_text(room)
3261 self.server_entry.set_text(server)
3262
3263 self.autojoin_checkbutton.set_active(model[iter_][3])
3264 self.minimize_checkbutton.set_active(model[iter_][4])
3265
3266 self.minimize_checkbutton.set_sensitive(model[iter_][3])
3267
3268 if model[iter_][5] is not None:
3269 password = model[iter_][5].decode('utf-8')
3270 else:
3271 password = None
3272
3273 if password:
3274 self.pass_entry.set_text(password)
3275 else:
3276 self.pass_entry.set_text('')
3277 nick = model[iter_][6]
3278 if nick:
3279 nick = nick.decode('utf-8')
3280 self.nick_entry.set_text(nick)
3281 else:
3282 self.nick_entry.set_text('')
3283
3284 print_status = model[iter_][7]
3285 opts = sorted(self.option_list.keys())
3286 self.print_status_combobox.set_active(opts.index(print_status))
3287
3288 - def on_title_entry_changed(self, widget):
3289 (model, iter_) = self.selection.get_selected()
3290 if iter_:
3291 if model.iter_parent(iter_):
3292
3293 model[iter_][1] = self.title_entry.get_text()
3294
3295 - def on_nick_entry_changed(self, widget):
3296 (model, iter_) = self.selection.get_selected()
3297 if iter_:
3298 nick = self.nick_entry.get_text().decode('utf-8')
3299 try:
3300 nick = helpers.parse_resource(nick)
3301 except helpers.InvalidFormat, e:
3302 dialogs.ErrorDialog(_('Invalid nickname'),
3303 _('Character not allowed'))
3304 self.nick_entry.set_text(model[iter_][6])
3305 return True
3306 model[iter_][6] = nick
3307
3308 - def on_server_entry_changed(self, widget):
3309 (model, iter_) = self.selection.get_selected()
3310 if iter_:
3311 room_jid = self.room_entry.get_text().decode('utf-8').strip() + '@' + \
3312 self.server_entry.get_text().decode('utf-8').strip()
3313 try:
3314 room_jid = helpers.parse_resource(room_jid)
3315 except helpers.InvalidFormat, e:
3316 dialogs.ErrorDialog(_('Invalid server'),
3317 _('Character not allowed'))
3318 self.server_entry.set_text(model[iter_][2].split('@')[1])
3319 return True
3320 model[iter_][2] = room_jid
3321
3322 - def on_room_entry_changed(self, widget):
3323 (model, iter_) = self.selection.get_selected()
3324 if iter_:
3325 room_jid = self.room_entry.get_text().decode('utf-8').strip() + '@' + \
3326 self.server_entry.get_text().decode('utf-8').strip()
3327 try:
3328 room_jid = helpers.parse_resource(room_jid)
3329 except helpers.InvalidFormat, e:
3330 dialogs.ErrorDialog(_('Invalid room'),
3331 _('Character not allowed'))
3332 self.room_entry.set_text(model[iter_][2].split('@')[0])
3333 return True
3334 model[iter_][2] = room_jid
3335
3336 - def on_pass_entry_changed(self, widget):
3337 (model, iter_) = self.selection.get_selected()
3338 if iter_:
3339 model[iter_][5] = self.pass_entry.get_text()
3340
3346
3351
3353 active = widget.get_active()
3354 model = widget.get_model()
3355 print_status = model[active][1]
3356 (model2, iter_) = self.selection.get_selected()
3357 if iter_:
3358 model2[iter_][7] = print_status
3359
3361 widgets = [ self.title_entry, self.nick_entry, self.room_entry,
3362 self.server_entry, self.pass_entry ]
3363 for field in widgets:
3364 field.set_text('')
3365 self.autojoin_checkbutton.set_active(False)
3366 self.minimize_checkbutton.set_active(False)
3367 self.print_status_combobox.set_active(1)
3368
3371 self.xml = gtkgui_helpers.get_gtk_builder(
3372 'account_creation_wizard_window.ui')
3373 self.window = self.xml.get_object('account_creation_wizard_window')
3374 self.window.set_transient_for(gajim.interface.roster.window)
3375
3376 completion = gtk.EntryCompletion()
3377 completion1 = gtk.EntryCompletion()
3378
3379 server_comboboxentry = self.xml.get_object('server_comboboxentry')
3380 entry = server_comboboxentry.child
3381 entry.connect('key_press_event',
3382 self.on_server_comboboxentry_key_press_event, server_comboboxentry)
3383 entry.set_completion(completion)
3384
3385 server_comboboxentry1 = self.xml.get_object('server_comboboxentry1')
3386 entry = server_comboboxentry1.child
3387 entry.set_completion(completion1)
3388
3389 self.update_proxy_list()
3390
3391
3392 servers_xml = os.path.join(gajim.DATA_DIR, 'other', 'servers.xml')
3393 servers = gtkgui_helpers.parse_server_xml(servers_xml)
3394 servers_model = gtk.ListStore(str, int)
3395 for server in servers:
3396 if not server[2]['hidden']:
3397 servers_model.append((str(server[0]), int(server[1])))
3398
3399 completion.set_model(servers_model)
3400 completion.set_text_column(0)
3401 completion1.set_model(servers_model)
3402 completion1.set_text_column(0)
3403
3404
3405 server_comboboxentry.set_model(servers_model)
3406 server_comboboxentry.set_text_column(0)
3407 server_comboboxentry1.set_model(servers_model)
3408 server_comboboxentry1.set_text_column(0)
3409
3410
3411 self.notebook = self.xml.get_object('notebook')
3412 self.cancel_button = self.xml.get_object('cancel_button')
3413 self.back_button = self.xml.get_object('back_button')
3414 self.forward_button = self.xml.get_object('forward_button')
3415 self.finish_button = self.xml.get_object('finish_button')
3416 self.advanced_button = self.xml.get_object('advanced_button')
3417 self.finish_label = self.xml.get_object('finish_label')
3418 self.go_online_checkbutton = self.xml.get_object(
3419 'go_online_checkbutton')
3420 self.show_vcard_checkbutton = self.xml.get_object(
3421 'show_vcard_checkbutton')
3422 self.progressbar = self.xml.get_object('progressbar')
3423
3424
3425 self.update_progressbar_timeout_id = None
3426
3427 self.notebook.set_current_page(0)
3428 self.xml.connect_signals(self)
3429 self.window.show_all()
3430 gajim.ged.register_event_handler('NEW_ACC_CONNECTED', ged.CORE,
3431 self.new_acc_connected)
3432 gajim.ged.register_event_handler('NEW_ACC_NOT_CONNECTED', ged.CORE,
3433 self.new_acc_not_connected)
3434 gajim.ged.register_event_handler('ACC_OK', ged.CORE, self.acc_is_ok)
3435 gajim.ged.register_event_handler('ACC_NOT_OK', ged.CORE,
3436 self.acc_is_not_ok)
3437
3439 page = self.notebook.get_current_page()
3440 if page in (4, 5) and self.account in gajim.connections:
3441
3442
3443 del gajim.connections[self.account]
3444 if self.account in gajim.config.get_per('accounts'):
3445 gajim.config.del_per('accounts', self.account)
3446 gajim.ged.remove_event_handler('NEW_ACC_CONNECTED', ged.CORE,
3447 self.new_acc_connected)
3448 gajim.ged.remove_event_handler('NEW_ACC_NOT_CONNECTED', ged.CORE,
3449 self.new_acc_not_connected)
3450 gajim.ged.remove_event_handler('ACC_OK', ged.CORE, self.acc_is_ok)
3451 gajim.ged.remove_event_handler('ACC_NOT_OK', ged.CORE,
3452 self.acc_is_not_ok)
3453 del gajim.interface.instances['account_creation_wizard']
3454
3458
3461
3464
3484
3491
3492 - def show_finish_page(self):
3493 self.cancel_button.hide()
3494 self.back_button.hide()
3495 self.forward_button.hide()
3496 if self.modify:
3497 finish_text = '<big><b>%s</b></big>\n\n%s' % (
3498 _('Account has been added successfully'),
3499 _('You can set advanced account options by pressing the '
3500 'Advanced button, or later by choosing the Accounts menu item '
3501 'under the Edit menu from the main window.'))
3502 else:
3503 finish_text = '<big><b>%s</b></big>\n\n%s' % (
3504 _('Your new account has been created successfully'),
3505 _('You can set advanced account options by pressing the '
3506 'Advanced button, or later by choosing the Accounts menu item '
3507 'under the Edit menu from the main window.'))
3508 self.finish_label.set_markup(finish_text)
3509 self.finish_button.show()
3510 self.finish_button.set_property('has-default', True)
3511 self.advanced_button.show()
3512 self.go_online_checkbutton.show()
3513 img = self.xml.get_object('finish_image')
3514 if self.modify:
3515 img.set_from_stock(gtk.STOCK_APPLY, gtk.ICON_SIZE_DIALOG)
3516 else:
3517 path_to_file = gtkgui_helpers.get_icon_path('gajim', 48)
3518 img.set_from_file(path_to_file)
3519 self.show_vcard_checkbutton.set_active(not self.modify)
3520 self.notebook.set_current_page(6)
3521
3665
3667 proxies_combobox = self.xml.get_object('proxies_combobox')
3668 model = gtk.ListStore(str)
3669 proxies_combobox.set_model(model)
3670 l = gajim.config.get_per('proxies')
3671 l.insert(0, _('None'))
3672 for i in xrange(len(l)):
3673 model.append([l[i]])
3674 proxies_combobox.set_active(0)
3675
3682
3686
3688 self.progressbar.pulse()
3689 return True
3690
3692 """
3693 Connection to server succeded, present the form to the user
3694 """
3695
3696 if account != self.account:
3697 return
3698 form, is_form, ssl_msg, ssl_err, ssl_cert, ssl_fingerprint = array
3699 if self.update_progressbar_timeout_id is not None:
3700 gobject.source_remove(self.update_progressbar_timeout_id)
3701 self.back_button.show()
3702 self.forward_button.show()
3703 self.is_form = is_form
3704 if is_form:
3705 dataform = dataforms.ExtendForm(node = form)
3706 self.data_form_widget = dataforms_widget.DataFormWidget(dataform)
3707 else:
3708 self.data_form_widget = FakeDataForm(form)
3709 self.data_form_widget.show_all()
3710 self.xml.get_object('form_vbox').pack_start(self.data_form_widget)
3711 self.ssl_fingerprint = ssl_fingerprint
3712 self.ssl_cert = ssl_cert
3713 if ssl_msg:
3714
3715 hostname = gajim.connections[self.account].new_account_info['hostname']
3716 self.xml.get_object('ssl_label').set_markup(_(
3717 '<b>Security Warning</b>'
3718 '\n\nThe authenticity of the %(hostname)s SSL certificate could'
3719 ' be invalid.\nSSL Error: %(error)s\n'
3720 'Do you still want to connect to this server?') % {
3721 'hostname': hostname, 'error': ssl_msg})
3722 if ssl_err in (18, 27):
3723 text = _('Add this certificate to the list of trusted '
3724 'certificates.\nSHA1 fingerprint of the certificate:\n%s') \
3725 % ssl_fingerprint
3726 self.xml.get_object('ssl_checkbutton').set_label(text)
3727 else:
3728 self.xml.get_object('ssl_checkbutton').set_no_show_all(True)
3729 self.xml.get_object('ssl_checkbutton').hide()
3730 self.notebook.set_current_page(3)
3731 else:
3732 self.notebook.set_current_page(4)
3733
3735 """
3736 Account creation failed: connection to server failed
3737 """
3738
3739 if account != self.account:
3740 return
3741 if self.account not in gajim.connections:
3742 return
3743 if self.update_progressbar_timeout_id is not None:
3744 gobject.source_remove(self.update_progressbar_timeout_id)
3745 del gajim.connections[self.account]
3746 if self.account in gajim.config.get_per('accounts'):
3747 gajim.config.del_per('accounts', self.account)
3748 self.back_button.show()
3749 self.cancel_button.show()
3750 self.go_online_checkbutton.hide()
3751 self.show_vcard_checkbutton.hide()
3752 img = self.xml.get_object('finish_image')
3753 img.set_from_stock(gtk.STOCK_DIALOG_ERROR, gtk.ICON_SIZE_DIALOG)
3754 finish_text = '<big><b>%s</b></big>\n\n%s' % (
3755 _('An error occurred during account creation'), reason)
3756 self.finish_label.set_markup(finish_text)
3757 self.notebook.set_current_page(6)
3758
3760 """
3761 Account creation succeeded
3762 """
3763
3764 if account != self.account:
3765 return
3766 self.create_vars(config)
3767 self.show_finish_page()
3768
3769 if self.update_progressbar_timeout_id is not None:
3770 gobject.source_remove(self.update_progressbar_timeout_id)
3771
3773 """
3774 Account creation failed
3775 """
3776
3777 if account != self.account:
3778 return
3779 self.back_button.show()
3780 self.cancel_button.show()
3781 self.go_online_checkbutton.hide()
3782 self.show_vcard_checkbutton.hide()
3783 del gajim.connections[self.account]
3784 if self.account in gajim.config.get_per('accounts'):
3785 gajim.config.del_per('accounts', self.account)
3786 img = self.xml.get_object('finish_image')
3787 img.set_from_stock(gtk.STOCK_DIALOG_ERROR, gtk.ICON_SIZE_DIALOG)
3788 finish_text = '<big><b>%s</b></big>\n\n%s' % (_(
3789 'An error occurred during account creation'), reason)
3790 self.finish_label.set_markup(finish_text)
3791 self.notebook.set_current_page(6)
3792
3793 if self.update_progressbar_timeout_id is not None:
3794 gobject.source_remove(self.update_progressbar_timeout_id)
3795
3803
3812
3814
3815 if event.keyval == gtk.keysyms.at:
3816 combobox = self.xml.get_object('server_comboboxentry')
3817 combobox.grab_focus()
3818 combobox.child.set_position(-1)
3819 return True
3820
3821 - def on_server_comboboxentry_key_press_event(self, widget, event, combobox):
3822
3823 backspace = event.keyval == gtk.keysyms.BackSpace
3824 empty = len(combobox.get_active_text()) == 0
3825 if backspace and empty and self.modify:
3826 username_entry = self.xml.get_object('username_entry')
3827 username_entry.grab_focus()
3828 username_entry.set_position(-1)
3829 return True
3830
3831 - def get_config(self, login, server, savepass, password, anonymous=False):
3832 config = {}
3833 config['name'] = login
3834 config['hostname'] = server
3835 config['savepass'] = savepass
3836 config['password'] = password
3837 config['resource'] = 'Gajim'
3838 config['anonymous_auth'] = anonymous
3839 config['priority'] = 5
3840 config['autoconnect'] = True
3841 config['no_log_for'] = ''
3842 config['sync_with_global_status'] = True
3843 config['proxy'] = ''
3844 config['usessl'] = False
3845 config['use_custom_host'] = False
3846 config['custom_port'] = 0
3847 config['custom_host'] = ''
3848 config['keyname'] = ''
3849 config['keyid'] = ''
3850 return config
3851
3852 - def save_account(self, login, server, savepass, password, anonymous=False):
3867
3869 gajim.config.add_per('accounts', self.account)
3870
3871 if not config['savepass']:
3872 config['password'] = ''
3873
3874 for opt in config:
3875 gajim.config.set_per('accounts', self.account, opt, config[opt])
3876
3877
3878 gajim.interface.instances[self.account] = {'infos': {}, 'disco': {},
3879 'gc_config': {}, 'search': {}, 'online_dialog': {}}
3880 gajim.interface.minimized_controls[self.account] = {}
3881 gajim.connections[self.account].connected = 0
3882 gajim.connections[self.account].keepalives = gajim.config.get_per(
3883 'accounts', self.account, 'keep_alive_every_foo_secs')
3884 gajim.groups[self.account] = {}
3885 gajim.contacts.add_account(self.account)
3886 gajim.gc_connected[self.account] = {}
3887 gajim.automatic_rooms[self.account] = {}
3888 gajim.newly_added[self.account] = []
3889 gajim.to_be_removed[self.account] = []
3890 gajim.nicks[self.account] = config['name']
3891 gajim.block_signed_in_notifications[self.account] = True
3892 gajim.sleeper_state[self.account] = 'off'
3893 gajim.encrypted_chats[self.account] = []
3894 gajim.last_message_time[self.account] = {}
3895 gajim.status_before_autoaway[self.account] = ''
3896 gajim.transport_avatar[self.account] = {}
3897 gajim.gajim_optional_features[self.account] = []
3898 gajim.caps_hash[self.account] = ''
3899
3900 if 'accounts' in gajim.interface.instances:
3901 gajim.interface.instances['accounts'].init_accounts()
3902
3903 if len(gajim.connections) >= 2:
3904
3905 gajim.interface.roster.regroup = gajim.config.get('mergeaccounts')
3906 else:
3907 gajim.interface.roster.regroup = False
3908 gajim.interface.roster.setup_and_draw_roster()
3909 gajim.interface.roster.set_actions_menu_needs_rebuild()
3910 gajim.interface.save_config()
3911
3926
3930
3933
3935 self.xml.get_object('configure_button').set_sensitive(True)
3936 self.xml.get_object('delete_button').set_sensitive(True)
3937
3939 self.treeview = self.xml.get_object('services_treeview')
3940
3941 self.treestore = gtk.ListStore(str)
3942 self.treeview.set_model(self.treestore)
3943
3944 col = gtk.TreeViewColumn('Service')
3945 self.treeview.append_column(col)
3946
3947 cellrenderer_text = gtk.CellRendererText()
3948 col.pack_start(cellrenderer_text)
3949 col.add_attribute(cellrenderer_text, 'text', 0)
3950
3951 our_jid = gajim.get_jid_from_account(self.account)
3952 gajim.connections[self.account].discoverItems(our_jid)
3953
3955 our_jid = gajim.get_jid_from_account(self.account)
3956 for item in items:
3957 if 'jid' in item and item['jid'] == our_jid and 'node' in item:
3958 self.treestore.append([item['node']])
3959
3961 model = self.treeview.get_model()
3962 iter_ = model.get_iter_root()
3963 while iter_:
3964 if model[iter_][0] == node:
3965 model.remove(iter_)
3966 break
3967 iter_ = model.get_iter_next(iter_)
3968
3977
3986
3987 - def config(self, node, form):
3992 window = dialogs.DataFormWindow(form, (on_ok, node))
3993 title = "Configure %s" % node
3994 window.set_title(title)
3995 window.show_all()
3996
3999 self.xml = gtkgui_helpers.get_gtk_builder('manage_sounds_window.ui')
4000 self.window = self.xml.get_object('manage_sounds_window')
4001
4002
4003 self.sound_tree = self.xml.get_object('sounds_treeview')
4004
4005
4006 model = gtk.ListStore(bool, str, str, str)
4007 self.sound_tree.set_model(model)
4008
4009 col = gtk.TreeViewColumn(_('Active'))
4010 self.sound_tree.append_column(col)
4011 renderer = gtk.CellRendererToggle()
4012 renderer.set_property('activatable', True)
4013 renderer.connect('toggled', self.sound_toggled_cb)
4014 col.pack_start(renderer)
4015 col.set_attributes(renderer, active = 0)
4016
4017 col = gtk.TreeViewColumn(_('Event'))
4018 self.sound_tree.append_column(col)
4019 renderer = gtk.CellRendererText()
4020 col.pack_start(renderer)
4021 col.set_attributes(renderer, text = 1)
4022
4023 self.fill_sound_treeview()
4024
4025 self.xml.connect_signals(self)
4026
4027 self.sound_tree.get_model().connect('row-changed',
4028 self.on_sounds_treemodel_row_changed)
4029
4030 self.window.show_all()
4031
4039
4041 model = self.sound_tree.get_model()
4042 model[path][0] = not model[path][0]
4043
4045 model = self.sound_tree.get_model()
4046 model.clear()
4047 model.set_sort_column_id(1, gtk.SORT_ASCENDING)
4048
4049
4050
4051 sounds_dict = {
4052 'first_message_received': _('First Message Received'),
4053 'next_message_received_focused': _('Next Message Received Focused'),
4054 'next_message_received_unfocused':
4055 _('Next Message Received Unfocused'),
4056 'contact_connected': _('Contact Connected'),
4057 'contact_disconnected': _('Contact Disconnected'),
4058 'message_sent': _('Message Sent'),
4059 'muc_message_highlight': _('Group Chat Message Highlight'),
4060 'muc_message_received': _('Group Chat Message Received'),
4061 'gmail_received': _('GMail Email Received')
4062 }
4063
4064 for sound_event_config_name, sound_ui_name in sounds_dict.items():
4065 enabled = gajim.config.get_per('soundevents',
4066 sound_event_config_name, 'enabled')
4067 path = gajim.config.get_per('soundevents',
4068 sound_event_config_name, 'path')
4069 model.append((enabled, sound_ui_name, path, sound_event_config_name))
4070
4072 (model, iter_) = self.sound_tree.get_selection().get_selected()
4073 sounds_entry = self.xml.get_object('sounds_entry')
4074 if not iter_:
4075 sounds_entry.set_text('')
4076 return
4077 path_to_snd_file = model[iter_][2]
4078 sounds_entry.set_text(path_to_snd_file)
4079
4099
4100 def on_cancel(widget):
4101 self.dialog.destroy()
4102
4103 path_to_snd_file = model[iter_][2].decode('utf-8')
4104 self.dialog = dialogs.SoundChooserDialog(path_to_snd_file, on_ok,
4105 on_cancel)
4106
4107 - def on_sounds_entry_changed(self, widget):
4108 path_to_snd_file = widget.get_text()
4109 model, iter_ = self.sound_tree.get_selection().get_selected()
4110 model[iter_][2] = path_to_snd_file
4111
4118
4121
4123 self.window.hide()
4124 return True
4125