~ubuntu-branches/ubuntu/natty/kadu/natty

« back to all changes in this revision

Viewing changes to kadu-core/chat_messages_view.cpp

  • Committer: Package Import Robot
  • Author(s): Kiszel Kristóf
  • Date: 2010-07-21 15:24:54 UTC
  • mfrom: (0.6.1) (0.5.1) (1.4.1) (22.1.2 maverick)
  • Revision ID: package-import@ubuntu.com-20100721152454-vttqle18lovfudni
Tags: 0.6.5.4.ds1-3ubuntu2
Remove libqt4-webkit-dev from build-depends and add
libqtwebkit-dev for qtwebkit transition

Show diffs side-by-side

added added

removed removed

Lines of Context:
 
1
/***************************************************************************
 
2
 *                                                                         *
 
3
 *   This program is free software; you can redistribute it and/or modify  *
 
4
 *   it under the terms of the GNU General Public License as published by  *
 
5
 *   the Free Software Foundation; either version 2 of the License, or     *
 
6
 *   (at your option) any later version.                                   *
 
7
 *                                                                         *
 
8
 ***************************************************************************/
 
9
 
 
10
#include <QtGui/QScrollBar>
 
11
#include <QtWebKit/QWebFrame>
 
12
 
 
13
#include "chat_message.h"
 
14
#include "config_file.h"
 
15
#include "debug.h"
 
16
#include "gadu.h"
 
17
#include "kadu_parser.h"
 
18
#include "misc.h"
 
19
#include "syntax_editor.h"
 
20
 
 
21
#include "chat_messages_view.h"
 
22
 
 
23
QString ChatMessagesView::style = "";
 
24
 
 
25
ChatMessagesView::ChatMessagesView(QWidget *parent) : KaduTextBrowser(parent),
 
26
        Prune(0), lastScrollValue(0), lastLine(false)
 
27
{
 
28
        setMinimumSize(QSize(100,100));
 
29
 
 
30
        connect(gadu, SIGNAL(imageReceivedAndSaved(UinType, quint32 , quint32 , const QString &)),
 
31
                this, SLOT(imageReceivedAndSaved(UinType, quint32 , quint32 , const QString &)));
 
32
 
 
33
        connect(this, SIGNAL(loadFinished(bool)), this, SLOT(scrollToLine()));
 
34
 
 
35
        configurationUpdated();
 
36
 
 
37
        setFocusPolicy(Qt::NoFocus);
 
38
}
 
39
 
 
40
ChatMessagesView::~ChatMessagesView()
 
41
{
 
42
        qDeleteAll(Messages);
 
43
        Messages.clear();
 
44
}
 
45
 
 
46
void ChatMessagesView::pageUp()
 
47
{
 
48
        QKeyEvent event(QEvent::KeyPress, 0x01000016, Qt::NoModifier);
 
49
        keyPressEvent(&event);
 
50
}
 
51
 
 
52
void ChatMessagesView::pageDown()
 
53
{
 
54
        QKeyEvent event(QEvent::KeyPress, 0x01000017, Qt::NoModifier);
 
55
        keyPressEvent(&event);
 
56
}
 
57
 
 
58
void ChatMessagesView::imageReceivedAndSaved(UinType sender, quint32  size, quint32  crc32,const QString & /*path*/)
 
59
{
 
60
        foreach(ChatMessage *message, Messages)
 
61
                message->replaceLoadingImages(sender, size, crc32);
 
62
        repaintMessages();
 
63
}
 
64
 
 
65
QString ChatMessagesView::formatMessage(ChatMessage *message, ChatMessage *after)
 
