Ticket #1041: gajim-message-mode.5.patch

File gajim-message-mode.5.patch, 80.6 kB (added by David Danier <goliath.mailinglist@…>, 12 months ago)

Some bugfixes

  • src/config.py

    ==== Patch <gajim-message-mode> level 11
    Source: c68c8ed0-6fce-42b2-a3b7-6be8b34235d4:/local:7692 [local]
    Target: c4d4e39b-2f5f-9a77-1c94-36969bb79148:/trunk:9014 [mirrored]
            (svn://svn.gajim.org/gajim/trunk)
    Log:
     r7653@damasonium:  ddanier | 2007-11-14 21:10:55 +0100
     
     r7654@damasonium:  ddanier | 2007-11-15 00:32:14 +0100
      * Implemented very simple message-mode like psi:
        - Configuration option for default-type of new messages when clicking on an roster item
        - SingleMessageWindow:
          - Added "Next" and "Quote" button
          - "Next"-button to read next message waiting
          - "Next"-button show how many messages are waiting (by subscribing to gajim.events)
          - "Reply"-button does not quote, "Quote"-button does
          - Focus on Text by default
          - "RE: " only added to subject if subject is not empty
          - "Reply"/"Quote" does not close received message window, the parent is closed when reply window is closed and only if there are no more messages waiting
     r7655@damasonium:  ddanier | 2007-11-15 00:33:26 +0100
      * TODO for message-mode
     r7658@damasonium:  ddanier | 2007-11-15 18:24:49 +0100
      * SingleMessageWindow:
        - Action-menu
        - Username is displayed
        - GPG-Support, but untested
      * typo in src/chat_control.py
     r7662@damasonium:  ddanier | 2007-11-15 20:33:24 +0100
      * Bugfix: new chat messages are accessible
      * SingleMessageWindow:
        - RosterIcons are displayed
        - GPG-Button works at least for outgoing messages :)
        - Activated encryption is saved to config, like in normal chat window
      * "send_outgoing_messages" renamed to "default_message_type" (see http://trac.gajim.org/ticket/1041#comment:9)
     r7665@damasonium:  ddanier | 2007-11-15 20:42:58 +0100
      * Keep "encrypted" on Reply
      * Use "gpg_enabled" from config
     r7666@damasonium:  ddanier | 2007-11-15 20:47:52 +0100
      * Better place for getting "gpg_enabled" out of config
      * GPG-Button gets no longer disabled when dealing with incoming messages (so status is visible, toggling the button doesn't hurt)
     r7667@damasonium:  ddanier | 2007-11-15 20:55:50 +0100
      * Bugfix: Fetching contact-information with self.get_contact() to early is bad
      * GPG-Button only active if contact has keyID attached
     r7668@damasonium:  ddanier | 2007-11-15 21:30:46 +0100
      * Deactivate GPG-Button if action=="receive" and not contact.keyID is set
     r7669@damasonium:  ddanier | 2007-11-15 23:27:24 +0100
      * Add resource to self.to_entry
     r7692@damasonium:  ddanier | 2007-11-19 16:52:03 +0100
      * Bugfix with encrypted-parameter for SingleMessageWindow
    
    === src/config.py
    ==================================================================
     
    7171                self.notebook = self.xml.get_widget('preferences_notebook') 
    7272                self.treat_incoming_messages_combobox =\ 
    7373                        self.xml.get_widget('treat_incoming_messages_combobox') 
     74                self.default_message_type_combobox =\ 
     75                        self.xml.get_widget('default_message_type_combobox') 
    7476                self.one_window_type_combobox =\ 
    7577                        self.xml.get_widget('one_window_type_combobox') 
    7678                self.iconset_combobox = self.xml.get_widget('iconset_combobox') 
     
    140142                else: 
    141143                        self.treat_incoming_messages_combobox.set_active(0) 
    142144 
     145                # Set default for send outgoing messages 
     146                choices = common.config.opt_default_message_type 
     147                type = gajim.config.get('default_message_type') 
     148                if type in choices: 
     149                        self.default_message_type_combobox.set_active(choices.index(type)) 
     150                else: 
     151                        self.default_message_type_combobox.set_active(0) 
     152 
    143153                # Set default for single window type 
    144154                choices = common.config.opt_one_window_types 
    145155                type = gajim.config.get('one_message_window') 
     
    581591                config_type = common.config.opt_treat_incoming_messages[active] 
    582592                gajim.config.set('treat_incoming_messages', config_type) 
    583593 
     594        def on_default_message_type_combobox_changed(self, widget): 
     595                active = widget.get_active() 
     596                config_type = common.config.opt_default_message_type[active] 
     597                gajim.config.set('default_message_type', config_type) 
     598 
    584599        def on_one_window_type_combo_changed(self, widget): 
    585600                active = widget.get_active() 
    586601                config_type = common.config.opt_one_window_types[active] 
  • src/roster_window.py

    === src/roster_window.py
    ==================================================================
     
    19701970                        self.draw_account(account) 
    19711971 
    19721972        def on_send_single_message_menuitem_activate(self, widget, account, 
    1973         contact = None): 
     1973        contact=None, resource=None): 
    19741974                if contact is None: 
    19751975                        dialogs.SingleMessageWindow(account, action = 'send') 
    19761976                elif type(contact) == type([]): 
    19771977                        dialogs.SingleMessageWindow(account, contact, 'send') 
    19781978                else: 
    19791979                        jid = contact.jid 
    1980                         if contact.jid == gajim.get_jid_from_account(account): 
     1980                        if resource: 
     1981                                jid += '/' + resource 
     1982                        elif contact.jid == gajim.get_jid_from_account(account): 
    19811983                                jid += '/' + contact.resource 
    19821984                        dialogs.SingleMessageWindow(account, jid, 'send') 
    19831985 
     
    43704372                                        else: 
    43714373                                                child_iter = model.iter_next(child_iter) 
    43724374                        session = None 
     4375                        chat_messages_waiting = False 
    43734376                        if first_ev: 
    43744377                                if first_ev.type_ in ('chat', 'normal'): 
    43754378                                        session = first_ev.parameters[8] 
     
    43784381                                        fjid += '/' + resource 
    43794382                                if self.open_event(account, fjid, first_ev): 
    43804383                                        return 
     4384                                elif first_ev.type_ == 'chat': 
     4385                                        chat_messages_waiting = True 
    43814386                        c = gajim.contacts.get_contact(account, jid, resource) 
    43824387                        if not c or isinstance(c, list): 
    43834388                                c = gajim.contacts.get_contact_with_highest_priority(account, jid) 
    43844389                        if jid == gajim.get_jid_from_account(account): 
    43854390                                resource = c.resource 
    4386                         self.on_open_chat_window(widget, c, account, resource = resource, session = session) 
     4391                        default_message_type = gajim.config.get('default_message_type') 
     4392                        if default_message_type == 'normal' and not chat_messages_waiting: 
     4393                                self.on_send_single_message_menuitem_activate(widget, account, c, resource = resource) 
     4394                        else: 
     4395                                self.on_open_chat_window(widget, c, account, resource = resource, session = session) 
    43874396 
    43884397        def on_roster_treeview_row_activated(self, widget, path, col = 0): 
    43894398                '''When an iter is double clicked: open the first event window''' 
  • src/dialogs.py

    === src/dialogs.py
    ==================================================================
     
    18321832        # Keep a reference on windows so garbage collector don't restroy them 
    18331833        instances = [] 
    18341834        def __init__(self, account, to='', action='', from_whom='', subject='', 
    1835         message='', resource='', session=None, form_node=None): 
     1835        message='', resource='', session=None, form_node=None, encrypted=None): 
    18361836                self.instances.append(self) 
    18371837                self.account = account 
    18381838                self.action = action 
     
    18441844                self.resource = resource 
    18451845                self.session = session 
    18461846 
     1847                if encrypted is None: 
     1848                        jid = to # cannot use self.get_contact(), as self.to_entry does not exist yet 
     1849                        contact = None 
     1850                        if '@' in jid: 
     1851                                if '/' in jid: 
     1852                                        jid, resource = jid.split('/', 1) 
     1853                                else: 
     1854                                        resource = self.resource 
     1855                                contact = gajim.contacts.get_contact(self.account, jid, resource) 
     1856                        if contact: # only load if we have a valid contact 
     1857                                encrypted = gajim.config.get_per('contacts', contact.jid, 'gpg_enabled') 
     1858                if encrypted is None: 
     1859                        encrypted = False 
     1860                self.encrypted = encrypted 
     1861                self.next_count = 0 
     1862 
    18471863                self.xml = gtkgui_helpers.get_glade('single_message_window.glade') 
    18481864                self.window = self.xml.get_widget('single_message_window') 
    18491865                self.count_chars_label = self.xml.get_widget('count_chars_label') 
    18501866                self.from_label = self.xml.get_widget('from_label') 
    18511867                self.from_entry = self.xml.get_widget('from_entry') 
     1868                self.from_status_image = self.xml.get_widget('from_status_image') 
     1869                self.from_name = self.xml.get_widget('from_name') 
    18521870                self.to_label = self.xml.get_widget('to_label') 
    18531871                self.to_entry = self.xml.get_widget('to_entry') 
     1872                self.to_status_image = self.xml.get_widget('to_status_image') 
     1873                self.to_name = self.xml.get_widget('to_name') 
    18541874                self.subject_entry = self.xml.get_widget('subject_entry') 
    18551875                self.message_scrolledwindow = self.xml.get_widget( 
    18561876                        'message_scrolledwindow') 
     
    18761896                                parent_box.child_get_property(self.xml.get_widget('conversation_scrolledwindow'), 'position')) 
    18771897                        self.action = 'form' 
    18781898 
     1899                self.gpg_togglebutton = self.xml.get_widget('gpg_togglebutton') 
     1900                self.gpg_togglebutton_separator = self.xml.get_widget('gpg_togglebutton_separator') 
    18791901                self.send_button = self.xml.get_widget('send_button') 
     1902                self.quote_button = self.xml.get_widget('quote_button') 
    18801903                self.reply_button = self.xml.get_widget('reply_button') 
     1904                self.next_button = self.xml.get_widget('next_button') 
     1905                self.next_count_label = self.xml.get_widget('next_count_label') 
    18811906                self.send_and_close_button = self.xml.get_widget('send_and_close_button') 
    18821907                self.cancel_button = self.xml.get_widget('cancel_button') 
    18831908                self.close_button = self.xml.get_widget('close_button') 
     
    18871912                        self.to_entry.set_text(jid) 
    18881913                        self.to_entry.set_sensitive(False) 
    18891914                else: 
    1890                         self.to_entry.set_text(to) 
     1915                        if resource and not '/' in to: 
     1916                                self.to_entry.set_text(to + '/' + resource) 
     1917                        else: 
     1918                                self.to_entry.set_text(to) 
    18911919 
    18921920                if gajim.config.get('use_speller') and HAS_GTK_SPELL and action == 'send': 
    18931921                        try: 
     
    19021930 
    19031931                self.prepare_widgets_for(self.action) 
    19041932 
     1933                gajim.events.event_added_subscribe(self.on_event_added) 
     1934                gajim.events.event_removed_subscribe(self.on_event_removed) 
     1935                if self.action == 'receive': 
     1936                        self.update_next_count() 
     1937 
    19051938                # set_text(None) raises TypeError exception 
    19061939                if self.subject is None: 
    19071940                        self.subject = '' 
     
    19241957 
    19251958                if gajim.config.get('saveposition'): 
    19261959                        # get window position and size from config 
    1927                         gtkgui_helpers.move_window(self.window, 
    1928                                 gajim.config.get('single-msg-x-position'), 
    1929                                 gajim.config.get('single-msg-y-position')) 
     1960                        # Makes absolutely no sense when dealing with multiple windows 
     1961                        # (for example when hitting "reply" the orig window stays) 
     1962                        #gtkgui_helpers.move_window(self.window, 
     1963                        #       gajim.config.get('single-msg-x-position'), 
     1964                        #       gajim.config.get('single-msg-y-position')) 
    19301965                        gtkgui_helpers.resize_window(self.window, 
    19311966                                gajim.config.get('single-msg-width'), 
    19321967                                gajim.config.get('single-msg-height')) 
     
    19682003                        self.send_and_close_button.show() 
    19692004                        self.to_label.show() 
    19702005                        self.to_entry.show() 
     2006                        self.to_status_image.show() 
     2007                        self.to_name.show() 
    19712008                        self.reply_button.hide() 
     2009                        self.quote_button.hide() 
     2010                        self.next_button.hide() 
    19722011                        self.from_label.hide() 
    19732012                        self.from_entry.hide() 
     2013                        self.from_status_image.hide() 
     2014                        self.from_name.hide() 
    19742015                        self.conversation_scrolledwindow.hide() 
    19752016                        self.message_scrolledwindow.show() 
     2017                        self.gpg_togglebutton.show() 
     2018                        if type(self.to) == type([]): 
     2019                                self.gpg_togglebutton.set_property('sensitive', False) 
     2020                                self.gpg_togglebutton.set_active(False) 
     2021                        else: 
     2022                                self.gpg_togglebutton.set_property('sensitive', True) 
     2023                                self.gpg_togglebutton.set_active(self.encrypted) 
     2024                        self.gpg_togglebutton_separator.show() 
    19762025 
    19772026                        if self.message: # we come from a reply? 
    19782027                                self.message_textview.grab_focus() 
     
    19832032                        else: # we write a new message (not from reply) 
    19842033                                self.close_button.hide() 
    19852034                                if self.to: # do we already have jid? 
    1986                                         self.subject_entry.grab_focus() 
     2035                                        # Most of the time users skip the subject 
     2036                                        #self.subject_entry.grab_focus() 
     2037                                        self.message_textview.grab_focus() 
     2038                                else: 
     2039                                        self.to_entry.grab_focus() 
     2040                        self.update_to_information() 
    19872041 
    19882042                elif action == 'receive': # prepare UI for Receiving 
    19892043                        title = _('Received %s') % title 
    19902044                        self.reply_button.show() 
     2045                        self.quote_button.show() 
     2046                        self.next_button.show() 
    19912047                        self.from_label.show() 
    19922048                        self.from_entry.show() 
     2049                        self.from_status_image.show() 
     2050                        self.from_name.show() 
    19932051                        self.send_button.hide() 
    19942052                        self.send_and_close_button.hide() 
    19952053                        self.to_label.hide() 
    19962054                        self.to_entry.hide() 
     2055                        self.to_status_image.hide() 
     2056                        self.to_name.hide() 
    19972057                        self.conversation_scrolledwindow.show() 
    19982058                        self.message_scrolledwindow.hide() 
     2059                        self.gpg_togglebutton.show() 
     2060                        self.gpg_togglebutton.set_active(self.encrypted) 
     2061                        self.gpg_togglebutton_separator.show() 
    19992062 
    20002063                        if self.message: 
    20012064                                self.conversation_textview.print_real_text(self.message) 
     
    20082071                        self.reply_button.grab_focus() 
    20092072                        self.cancel_button.hide() 
    20102073                        self.close_button.show() 
     2074                        self.update_from_information() 
     2075                         
    20112076                elif action == 'form': # prepare UI for Receiving 
    20122077                        title = _('Form %s') % title  
    20132078                        self.send_button.show()  
    20142079                        self.send_and_close_button.show()  
    20152080                        self.to_label.show()  
    20162081                        self.to_entry.show()  
     2082                        self.to_status_image.show() 
     2083                        self.to_name.show() 
    20172084                        self.reply_button.hide()  
    20182085                        self.from_label.hide()  
    20192086                        self.from_entry.hide()  
     2087                        self.from_status_image.hide() 
     2088                        self.from_name.hide() 
    20202089                        self.conversation_scrolledwindow.hide()  
    20212090                        self.message_scrolledwindow.hide()  
     2091                        self.gpg_togglebutton.hide() 
     2092                        self.gpg_togglebutton_separator.hide() 
     2093                        self.update_to_information() 
    20222094 
    20232095                self.window.set_title(title) 
    20242096 
     2097        def on_to_entry_changed(self, widget): 
     2098                self.update_to_information() 
     2099 
     2100        def update_to_information(self): 
     2101                jid, resource, contact = self.get_jid_resource_and_contact() 
     2102                if contact: 
     2103                        if contact.keyID: 
     2104                                self.gpg_togglebutton.set_property('sensitive', True) 
     2105                        else: 
     2106                                self.gpg_togglebutton.set_property('sensitive', False) 
     2107                        self.to_status_image.show() 
     2108                        roster = gajim.interface.roster 
     2109                        show = contact.show 
     2110                        img = roster.get_appropriate_state_images(jid, icon_name=show) 
     2111                        status_image = img[show] 
     2112                        if status_image.get_storage_type() == gtk.IMAGE_ANIMATION: 
     2113                                self.to_status_image.set_from_animation(status_image.get_animation()) 
     2114                        else: 
     2115                                pix = status_image.get_pixbuf() 
     2116                                if pix is not None: 
     2117                                        self.to_status_image.set_from_pixbuf(pix) 
     2118                        self.to_name.show() 
     2119                        self.to_name.set_text(contact.get_shown_name()) 
     2120                else: 
     2121                        self.to_status_image.hide() 
     2122                        self.to_name.hide() 
     2123 
     2124        def update_from_information(self): 
     2125                jid = self.from_whom 
     2126                contact = None 
     2127                if '@' in jid: 
     2128                        if '/' in jid: 
     2129                                jid, resource = jid.split('/', 1) 
     2130                        else: 
     2131                                resource = self.resource 
     2132                        contact = gajim.contacts.get_contact(self.account, jid, resource) 
     2133                if contact: 
     2134                        if contact.keyID: 
     2135                                self.gpg_togglebutton.set_property('sensitive', True) 
     2136                        else: 
     2137                                self.gpg_togglebutton.set_property('sensitive', False) 
     2138                        self.from_status_image.show() 
     2139                        roster = gajim.interface.roster 
     2140                        show = contact.show 
     2141                        img = roster.get_appropriate_state_images(jid, icon_name=show) 
     2142                        status_image = img[show] 
     2143                        if status_image.get_storage_type() == gtk.IMAGE_ANIMATION: 
     2144                                self.from_status_image.set_from_animation(status_image.get_animation()) 
     2145                        else: 
     2146                                pix = status_image.get_pixbuf() 
     2147                                if pix is not None: 
     2148                                        self.from_status_image.set_from_pixbuf(pix) 
     2149                        self.from_name.show() 
     2150                        self.from_name.set_text(contact.get_shown_name()) 
     2151                else: 
     2152                        self.from_status_image.hide() 
     2153                        self.from_name.hide() 
     2154 
     2155        def on_actions_button_clicked(self, widget): 
     2156                '''popup action menu''' 
     2157                menu = self.prepare_context_menu() 
     2158                menu.show_all() 
     2159                gtkgui_helpers.popup_emoticons_under_button(menu, widget, self.window.window) 
     2160 
     2161        def get_jid_and_resource(self): 
     2162                if self.action == 'receive': 
     2163                        jid = self.from_whom 
     2164                elif self.action == 'send': 
     2165                        jid = self.to_entry.get_text() 
     2166                else: 
     2167                        jid = self.to 
     2168                if '/' in jid: 
     2169                        jid, resource = jid.split('/', 1) 
     2170                else: 
     2171                        resource = self.resource 
     2172                return jid, resource 
     2173 
     2174        def get_contact(self): 
     2175                jid, resource = self.get_jid_and_resource() 
     2176                if '@' in jid: 
     2177                        return gajim.contacts.get_contact(self.account, jid, self.resource) 
     2178                else: 
     2179                        return None 
     2180 
     2181        def get_jid_resource_and_contact(self): 
     2182                jid, resource = self.get_jid_and_resource() 
     2183                if '@' in jid: 
     2184                        return jid, resource, gajim.contacts.get_contact(self.account, jid, self.resource) 
     2185                else: 
     2186                        return jid, resource, None 
     2187 
     2188        def prepare_context_menu(self): 
     2189                '''sets compact view menuitem active state 
     2190                sets active and sensitivity state for toggle_gpg_menuitem 
     2191                sets sensitivity for history_menuitem (False for transports) 
     2192                and file_transfer_menuitem 
     2193                and hide()/show() for add_to_roster_menuitem 
     2194                ''' 
     2195                xml = gtkgui_helpers.get_glade('chat_control_popup_menu.glade') 
     2196                menu = xml.get_widget('chat_control_popup_menu') 
     2197 
     2198                history_menuitem = xml.get_widget('history_menuitem') 
     2199                toggle_gpg_menuitem = xml.get_widget('toggle_gpg_menuitem') 
     2200                toggle_e2e_menuitem = xml.get_widget('toggle_e2e_menuitem') 
     2201                add_to_roster_menuitem = xml.get_widget('add_to_roster_menuitem') 
     2202                send_file_menuitem = xml.get_widget('send_file_menuitem') 
     2203                information_menuitem = xml.get_widget('information_menuitem') 
     2204                convert_to_gc_menuitem = xml.get_widget('convert_to_groupchat') 
     2205                muc_icon = gajim.interface.roster.load_icon('muc_active') 
     2206                if muc_icon: 
     2207                        convert_to_gc_menuitem.set_image(muc_icon)  
     2208 
     2209                jid, resource, contact = self.get_jid_resource_and_contact() 
     2210 
     2211                # check if gpg capabitlies or else make gpg toggle insensitive 
     2212                gpg_btn = self.gpg_togglebutton 
     2213                isactive = gpg_btn.get_active() 
     2214                is_sensitive = gpg_btn.get_property('sensitive') 
     2215                toggle_gpg_menuitem.set_active(isactive) 
     2216                toggle_gpg_menuitem.set_property('sensitive', is_sensitive) 
     2217 
     2218                # TODO: support this, if possible 
     2219                toggle_e2e_menuitem.set_sensitive(False) 
     2220 
     2221                # If we don't have resource, we can't do file transfer 
     2222                # in transports, contact holds our info we need to disable it too 
     2223                if jid and resource: 
     2224                        send_file_menuitem.set_sensitive(True) 
     2225                elif contact and contact.resource and contact.jid.find('@') != -1: 
     2226                        send_file_menuitem.set_sensitive(True) 
     2227                else: 
     2228                        send_file_menuitem.set_sensitive(False) 
     2229 
     2230                # check if it's possible to convert to groupchat 
     2231                if gajim.get_transport_name_from_jid(jid) or \ 
     2232                gajim.connections[self.account].is_zeroconf: 
     2233                        convert_to_gc_menuitem.set_sensitive(False) 
     2234 
     2235                # add_to_roster_menuitem 
     2236                if contact and _('Not in Roster') in contact.groups: 
     2237                        add_to_roster_menuitem.show() 
     2238                        add_to_roster_menuitem.set_no_show_all(False) 
     2239                else: 
     2240                        add_to_roster_menuitem.hide() 
     2241                        add_to_roster_menuitem.set_no_show_all(True) 
     2242 
     2243                # connect signals 
     2244                history_menuitem.connect('activate',  
     2245                        self.on_history_menuitem_activate) 
     2246                send_file_menuitem.connect('activate',  
     2247                        self.on_send_file_menuitem_activate) 
     2248                add_to_roster_menuitem.connect('activate',  
     2249                        self.on_add_to_roster_menuitem_activate) 
     2250                toggle_gpg_menuitem.connect('activate',  
     2251                        self.on_toggle_gpg_menuitem_activate) 
     2252                #toggle_e2e_menuitem.connect('activate',  
     2253                #       self.on_toggle_e2e_menuitem_activate) 
     2254                information_menuitem.connect('activate',  
     2255                        self.on_contact_information_menuitem_activate) 
     2256                convert_to_gc_menuitem.connect('activate', 
     2257                        self.on_convert_to_gc_menuitem_activate) 
     2258                menu.connect('selection-done', self.destroy_menu) 
     2259                return menu 
     2260 
     2261        def destroy_menu(self, menu): 
     2262                # destroy menu 
     2263                menu.destroy() 
     2264 
     2265        def on_history_menuitem_activate(self, widget): 
     2266                '''When history menuitem is pressed: call history window''' 
     2267                import history_window 
     2268                jid, resource = self.get_jid_and_resource() 
     2269 
     2270                if gajim.interface.instances.has_key('logs'): 
     2271                        gajim.interface.instances['logs'].window.present() 
     2272                        gajim.interface.instances['logs'].open_history(jid, self.account) 
     2273                else: 
     2274                        gajim.interface.instances['logs'] = \ 
     2275                                history_window.HistoryWindow(jid, self.account) 
     2276 
     2277        def on_send_file_menuitem_activate(self, widget): 
     2278                contact = self.get_contact() 
     2279                if contact: 
     2280                        gajim.interface.instances['file_transfers'].show_file_send_request(  
     2281                                self.account, contact) 
     2282 
     2283        def on_add_to_roster_menuitem_activate(self, widget): 
     2284                jid, resource = self.get_jid_and_resource() 
     2285                AddNewContactWindow(self.account, jid) 
     2286 
     2287        def on_toggle_gpg_menuitem_activate(self, widget): 
     2288                if self.gpg_togglebutton.get_active(): 
     2289                        self.gpg_togglebutton.set_active(False) 
     2290                else: 
     2291                        self.gpg_togglebutton.set_active(True) 
     2292                self.gpg_togglebutton.toggled() 
     2293 
     2294        def on_gpg_togglebutton_toggled(self, widget): 
     2295                self.encrypted = self.gpg_togglebutton.get_active() 
     2296                contact = self.get_contact() 
     2297                if contact: # only save if we have a valid contact 
     2298                        gajim.config.set_per('contacts', contact.jid, 'gpg_enabled', 
     2299                                self.encrypted) 
     2300 
     2301        def on_contact_information_menuitem_activate(self, widget): 
     2302                contact = self.get_contact() 
     2303                if contact: 
     2304                        gajim.interface.roster.on_info(widget, contact, self.account) 
     2305 
     2306        def on_convert_to_gc_menuitem_activate(self, widget): 
     2307                '''user want to invite some friends to chat''' 
     2308                jid, resource = self.get_jid_and_resource() 
     2309                TransformChatToMUC(self.account, [jid]) 
     2310 
     2311        def on_single_message_window_destroy(self, widget): 
     2312                gajim.events.event_added_unsubscribe(self.on_event_added) 
     2313                gajim.events.event_removed_unsubscribe(self.on_event_removed) 
     2314 
     2315        def update_next_count(self): 
     2316                # gajim.get_jid_without_resource(self.from_jid)? 
     2317                self.next_count = len(gajim.events.get_events(self.account, \ 
     2318                        self.from_whom, types=('normal',))) 
     2319                self.next_count_label.set_label("(%d)" % self.next_count) 
     2320                if self.next_count == 0: 
     2321                        self.next_button.set_property('sensitive', False) 
     2322                else: 
     2323                        self.next_button.set_property('sensitive', True) 
     2324 
     2325        def on_event_added(self, event): 
     2326                if event.type_ == 'normal': 
     2327                        self.update_next_count() 
     2328 
     2329        def on_event_removed(self, event_list): 
     2330                for event in event_list: 
     2331                        if event.type_ == 'normal': 
     2332                                self.update_next_count() 
     2333                                return 
     2334 
     2335        def on_next_button_clicked(self, widget): 
     2336                if self.next_count == 0: 
     2337                        return 
     2338                next_event = gajim.events.get_first_event(self.account, self.from_whom, 'normal') 
     2339                #if not next_event: 
     2340                #       next_event = gajim.events.get_first_event(self.account, self.from_whom, 'chat') 
     2341                if not next_event: 
     2342                        return 
     2343                # parameters: 
     2344                # message, subject, kind, time, encrypted, resource, 
     2345                # msg_id 
     2346                self.action = 'receive' 
     2347                self.subject = next_event.parameters[1] 
     2348                self.message = next_event.parameters[0] 
     2349                self.resource = next_event.parameters[5] 
     2350                self.session = next_event.parameters[8] 
     2351                form_node = next_event.parameters[9] 
     2352                 
     2353                parent_box = self.xml.get_widget('conversation_scrolledwindow').get_parent() 
     2354                if form_node: 
     2355                        dataform = dataforms.ExtendForm(node = form_node) 
     2356                        self.form_widget = dataforms_widget.DataFormWidget(dataform) 
     2357                        self.form_widget.show_all() 
     2358                        parent_box.add(self.form_widget) 
     2359                        parent_box.child_set_property(self.form_widget, 'position', 
     2360                                parent_box.child_get_property(self.xml.get_widget('conversation_scrolledwindow'), 'position')) 
     2361                        self.action = 'form' 
     2362                elif self.form_widget: 
     2363                        self.form_widget.hide() 
     2364                        parent_box.remove(self.form_widget) 
     2365                        self.form_widget = None 
     2366 
     2367                self.conversation_textview.clear() 
     2368                self.prepare_widgets_for(self.action) 
     2369 
     2370                # set_text(None) raises TypeError exception 
     2371                if self.subject is None: 
     2372                        self.subject = '' 
     2373                self.subject_entry.set_text(self.subject) 
     2374 
     2375                gajim.interface.remove_first_event(self.account, self.from_whom, next_event.type_) 
     2376                self.update_next_count() 
     2377 
    20252378        def on_cancel_button_clicked(self, widget): 
    20262379                self.save_pos() 
    20272380                self.window.destroy() 
     
    20662419                                form_node = self.form_widget.data_form