root/branches/gajim_0.11.1/src/config.py

Revision 8750, 118.7 kB (checked in by asterix, 13 months ago)

better error message when username contacins a '@' in account creation window

  • Property svn:eol-style set to LF
Line 
1##      config.py
2##
3## Copyright (C) 2003-2006 Yann Le Boulanger <asterix@lagaule.org>
4## Copyright (C) 2005-2006 Nikos Kouremenos <kourem@gmail.com>
5## Copyright (C) 2005 Dimitur Kirov <dkirov@gmail.com>
6## Copyright (C) 2003-2005 Vincent Hanquez <tab@snarc.org>
7## Copyright (C) 2006 Stefan Bethge <stefan@lanpartei.de>
8##
9## This program is free software; you can redistribute it and/or modify
10## it under the terms of the GNU General Public License as published
11## by the Free Software Foundation; version 2 only.
12##
13## This program is distributed in the hope that it will be useful,
14## but WITHOUT ANY WARRANTY; without even the implied warranty of
15## MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
16## GNU General Public License for more details.
17##
18
19import gtk
20import gobject
21import os
22import common.config
23import common.sleepy
24from common.i18n import Q_
25
26import gtkgui_helpers
27import dialogs
28import cell_renderer_image
29import message_control
30import chat_control
31import dataforms_widget
32
33try:
34        import gtkspell
35        HAS_GTK_SPELL = True
36except:
37        HAS_GTK_SPELL = False
38
39from common import helpers
40from common import gajim
41from common import connection
42from common import passwords
43from common import zeroconf
44from common import dbus_support
45from common import dataforms
46
47from common.exceptions import GajimGeneralException
48
49#---------- PreferencesWindow class -------------#
50class PreferencesWindow:
51        '''Class for Preferences window'''
52
53        def on_preferences_window_destroy(self, widget):
54                '''close window'''
55                del gajim.interface.instances['preferences']
56
57        def on_close_button_clicked(self, widget):
58                self.window.destroy()
59
60        def __init__(self):
61                '''Initialize Preferences window'''
62                self.xml = gtkgui_helpers.get_glade('preferences_window.glade')
63                self.window = self.xml.get_widget('preferences_window')
64                self.window.set_transient_for(gajim.interface.roster.window)
65                self.iconset_combobox = self.xml.get_widget('iconset_combobox')
66                self.notify_on_new_message_radiobutton = self.xml.get_widget(
67                        'notify_on_new_message_radiobutton')
68                self.popup_new_message_radiobutton = self.xml.get_widget(
69                        'popup_new_message_radiobutton')
70                self.notify_on_signin_checkbutton = self.xml.get_widget(
71                        'notify_on_signin_checkbutton')
72                self.notify_on_signout_checkbutton = self.xml.get_widget(
73                        'notify_on_signout_checkbutton')
74                self.auto_popup_away_checkbutton = self.xml.get_widget(
75                        'auto_popup_away_checkbutton')
76                self.auto_away_checkbutton = self.xml.get_widget('auto_away_checkbutton')
77                self.auto_away_time_spinbutton = self.xml.get_widget(
78                        'auto_away_time_spinbutton')
79                self.auto_away_message_entry = self.xml.get_widget(
80                        'auto_away_message_entry')
81                self.auto_xa_checkbutton = self.xml.get_widget('auto_xa_checkbutton')
82                self.auto_xa_time_spinbutton = self.xml.get_widget(
83                        'auto_xa_time_spinbutton')
84                self.auto_xa_message_entry = self.xml.get_widget('auto_xa_message_entry')
85                self.trayicon_checkbutton = self.xml.get_widget('trayicon_checkbutton')
86                self.notebook = self.xml.get_widget('preferences_notebook')
87                self.one_window_type_combobox =\
88                        self.xml.get_widget('one_window_type_combobox')
89                self.treat_incoming_messages_combobox =\
90                        self.xml.get_widget('treat_incoming_messages_combobox')
91
92                #FIXME: remove when ANC will be implemented
93                w = self.xml.get_widget('hbox3020')
94                w.set_no_show_all(True)
95                w.hide()
96
97                # trayicon
98                if gajim.interface.systray_capabilities:
99                        st = gajim.config.get('trayicon')
100                        self.trayicon_checkbutton.set_active(st)
101                else:
102                        self.trayicon_checkbutton.set_sensitive(False)
103
104                # Save position
105                st = gajim.config.get('saveposition')
106                self.xml.get_widget('save_position_checkbutton').set_active(st)
107
108                # Sort contacts by show
109                st = gajim.config.get('sort_by_show')
110                self.xml.get_widget('sort_by_show_checkbutton').set_active(st)
111
112                # Display avatars in roster
113                st = gajim.config.get('show_avatars_in_roster')
114                self.xml.get_widget('show_avatars_in_roster_checkbutton').set_active(st)
115
116                # Display status msg under contact name in roster
117                st = gajim.config.get('show_status_msgs_in_roster')
118                self.xml.get_widget('show_status_msgs_in_roster_checkbutton').set_active(
119                        st)
120
121                # emoticons
122                emoticons_combobox = self.xml.get_widget('emoticons_combobox')
123                emoticons_list = os.listdir(os.path.join(gajim.DATA_DIR, 'emoticons'))
124                # user themes
125                if os.path.isdir(gajim.MY_EMOTS_PATH):
126                        emoticons_list += os.listdir(gajim.MY_EMOTS_PATH)
127                renderer_text = gtk.CellRendererText()
128                emoticons_combobox.pack_start(renderer_text, True)
129                emoticons_combobox.add_attribute(renderer_text, 'text', 0)
130                model = gtk.ListStore(str)
131                emoticons_combobox.set_model(model)
132                l = []
133                for dir in emoticons_list:
134                        if not os.path.isdir(os.path.join(gajim.DATA_DIR, 'emoticons', dir)) \
135                        and not os.path.isdir(os.path.join(gajim.MY_EMOTS_PATH, dir)) :
136                                continue
137                        if dir != '.svn':
138                                l.append(dir)
139                l.append(_('Disabled'))
140                for i in xrange(len(l)):
141                        model.append([l[i]])
142                        if gajim.config.get('emoticons_theme') == l[i]:
143                                emoticons_combobox.set_active(i)
144                if not gajim.config.get('emoticons_theme'):
145                        emoticons_combobox.set_active(len(l)-1)
146
147                # iconset
148                iconsets_list = os.listdir(os.path.join(gajim.DATA_DIR, 'iconsets'))
149                # new model, image in 0, string in 1
150                model = gtk.ListStore(gtk.Image, str)
151                renderer_image = cell_renderer_image.CellRendererImage(0, 0)
152                renderer_text = gtk.CellRendererText()
153                renderer_text.set_property('xpad', 5)
154                self.iconset_combobox.pack_start(renderer_image, expand = False)
155                self.iconset_combobox.pack_start(renderer_text, expand = True)
156                self.iconset_combobox.set_attributes(renderer_text, text = 1)
157                self.iconset_combobox.add_attribute(renderer_image, 'image', 0)
158                self.iconset_combobox.set_model(model)
159                l = []
160                for dir in iconsets_list:
161                        if not os.path.isdir(os.path.join(gajim.DATA_DIR, 'iconsets', dir)):
162                                continue
163                        if dir != '.svn' and dir != 'transports':
164                                l.append(dir)
165                if l.count == 0:
166                        l.append(' ')
167                for i in xrange(len(l)):
168                        preview = gtk.Image()
169                        files = []
170                        files.append(os.path.join(gajim.DATA_DIR, 'iconsets', l[i], '16x16',
171                                'online.png'))
172                        files.append(os.path.join(gajim.DATA_DIR, 'iconsets', l[i], '16x16',
173                                'online.gif'))
174                        for file in files:
175                                if os.path.exists(file):
176                                        preview.set_from_file(file)
177                        model.append([preview, l[i]])
178                        if gajim.config.get('iconset') == l[i]:
179                                self.iconset_combobox.set_active(i)
180
181                # Set default for single window type
182                choices = common.config.opt_one_window_types
183                type = gajim.config.get('one_message_window')
184                if type in choices:
185                        self.one_window_type_combobox.set_active(choices.index(type))
186                else:
187                        self.one_window_type_combobox.set_active(0)
188
189                # Set default for treat incoming messages
190                choices = common.config.opt_treat_incoming_messages
191                type = gajim.config.get('treat_incoming_messages')
192                if type in choices:
193                        self.treat_incoming_messages_combobox.set_active(choices.index(type))
194                else:
195                        self.treat_incoming_messages_combobox.set_active(0)
196
197                # Use transports iconsets
198                st = gajim.config.get('use_transports_iconsets')
199                self.xml.get_widget('transports_iconsets_checkbutton').set_active(st)
200
201                # Themes
202                theme_combobox = self.xml.get_widget('theme_combobox')
203                cell = gtk.CellRendererText()
204                theme_combobox.pack_start(cell, True)
205                theme_combobox.add_attribute(cell, 'text', 0)
206                self.update_theme_list()
207
208                # use speller
209                if os.name == 'nt':
210                        self.xml.get_widget('speller_checkbutton').set_no_show_all(True)
211                else:
212                        if HAS_GTK_SPELL:
213                                st = gajim.config.get('use_speller')
214                                self.xml.get_widget('speller_checkbutton').set_active(st)
215                        else:
216                                self.xml.get_widget('speller_checkbutton').set_sensitive(False)
217
218                # Ignore XHTML
219                st = gajim.config.get('ignore_incoming_xhtml')
220                self.xml.get_widget('xhtml_checkbutton').set_active(st)
221
222                # Print time
223                st = gajim.config.get('print_ichat_every_foo_minutes')
224                text = _('Every %s _minutes') % st
225                self.xml.get_widget('time_sometimes_radiobutton').set_label(text)
226
227                if gajim.config.get('print_time') == 'never':
228                        self.xml.get_widget('time_never_radiobutton').set_active(True)
229                elif gajim.config.get('print_time') == 'sometimes':
230                        self.xml.get_widget('time_sometimes_radiobutton').set_active(True)
231                else:
232                        self.xml.get_widget('time_always_radiobutton').set_active(True)
233
234                # Color for incoming messages
235                colSt = gajim.config.get('inmsgcolor')
236                self.xml.get_widget('incoming_msg_colorbutton').set_color(
237                        gtk.gdk.color_parse(colSt))
238
239                # Color for outgoing messages
240                colSt = gajim.config.get('outmsgcolor')
241                self.xml.get_widget('outgoing_msg_colorbutton').set_color(
242                        gtk.gdk.color_parse(colSt))
243
244                # Color for status messages
245                colSt = gajim.config.get('statusmsgcolor')
246                self.xml.get_widget('status_msg_colorbutton').set_color(
247                        gtk.gdk.color_parse(colSt))
248               
249                # Color for hyperlinks
250                colSt = gajim.config.get('urlmsgcolor')
251                self.xml.get_widget('url_msg_colorbutton').set_color(
252                        gtk.gdk.color_parse(colSt))
253
254                # Font for messages
255                font = gajim.config.get('conversation_font')
256                # try to set default font for the current desktop env
257                fontbutton = self.xml.get_widget('conversation_fontbutton')
258                if font == '':
259                        fontbutton.set_sensitive(False)
260                        self.xml.get_widget('default_chat_font').set_active(True)
261                else:
262                        fontbutton.set_font_name(font)
263
264                # on new message
265                only_in_roster = True
266                if gajim.config.get('notify_on_new_message'):
267                        self.xml.get_widget('notify_on_new_message_radiobutton').set_active(
268                                True)
269                        only_in_roster = False
270                if gajim.config.get('autopopup'):
271                        self.xml.get_widget('popup_new_message_radiobutton').set_active(True)
272                        only_in_roster = False
273                if only_in_roster:
274                        self.xml.get_widget('only_in_roster_radiobutton').set_active(True)
275
276                # notify on online statuses
277                st = gajim.config.get('notify_on_signin')
278                self.notify_on_signin_checkbutton.set_active(st)
279
280                # notify on offline statuses
281                st = gajim.config.get('notify_on_signout')
282                self.notify_on_signout_checkbutton.set_active(st)
283
284                # autopopupaway
285                st = gajim.config.get('autopopupaway')
286                self.auto_popup_away_checkbutton.set_active(st)
287
288                # Ignore messages from unknown contacts
289                self.xml.get_widget('ignore_events_from_unknown_contacts_checkbutton').\
290                        set_active(gajim.config.get('ignore_unknown_contacts'))
291
292                # outgoing send chat state notifications
293                st = gajim.config.get('outgoing_chat_state_notifications')
294                combo = self.xml.get_widget('outgoing_chat_states_combobox')
295                if st == 'all':
296                        combo.set_active(0)
297                elif st == 'composing_only':
298                        combo.set_active(1)
299                else: # disabled
300                        combo.set_active(2)
301
302                # displayed send chat state notifications
303                st = gajim.config.get('displayed_chat_state_notifications')
304                combo = self.xml.get_widget('displayed_chat_states_combobox')
305                if st == 'all':
306                        combo.set_active(0)
307                elif st == 'composing_only':
308                        combo.set_active(1)
309                else: # disabled
310                        combo.set_active(2)
311
312                # sounds
313                if os.name == 'nt':
314                        # if windows, player must not become visible on show_all
315                        soundplayer_hbox = self.xml.get_widget('soundplayer_hbox')
316                        soundplayer_hbox.set_no_show_all(True)
317                if gajim.config.get('sounds_on'):
318                        self.xml.get_widget('play_sounds_checkbutton').set_active(True)
319                else:
320                        self.xml.get_widget('soundplayer_hbox').set_sensitive(False)
321                        self.xml.get_widget('sounds_scrolledwindow').set_sensitive(False)
322                        self.xml.get_widget('browse_sounds_hbox').set_sensitive(False)
323
324                # sound player
325                player = gajim.config.get('soundplayer')
326                self.xml.get_widget('soundplayer_entry').set_text(player)
327                if player == '': # only on first time Gajim starts
328                        commands = ('aplay', 'play', 'esdplay', 'artsplay')
329                        for command in commands:
330                                if helpers.is_in_path(command):
331                                        if command == 'aplay':
332                                                command += ' -q'
333                                        self.xml.get_widget('soundplayer_entry').set_text(command)
334                                        gajim.config.set('soundplayer', command)
335                                        break
336
337                # sounds treeview
338                self.sound_tree = self.xml.get_widget('sounds_treeview')
339               
340                # active, event ui name, path to sound file, event_config_name
341                model = gtk.ListStore(bool, str, str, str)
342                self.sound_tree.set_model(model)
343
344                col = gtk.TreeViewColumn(_('Active'))
345                self.sound_tree.append_column(col)
346                renderer = gtk.CellRendererToggle()
347                renderer.set_property('activatable', True)
348                renderer.connect('toggled', self.sound_toggled_cb)
349                col.pack_start(renderer)
350                col.set_attributes(renderer, active = 0)
351
352                col = gtk.TreeViewColumn(_('Event'))
353                self.sound_tree.append_column(col)
354                renderer = gtk.CellRendererText()
355                col.pack_start(renderer)
356                col.set_attributes(renderer, text = 1)
357
358                self.fill_sound_treeview()
359
360                #Autoaway
361                st = gajim.config.get('autoaway')
362                self.auto_away_checkbutton.set_active(st)
363
364                # Autoawaytime
365                st = gajim.config.get('autoawaytime')
366                self.auto_away_time_spinbutton.set_value(st)
367                self.auto_away_time_spinbutton.set_sensitive(gajim.config.get('autoaway'))
368
369                # autoaway message
370                st = gajim.config.get('autoaway_message')
371                self.auto_away_message_entry.set_text(st)
372                self.auto_away_message_entry.set_sensitive(gajim.config.get('autoaway'))
373
374                # Autoxa
375                st = gajim.config.get('autoxa')
376                self.auto_xa_checkbutton.set_active(st)
377
378                # Autoxatime
379                st = gajim.config.get('autoxatime')
380                self.auto_xa_time_spinbutton.set_value(st)
381                self.auto_xa_time_spinbutton.set_sensitive(gajim.config.get('autoxa'))
382
383                # autoxa message
384                st = gajim.config.get('autoxa_message')
385                self.auto_xa_message_entry.set_text(st)
386                self.auto_xa_message_entry.set_sensitive(gajim.config.get('autoxa'))
387
388                from common import sleepy
389                if not sleepy.SUPPORTED:
390                        self.xml.get_widget('autoaway_table').set_sensitive(False)
391
392                # ask_status when online / offline
393                st = gajim.config.get('ask_online_status')
394                self.xml.get_widget('prompt_online_status_message_checkbutton').\
395                        set_active(st)
396                st = gajim.config.get('ask_offline_status')
397                self.xml.get_widget('prompt_offline_status_message_checkbutton').\
398                        set_active(st)
399
400                # Default Status messages
401                self.default_msg_tree = self.xml.get_widget('default_msg_treeview')
402                # (status, translated_status, message, enabled)
403                model = gtk.ListStore(str, str, str, bool)
404                self.default_msg_tree.set_model(model)
405                col = gtk.TreeViewColumn('Status')
406                self.default_msg_tree.append_column(col)
407                renderer = gtk.CellRendererText()
408                col.pack_start(renderer, False)
409                col.set_attributes(renderer, text = 1)
410                col = gtk.TreeViewColumn('Message')
411                self.default_msg_tree.append_column(col)
412                renderer = gtk.CellRendererText()
413                col.pack_start(renderer, True)
414                col.set_attributes(renderer, text = 2)
415                renderer.connect('edited', self.on_default_msg_cell_edited)
416                renderer.set_property('editable', True)
417                col = gtk.TreeViewColumn('Enabled')
418                self.default_msg_tree.append_column(col)
419                renderer = gtk.CellRendererToggle()
420                col.pack_start(renderer, False)
421                col.set_attributes(renderer, active = 3)
422                renderer.set_property('activatable', True)
423                renderer.connect('toggled', self.default_msg_toggled_cb)
424                self.fill_default_msg_treeview()
425
426                # Status messages
427                self.msg_tree = self.xml.get_widget('msg_treeview')
428                model = gtk.ListStore(str, str)
429                self.msg_tree.set_model(model)
430                col = gtk.TreeViewColumn('name')
431                self.msg_tree.append_column(col)
432                renderer = gtk.CellRendererText()
433                col.pack_start(renderer, True)
434                col.set_attributes(renderer, text = 0)
435                renderer.connect('edited', self.on_msg_cell_edited)
436                renderer.set_property('editable', True)
437                self.fill_msg_treeview()
438                buf = self.xml.get_widget('msg_textview').get_buffer()
439                buf.connect('changed', self.on_msg_textview_changed)
440
441                # open links with
442                if os.name == 'nt':
443                        applications_frame = self.xml.get_widget('applications_frame')
444                        applications_frame.set_no_show_all(True)
445                        applications_frame.hide()
446                else:
447                        self.applications_combobox = self.xml.get_widget(
448                                'applications_combobox')
449                        self.xml.get_widget('custom_apps_frame').hide()
450                        self.xml.get_widget('custom_apps_frame').set_no_show_all(True)
451                        if gajim.config.get('autodetect_browser_mailer'):
452                                self.applications_combobox.set_active(0)
453                        # else autodetect_browser_mailer is False.
454                        # so user has 'Always Use GNOME/KDE/XFCE4' or Custom
455                        elif gajim.config.get('openwith') == 'gnome-open':
456                                self.applications_combobox.set_active(1)
457                        elif gajim.config.get('openwith') == 'kfmclient exec':
458                                self.applications_combobox.set_active(2)
459                        elif gajim.config.get('openwith') == 'exo-open':
460                                self.applications_combobox.set_active(3)                               
461                        elif gajim.config.get('openwith') == 'custom':
462                                self.applications_combobox.set_active(4)
463                                self.xml.get_widget('custom_apps_frame').show()
464                               
465                        self.xml.get_widget('custom_browser_entry').set_text(
466                                gajim.config.get('custombrowser'))
467                        self.xml.get_widget('custom_mail_client_entry').set_text(
468                                gajim.config.get('custommailapp'))
469                        self.xml.get_widget('custom_file_manager_entry').set_text(
470                                gajim.config.get('custom_file_manager'))
471
472                # log status changes of contacts
473                st = gajim.config.get('log_contact_status_changes')
474                self.xml.get_widget('log_show_changes_checkbutton').set_active(st)
475
476                # send os info
477                st = gajim.config.get('send_os_info')
478                self.xml.get_widget('send_os_info_checkbutton').set_active(st)
479
480                # send os info
481                st = gajim.config.get('check_if_gajim_is_default')
482                self.xml.get_widget('check_default_client_checkbutton').set_active(st)
483
484                # set status msg from currently playing music track
485                widget = self.xml.get_widget(
486                        'set_status_msg_from_current_music_track_checkbutton')
487                if os.name == 'nt':
488                        widget.set_no_show_all(True)
489                        widget.hide()
490                elif dbus_support.supported:
491                        st = gajim.config.get('set_status_msg_from_current_music_track')
492                        widget.set_active(st)
493                else:
494                        widget.set_sensitive(False)
495               
496                # Notify user of new gmail e-mail messages,
497                # only show checkbox if user has a gtalk account
498                frame_gmail = self.xml.get_widget('frame_gmail')
499                notify_gmail_checkbutton = self.xml.get_widget('notify_gmail_checkbutton')
500                notify_gmail_extra_checkbutton = self.xml.get_widget(
501                        'notify_gmail_extra_checkbutton')
502                frame_gmail.set_no_show_all(True)
503               
504                for account in gajim.config.get_per('accounts'):
505                        jid = gajim.get_jid_from_account(account)
506                        if gajim.get_server_from_jid(jid) in gajim.gmail_domains:
507                                frame_gmail.show_all()
508                                st = gajim.config.get('notify_on_new_gmail_email')
509                                notify_gmail_checkbutton.set_active(st)
510                                st = gajim.config.get('notify_on_new_gmail_email_extra')
511                                notify_gmail_extra_checkbutton.set_active(st)
512                                break
513                else:
514                        frame_gmail.hide()
515               
516                self.xml.signal_autoconnect(self)
517
518                self.sound_tree.get_model().connect('row-changed',
519                                        self.on_sounds_treemodel_row_changed)
520                self.msg_tree.get_model().connect('row-changed',
521                                        self.on_msg_treemodel_row_changed)
522                self.msg_tree.get_model().connect('row-deleted',
523                                        self.on_msg_treemodel_row_deleted)
524                self.default_msg_tree.get_model().connect('row-changed',
525                                        self.on_default_msg_treemodel_row_changed)
526               
527                self.theme_preferences = None
528               
529                self.notebook.set_current_page(0)
530                self.window.show_all()
531                gtkgui_helpers.possibly_move_window_in_current_desktop(self.window)
532
533        def on_preferences_window_key_press_event(self, widget, event):
534                if event.keyval == gtk.keysyms.Escape:
535                        self.window.hide()
536
537        def on_checkbutton_toggled(self, widget, config_name,
538                change_sensitivity_widgets = None):
539                gajim.config.set(config_name, widget.get_active())
540                if change_sensitivity_widgets:
541                        for w in change_sensitivity_widgets:
542                                w.set_sensitive(widget.get_active())
543                gajim.interface.save_config()
544
545        def on_trayicon_checkbutton_toggled(self, widget):
546                if widget.get_active():
547                        gajim.config.set('trayicon', True)
548                        gajim.interface.show_systray()
549                        show = helpers.get_global_show()
550                        gajim.interface.systray.change_status(show)
551                else:
552                        gajim.config.set('trayicon', False)
553                        if not gajim.interface.roster.window.get_property('visible'):
554                                gajim.interface.roster.window.present()
555                        gajim.interface.hide_systray()
556                        # no tray, show roster!
557                        gajim.config.set('show_roster_on_startup', True)
558                gajim.interface.roster.draw_roster()
559                gajim.interface.save_config()
560
561        def on_save_position_checkbutton_toggled(self, widget):
562                self.on_checkbutton_toggled(widget, 'saveposition')
563
564        def on_sort_by_show_checkbutton_toggled(self, widget):
565                self.on_checkbutton_toggled(widget, 'sort_by_show')
566                gajim.interface.roster.draw_roster()
567
568        def on_show_status_msgs_in_roster_checkbutton_toggled(self, widget):
569                self.on_checkbutton_toggled(widget, 'show_status_msgs_in_roster')
570                gajim.interface.roster.draw_roster()
571                for ctl in gajim.interface.msg_win_mgr.controls():
572                        if ctl.type_id == message_control.TYPE_GC:
573                                ctl.update_ui()
574
575        def on_show_avatars_in_roster_checkbutton_toggled(self, widget):
576                self.on_checkbutton_toggled(widget, 'show_avatars_in_roster')
577                gajim.interface.roster.draw_roster()
578                # Redraw connected groupchats (in an ugly way)
579                for account in gajim.connections:
580                        if gajim.connections[account].connected:
581                                for gc_control in gajim.interface.msg_win_mgr.get_controls(
582                                        message_control.TYPE_GC) + \
583                                        gajim.interface.minimized_controls[account].values():
584                                                gc_control.draw_roster()
585       
586        def on_emoticons_combobox_changed(self, widget):
587                active = widget.get_active()
588                model = widget.get_model()
589                emot_theme = model[active][0].decode('utf-8')
590                if emot_theme == _('Disabled'):
591                        gajim.config.set('emoticons_theme', '')
592                else:
593                        gajim.config.set('emoticons_theme', emot_theme)
594
595                gajim.interface.init_emoticons(need_reload = True)
596                gajim.interface.make_regexps()
597                self.toggle_emoticons()
598
599        def toggle_emoticons(self):
600                '''Update emoticons state in Opened Chat Windows'''
601                for win in gajim.interface.msg_win_mgr.windows():
602                        win.toggle_emoticons()
603
604        def on_iconset_combobox_changed(self, widget):
605                model = widget.get_model()
606                active = widget.get_active()
607                icon_string = model[active][1].decode('utf-8')
608                gajim.config.set('iconset', icon_string)
609                gajim.interface.roster.reload_jabber_state_images()
610                gajim.interface.save_config()
611
612        def on_transports_iconsets_checkbutton_toggled(self, widget):
613                self.on_checkbutton_toggled(widget, 'use_transports_iconsets')
614                gajim.interface.roster.reload_jabber_state_images()
615
616        def on_manage_theme_button_clicked(self, widget):
617                if self.theme_preferences is None:
618                        self.theme_preferences = dialogs.GajimThemesWindow()
619                else:
620                        self.theme_preferences.window.present()
621                        self.theme_preferences.select_active_theme()
622
623        def on_theme_combobox_changed(self, widget):
624                model = widget.get_model()
625                active = widget.get_active()
626                config_theme = model[active][0].decode('utf-8').replace(' ', '_')
627
628                gajim.config.set('roster_theme', config_theme)
629
630                # begin repainting themed widgets throughout
631                gajim.interface.roster.repaint_themed_widgets()
632                gajim.interface.roster.change_roster_style(None)
633                gajim.interface.save_config()
634
635        def update_theme_list(self):
636                theme_combobox = self.xml.get_widget('theme_combobox')
637                model = gtk.ListStore(str)
638                theme_combobox.set_model(model)
639                i = 0
640                for config_theme in gajim.config.get_per('themes'):
641                        theme = config_theme.replace('_', ' ')
642                        model.append([theme])
643                        if gajim.config.get('roster_theme') == config_theme:
644                                theme_combobox.set_active(i)
645                        i += 1
646
647        def on_open_advanced_notifications_button_clicked(self, widget):
648                dialogs.AdvancedNotificationsWindow()
649
650        def on_one_window_type_combo_changed(self, widget):
651                active = widget.get_active()
652                config_type = common.config.opt_one_window_types[active]
653                gajim.config.set('one_message_window', config_type)
654                gajim.interface.save_config()
655                gajim.interface.msg_win_mgr.reconfig()
656
657        def on_treat_incoming_messages_combobox_changed(self, widget):
658                active = widget.get_active()
659                config_type = common.config.opt_treat_incoming_messages[active]
660                gajim.config.set('treat_incoming_messages', config_type)
661
662        def apply_speller(self):
663                for acct in gajim.connections:
664                        for ctrl in gajim.interface.msg_win_mgr.controls():
665                                if isinstance(ctrl, chat_control.ChatControlBase):
666                                        try:
667                                                spell_obj = gtkspell.get_from_text_view(ctrl.msg_textview)
668                                        except:
669                                                spell_obj = None
670
671                                        if not spell_obj:
672                                                gtkspell.Spell(ctrl.msg_textview)
673
674        def remove_speller(self):
675                for acct in gajim.connections:
676                        for ctrl in gajim.interface.msg_win_mgr.controls():
677                                if isinstance(ctrl, chat_control.ChatControlBase):
678                                        try:
679                                                spell_obj = gtkspell.get_from_text_view(ctrl.msg_textview)
680                                        except:
681                                                spell_obj = None
682                                        if spell_obj:
683                                                spell_obj.detach()
684
685        def on_speller_checkbutton_toggled(self, widget):
686                active = widget.get_active()
687                gajim.config.set('use_speller', active)
688                gajim.interface.save_config()
689                if active:
690                        lang = gajim.config.get('speller_language')
691                        if not lang:
692                                lang = gajim.LANG
693                        tv = gtk.TextView()
694                        try:
695                                spell = gtkspell.Spell(tv, lang)
696                        except:
697                                dialogs.ErrorDialog(
698                                        _('Dictionary for lang %s not available') % lang,
699                                        _('You have to install %s dictionary to use spellchecking, or '
700                                        'choose another language by setting the speller_language option.'
701                                        ) % lang)
702                                gajim.config.set('use_speller', False)
703                                widget.set_active(False)
704                        else:
705                                gajim.config.set('speller_language', lang)
706                                self.apply_speller()
707                else:
708                        self.remove_speller()
709
710        def on_xhtml_checkbutton_toggled(self, widget):
711                self.on_checkbutton_toggled(widget, 'ignore_incoming_xhtml')
712               
713        def on_time_never_radiobutton_toggled(self, widget):
714                if widget.get_active():
715                        gajim.config.set('print_time', 'never')
716                gajim.interface.save_config()
717
718        def on_time_sometimes_radiobutton_toggled(self, widget):
719                if widget.get_active():
720                        gajim.config.set('print_time', 'sometimes')
721                gajim.interface.save_config()
722
723        def on_time_always_radiobutton_toggled(self, widget):
724                if widget.get_active():
725                        gajim.config.set('print_time', 'always')
726                gajim.interface.save_config()
727
728        def update_text_tags(self):
729                '''Update color tags in Opened Chat Windows'''
730                for win in gajim.interface.msg_win_mgr.windows():
731                        win.update_tags()
732
733        def on_preference_widget_color_set(self, widget, text):
734                color = widget.get_color()
735                color_string = gtkgui_helpers.make_color_string(color)
736                gajim.config.set(text, color_string)
737                self.update_text_tags()
738                gajim.interface.save_config()
739
740        def on_preference_widget_font_set(self, widget, text):
741                if widget:
742                        font = widget.get_font_name()
743                else:
744                        font = ''
745                gajim.config.set(text, font)
746                self.update_text_font()
747                gajim.interface.save_config()
748
749        def update_text_font(self):
750                '''Update text font in Opened Chat Windows'''
751                for win in gajim.interface.msg_win_mgr.windows():
752                        win.update_font()
753
754        def on_incoming_msg_colorbutton_color_set(self, widget):
755                self.on_preference_widget_color_set(widget, 'inmsgcolor')
756
757        def on_outgoing_msg_colorbutton_color_set(self, widget):
758                self.on_preference_widget_color_set(widget, 'outmsgcolor')
759
760        def on_url_msg_colorbutton_color_set(self, widget):
761                self.on_preference_widget_color_set(widget, 'urlmsgcolor')
762
763        def on_status_msg_colorbutton_color_set(self, widget):
764                self.on_preference_widget_color_set(widget, 'statusmsgcolor')
765
766        def on_conversation_fontbutton_font_set(self, widget):
767                self.on_preference_widget_font_set(widget, 'conversation_font')
768       
769        def on_default_chat_font_toggled(self, widget):
770                font_widget = self.xml.get_widget('conversation_fontbutton')
771                if widget.get_active():
772                        font_widget.set_sensitive(False)
773                        font_widget = None
774                else:
775                        font_widget.set_sensitive(True)
776                self.on_preference_widget_font_set(font_widget, 'conversation_font')
777
778        def on_reset_colors_button_clicked(self, widget):
779                for i in ('inmsgcolor', 'outmsgcolor', 'statusmsgcolor', 'urlmsgcolor'):
780                        gajim.config.set(i, gajim.interface.default_colors[i])
781
782                self.xml.get_widget('incoming_msg_colorbutton').set_color(\
783                        gtk.gdk.color_parse(gajim.config.get('inmsgcolor')))
784                self.xml.get_widget('outgoing_msg_colorbutton').set_color(\
785                        gtk.gdk.color_parse(gajim.config.get('outmsgcolor')))
786                self.xml.get_widget('status_msg_colorbutton').set_color(\
787                        gtk.gdk.color_parse(gajim.config.get('statusmsgcolor')))
788                self.xml.get_widget('url_msg_colorbutton').set_color(\
789                        gtk.gdk.color_parse(gajim.config.get('urlmsgcolor')))
790                self.update_text_tags()
791                gajim.interface.save_config()
792
793        def on_notify_on_new_message_radiobutton_toggled(self, widget):
794                self.on_checkbutton_toggled(widget, 'notify_on_new_message',
795                                        [self.auto_popup_away_checkbutton])
796
797        def on_popup_new_message_radiobutton_toggled(self, widget):
798                self.on_checkbutton_toggled(widget, 'autopopup',
799                                        [self.auto_popup_away_checkbutton])
800
801        def on_only_in_roster_radiobutton_toggled(self, widget):
802                if widget.get_active():
803                        self.auto_popup_away_checkbutton.set_sensitive(False)
804
805        def on_notify_on_signin_checkbutton_toggled(self, widget):
806                self.on_checkbutton_toggled(widget, 'notify_on_signin')
807
808        def on_notify_on_signout_checkbutton_toggled(self, widget):
809                self.on_checkbutton_toggled(widget, 'notify_on_signout')
810
811        def on_auto_popup_away_checkbutton_toggled(self, widget):
812                self.on_checkbutton_toggled(widget, 'autopopupaway')