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 "mainwindow.h"
13 #include <QtCore/QEvent>
14 #include <QtCore/QFile>
15 #include <QtGui/QBoxLayout>
16 #include <QtGui/QKeyEvent>
17 #include <QtGui/QSplitter>
20 #include <kactioncollection.h>
21 #include <kapplication.h>
23 #include <kedittoolbar.h>
25 #include <klineedit.h>
28 #include <kshortcutsdialog.h>
29 #include <kstandarddirs.h>
30 #include <kstatusbar.h>
31 #include <ktoggleaction.h>
34 #include <kxmlguifactory.h>
36 #include "bbstabwidget.h"
37 #include "boardtabwidget.h"
38 #include "threadtabwidget.h"
39 #include "viewmediator.h"
40 #include "writetabwidget.h"
41 #include "libkita/abone.h"
42 #include "libkita/account.h"
43 #include "libkita/accountconfig.h"
44 #include "libkita/asciiart.h"
45 #include "libkita/colorconfig.h"
46 #include "libkita/datmanager.h"
47 #include "libkita/favoriteboards.h"
48 #include "libkita/favoritethreads.h"
49 #include "libkita/globalconfig.h"
50 #include "libkita/kita_misc.h"
51 #include "libkita/threadinfo.h"
52 #include "libkita/writeconfig.h"
53 #include "prefs/preferences.h"
57 MainWindow::MainWindow() : KXmlGuiWindow(0), m_prefDialog(0)
65 // then, setup our actions
72 AsciiArtConfig::self()->readConfig();
73 if (AsciiArtConfig::self()->asciiArtList().isEmpty()) {
78 AboneConfig::self()->readConfig();
79 if (AboneConfig::self()->aboneIDList().isEmpty()) {
83 if (AboneConfig::self()->aboneNameList().isEmpty()) {
87 if (AboneConfig::self()->aboneWordList().isEmpty()) {
97 AccountConfig::self()->readConfig();
98 ColorConfig::self()->readConfig();
99 GlobalConfig::self()->readConfig();
100 WriteConfig::self()->readConfig();
102 // apply the saved mainwindow settings, if any, and ask the mainwindow
103 // to automatically save settings if changed: window size, toolbar
104 // position, icon size, etc.
105 setAutoSaveSettings();
108 setFont(GlobalConfig::font());
110 // allow the view to change the statusbar and caption
111 connect(m_urlLine, SIGNAL(returnPressed()),
112 SLOT(slotUrlLine()));
114 QMenu* settingsPopup = static_cast<QMenu *>(factory() ->container("settings", this));
115 connect(settingsPopup, SIGNAL(aboutToShow()),
116 SLOT(settingsMenuAboutToShow()));
118 // load favorite boards;
119 loadFavoriteBoards();
123 QString configPath = KStandardDirs::locateLocal("appdata", "board_list");
124 if (QFile::exists(configPath)) {
125 m_bbsTab->showBoardList();
126 m_bbsTab->loadOpened();
128 m_bbsTab->updateBoardList();
135 // update favorite list
136 ViewMediator::getInstance()->updateFavoriteListView();
138 if (AccountConfig::autoLogin()) {
143 MainWindow::~MainWindow()
145 AboneConfig::self()->writeConfig();
147 AsciiArtConfig::self()->writeConfig();
149 saveFavoriteBoards();
155 saveMainWindowSettings(KGlobal::config().data()->group("MainWindow"));
157 AccountConfig::self()->writeConfig();
158 ColorConfig::self()->writeConfig();
159 GlobalConfig::self()->writeConfig();
160 WriteConfig::self()->writeConfig();
162 DatManager::deleteAllDatInfo();
165 void MainWindow::load(const KUrl& url)
167 setCaption(url.url());
170 void MainWindow::bookmark(const QString& datUrl, bool on)
172 FavoriteThreads * favorite = FavoriteThreads::getInstance();
174 on ? favorite->insert(datUrl) : favorite->remove(datUrl);
176 ViewMediator::getInstance()->updateFavoriteListView();
179 void MainWindow::login()
181 if (Account::login(AccountConfig::userID(), AccountConfig::password())) {
182 setMainStatus(i18nc("@info:status", "Login succeeded."));
184 setMainStatus(i18nc("@info:status", "Login failed."));
188 void MainWindow::newToolbarConfig()
190 // this slot is called when user clicks "Ok" or "Apply" in the toolbar editor.
191 // recreate our GUI, and re-apply the settings (e.g. "text under icons", etc.)
192 applyMainWindowSettings(KGlobal::config().data()->group("MainWindow"));
195 void MainWindow::optionsShowToolbar()
197 // this is all very cut and paste code for showing/hiding the
199 if (m_toolbarAction->isChecked()) {
206 void MainWindow::optionsShowStatusbar()
208 // this is all very cut and paste code for showing/hiding the
210 if (m_statusbarAction->isChecked()) {
211 statusBar() ->show();
213 statusBar() ->hide();
217 void MainWindow::optionsConfigureKeys()
219 KShortcutsDialog::configure(actionCollection());
222 void MainWindow::optionsConfigureToolbars()
224 // use the standard toolbar editor
225 KEditToolBar dlg(factory());
226 connect(&dlg, SIGNAL(newToolbarConfig()),
227 SLOT(newToolbarConfig()));
231 void MainWindow::optionsPreferences()
233 if (m_prefDialog == 0) {
234 m_prefDialog = new Preferences(this);
235 m_prefDialog->load();
236 connect(m_prefDialog, SIGNAL(fontChanged(const QFont&)),
237 SLOT(setFont(const QFont&)));
238 m_prefDialog->show();
240 m_prefDialog->show();
241 m_prefDialog->raise();
245 void MainWindow::settingsMenuAboutToShow()
247 m_toolbarAction->setChecked(toolBar() ->isVisible());
248 m_statusbarAction->setChecked(statusBar() ->isVisible());
251 void MainWindow::setFont(const QFont& font)
253 m_boardTab->setFont(font);
254 m_bbsTab->setFont(font);
257 void MainWindow::setUrl(const KUrl& url)
259 m_urlLine->setText(url.url());
262 void MainWindow::slotEditCopy()
264 QWidget * widget = KApplication::kApplication()->focusWidget();
267 QKeyEvent e(QEvent::KeyPress, Qt::Key_C, Qt::ControlModifier);
268 QApplication::sendEvent(widget, &e);
272 void MainWindow::setMainStatus(const QString& statusStr)
274 // display the text on the statusbar
275 statusBar()->showMessage(statusStr);
278 void MainWindow::slotUrlLine()
280 KUrl url = m_urlLine->text();
281 KUrl datUrl = getDatUrl(url);
282 m_threadTab->slotShowMainThread(datUrl);
289 void MainWindow::setupActions()
291 KStandardAction::quit(this, SLOT(close()), actionCollection());
292 KStandardAction::copy(this, SLOT(slotEditCopy()), actionCollection());
294 setStandardToolBarMenuEnabled(true);
297 = new KToggleAction(i18nc("@action:inmenu", "Show Toolbar"), this);
298 actionCollection()->addAction("toolBar", m_toolbarAction);
299 connect(m_toolbarAction, SIGNAL(toggled(bool)),
300 SLOT(optionsShowToolbar()));
302 m_statusbarAction = KStandardAction::showStatusbar(this,
303 SLOT(optionsShowStatusbar()),
306 m_urlLine = new KLineEdit;
307 KAction* urlLineAction = new KAction(this);
308 urlLineAction->setDefaultWidget(m_urlLine);
309 urlLineAction->setText(i18nc("@action:intoolbar", "Location Bar"));
310 actionCollection()->addAction("url_line_action", urlLineAction);
311 connect(urlLineAction, SIGNAL(triggered()), this, SLOT(slotUrlLine()));
313 KStandardAction::keyBindings(this, SLOT(optionsConfigureKeys()),
315 KStandardAction::configureToolbars(this, SLOT(optionsConfigureToolbars()),
317 KStandardAction::preferences(this, SLOT(optionsPreferences()),
320 KAction* loadBoardAction
321 = actionCollection()->addAction("load_board_list");
322 loadBoardAction->setText(i18nc("@action:inmenu", "Load Board List"));
323 connect(loadBoardAction, SIGNAL(triggered()),
324 m_bbsTab, SLOT(updateBoardList()));
326 KAction* loginAction = actionCollection()->addAction("login");
327 loginAction->setText(i18nc("@action:inmenu Login menu", "Login"));
328 connect(loginAction, SIGNAL(triggered()), m_bbsTab, SLOT(login()));
330 setXMLFile("kitaui.rc");
331 KXmlGuiWindow::createGUI();
332 factory()->addClient(m_bbsTab);
333 factory()->addClient(m_boardTab);
334 factory()->addClient(m_threadTab);
335 factory()->addClient(m_writeTab);
338 void MainWindow::setupView()
340 ViewMediator::getInstance()->setMainWindow(this);
342 QWidget* mainWidget = new QWidget(this);
344 QBoxLayout* mainLayout = new QVBoxLayout(mainWidget);
345 QSplitter* hsplit = new QSplitter(mainWidget);
346 mainLayout->addWidget(hsplit);
348 m_bbsTab = new BBSTabWidget(hsplit);
350 QSplitter* vsplit = new QSplitter(Qt::Vertical, hsplit);
352 m_boardTab = new BoardTabWidget(vsplit);
353 ViewMediator::getInstance()->setBoardTabWidget(m_boardTab);
355 m_threadTab = new ThreadTabWidget(vsplit);
356 ViewMediator::getInstance()->setThreadTabWidget(m_threadTab);
358 hsplit->setSizes(QList<int>() << 100 << 500);
359 vsplit->setSizes(QList<int>() << 200 << 300);
361 setCentralWidget(mainWidget);
364 m_writeTab = new WriteTabWidget(0);
365 ViewMediator::getInstance()->setWriteTabWidget(m_writeTab);
368 void MainWindow::loadCache()
370 ThreadInfo * cache = ThreadInfo::getInstance();
371 QString cacheConfigPath = KStandardDirs::locateLocal("appdata", "cache");
372 QFile file(cacheConfigPath);
373 if (file.open(QIODevice::ReadOnly)) {
374 QDataStream stream(&file);
379 void MainWindow::saveCache()
381 ThreadInfo * cache = ThreadInfo::getInstance();
382 QString cacheConfigPath = KStandardDirs::locateLocal("appdata", "cache");
383 QFile file(cacheConfigPath);
384 if (file.open(QIODevice::WriteOnly)) {
385 QDataStream stream(&file);
390 void MainWindow::loadFavorites()
392 QString favoritesConfigPath = KStandardDirs::locateLocal("appdata", "favorites.xml");
393 QFile file(favoritesConfigPath);
394 if (file.open(QIODevice::ReadOnly)) {
395 QTextStream stream(&file);
396 stream.setCodec("UTF-8");
398 QString xml = stream.readAll();
399 FavoriteThreads::readFromXML(xml);
403 void MainWindow::saveFavorites()
405 QString favoritesConfigPath
406 = KStandardDirs::locateLocal("appdata", "favorites.xml");
407 QFile file(favoritesConfigPath);
408 if (file.open(QIODevice::WriteOnly)) {
409 QTextStream stream(&file);
410 stream.setCodec("UTF-8");
411 stream << FavoriteThreads::getInstance()->toXML();
415 void MainWindow::loadFavoriteBoards()
417 QString configPath = KStandardDirs::locateLocal("appdata", "favorite_boards.xml");
418 QFile file(configPath);
419 if (file.open(QIODevice::ReadOnly)) {
420 QTextStream stream(&file);
421 stream.setCodec("UTF-8");
423 QString xml = stream.readAll();
424 FavoriteBoards::readFromXML(xml);
428 void MainWindow::saveFavoriteBoards()
430 QString configPath = KStandardDirs::locateLocal("appdata", "favorite_boards.xml");
431 QFile file(configPath);
432 if (file.open(QIODevice::WriteOnly)) {
433 QTextStream stream(&file);
434 stream.setCodec("UTF-8");
435 stream << FavoriteBoards::toXML();
439 void MainWindow::loadCompletion()
441 QString configPath = KStandardDirs::locateLocal("appdata", "completion");
442 KConfig config(configPath);
444 GlobalConfig::setNameCompletionList(
445 config.group("").readEntry("name", QStringList()));
448 void MainWindow::loadAsciiArt()
450 QString configPath = KStandardDirs::locateLocal("appdata", "asciiart");
451 QFile file(configPath);
452 if (file.open(QIODevice::ReadOnly)) {
453 QTextStream stream(&file);
454 stream.setCodec("UTF-8");
459 while (!(str = stream.readLine()).isEmpty()) {
460 if (! str.isEmpty()) {
464 AsciiArtConfig::setAsciiArtList(list);
468 void MainWindow::loadAboneIDList()
470 QString configPath = KStandardDirs::locateLocal("appdata", "abone_id");
471 QFile file(configPath);
472 if (file.open(QIODevice::ReadOnly)) {
473 QTextStream stream(&file);
474 stream.setCodec("UTF-8");
479 while (!(str = stream.readLine()).isEmpty()) {
480 if (! str.isEmpty()) {
484 AboneConfig::setAboneIDList(list);
488 void MainWindow::loadAboneNameList()
490 QString configPath = KStandardDirs::locateLocal("appdata", "abone_name");
491 QFile file(configPath);
492 if (file.open(QIODevice::ReadOnly)) {
493 QTextStream stream(&file);
494 stream.setCodec("UTF-8");
499 while (!(str = stream.readLine()).isEmpty()) {
500 if (! str.isEmpty()) {
504 AboneConfig::setAboneNameList(list);
508 void MainWindow::loadAboneWordList()
510 QString configPath = KStandardDirs::locateLocal("appdata", "abone_word");
511 QFile file(configPath);
512 if (file.open(QIODevice::ReadOnly)) {
513 QTextStream stream(&file);
514 stream.setCodec("UTF-8");
519 while (!(str = stream.readLine()).isEmpty()) {
520 if (! str.isEmpty()) {
524 AboneConfig::setAboneWordList(list);