66
{
 
67
        kdebugf();
 
68
 
 
69
        int separatorSize;
 
70
        QString format;
 
71
        bool includeHeader;
 
72
 
 
73
        if (message->type() == TypeSystem)
 
74
        {
 
75
                separatorSize = ParagraphSeparator;
 
76
                format = ChatSyntaxWithoutHeader;
 
77
 
 
78
                message->setSeparatorSize(separatorSize);
 
79
                return KaduParser::parse(format, message->sender(), message, true);
 
80
        }
 
81
        else
 
82
        {
 
83
                includeHeader = (!CfgNoHeaderRepeat || !after);
 
84
 
 
85
                if (after && !includeHeader)
 
86
                        includeHeader =
 
87
                                (after->type() != TypeSystem) &&
 
88
                                ((message->date().toTime_t() - after->date().toTime_t() > (CfgNoHeaderInterval * 60)) ||
 
89
                                 (message->sender() != after->sender()));
 
90
 
 
91
                if (includeHeader)
 
92
                {
 
93
                        separatorSize = CfgHeaderSeparatorHeight;
 
94
                        format = ChatSyntaxWithHeader;
 
95
                }
 
96
                else
 
97
                {
 
98
                        separatorSize = ParagraphSeparator;
 
99
                        format = ChatSyntaxWithoutHeader;
 
100
                }
 
101
 
 
102
                message->setShowServerTime(NoServerTime, NoServerTimeDiff);
 
103
                message->setSeparatorSize(separatorSize);
 
104
 
 
105
                return KaduParser::parse(format, message->sender(), message, true);
 
106
        }
 
107
}
 
108
 
 
109
void ChatMessagesView::repaintMessages()
 
110
{
 
111
        kdebugf();
 
112
 
 
113
        QString text = QString(
 
114
                "<html>"
 
115
                "       <head>"
 
116
                "               <style type='text/css'>") +
 
117
                style +
 
118
                "               </style>"
 
119
                "       </head>"
 
120
                "       <body>";
 
121
 
 
122
        QList<ChatMessage *>::const_iterator message = Messages.constBegin();
 
123
        QList<ChatMessage *>::const_iterator prevMessage;
 
124
        QList<ChatMessage *>::const_iterator end = Messages.constEnd();
 
125
 
 
126
        if (message != end)
 
127
        {
 
128
                (*message)->setSeparatorSize(0);
 
129
 
 
130
                if ((*message)->type() == TypeSystem)
 
131
                        text += KaduParser::parse(ChatSyntaxWithoutHeader, (*message)->sender(), *message);
 
132
                else
 
133
                {
 
134
                        (*message)->setShowServerTime(NoServerTime, NoServerTimeDiff);
 
135
                        text += KaduParser::parse(ChatSyntaxWithHeader, (*message)->sender(), *message);
 
136
                }
 
137
 
 
138
                prevMessage = message;
 
139
                while (++message != end)
 
140
                {
 
141
                        text += formatMessage(*message, *prevMessage);
 
142
                        prevMessage = message;
 
143
                }
 
144
        }
 
145
 
 
146
        lastScrollValue = page()->currentFrame()->scrollBarValue(Qt::Vertical);
 
147
        lastLine = (lastScrollValue == page()->currentFrame()->scrollBarMaximum(Qt::Vertical));
 
148
 
 
149
        text += "</body></html>";
 
150
 
 
151
        setHtml(text);
 
152
 
 
153
        kdebugf2();
 
154
}
 
155
 
 
156
void ChatMessagesView::updateBackgroundsAndColors()
 
157
{
 
158
        QString myBackgroundColor = config_file.readEntry("Look", "ChatMyBgColor");
 
159
        QString myFontColor = config_file.readEntry("Look", "ChatMyFontColor");
 
160
        QString myNickColor = config_file.readEntry("Look", "ChatMyNickColor");
 
161
        QString usrBackgroundColor = config_file.readEntry("Look", "ChatUsrBgColor");
 
162
        QString usrFontColor = config_file.readEntry("Look", "ChatUsrFontColor");
 
163
        QString usrNickColor = config_file.readEntry("Look", "ChatUsrNickColor");
 
164
 
 
165
        foreach(ChatMessage *message, Messages)
 
166
        {
 
167
                switch (message->type())
 
168
                {
 
169
                        case TypeSent:
 
170
                                message->setColorsAndBackground(myBackgroundColor, myNickColor, myFontColor);
 
171
                                break;
 
172
 
 
173
                        case TypeReceived:
 
174
                                message->setColorsAndBackground(usrBackgroundColor, usrNickColor, usrFontColor);
 
175
                                break;
 
176
 
 
177
                        case TypeSystem:
 
178
                                break;
 
179
                }
 
180
 
 
181
        }
 
182
}
 
