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>
44 #include <klineedit.h>
47 #include <kiconloader.h>
49 #include <kstatusbar.h>
50 #include <kkeydialog.h>
52 #include <kio/netaccess.h>
53 #include <kuserprofile.h>
54 #include <kfiledialog.h>
58 #include <kstandarddirs.h>
60 #include <ksimpleconfig.h>
61 #include <kedittoolbar.h>
62 #include <kstdaccel.h>
64 #include <kstdaction.h>
65 #include <kshortcut.h>
66 #include <kaboutdata.h>
67 #include <kparts/partmanager.h>
68 #include <kdeversion.h>
71 KitaMainWindow::KitaMainWindow()
72 : KDockMainWindow( 0, "Kita" )
75 KGlobal::locale() ->insertCatalogue( "kitapart" );
78 setAcceptDrops( true );
83 // then, setup our actions
93 Kita::AsciiArtConfig::self()->readConfig();
94 if ( Kita::AsciiArtConfig::self()->asciiArtList().empty() ) {
99 Kita::AboneConfig::self()->readConfig();
100 if ( Kita::AboneConfig::self()->aboneIDList().empty() ) {
104 if ( Kita::AboneConfig::self()->aboneNameList().empty() ) {
108 if ( Kita::AboneConfig::self()->aboneWordList().empty() ) {
113 statusBar() ->show();
116 m_bbsDock->loadSession();
117 m_boardDock->loadSession();
118 m_threadDock->loadSession();
119 m_writeDock->loadSession();
120 QString dockConfigPath = locateLocal( "appdata", "dock.conf" );
121 KConfig dockConfig( dockConfigPath );
122 readDockConfig( &dockConfig );
125 m_boardDock->slotShowDock();
128 m_threadDock->slotShowDock();
131 makeDockInvisible( m_writeDock );
135 KitaConfig::readConfig( KGlobal::config() );
137 Kita::Config::self()->readConfig();
139 // apply the saved mainwindow settings, if any, and ask the mainwindow
140 // to automatically save settings if changed: window size, toolbar
141 // position, icon size, etc.
142 setAutoSaveSettings();
145 setFont( Kita::Config::font() );
147 // allow the view to change the statusbar and caption
148 Kita::SignalCollection* signalCollection = Kita::SignalCollection::getInstance();
150 connect( signalCollection, SIGNAL( openURLRequest( const KURL&, const KParts::URLArgs& ) ),
151 SLOT( slotOpenURLRequest( const KURL&, const KParts::URLArgs& ) ) );
153 connect( signalCollection, SIGNAL( openURLRequestExt( const KURL&, const QString ) ),
154 SLOT( slotOpenURLRequestExt( const KURL&, const QString ) ) );
156 connect( this, SIGNAL( favoritesUpdated() ),
157 signalCollection, SIGNAL( favoritesUpdated() ) );
159 connect( m_urlLine, SIGNAL( returnPressed() ),
160 SLOT( slotURLLine() ) );
162 QPopupMenu* settingsPopup = static_cast<QPopupMenu *>( factory() ->container( "settings", this ) );
163 connect( settingsPopup, SIGNAL( aboutToShow() ),
164 SLOT( settingsMenuAboutToShow() ) );
166 // load favorite boards;
167 loadFavoriteBoards();
171 QString configPath = locateLocal( "appdata", "board_list" );
172 if ( QFile::exists( configPath ) ) {
173 m_bbsTab->showBoardList();
174 m_bbsTab->loadOpened();
176 m_bbsTab->updateBoardList();
184 m_bbsDock->slotShowDock();
186 // update favorite list
187 emit favoritesUpdated();
189 if ( Kita::Config::autoLogin() ) {
194 KitaMainWindow::~KitaMainWindow()
196 /* save dock status */
197 m_bbsDock->saveSession();
198 m_boardDock->saveSession();
199 m_threadDock->saveSession();
200 m_writeDock->saveSession();
202 Kita::AboneConfig::self()->writeConfig();
206 Kita::AsciiArtConfig::self()->writeConfig();
208 saveFavoriteBoards();
214 saveMainWindowSettings( KGlobal::config(), "MainWindow" );
216 KitaConfig::writeConfig( KGlobal::config() );
217 Kita::Config::self()->writeConfig();
219 QString dockConfigPath = locateLocal( "appdata", "dock.conf" );
220 KConfig dockConfig( dockConfigPath );
221 writeDockConfig( &dockConfig );
227 Kita::DatManager::deleteAllDatInfo();
230 void KitaMainWindow::load( const KURL& url )
232 setCaption( url.url() );
235 void KitaMainWindow::bookmark( const QString& datURL, bool on )
237 FavoriteThreads * favorite = FavoriteThreads::getInstance();
240 favorite->insert( datURL );
242 favorite->remove( datURL );
245 emit favoritesUpdated();
248 void KitaMainWindow::closeSubjectView()
250 m_subjectListAction->setChecked( FALSE );
253 void KitaMainWindow::login()
255 if ( Kita::Account::login( Kita::Config::userID(), Kita::Config::password() ) ) {
256 slotSetMainStatusbar( i18n( "Login succeeded." ) );
258 slotSetMainStatusbar( i18n( "Login failed." ) );
262 void KitaMainWindow::newToolbarConfig()
264 // this slot is called when user clicks "Ok" or "Apply" in the toolbar editor.
265 // recreate our GUI, and re-apply the settings (e.g. "text under icons", etc.)
266 applyMainWindowSettings( KGlobal::config(), "MainWindow" );
269 void KitaMainWindow::optionsShowToolbar()
271 // this is all very cut and paste code for showing/hiding the
273 if ( m_toolbarAction->isChecked() ) {
280 void KitaMainWindow::optionsShowStatusbar()
282 // this is all very cut and paste code for showing/hiding the
284 if ( m_statusbarAction->isChecked() ) {
285 statusBar() ->show();
287 statusBar() ->hide();
291 void KitaMainWindow::optionsConfigureKeys()
293 KKeyDialog dlg( TRUE, this );
294 dlg.insert( actionCollection(), "Kita" );
298 void KitaMainWindow::optionsConfigureToolbars()
300 // use the standard toolbar editor
301 KEditToolbar dlg( factory() );
302 connect( &dlg, SIGNAL( newToolbarConfig() ),
303 SLOT( newToolbarConfig() ) );
307 void KitaMainWindow::optionsPreferences()
309 // popup some sort of preference dialog, here
310 if ( KConfigDialog::showDialog( "Kita Preferences" ) ) {
314 KitaPreferences* dialog = new KitaPreferences( this );
316 connect( dialog, SIGNAL( fontChanged( const QFont& ) ),
317 SLOT( setFont( const QFont& ) ) );
322 void KitaMainWindow::settingsMenuAboutToShow()
324 m_toolbarAction->setChecked( toolBar() ->isVisible() );
325 m_statusbarAction->setChecked( statusBar() ->isVisible() );
328 void KitaMainWindow::setFont( const QFont& font )
330 m_boardTab->setFont( font );
331 m_bbsTab->setFont( font );
334 void KitaMainWindow::setUrl( const KURL& url )
336 m_urlLine->setText( url.url() );
339 void KitaMainWindow::windowToggleView()
341 //FIXME: m_boardDock->dockSite() & KDockWidget::DockCenter != 0 igai no toki ha dousuru?
342 kdDebug() << "Do toggle" << endl;
343 if ( !m_boardDock->isVisible()
344 || !m_boardDock->isActiveWindow() ) m_boardDock->slotShowDock();
346 m_threadDock->slotShowDock();
350 void KitaMainWindow::slotCheckBoardToggleAction( bool check )
352 if ( m_boardListAction ) m_boardListAction->setChecked( check );
355 void KitaMainWindow::slotCheckSubjectToggleAction( bool check )
357 if ( m_subjectListAction ) m_subjectListAction->setChecked( check );
360 void KitaMainWindow::slotCheckWriteToggleAction( bool check )
362 if ( m_showWriteDockAction ) m_showWriteDockAction->setChecked( check );
365 void KitaMainWindow::slotEditCopy()
367 QWidget * widget = kapp->focusWidget();
370 QKeyEvent e( QEvent::KeyPress, Key_C, 'C', ControlButton );
371 QApplication::sendEvent( widget, &e );
375 /* open url */ /* public slot */ /* obsolete */
376 void KitaMainWindow::slotOpenURLRequest( const KURL& url, const KParts::URLArgs& args )
378 slotOpenURLRequestExt( url );
383 If mimetype == "text/html", open url with web browser.
384 if mimetype == QString::null, use KIO::NetAccess::mimetype to decide mime type of url.
387 void KitaMainWindow::slotOpenURLRequestExt( const KURL& url, const QString mimetype )
389 // FIXME: support be.2ch.net
390 if ( url.host() == "be.2ch.net" && url.path().contains( "/test/p.php", true ) < 1 ) {
391 QMessageBox::warning( this,
393 i18n( "be.2ch.net is currently not supported." ) );
397 kdDebug() << QString( "Requested OpenURL: \"%1\"" ).arg( url.url() ) << endl;
399 /* open url with web browser, etc. */
400 if ( mimetype != QString::null ) {
401 KRun::runURL( url, mimetype );
405 /* open thread with new thread tab */
406 if ( Kita::DatManager::isThreadEnrolled( url ) ) {
407 m_threadDock->slotShowThread( url );
411 if ( mimetype == QString::null ) {
412 QString url_mimetype = KIO::NetAccess::mimetype( url , this );
413 kdDebug() << QString( "queried MIME type: \"%1\"" ).arg( url_mimetype ) << endl;
414 KRun::runURL( url, url_mimetype );
416 kdDebug() << QString( "queried MIME type: \"%1\"" ).arg( mimetype ) << endl;
417 KRun::runURL( url, mimetype );
421 void KitaMainWindow::slotSetMainStatusbar( const QString& statusStr )
423 // display the text on the statusbar
424 statusBar() ->message( statusStr );
427 void KitaMainWindow::slotURLLine()
429 KURL url = m_urlLine->text();
430 KURL datURL = Kita::getDatURL( url );
431 m_threadDock->slotShowThread( datURL );
438 void KitaMainWindow::setupActions()
440 KStdAction::quit( this, SLOT( close() ), actionCollection() );
441 KStdAction::copy( this, SLOT( slotEditCopy() ), actionCollection() );
443 m_toolbarAction = KStdAction::showToolbar( this,
444 SLOT( optionsShowToolbar() ),
445 actionCollection() );
447 m_statusbarAction = KStdAction::showStatusbar( this,
448 SLOT( optionsShowStatusbar() ),
449 actionCollection() );
451 m_boardListAction = new KToggleAction( i18n( "Show board list" ),
454 SLOT( slotToggleShowHide() ),
456 "window_show_board_list" );
458 m_subjectListAction = new KToggleAction( i18n( "Show subject list" ),
461 SLOT( slotToggleShowHide() ),
463 "window_show_subject_list" );
465 m_showWriteDockAction = new KToggleAction( i18n( "Show Write Dock" ),
468 SLOT( slotToggleShowHide() ),
470 "window_show_writedock" );
472 m_urlLine = new KLineEdit( "", 0 );
474 new KWidgetAction( m_urlLine,
478 SLOT( slotURLLine() ),
479 actionCollection(), "url_line_action" );
481 KStdAction::keyBindings( this, SLOT( optionsConfigureKeys() ), actionCollection() );
482 KStdAction::configureToolbars( this, SLOT( optionsConfigureToolbars() ), actionCollection() );
483 KStdAction::preferences( this, SLOT( optionsPreferences() ), actionCollection() );
485 new KAction( i18n( "Load board list" ),
488 SLOT( updateBoardList() ),
492 m_toggleViewAction = new KAction(
493 i18n( "&Toggle subject view and thread view" ),
494 KShortcut( Qt::Key_F7 ),
496 SLOT( windowToggleView() ),
498 "window_toggle_view" );
500 new KAction( i18n( "Login" ),
507 setXMLFile( "kitaui.rc" );
508 KMainWindow::createGUI();
509 factory() ->addClient( m_bbsTab );
510 factory() ->addClient( m_boardTab );
511 factory() ->addClient( m_threadTab );
512 factory() ->addClient( m_writeTab );
515 void KitaMainWindow::setupView()
517 ViewMediator::getInstance()->setMainWindow( this );
519 /* dummy Main Dock Widget */
520 m_dummyDock = createDockWidget( "dummy", 0L, 0L, "dummy", "dummy" );
521 m_dummyDock->setDockSite( KDockWidget::DockFullSite );
522 m_dummyDock->setEnableDocking( KDockWidget::DockNone );
523 setView( m_dummyDock );
524 setMainDockWidget( m_dummyDock );
527 m_boardDock = new KitaBoardDock( manager(), "subject", 0L, 0L, i18n( "subject" ), i18n( "subject" ) );
528 m_boardTab = new KitaBoardTabWidget( this, "Subject" );
529 m_boardDock->setWidget( m_boardTab );
530 ViewMediator::getInstance()->setBoardDockWidget( m_boardDock );
531 ViewMediator::getInstance()->setBoardTabWidget( m_boardTab );
532 connect( m_boardDock, SIGNAL( checkToggleAction( bool ) ), SLOT( slotCheckSubjectToggleAction( bool ) ) );
535 m_bbsDock = new KitaBBSDock( manager(), "board", 0L, 0L, i18n( "board" ), i18n( "board" ) );
536 m_bbsTab = m_bbsDock->setup();
537 ViewMediator::getInstance()->setBBSDock( m_bbsDock );
538 connect( m_bbsDock, SIGNAL( checkToggleAction( bool ) ), SLOT( slotCheckBoardToggleAction( bool ) ) );
541 m_threadDock = new KitaThreadDock( manager(), "Thread", 0L, 0L, i18n( "Thread" ), i18n( "Thread" ) );
542 m_threadTab = m_threadDock->setupAsMainView();
543 ViewMediator::getInstance()->setThreadDock( m_threadDock );
544 ViewMediator::getInstance()->setThreadTabWidget( m_threadTab );
545 m_threadDock->setDockSite( KDockWidget::DockFullSite );
548 m_writeDock = new KitaWriteDock( manager(), "Write", 0L, 0L, i18n( "Write" ), i18n( "Write" ) );
549 m_writeTab = new KitaWriteTabWidget( m_writeDock, "Write View" );
550 m_writeDock->setWidget( m_writeTab );
551 m_writeDock->setWriteTabWidget( m_writeTab );
552 m_writeDock->setup();
553 ViewMediator::getInstance()->setWriteDock( m_writeDock );
554 connect( m_writeDock, SIGNAL( checkToggleAction( bool ) ), SLOT( slotCheckWriteToggleAction( bool ) ) );
556 /* reset dock status */
557 m_boardListAction = NULL;
558 m_subjectListAction = NULL;
559 m_showWriteDockAction = NULL;
562 void KitaMainWindow::loadCache()
564 KitaThreadInfo * cache = KitaThreadInfo::getInstance();
565 QString cacheConfigPath = locateLocal( "appdata", "cache" );
566 QFile file( cacheConfigPath );
567 if ( file.open( IO_ReadOnly ) ) {
568 QDataStream stream( &file );
573 void KitaMainWindow::saveCache()
575 KitaThreadInfo * cache = KitaThreadInfo::getInstance();
576 QString cacheConfigPath = locateLocal( "appdata", "cache" );
577 QFile file( cacheConfigPath );
578 if ( file.open( IO_WriteOnly ) ) {
579 QDataStream stream( &file );
584 void KitaMainWindow::loadFavorites()
586 QString favoritesConfigPath = locateLocal( "appdata", "favorites.xml" );
587 QFile file( favoritesConfigPath );
588 if ( file.open( IO_ReadOnly ) ) {
589 QTextStream stream( &file );
590 stream.setEncoding( QTextStream::UnicodeUTF8 );
592 QString xml = stream.read();
593 FavoriteThreads::readFromXML( xml );
597 void KitaMainWindow::saveFavorites()
599 QString favoritesConfigPath = locateLocal( "appdata", "favorites.xml" );
600 QFile file( favoritesConfigPath );
601 if ( file.open( IO_WriteOnly ) ) {
602 QTextStream stream( &file );
603 stream.setEncoding( QTextStream::UnicodeUTF8 );
604 stream << FavoriteThreads::getInstance() ->toXML();
608 void KitaMainWindow::loadFavoriteBoards()
610 QString configPath = locateLocal( "appdata", "favorite_boards.xml" );
611 QFile file( configPath );
612 if ( file.open( IO_ReadOnly ) ) {
613 QTextStream stream( &file );
614 stream.setEncoding( QTextStream::UnicodeUTF8 );
616 QString xml = stream.read();
617 Kita::FavoriteBoards::readFromXML( xml );
621 void KitaMainWindow::saveFavoriteBoards()
623 QString configPath = locateLocal( "appdata", "favorite_boards.xml" );
624 QFile file( configPath );
625 if ( file.open( IO_WriteOnly ) ) {
626 QTextStream stream( &file );
627 stream.setEncoding( QTextStream::UnicodeUTF8 );
628 stream << Kita::FavoriteBoards::toXML();
632 void KitaMainWindow::loadCompletion()
634 QString configPath = locateLocal( "appdata", "completion" );
635 KSimpleConfig config( configPath );
637 Kita::Config::setNameCompletionList( config.readListEntry( "name" ) );
640 void KitaMainWindow::loadStyleSheet()
642 QString configPath = locateLocal( "appdata", "stylesheet" );
643 QFile file( configPath );
644 if ( file.open( IO_ReadOnly ) ) {
645 QTextStream stream( &file );
646 stream.setEncoding( QTextStream::UnicodeUTF8 );
651 while ( ( str = stream.readLine() ) != QString::null ) {
652 if ( ! str.isEmpty() ) {
656 KitaConfig::setStyleSheetText( list.join( "\n" ) );
660 void KitaMainWindow::saveStyleSheet()
662 QString configPath = locateLocal( "appdata", "stylesheet" );
663 QFile file( configPath );
664 if ( file.open( IO_WriteOnly ) ) {
665 QTextStream stream( &file ) ;
666 stream.setEncoding( QTextStream::UnicodeUTF8 );
668 stream << KitaConfig::styleSheetText();
672 void KitaMainWindow::loadAsciiArt()
674 QString configPath = locateLocal( "appdata", "asciiart" );
675 QFile file( configPath );
676 if ( file.open( IO_ReadOnly ) ) {
677 QTextStream stream( &file );
678 stream.setEncoding( QTextStream::UnicodeUTF8 );
683 while ( ( str = stream.readLine() ) != QString::null ) {
684 if ( ! str.isEmpty() ) {
688 Kita::AsciiArtConfig::setAsciiArtList( list );
692 void KitaMainWindow::loadAboneIDList()
694 QString configPath = locateLocal( "appdata", "abone_id" );
695 QFile file( configPath );
696 if ( file.open( IO_ReadOnly ) ) {
697 QTextStream stream( &file );
698 stream.setEncoding( QTextStream::UnicodeUTF8 );
703 while ( ( str = stream.readLine() ) != QString::null ) {
704 if ( ! str.isEmpty() ) {
708 Kita::AboneConfig::setAboneIDList( list );
712 void KitaMainWindow::loadAboneNameList()
714 QString configPath = locateLocal( "appdata", "abone_name" );
715 QFile file( configPath );
716 if ( file.open( IO_ReadOnly ) ) {
717 QTextStream stream( &file );
718 stream.setEncoding( QTextStream::UnicodeUTF8 );
723 while ( ( str = stream.readLine() ) != QString::null ) {
724 if ( ! str.isEmpty() ) {
728 Kita::AboneConfig::setAboneNameList( list );
732 void KitaMainWindow::loadAboneWordList()
734 QString configPath = locateLocal( "appdata", "abone_word" );
735 QFile file( configPath );
736 if ( file.open( IO_ReadOnly ) ) {
737 QTextStream stream( &file );
738 stream.setEncoding( QTextStream::UnicodeUTF8 );
743 while ( ( str = stream.readLine() ) != QString::null ) {
744 if ( ! str.isEmpty() ) {
748 Kita::AboneConfig::setAboneWordList( list );
752 #include "mainwindow.moc"