changeset e08557899421 in /home/hg/repos/gajim
details:http://hg.gajim.org/gajim?cmd=changeset;node=e08557899421 description: whiteboard still does not show, glade made
diffstat:
data/emoticons/static/emoticons.pyo | data/glade/message_window.glade | 2 +- src/chat_control.py | 29 +- src/chat_control2.py | 2753 +++++++++++++++++++++++ src/common/connection.py.orig | 1995 +++++++++++++++++ src/common/xmpp/__init__.pyc | src/common/xmpp/__init__.pyo | src/common/xmpp/auth_nb.pyc | src/common/xmpp/auth_nb.pyo | src/common/xmpp/bosh.pyc | src/common/xmpp/bosh.pyo | src/common/xmpp/c14n.pyo | src/common/xmpp/client_nb.pyc | src/common/xmpp/client_nb.pyo | src/common/xmpp/dispatcher_nb.pyc | src/common/xmpp/dispatcher_nb.pyo | src/common/xmpp/features_nb.pyc | src/common/xmpp/features_nb.pyo | src/common/xmpp/idlequeue.pyc | src/common/xmpp/idlequeue.pyo | src/common/xmpp/plugin.pyc | src/common/xmpp/plugin.pyo | src/common/xmpp/protocol.pyc | src/common/xmpp/protocol.pyo | src/common/xmpp/proxy_connectors.pyc | src/common/xmpp/proxy_connectors.pyo | src/common/xmpp/roster_nb.pyc | src/common/xmpp/roster_nb.pyo | src/common/xmpp/simplexml.pyc | src/common/xmpp/simplexml.pyo | src/common/xmpp/tls_nb.pyc | src/common/xmpp/tls_nb.pyo | src/common/xmpp/transports_nb.pyc | src/common/xmpp/transports_nb.pyo | src/common/zeroconf/__init__.pyo | src/common/zeroconf/client_zeroconf.pyo | src/common/zeroconf/connection_handlers_zeroconf.pyo | src/common/zeroconf/connection_zeroconf.pyo | src/common/zeroconf/roster_zeroconf.pyo | src/common/zeroconf/zeroconf.pyo | src/osx/__init__.pyo | src/whiteboardtest.svg | 1 + src/whiteboardwidget.py | 12 +- src/whiteboardwidget.py.orig | 197 + 44 files changed, 4977 insertions(+), 12 deletions(-)
diffs (truncated from 5127 to 300 lines):
diff -r 19f0ee88d090 -r e08557899421 data/emoticons/static/emoticons.pyo Binary file data/emoticons/static/emoticons.pyo has changed diff -r 19f0ee88d090 -r e08557899421 data/glade/message_window.glade --- a/data/glade/message_window.glade Thu Jul 16 03:27:32 2009 -0700 +++ b/data/glade/message_window.glade Tue Jul 21 04:13:47 2009 -0700 @@ -534,7 +534,7 @@ </packing> </child> <child> - <placeholder/> + <placeholder /> </child> </widget> </child> diff -r 19f0ee88d090 -r e08557899421 src/chat_control.py --- a/src/chat_control.py Thu Jul 16 03:27:32 2009 -0700 +++ b/src/chat_control.py Tue Jul 21 04:13:47 2009 -0700 @@ -2750,14 +2750,33 @@ def _on_whiteboard_button_clicked(self, widget): hbox = self.xml.get_widget('chat_child_hbox') - if len(hbox.get_children()) == 1: + if 1 == 1: + whiteboard_container = self.xml.get_widget('whiteboard_hbox') whiteboard = Whiteboard(self.account, self.contact) try: - hbox.pack_start(whiteboard) + hbox.pack_start(whiteboard_container) + whiteboard_container.show() + + whiteboard.set_size_request(300, 0) + whiteboard_container.pack_start(whiteboard, expand=False, fill=False) whiteboard.show() - # set minimum size - whiteboard.set_size_request(300, 0) - hbox.pack_start(whiteboard, expand=False, fill=False) + + widget = self.xml.get_widget('whiteboard_brush_button') + if widget is not None: + id_ = widget.connect('clicked', whiteboard.tool_change, 'brush') + self.handlers[id_] = widget + + widget = self.xml.get_widget('whiteboard_oval_button') + if widget is not None: + id_ = widget.connect('clicked', whiteboard.tool_change, 'oval') + self.handlers[id_] = widget + + widget = self.xml.get_widget('whiteboard_export_button') + if widget is not None: + id_ = widget.connect('clicked', whiteboard.export) + self.handlers[id_] = widget + + except: pass # TODO: Fix problem with groupchat?
diff -r 19f0ee88d090 -r e08557899421 src/chat_control2.py --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/src/chat_control2.py Tue Jul 21 04:13:47 2009 -0700 @@ -0,0 +1,2753 @@ +# -*- coding:utf-8 -*- +## src/chat_control.py +## +## Copyright (C) 2006 Dimitur Kirov <dkirov AT gmail.com> +## Copyright (C) 2006-2008 Yann Leboulanger <asterix AT lagaule.org> +## Jean-Marie Traissard <jim AT lapin.org> +## Nikos Kouremenos <kourem AT gmail.com> +## Travis Shirk <travis AT pobox.com> +## Copyright (C) 2007 Lukas Petrovicky <lukas AT petrovicky.net> +## Julien Pivotto <roidelapluie AT gmail.com> +## Copyright (C) 2007-2008 Brendan Taylor <whateley AT gmail.com> +## Stephan Erb <steve-e AT h3c.de> +## Copyright (C) 2008 Jonathan Schleifer <js-gajim AT webkeks.org> +## +## This file is part of Gajim. +## +## Gajim is free software; you can redistribute it and/or modify +## it under the terms of the GNU General Public License as published +## by the Free Software Foundation; version 3 only. +## +## Gajim is distributed in the hope that it will be useful, +## but WITHOUT ANY WARRANTY; without even the implied warranty of +## MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +## GNU General Public License for more details. +## +## You should have received a copy of the GNU General Public License +## along with Gajim. If not, see http://www.gnu.org/licenses/. +## + +import os +import time +import gtk +import pango +import gobject +import gtkgui_helpers +import message_control +import dialogs +import history_window +import notify +import re + +from common import gajim +from common import helpers +from common import exceptions +from message_control import MessageControl +from conversation_textview import ConversationTextview +from message_textview import MessageTextView +from common.contacts import GC_Contact +from common.logger import constants +from common.pep import MOODS, ACTIVITIES +from common.xmpp.protocol import NS_XHTML, NS_XHTML_IM, NS_FILE, NS_MUC +from common.xmpp.protocol import NS_RECEIPTS, NS_ESESSION +from whiteboardwidget import Whiteboard + +try: + import gtkspell + HAS_GTK_SPELL = True +except ImportError: + HAS_GTK_SPELL = False + +# the next script, executed in the "po" directory, +# generates the following list. +##!/bin/sh +#LANG=$(for i in *.po; do j=${i/.po/}; echo -n "_('"$j"')":" '"$j"', " ; done) +#echo "{_('en'):'en'",$LANG"}" +langs = {_('English'): 'en', _('Belarusian'): 'be', _('Bulgarian'): 'bg', _('Breton'): 'br', _('Czech'): 'cs', _('German'): 'de', _('Greek'): 'el', _('British'): 'en_GB', _('Esperanto'): 'eo', _('Spanish'): 'es', _('Basque'): 'eu', _('French'): 'fr', _('Croatian'): 'hr', _('Italian'): 'it', _('Norwegian (b)'): 'nb', _('Dutch'): 'nl', _('Norwegian'): 'no', _('Polish'): 'pl', _('Portuguese'): 'pt', _('Brazilian Portuguese'): 'pt_BR', _('Russian'): 'ru', _('Serbian'): 'sr', _('Slovak'): 'sk', _('Swedish'): 'sv', _('Chinese (Ch)'): 'zh_CN'} + +################################################################################ +class ChatControlBase(MessageControl): + '''A base class containing a banner, ConversationTextview, MessageTextView + ''' + def make_href(self, match): + url_color = gajim.config.get('urlmsgcolor') + return '<a href="%s"><span color="%s">%s</span></a>' % (match.group(), + url_color, match.group()) + + def get_font_attrs(self): + ''' get pango font attributes for banner from theme settings ''' + theme = gajim.config.get('roster_theme') + bannerfont = gajim.config.get_per('themes', theme, 'bannerfont') + bannerfontattrs = gajim.config.get_per('themes', theme, 'bannerfontattrs') + + if bannerfont: + font = pango.FontDescription(bannerfont) + else: + font = pango.FontDescription('Normal') + if bannerfontattrs: + # B attribute is set by default + if 'B' in bannerfontattrs: + font.set_weight(pango.WEIGHT_HEAVY) + if 'I' in bannerfontattrs: + font.set_style(pango.STYLE_ITALIC) + + font_attrs = 'font_desc="%s"' % font.to_string() + + # in case there is no font specified we use x-large font size + if font.get_size() == 0: + font_attrs = '%s size="x-large"' % font_attrs + font.set_weight(pango.WEIGHT_NORMAL) + font_attrs_small = 'font_desc="%s" size="small"' % font.to_string() + return (font_attrs, font_attrs_small) + + def get_nb_unread(self): + jid = self.contact.jid + if self.resource: + jid += '/' + self.resource + type_ = self.type_id + return len(gajim.events.get_events(self.account, jid, ['printed_' + type_, + type_])) + + def draw_banner(self): + '''Draw the fat line at the top of the window that + houses the icon, jid, ... + ''' + self.draw_banner_text() + self._update_banner_state_image() + # Derived types MAY implement this + + def draw_banner_text(self): + pass # Derived types SHOULD implement this + + def update_ui(self): + self.draw_banner() + # Derived types SHOULD implement this + + def repaint_themed_widgets(self): + self._paint_banner() + self.draw_banner() + # Derived classes MAY implement this + + def _update_banner_state_image(self): + pass # Derived types MAY implement this + + def handle_message_textview_mykey_press(self, widget, event_keyval, + event_keymod): + # Derived should implement this rather than connecting to the event + # itself. + pass + + def status_url_clicked(self, widget, url): + helpers.launch_browser_mailer('url', url) + + def __init__(self, type_id, parent_win, widget_name, contact, acct, + resource = None): + if resource is None: + # We very likely got a contact with a random resource. + # This is bad, we need the highest for caps etc. + c = gajim.contacts.get_contact_with_highest_priority( + acct, contact.jid) + if c and not isinstance(c, GC_Contact): + contact = c + + MessageControl.__init__(self, type_id, parent_win, widget_name, + contact, acct, resource = resource) + + widget = self.xml.get_widget('history_button') + id_ = widget.connect('clicked', self._on_history_menuitem_activate) + self.handlers[id_] = widget + + # when/if we do XHTML we will put formatting buttons back + widget = self.xml.get_widget('emoticons_button') + id_ = widget.connect('clicked', self.on_emoticons_button_clicked) + self.handlers[id_] = widget + + # Create banner and connect signals + widget = self.xml.get_widget('banner_eventbox') + id_ = widget.connect('button-press-event', + self._on_banner_eventbox_button_press_event) + self.handlers[id_] = widget + + self.urlfinder = re.compile( + r"(www.(?!.)|[a-z][a-z0-9+.-]*://)[^\s<>'"]+[^!,.\s<>)'"]]") + + if gajim.HAVE_PYSEXY: + import sexy + self.banner_status_label = sexy.UrlLabel() + self.banner_status_label.connect('url_activated', + self.status_url_clicked) + else: + self.banner_status_label = gtk.Label() + self.banner_status_label.set_selectable(True) + self.banner_status_label.set_alignment(0,0.5) + self.banner_status_label.connect('populate_popup', + self.on_banner_label_populate_popup) + + banner_vbox = self.xml.get_widget('banner_vbox') + banner_vbox.pack_start(self.banner_status_label) + self.banner_status_label.show() + + # Init DND + self.TARGET_TYPE_URI_LIST = 80 + self.dnd_list = [ ( 'text/uri-list', 0, self.TARGET_TYPE_URI_LIST ), + ('MY_TREE_MODEL_ROW', gtk.TARGET_SAME_APP, 0)] + id_ = self.widget.connect('drag_data_received', + self._on_drag_data_received) + self.handlers[id_] = self.widget + self.widget.drag_dest_set(gtk.DEST_DEFAULT_MOTION | + gtk.DEST_DEFAULT_HIGHLIGHT | + gtk.DEST_DEFAULT_DROP, + self.dnd_list, gtk.gdk.ACTION_COPY) + + # Create textviews and connect signals + self.conv_textview = ConversationTextview(self.account) + id_ = self.conv_textview.connect('quote', self.on_quote) + self.handlers[id_] = self.conv_textview.tv + id_ = self.conv_textview.tv.connect('key_press_event', + self._conv_textview_key_press_event) + self.handlers[id_] = self.conv_textview.tv + # FIXME: DND on non editable TextView, find a better way + self.drag_entered = False + id_ = self.conv_textview.tv.connect('drag_data_received', + self._on_drag_data_received) + self.handlers[id_] = self.conv_textview.tv + id_ = self.conv_textview.tv.connect('drag_motion', self._on_drag_motion) + self.handlers[id_] = self.conv_textview.tv + id_ = self.conv_textview.tv.connect('drag_leave', self._on_drag_leave) + self.handlers[id_] = self.conv_textview.tv + self.conv_textview.tv.drag_dest_set(gtk.DEST_DEFAULT_MOTION | + gtk.DEST_DEFAULT_HIGHLIGHT | + gtk.DEST_DEFAULT_DROP, + self.dnd_list, gtk.gdk.ACTION_COPY) + + self.conv_scrolledwindow = self.xml.get_widget( + 'conversation_scrolledwindow') + self.conv_scrolledwindow.add(self.conv_textview.tv) + widget = self.conv_scrolledwindow.get_vadjustment() + id_ = widget.connect('value-changed', + self.on_conversation_vadjustment_value_changed) + self.handlers[id_] = widget + id_ = widget.connect('changed', + self.on_conversation_vadjustment_changed) + self.handlers[id_] = widget + self.scroll_to_end_id = None + self.was_at_the_end = True + + # add MessageTextView to UI and connect signals + self.msg_scrolledwindow = self.xml.get_widget('message_scrolledwindow') + self.msg_textview = MessageTextView() + id_ = self.msg_textview.connect('mykeypress', + self._on_message_textview_mykeypress_event)