This commit is contained in:
parent
d23da77a42
commit
19d92c847a
Binary file not shown.
After Width: | Height: | Size: 1.3 KiB |
|
@ -477,8 +477,8 @@ class ConversationTextview(gobject.GObject):
|
||||||
buffer_.delete(i1, i2)
|
buffer_.delete(i1, i2)
|
||||||
tag = 'outgoingtxt'
|
tag = 'outgoingtxt'
|
||||||
if message.startswith('/me'):
|
if message.startswith('/me'):
|
||||||
tag = 'outgoing'
|
tag = 'outgoing'
|
||||||
i2 = self.print_real_text(message, text_tags=[tag], name=name,
|
i2 = self.print_conversation_line(message, '', 'outgoing', name, None,
|
||||||
xhtml=xhtml, iter_=i1)
|
xhtml=xhtml, iter_=i1)
|
||||||
tt_txt = _('<b>Message was corrected. Last message was:</b>\n %s') % \
|
tt_txt = _('<b>Message was corrected. Last message was:</b>\n %s') % \
|
||||||
old_txt
|
old_txt
|
||||||
|
@ -496,7 +496,7 @@ class ConversationTextview(gobject.GObject):
|
||||||
i2 = buffer_.get_iter_at_mark(m2)
|
i2 = buffer_.get_iter_at_mark(m2)
|
||||||
txt = buffer_.get_text(i1, i2)
|
txt = buffer_.get_text(i1, i2)
|
||||||
buffer_.delete(i1, i2)
|
buffer_.delete(i1, i2)
|
||||||
i2 = self.print_real_text(message, text_tags=['incomingtxt'], name=name,
|
i2 = self.print_conversation_line(message, '', 'incoming', name, None,
|
||||||
xhtml=xhtml, iter_=i1)
|
xhtml=xhtml, iter_=i1)
|
||||||
tt_txt = _('<b>Message was corrected. Last message was:</b>\n %s') % \
|
tt_txt = _('<b>Message was corrected. Last message was:</b>\n %s') % \
|
||||||
old_txt
|
old_txt
|
||||||
|
@ -1243,12 +1243,14 @@ class ConversationTextview(gobject.GObject):
|
||||||
def print_conversation_line(self, text, jid, kind, name, tim,
|
def print_conversation_line(self, text, jid, kind, name, tim,
|
||||||
other_tags_for_name=[], other_tags_for_time=[], other_tags_for_text=[],
|
other_tags_for_name=[], other_tags_for_time=[], other_tags_for_text=[],
|
||||||
subject=None, old_kind=None, xhtml=None, simple=False, graphics=True,
|
subject=None, old_kind=None, xhtml=None, simple=False, graphics=True,
|
||||||
displaymarking=None):
|
displaymarking=None, iter_=None):
|
||||||
"""
|
"""
|
||||||
Print 'chat' type messages
|
Print 'chat' type messages
|
||||||
"""
|
"""
|
||||||
buffer_ = self.tv.get_buffer()
|
buffer_ = self.tv.get_buffer()
|
||||||
buffer_.begin_user_action()
|
buffer_.begin_user_action()
|
||||||
|
if iter_:
|
||||||
|
temp_mark = buffer_.create_mark(None, iter_, left_gravity=True)
|
||||||
if self.marks_queue.full():
|
if self.marks_queue.full():
|
||||||
# remove oldest line
|
# remove oldest line
|
||||||
m1 = self.marks_queue.get()
|
m1 = self.marks_queue.get()
|
||||||
|
@ -1257,7 +1259,11 @@ class ConversationTextview(gobject.GObject):
|
||||||
i2 = buffer_.get_iter_at_mark(m2)
|
i2 = buffer_.get_iter_at_mark(m2)
|
||||||
buffer_.delete(i1, i2)
|
buffer_.delete(i1, i2)
|
||||||
buffer_.delete_mark(m1)
|
buffer_.delete_mark(m1)
|
||||||
end_iter = buffer_.get_end_iter()
|
if iter_:
|
||||||
|
end_iter = buffer_.get_iter_at_mark(temp_mark)
|
||||||
|
buffer_.delete_mark(temp_mark)
|
||||||
|
else:
|
||||||
|
end_iter = buffer_.get_end_iter()
|
||||||
end_offset = end_iter.get_offset()
|
end_offset = end_iter.get_offset()
|
||||||
at_the_end = self.at_the_end()
|
at_the_end = self.at_the_end()
|
||||||
move_selection = False
|
move_selection = False
|
||||||
|
@ -1265,21 +1271,22 @@ class ConversationTextview(gobject.GObject):
|
||||||
get_offset() == end_offset:
|
get_offset() == end_offset:
|
||||||
move_selection = True
|
move_selection = True
|
||||||
|
|
||||||
# Create one mark and add it to queue once if it's the first line
|
if not iter_:
|
||||||
# else twice (one for end bound, one for start bound)
|
# Create one mark and add it to queue once if it's the first line
|
||||||
mark = None
|
# else twice (one for end bound, one for start bound)
|
||||||
if buffer_.get_char_count() > 0:
|
mark = None
|
||||||
if not simple:
|
if buffer_.get_char_count() > 0:
|
||||||
buffer_.insert_with_tags_by_name(end_iter, '\n', 'eol')
|
if not simple and not iter_:
|
||||||
if move_selection:
|
buffer_.insert_with_tags_by_name(end_iter, '\n', 'eol')
|
||||||
sel_start, sel_end = buffer_.get_selection_bounds()
|
if move_selection:
|
||||||
sel_end.backward_char()
|
sel_start, sel_end = buffer_.get_selection_bounds()
|
||||||
buffer_.select_range(sel_start, sel_end)
|
sel_end.backward_char()
|
||||||
mark = buffer_.create_mark(None, end_iter, left_gravity=True)
|
buffer_.select_range(sel_start, sel_end)
|
||||||
|
mark = buffer_.create_mark(None, end_iter, left_gravity=True)
|
||||||
|
self.marks_queue.put(mark)
|
||||||
|
if not mark:
|
||||||
|
mark = buffer_.create_mark(None, end_iter, left_gravity=True)
|
||||||
self.marks_queue.put(mark)
|
self.marks_queue.put(mark)
|
||||||
if not mark:
|
|
||||||
mark = buffer_.create_mark(None, end_iter, left_gravity=True)
|
|
||||||
self.marks_queue.put(mark)
|
|
||||||
if kind == 'incoming_queue':
|
if kind == 'incoming_queue':
|
||||||
kind = 'incoming'
|
kind = 'incoming'
|
||||||
if old_kind == 'incoming_queue':
|
if old_kind == 'incoming_queue':
|
||||||
|
@ -1318,7 +1325,7 @@ class ConversationTextview(gobject.GObject):
|
||||||
'time_sometimes')
|
'time_sometimes')
|
||||||
# If there's a displaymarking, print it here.
|
# If there's a displaymarking, print it here.
|
||||||
if displaymarking:
|
if displaymarking:
|
||||||
self.print_displaymarking(displaymarking)
|
self.print_displaymarking(displaymarking, iter_=end_iter)
|
||||||
# kind = info, we print things as if it was a status: same color, ...
|
# kind = info, we print things as if it was a status: same color, ...
|
||||||
if kind in ('error', 'info'):
|
if kind in ('error', 'info'):
|
||||||
kind = 'status'
|
kind = 'status'
|
||||||
|
@ -1328,36 +1335,43 @@ class ConversationTextview(gobject.GObject):
|
||||||
if other_text_tag:
|
if other_text_tag:
|
||||||
# note that color of /me may be overwritten in gc_control
|
# note that color of /me may be overwritten in gc_control
|
||||||
text_tags.append(other_text_tag)
|
text_tags.append(other_text_tag)
|
||||||
if text.startswith('/me'):
|
if text.startswith('/me') and not iter_:
|
||||||
mark1 = buffer_.create_mark(None, buffer_.get_end_iter(),
|
mark1 = mark
|
||||||
left_gravity=True)
|
|
||||||
else: # not status nor /me
|
else: # not status nor /me
|
||||||
if gajim.config.get('chat_merge_consecutive_nickname'):
|
if gajim.config.get('chat_merge_consecutive_nickname'):
|
||||||
if kind != old_kind or self.just_cleared:
|
if kind != old_kind or self.just_cleared:
|
||||||
self.print_name(name, kind, other_tags_for_name,
|
self.print_name(name, kind, other_tags_for_name,
|
||||||
direction_mark=direction_mark)
|
direction_mark=direction_mark, iter_=end_iter)
|
||||||
else:
|
else:
|
||||||
self.print_real_text(gajim.config.get(
|
self.print_real_text(gajim.config.get(
|
||||||
'chat_merge_consecutive_nickname_indent'))
|
'chat_merge_consecutive_nickname_indent'),
|
||||||
|
iter_=end_iter)
|
||||||
else:
|
else:
|
||||||
self.print_name(name, kind, other_tags_for_name,
|
self.print_name(name, kind, other_tags_for_name,
|
||||||
direction_mark=direction_mark)
|
direction_mark=direction_mark, iter_=end_iter)
|
||||||
if kind == 'incoming':
|
if kind == 'incoming':
|
||||||
text_tags.append('incomingtxt')
|
text_tags.append('incomingtxt')
|
||||||
mark1 = buffer_.create_mark(None, buffer_.get_end_iter(),
|
if not iter_:
|
||||||
left_gravity=True)
|
mark1 = mark
|
||||||
elif kind == 'outgoing':
|
elif kind == 'outgoing':
|
||||||
text_tags.append('outgoingtxt')
|
text_tags.append('outgoingtxt')
|
||||||
mark1 = buffer_.create_mark(None, buffer_.get_end_iter(),
|
if not iter_:
|
||||||
left_gravity=True)
|
mark1 = mark
|
||||||
self.print_subject(subject)
|
self.print_subject(subject, iter_=end_iter)
|
||||||
self.print_real_text(text, text_tags, name, xhtml, graphics=graphics)
|
self.print_real_text(text, text_tags, name, xhtml, graphics=graphics,
|
||||||
if mark1:
|
iter_=end_iter)
|
||||||
|
if not iter_ and mark1:
|
||||||
mark2 = buffer_.create_mark(None, buffer_.get_end_iter(),
|
mark2 = buffer_.create_mark(None, buffer_.get_end_iter(),
|
||||||
left_gravity=True)
|
left_gravity=True)
|
||||||
if kind == 'incoming':
|
if kind == 'incoming':
|
||||||
|
if name in self.last_received_message_marks:
|
||||||
|
m = self.last_received_message_marks[name][1]
|
||||||
|
buffer_.delete_mark(m)
|
||||||
self.last_received_message_marks[name] = [mark1, mark2]
|
self.last_received_message_marks[name] = [mark1, mark2]
|
||||||
elif kind == 'outgoing':
|
elif kind == 'outgoing':
|
||||||
|
m = self.last_sent_message_marks[1]
|
||||||
|
if m:
|
||||||
|
buffer_.delete_mark(m)
|
||||||
self.last_sent_message_marks = [mark1, mark2]
|
self.last_sent_message_marks = [mark1, mark2]
|
||||||
# scroll to the end of the textview
|
# scroll to the end of the textview
|
||||||
if at_the_end or kind == 'outgoing':
|
if at_the_end or kind == 'outgoing':
|
||||||
|
@ -1370,6 +1384,7 @@ class ConversationTextview(gobject.GObject):
|
||||||
|
|
||||||
self.just_cleared = False
|
self.just_cleared = False
|
||||||
buffer_.end_user_action()
|
buffer_.end_user_action()
|
||||||
|
return end_iter
|
||||||
|
|
||||||
def get_time_to_show(self, tim, direction_mark=''):
|
def get_time_to_show(self, tim, direction_mark=''):
|
||||||
"""
|
"""
|
||||||
|
@ -1407,23 +1422,30 @@ class ConversationTextview(gobject.GObject):
|
||||||
elif text.startswith('/me ') or text.startswith('/me\n'):
|
elif text.startswith('/me ') or text.startswith('/me\n'):
|
||||||
return kind
|
return kind
|
||||||
|
|
||||||
def print_displaymarking(self, displaymarking):
|
def print_displaymarking(self, displaymarking, iter_=None):
|
||||||
bgcolor = displaymarking.getAttr('bgcolor') or '#FFF'
|
bgcolor = displaymarking.getAttr('bgcolor') or '#FFF'
|
||||||
fgcolor = displaymarking.getAttr('fgcolor') or '#000'
|
fgcolor = displaymarking.getAttr('fgcolor') or '#000'
|
||||||
text = displaymarking.getData()
|
text = displaymarking.getData()
|
||||||
if text:
|
if text:
|
||||||
buffer_ = self.tv.get_buffer()
|
buffer_ = self.tv.get_buffer()
|
||||||
end_iter = buffer_.get_end_iter()
|
if iter_:
|
||||||
|
end_iter = iter_
|
||||||
|
else:
|
||||||
|
end_iter = buffer_.get_end_iter()
|
||||||
tag = self.displaymarking_tags.setdefault(bgcolor + '/' + fgcolor,
|
tag = self.displaymarking_tags.setdefault(bgcolor + '/' + fgcolor,
|
||||||
buffer_.create_tag(None, background=bgcolor, foreground=fgcolor))
|
buffer_.create_tag(None, background=bgcolor, foreground=fgcolor))
|
||||||
buffer_.insert_with_tags(end_iter, '[' + text + ']', tag)
|
buffer_.insert_with_tags(end_iter, '[' + text + ']', tag)
|
||||||
end_iter = buffer_.get_end_iter()
|
end_iter = buffer_.get_end_iter()
|
||||||
buffer_.insert_with_tags(end_iter, ' ')
|
buffer_.insert_with_tags(end_iter, ' ')
|
||||||
|
|
||||||
def print_name(self, name, kind, other_tags_for_name, direction_mark=''):
|
def print_name(self, name, kind, other_tags_for_name, direction_mark='',
|
||||||
|
iter_=None):
|
||||||
if name:
|
if name:
|
||||||
buffer_ = self.tv.get_buffer()
|
buffer_ = self.tv.get_buffer()
|
||||||
end_iter = buffer_.get_end_iter()
|
if iter_:
|
||||||
|
end_iter = iter_
|
||||||
|
else:
|
||||||
|
end_iter = buffer_.get_end_iter()
|
||||||
name_tags = other_tags_for_name[:] # create a new list
|
name_tags = other_tags_for_name[:] # create a new list
|
||||||
name_tags.append(kind)
|
name_tags.append(kind)
|
||||||
before_str = gajim.config.get('before_nickname')
|
before_str = gajim.config.get('before_nickname')
|
||||||
|
@ -1453,7 +1475,8 @@ class ConversationTextview(gobject.GObject):
|
||||||
try:
|
try:
|
||||||
if name and (text.startswith('/me ') or text.startswith('/me\n')):
|
if name and (text.startswith('/me ') or text.startswith('/me\n')):
|
||||||
xhtml = xhtml.replace('/me', '<i>* %s</i>' % (name,), 1)
|
xhtml = xhtml.replace('/me', '<i>* %s</i>' % (name,), 1)
|
||||||
self.tv.display_html(xhtml.encode('utf-8'), self.tv, self)
|
self.tv.display_html(xhtml.encode('utf-8'), self.tv, self,
|
||||||
|
iter_=iter_)
|
||||||
return
|
return
|
||||||
except Exception, e:
|
except Exception, e:
|
||||||
gajim.log.debug('Error processing xhtml' + str(e))
|
gajim.log.debug('Error processing xhtml' + str(e))
|
||||||
|
|
|
@ -656,7 +656,7 @@ class HtmlHandler(xml.sax.handler.ContentHandler):
|
||||||
def handle_specials(self, text):
|
def handle_specials(self, text):
|
||||||
if self.conv_textview:
|
if self.conv_textview:
|
||||||
self.iter = self.conv_textview.detect_and_print_special_text(text,
|
self.iter = self.conv_textview.detect_and_print_special_text(text,
|
||||||
self._get_style_tags())
|
self._get_style_tags(), iter_=self.iter)
|
||||||
else:
|
else:
|
||||||
self._insert_text(text)
|
self._insert_text(text)
|
||||||
|
|
||||||
|
@ -815,8 +815,8 @@ class HtmlTextView(gtk.TextView):
|
||||||
self.id_ = self.connect('button-release-event',
|
self.id_ = self.connect('button-release-event',
|
||||||
self.on_left_mouse_button_release)
|
self.on_left_mouse_button_release)
|
||||||
buffer_ = self.get_buffer()
|
buffer_ = self.get_buffer()
|
||||||
buffer_.create_tag('eol', scale = pango.SCALE_XX_SMALL)
|
buffer_.create_tag('eol')
|
||||||
|
|
||||||
self.tooltip = tooltips.BaseTooltip()
|
self.tooltip = tooltips.BaseTooltip()
|
||||||
self.config = gajim.config
|
self.config = gajim.config
|
||||||
self.interface = gajim.interface
|
self.interface = gajim.interface
|
||||||
|
@ -1018,9 +1018,12 @@ class HtmlTextView(gtk.TextView):
|
||||||
# self.hyperlink_handler can be overwritten, so call it when needed
|
# self.hyperlink_handler can be overwritten, so call it when needed
|
||||||
self.hyperlink_handler(texttag, widget, event, iter_, kind)
|
self.hyperlink_handler(texttag, widget, event, iter_, kind)
|
||||||
|
|
||||||
def display_html(self, html, textview, conv_textview):
|
def display_html(self, html, textview, conv_textview, iter_=None):
|
||||||
buffer_ = self.get_buffer()
|
buffer_ = self.get_buffer()
|
||||||
eob = buffer_.get_end_iter()
|
if iter_:
|
||||||
|
eob = iter_
|
||||||
|
else:
|
||||||
|
eob = buffer_.get_end_iter()
|
||||||
## this works too if libxml2 is not available
|
## this works too if libxml2 is not available
|
||||||
# parser = xml.sax.make_parser(['drv_libxml2'])
|
# parser = xml.sax.make_parser(['drv_libxml2'])
|
||||||
# parser.setFeature(xml.sax.handler.feature_validation, True)
|
# parser.setFeature(xml.sax.handler.feature_validation, True)
|
||||||
|
|
Loading…
Reference in New Issue