Example #1
0
    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
Example #2
0
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('<', '&lt;').replace('>', '&gt;').replace('&', '&amp;').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)