MessageTextView also used in Group Chat. at last!

This commit is contained in:
Nikos Kouremenos 2005-10-29 16:33:59 +00:00
parent 629f565c0d
commit 3e7c2c563f
4 changed files with 56 additions and 36 deletions

View File

@ -23,14 +23,16 @@ import gtk.glade
import pango import pango
import gobject import gobject
import time import time
import sre
import os
import dialogs import dialogs
import chat import chat
import cell_renderer_image import cell_renderer_image
import gtkgui_helpers import gtkgui_helpers
import history_window import history_window
import tooltips import tooltips
import sre import message_textview
import os
from gajim import Contact from gajim import Contact
from common import gajim from common import gajim
@ -573,16 +575,25 @@ class GroupchatWindow(chat.Chat):
_('Bookmark has been added successfully'), _('Bookmark has been added successfully'),
_('You can manage your bookmarks via Actions menu in your roster.')) _('You can manage your bookmarks via Actions menu in your roster.'))
def on_message_textview_key_press_event(self, widget, event): def on_message_textview_mykeypress_event(self, widget, event_keyval,
event_keymod):
'''When a key is pressed: '''When a key is pressed:
if enter is pressed without the shift key, message (if not empty) is sent if enter is pressed without the shift key, message (if not empty) is sent
and printed in the conversation. Tab does autocomplete in nicknames''' and printed in the conversation. Tab does autocomplete in nicknames'''
# NOTE: handles mykeypress which is custom signal connected to this
# CB in new_room(). for this singal see message_textview.py
room_jid = self.get_active_jid() room_jid = self.get_active_jid()
conv_textview = self.conversation_textviews[room_jid] conv_textview = self.conversation_textviews[room_jid]
message_buffer = widget.get_buffer() message_buffer = widget.get_buffer()
start_iter, end_iter = message_buffer.get_bounds() start_iter, end_iter = message_buffer.get_bounds()
message = message_buffer.get_text(start_iter, end_iter, message = message_buffer.get_text(start_iter, end_iter,
False).decode('utf-8') False).decode('utf-8')
# construct event instance from binding
event = gtk.gdk.Event(gtk.gdk.KEY_PRESS) # it's always a key-press here
event.keyval = event_keyval
event.state = event_keymod
event.time = 0 # assign current time
if event.keyval == gtk.keysyms.ISO_Left_Tab: # SHIFT + TAB if event.keyval == gtk.keysyms.ISO_Left_Tab: # SHIFT + TAB
if (event.state & gtk.gdk.CONTROL_MASK): # CTRL + SHIFT + TAB if (event.state & gtk.gdk.CONTROL_MASK): # CTRL + SHIFT + TAB
@ -590,13 +601,14 @@ class GroupchatWindow(chat.Chat):
elif event.keyval == gtk.keysyms.Tab: # TAB elif event.keyval == gtk.keysyms.Tab: # TAB
if event.state & gtk.gdk.CONTROL_MASK: # CTRL + TAB if event.state & gtk.gdk.CONTROL_MASK: # CTRL + TAB
self.notebook.emit('key_press_event', event) self.notebook.emit('key_press_event', event)
else: else: # just TAB
cursor_position = message_buffer.get_insert() cursor_position = message_buffer.get_insert()
end_iter = message_buffer.get_iter_at_mark(cursor_position) end_iter = message_buffer.get_iter_at_mark(cursor_position)
text = message_buffer.get_text(start_iter, end_iter, text = message_buffer.get_text(start_iter, end_iter,
False).decode('utf-8') False).decode('utf-8')
if not text or text.endswith(' '): if not text or text.endswith(' '):
if not self.last_key_tabs[room_jid]: # if we are nick cycling, last char will always be space # if we are nick cycling, last char will always be space
if not self.last_key_tabs[room_jid]:
return False return False
splitted_text = text.split() splitted_text = text.split()
@ -681,11 +693,11 @@ class GroupchatWindow(chat.Chat):
message_buffer.set_text('') message_buffer.set_text('')
return True return True
elif event.keyval == gtk.keysyms.Up: elif event.keyval == gtk.keysyms.Up:
if event.state & gtk.gdk.CONTROL_MASK: #Ctrl+UP if event.state & gtk.gdk.CONTROL_MASK: # Ctrl+UP
self.sent_messages_scroll(room_jid, 'up', widget.get_buffer()) self.sent_messages_scroll(room_jid, 'up', widget.get_buffer())
return True # override the default gtk+ thing for ctrl+up return True # override the default gtk+ thing for ctrl+up
elif event.keyval == gtk.keysyms.Down: elif event.keyval == gtk.keysyms.Down:
if event.state & gtk.gdk.CONTROL_MASK: #Ctrl+Down if event.state & gtk.gdk.CONTROL_MASK: # Ctrl+Down
self.sent_messages_scroll(room_jid, 'down', widget.get_buffer()) self.sent_messages_scroll(room_jid, 'down', widget.get_buffer())
return True # override the default gtk+ thing for ctrl+down return True # override the default gtk+ thing for ctrl+down
else: else:
@ -694,8 +706,9 @@ class GroupchatWindow(chat.Chat):
def on_send_button_clicked(self, widget): def on_send_button_clicked(self, widget):
'''When send button is pressed: send the current message''' '''When send button is pressed: send the current message'''
room_jid = self.get_active_jid() room_jid = self.get_active_jid()
message_textview = self.xmls[room_jid].get_widget( message_scrolledwindow = self.xmls[room_jid].get_widget(
'message_textview') 'message_scrolledwindow')
message_textview = message_scrolledwindow.get_children()[0]
message_buffer = message_textview.get_buffer() message_buffer = message_textview.get_buffer()
start_iter = message_buffer.get_start_iter() start_iter = message_buffer.get_start_iter()
end_iter = message_buffer.get_end_iter() end_iter = message_buffer.get_end_iter()
@ -711,8 +724,9 @@ class GroupchatWindow(chat.Chat):
if not message: if not message:
return return
room_jid = self.get_active_jid() room_jid = self.get_active_jid()
message_textview = self.xmls[room_jid].get_widget( message_scrolledwindow = self.xmls[room_jid].get_widget(
'message_textview') 'message_scrolledwindow')
message_textview = message_scrolledwindow.get_children()[0]
conv_textview = self.conversation_textviews[room_jid] conv_textview = self.conversation_textviews[room_jid]
message_buffer = message_textview.get_buffer() message_buffer = message_textview.get_buffer()
if message != '' or message != '\n': if message != '' or message != '\n':
@ -1272,7 +1286,10 @@ current room topic.') % command, room_jid)
def got_connected(self, room_jid): def got_connected(self, room_jid):
gajim.gc_connected[self.account][room_jid] = True gajim.gc_connected[self.account][room_jid] = True
self.xmls[room_jid].get_widget('message_textview').set_sensitive(True) message_scrolledwindow = self.xmls[room_jid].get_widget(
'message_scrolledwindow')
message_textview = message_scrolledwindow.get_children()[0]
message_textview.set_sensitive(True)
self.xmls[room_jid].get_widget('send_button').set_sensitive(True) self.xmls[room_jid].get_widget('send_button').set_sensitive(True)
def got_disconnected(self, room_jid): def got_disconnected(self, room_jid):
@ -1280,14 +1297,16 @@ current room topic.') % command, room_jid)
model.clear() model.clear()
gajim.gc_contacts[self.account][room_jid] = {} gajim.gc_contacts[self.account][room_jid] = {}
gajim.gc_connected[self.account][room_jid] = False gajim.gc_connected[self.account][room_jid] = False
self.xmls[room_jid].get_widget('message_textview').set_sensitive(False) message_scrolledwindow = self.xmls[room_jid].get_widget(
'message_scrolledwindow')
message_textview = message_scrolledwindow.get_children()[0]
message_textview.set_sensitive(False)
self.xmls[room_jid].get_widget('send_button').set_sensitive(False) self.xmls[room_jid].get_widget('send_button').set_sensitive(False)
def new_room(self, room_jid, nick): def new_room(self, room_jid, nick):
self.names[room_jid] = room_jid.split('@')[0] self.names[room_jid] = room_jid.split('@')[0]
self.xmls[room_jid] = gtk.glade.XML(GTKGUI_GLADE, 'gc_vbox', APP) self.xmls[room_jid] = gtk.glade.XML(GTKGUI_GLADE, 'gc_vbox', APP)
self.childs[room_jid] = self.xmls[room_jid].get_widget('gc_vbox') self.childs[room_jid] = self.xmls[room_jid].get_widget('gc_vbox')
chat.Chat.new_tab(self, room_jid)
self.nicks[room_jid] = nick self.nicks[room_jid] = nick
self.subjects[room_jid] = '' self.subjects[room_jid] = ''
self.room_creation[room_jid] = time.time() self.room_creation[room_jid] = time.time()
@ -1301,6 +1320,17 @@ current room topic.') % command, room_jid)
'list_treeview') 'list_treeview')
self.subject_tooltip[room_jid] = gtk.Tooltips() self.subject_tooltip[room_jid] = gtk.Tooltips()
# add MessageTextView to UI
message_scrolledwindow = self.xmls[room_jid].get_widget(
'message_scrolledwindow')
msg_textview = message_textview.MessageTextView()
msg_textview.connect('mykeypress',
self.on_message_textview_mykeypress_event)
message_scrolledwindow.add(msg_textview)
chat.Chat.new_tab(self, room_jid)
# we want to know when the the widget resizes, because that is # we want to know when the the widget resizes, because that is
# an indication that the hpaned has moved... # an indication that the hpaned has moved...
# FIXME: Find a better indicator that the hpaned has moved. # FIXME: Find a better indicator that the hpaned has moved.

