1 /***************************************************************************
2 * Copyright (C) 2004 by Kita Developers *
3 * ikemo@users.sourceforge.jp *
5 * This program is free software; you can redistribute it and/or modify *
6 * it under the terms of the GNU General Public License as published by *
7 * the Free Software Foundation; either version 2 of the License, or *
8 * (at your option) any later version. *
9 ***************************************************************************/
11 #include "boardview.h"
13 #include <QtCore/QDateTime>
14 #include <QtCore/QList>
15 #include <QtGui/QApplication>
16 #include <QtGui/QMouseEvent>
20 #include <kmessagebox.h>
21 #include <kstandarddirs.h>
23 #include "boardtabwidget.h"
24 #include "threadlistheaderview.h"
25 #include "threadlistviewitem.h"
26 #include "viewmediator.h"
27 #include "libkita/boarddatabase.h"
28 #include "libkita/datmanager.h"
29 #include "libkita/globalconfig.h"
30 #include "libkita/kita_misc.h"
31 #include "libkita/thread.h"
35 BoardView::BoardView(BoardTabWidget* parent) : ThreadListView(parent)
39 closeButton->setEnabled(true);
41 connect(reloadButton, SIGNAL(clicked()),
42 SLOT(reloadSubject()));
44 connect(closeButton, SIGNAL(clicked()),
45 SLOT(slotCloseButton()));
47 //connect(subjectList, SIGNAL(columnResized(int, int, int)),
48 // SLOT(slotSizeChange(int, int, int))); TODO
53 m_deleteLogAct->setVisible(true);
57 void BoardView::init()
62 m_showOldLogs = false;
63 m_enableSizeChange = false;
67 void BoardView::reloadSubject()
69 if (!m_boardUrl.isEmpty()) {
70 loadBoard(m_boardUrl);
76 void BoardView::slotCloseButton()
78 m_parent->slotCloseCurrentTab();
82 const KUrl BoardView::boardUrl()
87 void BoardView::toggleShowOldLogs()
89 m_showOldLogs = !m_showOldLogs;
90 loadBoard(m_boardUrl, false);
103 void BoardView::loadBoard(const KUrl& url, bool online)
106 topLevelWidget()->raise();
107 m_enableSizeChange = false;
109 // reset member variables.
110 // FIXME: FavoriteListView::update()
114 m_prevquery = QStringList();
122 /* get list of pointers of Thread classes */
123 QList<Thread*> oldLogList;
124 QList<Thread*> threadList;
125 BoardDatabase db(m_boardUrl);
126 db.getThreadList(m_showOldLogs, online, threadList, oldLogList);
129 subjectList->clearContents();
131 QDateTime current = QDateTime::currentDateTime();
132 int countNew = threadList.count();
133 int countOld = oldLogList.count();
134 int count = countNew + countOld;
135 subjectList->setRowCount(count);
136 subjectList->setSortingEnabled(false);
137 for (int i = 0; i < count; i++) {
139 = i < countNew ? threadList.at(i) : oldLogList.at(i - countNew);
140 KUrl datUrl = thread->datUrl();
141 for (int j = 0, k = subjectList->columnCount(); j < k; j++) {
142 ThreadListViewItem* item = new ThreadListViewItem(j);
143 subjectList->setItem(i, j, item);
145 int id = (i < countNew ? i + 1 : 0);
147 updateRow(i, datUrl, current, id, order);
149 subjectList->setSortingEnabled(true);
151 if (hideButton->isChecked()) {
152 hideButton->toggle();
154 ViewMediator::getInstance()->setMainUrlLine(m_boardUrl);
156 switch (GlobalConfig::listSortOrder()) {
157 case GlobalConfig::EnumListSortOrder::Mark:
158 subjectList->sortItems(ColumnMark);
160 case GlobalConfig::EnumListSortOrder::ID:
161 subjectList->sortItems(ColumnId);
168 subjectList->setFocus();
171 /* restore column size */
174 m_enableSizeChange = true;
175 for (int i = 0, j = subjectList->columnCount(); i < j; i++) {
176 subjectList->resizeColumnToContents(i);
178 for (int i = 0, j = subjectList->rowCount(); i < j; i++) {
179 subjectList->resizeRowToContents(i);
183 /* public slot */ /* virtual */
184 void BoardView::setFocus()
186 subjectList->setFocus();
190 void BoardView::slotFocusSearchCombo()
192 searchCombo->hasFocus() ? setFocus() : searchCombo->setFocus();
195 void BoardView::updateKindLabel()
198 fmtstr += QString("<font color=#C50000>%1</font>").arg(m_unreadNum);
199 fmtstr += QString("/<font color=#00C200>%1</font>").arg(m_readNum);
200 fmtstr += QString("/<font color=#5AAAFF>%1</font>").arg(m_newNum);
201 kindLabel->setText(fmtstr);
204 void BoardView::setFont(const QFont& font)
206 subjectList->setFont(font);
207 searchCombo->setFont(font);
210 void BoardView::slotUpdateSubject(const KUrl& url)
212 QDateTime current = QDateTime::currentDateTime();
214 KUrl datUrl = getDatUrl(url);
215 for (int i = 0, j = subjectList->rowCount(); i < j; i++) {
216 if (subjectList->item(i, ColumnDatUrl)->text() == datUrl.prettyUrl()) {
218 switch (subjectList->item(i, ColumnMark)->data(Qt::UserRole)
227 case ThreadHasUnread:
232 Thread* thread = Thread::getByUrlNew(datUrl);
235 int id = subjectList->item(i, ColumnId)->text().toInt();
236 int order = subjectList->item(i, ColumnIdOrder)->text().toInt();
237 updateRow(i, datUrl, current, id, order);
246 /* if id == 0, this thread is old thread. */
248 void BoardView::updateRow(int row, const KUrl& datUrl,
249 const QDateTime& current, int id, int order)
252 since.setTime_t(datToSince(datUrl));
253 DatManager datManager(datUrl);
254 QString threadName = datManager.threadName();
255 int resNum = datManager.getResNum();
256 int readNum = datManager.getReadNum();
257 int viewPos = datManager.getViewPos();
258 double speed = resNum / (since.secsTo(current) / (60.0 * 60.0 * 24.0));
261 subjectList->item(row, ColumnId)->setText(QString::number(id));
262 subjectList->item(row, ColumnIdOrder)->setText(QString::number(order));
263 subjectList->item(row, ColumnSubject)->setText(threadName);
264 subjectList->item(row, ColumnResNum)->setText(QString("%1").arg(resNum, 4));
265 subjectList->item(row, ColumnReadNum)
266 ->setText((viewPos > 0) ? QString("%1").arg(viewPos, 4) : QString());
267 subjectList->item(row, ColumnUnread)
268 ->setText((viewPos > 0 && resNum > viewPos)
269 ? QString("%1").arg(resNum - viewPos, 4) : QString());
270 subjectList->item(row, ColumnSince)
271 ->setText(since.toString("yy/MM/dd hh:mm"));
272 subjectList->item(row, ColumnDatUrl)->setText(datUrl.prettyUrl());
273 subjectList->item(row, ColumnSpeed)
274 ->setText(QString(" %1 ").arg(speed, 0, 'f', 2));
277 QTableWidgetItem *item = subjectList->item(row, ColumnMark);
279 if (!id) { /* old thread */
280 orderValue = ThreadOld;
281 } else if (readNum > 0 && (resNum > readNum || resNum > viewPos)) {
282 /* There are new responses. */
283 item->setIcon(QIcon(SmallIcon("unread")));
285 orderValue = ThreadHasUnread;
286 } else if (readNum > 0) { /* Cache exists */
287 item->setIcon(QIcon(SmallIcon("read")));
289 orderValue = (viewPos > 1000) ? ThreadReaded : ThreadRead;
290 } else if (since.secsTo(current) < 3600 * GlobalConfig::markTime()) {
292 item->setIcon(QIcon(SmallIcon("newthread")));
294 orderValue = ThreadNew;
295 } else { /* normal */
296 item->setIcon(QIcon());
297 orderValue = ThreadNormal;
299 item->setData(Qt::UserRole, orderValue);
301 // no effect: m_unreadNum, m_readNum, m_newNum, markOrder
302 if (datManager.isMainThreadOpened() && resNum == readNum) {
304 subjectList->item(row, ColumnMark)->setIcon(QIcon(SmallIcon("open")));
308 void BoardView::deleteLog(const KUrl& url)
310 if (KMessageBox::warningYesNo(this, i18n("Do you want to delete Log?"),
311 "Kita") == KMessageBox::Yes) {
312 if (DatManager(url).deleteCache()) {
313 ViewMediator::getInstance()->closeThreadTab(url);
314 slotUpdateSubject(url);
319 void BoardView::slotSizeChange(int section, int oldSize, int newSize)
321 if (!m_enableSizeChange) return ;
322 if (autoResize()) return ;
325 = KStandardDirs::locateLocal("appdata", "subjectview.conf");
326 // KConfig config(configPath); TODO
327 // subjectList->saveLayout(&config, "Layout"); TODO
330 void BoardView::loadLayout()
332 if (autoResize()) return ;
334 = KStandardDirs::locateLocal("appdata", "subjectview.conf");
335 KConfig config(configPath);
336 // subjectList->restoreLayout(&config, "Layout"); TODO
339 void BoardView::saveHeaderOnOff()
342 = KStandardDirs::locateLocal("appdata", "subjectview.conf");
343 KConfig config(configPath);
345 KConfigGroup group = config.group("Column");
346 for (int i = ColumnBegin; i <= ColumnEnd; i++) {
347 group.writeEntry(ThreadListHeaderView::attribute[i].keyName,
348 subjectList->columnWidth(i) != 0);
352 void BoardView::loadHeaderOnOff()
355 = KStandardDirs::locateLocal("appdata", "subjectview.conf");
356 KConfig config(configPath);
358 KConfigGroup group = config.group("Column");
359 for (int i = ColumnBegin; i <= ColumnEnd; i++) {
360 bool isShown = group.readEntry(
361 ThreadListHeaderView::attribute[i].keyName,
362 ThreadListHeaderView::attribute[i].showDefault);
363 isShown ? showColumn(i) : hideColumn(i);
367 bool BoardView::autoResize()
370 = KStandardDirs::locateLocal("appdata", "subjectview.conf");
371 KConfig config(configPath);
373 return config.group("Column").readEntry("AutoResize", true);
376 void BoardView::setAutoResize(bool flag)
379 = KStandardDirs::locateLocal("appdata", "subjectview.conf");
380 KConfig config(configPath);
382 config.group("Column").writeEntry("AutoResize", flag);