OSDN Git Service

711f31b4363a61969bada4684b7459aa967947a8
[kita/kita.git] / kita / src / mainwindow.cpp
1 /***************************************************************************
2 *   Copyright (C) 2004 by Kita Developers                                 *
3 *   ikemo@users.sourceforge.jp                                            *
4 *                                                                         *
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 ***************************************************************************/
10
11 #include "mainwindow.h"
12
13 #include "prefs/prefs.h"
14
15 #include "threadview.h"
16 #include "threadtabwidget.h"
17 #include "boardview.h"
18 #include "boardtabwidget.h"
19 #include "bbsview.h"
20 #include "bbstabwidget.h"
21 #include "writetabwidget.h"
22 #include "viewmediator.h"
23
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"
36
37 #include <qdragobject.h>
38 #include <qtextcodec.h>
39 #include <qevent.h>
40 #include <qregexp.h>
41 #include <qmessagebox.h>
42 #include <qclipboard.h>
43 #include <qpushbutton.h>
44 #include <qlayout.h>
45
46 #include <klineedit.h>
47 #include <kglobal.h>
48 #include <klocale.h>
49 #include <kiconloader.h>
50 #include <kmenubar.h>
51 #include <kstatusbar.h>
52 #include <kkeydialog.h>
53 #include <kaccel.h>
54 #include <kio/netaccess.h>
55 #include <kuserprofile.h>
56 #include <kfiledialog.h>
57 #include <kconfig.h>
58 #include <kurl.h>
59 #include <krun.h>
60 #include <kstandarddirs.h>
61 #include <kdebug.h>
62 #include <ksimpleconfig.h>
63 #include <kedittoolbar.h>
64 #include <kstdaccel.h>
65 #include <kaction.h>
66 #include <kstdaction.h>
67 #include <kshortcut.h>
68 #include <kaboutdata.h>
69 #include <kparts/partmanager.h>
70 #include <kdeversion.h>
71 #include <kglobal.h>
72
73 KitaMainWindow::KitaMainWindow()
74         : KDockMainWindow( 0, "Kita" )
75 {
76     // FIXME: merge *.po
77     KGlobal::locale() ->insertCatalogue( "kitapart" );
78
79     // accept dnd
80     setAcceptDrops( TRUE );
81
82     // setup view, dock
83     setupView();
84
85     // then, setup our actions
86     setupActions();
87
88     // load cache
89     loadCache();
90
91     // load style sheet
92     loadStyleSheet();
93
94     // load ascii art
95     Kita::AsciiArtConfig::self()->readConfig();
96     if ( Kita::AsciiArtConfig::self()->asciiArtList().empty() ) {
97         loadAsciiArt();
98     }
99
100     // load abone lists
101     Kita::AboneConfig::self()->readConfig();
102     if ( Kita::AboneConfig::self()->aboneIDList().empty() ) {
103         loadAboneIDList();
104     }
105
106     if ( Kita::AboneConfig::self()->aboneNameList().empty() ) {
107         loadAboneNameList();
108     }
109
110     if ( Kita::AboneConfig::self()->aboneWordList().empty() ) {
111         loadAboneWordList();
112     }
113
114     // and a status bar
115     statusBar() ->show();
116
117     // read dock status
118     m_writeDock->loadSession();
119     QString dockConfigPath = locateLocal( "appdata", "dock.conf" );
120     KConfig dockConfig( dockConfigPath );
121     readDockConfig( &dockConfig );
122
123     // hide writedock
124     makeDockInvisible( m_writeDock );
125
126     // for compativility
127     loadCompletion();
128     KitaConfig::readConfig( KGlobal::config() );
129
130     Kita::Config::self()->readConfig();
131
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();
136
137     // set list font
138     setFont( Kita::Config::font() );
139
140     // allow the view to change the statusbar and caption
141     Kita::SignalCollection* signalCollection = Kita::SignalCollection::getInstance();
142
143     connect( m_urlLine, SIGNAL( returnPressed() ),
144              SLOT( slotURLLine() ) );
145
146     QPopupMenu* settingsPopup = static_cast<QPopupMenu *>( factory() ->container( "settings", this ) );
147     connect( settingsPopup, SIGNAL( aboutToShow() ),
148              SLOT( settingsMenuAboutToShow() ) );
149
150     // load favorite boards;
151     loadFavoriteBoards();
152
153     // load boad list
154     {
155         QString configPath = locateLocal( "appdata", "board_list" );
156         if ( QFile::exists( configPath ) ) {
157             m_bbsTab->showBoardList();
158             m_bbsTab->loadOpened();
159         } else {
160             m_bbsTab->updateBoardList();
161         }
162     }
163
164     // load favorites
165     loadFavorites();
166
167     // update favorite list
168     ViewMediator::getInstance()->updateFavoriteListView();
169
170     if ( Kita::Config::autoLogin() ) {
171         login();
172     }
173 }
174
175 KitaMainWindow::~KitaMainWindow()
176 {
177     m_writeDock->saveSession();
178
179     Kita::AboneConfig::self()->writeConfig();
180
181     saveStyleSheet();
182
183     Kita::AsciiArtConfig::self()->writeConfig();
184
185     saveFavoriteBoards();
186
187     saveFavorites();
188
189     saveCache();
190
191     saveMainWindowSettings( KGlobal::config(), "MainWindow" );
192
193     KitaConfig::writeConfig( KGlobal::config() );
194     Kita::Config::self()->writeConfig();
195
196     QString dockConfigPath = locateLocal( "appdata", "dock.conf" );
197     KConfig dockConfig( dockConfigPath );
198     writeDockConfig( &dockConfig );
199
200     delete m_writeDock;
201
202     Kita::DatManager::deleteAllDatInfo();
203 }
204
205 void KitaMainWindow::load( const KURL& url )
206 {
207     setCaption( url.url() );
208 }
209
210 void KitaMainWindow::bookmark( const QString& datURL, bool on )
211 {
212     FavoriteThreads * favorite = FavoriteThreads::getInstance();
213
214     if ( on ) {
215         favorite->insert( datURL );
216     } else {
217         favorite->remove( datURL );
218     }
219     saveFavorites();
220     ViewMediator::getInstance()->updateFavoriteListView();
221 }
222
223 void KitaMainWindow::login()
224 {
225     if ( Kita::Account::login( Kita::Config::userID(), Kita::Config::password() ) ) {
226         slotSetMainStatusbar( i18n( "Login succeeded." ) );
227     } else {
228         slotSetMainStatusbar( i18n( "Login failed." ) );
229     }
230 }
231
232 void KitaMainWindow::newToolbarConfig()
233 {
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" );
237 }
238
239 void KitaMainWindow::optionsShowToolbar()
240 {
241     // this is all very cut and paste code for showing/hiding the
242     // toolbar
243     if ( m_toolbarAction->isChecked() ) {
244         toolBar() ->show();
245     } else {
246         toolBar() ->hide();
247     }
248 }
249
250 void KitaMainWindow::optionsShowStatusbar()
251 {
252     // this is all very cut and paste code for showing/hiding the
253     // statusbar
254     if ( m_statusbarAction->isChecked() ) {
255         statusBar() ->show();
256     } else {
257         statusBar() ->hide();
258     }
259 }
260
261 void KitaMainWindow::optionsConfigureKeys()
262 {
263     KKeyDialog dlg( TRUE, this );
264     dlg.insert( actionCollection(), "Kita" );
265     dlg.configure();
266 }
267
268 void KitaMainWindow::optionsConfigureToolbars()
269 {
270     // use the standard toolbar editor
271     KEditToolbar dlg( factory() );
272     connect( &dlg, SIGNAL( newToolbarConfig() ),
273              SLOT( newToolbarConfig() ) );
274     dlg.exec();
275 }
276
277 void KitaMainWindow::optionsPreferences()
278 {
279     // popup some sort of preference dialog, here
280     if ( KConfigDialog::showDialog( "Kita Preferences" ) ) {
281         return;
282     }
283
284     KitaPreferences* dialog = new KitaPreferences( this );
285
286     connect( dialog, SIGNAL( fontChanged( const QFont& ) ),
287              SLOT( setFont( const QFont& ) ) );
288
289     dialog->show();
290 }
291
292 void KitaMainWindow::settingsMenuAboutToShow()
293 {
294     m_toolbarAction->setChecked( toolBar() ->isVisible() );
295     m_statusbarAction->setChecked( statusBar() ->isVisible() );
296 }
297
298 void KitaMainWindow::setFont( const QFont& font )
299 {
300     m_boardTab->setFont( font );
301     m_bbsTab->setFont( font );
302 }
303
304 void KitaMainWindow::setUrl( const KURL& url )
305 {
306     m_urlLine->setText( url.url() );
307 }
308
309 void KitaMainWindow::slotCheckWriteToggleAction( bool check )
310 {
311     if ( m_showWriteDockAction ) m_showWriteDockAction->setChecked( check );
312 }
313
314 void KitaMainWindow::slotEditCopy()
315 {
316     QWidget * widget = kapp->focusWidget();
317
318     if ( widget ) {
319         QKeyEvent e( QEvent::KeyPress, Key_C, 'C', ControlButton );
320         QApplication::sendEvent( widget, &e );
321     }
322 }
323
324 void KitaMainWindow::slotSetMainStatusbar( const QString& statusStr )
325 {
326     // display the text on the statusbar
327     statusBar() ->message( statusStr );
328 }
329
330 void KitaMainWindow::slotURLLine()
331 {
332     KURL url = m_urlLine->text();
333     KURL datURL = Kita::getDatURL( url );
334     m_threadTab->slotShowMainThread( datURL );
335 }
336
337 //
338 // private method
339 //
340
341 void KitaMainWindow::setupActions()
342 {
343     KStdAction::quit( this, SLOT( close() ), actionCollection() );
344     KStdAction::copy( this, SLOT( slotEditCopy() ), actionCollection() );
345
346     m_toolbarAction = KStdAction::showToolbar( this,
347                       SLOT( optionsShowToolbar() ),
348                       actionCollection() );
349
350     m_statusbarAction = KStdAction::showStatusbar( this,
351                         SLOT( optionsShowStatusbar() ),
352                         actionCollection() );
353
354     m_showWriteDockAction = new KToggleAction( i18n( "Show Write Dock" ),
355                             0,
356                             m_writeDock,
357                             SLOT( slotToggleShowHide() ),
358                             actionCollection(),
359                             "window_show_writedock" );
360
361     m_urlLine = new KLineEdit( "", 0 );
362
363     new KWidgetAction( m_urlLine,
364                        i18n( "URL Line" ),
365                        0,
366                        this,
367                        SLOT( slotURLLine() ),
368                        actionCollection(), "url_line_action" );
369
370     KStdAction::keyBindings( this, SLOT( optionsConfigureKeys() ), actionCollection() );
371     KStdAction::configureToolbars( this, SLOT( optionsConfigureToolbars() ), actionCollection() );
372     KStdAction::preferences( this, SLOT( optionsPreferences() ), actionCollection() );
373
374     new KAction( i18n( "Load board list" ),
375                  0,
376                  m_bbsTab,
377                  SLOT( updateBoardList() ),
378                  actionCollection(),
379                  "load_board_list" );
380
381     new KAction( i18n( "Login" ),
382                  0,
383                  this,
384                  SLOT( login() ),
385                  actionCollection(),
386                  "login" );
387
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 );
394 }
395
396 void KitaMainWindow::setupView()
397 {
398     ViewMediator::getInstance()->setMainWindow( this );
399
400     QWidget* mainWidget = new QWidget( this );
401     QBoxLayout* bl = new QVBoxLayout( mainWidget );
402
403     m_bbsTab = new KitaBBSTabWidget( mainWidget, "Board" );
404     bl->addWidget( m_bbsTab );
405
406     m_boardTab = new KitaBoardTabWidget( mainWidget, "Subject" );
407     bl->addWidget( m_boardTab );
408     ViewMediator::getInstance()->setBoardTabWidget( m_boardTab );
409
410     m_threadTab = new KitaThreadTabWidget( mainWidget, "Thread View" );
411     bl->addWidget( m_threadTab );
412     ViewMediator::getInstance()->setThreadTabWidget( m_threadTab );
413
414     setView( mainWidget );
415
416     /* write dock */
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 ) ) );
424
425     /* reset dock status */
426     m_showWriteDockAction = NULL;
427 }
428
429 void KitaMainWindow::loadCache()
430 {
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 );
436         stream >> *cache;
437     }
438 }
439
440 void KitaMainWindow::saveCache()
441 {
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 );
447         stream << *cache;
448     }
449 }
450
451 void KitaMainWindow::loadFavorites()
452 {
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 );
458
459         QString xml = stream.read();
460         FavoriteThreads::readFromXML( xml );
461     }
462 }
463
464 void KitaMainWindow::saveFavorites()
465 {
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();
472     }
473 }
474
475 void KitaMainWindow::loadFavoriteBoards()
476 {
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 );
482
483         QString xml = stream.read();
484         Kita::FavoriteBoards::readFromXML( xml );
485     }
486 }
487
488 void KitaMainWindow::saveFavoriteBoards()
489 {
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();
496     }
497 }
498
499 void KitaMainWindow::loadCompletion()
500 {
501     QString configPath = locateLocal( "appdata", "completion" );
502     KSimpleConfig config( configPath );
503
504     Kita::Config::setNameCompletionList( config.readListEntry( "name" ) );
505 }
506
507 void KitaMainWindow::loadStyleSheet()
508 {
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 );
514
515         QStringList list;
516         QString str;
517
518         while ( ( str = stream.readLine() ) != QString::null ) {
519             if ( ! str.isEmpty() ) {
520                 list << str;
521             }
522         }
523         KitaConfig::setStyleSheetText( list.join( "\n" ) );
524     }
525 }
526
527 void KitaMainWindow::saveStyleSheet()
528 {
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 );
534
535         stream << KitaConfig::styleSheetText();
536     }
537 }
538
539 void KitaMainWindow::loadAsciiArt()
540 {
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 );
546
547         QStringList list;
548         QString str;
549
550         while ( ( str = stream.readLine() ) != QString::null ) {
551             if ( ! str.isEmpty() ) {
552                 list << str;
553             }
554         }
555         Kita::AsciiArtConfig::setAsciiArtList( list );
556     }
557 }
558
559 void KitaMainWindow::loadAboneIDList()
560 {
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 );
566
567         QStringList list;
568         QString str;
569
570         while ( ( str = stream.readLine() ) != QString::null ) {
571             if ( ! str.isEmpty() ) {
572                 list << str;
573             }
574         }
575         Kita::AboneConfig::setAboneIDList( list );
576     }
577 }
578
579 void KitaMainWindow::loadAboneNameList()
580 {
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 );
586
587         QStringList list;
588         QString str;
589
590         while ( ( str = stream.readLine() ) != QString::null ) {
591             if ( ! str.isEmpty() ) {
592                 list << str;
593             }
594         }
595         Kita::AboneConfig::setAboneNameList( list );
596     }
597 }
598
599 void KitaMainWindow::loadAboneWordList()
600 {
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 );
606
607         QStringList list;
608         QString str;
609
610         while ( ( str = stream.readLine() ) != QString::null ) {
611             if ( ! str.isEmpty() ) {
612                 list << str;
613             }
614         }
615         Kita::AboneConfig::setAboneWordList( list );
616     }
617 }
618
619 #include "mainwindow.moc"