View File

@ -9385,25 +9385,7 @@ topic</property>
<property name="window_placement">GTK_CORNER_TOP_LEFT</property> <property name="window_placement">GTK_CORNER_TOP_LEFT</property>
<child> <child>
<widget class="GtkTextView" id="message_textview"> <placeholder/>
<property name="border_width">1</property>
<property name="visible">True</property>
<property name="can_focus">True</property>
<property name="editable">True</property>
<property name="overwrite">False</property>
<property name="accepts_tab">True</property>
<property name="justification">GTK_JUSTIFY_LEFT</property>
<property name="wrap_mode">GTK_WRAP_WORD</property>
<property name="cursor_visible">True</property>
<property name="pixels_above_lines">2</property>
<property name="pixels_below_lines">2</property>
<property name="pixels_inside_wrap">0</property>
<property name="left_margin">2</property>
<property name="right_margin">2</property>
<property name="indent">0</property>
<property name="text" translatable="yes"></property>
<signal name="key_press_event" handler="on_message_textview_key_press_event" last_modification_time="Sat, 05 Mar 2005 00:31:14 GMT"/>
</widget>
</child> </child>
</widget> </widget>
<packing> <packing>

View File

@ -59,6 +59,10 @@ gtk.binding_entry_add_signal(MessageTextView, gtk.keysyms.ISO_Left_Tab,
gtk.binding_entry_add_signal(MessageTextView, gtk.keysyms.Tab, gtk.binding_entry_add_signal(MessageTextView, gtk.keysyms.Tab,
gtk.gdk.CONTROL_MASK, 'mykeypress', int, gtk.keysyms.Tab, gtk.gdk.CONTROL_MASK, 'mykeypress', int, gtk.keysyms.Tab,
gtk.gdk.ModifierType, gtk.gdk.CONTROL_MASK) gtk.gdk.ModifierType, gtk.gdk.CONTROL_MASK)
# TAB
gtk.binding_entry_add_signal(MessageTextView, gtk.keysyms.Tab,
0, 'mykeypress', int, gtk.keysyms.Tab, gtk.gdk.ModifierType, 0)
# CTRL + PAGE DOWN # CTRL + PAGE DOWN
gtk.binding_entry_add_signal(MessageTextView, gtk.keysyms.Page_Down, gtk.binding_entry_add_signal(MessageTextView, gtk.keysyms.Page_Down,

View File

@ -438,12 +438,14 @@ class TabbedChatWindow(chat.Chat):
self.childs[contact.jid] = self.xmls[contact.jid].get_widget('chats_vbox') self.childs[contact.jid] = self.xmls[contact.jid].get_widget('chats_vbox')
self.contacts[contact.jid] = contact self.contacts[contact.jid] = contact
# add MessageTextView to UI
message_scrolledwindow = self.xmls[contact.jid].get_widget( message_scrolledwindow = self.xmls[contact.jid].get_widget(
'message_scrolledwindow') 'message_scrolledwindow')
msg_textview = message_textview.MessageTextView() msg_textview = message_textview.MessageTextView()
msg_textview.connect('mykeypress', msg_textview.connect('mykeypress',
self.on_message_textview_key_press_event) self.on_message_textview_mykeypress_event)
message_scrolledwindow.add(msg_textview) message_scrolledwindow.add(msg_textview)
#FIXME: request in thread or idle and show in roster #FIXME: request in thread or idle and show in roster
@ -581,11 +583,13 @@ class TabbedChatWindow(chat.Chat):
self.mouse_over_in_last_30_secs = False self.mouse_over_in_last_30_secs = False
self.kbd_activity_in_last_30_secs = False self.kbd_activity_in_last_30_secs = False
def on_message_textview_key_press_event(self, widget, event_keyval, event_keymod): def on_message_textview_mykeypress_event(self, widget, event_keyval,
event_keymod):
'''When a key is pressed: '''When a key is pressed:
if enter is pressed without the shift key, message (if not empty) is sent if enter is pressed without the shift key, message (if not empty) is sent
and printed in the conversation''' and printed in the conversation'''
# NOTE: handles mykeypress which is custom signal connected to this
# CB in new_tab(). for this singal see message_textview.py
jid = self.get_active_jid() jid = self.get_active_jid()
conv_textview = self.conversation_textviews[jid] conv_textview = self.conversation_textviews[jid]
message_textview = widget message_textview = widget