183
 
 
184
void ChatMessagesView::appendMessage(ChatMessage *message)
 
185
{
 
186
        kdebugf();
 
187
 
 
188
        Messages.append(message);
 
189
        pruneMessages();
 
190
        repaintMessages();
 
191
}
 
192
 
 
193
void ChatMessagesView::appendMessages(QList<ChatMessage *> messages)
 
194
{
 
195
        kdebugf2();
 
196
 
 
197
        Messages += messages;
 
198
        pruneMessages();
 
199
        repaintMessages();
 
200
}
 
201
 
 
202
void ChatMessagesView::pruneMessages()
 
203
{
 
204
        kdebugf();
 
205
 
 
206
        if (Prune == 0)
 
207
                return;
 
208
 
 
209
        if (Messages.count() < Prune)
 
210
                return;
 
211
 
 
212
        QList<ChatMessage *>::iterator start = Messages.begin();
 
213
        QList<ChatMessage *>::iterator stop = Messages.find(Messages.at(Messages.size() - Prune));
 
214
        for (QList<ChatMessage *>::iterator it = start; it != stop; ++it)
 
215
                delete *it;
 
216
 
 
217
        Messages.erase(start, stop);
 
218
}
 
219
 
 
220
void ChatMessagesView::setPrune(unsigned int prune)
 
221
{
 
222
        Prune = prune;
 
223
}
 
224
 
 
225
void ChatMessagesView::removeMessages()
 
226
{
 
227
        qDeleteAll(Messages);
 
228
        Messages.clear();
 
229
}
 
230
 
 
231
void ChatMessagesView::clearMessages()
 
232
{
 
233
        removeMessages();
 
234
 
 
235
        setHtml("<body bgcolor=\"" + config_file.readColorEntry("Look", "ChatBgColor").name() + "\"></body>");
 
236
}
 
237
 
 
238
unsigned int ChatMessagesView::countMessages()
 
239
{
 
240
        return Messages.count();
 
241
}
 
242
 
 
243
void ChatMessagesView::configurationUpdated()
 
