Module config
[hide private]
[frames] | no frames]

Source Code for Module config

   1  # -*- coding:utf-8 -*- 
   2  ## src/config.py 
   3  ## 
   4  ## Copyright (C) 2003-2005 Vincent Hanquez <tab AT snarc.org> 
   5  ## Copyright (C) 2003-2010 Yann Leboulanger <asterix AT lagaule.org> 
   6  ## Copyright (C) 2005 Alex Podaras <bigpod AT gmail.com> 
   7  ##                    Stéphan Kochen <stephan AT kochen.nl> 
   8  ## Copyright (C) 2005-2006 Dimitur Kirov <dkirov AT gmail.com> 
   9  ##                         Nikos Kouremenos <kourem AT gmail.com> 
  10  ## Copyright (C) 2006 Junglecow J <junglecow AT gmail.com> 
  11  ## Copyright (C) 2006-2007 Travis Shirk <travis AT pobox.com> 
  12  ##                         Stefan Bethge <stefan AT lanpartei.de> 
  13  ## Copyright (C) 2006-2008 Jean-Marie Traissard <jim AT lapin.org> 
  14  ## Copyright (C) 2007 James Newton <redshodan AT gmail.com> 
  15  ##                    Julien Pivotto <roidelapluie AT gmail.com> 
  16  ## Copyright (C) 2007-2008 Stephan Erb <steve-e AT h3c.de> 
  17  ## Copyright (C) 2008 Jonathan Schleifer <js-gajim AT webkeks.org> 
  18  ## 
  19  ## This file is part of Gajim. 
  20  ## 
  21  ## Gajim is free software; you can redistribute it and/or modify 
  22  ## it under the terms of the GNU General Public License as published 
  23  ## by the Free Software Foundation; version 3 only. 
  24  ## 
  25  ## Gajim is distributed in the hope that it will be useful, 
  26  ## but WITHOUT ANY WARRANTY; without even the implied warranty of 
  27  ## MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 
  28  ## GNU General Public License for more details. 
  29  ## 
  30  ## You should have received a copy of the GNU General Public License 
  31  ## along with Gajim. If not, see <http://www.gnu.org/licenses/>. 
  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  #---------- PreferencesWindow class -------------# 
