Changeset 9625
- Timestamp:
- 05/13/08 03:59:10 (6 months ago)
- Location:
- trunk/src
- Files:
-
- 2 added
- 17 modified
-
chat_control.py (modified) (55 diffs)
-
common/commands.py (modified) (2 diffs)
-
common/connection_handlers.py (modified) (17 diffs)
-
common/events.py (modified) (2 diffs)
-
common/gajim.py (modified) (2 diffs)
-
common/pep.py (modified) (1 diff)
-
common/stanza_session.py (modified) (8 diffs)
-
common/zeroconf/connection_handlers_zeroconf.py (modified) (2 diffs)
-
dialogs.py (modified) (1 diff)
-
gajim.py (modified) (31 diffs)
-
groupchat_control.py (modified) (15 diffs)
-
message_control.py (modified) (5 diffs)
-
message_window.py (modified) (12 diffs)
-
notify.py (modified) (2 diffs)
-
otr_windows.py (modified) (1 diff)
-
roster_window.py (modified) (25 diffs)
-
session.py (added)
-
tictactoe.py (added)
-
vcard.py (modified) (1 diff)
Legend:
- Unmodified
- Added
- Removed
-
trunk/src/chat_control.py
r9616 r9625 7 7 ## Copyright (C) 2007 Lukas Petrovicky <lukas@petrovicky.net> 8 8 ## Julien Pivotto <roidelapluie@gmail.com> 9 ## Stephan Erb <steve-e@h3c.de> 9 ## Stephan Erb <steve-e@h3c.de> 10 10 ## 11 11 ## This file is part of Gajim. … … 105 105 106 106 def draw_banner(self): 107 '''Draw the fat line at the top of the window that 108 houses the icon, jid, ... 107 '''Draw the fat line at the top of the window that 108 houses the icon, jid, ... 109 109 ''' 110 110 self.draw_banner_text() … … 134 134 helpers.launch_browser_mailer('url', url) 135 135 136 def __init__(self, type_id, parent_win, widget_name, contact, acct, 136 def __init__(self, type_id, parent_win, widget_name, contact, acct, 137 137 resource = None): 138 138 MessageControl.__init__(self, type_id, parent_win, widget_name, … … 239 239 gtk.DEST_DEFAULT_HIGHLIGHT, 240 240 self.dnd_list, gtk.gdk.ACTION_COPY) 241 241 242 242 self.update_font() 243 243 … … 267 267 # iterating on a copy 268 268 for lang in dict(langs): 269 try: 269 try: 270 270 spell.set_language(langs[lang]) 271 271 except: … … 331 331 menu.show_all() 332 332 333 # moved from ChatControl 333 # moved from ChatControl 334 334 def _on_banner_eventbox_button_press_event(self, widget, event): 335 335 '''If right-clicked, show popup''' … … 363 363 self.disconnect_style_event(self.banner_status_label) 364 364 if bgcolor: 365 banner_eventbox.modify_bg(gtk.STATE_NORMAL, 365 banner_eventbox.modify_bg(gtk.STATE_NORMAL, 366 366 gtk.gdk.color_parse(bgcolor)) 367 367 default_bg = False … … 392 392 widget.disconnect(id) 393 393 del self.handlers[id] 394 394 395 395 def connect_style_event(self, widget, set_fg = False, set_bg = False): 396 396 self.disconnect_style_event(widget) … … 399 399 400 400 def _on_style_set_event(self, widget, style, *opts): 401 '''set style of widget from style class *.Frame.Eventbox 401 '''set style of widget from style class *.Frame.Eventbox 402 402 opts[0] == True -> set fg color 403 403 opts[1] == True -> set bg color''' … … 565 565 else: # ENTER 566 566 send_message = True 567 567 568 568 if gajim.connections[self.account].connected < 2: # we are not connected 569 569 dialogs.ErrorDialog(_('A connection is not available'), … … 645 645 max_size = gajim.config.get('key_up_lines') 646 646 if size >= max_size: 647 for i in xrange(0, size - 1): 647 for i in xrange(0, size - 1): 648 648 self.sent_history[i] = self.sent_history[i + 1] 649 649 self.sent_history[max_size - 1] = message … … 694 694 # we want to have save this message in events list 695 695 # other_tags_for_text == ['marked'] --> highlighted gc message 696 type_ = 'printed_' + self.type_id697 event = 'message_received'698 696 if gc_message: 699 697 if 'marked' in other_tags_for_text: … … 702 700 type_ = 'printed_gc_msg' 703 701 event = 'gc_message_received' 702 else: 703 type_ = 'printed_' + self.type_id 704 event = 'message_received' 704 705 show_in_roster = notify.get_show_in_roster(event, 705 self.account, self.contact )706 self.account, self.contact, self.session) 706 707 show_in_systray = notify.get_show_in_systray(event, 707 708 self.account, self.contact, type_) 708 event = gajim.events.create_event(type_, None, 709 710 event = gajim.events.create_event(type_, (self.session,), 709 711 show_in_roster = show_in_roster, 710 712 show_in_systray = show_in_systray) … … 723 725 kind in ('incoming', 'incoming_queue'): 724 726 self.parent_win.redraw_tab(self) 725 ctrl = gajim.interface.msg_win_mgr.get_control(full_jid, self.account)726 727 if not self.parent_win.is_active(): 727 self.parent_win.show_title(True, ctrl) # Enabled Urgent hint728 self.parent_win.show_title(True, self) # Enabled Urgent hint 728 729 else: 729 self.parent_win.show_title(False, ctrl) # Disabled Urgent hint730 self.parent_win.show_title(False, self) # Disabled Urgent hint 730 731 731 732 def toggle_emoticons(self): … … 857 858 # we don't want to always resize in height the message_textview 858 859 # so we have minimum on conversation_textview's scrolled window 859 # but we also want to avoid window resizing so if we reach that 860 # but we also want to avoid window resizing so if we reach that 860 861 # minimum for conversation_textview and maximum for message_textview 861 862 # we set to automatic the scrollbar policy … … 868 869 # scroll only when scrollbar appear 869 870 if policy != gtk.POLICY_AUTOMATIC: 870 self.msg_scrolledwindow.set_property('vscrollbar-policy', 871 self.msg_scrolledwindow.set_property('vscrollbar-policy', 871 872 gtk.POLICY_AUTOMATIC) 872 self.msg_scrolledwindow.set_property('height-request', 873 self.msg_scrolledwindow.set_property('height-request', 873 874 message_height + conversation_height - min_height) 874 875 self.bring_scroll_to_end(msg_textview) 875 876 else: 876 self.msg_scrolledwindow.set_property('vscrollbar-policy', 877 self.msg_scrolledwindow.set_property('vscrollbar-policy', 877 878 gtk.POLICY_NEVER) 878 879 self.msg_scrolledwindow.set_property('height-request', -1) … … 884 885 # if message we have in message_textview is too big 885 886 if requisition.width > message_width: 886 self.msg_scrolledwindow.set_property('hscrollbar-policy', 887 self.msg_scrolledwindow.set_property('hscrollbar-policy', 887 888 gtk.POLICY_AUTOMATIC) 888 889 else: 889 self.msg_scrolledwindow.set_property('hscrollbar-policy', 890 self.msg_scrolledwindow.set_property('hscrollbar-policy', 890 891 gtk.POLICY_NEVER) 891 892 … … 917 918 918 919 if not len(gajim.events.get_events(self.account, jid, types_list)): 919 return 920 return 920 921 if not self.parent_win: 921 922 return … … 924 925 self.parent_win.window.is_active(): 925 926 # we are at the end 926 if not gajim.events.remove_events(self.account, self.get_full_jid(), 927 types = types_list): 927 if not self.session.remove_events(types_list): 928 928 # There were events to remove 929 929 self.redraw_after_event_removed(jid) 930 930 931 931 def redraw_after_event_removed(self, jid): 932 ''' We just removed a 'printed_*' event, redraw contact in roster or 932 ''' We just removed a 'printed_*' event, redraw contact in roster or 933 933 gc_roster and titles in roster and msg_win ''' 934 934 self.parent_win.redraw_tab(self) … … 937 937 if self.type_id == message_control.TYPE_PM: 938 938 room_jid, nick = gajim.get_room_and_nick_from_fjid(jid) 939 groupchat_control = gajim.interface.msg_win_mgr.get_ control(939 groupchat_control = gajim.interface.msg_win_mgr.get_gc_control( 940 940 room_jid, self.account) 941 941 if room_jid in gajim.interface.minimized_controls[self.account]: … … 948 948 gajim.interface.roster.draw_contact(room_jid, self.account) 949 949 groupchat_control.draw_contact(nick) 950 mw = gajim.interface.msg_win_mgr.get_window(room_jid, self.account) 951 if mw: 952 mw.redraw_tab(groupchat_control) 950 if groupchat_control.parent_win: 951 groupchat_control.parent_win.redraw_tab(groupchat_control) 953 952 else: 954 953 gajim.interface.roster.draw_contact(jid, self.account) … … 956 955 957 956 def sent_messages_scroll(self, direction, conv_buf): 958 size = len(self.sent_history) 957 size = len(self.sent_history) 959 958 if self.orig_msg is None: 960 959 # user was typing something and then went into history, so save … … 1054 1053 self.widget_set_visible(self.xml.get_widget('banner_eventbox'), 1055 1054 gajim.config.get('hide_chat_banner')) 1056 1055 1057 1056 # Add lock image to show chat encryption 1058 1057 self.lock_image = self.xml.get_widget('lock_image') … … 1081 1080 gajim.connections[self.account].is_zeroconf: 1082 1081 convert_to_gc_button.set_sensitive(False) 1083 1082 1084 1083 # keep timeout id and window obj for possible big avatar 1085 1084 # it is on enter-notify and leave-notify so no need to be per jid … … 1127 1126 msg = _('GPG encryption enabled') 1128 1127 ChatControlBase.print_conversation_line(self, msg, 'status', '', None) 1129 1128 1130 1129 if self.session: 1131 1130 self.session.loggable = gajim.config.get('log_encrypted_sessions') 1132 1131 self._show_lock_image(self.gpg_is_active, 'GPG', self.gpg_is_active, self.session and \ 1133 1132 self.session.is_loggable()) 1134 1133 1135 1134 self.status_tooltip = gtk.Tooltips() 1136 1135 … … 1155 1154 avatar_w = avatar_pixbuf.get_width() 1156 1155 avatar_h = avatar_pixbuf.get_height() 1157 1156 1158 1157 scaled_buf = self.xml.get_widget('avatar_image').get_pixbuf() 1159 1158 scaled_buf_w = scaled_buf.get_width() 1160 1159 scaled_buf_h = scaled_buf.get_height() 1161 1160 1162 1161 # do we have something bigger to show? 1163 1162 if avatar_w > scaled_buf_w or avatar_h > scaled_buf_h: … … 1165 1164 self.show_bigger_avatar_timeout_id = gobject.timeout_add(500, 1166 1165 self.show_bigger_avatar, widget) 1167 1166 1168 1167 def on_avatar_eventbox_leave_notify_event(self, widget, event): 1169 1168 '''we left the eventbox area that holds the avatar img''' … … 1177 1176 menu = gtk.Menu() 1178 1177 menuitem = gtk.ImageMenuItem(gtk.STOCK_SAVE_AS) 1179 id = menuitem.connect('activate', 1178 id = menuitem.connect('activate', 1180 1179 gtkgui_helpers.on_avatar_save_as_menuitem_activate, 1181 1180 self.contact.jid, self.account, self.contact.get_shown_name() + \ … … 1184 1183 menu.append(menuitem) 1185 1184 menu.show_all() 1186 menu.connect('selection-done', lambda w:w.destroy()) 1185 menu.connect('selection-done', lambda w:w.destroy()) 1187 1186 # show the menu 1188 1187 menu.show_all() … … 1269 1268 1270 1269 def draw_banner_text(self): 1271 '''Draw the text in the fat line at the top of the window that 1272 houses the name, jid. 1270 '''Draw the text in the fat line at the top of the window that 1271 houses the name, jid. 1273 1272 ''' 1274 1273 contact = self.contact … … 1277 1276 banner_name_label = self.xml.get_widget('banner_name_label') 1278 1277 banner_eventbox = self.xml.get_widget('banner_eventbox') 1279 1278 1280 1279 name = contact.get_shown_name() 1281 1280 if self.resource: … … 1364 1363 self.gpg_is_active = False 1365 1364 msg = _('GPG encryption disabled') 1366 ChatControlBase.print_conversation_line(self, msg, 'status', '', None) 1365 ChatControlBase.print_conversation_line(self, msg, 'status', '', None) 1367 1366 if self.session: 1368 1367 self.session.loggable = True … … 1389 1388 gajim.config.set_per('contacts', self.contact.jid, 'gpg_enabled', 1390 1389 self.gpg_is_active) 1391 1390 1392 1391 self._show_lock_image(self.gpg_is_active, 'GPG', self.gpg_is_active, self.session and \ 1393 1392 self.session.is_loggable()) 1394 1393 1395 1394 def _show_lock_image(self, visible, enc_type = '', enc_enabled = False, chat_logged = False): 1396 '''Set lock icon visibi ity and create tooltip'''1395 '''Set lock icon visibility and create tooltip''' 1397 1396 status_string = enc_enabled and 'is' or 'is NOT' 1398 1397 logged_string = chat_logged and 'will' or 'will NOT' … … 1550 1549 # True refresh 30 seconds vars too or else it's 30 - 5 = 25 seconds! 1551 1550 self.reset_kbd_mouse_timeout_vars() 1552 return True # loop forever 1551 return True # loop forever 1553 1552 1554 1553 def check_for_possible_inactive_chatstate(self, arg): … … 1602 1601 ChatControlBase.print_conversation_line(self, msg, 'status', '', None) 1603 1602 self._show_lock_image(e2e_is_active, 'E2E', e2e_is_active, self.session and \ 1604 self.session.is_loggable()) 1603 self.session.is_loggable()) 1605 1604 1606 1605 def print_conversation(self, text, frm='', tim=None, encrypted=False, … … 1626 1625 if not encrypted: 1627 1626 msg = _('The following message was NOT encrypted') 1628 ChatControlBase.print_conversation_line(self, msg, 1627 ChatControlBase.print_conversation_line(self, msg, 1629 1628 'status', '', tim) 1630 1629 else: … … 1632 1631 if encrypted and not self.gpg_is_active: 1633 1632 msg = _('The following message was encrypted') 1634 ChatControlBase.print_conversation_line(self, msg, 1633 ChatControlBase.print_conversation_line(self, msg, 1635 1634 'status', '', tim) 1636 1635 self._toggle_gpg() … … 1673 1672 unread = '[' + unicode(num_unread) + ']' 1674 1673 1675 # Draw tab label using chatstate 1674 # Draw tab label using chatstate 1676 1675 theme = gajim.config.get('roster_theme') 1677 1676 color = None … … 1701 1700 else: # active or not chatstate, get color from gtk 1702 1701 color = self.parent_win.notebook.style.fg[gtk.STATE_ACTIVE] 1703 1702 1704 1703 1705 1704 name = self.contact.get_shown_name() … … 1720 1719 # Set tab image (always 16x16); unread messages show the 'event' image 1721 1720 tab_img = None 1722 1721 1723 1722 if num_unread and gajim.config.get('show_unread_tab_icon'): 1724 1723 img_16 = gajim.interface.roster.get_appropriate_state_images( … … 1761 1760 muc_icon = gtkgui_helpers.load_icon('muc_active') 1762 1761 if muc_icon: 1763 convert_to_gc_menuitem.set_image(muc_icon) 1762 convert_to_gc_menuitem.set_image(muc_icon) 1764 1763 1765 1764 ag = gtk.accel_groups_from_object(self.parent_win.window)[0] … … 1775 1774 contact = self.parent_win.get_active_contact() 1776 1775 jid = contact.jid 1777 1776 1778 1777 # check if we support and use gpg 1779 1778 if not gajim.config.get_per('accounts', self.account, 'keyid') or\ … … 1815 1814 1816 1815 # connect signals 1817 id = history_menuitem.connect('activate', 1816 id = history_menuitem.connect('activate', 1818 1817 self._on_history_menuitem_activate) 1819 1818 self.handlers[id] = history_menuitem 1820 id = send_file_menuitem.connect('activate', 1819 id = send_file_menuitem.connect('activate', 1821 1820 self._on_send_file_menuitem_activate) 1822 self.handlers[id] = send_file_menuitem 1821 self.handlers[id] = send_file_menuitem 1823 1822 id = add_to_roster_menuitem.connect('activate', 1824 1823 self._on_add_to_roster_menuitem_activate) … … 1827 1826 self._on_toggle_gpg_menuitem_activate) 1828 1827 self.handlers[id] = toggle_gpg_menuitem 1829 id = toggle_e2e_menuitem.connect('activate', 1828 id = toggle_e2e_menuitem.connect('activate', 1830 1829 self._on_toggle_e2e_menuitem_activate) 1831 self.handlers[id] = toggle_e2e_menuitem 1832 id = information_menuitem.connect('activate', 1830 self.handlers[id] = toggle_e2e_menuitem 1831 id = information_menuitem.connect('activate', 1833 1832 self._on_contact_information_menuitem_activate) 1834 1833 self.handlers[id] = information_menuitem … … 1886 1885 # this function checks for that and just returns so it's safe to call it 1887 1886 # with same state. 1888 1887 1889 1888 # This functions also checks for violation in state transitions 1890 1889 # and raises RuntimeException with appropriate message … … 1915 1914 return 1916 1915 1917 # if the new state we wanna send (state) equals 1916 # if the new state we wanna send (state) equals 1918 1917 # the current state (contact.our_chatstate) then return 1919 1918 if contact.our_chatstate == state: … … 1927 1926 # for that procedure so return to make sure we send only once 1928 1927 # 'active' until we know peer supports jep85 1929 return 1928 return 1930 1929 1931 1930 if contact.our_chatstate == 'ask': … … 1947 1946 contact.our_chatstate = 'active' 1948 1947 self.reset_kbd_mouse_timeout_vars() 1949 1948 1950 1949 # if we're inactive prevent composing (JEP violation) 1951 1950 elif contact.our_chatstate == 'inactive' and state == 'composing': … … 1964 1963 # destroy banner tooltip - bug #pygtk for that! 1965 1964 self.status_tooltip.destroy() 1965 1966 1966 # Send 'gone' chatstate 1967 1967 self.send_chatstate('gone', self.contact) 1968 1968 self.contact.chatstate = None 1969 1969 self.contact.our_chatstate = None 1970 1971 # disconnect self from session 1972 self.session.control = None 1973 1970 1974 # Disconnect timer callbacks 1971 1975 gobject.source_remove(self.possible_paused_timeout_id) … … 2174 2178 self.print_esession_details() 2175 2179 2176 # Is it a pm ?2177 is_pm = False2178 room_jid, nick = gajim.get_room_and_nick_from_fjid(jid)2179 control = gajim.interface.msg_win_mgr.get_control(room_jid, self.account)2180 if control and control.type_id == message_control.TYPE_GC:2181 is_pm = True2182 2180 # list of message ids which should be marked as read 2183 2181 message_ids = [] … … 2204 2202 2205 2203 typ = 'chat' # Is it a normal chat or a pm ? 2204 2206 2205 # reset to status image in gc if it is a pm 2207 if is_pm: 2206 # Is it a pm ? 2207 room_jid, nick = gajim.get_room_and_nick_from_fjid(jid) 2208 control = gajim.interface.msg_win_mgr.get_gc_control(room_jid, 2209 self.account) 2210 if control and control.type_id == message_control.TYPE_GC: 2208 2211 control.update_ui() 2209 2212 control.parent_win.show_title()