244
{
 
245
        ParagraphSeparator = config_file.readUnsignedNumEntry("Look", "ParagraphSeparator");
 
246
 
 
247
        QFont font = config_file.readFontEntry("Look","ChatFont");
 
248
 
 
249
        QString fontFamily = font.family();
 
250
        QString fontSize;
 
251
        if (font.pointSize() > 0)
 
252
#ifdef Q_OS_MAC
 
253
                /*  Dorr: On MacOSX this font is being displayed 3pts larger than
 
254
                 *  it really is, so reduce it's size to be coherent in entire
 
255
                 *  application.
 
256
                 */
 
257
                fontSize = QString::number(font.pointSize()-3) + "pt";
 
258
#else
 
259
                fontSize = QString::number(font.pointSize()) + "pt";
 
260
#endif
 
261
        else
 
262
                fontSize = QString::number(font.pixelSize()) + "px";
 
263
        QString fontStyle = font.italic() ? "italic" : "normal";
 
264
        QString fontWeight = font.bold() ? "bold" : "normal";
 
265
        QString textDecoration = font.underline() ? "underline" : "none";
 
266
        QString backgroundColor = config_file.readColorEntry("Look", "ChatBgColor").name();
 
267
 
 
268
        style = QString(
 
269
                "html {"
 
270
                "       font: %1 %2 %3 %4;"
 
271
                "       text-decoration: %5;"
 
272
                "       word-wrap: break-word;"
 
273
                "}"
 
274
                "body {"
 
275
                "       margin: %6;"
 
276
                "       padding: 0;"
 
277
                "       background-color: %7;"
 
278
                "}"
 
279
                "p {"
 
280
                "       margin: 0;"
 
281
                "       padding: 3px;"
 
282
                "}").arg(fontStyle, fontWeight, fontSize, fontFamily, textDecoration, QString::number(ParagraphSeparator), backgroundColor);
 
283
 
 
284
        // background color of chat
 
285
//      QString bgImage = KaduParser::parse(config_file.readEntry("Look", "ChatBgImage"), usrs[0]);
 
286
 
 
287
        // TODO: for me with empty styleSheet if has artifacts on scrollbars...
 
288
        // maybe Qt bug?
 
289
        setStyleSheet("QWidget { }");
 
290
//      if (!bgImage.isEmpty() && QFile::exists(bgImage))
 
291
//              brush.setPixmap(QPixmap(bgImage));
 
292
 
 
293
        QString chatSyntax = SyntaxList::readSyntax("chat", config_file.readEntry("Look", "Style"),
 
294
                "<p style=\"background-color: #{backgroundColor};\">#{separator}"
 
295
                  "<font color=\"#{fontColor}\"><kadu:header><b><font color=\"#{nickColor}\">%a</font> :: "
 
296
                        "#{receivedDate}[ / S #{sentDate}]</b><br /></kadu:header>"
 
297
                "#{message}</font></p>"
 
298
        );
 
299
        int beginOfHeader = chatSyntax.find("<kadu:header>");
 
300
        int endOfHeader = chatSyntax.find("</kadu:header>");
 
301
        ChatSyntaxWithHeader = chatSyntax;
 
302
        ChatSyntaxWithHeader.replace("<kadu:header>", "");
 
303
        ChatSyntaxWithHeader.replace("</kadu:header>", "");
 
304
 
 
305
        if (endOfHeader != -1)
 
306
                ChatSyntaxWithoutHeader = chatSyntax.mid(0, beginOfHeader) + chatSyntax.mid(endOfHeader + strlen("</kadu:header>"));
 
307
        else
 
308
                ChatSyntaxWithoutHeader = ChatSyntaxWithHeader;
 
309
 
 
310
        CfgNoHeaderRepeat = config_file.readBoolEntry("Look", "NoHeaderRepeat");
 
311
 
 
312
 
 
313
        // headers removal stuff
 
314
        if (CfgNoHeaderRepeat)
 
315
        {
 
316
                CfgHeaderSeparatorHeight = config_file.readUnsignedNumEntry("Look", "HeaderSeparatorHeight");
 
317
                CfgNoHeaderInterval = config_file.readUnsignedNumEntry("Look", "NoHeaderInterval");
 
318
        }
 
319
        else
 
320
        {
 
321
                CfgHeaderSeparatorHeight = 0;
 
322
                CfgNoHeaderInterval = 0;
 
323
        }
 
324
 
 
325
        NoServerTime = config_file.readBoolEntry("Look", "NoServerTime");
 
326
        NoServerTimeDiff = config_file.readUnsignedNumEntry("Look", "NoServerTimeDiff");
 
327
 
 
328
        updateBackgroundsAndColors();
 
329
 
 
330
        repaintMessages();
 
331
}
 
332
 
 
333
void ChatMessagesView::resizeEvent(QResizeEvent *e)
 
334
{
 
335
        lastScrollValue = page()->currentFrame()->scrollBarValue(Qt::Vertical);
 
336
        lastLine = (lastScrollValue == page()->currentFrame()->scrollBarMaximum(Qt::Vertical));
 
337
 
 
338
        KaduTextBrowser::resizeEvent(e);
 
339
 
 
340
        scrollToLine();
 
341
}
 
342
 
 
343
void ChatMessagesView::scrollToLine()
 
344
{
 
345
        if (lastLine)
 
346
                page()->currentFrame()->setScrollBarValue(Qt::Vertical, page()->currentFrame()->scrollBarMaximum(Qt::Vertical));
 
347
        else
 
348
                page()->currentFrame()->setScrollBarValue(Qt::Vertical, lastScrollValue);
 
349
}