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( signalCollection, SIGNAL( setMainCaption( const QString& ) ),
157 SLOT( slotSetMainCaption( const QString& ) ) );
159 connect( signalCollection, SIGNAL( bookmarked( const QString&, bool ) ),
160 SLOT( bookmark( const QString&, bool ) ) );
162 connect( this, SIGNAL( favoritesUpdated() ),
163 signalCollection, SIGNAL( favoritesUpdated() ) );
165 connect( m_urlLine, SIGNAL( returnPressed() ),
166 SLOT( slotURLLine() ) );
168 QPopupMenu* settingsPopup = static_cast<QPopupMenu *>( factory() ->container( "settings", this ) );
169 connect( settingsPopup, SIGNAL( aboutToShow() ),
170 SLOT( settingsMenuAboutToShow() ) );
172 // load favorite boards;
173 loadFavoriteBoards();
177 QString configPath = locateLocal( "appdata", "board_list" );
178 if ( QFile::exists( configPath ) ) {
179 m_bbsTab->showBoardList();
180 m_bbsTab->loadOpened();
182 m_bbsTab->updateBoardList();
190 m_bbsDock->slotShowDock();
192 // update favorite list
193 emit favoritesUpdated();
195 if ( Kita::Config::autoLogin() ) {
200 KitaMainWindow::~KitaMainWindow()
202 /* save dock status */
203 m_bbsDock->saveSession();
204 m_boardDock->saveSession();
205 m_threadDock->saveSession();
206 m_writeDock->saveSession();
208 Kita::AboneConfig::self()->writeConfig();
212 Kita::AsciiArtConfig::self()->writeConfig();
214 saveFavoriteBoards();
220 saveMainWindowSettings( KGlobal::config(), "MainWindow" );
222 KitaConfig::writeConfig( KGlobal::config() );
223 Kita::Config::self()->writeConfig();
225 QString dockConfigPath = locateLocal( "appdata", "dock.conf" );
226 KConfig dockConfig( dockConfigPath );
227 writeDockConfig( &dockConfig );
233 Kita::DatManager::deleteAllDatInfo();
236 void KitaMainWindow::load( const KURL& url )
238 setCaption( url.url() );
241 void KitaMainWindow::bookmark( const QString& datURL, bool on )
243 FavoriteThreads * favorite = FavoriteThreads::getInstance();
246 favorite->insert( datURL );
248 favorite->remove( datURL );
251 emit favoritesUpdated();
254 void KitaMainWindow::closeSubjectView()
256 m_subjectListAction->setChecked( FALSE );
259 void KitaMainWindow::login()
261 if ( Kita::Account::login( Kita::Config::userID(), Kita::Config::password() ) ) {
262 slotSetMainStatusbar( i18n( "Login succeeded." ) );
264 slotSetMainStatusbar( i18n( "Login failed." ) );
268 void KitaMainWindow::newToolbarConfig()
270 // this slot is called when user clicks "Ok" or "Apply" in the toolbar editor.
271 // recreate our GUI, and re-apply the settings (e.g. "text under icons", etc.)
272 applyMainWindowSettings( KGlobal::config(), "MainWindow" );
275 void KitaMainWindow::optionsShowToolbar()
277 // this is all very cut and paste code for showing/hiding the
279 if ( m_toolbarAction->isChecked() ) {
286 void KitaMainWindow::optionsShowStatusbar()
288 // this is all very cut and paste code for showing/hiding the
290 if ( m_statusbarAction->isChecked() ) {
291 statusBar() ->show();
293 statusBar() ->hide();
297 void KitaMainWindow::optionsConfigureKeys()
299 KKeyDialog dlg( TRUE, this );
300 dlg.insert( actionCollection(), "Kita" );
304 void KitaMainWindow::optionsConfigureToolbars()
306 // use the standard toolbar editor
307 KEditToolbar dlg( factory() );
308 connect( &dlg, SIGNAL( newToolbarConfig() ),
309 SLOT( newToolbarConfig() ) );
313 void KitaMainWindow::optionsPreferences()
315 // popup some sort of preference dialog, here
316 if ( KConfigDialog::showDialog( "Kita Preferences" ) ) {
320 KitaPreferences* dialog = new KitaPreferences( this );
322 connect( dialog, SIGNAL( fontChanged( const QFont& ) ),
323 SLOT( setFont( const QFont& ) ) );
328 void KitaMainWindow::settingsMenuAboutToShow()
330 m_toolbarAction->setChecked( toolBar() ->isVisible() );
331 m_statusbarAction->setChecked( statusBar() ->isVisible() );
334 void KitaMainWindow::setFont( const QFont& font )
336 m_boardTab->setFont( font );
337 m_bbsTab->setFont( font );
340 void KitaMainWindow::setUrl( const KURL& url )
342 m_urlLine->setText( url.url() );
345 void KitaMainWindow::windowToggleView()
347 //FIXME: m_boardDock->dockSite() & KDockWidget::DockCenter != 0 igai no toki ha dousuru?
348 kdDebug() << "Do toggle" << endl;
349 if ( !m_boardDock->isVisible()
350 || !m_boardDock->isActiveWindow() ) m_boardDock->slotShowDock();
352 m_threadDock->slotShowDock();
356 void KitaMainWindow::slotCheckBoardToggleAction( bool check )
358 if ( m_boardListAction ) m_boardListAction->setChecked( check );
361 void KitaMainWindow::slotCheckSubjectToggleAction( bool check )
363 if ( m_subjectListAction ) m_subjectListAction->setChecked( check );
366 void KitaMainWindow::slotCheckWriteToggleAction( bool check )
368 if ( m_showWriteDockAction ) m_showWriteDockAction->setChecked( check );
371 void KitaMainWindow::slotEditCopy()
373 QWidget * widget = kapp->focusWidget();
376 QKeyEvent e( QEvent::KeyPress, Key_C, 'C', ControlButton );
377 QApplication::sendEvent( widget, &e );
381 /* open url */ /* public slot */ /* obsolete */
382 void KitaMainWindow::slotOpenURLRequest( const KURL& url, const KParts::URLArgs& args )
384 slotOpenURLRequestExt( url );
389 If mimetype == "text/html", open url with web browser.
390 if mimetype == QString::null, use KIO::NetAccess::mimetype to decide mime type of url.
393 void KitaMainWindow::slotOpenURLRequestExt( const KURL& url, const QString mimetype )
395 // FIXME: support be.2ch.net
396 if ( url.host() == "be.2ch.net" && url.path().contains( "/test/p.php", true ) < 1 ) {
397 QMessageBox::warning( this,
399 i18n( "be.2ch.net is currently not supported." ) );
403 kdDebug() << QString( "Requested OpenURL: \"%1\"" ).arg( url.url() ) << endl;
405 /* open url with web browser, etc. */
406 if ( mimetype != QString::null ) {
407 KRun::runURL( url, mimetype );
411 /* open thread with new thread tab */
412 if ( Kita::DatManager::isThreadEnrolled( url ) ) {
413 m_threadDock->slotShowThread( url );
417 if ( mimetype == QString::null ) {
418 QString url_mimetype = KIO::NetAccess::mimetype( url , this );
419 kdDebug() << QString( "queried MIME type: \"%1\"" ).arg( url_mimetype ) << endl;
420 KRun::runURL( url, url_mimetype );
422 kdDebug() << QString( "queried MIME type: \"%1\"" ).arg( mimetype ) << endl;
423 KRun::runURL( url, mimetype );
427 void KitaMainWindow::slotSetMainCaption( const QString& captionStr )
429 setCaption( captionStr );
432 void KitaMainWindow::slotSetMainStatusbar( const QString& statusStr )
434 // display the text on the statusbar
435 statusBar() ->message( statusStr );
438 void KitaMainWindow::slotURLLine()
440 KURL url = m_urlLine->text();
441 KURL datURL = Kita::getDatURL( url );
442 m_threadDock->slotShowThread( datURL );
449 void KitaMainWindow::setupActions()
451 KStdAction::quit( this, SLOT( close() ), actionCollection() );
452 KStdAction::copy( this, SLOT( slotEditCopy() ), actionCollection() );
454 m_toolbarAction = KStdAction::showToolbar( this,
455 SLOT( optionsShowToolbar() ),
456 actionCollection() );
458 m_statusbarAction = KStdAction::showStatusbar( this,
459 SLOT( optionsShowStatusbar() ),
460 actionCollection() );
462 m_boardListAction = new KToggleAction( i18n( "Show board list" ),
465 SLOT( slotToggleShowHide() ),
467 "window_show_board_list" );
469 m_subjectListAction = new KToggleAction( i18n( "Show subject list" ),
472 SLOT( slotToggleShowHide() ),
474 "window_show_subject_list" );
476 m_showWriteDockAction = new KToggleAction( i18n( "Show Write Dock" ),
479 SLOT( slotToggleShowHide() ),
481 "window_show_writedock" );
483 m_urlLine = new KLineEdit( "", 0 );
485 new KWidgetAction( m_urlLine,
489 SLOT( slotURLLine() ),
490 actionCollection(), "url_line_action" );
492 KStdAction::keyBindings( this, SLOT( optionsConfigureKeys() ), actionCollection() );
493 KStdAction::configureToolbars( this, SLOT( optionsConfigureToolbars() ), actionCollection() );
494 KStdAction::preferences( this, SLOT( optionsPreferences() ), actionCollection() );
496 new KAction( i18n( "Load board list" ),
499 SLOT( updateBoardList() ),
503 m_toggleViewAction = new KAction(
504 i18n( "&Toggle subject view and thread view" ),
505 KShortcut( Qt::Key_F7 ),
507 SLOT( windowToggleView() ),
509 "window_toggle_view" );
511 new KAction( i18n( "Login" ),
518 setXMLFile( "kitaui.rc" );
519 KMainWindow::createGUI();
520 factory() ->addClient( m_bbsTab );
521 factory() ->addClient( m_boardTab );
522 factory() ->addClient( m_threadTab );
523 factory() ->addClient( m_writeTab );
526 void KitaMainWindow::setupView()
528 ViewMediator::getInstance()->setMainWindow( this );
530 /* dummy Main Dock Widget */
531 m_dummyDock = createDockWidget( "dummy", 0L, 0L, "dummy", "dummy" );
532 m_dummyDock->setDockSite( KDockWidget::DockFullSite );
533 m_dummyDock->setEnableDocking( KDockWidget::DockNone );
534 setView( m_dummyDock );
535 setMainDockWidget( m_dummyDock );
538 m_boardDock = new KitaBoardDock( manager(), "subject", 0L, 0L, i18n( "subject" ), i18n( "subject" ) );
539 m_boardTab = new KitaBoardTabWidget( this, "Subject" );
540 m_boardDock->setWidget( m_boardTab );
541 ViewMediator::getInstance()->setBoardTabWidget( m_boardTab );
542 connect( m_boardDock, SIGNAL( checkToggleAction( bool ) ), SLOT( slotCheckSubjectToggleAction( bool ) ) );
545 m_bbsDock = new KitaBBSDock( manager(), "board", 0L, 0L, i18n( "board" ), i18n( "board" ) );
546 m_bbsTab = m_bbsDock->setup();
547 connect( m_bbsDock, SIGNAL( checkToggleAction( bool ) ), SLOT( slotCheckBoardToggleAction( bool ) ) );
550 m_threadDock = new KitaThreadDock( manager(), "Thread", 0L, 0L, i18n( "Thread" ), i18n( "Thread" ) );
551 m_threadTab = m_threadDock->setupAsMainView();
552 ViewMediator::getInstance()->setThreadDock( m_threadDock );
553 ViewMediator::getInstance()->setThreadTabWidget( m_threadTab );
554 m_threadDock->setDockSite( KDockWidget::DockFullSite );
557 m_writeDock = new KitaWriteDock( manager(), "Write", 0L, 0L, i18n( "Write" ), i18n( "Write" ) );
558 m_writeTab = new KitaWriteTabWidget( m_writeDock, "Write View" );
559 m_writeDock->setWidget( m_writeTab );
560 m_writeDock->setWriteTabWidget( m_writeTab );
561 m_writeDock->setup();
562 ViewMediator::getInstance()->setWriteDock( m_writeDock );
563 connect( m_writeDock, SIGNAL( checkToggleAction( bool ) ), SLOT( slotCheckWriteToggleAction( bool ) ) );
565 /* reset dock status */
566 m_boardListAction = NULL;
567 m_subjectListAction = NULL;
568 m_showWriteDockAction = NULL;
571 void KitaMainWindow::loadCache()
573 KitaThreadInfo * cache = KitaThreadInfo::getInstance();
574 QString cacheConfigPath = locateLocal( "appdata", "cache" );
575 QFile file( cacheConfigPath );
576 if ( file.open( IO_ReadOnly ) ) {
577 QDataStream stream( &file );
582 void KitaMainWindow::saveCache()
584 KitaThreadInfo * cache = KitaThreadInfo::getInstance();
585 QString cacheConfigPath = locateLocal( "appdata", "cache" );
586 QFile file( cacheConfigPath );
587 if ( file.open( IO_WriteOnly ) ) {
588 QDataStream stream( &file );
593 void KitaMainWindow::loadFavorites()
595 QString favoritesConfigPath = locateLocal( "appdata", "favorites.xml" );
596 QFile file( favoritesConfigPath );
597 if ( file.open( IO_ReadOnly ) ) {
598 QTextStream stream( &file );
599 stream.setEncoding( QTextStream::UnicodeUTF8 );
601 QString xml = stream.read();
602 FavoriteThreads::readFromXML( xml );
606 void KitaMainWindow::saveFavorites()
608 QString favoritesConfigPath = locateLocal( "appdata", "favorites.xml" );
609 QFile file( favoritesConfigPath );
610 if ( file.open( IO_WriteOnly ) ) {
611 QTextStream stream( &file );
612 stream.setEncoding( QTextStream::UnicodeUTF8 );
613 stream << FavoriteThreads::getInstance() ->toXML();
617 void KitaMainWindow::loadFavoriteBoards()
619 QString configPath = locateLocal( "appdata", "favorite_boards.xml" );
620 QFile file( configPath );
621 if ( file.open( IO_ReadOnly ) ) {
622 QTextStream stream( &file );
623 stream.setEncoding( QTextStream::UnicodeUTF8 );
625 QString xml = stream.read();
626 Kita::FavoriteBoards::readFromXML( xml );
630 void KitaMainWindow::saveFavoriteBoards()
632 QString configPath = locateLocal( "appdata", "favorite_boards.xml" );
633 QFile file( configPath );
634 if ( file.open( IO_WriteOnly ) ) {
635 QTextStream stream( &file );
636 stream.setEncoding( QTextStream::UnicodeUTF8 );
637 stream << Kita::FavoriteBoards::toXML();
641 void KitaMainWindow::loadCompletion()
643 QString configPath = locateLocal( "appdata", "completion" );
644 KSimpleConfig config( configPath );
646 Kita::Config::setNameCompletionList( config.readListEntry( "name" ) );
649 void KitaMainWindow::loadStyleSheet()
651 QString configPath = locateLocal( "appdata", "stylesheet" );
652 QFile file( configPath );
653 if ( file.open( IO_ReadOnly ) ) {
654 QTextStream stream( &file );
655 stream.setEncoding( QTextStream::UnicodeUTF8 );
660 while ( ( str = stream.readLine() ) != QString::null ) {
661 if ( ! str.isEmpty() ) {
665 KitaConfig::setStyleSheetText( list.join( "\n" ) );
669 void KitaMainWindow::saveStyleSheet()
671 QString configPath = locateLocal( "appdata", "stylesheet" );
672 QFile file( configPath );
673 if ( file.open( IO_WriteOnly ) ) {
674 QTextStream stream( &file ) ;
675 stream.setEncoding( QTextStream::UnicodeUTF8 );
677 stream << KitaConfig::styleSheetText();
681 void KitaMainWindow::loadAsciiArt()
683 QString configPath = locateLocal( "appdata", "asciiart" );
684 QFile file( configPath );
685 if ( file.open( IO_ReadOnly ) ) {
686 QTextStream stream( &file );
687 stream.setEncoding( QTextStream::UnicodeUTF8 );
692 while ( ( str = stream.readLine() ) != QString::null ) {
693 if ( ! str.isEmpty() ) {
697 Kita::AsciiArtConfig::setAsciiArtList( list );
701 void KitaMainWindow::loadAboneIDList()
703 QString configPath = locateLocal( "appdata", "abone_id" );
704 QFile file( configPath );
705 if ( file.open( IO_ReadOnly ) ) {
706 QTextStream stream( &file );
707 stream.setEncoding( QTextStream::UnicodeUTF8 );
712 while ( ( str = stream.readLine() ) != QString::null ) {
713 if ( ! str.isEmpty() ) {
717 Kita::AboneConfig::setAboneIDList( list );
721 void KitaMainWindow::loadAboneNameList()
723 QString configPath = locateLocal( "appdata", "abone_name" );
724 QFile file( configPath );
725 if ( file.open( IO_ReadOnly ) ) {
726 QTextStream stream( &file );
727 stream.setEncoding( QTextStream::UnicodeUTF8 );
732 while ( ( str = stream.readLine() ) != QString::null ) {
733 if ( ! str.isEmpty() ) {
737 Kita::AboneConfig::setAboneNameList( list );
741 void KitaMainWindow::loadAboneWordList()
743 QString configPath = locateLocal( "appdata", "abone_word" );
744 QFile file( configPath );
745 if ( file.open( IO_ReadOnly ) ) {
746 QTextStream stream( &file );
747 stream.setEncoding( QTextStream::UnicodeUTF8 );
752 while ( ( str = stream.readLine() ) != QString::null ) {
753 if ( ! str.isEmpty() ) {
757 Kita::AboneConfig::setAboneWordList( list );
761 #include "mainwindow.moc"