1
/***************************************************************************
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. *
8
***************************************************************************/
10
#include <QtGui/QScrollBar>
11
#include <QtWebKit/QWebFrame>
13
#include "chat_message.h"
14
#include "config_file.h"
17
#include "kadu_parser.h"
19
#include "syntax_editor.h"
21
#include "chat_messages_view.h"
23
QString ChatMessagesView::style = "";
25
ChatMessagesView::ChatMessagesView(QWidget *parent) : KaduTextBrowser(parent),
26
Prune(0), lastScrollValue(0), lastLine(false)
28
setMinimumSize(QSize(100,100));
30
connect(gadu, SIGNAL(imageReceivedAndSaved(UinType, quint32 , quint32 , const QString &)),
31
this, SLOT(imageReceivedAndSaved(UinType, quint32 , quint32 , const QString &)));
33
connect(this, SIGNAL(loadFinished(bool)), this, SLOT(scrollToLine()));
35
configurationUpdated();
37
setFocusPolicy(Qt::NoFocus);
40
ChatMessagesView::~ChatMessagesView()
46
void ChatMessagesView::pageUp()
48
QKeyEvent event(QEvent::KeyPress, 0x01000016, Qt::NoModifier);
49
keyPressEvent(&event);
52
void ChatMessagesView::pageDown()
54
QKeyEvent event(QEvent::KeyPress, 0x01000017, Qt::NoModifier);
55
keyPressEvent(&event);
58
void ChatMessagesView::imageReceivedAndSaved(UinType sender, quint32 size, quint32 crc32,const QString & /*path*/)
60
foreach(ChatMessage *message, Messages)
61
message->replaceLoadingImages(sender, size, crc32);
65
QString ChatMessagesView::formatMessage(ChatMessage *message, ChatMessage *after)
73
if (message->type() == TypeSystem)
75
separatorSize = ParagraphSeparator;
76
format = ChatSyntaxWithoutHeader;
78
message->setSeparatorSize(separatorSize);
79
return KaduParser::parse(format, message->sender(), message, true);
83
includeHeader = (!CfgNoHeaderRepeat || !after);
85
if (after && !includeHeader)
87
(after->type() != TypeSystem) &&
88
((message->date().toTime_t() - after->date().toTime_t() > (CfgNoHeaderInterval * 60)) ||
89
(message->sender() != after->sender()));
93
separatorSize = CfgHeaderSeparatorHeight;
94
format = ChatSyntaxWithHeader;
98
separatorSize = ParagraphSeparator;
99
format = ChatSyntaxWithoutHeader;
102
message->setShowServerTime(NoServerTime, NoServerTimeDiff);
103
message->setSeparatorSize(separatorSize);
105
return KaduParser::parse(format, message->sender(), message, true);
109
void ChatMessagesView::repaintMessages()
113
QString text = QString(
116
" <style type='text/css'>") +
122
QList<ChatMessage *>::const_iterator message = Messages.constBegin();
123
QList<ChatMessage *>::const_iterator prevMessage;
124
QList<ChatMessage *>::const_iterator end = Messages.constEnd();
128
(*message)->setSeparatorSize(0);
130
if ((*message)->type() == TypeSystem)
131
text += KaduParser::parse(ChatSyntaxWithoutHeader, (*message)->sender(), *message);
134
(*message)->setShowServerTime(NoServerTime, NoServerTimeDiff);
135
text += KaduParser::parse(ChatSyntaxWithHeader, (*message)->sender(), *message);
138
prevMessage = message;
139
while (++message != end)
141
text += formatMessage(*message, *prevMessage);
142
prevMessage = message;
146
lastScrollValue = page()->currentFrame()->scrollBarValue(Qt::Vertical);
147
lastLine = (lastScrollValue == page()->currentFrame()->scrollBarMaximum(Qt::Vertical));
149
text += "</body></html>";
156
void ChatMessagesView::updateBackgroundsAndColors()
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");
165
foreach(ChatMessage *message, Messages)
167
switch (message->type())
170
message->setColorsAndBackground(myBackgroundColor, myNickColor, myFontColor);
174
message->setColorsAndBackground(usrBackgroundColor, usrNickColor, usrFontColor);
184
void ChatMessagesView::appendMessage(ChatMessage *message)
188
Messages.append(message);
193
void ChatMessagesView::appendMessages(QList<ChatMessage *> messages)
197
Messages += messages;
202
void ChatMessagesView::pruneMessages()
209
if (Messages.count() < Prune)
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)
217
Messages.erase(start, stop);
220
void ChatMessagesView::setPrune(unsigned int prune)
225
void ChatMessagesView::removeMessages()
227
qDeleteAll(Messages);
231
void ChatMessagesView::clearMessages()
235
setHtml("<body bgcolor=\"" + config_file.readColorEntry("Look", "ChatBgColor").name() + "\"></body>");
238
unsigned int ChatMessagesView::countMessages()
240
return Messages.count();
243
void ChatMessagesView::configurationUpdated()
245
ParagraphSeparator = config_file.readUnsignedNumEntry("Look", "ParagraphSeparator");
247
QFont font = config_file.readFontEntry("Look","ChatFont");
249
QString fontFamily = font.family();
251
if (font.pointSize() > 0)
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
257
fontSize = QString::number(font.pointSize()-3) + "pt";
259
fontSize = QString::number(font.pointSize()) + "pt";
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();
270
" font: %1 %2 %3 %4;"
271
" text-decoration: %5;"
272
" word-wrap: break-word;"
277
" background-color: %7;"
282
"}").arg(fontStyle, fontWeight, fontSize, fontFamily, textDecoration, QString::number(ParagraphSeparator), backgroundColor);
284
// background color of chat
285
// QString bgImage = KaduParser::parse(config_file.readEntry("Look", "ChatBgImage"), usrs[0]);
287
// TODO: for me with empty styleSheet if has artifacts on scrollbars...
289
setStyleSheet("QWidget { }");
290
// if (!bgImage.isEmpty() && QFile::exists(bgImage))
291
// brush.setPixmap(QPixmap(bgImage));
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>"
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>", "");
305
if (endOfHeader != -1)
306
ChatSyntaxWithoutHeader = chatSyntax.mid(0, beginOfHeader) + chatSyntax.mid(endOfHeader + strlen("</kadu:header>"));
308
ChatSyntaxWithoutHeader = ChatSyntaxWithHeader;
310
CfgNoHeaderRepeat = config_file.readBoolEntry("Look", "NoHeaderRepeat");
313
// headers removal stuff
314
if (CfgNoHeaderRepeat)
316
CfgHeaderSeparatorHeight = config_file.readUnsignedNumEntry("Look", "HeaderSeparatorHeight");
317
CfgNoHeaderInterval = config_file.readUnsignedNumEntry("Look", "NoHeaderInterval");
321
CfgHeaderSeparatorHeight = 0;
322
CfgNoHeaderInterval = 0;
325
NoServerTime = config_file.readBoolEntry("Look", "NoServerTime");
326
NoServerTimeDiff = config_file.readUnsignedNumEntry("Look", "NoServerTimeDiff");
328
updateBackgroundsAndColors();
333
void ChatMessagesView::resizeEvent(QResizeEvent *e)
335
lastScrollValue = page()->currentFrame()->scrollBarValue(Qt::Vertical);
336
lastLine = (lastScrollValue == page()->currentFrame()->scrollBarMaximum(Qt::Vertical));
338
KaduTextBrowser::resizeEvent(e);
343
void ChatMessagesView::scrollToLine()
346
page()->currentFrame()->setScrollBarValue(Qt::Vertical, page()->currentFrame()->scrollBarMaximum(Qt::Vertical));
348
page()->currentFrame()->setScrollBarValue(Qt::Vertical, lastScrollValue);