73 -class PreferencesWindow:
74 """ 75 Class for Preferences window 76 """ 77
78 - def on_preferences_window_destroy(self, widget):
79 """ 80 Close window 81 """ 82 del gajim.interface.instances['preferences']
83
84 - def on_close_button_clicked(self, widget):
85 self.window.destroy()
86
87 - def __init__(self):
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 ### General tab ### 116 # Display avatars in roster 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 # Display status msg under contact name in roster 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 # Display mood in roster 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 # Display activity in roster 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 # Display tunes in roster 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 # Display location in roster 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 # Sort contacts by show 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 # emoticons 153 emoticons_combobox = self.xml.get_object('emoticons_combobox') 154 emoticons_list = os.listdir(os.path.join(gajim.DATA_DIR, 'emoticons')) 155 # user themes 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 # Set default for single window type 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 # Compact View 187 st = gajim.config.get('compact_view') 188 self.xml.get_object('compact_view_checkbutton').set_active(st) 189 190 # Ignore XHTML 191 st = gajim.config.get('ignore_incoming_xhtml') 192 self.xml.get_object('xhtml_checkbutton').set_active(st) 193 194 # use speller 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 ### Style tab ### 202 # Themes 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 # iconset 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 # new model, image in 0, string in 1 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 # Use transports iconsets 247 st = gajim.config.get('use_transports_iconsets') 248 self.xml.get_object('transports_iconsets_checkbutton').set_active(st) 249 250 # Color widgets 251 self.draw_color_widgets() 252 253 # Font for messages 254 font = gajim.config.get('conversation_font') 255 # try to set default font for the current desktop env 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 ### Personal Events tab ### 264 # outgoing send chat state notifications 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: # disabled 272 combo.set_active(2) 273 274 # displayed send chat state notifications 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: # disabled 282 combo.set_active(2) 283 284 285 ### Notifications tab ### 286 # On new event 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 # notify on online statuses 296 st = gajim.config.get('notify_on_signin') 297 self.notify_on_signin_checkbutton.set_active(st) 298 299 # notify on offline statuses 300 st = gajim.config.get('notify_on_signout') 301 self.notify_on_signout_checkbutton.set_active(st) 302 303 # autopopupaway 304 st = gajim.config.get('autopopupaway') 305 self.auto_popup_away_checkbutton.set_active(st) 306 307 # sounddnd 308 st = gajim.config.get('sounddnd') 309 self.sound_dnd_checkbutton.set_active(st) 310 311 # Systray 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 # sounds 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 # Notify user of new gmail e-mail messages, 327 # make checkbox sensitive if user has a gtalk account 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 #### Status tab ### 344 # Autoaway 345 st = gajim.config.get('autoaway') 346 self.auto_away_checkbutton.set_active(st) 347 348 # Autoawaytime 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 # autoaway message 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 # Autoxa 359 st = gajim.config.get('autoxa') 360 self.auto_xa_checkbutton.set_active(st) 361 362 # Autoxatime 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 # autoxa message 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 # ask_status when online / offline 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 # Default Status messages 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 # (status, translated_status, message, enabled) 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 # Status messages 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 ### Audio / Video tab ### 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 # STUN 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 ### Advanced tab ### 485 # open links with 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 # else autodetect_browser_mailer is False. 499 # so user has 'Always Use GNOME/KDE/Xfce' or Custom 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 # log status changes of contacts 518 st = gajim.config.get('log_contact_status_changes') 519 self.xml.get_object('log_show_changes_checkbutton').set_active(st) 520 521 # log encrypted chat sessions 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 # send os info 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 # send idle time 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 # check if gajm is default 546 st = gajim.config.get('check_if_gajim_is_default') 547 self.xml.get_object('check_default_client_checkbutton').set_active(st) 548 549 # Ignore messages from unknown contacts 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
574 - def on_preferences_window_key_press_event(self, widget, event):
575 if event.keyval == gtk.keysyms.Escape: 576 self.window.hide()
577
578 - def get_per_account_option(self, opt):
579 """ 580 Return the value of the option opt if it's the same in all accounts else 581 returns "mixed" 582 """ 583 if len(gajim.connections) == 0: 584 # a non existant key return default value 585 return gajim.config.get_per('accounts', '__default__', opt) 586 val = None 587 for account in gajim.connections: 588 v = gajim.config.get_per('accounts', account, opt) 589 if val is None: 590 val = v 591 elif val != v: 592 return 'mixed' 593 return val
594
595 - def on_checkbutton_toggled(self, widget, config_name, 596 change_sensitivity_widgets=None):
597 gajim.config.set(config_name, widget.get_active()) 598 if change_sensitivity_widgets: 599 for w in change_sensitivity_widgets: 600 w.set_sensitive(widget.get_active()) 601 gajim.interface.save_config()
602
603 - def on_per_account_checkbutton_toggled(self, widget, config_name, 604 change_sensitivity_widgets=None):
605 for account in gajim.connections: 606 gajim.config.set_per('accounts', account, config_name, 607 widget.get_active()) 608 if change_sensitivity_widgets: 609 for w in change_sensitivity_widgets: 610 w.set_sensitive(widget.get_active()) 611 gajim.interface.save_config()
612
613 - def _get_all_controls(self):
614 for ctrl in gajim.interface.msg_win_mgr.get_controls(): 615 yield ctrl 616 for account in gajim.connections: 617 for ctrl in gajim.interface.minimized_controls[account].values(): 618 yield ctrl
619
620 - def _get_all_muc_controls(self):
621 for ctrl in gajim.interface.msg_win_mgr.get_controls( 622 message_control.TYPE_GC): 623 yield ctrl 624 for account in gajim.connections: 625 for ctrl in gajim.interface.minimized_controls[account].values(): 626 yield ctrl
627
628 - def on_sort_by_show_in_roster_checkbutton_toggled(self, widget):
629 self.on_checkbutton_toggled(widget, 'sort_by_show_in_roster') 630 gajim.interface.roster.setup_and_draw_roster()
631
632 - def on_sort_by_show_in_muc_checkbutton_toggled(self, widget):
633 self.on_checkbutton_toggled(widget, 'sort_by_show_in_muc') 634 # Redraw groupchats 635 for ctrl in self._get_all_muc_controls(): 636 ctrl.draw_roster()
637
638 - def on_show_avatars_in_roster_checkbutton_toggled(self, widget):
639 self.on_checkbutton_toggled(widget, 'show_avatars_in_roster') 640 gajim.interface.roster.setup_and_draw_roster() 641 # Redraw groupchats (in an ugly way) 642 for ctrl in self._get_all_muc_controls(): 643 ctrl.draw_roster()
644
645 - def on_show_status_msgs_in_roster_checkbutton_toggled(self, widget):
646 self.on_checkbutton_toggled(widget, 'show_status_msgs_in_roster') 647 gajim.interface.roster.setup_and_draw_roster() 648 for ctrl in self._get_all_muc_controls(): 649 ctrl.update_ui()
650
651 - def on_show_mood_in_roster_checkbutton_toggled(self, widget):
652 self.on_checkbutton_toggled(widget, 'show_mood_in_roster') 653 gajim.interface.roster.setup_and_draw_roster()
654
655 - def on_show_activity_in_roster_checkbutton_toggled(self, widget):
656 self.on_checkbutton_toggled(widget, 'show_activity_in_roster') 657 gajim.interface.roster.setup_and_draw_roster()
658
659 - def on_show_tunes_in_roster_checkbutton_toggled(self, widget):
660 self.on_checkbutton_toggled(widget, 'show_tunes_in_roster') 661 gajim.interface.roster.setup_and_draw_roster()
662
663 - def on_show_location_in_roster_checkbutton_toggled(self, widget):
664 self.on_checkbutton_toggled(widget, 'show_location_in_roster') 665 gajim.interface.roster.setup_and_draw_roster()
666
667 - def on_emoticons_combobox_changed(self, widget):
668 active = widget.get_active() 669 model = widget.get_model() 670 emot_theme = model[active][0].decode('utf-8') 671 if emot_theme == _('Disabled'): 672 gajim.config.set('emoticons_theme', '') 673 else: 674 gajim.config.set('emoticons_theme', emot_theme) 675 676 gajim.interface.init_emoticons(need_reload = True) 677 gajim.interface.make_regexps() 678 self.toggle_emoticons()
679
680 - def toggle_emoticons(self):
681 """ 682 Update emoticons state in Opened Chat Windows 683 """ 684 for ctrl in self._get_all_controls(): 685 ctrl.toggle_emoticons()
686
687 - def on_one_window_type_combo_changed(self, widget):
688 active = widget.get_active() 689 config_type = common.config.opt_one_window_types[active] 690 gajim.config.set('one_message_window', config_type) 691 gajim.interface.save_config() 692 gajim.interface.msg_win_mgr.reconfig()
693
694 - def on_compact_view_checkbutton_toggled(self, widget):
695 active = widget.get_active() 696 for ctrl in self._get_all_controls(): 697 ctrl.chat_buttons_set_visible(active) 698 gajim.config.set('compact_view', active) 699 gajim.interface.save_config()
700
701 - def on_xhtml_checkbutton_toggled(self, widget):
702 self.on_checkbutton_toggled(widget, 'ignore_incoming_xhtml') 703 helpers.update_optional_features()
704
705 - def apply_speller(self):
706 for ctrl in self._get_all_controls(): 707 if isinstance(ctrl, chat_control.ChatControlBase): 708 try: 709 spell_obj = gtkspell.get_from_text_view(ctrl.msg_textview) 710 except (TypeError, RuntimeError, OSError): 711 spell_obj = None 712 713 if not spell_obj: 714 ctrl.set_speller()
715
716 - def remove_speller(self):
717 for ctrl in self._get_all_controls(): 718 if isinstance(ctrl, chat_control.ChatControlBase): 719 try: 720 spell_obj = gtkspell.get_from_text_view(ctrl.msg_textview) 721 except (TypeError, RuntimeError): 722 spell_obj = None 723 if spell_obj: 724 spell_obj.detach()
725
726 - def on_speller_checkbutton_toggled(self, widget):
727 active = widget.get_active() 728 gajim.config.set('use_speller', active) 729 gajim.interface.save_config() 730 if active: 731 lang = gajim.config.get('speller_language') 732 if not lang: 733 lang = gajim.LANG 734 tv = gtk.TextView() 735 try: 736 gtkspell.Spell(tv, lang) 737 except (TypeError, RuntimeError, OSError): 738 dialogs.ErrorDialog( 739 _('Dictionary for lang %s not available') % lang, 740 _('You have to install %s dictionary to use spellchecking, or ' 741 'choose another language by setting the speller_language option.' 742 ) % lang) 743 gajim.config.set('use_speller', False) 744 widget.set_active(False) 745 else: 746 gajim.config.set('speller_language', lang) 747 self.apply_speller() 748 else: 749 self.remove_speller()
750
751 - def on_theme_combobox_changed(self, widget):
752 model = widget.get_model() 753 active = widget.get_active() 754 config_theme = model[active][0].decode('utf-8').replace(' ', '_') 755 756 gajim.config.set('roster_theme', config_theme) 757 758 # begin repainting themed widgets throughout 759 gajim.interface.roster.repaint_themed_widgets() 760 gajim.interface.roster.change_roster_style(None) 761 gajim.interface.save_config()
762
763 - def update_theme_list(self):
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
775 - def on_manage_theme_button_clicked(self, widget):
776 if self.theme_preferences is None: 777 self.theme_preferences = dialogs.GajimThemesWindow() 778 else: 779 self.theme_preferences.window.present() 780 self.theme_preferences.select_active_theme()
781
782 - def on_iconset_combobox_changed(self, widget):
783 model = widget.get_model() 784 active = widget.get_active() 785 icon_string = model[active][1].decode('utf-8') 786 gajim.config.set('iconset', icon_string) 787 gtkgui_helpers.reload_jabber_state_images() 788 gajim.interface.save_config()
789
790 - def on_transports_iconsets_checkbutton_toggled(self, widget):
791 self.on_checkbutton_toggled(widget, 'use_transports_iconsets') 792 gtkgui_helpers.reload_jabber_state_images()
793
794 - def on_outgoing_chat_states_combobox_changed(self, widget):
795 active = widget.get_active() 796 old_value = gajim.config.get('outgoing_chat_state_notifications') 797 if active == 0: # all 798 gajim.config.set('outgoing_chat_state_notifications', 'all') 799 elif active == 1: # only composing 800 gajim.config.set('outgoing_chat_state_notifications', 'composing_only') 801 else: # disabled 802 gajim.config.set('outgoing_chat_state_notifications', 'disabled') 803 new_value = gajim.config.get('outgoing_chat_state_notifications') 804 if 'disabled' in (old_value, new_value): 805 # we changed from disabled to sth else or vice versa 806 helpers.update_optional_features()
807
808 - def on_displayed_chat_states_combobox_changed(self, widget):
809 active = widget.get_active() 810 if active == 0: # all 811 gajim.config.set('displayed_chat_state_notifications', 'all') 812 elif active == 1: # only composing 813 gajim.config.set('displayed_chat_state_notifications', 814 'composing_only') 815 else: # disabled 816 gajim.config.set('displayed_chat_state_notifications', 'disabled')
817
818 - def on_ignore_events_from_unknown_contacts_checkbutton_toggled(self, widget):
819 widget.set_inconsistent(False) 820 self.on_per_account_checkbutton_toggled(widget, 'ignore_unknown_contacts')
821
822 - def on_on_event_combobox_changed(self, widget):
823 active = widget.get_active() 824 if active == 0: 825 gajim.config.set('autopopup', True) 826 gajim.config.set('notify_on_new_message', False) 827 elif active == 1: 828 gajim.config.set('autopopup', False) 829 gajim.config.set('notify_on_new_message', True) 830 else: 831 gajim.config.set('autopopup', False) 832 gajim.config.set('notify_on_new_message', False)
833
834 - def on_notify_on_signin_checkbutton_toggled(self, widget):
835 self.on_checkbutton_toggled(widget, 'notify_on_signin')
836
837 - def on_notify_on_signout_checkbutton_toggled(self, widget):
838 self.on_checkbutton_toggled(widget, 'notify_on_signout')
839
840 - def on_auto_popup_away_checkbutton_toggled(self, widget):
841 self.on_checkbutton_toggled(widget, 'autopopupaway')
842
843 - def on_sound_dnd_checkbutton_toggled(self, widget):
844 self.on_checkbutton_toggled(widget, 'sounddnd')
845
846 - def on_systray_combobox_changed(self, widget):
847 active = widget.get_active() 848 if active == 0: 849 gajim.config.set('trayicon', 'never') 850 gajim.interface.systray_enabled = False 851 gajim.interface.systray.hide_icon() 852 elif active == 1: 853 gajim.config.set('trayicon', 'on_event') 854 gajim.interface.systray_enabled = True 855 gajim.interface.systray.show_icon() 856 gajim.interface.systray.set_img() 857 else: 858 gajim.config.set('trayicon', 'always') 859 gajim.interface.systray_enabled = True 860 gajim.interface.systray.show_icon() 861 gajim.interface.systray.set_img()
862
863 - def on_advanced_notifications_button_clicked(self, widget):
864 dialogs.AdvancedNotificationsWindow()
865
866 - def on_play_sounds_checkbutton_toggled(self, widget):
867 self.on_checkbutton_toggled(widget, 'sounds_on', 868 [self.xml.get_object('manage_sounds_button')])
869
870 - def on_manage_sounds_button_clicked(self, widget):
871 if self.sounds_preferences is None: 872 self.sounds_preferences = ManageSoundsWindow() 873 else: 874 self.sounds_preferences.window.present()
875
876 - def update_text_tags(self):
877 """ 878 Update color tags in opened chat windows 879 """ 880 for ctrl in self._get_all_controls(): 881 ctrl.update_tags()
882
883 - def on_preference_widget_color_set(self, widget, text):
884 color = widget.get_color() 885 color_string = gtkgui_helpers.make_color_string(color) 886 gajim.config.set(text, color_string) 887 self.update_text_tags() 888 gajim.interface.save_config()
889
890 - def on_preference_widget_font_set(self, widget, text):
891 if widget: 892 font = widget.get_font_name() 893 else: 894 font = '' 895 gajim.config.set(text, font) 896 self.update_text_font() 897 gajim.interface.save_config()
898
899 - def update_text_font(self):
900 """ 901 Update text font in opened chat windows 902 """ 903 for ctrl in self._get_all_controls(): 904 ctrl.update_font()
905
906 - def on_incoming_nick_colorbutton_color_set(self, widget):
907 self.on_preference_widget_color_set(widget, 'inmsgcolor')
908
909 - def on_outgoing_nick_colorbutton_color_set(self, widget):
910 self.on_preference_widget_color_set(widget, 'outmsgcolor')
911
912 - def on_incoming_msg_colorbutton_color_set(self, widget):
913 self.on_preference_widget_color_set(widget, 'inmsgtxtcolor')
914
915 - def on_outgoing_msg_colorbutton_color_set(self, widget):
916 self.on_preference_widget_color_set(widget, 'outmsgtxtcolor')
917
918 - def on_url_msg_colorbutton_color_set(self, widget):
919 self.on_preference_widget_color_set(widget, 'urlmsgcolor')
920
921 - def on_status_msg_colorbutton_color_set(self, widget):
922 self.on_preference_widget_color_set(widget, 'statusmsgcolor')
923
924 - def on_conversation_fontbutton_font_set(self, widget):
925 self.on_preference_widget_font_set(widget, 'conversation_font')
926
927 - def on_default_chat_font_toggled(self, widget):
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
936 - def draw_color_widgets(self):
937 col_to_widget = {'inmsgcolor': 'incoming_nick_colorbutton', 938 'outmsgcolor': 'outgoing_nick_colorbutton', 939 'inmsgtxtcolor': ['incoming_msg_colorbutton', 940 'incoming_msg_checkbutton'], 941 'outmsgtxtcolor': ['outgoing_msg_colorbutton', 942 'outgoing_msg_checkbutton'], 943 'statusmsgcolor': 'status_msg_colorbutton', 944 'urlmsgcolor': 'url_msg_colorbutton'} 945 for c in col_to_widget: 946 col = gajim.config.get(c) 947 if col: 948 if isinstance(col_to_widget[c], list): 949 self.xml.get_object(col_to_widget[c][0]).set_color( 950 gtk.gdk.color_parse(col)) 951 self.xml.get_object(col_to_widget[c][0]).set_sensitive(True) 952 self.xml.get_object(col_to_widget[c][1]).set_active(True) 953 else: 954 self.xml.get_object(col_to_widget[c]).set_color( 955 gtk.gdk.color_parse(col)) 956 else: 957 if isinstance(col_to_widget[c], list): 958 self.xml.get_object(col_to_widget[c][0]).set_color( 959 gtk.gdk.color_parse('#000000')) 960 self.xml.get_object(col_to_widget[c][0]).set_sensitive(False) 961 self.xml.get_object(col_to_widget[c][1]).set_active(False) 962 else: 963 self.xml.get_object(col_to_widget[c]).set_color( 964 gtk.gdk.color_parse('#000000'))
965
966 - def on_reset_colors_button_clicked(self, widget):
967 col_to_widget = {'inmsgcolor': 'incoming_nick_colorbutton', 968 'outmsgcolor': 'outgoing_nick_colorbutton', 969 'inmsgtxtcolor': 'incoming_msg_colorbutton', 970 'outmsgtxtcolor': 'outgoing_msg_colorbutton', 971 'statusmsgcolor': 'status_msg_colorbutton', 972 'urlmsgcolor': 'url_msg_colorbutton'} 973 for c in col_to_widget: 974 gajim.config.set(c, gajim.interface.default_colors[c]) 975 self.draw_color_widgets() 976 977 self.update_text_tags() 978 gajim.interface.save_config()
979
980 - def _set_color(self, state, widget_name, option):
981 """ 982 Set color value in prefs and update the UI 983 """ 984 if state: 985 color = self.xml.get_object(widget_name).get_color() 986 color_string = gtkgui_helpers.make_color_string(color) 987 else: 988 color_string = '' 989 gajim.config.set(option, color_string) 990 gajim.interface.save_config()
991
992 - def on_incoming_msg_checkbutton_toggled(self, widget):
993 state = widget.get_active() 994 self.xml.get_object('incoming_msg_colorbutton').set_sensitive(state) 995 self._set_color(state, 'incoming_msg_colorbutton', 'inmsgtxtcolor')
996
997 - def on_outgoing_msg_checkbutton_toggled(self, widget):
998 state = widget.get_active() 999 self.xml.get_object('outgoing_msg_colorbutton').set_sensitive(state) 1000 self._set_color(state, 'outgoing_msg_colorbutton', 'outmsgtxtcolor')
1001
1002 - def on_auto_away_checkbutton_toggled(self, widget):
1003 self.on_checkbutton_toggled(widget, 'autoaway', 1004 [self.auto_away_time_spinbutton, self.auto_away_message_entry])
1005
1006 - def on_auto_away_time_spinbutton_value_changed(self, widget):
1007 aat = widget.get_value_as_int() 1008 gajim.config.set('autoawaytime', aat) 1009 gajim.interface.sleeper = common.sleepy.Sleepy( 1010 gajim.config.get('autoawaytime') * 60, 1011 gajim.config.get('autoxatime') * 60) 1012 gajim.interface.save_config()
1013
1014 - def on_auto_away_message_entry_changed(self, widget):
1015 gajim.config.set('autoaway_message', widget.get_text().decode('utf-8'))
1016
1017 - def on_auto_xa_checkbutton_toggled(self, widget):
1018 self.on_checkbutton_toggled(widget, 'autoxa', 1019 [self.auto_xa_time_spinbutton, self.auto_xa_message_entry])
1020
1021 - def on_auto_xa_time_spinbutton_value_changed(self, widget):
1022 axt = widget.get_value_as_int() 1023 gajim.config.set('autoxatime', axt) 1024 gajim.interface.sleeper = common.sleepy.Sleepy( 1025 gajim.config.get('autoawaytime') * 60, 1026 gajim.config.get('autoxatime') * 60) 1027 gajim.interface.save_config()
1028
1029 - def on_auto_xa_message_entry_changed(self, widget):
1030 gajim.config.set('autoxa_message', widget.get_text().decode('utf-8'))
1031
1032 - def on_prompt_online_status_message_checkbutton_toggled(self, widget):
1033 self.on_checkbutton_toggled(widget, 'ask_online_status')
1034
1035 - def on_prompt_offline_status_message_checkbutton_toggled(self, widget):
1036 self.on_checkbutton_toggled(widget, 'ask_offline_status')
1037
1038 - def fill_default_msg_treeview(self):
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
1053 - def on_default_msg_cell_edited(self, cell, row, new_text):
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
1058 - def default_msg_toggled_cb(self, cell, path):
1059 model = self.default_msg_tree.get_model() 1060 model[path][3] = not model[path][3]
1061
1062 - def on_default_msg_treemodel_row_changed(self, model, path, iter_):
1063 status = model[iter_][0] 1064 message = model[iter_][2].decode('utf-8') 1065 message = helpers.to_one_line(message) 1066 gajim.config.set_per('defaultstatusmsg', status, 'enabled', 1067 model[iter_][3]) 1068 gajim.config.set_per('defaultstatusmsg', status, 'message', message)
1069
1070 - def on_default_status_expander_activate(self, expander):
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
1076 - def save_status_messages(self, model):
1077 for msg in gajim.config.get_per('statusmsg'): 1078 gajim.config.del_per('statusmsg', msg) 1079 iter_ = model.get_iter_first() 1080 while iter_: 1081 val = model[iter_][0].decode('utf-8') 1082 if model[iter_][1]: # we have a preset message 1083 if not val: # no title, use message text for title 1084 val = model[iter_][1] 1085 gajim.config.add_per('statusmsg', val) 1086 msg = helpers.to_one_line(model[iter_][1].decode('utf-8')) 1087 gajim.config.set_per('statusmsg', val, 'message', msg) 1088 iter_ = model.iter_next(iter_) 1089 gajim.interface.save_config()
1090
1091 - def on_msg_treemodel_row_changed(self, model, path, iter_):
1092 self.save_status_messages(model)
1093
1094 - def on_msg_treemodel_row_deleted(self, model, path):
1095 self.save_status_messages(model)
1096
1097 - def on_av_combobox_changed(self, combobox, config_name):
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
1103 - def on_audio_input_combobox_changed(self, widget):
1104 self.on_av_combobox_changed(widget, 'audio_input_device')
1105
1106 - def on_audio_output_combobox_changed(self, widget):
1107 self.on_av_combobox_changed(widget, 'audio_output_device')
1108
1109 - def on_video_input_combobox_changed(self, widget):
1110 self.on_av_combobox_changed(widget, 'video_input_device')
1111
1112 - def on_video_output_combobox_changed(self, widget):
1113 self.on_av_combobox_changed(widget, 'video_output_device')
1114
1115 - def on_video_framerate_combobox_changed(self, widget):
1116 self.on_av_combobox_changed(widget, 'video_framerate')
1117
1118 - def on_video_size_combobox_changed(self, widget):
1119 self.on_av_combobox_changed(widget, 'video_size')
1120
1121 - def on_stun_checkbutton_toggled(self, widget):
1122 self.on_checkbutton_toggled(widget, 'use_stun_server', 1123 [self.xml.get_object('stun_server_entry')])
1124
1125 - def stun_server_entry_changed(self, widget):
1126 gajim.config.set('stun_server', widget.get_text().decode('utf-8'))
1127
1128 - def on_applications_combobox_changed(self, widget):
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
1145 - def on_custom_browser_entry_changed(self, widget):
1146 gajim.config.set('custombrowser', widget.get_text().decode('utf-8')) 1147 gajim.interface.save_config()
1148
1149 - def on_custom_mail_client_entry_changed(self, widget):
1150 gajim.config.set('custommailapp', widget.get_text().decode('utf-8')) 1151 gajim.interface.save_config()
1152
1153 - def on_custom_file_manager_entry_changed(self, widget):
1154 gajim.config.set('custom_file_manager', widget.get_text().decode('utf-8')) 1155 gajim.interface.save_config()
1156
1157 - def on_log_show_changes_checkbutton_toggled(self, widget):
1158 self.on_checkbutton_toggled(widget, 'log_contact_status_changes')
1159
1160 - def on_log_encrypted_chats_checkbutton_toggled(self, widget):
1161 widget.set_inconsistent(False) 1162 self.on_per_account_checkbutton_toggled(widget, 'log_encrypted_sessions')
1163
1164 - def on_send_os_info_checkbutton_toggled(self, widget):
1165 widget.set_inconsistent(False) 1166 self.on_per_account_checkbutton_toggled(widget, 'send_os_info')
1167
1168 - def on_send_idle_time_checkbutton_toggled(self, widget):
1169 widget.set_inconsistent(False) 1170 self.on_per_account_checkbutton_toggled(widget, 'send_idle_time')
1171
1172 - def on_check_default_client_checkbutton_toggled(self, widget):
1173 self.on_checkbutton_toggled(widget, 'check_if_gajim_is_default')
1174
1175 - def on_notify_gmail_checkbutton_toggled(self, widget):
1176 self.on_checkbutton_toggled(widget, 'notify_on_new_gmail_email')
1177
1178 - def on_notify_gmail_extra_checkbutton_toggled(self, widget):
1179 self.on_checkbutton_toggled(widget, 'notify_on_new_gmail_email_extra')
1180
1181 - def fill_msg_treeview(self):
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
1197 - def on_msg_cell_edited(self, cell, row, new_text):
1198 model = self.msg_tree.get_model() 1199 iter_ = model.get_iter_from_string(row) 1200 model.set_value(iter_, 0, new_text)
1201
1202 - def on_msg_treeview_cursor_changed(self, widget, data = None):
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
1211 - def on_new_msg_button_clicked(self, widget, data = None):
1212 model = self.msg_tree.get_model() 1213 iter_ = model.append() 1214 model.set(iter_, 0, _('status message title'), 1, _('status message text')) 1215 self.msg_tree.set_cursor(model.get_path(iter_))
1216
1217 - def on_delete_msg_button_clicked(self, widget, data = None):
1218 (model, iter_) = self.msg_tree.get_selection().get_selected() 1219 if not iter_: 1220 return 1221 buf = self.xml.get_object('msg_textview').get_buffer() 1222 model.remove(iter_) 1223 buf.set_text('') 1224 self.xml.get_object('delete_msg_button').set_sensitive(False)
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
1234 - def on_msg_treeview_key_press_event(self, widget, event):
1235 if event.keyval == gtk.keysyms.Delete: 1236 self.on_delete_msg_button_clicked(widget)
1237
1238 - def on_open_advanced_editor_button_clicked(self, widget, data = None):
1239 if 'advanced_config' in gajim.interface.instances: 1240 gajim.interface.instances['advanced_config'].window.present() 1241 else: 1242 gajim.interface.instances['advanced_config'] = \ 1243 dialogs.AdvancedConfigurationWindow()
1244 1245 #---------- ManageProxiesWindow class -------------#
1246 -class ManageProxiesWindow:
1247 - def __init__(self):
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 # hide the BOSH fields by default 1260 self.show_bosh_fields()
1261
1262 - def show_bosh_fields(self, show=True):
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
1276 - def fill_proxies_treeview(self):
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
1285 - def init_list(self):
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
1299 - def on_manage_proxies_window_destroy(self, widget):
1300 if 'accounts' in gajim.interface.instances: 1301 gajim.interface.instances['accounts'].\ 1302 update_proxy_list() 1303 del gajim.interface.instances['manage_proxies']
1304
1305 - def on_add_proxy_button_clicked(self, widget):
1306 model = self.proxies_treeview.get_model() 1307 proxies = gajim.config.get_per('proxies') 1308 i = 1 1309 while ('proxy' + unicode(i)) in proxies: 1310 i += 1 1311 iter_ = model.append() 1312 model.set(iter_, 0, 'proxy' + unicode(i)) 1313 gajim.config.add_per('proxies', 'proxy' + unicode(i)) 1314 self.proxies_treeview.set_cursor(model.get_path(iter_))
1315
1316 - def on_remove_proxy_button_clicked(self, widget):
1317 (model, iter_) = self.proxies_treeview.get_selection().get_selected() 1318 if not iter_: 1319 return 1320 proxy = model[iter_][0].decode('utf-8') 1321 model.remove(iter_) 1322 gajim.config.del_per('proxies', proxy) 1323 self.xml.get_object('remove_proxy_button').set_sensitive(False) 1324 self.block_signal = True 1325 self.on_proxies_treeview_cursor_changed(self.proxies_treeview) 1326 self.block_signal = False
1327
1328 - def on_close_button_clicked(self, widget):
1329 self.window.destroy()
1330
1331 - def on_useauth_checkbutton_toggled(self, widget):
1332 if self.block_signal: 1333 return 1334 act = widget.get_active() 1335 proxy = self.proxyname_entry.get_text().decode('utf-8') 1336 gajim.config.set_per('proxies', proxy, 'useauth', act) 1337 self.xml.get_object('proxyuser_entry').set_sensitive(act) 1338 self.xml.get_object('proxypass_entry').set_sensitive(act)
1339
1340 - def on_boshuseproxy_checkbutton_toggled(self, widget):
1341 if self.block_signal: 1342 return 1343 act = widget.get_active() 1344 proxy = self.proxyname_entry.get_text().decode('utf-8') 1345 gajim.config.set_per('proxies', proxy, 'bosh_useproxy', act) 1346 self.xml.get_object('proxyhost_entry').set_sensitive(act) 1347 self.xml.get_object('proxyport_entry').set_sensitive(act)
1348
1349 - def on_proxies_treeview_cursor_changed(self, widget):
1350 #FIXME: check if off proxy settings are correct (see 1351 # http://trac.gajim.org/changeset/1921#file2 line 1221 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 #boshuseproxy_checkbutton.set_active(False) 1367 #self.on_boshuseproxy_checkbutton_toggled(boshuseproxy_checkbutton) 1368 1369 #useauth_checkbutton.set_active(False) 1370 #self.on_useauth_checkbutton_toggled(useauth_checkbutton) 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'): # special 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
1416 - def on_proxies_treeview_key_press_event(self, widget, event):
1417 if event.keyval == gtk.keysyms.Delete: 1418 self.on_remove_proxy_button_clicked(widget)
1419
1420 - def on_proxyname_entry_changed(self, widget):
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
1440 - def on_proxytype_combobox_changed(self, widget):
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
1449 - def on_proxyhost_entry_changed(self, widget):
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
1456 - def on_proxyport_entry_changed(self, widget):
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
1463 - def on_proxyuser_entry_changed(self, widget):
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
1477 - def on_proxypass_entry_changed(self, widget):
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 #---------- AccountsWindow class -------------#
1486 -class AccountsWindow:
1487 """ 1488 Class for accounts window: list of accounts 1489 """ 1490
1491 - def on_accounts_window_destroy(self, widget):
1492 del gajim.interface.instances['accounts']
1493
1494 - def on_close_button_clicked(self, widget):
1495 self.check_resend_relog() 1496 self.window.destroy()
1497
1498 - def __init__(self):
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 # Name 1510 model = gtk.ListStore(str) 1511 self.accounts_treeview.set_model(model) 1512 # column 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 # When we fill info, we don't want to handle the changed signals 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 # Merge accounts 1529 st = gajim.config.get('mergeaccounts') 1530 checkbutton = self.xml.get_object('merge_checkbutton') 1531 checkbutton.set_active(st) 1532 # prevent roster redraws by connecting the signal after button state is 1533 # set 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
1542 - def on_accounts_window_key_press_event(self, widget, event):
1543 if event.keyval == gtk.keysyms.Escape: 1544 self.check_resend_relog() 1545 self.window.destroy()
1546
1547 - def select_account(self, account):
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
1557 - def init_accounts(self):
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
1570 - def resend(self, account):
1576
1577 - def check_resend_relog(self):
1578 if self.need_relogin and self.current_account == gajim.ZEROCONF_ACC_NAME: 1579 if gajim.ZEROCONF_ACC_NAME in gajim.connections: 1580 gajim.connections[gajim.ZEROCONF_ACC_NAME].update_details() 1581 return 1582 1583 elif self.need_relogin and self.current_account and \ 1584 gajim.connections[self.current_account].connected > 0: 1585 def login(account, show_before, status_before): 1586 """ 1587 Login with previous status 1588 """ 1589 # first make sure connection is really closed, 1590 # 0.5 may not be enough 1591 gajim.connections[account].disconnect(True) 1592 gajim.interface.roster.send_status(account, show_before, 1593 status_before)
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
1620 - def on_accounts_treeview_cursor_changed(self, widget):
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 # We're comming back to our current account, no need to update widgets 1632 return 1633 # Save config for previous account if needed cause focus_out event is 1634 # called after the changed event 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 # Error detected in entry, don't change account, re-put cursor on 1650 # previous row 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
1670 - def on_browse_for_client_cert_button_clicked(self, widget, data=None):
1671 def on_ok(widget, path_to_clientcert_file): 1672 self.dialog.destroy() 1673 if not path_to_clientcert_file: 1674 return 1675 self.xml.get_object('cert_entry1').set_text(path_to_clientcert_file) 1676 gajim.config.set_per('accounts', self.current_account, 1677 'client_cert', path_to_clientcert_file)
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
1686 - def update_proxy_list(self):
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
1705 - def init_account(self):
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
1720 - def init_zeroconf_account(self):
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 # General tab 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 # Personal tab 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
1772 - def init_account_gpg(self):
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
1799 - def draw_normal_jid(self):
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
1836 - def init_normal_account(self):
1837 account = self.current_account 1838 # Account tab 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 # Connection tab 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 # Personal tab 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 # General tab 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
1914 - def on_add_button_clicked(self, widget):
1915 """ 1916 When add button is clicked: open an account information window 1917 """ 1918 if 'account_creation_wizard' in gajim.interface.instances: 1919 gajim.interface.instances['account_creation_wizard'].window.present() 1920 else: 1921 gajim.interface.instances['account_creation_wizard'] = \ 1922 AccountCreationWizardWindow()
1923
1924 - def on_remove_button_clicked(self, widget):
1925 """ 1926 When delete button is clicked: Remove an account from the listStore and 1927 from the config file 1928 """ 1929 if not self.current_account: 1930 return 1931 account = self.current_account 1932 if len(gajim.events.get_events(account)): 1933 dialogs.ErrorDialog(_('Unread events'), 1934 _('Read all pending events before removing this account.')) 1935 return 1936 1937 if gajim.config.get_per('accounts', account, 'is_zeroconf'): 1938 # Should never happen as button is insensitive 1939 return 1940 1941 win_opened = False 1942 if gajim.interface.msg_win_mgr.get_controls(acct=account): 1943 win_opened = True 1944 elif account in gajim.interface.instances: 1945 for key in gajim.interface.instances[account]: 1946 if gajim.interface.instances[account][key] and key != \ 1947 'remove_account': 1948 win_opened = True 1949 break 1950 # Detect if we have opened windows for this account 1951 def remove(account): 1952 if account in gajim.interface.instances and \ 1953 'remove_account' in gajim.interface.instances[account]: 1954 gajim.interface.instances[account]['remove_account'].window.\ 1955 present() 1956 else: 1957 if not account in gajim.interface.instances: 1958 gajim.interface.instances[account] = {} 1959 gajim.interface.instances[account]['remove_account'] = \ 1960 RemoveAccountWindow(account)
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
1970 - def on_rename_button_clicked(self, widget):
1971 if not self.current_account: 1972 return 1973 active = gajim.config.get_per('accounts', self.current_account, 'active') 1974 if active and gajim.connections[self.current_account].connected != 0: 1975 dialogs.ErrorDialog( 1976 _('You are currently connected to the server'), 1977 _('To change the account name, you must be disconnected.')) 1978 return 1979 if len(gajim.events.get_events(self.current_account)): 1980 dialogs.ErrorDialog(_('Unread events'), 1981 _('To change the account name, you must read all pending ' 1982 'events.')) 1983 return 1984 # Get the new name 1985 def on_renamed(new_name, old_name): 1986 if new_name in gajim.connections: 1987 dialogs.ErrorDialog(_('Account Name Already Used'), 1988 _('This name is already used by another of your accounts. ' 1989 'Please choose another name.')) 1990 return 1991 if (new_name == ''): 1992 dialogs.ErrorDialog(_('Invalid account name'), 1993 _('Account name cannot be empty.')) 1994 return 1995 if new_name.find(' ') != -1: 1996 dialogs.ErrorDialog(_('Invalid account name'), 1997 _('Account name cannot contain spaces.')) 1998 return 1999 if active: 2000 # update variables 2001 gajim.interface.instances[new_name] = gajim.interface.instances[ 2002 old_name] 2003 gajim.interface.minimized_controls[new_name] = \ 2004 gajim.interface.minimized_controls[old_name] 2005 gajim.nicks[new_name] = gajim.nicks[old_name] 2006 gajim.block_signed_in_notifications[new_name] = \ 2007 gajim.block_signed_in_notifications[old_name] 2008 gajim.groups[new_name] = gajim.groups[old_name] 2009 gajim.gc_connected[new_name] = gajim.gc_connected[old_name] 2010 gajim.automatic_rooms[new_name] = gajim.automatic_rooms[old_name] 2011 gajim.newly_added[new_name] = gajim.newly_added[old_name] 2012 gajim.to_be_removed[new_name] = gajim.to_be_removed[old_name] 2013 gajim.sleeper_state[new_name] = gajim.sleeper_state[old_name] 2014 gajim.encrypted_chats[new_name] = gajim.encrypted_chats[old_name] 2015 gajim.last_message_time[new_name] = \ 2016 gajim.last_message_time[old_name] 2017 gajim.status_before_autoaway[new_name] = \ 2018 gajim.status_before_autoaway[old_name] 2019 gajim.transport_avatar[new_name] = gajim.transport_avatar[old_name] 2020 gajim.gajim_optional_features[new_name] = \ 2021 gajim.gajim_optional_features[old_name] 2022 gajim.caps_hash[new_name] = gajim.caps_hash[old_name] 2023 2024 gajim.contacts.change_account_name(old_name, new_name) 2025 gajim.events.change_account_name(old_name, new_name) 2026 2027 # change account variable for chat / gc controls 2028 gajim.interface.msg_win_mgr.change_account_name(old_name, new_name) 2029 # upgrade account variable in opened windows 2030 for kind in ('infos', 'disco', 'gc_config', 'search', 2031 'online_dialog'): 2032 for j in gajim.interface.instances[new_name][kind]: 2033 gajim.interface.instances[new_name][kind][j].account = \ 2034 new_name 2035 2036 # ServiceCache object keep old property account 2037 if hasattr(gajim.connections[old_name], 'services_cache'): 2038 gajim.connections[old_name].services_cache.account = new_name 2039 del gajim.interface.instances[old_name] 2040 del gajim.interface.minimized_controls[old_name] 2041 del gajim.nicks[old_name] 2042 del gajim.block_signed_in_notifications[old_name] 2043 del gajim.groups[old_name] 2044 del gajim.gc_connected[old_name] 2045 del gajim.automatic_rooms[old_name] 2046 del gajim.newly_added[old_name] 2047 del gajim.to_be_removed[old_name] 2048 del gajim.sleeper_state[old_name] 2049 del gajim.encrypted_chats[old_name] 2050 del gajim.last_message_time[old_name] 2051 del gajim.status_before_autoaway[old_name] 2052 del gajim.transport_avatar[old_name] 2053 del gajim.gajim_optional_features[old_name] 2054 del gajim.caps_hash[old_name] 2055 gajim.connections[old_name].name = new_name 2056 gajim.connections[new_name] = gajim.connections[old_name] 2057 del gajim.connections[old_name] 2058 gajim.config.add_per('accounts', new_name) 2059 old_config = gajim.config.get_per('accounts', old_name) 2060 for opt in old_config: 2061 gajim.config.set_per('accounts', new_name, opt, old_config[opt][1]) 2062 gajim.config.del_per('accounts', old_name) 2063 if self.current_account == old_name: 2064 self.current_account = new_name 2065 if old_name == gajim.ZEROCONF_ACC_NAME: 2066 gajim.ZEROCONF_ACC_NAME = new_name 2067 # refresh roster 2068 gajim.interface.roster.setup_and_draw_roster() 2069 self.init_accounts() 2070 self.select_account(new_name)
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
2078 - def option_changed(self, option, value):
2079 return gajim.config.get_per('accounts', self.current_account, option) != \ 2080 value
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 # check if jid is conform to RFC and stringprep it 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
2132 - def on_anonymous_checkbutton1_toggled(self, widget):
2133 if self.ignore_events: 2134 return 2135 active = widget.get_active() 2136 gajim.config.set_per('accounts', self.current_account, 'anonymous_auth', 2137 active) 2138 self.draw_normal_jid()
2139
2140 - def on_password_entry1_changed(self, widget):
2141 if self.ignore_events: 2142 return 2143 passwords.save_password(self.current_account, widget.get_text().decode( 2144 'utf-8'))
2145
2146 - def on_save_password_checkbutton1_toggled(self, widget):
2147 if self.ignore_events: 2148 return 2149 active = widget.get_active() 2150 password_entry = self.xml.get_object('password_entry1') 2151 password_entry.set_sensitive(active) 2152 gajim.config.set_per('accounts', self.current_account, 'savepass', active) 2153 if active: 2154 password = password_entry.get_text() 2155 passwords.save_password(self.current_account, password) 2156 else: 2157 passwords.save_password(self.current_account, '')
2158
2159 - def on_resource_entry1_focus_out_event(self, widget, event):
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
2179 - def on_adjust_priority_with_status_checkbutton1_toggled(self, widget):
2180 self.xml.get_object('priority_spinbutton1').set_sensitive( 2181 not widget.get_active()) 2182 self.on_checkbutton_toggled(widget, 'adjust_priority_with_status', 2183 account = self.current_account)
2184
2185 - def on_priority_spinbutton1_value_changed(self, widget):
2186 prio = widget.get_value_as_int() 2187 2188 if self.option_changed('priority', prio): 2189 self.resend_presence = True 2190 2191 gajim.config.set_per('accounts', self.current_account, 'priority', prio)
2192
2193 - def on_synchronise_contacts_button1_clicked(self, widget):
2194 try: 2195 dialogs.SynchroniseSelectAccountDialog(self.current_account) 2196 except GajimGeneralException: 2197 # If we showed ErrorDialog, there will not be dialog instance 2198 return
2199
2200 - def on_change_password_button1_clicked(self, widget):
2201 def on_changed(new_password): 2202 if new_password is not None: 2203 gajim.connections[self.current_account].change_password( 2204 new_password) 2205 if self.xml.get_object('save_password_checkbutton1').get_active(): 2206 self.xml.get_object('password_entry1').set_text(new_password)
2207 2208 try: 2209 dialogs.ChangePasswordDialog(self.current_account, on_changed) 2210 except GajimGeneralException: 2211 # if we showed ErrorDialog, there will not be dialog instance 2212 return 2213
2214 - def on_autoconnect_checkbutton_toggled(self, widget):
2215 if self.ignore_events: 2216 return 2217 self.on_checkbutton_toggled(widget, 'autoconnect', 2218 account=self.current_account)
2219
2220 - def on_autoreconnect_checkbutton_toggled(self, widget):
2221 if self.ignore_events: 2222 return 2223 self.on_checkbutton_toggled(widget, 'autoreconnect', 2224 account=self.current_account)
2225
2226 - def on_log_history_checkbutton_toggled(self, widget):
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
2239 - def on_sync_with_global_status_checkbutton_toggled(self, widget):
2240 if self.ignore_events: 2241 return 2242 self.on_checkbutton_toggled(widget, 'sync_with_global_status', 2243 account=self.current_account) 2244 gajim.interface.roster.update_status_combobox()
2245
2246 - def on_use_ft_proxies_checkbutton1_toggled(self, widget):
2247 if self.ignore_events: 2248 return 2249 self.on_checkbutton_toggled(widget, 'use_ft_proxies', 2250 account=self.current_account)
2251
2252 - def on_use_env_http_proxy_checkbutton1_toggled(self, widget):
2253 if self.ignore_events: 2254 return 2255 self.on_checkbutton_toggled(widget, 'use_env_http_proxy', 2256 account=self.current_account) 2257 hbox = self.xml.get_object('proxy_hbox1') 2258 hbox.set_sensitive(not widget.get_active())
2259
2260 - def on_proxies_combobox1_changed(self, widget):
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
2271 - def on_manage_proxies_button1_clicked(self, widget):
2272 if 'manage_proxies' in gajim.interface.instances: 2273 gajim.interface.instances['manage_proxies'].window.present() 2274 else: 2275 gajim.interface.instances['manage_proxies'] = ManageProxiesWindow()
2276
2277 - def on_warn_when_insecure_connection_checkbutton1_toggled(self, widget):
2278 if self.ignore_events: 2279 return 2280 2281 self.on_checkbutton_toggled(widget, 'warn_when_insecure_ssl_connection', 2282 account=self.current_account)
2283
2284 - def on_send_keepalive_checkbutton1_toggled(self, widget):
2285 if self.ignore_events: 2286 return 2287 self.on_checkbutton_toggled(widget, 'keep_alives_enabled', 2288 account=self.current_account) 2289 gajim.config.set_per('accounts', self.current_account, 2290 'ping_alives_enabled', widget.get_active())
2291
2292 - def on_custom_host_port_checkbutton1_toggled(self, widget):
2293 if self.option_changed('use_custom_host', widget.get_active()): 2294 self.need_relogin = True 2295 2296 self.on_checkbutton_toggled(widget, 'use_custom_host', 2297 account=self.current_account) 2298 active = widget.get_active() 2299 self.xml.get_object('custom_host_port_hbox1').set_sensitive(active)
2300
2301 - def on_custom_host_entry1_changed(self, widget):
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
2310 - def on_custom_port_entry_focus_out_event(self, widget, event):
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
2327 - def on_gpg_choose_button_clicked(self, widget, data = None):
2328 if self.current_account in gajim.connections and \ 2329 gajim.connections[self.current_account].gpg: 2330 secret_keys = gajim.connections[self.current_account].\ 2331 ask_gpg_secrete_keys() 2332 2333 # self.current_account is None and/or gajim.connections is {} 2334 else: 2335 if gajim.HAVE_GPG: 2336 secret_keys = GnuPG.GnuPG().get_secret_keys() 2337 else: 2338 secret_keys = [] 2339 if not secret_keys: 2340 dialogs.ErrorDialog(_('Failed to get secret keys'), 2341 _('There is no OpenPGP secret key available.')) 2342 secret_keys[_('None')] = _('None') 2343 2344 def on_key_selected(keyID): 2345 if keyID is None: 2346 return 2347 if self.current_account == gajim.ZEROCONF_ACC_NAME: 2348 wiget_name_ext = '2' 2349 else: 2350 wiget_name_ext = '1' 2351 gpg_key_label = self.xml.get_object('gpg_key_label' + wiget_name_ext) 2352 gpg_name_label = self.xml.get_object('gpg_name_label' + wiget_name_ext) 2353 use_gpg_agent_checkbutton = self.xml.get_object( 2354 'use_gpg_agent_checkbutton' + wiget_name_ext) 2355 if keyID[0] == _('None'): 2356 gpg_key_label.set_text(_('No key selected')) 2357 gpg_name_label.set_text('') 2358 use_gpg_agent_checkbutton.set_sensitive(False) 2359 if self.option_changed('keyid', ''): 2360 self.need_relogin = True 2361 gajim.config.set_per('accounts', self.current_account, 'keyname', 2362 '') 2363 gajim.config.set_per('accounts', self.current_account, 'keyid', '') 2364 else: 2365 gpg_key_label.set_text(keyID[0]) 2366 gpg_name_label.set_text(keyID[1]) 2367 use_gpg_agent_checkbutton.set_sensitive(True) 2368 if self.option_changed('keyid', keyID[0]): 2369 self.need_relogin = True 2370 gajim.config.set_per('accounts', self.current_account, 'keyname', 2371 keyID[1]) 2372 gajim.config.set_per('accounts', self.current_account, 'keyid', 2373 keyID[0])
2374 2375 dialogs.ChooseGPGKeyDialog(_('OpenPGP Key Selection'), 2376 _('Choose your OpenPGP key'), secret_keys, on_key_selected) 2377
2378 - def on_use_gpg_agent_checkbutton_toggled(self, widget):
2379 self.on_checkbutton_toggled(widget, 'use_gpg_agent')
2380
2381 - def on_edit_details_button1_clicked(self, widget):
2382 if self.current_account not in gajim.interface.instances: 2383 dialogs.ErrorDialog(_('No such account available'), 2384 _('You must create your account before editing your personal ' 2385 'information.')) 2386 return 2387 2388 # show error dialog if account is newly created (not in gajim.connections) 2389 if self.current_account not in gajim.connections or \ 2390 gajim.connections[self.current_account].connected < 2: 2391 dialogs.ErrorDialog(_('You are not connected to the server'), 2392 _('Without a connection, you can not edit your personal information.')) 2393 return 2394 2395 if not gajim.connections[self.current_account].vcard_supported: 2396 dialogs.ErrorDialog(_("Your server doesn't support Vcard"), 2397 _("Your server can't save your personal information.")) 2398 return 2399 2400 gajim.interface.edit_own_details(self.current_account)
2401
2402 - def on_checkbutton_toggled(self, widget, config_name, 2403 change_sensitivity_widgets = None, account = None):
2404 if account: 2405 gajim.config.set_per('accounts', account, config_name, 2406 widget.get_active()) 2407 else: 2408 gajim.config.set(config_name, widget.get_active()) 2409 if change_sensitivity_widgets: 2410 for w in change_sensitivity_widgets: 2411 w.set_sensitive(widget.get_active()) 2412 gajim.interface.save_config()
2413
2414 - def on_merge_checkbutton_toggled(self, widget):
2415 self.on_checkbutton_toggled(widget, 'mergeaccounts') 2416 if len(gajim.connections) >= 2: # Do not merge accounts if only one active 2417 gajim.interface.roster.regroup = gajim.config.get('mergeaccounts') 2418 else: 2419 gajim.interface.roster.regroup = False 2420 gajim.interface.roster.setup_and_draw_roster()
2421
2422 - def _disable_account(self, account):
2423 gajim.interface.roster.close_all(account) 2424 if account == gajim.ZEROCONF_ACC_NAME: 2425 gajim.connections[account].disable_account() 2426 del gajim.connections[account] 2427 gajim.interface.save_config() 2428 del gajim.interface.instances[account] 2429 del gajim.interface.minimized_controls[account] 2430 del gajim.nicks[account] 2431 del gajim.block_signed_in_notifications[account] 2432 del gajim.groups[account] 2433 gajim.contacts.remove_account(account) 2434 del gajim.gc_connected[account] 2435 del gajim.automatic_rooms[account] 2436 del gajim.to_be_removed[account] 2437 del gajim.newly_added[account] 2438 del gajim.sleeper_state[account] 2439 del gajim.encrypted_chats[account] 2440 del gajim.last_message_time[account] 2441 del gajim.status_before_autoaway[account] 2442 del gajim.transport_avatar[account] 2443 del gajim.gajim_optional_features[account] 2444 del gajim.caps_hash[account] 2445 if len(gajim.connections) >= 2: 2446 # Do not merge accounts if only one exists 2447 gajim.interface.roster.regroup = gajim.config.get('mergeaccounts') 2448 else: 2449 gajim.interface.roster.regroup = False 2450 gajim.interface.roster.setup_and_draw_roster() 2451 gajim.interface.roster.set_actions_menu_needs_rebuild()
2452
2453 - def _enable_account(self, account):
2454 if account == gajim.ZEROCONF_ACC_NAME: 2455 gajim.connections[account] = connection_zeroconf.ConnectionZeroconf( 2456 account) 2457 if gajim.connections[account].gpg: 2458 self.xml.get_object('gpg_choose_button2').set_sensitive(True) 2459 else: 2460 gajim.connections[account] = common.connection.Connection(account) 2461 if gajim.connections[account].gpg: 2462 self.xml.get_object('gpg_choose_button1').set_sensitive(True) 2463 self.init_account_gpg() 2464 # update variables 2465 gajim.interface.instances[account] = {'infos': {}, 2466 'disco': {}, 'gc_config': {}, 'search': {}, 'online_dialog': {}} 2467 gajim.interface.minimized_controls[account] = {} 2468 gajim.connections[account].connected = 0 2469 gajim.groups[account] = {} 2470 gajim.contacts.add_account(account) 2471 gajim.gc_connected[account] = {} 2472 gajim.automatic_rooms[account] = {} 2473 gajim.newly_added[account] = [] 2474 gajim.to_be_removed[account] = [] 2475 if account == gajim.ZEROCONF_ACC_NAME: 2476 gajim.nicks[account] = gajim.ZEROCONF_ACC_NAME 2477 else: 2478 gajim.nicks[account] = gajim.config.get_per('accounts', account, 2479 'name') 2480 gajim.block_signed_in_notifications[account] = True 2481 gajim.sleeper_state[account] = 'off' 2482 gajim.encrypted_chats[account] = [] 2483 gajim.last_message_time[account] = {} 2484 gajim.status_before_autoaway[account] = '' 2485 gajim.transport_avatar[account] = {} 2486 gajim.gajim_optional_features[account] = [] 2487 gajim.caps_hash[account] = '' 2488 # refresh roster 2489 if len(gajim.connections) >= 2: 2490 # Do not merge accounts if only one exists 2491 gajim.interface.roster.regroup = gajim.config.get('mergeaccounts') 2492 else: 2493 gajim.interface.roster.regroup = False 2494 gajim.interface.roster.setup_and_draw_roster() 2495 gajim.interface.roster.set_actions_menu_needs_rebuild() 2496 gajim.interface.save_config()
2497
2498 - def on_enable_zeroconf_checkbutton2_toggled(self, widget):
2499 # don't do anything if there is an account with the local name but is a 2500 # normal account 2501 if self.ignore_events: 2502 return 2503 if self.current_account in gajim.connections and \ 2504 gajim.connections[self.current_account].connected > 0: 2505 self.ignore_events = True 2506 self.xml.get_object('enable_zeroconf_checkbutton2').set_active(True) 2507 self.ignore_events = False 2508 dialogs.ErrorDialog( 2509 _('You are currently connected to the server'), 2510 _('To disable the account, you must be disconnected.')) 2511 return 2512 if gajim.ZEROCONF_ACC_NAME in gajim.connections and not \ 2513 gajim.connections[gajim.ZEROCONF_ACC_NAME].is_zeroconf: 2514 gajim.connections[gajim.ZEROCONF_ACC_NAME].dispatch('ERROR', 2515 (_('Account Local already exists.'), 2516 _('Please rename or remove it before enabling link-local messaging' 2517 '.'))) 2518 return 2519 2520 if gajim.config.get_per('accounts', gajim.ZEROCONF_ACC_NAME, 'active') \ 2521 and not widget.get_active(): 2522 self.xml.get_object('zeroconf_notebook').set_sensitive(False) 2523 # disable 2524 self._disable_account(gajim.ZEROCONF_ACC_NAME) 2525 2526 elif not gajim.config.get_per('accounts', gajim.ZEROCONF_ACC_NAME, 2527 'active') and widget.get_active(): 2528 self.xml.get_object('zeroconf_notebook').set_sensitive(True) 2529 # enable (will create new account if not present) 2530 self._enable_account(gajim.ZEROCONF_ACC_NAME) 2531 2532 self.on_checkbutton_toggled(widget, 'active', 2533 account=gajim.ZEROCONF_ACC_NAME)
2534
2535 - def on_enable_checkbutton1_toggled(self, widget):
2536 if self.ignore_events: 2537 return 2538 if self.current_account in gajim.connections and \ 2539 gajim.connections[self.current_account].connected > 0: 2540 # connecting or connected 2541 self.ignore_events = True 2542 self.xml.get_object('enable_checkbutton1').set_active(True) 2543 self.ignore_events = False 2544 dialogs.ErrorDialog( 2545 _('You are currently connected to the server'), 2546 _('To disable the account, you must be disconnected.')) 2547 return 2548 # add/remove account in roster and all variables 2549 if widget.get_active(): 2550 # enable 2551 self._enable_account(self.current_account) 2552 else: 2553 # disable 2554 self._disable_account(self.current_account) 2555 self.on_checkbutton_toggled(widget, 'active', 2556 account=self.current_account, change_sensitivity_widgets=[ 2557 self.xml.get_object('normal_notebook1')])
2558
2559 - def on_custom_port_checkbutton2_toggled(self, widget):
2560 self.xml.get_object('custom_port_entry2').set_sensitive( 2561 widget.get_active()) 2562 self.on_checkbutton_toggled(widget, 'use_custom_host', 2563 account = self.current_account) 2564 if not widget.get_active(): 2565 self.xml.get_object('custom_port_entry2').set_text('5298')
2566
2567 - def on_first_name_entry2_changed(self, widget):
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
2576 - def on_last_name_entry2_changed(self, widget):
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
2585 - def on_jabber_id_entry2_changed(self, widget):
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
2603 -class FakeDataForm(gtk.Table, object):
2604 """ 2605 Class for forms that are in XML format <entry1>value1</entry1> infos in a 2606 table {entry1: value1} 2607 """ 2608
2609 - def __init__(self, infos):
2610 gtk.Table.__init__(self) 2611 self.infos = infos 2612 self.entries = {} 2613 self._draw_table()
2614
2615 - def _draw_table(self):
2616 """ 2617 Draw the table 2618 """ 2619 nbrow = 0 2620 if 'instructions' in self.infos: 2621 nbrow = 1 2622 self.resize(rows = nbrow, columns = 2) 2623 label = gtk.Label(self.infos['instructions']) 2624 self.attach(label, 0, 2, 0, 1, 0, 0, 0, 0) 2625 for name in self.infos.keys(): 2626 if name in ('key', 'instructions', 'x', 'registered'): 2627 continue 2628 if not name: 2629 continue 2630 2631 nbrow = nbrow + 1 2632 self.resize(rows = nbrow, columns = 2) 2633 label = gtk.Label(name.capitalize() + ':') 2634 self.attach(label, 0, 1, nbrow - 1, nbrow, 0, 0, 0, 0) 2635 entry = gtk.Entry() 2636 entry.set_activates_default(True) 2637 if self.infos[name]: 2638 entry.set_text(self.infos[name]) 2639 if name == 'password': 2640 entry.set_visibility(False) 2641 self.attach(entry, 1, 2, nbrow - 1, nbrow, 0, 0, 0, 0) 2642 self.entries[name] = entry 2643 if nbrow == 1: 2644 entry.grab_focus()
2645
2646 - def get_infos(self):
2647 for name in self.entries.keys(): 2648 self.infos[name] = self.entries[name].get_text().decode('utf-8') 2649 return self.infos
2650
2651 -class ServiceRegistrationWindow:
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
2683 - def on_cancel_button_clicked(self, widget):
2684 self.window.destroy()
2685
2686 - def on_ok_button_clicked(self, widget):
2687 # send registration info to the core 2688 if self.is_form: 2689 form = self.data_form_widget.data_form 2690 gajim.connections[self.account].register_agent(self.service, 2691 form, True) # True is for is_form 2692 else: 2693 infos = self.data_form_widget.get_infos() 2694 if 'instructions' in infos: 2695 del infos['instructions'] 2696 if 'registered' in infos: 2697 del infos['registered'] 2698 gajim.connections[self.account].register_agent(self.service, infos) 2699 2700 self.window.destroy()
2701
2702 -class GroupchatConfigWindow:
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 = {} # list at the beginning 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 # hide scrollbar of this data_form_widget, we already have in this 2725 # widget 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 # Draw the edit affiliation list things 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) # Jid, reason, nick, role 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
2802 - def on_cancel_button_clicked(self, widget):
2803 self.window.destroy()
2804
2805 - def on_cell_edited(self, cell, path, new_text):
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
2811 - def on_add_button_clicked(self, widget, affiliation):
2812 if affiliation == 'outcast': 2813 title = _('Banning...') 2814 #You can move '\n' before user@domain if that line is TOO BIG 2815 prompt = _('<b>Whom do you want to ban?</b>\n\n') 2816 elif affiliation == 'member': 2817 title = _('Adding Member...') 2818 prompt = _('<b>Whom do you want to make a member?</b>\n\n') 2819 elif affiliation == 'owner': 2820 title = _('Adding Owner...') 2821 prompt = _('<b>Whom do you want to make an owner?</b>\n\n') 2822 else: 2823 title = _('Adding Administrator...') 2824 prompt = _('<b>Whom do you want to make an administrator?</b>\n\n') 2825 prompt += _('Can be one of the following:\n' 2826 '1. user@domain/resource (only that resource matches).\n' 2827 '2. user@domain (any resource matches).\n' 2828 '3. domain/resource (only that resource matches).\n' 2829 '4. domain (the domain itself matches, as does any user@domain,\n' 2830 'domain/resource, or address containing a subdomain).') 2831 2832 def on_ok(jid): 2833 if not jid: 2834 return 2835 model = self.affiliation_treeview[affiliation].get_model() 2836 model.append((jid, '', '', ''))
2837 dialogs.InputDialog(title, prompt, ok_handler=on_ok)
2838
2839 - def on_remove_button_clicked(self, widget, affiliation):
2840 selection = self.affiliation_treeview[affiliation].get_selection() 2841 model, paths = selection.get_selected_rows() 2842 row_refs = [] 2843 for path in paths: 2844 row_refs.append(gtk.TreeRowReference(model, path)) 2845 for row_ref in row_refs: 2846 path = row_ref.get_path() 2847 iter_ = model.get_iter(path) 2848 jid = model[iter_][0] 2849 model.remove(iter_) 2850 self.remove_button[affiliation].set_sensitive(False)
2851
2852 - def on_affiliation_treeview_cursor_changed(self, widget, affiliation):
2853 self.remove_button[affiliation].set_sensitive(True)
2854
2855 - def affiliation_list_received(self, users_dict):
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 # Unknown affiliation or 'none' affiliation, do not show it 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
2872 - def on_data_form_window_destroy(self, widget):
2873 del gajim.interface.instances[self.account]['gc_config'][self.room_jid]
2874
2875 - def on_ok_button_clicked(self, widget):
2876 if self.form: 2877 form = self.data_form_widget.data_form 2878 gajim.connections[self.account].send_gc_config(self.room_jid, form) 2879 for affiliation in self.affiliation_labels.keys(): 2880 users_dict = {} 2881 actual_jid_list = [] 2882 model = self.affiliation_treeview[affiliation].get_model() 2883 iter_ = model.get_iter_first() 2884 # add new jid 2885 while iter_: 2886 jid = model[iter_][0].decode('utf-8') 2887 actual_jid_list.append(jid) 2888 if jid not in self.start_users_dict[affiliation] or \ 2889 (affiliation == 'outcast' and 'reason' in self.start_users_dict[affiliation]\ 2890 [jid] and self.start_users_dict[affiliation][jid]\ 2891 ['reason'] != model[iter_][1].decode('utf-8')): 2892 users_dict[jid] = {'affiliation': affiliation} 2893 if affiliation == 'outcast': 2894 users_dict[jid]['reason'] = model[iter_][1].decode('utf-8') 2895 iter_ = model.iter_next(iter_) 2896 # remove removed one 2897 for jid in self.start_users_dict[affiliation]: 2898 if jid not in actual_jid_list: 2899 users_dict[jid] = {'affiliation': 'none'} 2900 if users_dict: 2901 gajim.connections[self.account].send_gc_affiliation_list( 2902 self.room_jid, users_dict) 2903 self.window.destroy()
2904 2905 #---------- RemoveAccountWindow class -------------#
2906 -class RemoveAccountWindow:
2907 """ 2908 Ask for removing from gajim only or from gajim and server too and do 2909 removing of the account given 2910 """ 2911
2912 - def on_remove_account_window_destroy(self, widget):
2913 if self.account in gajim.interface.instances: 2914 del gajim.interface.instances[self.account]['remove_account']
2915
2916 - def on_cancel_button_clicked(self, widget):
2917 self.window.destroy()
2918
2919 - def __init__(self, account):
2920 self.account = account 2921 xml = gtkgui_helpers.get_gtk_builder('remove_account_window.ui') 2922 self.window = xml.get_object('remove_account_window') 2923 self.window.set_transient_for(gajim.interface.roster.window) 2924 self.remove_and_unregister_radiobutton = xml.get_object( 2925 'remove_and_unregister_radiobutton') 2926 self.window.set_title(_('Removing %s account') % self.account) 2927 xml.connect_signals(self) 2928 self.window.show_all()
2929
2930 - def on_remove_button_clicked(self, widget):
2931 def remove(): 2932 if self.account in gajim.connections and \ 2933 gajim.connections[self.account].connected and \ 2934 not self.remove_and_unregister_radiobutton.get_active(): 2935 # change status to offline only if we will not remove this JID from 2936 # server 2937 gajim.connections[self.account].change_status('offline', 'offline') 2938 if self.remove_and_unregister_radiobutton.get_active(): 2939 if not self.account in gajim.connections: 2940 dialogs.ErrorDialog( 2941 _('Account is disabled'), 2942 _('To unregister from a server, account must be ' 2943 'enabled.')) 2944 return 2945 if not gajim.connections[self.account].password: 2946 def on_ok(passphrase, checked): 2947 if passphrase == -1: 2948 # We don't remove account cause we canceled pw window 2949 return 2950 gajim.connections[self.account].password = passphrase 2951 gajim.connections[self.account].unregister_account( 2952 self._on_remove_success)
2953 2954 dialogs.PassphraseDialog( 2955 _('Password Required'), 2956 _('Enter your password for account %s') % self.account, 2957 _('Save password'), ok_handler=on_ok) 2958 return 2959 gajim.connections[self.account].unregister_account( 2960 self._on_remove_success) 2961 else: 2962 self._on_remove_success(True)
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
2973 - def on_remove_responce_ok(self, is_checked):
2974 if is_checked[0]: 2975 self._on_remove_success(True)
2976
2977 - def _on_remove_success(self, res):
2978 # action of unregistration has failed, we don't remove the account 2979 # Error message is send by connect_and_auth() 2980 if not res: 2981 confirmation_check = dialogs.ConfirmationDialogDoubleRadio( 2982 _('Connection to server %s failed') % self.account, 2983 _('What would you like to do?'), 2984 _('Remove only from Gajim'), 2985 _('Don\'t remove anything. I\'ll try again later'), 2986 on_response_ok=self.on_remove_responce_ok, is_modal=False) 2987 return 2988 # Close all opened windows 2989 gajim.interface.roster.close_all(self.account, force=True) 2990 if self.account in gajim.connections: 2991 gajim.connections[self.account].disconnect(on_purpose=True) 2992 del gajim.connections[self.account] 2993 gajim.logger.remove_roster(gajim.get_jid_from_account(self.account)) 2994 gajim.config.del_per('accounts', self.account) 2995 gajim.interface.save_config() 2996 del gajim.interface.instances[self.account] 2997 if self.account in gajim.nicks: 2998 del gajim.interface.minimized_controls[self.account] 2999 del gajim.nicks[self.account] 3000 del gajim.block_signed_in_notifications[self.account] 3001 del gajim.groups[self.account] 3002 gajim.contacts.remove_account(self.account) 3003 del gajim.gc_connected[self.account] 3004 del gajim.automatic_rooms[self.account] 3005 del gajim.to_be_removed[self.account] 3006 del gajim.newly_added[self.account] 3007 del gajim.sleeper_state[self.account] 3008 del gajim.encrypted_chats[self.account] 3009 del gajim.last_message_time[self.account] 3010 del gajim.status_before_autoaway[self.account] 3011 del gajim.transport_avatar[self.account] 3012 del gajim.gajim_optional_features[self.account] 3013 del gajim.caps_hash[self.account] 3014 if len(gajim.connections) >= 2: # Do not merge accounts if only one exists 3015 gajim.interface.roster.regroup = gajim.config.get('mergeaccounts') 3016 else: 3017 gajim.interface.roster.regroup = False 3018 gajim.interface.roster.setup_and_draw_roster() 3019 gajim.interface.roster.set_actions_menu_needs_rebuild() 3020 if 'accounts' in gajim.interface.instances: 3021 gajim.interface.instances['accounts'].init_accounts() 3022 gajim.interface.instances['accounts'].init_account() 3023 self.window.destroy()
3024 3025 #---------- ManageBookmarksWindow class -------------#
3026 -class ManageBookmarksWindow:
3027 - def __init__(self):
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 # Account-JID, RoomName, Room-JID, Autojoin, Minimize, Passowrd, Nick, 3033 # Show_Status 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 # Store bookmarks in treeview. 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 # No name was given for this bookmark. 3051 # Use the first part of JID instead... 3052 name = bookmark['jid'].split("@")[0] 3053 bookmark['name'] = name 3054 3055 # make '1', '0', 'true', 'false' (or other) to True/False 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 #Prepare input fields 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
3116 - def on_bookmarks_treeview_button_press_event(self, widget, event):
3117 (model, iter_) = self.selection.get_selected() 3118 if not iter_: 3119 # Removed a bookmark before 3120 return 3121 3122 if model.iter_parent(iter_): 3123 # The currently selected node is a bookmark 3124 return not self.check_valid_bookmark()
3125
3126 - def on_manage_bookmarks_window_destroy(self, widget, event):
3127 del gajim.interface.instances['manage_bookmarks']
3128
3129 - def on_add_bookmark_button_clicked(self, widget):
3130 """ 3131 Add a new bookmark 3132 """ 3133 # Get the account that is currently used 3134 # (the parent of the currently selected item) 3135 (model, iter_) = self.selection.get_selected() 3136 if not iter_: # Nothing selected, do nothing 3137 return 3138 3139 parent = model.iter_parent(iter_) 3140 3141 if parent: 3142 # We got a bookmark selected, so we add_to the parent 3143 add_to = parent 3144 else: 3145 # No parent, so we got an account -> add to this. 3146 add_to = iter_ 3147 3148 account = model[add_to][1].decode('utf-8') 3149 nick = gajim.nicks[account] 3150 iter_ = self.treestore.append(add_to, [account, _('New Group Chat'), '', 3151 False, False, '', nick, 'in_and_out']) 3152 3153 self.view.expand_row(model.get_path(add_to), True) 3154 self.view.set_cursor(model.get_path(iter_))
3155
3156 - def on_remove_bookmark_button_clicked(self, widget):
3157 """ 3158 Remove selected bookmark 3159 """ 3160 (model, iter_) = self.selection.get_selected() 3161 if not iter_: # Nothing selected 3162 return 3163 3164 if not model.iter_parent(iter_): 3165 # Don't remove account iters 3166 return 3167 3168 model.remove(iter_) 3169 self.clear_fields()
3170
3171 - def check_valid_bookmark(self):
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 #Account data can't be changed 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
3190 - def on_ok_button_clicked(self, widget):
3191 """ 3192 Parse the treestore data into our new bookmarks array, then send the new 3193 bookmarks to the server. 3194 """ 3195 (model, iter_) = self.selection.get_selected() 3196 if iter_ and model.iter_parent(iter_): 3197 #bookmark selected, check it 3198 if not self.check_valid_bookmark(): 3199 return 3200 3201 for account in self.treestore: 3202 account_unicode = account[1].decode('utf-8') 3203 gajim.connections[account_unicode].bookmarks = [] 3204 3205 for bm in account.iterchildren(): 3206 #Convert True/False/None to '1' or '0' 3207 autojoin = unicode(int(bm[3])) 3208 minimize = unicode(int(bm[4])) 3209 3210 #create the bookmark-dict 3211 bmdict = { 'name': bm[1], 'jid': bm[2], 'autojoin': autojoin, 3212 'minimize': minimize, 'password': bm[5], 'nick': bm[6], 3213 'print_status': bm[7]} 3214 3215 gajim.connections[account_unicode].bookmarks.append(bmdict) 3216 3217 gajim.connections[account_unicode].store_bookmarks() 3218 gajim.interface.roster.set_actions_menu_needs_rebuild() 3219 self.window.destroy()
3220
3221 - def on_cancel_button_clicked(self, widget):
3222 self.window.destroy()
3223
3224 - def bookmark_selected(self, selection):
3225 """ 3226 Fill in the bookmark's data into the fields. 3227 """ 3228 (model, iter_) = selection.get_selected() 3229 3230 if not iter_: 3231 # After removing the last bookmark for one account 3232 # this will be None, so we will just: 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 # make the fields sensitive 3241 for field in widgets: 3242 field.set_sensitive(True) 3243 else: 3244 # Top-level has no data (it's the account fields) 3245 # clear fields & make them insensitive 3246 self.clear_fields() 3247 for field in widgets: 3248 field.set_sensitive(False) 3249 return 3250 3251 # Fill in the data for childs 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 # We just added this one 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 # sensitive only if auto join is checked 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_: # After removing a bookmark, we got nothing selected 3291 if model.iter_parent(iter_): 3292 # Don't clear the title field for account nodes 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
3341 - def on_autojoin_checkbutton_toggled(self, widget):
3342 (model, iter_) = self.selection.get_selected() 3343 if iter_: 3344 model[iter_][3] = self.autojoin_checkbutton.get_active() 3345 self.minimize_checkbutton.set_sensitive(model[iter_][3])
3346
3347 - def on_minimize_checkbutton_toggled(self, widget):
3348 (model, iter_) = self.selection.get_selected() 3349 if iter_: 3350 model[iter_][4] = self.minimize_checkbutton.get_active()
3351
3352 - def on_print_status_combobox_changed(self, widget):
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
3360 - def clear_fields(self):
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
3369 -class AccountCreationWizardWindow:
3370 - def __init__(self):
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 # Connect events from comboboxentry.child 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 # Do the same for the other server comboboxentry 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 # parse servers.xml 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 # Put servers into comboboxentries 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 # Generic widgets 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 # some vars 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
3438 - def on_wizard_window_destroy(self, widget):
3439 page = self.notebook.get_current_page() 3440 if page in (4, 5) and self.account in gajim.connections: 3441 # connection instance is saved in gajim.connections and we canceled 3442 # the addition of the account 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
3456 helpers.launch_browser_mailer('url', 3457 'http://www.jabber.org/network/oldnetwork.shtml')
3458
3459 - def on_save_password_checkbutton_toggled(self, widget):
3460 self.xml.get_object('password_entry').grab_focus()
3461
3462 - def on_cancel_button_clicked(self, widget):
3463 self.window.destroy()
3464
3465 - def on_back_button_clicked(self, widget):
3466 cur_page = self.notebook.get_current_page() 3467 if cur_page in (1, 2): 3468 self.notebook.set_current_page(0) 3469 self.back_button.set_sensitive(False) 3470 elif cur_page == 3: 3471 self.xml.get_object('form_vbox').remove(self.data_form_widget) 3472 self.notebook.set_current_page(2) # show server page 3473 elif cur_page == 4: 3474 if self.account in gajim.connections: 3475 del gajim.connections[self.account] 3476 self.notebook.set_current_page(2) 3477 self.xml.get_object('form_vbox').remove(self.data_form_widget) 3478 elif cur_page == 6: # finish page 3479 self.forward_button.show() 3480 if self.modify: 3481 self.notebook.set_current_page(1) # Go to parameters page 3482 else: 3483 self.notebook.set_current_page(2) # Go to server page
3484
3485 - def on_anonymous_checkbutton1_toggled(self, widget):
3486 active = widget.get_active() 3487 self.xml.get_object('username_entry').set_sensitive(not active) 3488 self.xml.get_object('password_entry').set_sensitive(not active) 3489 self.xml.get_object('save_password_checkbutton').set_sensitive( 3490 not active)
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) # show finish page
3521
3522 - def on_forward_button_clicked(self, widget):
3523 cur_page = self.notebook.get_current_page() 3524 3525 if cur_page == 0: 3526 widget = self.xml.get_object('use_existing_account_radiobutton') 3527 if widget.get_active(): 3528 self.modify = True 3529 self.notebook.set_current_page(1) 3530 else: 3531 self.modify = False 3532 self.notebook.set_current_page(2) 3533 self.back_button.set_sensitive(True) 3534 return 3535 3536 elif cur_page == 1: 3537 # We are adding an existing account 3538 anonymous = self.xml.get_object('anonymous_checkbutton1').\ 3539 get_active() 3540 username = self.xml.get_object('username_entry').get_text().decode( 3541 'utf-8').strip() 3542 if not username and not anonymous: 3543 pritext = _('Invalid username') 3544 sectext = _( 3545 'You must provide a username to configure this account.') 3546 dialogs.ErrorDialog(pritext, sectext) 3547 return 3548 server = self.xml.get_object('server_comboboxentry').child.\ 3549 get_text().decode('utf-8').strip() 3550 savepass = self.xml.get_object('save_password_checkbutton').\ 3551 get_active() 3552 password = self.xml.get_object('password_entry').get_text().decode( 3553 'utf-8') 3554 3555 jid = username + '@' + server 3556 # check if jid is conform to RFC and stringprep it 3557 try: 3558 jid = helpers.parse_jid(jid) 3559 except helpers.InvalidFormat, s: 3560 pritext = _('Invalid Jabber ID') 3561 dialogs.ErrorDialog(pritext, str(s)) 3562 return 3563 3564 self.account = server 3565 i = 1 3566 while self.account in gajim.connections: 3567 self.account = server + str(i) 3568 i += 1 3569 3570 username, server = gajim.get_name_and_server_from_jid(jid) 3571 if self.xml.get_object('anonymous_checkbutton1').get_active(): 3572 self.save_account('', server, False, '', anonymous=True) 3573 else: 3574 self.save_account(username, server, savepass, password) 3575 self.show_finish_page() 3576 elif cur_page == 2: 3577 # We are creating a new account 3578 server = self.xml.get_object('server_comboboxentry1').child.\ 3579 get_text().decode('utf-8') 3580 3581 if not server: 3582 dialogs.ErrorDialog(_('Invalid server'), 3583 _('Please provide a server on which you want to register.')) 3584 return 3585 self.account = server 3586 i = 1 3587 while self.account in gajim.connections: 3588 self.account = server + str(i) 3589 i += 1 3590 3591 config = self.get_config('', server, '', '') 3592 # Get advanced options 3593 proxies_combobox = self.xml.get_object('proxies_combobox') 3594 active = proxies_combobox.get_active() 3595 proxy = proxies_combobox.get_model()[active][0].decode('utf-8') 3596 if proxy == _('None'): 3597 proxy = '' 3598 config['proxy'] = proxy 3599 3600 config['use_custom_host'] = self.xml.get_object( 3601 'custom_host_port_checkbutton').get_active() 3602 custom_port = self.xml.get_object('custom_port_entry').get_text() 3603 try: 3604 custom_port = int(custom_port) 3605 except Exception: 3606 dialogs.ErrorDialog(_('Invalid entry'), 3607 _('Custom port must be a port number.')) 3608 return 3609 config['custom_port'] = custom_port 3610 config['custom_host'] = self.xml.get_object( 3611 'custom_host_entry').get_text().decode('utf-8') 3612 3613 if self.xml.get_object('anonymous_checkbutton2').get_active(): 3614 self.modify = True 3615 self.save_account('', server, False, '', anonymous=True) 3616 self.show_finish_page() 3617 else: 3618 self.notebook.set_current_page(5) # show creating page 3619 self.back_button.hide() 3620 self.forward_button.hide() 3621 self.update_progressbar_timeout_id = gobject.timeout_add(100, 3622 self.update_progressbar) 3623 # Get form from serveur 3624 con = connection.Connection(self.account) 3625 gajim.connections[self.account] = con 3626 con.new_account(self.account, config) 3627 elif cur_page == 3: 3628 checked = self.xml.get_object('ssl_checkbutton').get_active() 3629 if checked: 3630 hostname = gajim.connections[self.account].new_account_info[ 3631 'hostname'] 3632 # Check if cert is already in file 3633 certs = '' 3634 if os.path.isfile(gajim.MY_CACERTS): 3635 f = open(gajim.MY_CACERTS) 3636 certs = f.read() 3637 f.close() 3638 if self.ssl_cert in certs: 3639 dialogs.ErrorDialog(_('Certificate Already in File'), 3640 _('This certificate is already in file %s, so it\'s ' 3641 'not added again.') % gajim.MY_CACERTS) 3642 else: 3643 f = open(gajim.MY_CACERTS, 'a') 3644 f.write(hostname + '\n') 3645 f.write(self.ssl_cert + '\n\n') 3646 f.close() 3647 gajim.connections[self.account].new_account_info[ 3648 'ssl_fingerprint_sha1'] = self.ssl_fingerprint 3649 self.notebook.set_current_page(4) # show fom page 3650 elif cur_page == 4: 3651 if self.is_form: 3652 form = self.data_form_widget.data_form 3653 else: 3654 form = self.data_form_widget.get_infos() 3655 gajim.connections[self.account].send_new_account_infos(form, 3656 self.is_form) 3657 self.xml.get_object('form_vbox').remove(self.data_form_widget) 3658 self.xml.get_object('progressbar_label').set_markup( 3659 '<b>Account is being created</b>\n\nPlease wait...') 3660 self.notebook.set_current_page(5) # show creating page 3661 self.back_button.hide() 3662 self.forward_button.hide() 3663 self.update_progressbar_timeout_id = gobject.timeout_add(100, 3664 self.update_progressbar)
3665
3666 - def update_proxy_list(self):
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
3676 - def on_manage_proxies_button_clicked(self, widget):
3677 if 'manage_proxies' in gajim.interface.instances: 3678 gajim.interface.instances['manage_proxies'].window.present() 3679 else: 3680 gajim.interface.instances['manage_proxies'] = \ 3681 ManageProxiesWindow()
3682
3684 self.xml.get_object('custom_host_hbox').set_sensitive(widget.\ 3685 get_active())
3686
3687 - def update_progressbar(self):
3688 self.progressbar.pulse() 3689 return True # loop forever
3690
3691 - def new_acc_connected(self, account, array):
3692 """ 3693 Connection to server succeded, present the form to the user 3694 """ 3695 # We receive events from all accounts from GED 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 # An SSL warning occured, show it 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) # show SSL page 3731 else: 3732 self.notebook.set_current_page(4) # show form page
3733
3734 - def new_acc_not_connected(self, account, reason):
3735 """ 3736 Account creation failed: connection to server failed 3737 """ 3738 # We receive events from all accounts from GED 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) # show finish page
3758
3759 - def acc_is_ok(self, account, config):
3760 """ 3761 Account creation succeeded 3762 """ 3763 # We receive events from all accounts from GED 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
3772 - def acc_is_not_ok(self, account, reason):
3773 """ 3774 Account creation failed 3775 """ 3776 # We receive events from all accounts from GED 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) # show finish page 3792 3793 if self.update_progressbar_timeout_id is not None: 3794 gobject.source_remove(self.update_progressbar_timeout_id)
3795
3796 - def on_advanced_button_clicked(self, widget):
3797 if 'accounts' in gajim.interface.instances: 3798 gajim.interface.instances['accounts'].window.present() 3799 else: 3800 gajim.interface.instances['accounts'] = AccountsWindow() 3801 gajim.interface.instances['accounts'].select_account(self.account) 3802 self.window.destroy()
3803
3804 - def on_finish_button_clicked(self, widget):
3805 go_online = self.xml.get_object('go_online_checkbutton').get_active() 3806 show_vcard = self.xml.get_object('show_vcard_checkbutton').get_active() 3807 self.window.destroy() 3808 if show_vcard: 3809 gajim.interface.show_vcard_when_connect.append(self.account) 3810 if go_online: 3811 gajim.interface.roster.send_status(self.account, 'online', '')
3812
3813 - def on_username_entry_key_press_event(self, widget, event):
3814 # Check for pressed @ and jump to combobox if found 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 # If backspace is pressed in empty field, return to the nick entry field 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):
3853 if self.account in gajim.connections: 3854 dialogs.ErrorDialog(_('Account name is in use'), 3855 _('You already have an account using this name.')) 3856 return 3857 con = connection.Connection(self.account) 3858 con.password = password 3859 3860 config = self.get_config(login, server, savepass, password, anonymous) 3861 3862 if not self.modify: 3863 con.new_account(self.account, config) 3864 return 3865 gajim.connections[self.account] = con 3866 self.create_vars(config)
3867
3868 - def create_vars(self, config):
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 # update variables 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 # refresh accounts window 3900 if 'accounts' in gajim.interface.instances: 3901 gajim.interface.instances['accounts'].init_accounts() 3902 # refresh roster 3903 if len(gajim.connections) >= 2: 3904 # Do not merge accounts if only one exists 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
3912 -class ManagePEPServicesWindow:
3913 - def __init__(self, account):
3914 self.xml = gtkgui_helpers.get_gtk_builder('manage_pep_services_window.ui') 3915 self.window = self.xml.get_object('manage_pep_services_window') 3916 self.window.set_transient_for(gajim.interface.roster.window) 3917 self.xml.get_object('configure_button').set_sensitive(False) 3918 self.xml.get_object('delete_button').set_sensitive(False) 3919 self.xml.connect_signals(self) 3920 self.account = account 3921 3922 self.init_services() 3923 self.xml.get_object('services_treeview').get_selection().connect( 3924 'changed', self.on_services_selection_changed) 3925 self.window.show_all()
3926
3927 - def on_manage_pep_services_window_destroy(self, widget):
3928 '''close window''' 3929 del gajim.interface.instances[self.account]['pep_services']
3930
3931 - def on_close_button_clicked(self, widget):
3932 self.window.destroy()
3933
3934 - def on_services_selection_changed(self, sel):
3935 self.xml.get_object('configure_button').set_sensitive(True) 3936 self.xml.get_object('delete_button').set_sensitive(True)
3937
3938 - def init_services(self):
3939 self.treeview = self.xml.get_object('services_treeview') 3940 # service, access_model, group 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
3954 - def items_received(self, items):
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
3960 - def node_removed(self, node):
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
3969 - def on_delete_button_clicked(self, widget):
3970 selection = self.treeview.get_selection() 3971 if not selection: 3972 return 3973 model, iter_ = selection.get_selected() 3974 node = model[iter_][0] 3975 our_jid = gajim.get_jid_from_account(self.account) 3976 gajim.connections[self.account].send_pb_delete(our_jid, node)
3977
3978 - def on_configure_button_clicked(self, widget):
3979 selection = self.treeview.get_selection() 3980 if not selection: 3981 return 3982 model, iter_ = selection.get_selected() 3983 node = model[iter_][0] 3984 our_jid = gajim.get_jid_from_account(self.account) 3985 gajim.connections[self.account].request_pb_configuration(our_jid, node)
3986
3987 - def config(self, node, form):
3988 def on_ok(form, node): 3989 form.type = 'submit' 3990 our_jid = gajim.get_jid_from_account(self.account) 3991 gajim.connections[self.account].send_pb_configure(our_jid, 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
3997 -class ManageSoundsWindow:
3998 - def __init__(self):
3999 self.xml = gtkgui_helpers.get_gtk_builder('manage_sounds_window.ui') 4000 self.window = self.xml.get_object('manage_sounds_window') 4001 4002 # sounds treeview 4003 self.sound_tree = self.xml.get_object('sounds_treeview') 4004 4005 # active, event ui name, path to sound file, event_config_name 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
4032 - def on_sounds_treemodel_row_changed(self, model, path, iter_):
4033 sound_event = model[iter_][3].decode('utf-8') 4034 gajim.config.set_per('soundevents', sound_event, 'enabled', 4035 bool(model[path][0])) 4036 gajim.config.set_per('soundevents', sound_event, 'path', 4037 model[iter_][2].decode('utf-8')) 4038 gajim.interface.save_config()
4039
4040 - def sound_toggled_cb(self, cell, path):
4041 model = self.sound_tree.get_model() 4042 model[path][0] = not model[path][0]
4043
4044 - def fill_sound_treeview(self):
4045 model = self.sound_tree.get_model() 4046 model.clear() 4047 model.set_sort_column_id(1, gtk.SORT_ASCENDING) 4048 4049 # NOTE: sounds_ui_names MUST have all items of 4050 # sounds = gajim.config.get_per('soundevents') as keys 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
4071 - def on_treeview_sounds_cursor_changed(self, widget, data = None):
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
4080 - def on_browse_for_sounds_button_clicked(self, widget, data = None):
4081 (model, iter_) = self.sound_tree.get_selection().get_selected() 4082 if not iter_: 4083 return 4084 def on_ok(widget, path_to_snd_file): 4085 self.dialog.destroy() 4086 model, iter_ = self.sound_tree.get_selection().get_selected() 4087 if not path_to_snd_file: 4088 model[iter_][2] = '' 4089 self.xml.get_object('sounds_entry').set_text('') 4090 model[iter_][0] = False 4091 return 4092 directory = os.path.dirname(path_to_snd_file) 4093 gajim.config.set('last_sounds_dir', directory) 4094 path_to_snd_file = helpers.strip_soundfile_path(path_to_snd_file) 4095 self.xml.get_object('sounds_entry').set_text(path_to_snd_file) 4096 4097 model[iter_][2] = path_to_snd_file # set new path to sounds_model 4098 model[iter_][0] = True # set the sound to enabled
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 # set new path to sounds_model
4111
4112 - def on_play_button_clicked(self, widget):
4113 model, iter_ = self.sound_tree.get_selection().get_selected() 4114 if not iter_: 4115 return 4116 snd_event_config_name = model[iter_][3] 4117 helpers.play_sound(snd_event_config_name)
4118
4119 - def on_close_button_clicked(self, widget):
4120 self.window.hide()
4121
4122 - def on_manage_sounds_window_delete_event(self, widget, event):
4123 self.window.hide() 4124 return True # do NOT destroy the window
4125