Welcome to mirror list, hosted at ThFree Co, Russian Federation.

dev.gajim.org/gajim/gajim.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorYann Leboulanger <asterix@lagaule.org>2005-03-16 20:22:20 +0300
committerYann Leboulanger <asterix@lagaule.org>2005-03-16 20:22:20 +0300
commitc8077781c91d7723401730445860497f284dd82d (patch)
treefe36e3b6907721a510675a886b43492891573735
parent75fb6ac1f7ad3e991dae013832463b6d29cfd8fc (diff)
print_conversation is now mainly in chat.py, so groupchat has url detection and emoticons support
-rw-r--r--plugins/gtkgui/chat.py136
-rw-r--r--plugins/gtkgui/groupchat_window.py49
-rw-r--r--plugins/gtkgui/tabbed_chat_window.py65
3 files changed, 113 insertions, 137 deletions
diff --git a/plugins/gtkgui/chat.py b/plugins/gtkgui/chat.py
index b3b588216..290c0552a 100644
--- a/plugins/gtkgui/chat.py
+++ b/plugins/gtkgui/chat.py
@@ -74,7 +74,7 @@ class Chat:
del self.print_time_timeout_id[jid]
else:
for jid in self.xmls:
- if not self.print_time_timeout_id.has_key(pjid):
+ if not self.print_time_timeout_id.has_key(jid):
self.print_time_timeout(jid)
self.print_time_timeout_id[jid] = gobject.timeout_add(300000, \
self.print_time_timeout, jid)
@@ -423,7 +423,16 @@ class Chat:
#we launch the correct application
self.plugin.launch_browser_mailer(kind, word)
- def detect_and_print_special_text(self, otext, jid, other_tag, print_all_special):
+ def print_with_tag_list(self, buffer, text, iter, tag_list):
+ begin_mark = buffer.create_mark('begin_tag', iter, True)
+ buffer.insert(iter, text)
+ begin_tagged = buffer.get_iter_at_mark(begin_mark)
+ for tag in tag_list:
+ buffer.apply_tag_by_name(tag, begin_tagged, iter)
+ buffer.delete_mark(begin_mark)
+
+ def detect_and_print_special_text(self, otext, jid, other_tags, \
+ print_all_special):
conversation_textview = self.xmls[jid].get_widget('conversation_textview')
conversation_buffer = conversation_textview.get_buffer()
@@ -443,83 +452,136 @@ class Chat:
text_before_special_text = otext[index:start]
end_iter = conversation_buffer.get_end_iter()
if print_all_special:
- conversation_buffer.insert_with_tags_by_name(end_iter, \
- text_before_special_text, other_tag)
+ self.print_with_tag_list(conversation_buffer, \
+ text_before_special_text, end_iter, other_tags)
else:
conversation_buffer.insert(end_iter, text_before_special_text)
if not print_all_special:
- other_tag = ''
+ other_tags = []
index = end # update index
#now print it
- self.print_special_text(special_text, other_tag, conversation_buffer)
+ self.print_special_text(special_text, other_tags, conversation_buffer)
- return index, other_tag
+ return index
- def print_special_text(self, special_text, other_tag, conversation_buffer):
- tag2 = None
+ def print_special_text(self, special_text, other_tags, conversation_buffer):
# make it CAPS (emoticons keys are all CAPS)
+ tags = []
+ use_other_tags = True
possible_emot_ascii_caps = special_text.upper()
if possible_emot_ascii_caps in self.plugin.emoticons.keys():
#it's an emoticon
- tag = None
emot_ascii = possible_emot_ascii_caps
end_iter = conversation_buffer.get_end_iter()
conversation_buffer.insert_pixbuf(end_iter, \
self.plugin.emoticons[emot_ascii])
elif special_text.startswith('mailto:'):
#it's a mail
- tag = 'mail'
+ tags.append('mail')
+ use_other_tags = False
elif self.plugin.sth_at_sth_dot_sth_re.match(special_text):
#it's a mail
- tag = 'mail'
+ tags.append('mail')
+ use_other_tags = False
elif special_text.startswith('*'): # it's a bold text
- tag = 'bold'
+ tags.append('bold')
if special_text[1] == '/': # it's also italic
- tag2 = 'italic'
+ tags.append('italic')
special_text = special_text[2:-2] # remove */ /*
elif special_text[1] == '_': # it's also underlined
- tag2 = 'underline'
+ tags.append('underline')
special_text = special_text[2:-2] # remove *_ _*
else:
special_text = special_text[1:-1] # remove * *
elif special_text.startswith('/'): # it's an italic text
- tag = 'italic'
+ tags.append('italic')
if special_text[1] == '*': # it's also bold
- tag2 = 'bold'
+ tags.append('bold')
special_text = special_text[2:-2] # remove /* */
elif special_text[1] == '_': # it's also underlined
- tag2 = 'underline'
+ tags.append('underline')
special_text = special_text[2:-2] # remove /_ _/
else:
special_text = special_text[1:-1] # remove / /
elif special_text.startswith('_'): # it's an underlined text
- tag = 'underline'
+ tags.append('underline')
if special_text[1] == '*': # it's also bold
- tag2 = 'bold'
+ tags.append('bold')
special_text = special_text[2:-2] # remove _* *_
elif special_text[1] == '/': # it's also italic
- tag2 = 'italic'
+ tags.append('italic')
special_text = special_text[2:-2] # remove _/ /_
else:
special_text = special_text[1:-1] # remove _ _
else:
#it's a url
- tag = 'url'
+ tags.append('url')
+ use_other_tags = False
+
+ if len(tags) > 0:
+ end_iter = conversation_buffer.get_end_iter()
+ all_tags = tags[:]
+ if use_other_tags:
+ all_tags += other_tags
+ self.print_with_tag_list(conversation_buffer, special_text, end_iter, \
+ all_tags)
+ def print_conversation_line(self, text, jid, kind, name, tim, \
+ other_tags_for_name = []):
+ conversation_textview = self.xmls[jid].get_widget('conversation_textview')
+ conversation_buffer = conversation_textview.get_buffer()
+ print_all_special = False
+ if not text:
+ text = ''
end_iter = conversation_buffer.get_end_iter()
- if tag is not None:
- if tag in ['bold', 'italic', 'underline'] and other_tag:
- if tag2 is not None:
- conversation_buffer.insert_with_tags_by_name(end_iter,\
- special_text, other_tag, tag, tag2)
- else:
- conversation_buffer.insert_with_tags_by_name(end_iter,\
- special_text, other_tag, tag)
- else:
- if tag2 is not None:
- conversation_buffer.insert_with_tags_by_name(end_iter,\
- special_text, tag, tag2)
- else:
- conversation_buffer.insert_with_tags_by_name(end_iter,\
- special_text, tag)
+ if self.plugin.config['print_time'] == 'always':
+ if not tim:
+ tim = time.localtime()
+ tim_format = time.strftime("[%H:%M:%S]", tim)
+ conversation_buffer.insert(end_iter, tim_format + ' ')
+
+ if kind == 'status':
+ print_all_special = True
+ elif text.startswith('/me'):
+ text = name + text[3:]
+ print_all_special = True
+
+ if kind == 'incoming':
+ self.last_message_time[jid] = time.time()
+
+ tags = other_tags_for_name[:] #create a new list
+ tags.append(kind)
+ if name and not print_all_special:
+ self.print_with_tag_list(conversation_buffer, '<' + name + '> ', \
+ end_iter, tags)
+
+ text += '\n'
+ # detect urls formatting and if the user has it on emoticons
+ index = self.detect_and_print_special_text(text, jid, \
+ tags, print_all_special)
+
+ # add the rest of text located in the index and after
+ end_iter = conversation_buffer.get_end_iter()
+ if print_all_special:
+ conversation_buffer.insert_with_tags_by_name(end_iter, text[index:], \
+ kind)
+ else:
+ conversation_buffer.insert(end_iter, text[index:])
+
+ #scroll to the end of the textview
+ end_iter = conversation_buffer.get_end_iter()
+ end_rect = conversation_textview.get_iter_location(end_iter)
+ visible_rect = conversation_textview.get_visible_rect()
+ end = False
+ if end_rect.y <= (visible_rect.y + visible_rect.height) or \
+ (contact and contact != 'status'):
+ #we are at the end or we are sending something
+ end = True
+ conversation_textview.scroll_to_mark(conversation_buffer.\
+ get_mark('end'), 0.1, 0, 0, 0)
+ if ((jid != self.get_active_jid()) or (not self.window.is_active()) or \
+ (not end)) and kind == 'incoming':
+ self.nb_unread[jid] += 1
+ self.redraw_tab(jid)
+ self.show_title()
diff --git a/plugins/gtkgui/groupchat_window.py b/plugins/gtkgui/groupchat_window.py
index c013f467a..84a518825 100644
--- a/plugins/gtkgui/groupchat_window.py
+++ b/plugins/gtkgui/groupchat_window.py
@@ -23,7 +23,6 @@ import gtk.glade
import pango
import gobject
import time
-import sre #usefull later #(nk) really? :)
from dialogs import *
from chat import *
@@ -248,51 +247,21 @@ class Groupchat_window(Chat):
"""Print a line in the conversation :
if contact is set : it's a message from someone
if contact is not set : it's a message from the server"""
- conversation_textview = self.xmls[room_jid].\
- get_widget('conversation_textview')
- conversation_buffer = conversation_textview.get_buffer()
- if not text:
- text = ''
- end_iter = conversation_buffer.get_end_iter()
- if self.plugin.config['print_time'] == 'always':
- if not tim:
- tim = time.localtime()
- tim_format = time.strftime('[%H:%M:%S]', tim)
- conversation_buffer.insert(end_iter, tim_format + ' ')
-
- otext = ''
- ttext = ''
+ other_tags_for_name = []
if contact:
if contact == self.nicks[room_jid]:
- tag = 'outgoing'
+ kind = 'outgoing'
else:
- tag = 'incoming'
- self.last_message_time[room_jid] = time.time()
-
- if text.startswith('/me'):
- ttext = contact + text[3:] + '\n'
- else:
- ttext = '<' + contact + '> '
- otext = text + '\n'
+ kind = 'incoming'
else:
- tag = 'status'
- ttext = text + '\n'
+ kind = 'status'
- if tag == 'incoming' and self.nicks[room_jid].lower() in\
+ if kind == 'incoming' and self.nicks[room_jid].lower() in\
text.lower().split():
- conversation_buffer.insert_with_tags_by_name(end_iter, ttext, tag,\
- 'bold')
- else:
- conversation_buffer.insert_with_tags_by_name(end_iter, ttext, tag)
- #TODO: emoticons, url grabber
- conversation_buffer.insert(end_iter, otext)
- #scroll to the end of the textview
- conversation_textview.scroll_to_mark(conversation_buffer.get_mark('end'),\
- 0.1, 0, 0, 0)
- if not self.window.is_active() and contact != '':
- self.nb_unread[room_jid] += 1
- self.redraw_tab(room_jid)
- self.show_title()
+ other_tags_for_name.append('bold')
+
+ Chat.print_conversation_line(self, text, room_jid, kind, contact, tim, \
+ other_tags_for_name)
def kick(self, widget, room_jid, nick):
"""kick a user"""
diff --git a/plugins/gtkgui/tabbed_chat_window.py b/plugins/gtkgui/tabbed_chat_window.py
index 1ce4514d7..6652feb10 100644
--- a/plugins/gtkgui/tabbed_chat_window.py
+++ b/plugins/gtkgui/tabbed_chat_window.py
@@ -23,7 +23,6 @@ import gtk.glade
import pango
import gobject
import time
-import sre
from dialogs import *
from history_window import *
@@ -199,69 +198,15 @@ class Tabbed_chat_window(Chat):
if contact is set to another value : it's an outgoing message
if contact is not set : it's an incomming message"""
user = self.users[jid]
- conversation_textview = self.xmls[jid].get_widget('conversation_textview')
- conversation_buffer = conversation_textview.get_buffer()
- print_all_special = False
- if not text:
- text = ''
- end_iter = conversation_buffer.get_end_iter()
- if self.plugin.config['print_time'] == 'always':
- if not tim:
- tim = time.localtime()
- tim_format = time.strftime("[%H:%M:%S]", tim)
- conversation_buffer.insert(end_iter, tim_format + ' ')
-
- otext = ''
- ttext = ''
if contact == 'status':
- tag = 'status'
- ttext = text + '\n'
- print_all_special = True
+ kind = 'status'
+ name = ''
else:
if contact:
- tag = 'outgoing'
+ kind = 'outgoing'
name = self.plugin.nicks[self.account]
else:
- tag = 'incoming'
+ kind = 'incoming'
name = user.name
- self.last_message_time[jid] = time.time()
-
- if text.startswith('/me'):
- ttext = name + text[3:] + '\n'
- print_all_special = True
- else:
- ttext = '<' + name + '> '
- otext = text + '\n'
- #if it's a status we print special words
- if not print_all_special:
- conversation_buffer.insert_with_tags_by_name(end_iter, ttext, tag)
- else:
- otext = ttext
- # detect urls formatting and if the user has it on emoticons
- index, other_tag = self.detect_and_print_special_text(otext, jid, tag, print_all_special)
-
- # add the rest of text located in the index and after
- end_iter = conversation_buffer.get_end_iter()
- if print_all_special:
- conversation_buffer.insert_with_tags_by_name(end_iter, \
- otext[index:], other_tag)
- else:
- conversation_buffer.insert(end_iter, otext[index:])
-
- #scroll to the end of the textview
- end_iter = conversation_buffer.get_end_iter()
- end_rect = conversation_textview.get_iter_location(end_iter)
- visible_rect = conversation_textview.get_visible_rect()
- end = False
- if end_rect.y <= (visible_rect.y + visible_rect.height) or \
- (contact and contact != 'status'):
- #we are at the end or we are sending something
- end = True
- conversation_textview.scroll_to_mark(conversation_buffer.\
- get_mark('end'), 0.1, 0, 0, 0)
- if ((jid != self.get_active_jid()) or (not self.window.is_active()) or \
- (not end)) and contact == '':
- self.nb_unread[jid] += 1
- self.redraw_tab(jid)
- self.show_title()
+ Chat.print_conversation_line(self, text, jid, kind, name, tim)