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 "prefs/prefs.h"
15 #include "threadview.h"
16 #include "threadtabwidget.h"
17 #include "boardview.h"
18 #include "boardtabwidget.h"
20 #include "bbstabwidget.h"
21 #include "writetabwidget.h"
22 #include "viewmediator.h"
24 #include "libkita/threadinfo.h"
25 #include "libkita/favoriteboards.h"
26 #include "libkita/favoritethreads.h"
27 #include "libkita/kita_misc.h"
28 #include "libkita/kitaconfig.h"
29 #include "libkita/signalcollection.h"
30 #include "libkita/account.h"
31 #include "libkita/datmanager.h"
32 #include "libkita/boardmanager.h"
33 #include "libkita/config_xt.h"
34 #include "libkita/asciiart.h"
35 #include "libkita/abone.h"
37 #include <qdragobject.h>
38 #include <qtextcodec.h>
41 #include <qmessagebox.h>
42 #include <qclipboard.h>
43 #include <qpushbutton.h>
46 #include <klineedit.h>
49 #include <kiconloader.h>
51 #include <kstatusbar.h>
52 #include <kkeydialog.h>
54 #include <kio/netaccess.h>
55 #include <kuserprofile.h>
56 #include <kfiledialog.h>
60 #include <kstandarddirs.h>
62 #include <ksimpleconfig.h>
63 #include <kedittoolbar.h>
64 #include <kstdaccel.h>
66 #include <kstdaction.h>
67 #include <kshortcut.h>
68 #include <kaboutdata.h>
69 #include <kparts/partmanager.h>
70 #include <kdeversion.h>
73 KitaMainWindow::KitaMainWindow()
74 : KDockMainWindow( 0, "Kita" )
77 KGlobal::locale() ->insertCatalogue( "kitapart" );
80 setAcceptDrops( TRUE );
85 // then, setup our actions
95 Kita::AsciiArtConfig::self()->readConfig();
96 if ( Kita::AsciiArtConfig::self()->asciiArtList().empty() ) {
101 Kita::AboneConfig::self()->readConfig();
102 if ( Kita::AboneConfig::self()->aboneIDList().empty() ) {
106 if ( Kita::AboneConfig::self()->aboneNameList().empty() ) {
110 if ( Kita::AboneConfig::self()->aboneWordList().empty() ) {
115 statusBar() ->show();
118 m_writeDock->loadSession();
119 QString dockConfigPath = locateLocal( "appdata", "dock.conf" );
120 KConfig dockConfig( dockConfigPath );
121 readDockConfig( &dockConfig );
124 makeDockInvisible( m_writeDock );
128 KitaConfig::readConfig( KGlobal::config() );
130 Kita::Config::self()->readConfig();
132 // apply the saved mainwindow settings, if any, and ask the mainwindow
133 // to automatically save settings if changed: window size, toolbar
134 // position, icon size, etc.
135 setAutoSaveSettings();
138 setFont( Kita::Config::font() );
140 // allow the view to change the statusbar and caption
141 Kita::SignalCollection* signalCollection = Kita::SignalCollection::getInstance();
143 connect( m_urlLine, SIGNAL( returnPressed() ),
144 SLOT( slotURLLine() ) );
146 QPopupMenu* settingsPopup = static_cast<QPopupMenu *>( factory() ->container( "settings", this ) );
147 connect( settingsPopup, SIGNAL( aboutToShow() ),
148 SLOT( settingsMenuAboutToShow() ) );
150 // load favorite boards;
151 loadFavoriteBoards();
155 QString configPath = locateLocal( "appdata", "board_list" );
156 if ( QFile::exists( configPath ) ) {
157 m_bbsTab->showBoardList();
158 m_bbsTab->loadOpened();
160 m_bbsTab->updateBoardList();
167 // update favorite list
168 ViewMediator::getInstance()->updateFavoriteListView();
170 if ( Kita::Config::autoLogin() ) {
175 KitaMainWindow::~KitaMainWindow()
177 m_writeDock->saveSession();
179 Kita::AboneConfig::self()->writeConfig();
183 Kita::AsciiArtConfig::self()->writeConfig();
185 saveFavoriteBoards();
191 saveMainWindowSettings( KGlobal::config(), "MainWindow" );
193 KitaConfig::writeConfig( KGlobal::config() );
194 Kita::Config::self()->writeConfig();
196 QString dockConfigPath = locateLocal( "appdata", "dock.conf" );
197 KConfig dockConfig( dockConfigPath );
198 writeDockConfig( &dockConfig );
202 Kita::DatManager::deleteAllDatInfo();
205 void KitaMainWindow::load( const KURL& url )
207 setCaption( url.url() );
210 void KitaMainWindow::bookmark( const QString& datURL, bool on )
212 FavoriteThreads * favorite = FavoriteThreads::getInstance();
215 favorite->insert( datURL );
217 favorite->remove( datURL );
220 ViewMediator::getInstance()->updateFavoriteListView();
223 void KitaMainWindow::login()
225 if ( Kita::Account::login( Kita::Config::userID(), Kita::Config::password() ) ) {
226 slotSetMainStatusbar( i18n( "Login succeeded." ) );
228 slotSetMainStatusbar( i18n( "Login failed." ) );
232 void KitaMainWindow::newToolbarConfig()
234 // this slot is called when user clicks "Ok" or "Apply" in the toolbar editor.
235 // recreate our GUI, and re-apply the settings (e.g. "text under icons", etc.)
236 applyMainWindowSettings( KGlobal::config(), "MainWindow" );
239 void KitaMainWindow::optionsShowToolbar()
241 // this is all very cut and paste code for showing/hiding the
243 if ( m_toolbarAction->isChecked() ) {
250 void KitaMainWindow::optionsShowStatusbar()
252 // this is all very cut and paste code for showing/hiding the
254 if ( m_statusbarAction->isChecked() ) {
255 statusBar() ->show();
257 statusBar() ->hide();
261 void KitaMainWindow::optionsConfigureKeys()
263 KKeyDialog dlg( TRUE, this );
264 dlg.insert( actionCollection(), "Kita" );
268 void KitaMainWindow::optionsConfigureToolbars()
270 // use the standard toolbar editor
271 KEditToolbar dlg( factory() );
272 connect( &dlg, SIGNAL( newToolbarConfig() ),
273 SLOT( newToolbarConfig() ) );
277 void KitaMainWindow::optionsPreferences()
279 // popup some sort of preference dialog, here
280 if ( KConfigDialog::showDialog( "Kita Preferences" ) ) {
284 KitaPreferences* dialog = new KitaPreferences( this );
286 connect( dialog, SIGNAL( fontChanged( const QFont& ) ),
287 SLOT( setFont( const QFont& ) ) );
292 void KitaMainWindow::settingsMenuAboutToShow()
294 m_toolbarAction->setChecked( toolBar() ->isVisible() );
295 m_statusbarAction->setChecked( statusBar() ->isVisible() );
298 void KitaMainWindow::setFont( const QFont& font )
300 m_boardTab->setFont( font );
301 m_bbsTab->setFont( font );
304 void KitaMainWindow::setUrl( const KURL& url )
306 m_urlLine->setText( url.url() );
309 void KitaMainWindow::slotCheckWriteToggleAction( bool check )
311 if ( m_showWriteDockAction ) m_showWriteDockAction->setChecked( check );
314 void KitaMainWindow::slotEditCopy()
316 QWidget * widget = kapp->focusWidget();
319 QKeyEvent e( QEvent::KeyPress, Key_C, 'C', ControlButton );
320 QApplication::sendEvent( widget, &e );
324 void KitaMainWindow::slotSetMainStatusbar( const QString& statusStr )
326 // display the text on the statusbar
327 statusBar() ->message( statusStr );
330 void KitaMainWindow::slotURLLine()
332 KURL url = m_urlLine->text();
333 KURL datURL = Kita::getDatURL( url );
334 m_threadTab->slotShowMainThread( datURL );
341 void KitaMainWindow::setupActions()
343 KStdAction::quit( this, SLOT( close() ), actionCollection() );
344 KStdAction::copy( this, SLOT( slotEditCopy() ), actionCollection() );
346 m_toolbarAction = KStdAction::showToolbar( this,
347 SLOT( optionsShowToolbar() ),
348 actionCollection() );
350 m_statusbarAction = KStdAction::showStatusbar( this,
351 SLOT( optionsShowStatusbar() ),
352 actionCollection() );
354 m_showWriteDockAction = new KToggleAction( i18n( "Show Write Dock" ),
357 SLOT( slotToggleShowHide() ),
359 "window_show_writedock" );
361 m_urlLine = new KLineEdit( "", 0 );
363 new KWidgetAction( m_urlLine,
367 SLOT( slotURLLine() ),
368 actionCollection(), "url_line_action" );
370 KStdAction::keyBindings( this, SLOT( optionsConfigureKeys() ), actionCollection() );
371 KStdAction::configureToolbars( this, SLOT( optionsConfigureToolbars() ), actionCollection() );
372 KStdAction::preferences( this, SLOT( optionsPreferences() ), actionCollection() );
374 new KAction( i18n( "Load board list" ),
377 SLOT( updateBoardList() ),
381 new KAction( i18n( "Login" ),
388 setXMLFile( "kitaui.rc" );
389 KMainWindow::createGUI();
390 factory() ->addClient( m_bbsTab );
391 factory() ->addClient( m_boardTab );
392 factory() ->addClient( m_threadTab );
393 factory() ->addClient( m_writeTab );
396 void KitaMainWindow::setupView()
398 ViewMediator::getInstance()->setMainWindow( this );
400 QWidget* mainWidget = new QWidget( this );
401 QBoxLayout* bl = new QVBoxLayout( mainWidget );
403 m_bbsTab = new KitaBBSTabWidget( mainWidget, "Board" );
404 bl->addWidget( m_bbsTab );
406 m_boardTab = new KitaBoardTabWidget( mainWidget, "Subject" );
407 bl->addWidget( m_boardTab );
408 ViewMediator::getInstance()->setBoardTabWidget( m_boardTab );
410 m_threadTab = new KitaThreadTabWidget( mainWidget, "Thread View" );
411 bl->addWidget( m_threadTab );
412 ViewMediator::getInstance()->setThreadTabWidget( m_threadTab );
414 setView( mainWidget );
417 m_writeDock = new KitaWriteDock( manager(), "Write", 0L, 0L, i18n( "Write" ), i18n( "Write" ) );
418 m_writeTab = new KitaWriteTabWidget( m_writeDock, "Write View" );
419 m_writeDock->setWidget( m_writeTab );
420 m_writeDock->setWriteTabWidget( m_writeTab );
421 ViewMediator::getInstance()->setWriteDock( m_writeDock );
422 ViewMediator::getInstance()->setWriteTabWidget( m_writeTab );
423 connect( m_writeDock, SIGNAL( checkToggleAction( bool ) ), SLOT( slotCheckWriteToggleAction( bool ) ) );
425 /* reset dock status */
426 m_showWriteDockAction = NULL;
429 void KitaMainWindow::loadCache()
431 KitaThreadInfo * cache = KitaThreadInfo::getInstance();
432 QString cacheConfigPath = locateLocal( "appdata", "cache" );
433 QFile file( cacheConfigPath );
434 if ( file.open( IO_ReadOnly ) ) {
435 QDataStream stream( &file );
440 void KitaMainWindow::saveCache()
442 KitaThreadInfo * cache = KitaThreadInfo::getInstance();
443 QString cacheConfigPath = locateLocal( "appdata", "cache" );
444 QFile file( cacheConfigPath );
445 if ( file.open( IO_WriteOnly ) ) {
446 QDataStream stream( &file );
451 void KitaMainWindow::loadFavorites()
453 QString favoritesConfigPath = locateLocal( "appdata", "favorites.xml" );
454 QFile file( favoritesConfigPath );
455 if ( file.open( IO_ReadOnly ) ) {
456 QTextStream stream( &file );
457 stream.setEncoding( QTextStream::UnicodeUTF8 );
459 QString xml = stream.read();
460 FavoriteThreads::readFromXML( xml );
464 void KitaMainWindow::saveFavorites()
466 QString favoritesConfigPath = locateLocal( "appdata", "favorites.xml" );
467 QFile file( favoritesConfigPath );
468 if ( file.open( IO_WriteOnly ) ) {
469 QTextStream stream( &file );
470 stream.setEncoding( QTextStream::UnicodeUTF8 );
471 stream << FavoriteThreads::getInstance() ->toXML();
475 void KitaMainWindow::loadFavoriteBoards()
477 QString configPath = locateLocal( "appdata", "favorite_boards.xml" );
478 QFile file( configPath );
479 if ( file.open( IO_ReadOnly ) ) {
480 QTextStream stream( &file );
481 stream.setEncoding( QTextStream::UnicodeUTF8 );
483 QString xml = stream.read();
484 Kita::FavoriteBoards::readFromXML( xml );
488 void KitaMainWindow::saveFavoriteBoards()
490 QString configPath = locateLocal( "appdata", "favorite_boards.xml" );
491 QFile file( configPath );
492 if ( file.open( IO_WriteOnly ) ) {
493 QTextStream stream( &file );
494 stream.setEncoding( QTextStream::UnicodeUTF8 );
495 stream << Kita::FavoriteBoards::toXML();
499 void KitaMainWindow::loadCompletion()
501 QString configPath = locateLocal( "appdata", "completion" );
502 KSimpleConfig config( configPath );
504 Kita::Config::setNameCompletionList( config.readListEntry( "name" ) );
507 void KitaMainWindow::loadStyleSheet()
509 QString configPath = locateLocal( "appdata", "stylesheet" );
510 QFile file( configPath );
511 if ( file.open( IO_ReadOnly ) ) {
512 QTextStream stream( &file );
513 stream.setEncoding( QTextStream::UnicodeUTF8 );
518 while ( ( str = stream.readLine() ) != QString::null ) {
519 if ( ! str.isEmpty() ) {
523 KitaConfig::setStyleSheetText( list.join( "\n" ) );
527 void KitaMainWindow::saveStyleSheet()
529 QString configPath = locateLocal( "appdata", "stylesheet" );
530 QFile file( configPath );
531 if ( file.open( IO_WriteOnly ) ) {
532 QTextStream stream( &file ) ;
533 stream.setEncoding( QTextStream::UnicodeUTF8 );
535 stream << KitaConfig::styleSheetText();
539 void KitaMainWindow::loadAsciiArt()
541 QString configPath = locateLocal( "appdata", "asciiart" );
542 QFile file( configPath );
543 if ( file.open( IO_ReadOnly ) ) {
544 QTextStream stream( &file );
545 stream.setEncoding( QTextStream::UnicodeUTF8 );
550 while ( ( str = stream.readLine() ) != QString::null ) {
551 if ( ! str.isEmpty() ) {
555 Kita::AsciiArtConfig::setAsciiArtList( list );
559 void KitaMainWindow::loadAboneIDList()
561 QString configPath = locateLocal( "appdata", "abone_id" );
562 QFile file( configPath );
563 if ( file.open( IO_ReadOnly ) ) {
564 QTextStream stream( &file );
565 stream.setEncoding( QTextStream::UnicodeUTF8 );
570 while ( ( str = stream.readLine() ) != QString::null ) {
571 if ( ! str.isEmpty() ) {
575 Kita::AboneConfig::setAboneIDList( list );
579 void KitaMainWindow::loadAboneNameList()
581 QString configPath = locateLocal( "appdata", "abone_name" );
582 QFile file( configPath );
583 if ( file.open( IO_ReadOnly ) ) {
584 QTextStream stream( &file );
585 stream.setEncoding( QTextStream::UnicodeUTF8 );
590 while ( ( str = stream.readLine() ) != QString::null ) {
591 if ( ! str.isEmpty() ) {
595 Kita::AboneConfig::setAboneNameList( list );
599 void KitaMainWindow::loadAboneWordList()
601 QString configPath = locateLocal( "appdata", "abone_word" );
602 QFile file( configPath );
603 if ( file.open( IO_ReadOnly ) ) {
604 QTextStream stream( &file );
605 stream.setEncoding( QTextStream::UnicodeUTF8 );
610 while ( ( str = stream.readLine() ) != QString::null ) {
611 if ( ! str.isEmpty() ) {
615 Kita::AboneConfig::setAboneWordList( list );
619 #include "mainwindow.moc"