def __init__(self, contact, parent, mxit): gtk.ScrolledWindow.__init__(self) self.contact = contact self.parentWindow = parent self.mxit = mxit self.textview = HtmlTextView() self.textview.connect('focus-in-event', self._receivedFocus) self.textview.connect('url-clicked', self._urlClickedCallback) self.textview.set_wrap_mode(gtk.WRAP_WORD) self.textview.show() self.add(self.textview) self.show() self._open = False
class ChatTab(gtk.ScrolledWindow): def __init__(self, contact, parent, mxit): gtk.ScrolledWindow.__init__(self) self.contact = contact self.parentWindow = parent self.mxit = mxit self.textview = HtmlTextView() self.textview.connect('focus-in-event', self._receivedFocus) self.textview.connect('url-clicked', self._urlClickedCallback) self.textview.set_wrap_mode(gtk.WRAP_WORD) self.textview.show() self.add(self.textview) self.show() self._open = False def close_tab(self): self._open = False def open_tab(self): self._open = True def reopenTab(self, parentwindow): self.parentWindow = parentwindow self._open = True def isOpen(self): return self._open def _urlClickedCallback(self, textview, url, type): data = url.split('|') print data if data[0] == 'send': message = Message(self.contact.contactAddress, data[1]) self.mxit.send_message(message) self._insert_message(0, time.time(), 1, data[1]) def _sanitiseMessage(self, message): return message.replace('<', '<').replace('>', '>').replace('&', '&').replace('\n', '<br />\n') def _parseMessageEmoticons(self, message): #Convert MXit markup to HTML for use in textview #message = self._sanitiseMessage(message) for expression, file in SMILEYS.iteritems(): tag = '<img src="file://%s" />' % (os.path.join('gui', 'images', 'chatemoti', file)) message = re.sub(expression, tag, message) #Todo: custom emoticons return message def _insertHtml(self, html): try: self.textview.display_html(html) except Exception: #Probably caused by not well-formed html #print 'Bad html', html pass #self.scroll_to_iter(end_iter, 0.1, True, 0.0, 0.5) self.textview.scroll_to_iter(self.textview.get_buffer().get_end_iter(), 0.1) def _insert_message(self, origin, timestamp, type, msg): msg = markup.parse(msg) html = '<p>' if origin: html = '%s<span style="color: red">%s </span>' % (html, self._sanitiseMessage(self.contact.nickname)) timeReceived=datetime.datetime.fromtimestamp(timestamp) if datetime.date.today().day == timeReceived.day: senttime = timeReceived.time().strftime('%H:%M') else: senttime = datetime.datetime.fromtimestamp(timestamp).strftime('%d/%m/%y %H:%M') html = '%s<span style="color: grey">%s </span>' % (html, senttime) else: html = '%s<span style="color: blue">You: </span>' % html html += self._parseMessageEmoticons(msg) html = '%s</p>' % (html) self._insertHtml(html) def contact_modified(self, modification, changed): if changed == 'presence': self._insertHtml('<span style="color: grey">%s is now %s</span>' % (self.contact.nickname, PRESENCE[modification])) self.parentWindow.notebook.set_tab_label(self, self.parentWindow.create_tab_label(True, self.contact)) elif changed == 'mood': self._insertHtml('<span style="color: grey">%s is now %s</span>' % (self.contact.nickname, MOODS[modification])) def receiveMessage(self, contactAddress, timestamp, type, msg, id=0, flags=0): ''' Callback function for when we receive a message data is a list containing all information sent from server''' self._insert_message(1, timestamp, type, msg) if not self.parentWindow.get_active_tab() == self: self.parentWindow.notebook.set_tab_label(self, self.parentWindow.create_tab_label(True, self.contact)) self.mxit.contactStore.updateRow(contactAddress, messageAvailable=1) else: self.mxit.contactStore.updateRow(contactAddress, messageAvailable=0) self.mxit.sound.message_received() def _receivedFocus(self, window, *args): self.mxit.contactStore.updateRow(self.contact.contactAddress, messageAvailable=0)