kontact Library API Documentation

mainwindow.cpp

00001 /*
00002     This file is part of KDE Kontact.
00003 
00004     Copyright (c) 2001 Matthias Hoelzer-Kluepfel <mhk@kde.org>
00005     Copyright (c) 2002-2003 Daniel Molkentin <molkentin@kde.org>
00006     Copyright (c) 2003 Cornelius Schumacher <schumacher@kde.org>
00007 
00008     This program is free software; you can redistribute it and/or modify
00009     it under the terms of the GNU General Public License as published by
00010     the Free Software Foundation; either version 2 of the License, or
00011     (at your option) any later version.
00012 
00013     This program is distributed in the hope that it will be useful,
00014     but WITHOUT ANY WARRANTY; without even the implied warranty of
00015     MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
00016     GNU General Public License for more details.
00017 
00018     You should have received a copy of the GNU General Public License
00019     along with this program; if not, write to the Free Software
00020     Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.
00021 */
00022 
00023 
00024 #include <qcombobox.h>
00025 #include <qhbox.h>
00026 #include <qimage.h>
00027 #include <qobjectlist.h>
00028 #include <qsplitter.h>
00029 #include <qwhatsthis.h>
00030 
00031 #include <dcopclient.h>
00032 #include <kapplication.h>
00033 #include <kconfig.h>
00034 #include <kdebug.h>
00035 #include <kedittoolbar.h>
00036 #include <kguiitem.h>
00037 #include <khelpmenu.h>
00038 #include <kiconloader.h>
00039 #include <kkeydialog.h>
00040 #include <klibloader.h>
00041 #include <klistbox.h>
00042 #include <klocale.h>
00043 #include <kmessagebox.h>
00044 #include <kparts/componentfactory.h>
00045 #include <kplugininfo.h>
00046 #include <kpopupmenu.h>
00047 #include <ksettings/componentsdialog.h>
00048 #include <ksettings/dispatcher.h>
00049 #include <kshortcut.h>
00050 #include <kstandarddirs.h>
00051 #include <kstatusbar.h>
00052 #include <kstdaction.h>
00053 #include <ktip.h>
00054 #include <ktrader.h>
00055 
00056 #include <infoextension.h>
00057 
00058 #include "aboutdialog.h"
00059 #include "iconsidepane.h"
00060 #include "mainwindow.h"
00061 #include "plugin.h"
00062 #include "prefs.h"
00063 #include "sidepane.h"
00064 
00065 using namespace Kontact;
00066 
00067 MainWindow::MainWindow()
00068   : Kontact::Core(), mTopWidget( 0 ), mHeaderText( 0 ), mHeaderPixmap( 0 ), mSplitter( 0 ),
00069     mCurrentPlugin( 0 ), mLastInfoExtension( 0 ), mAboutDialog( 0 )
00070 {
00071   KTrader::OfferList offers = KTrader::self()->query(
00072       QString::fromLatin1( "Kontact/Plugin" ),
00073       QString( "[X-KDE-KontactPluginVersion] == %1" ).arg( KONTACT_PLUGIN_VERSION ) );
00074   mPluginInfos = KPluginInfo::fromServices( offers, Prefs::self()->config(),
00075       "Plugins" );
00076   for( KPluginInfo::List::Iterator it = mPluginInfos.begin();
00077       it != mPluginInfos.end(); ++it )
00078     ( *it )->load();
00079 
00080   initWidgets();
00081 
00082   // prepare the part manager
00083   mPartManager = new KParts::PartManager( this );
00084   connect( mPartManager, SIGNAL( activePartChanged( KParts::Part* ) ),
00085            this, SLOT( slotActivePartChanged( KParts::Part* ) ) );
00086 
00087   setupActions();
00088 
00089   setHelpMenuEnabled( false );
00090 
00091   KHelpMenu *helpMenu = new KHelpMenu( this, 0, true, actionCollection() );
00092   connect( helpMenu, SIGNAL( showAboutApplication() ),
00093            SLOT( showAboutDialog() ) );
00094 
00095   loadPlugins();
00096 
00097   KStdAction::keyBindings( this, SLOT( configureShortcuts() ), actionCollection() );
00098   KStdAction::configureToolbars( this, SLOT( configureToolbars() ), actionCollection() );
00099   setXMLFile( "kontactui.rc" );
00100 
00101   setStandardToolBarMenuEnabled( true );
00102 
00103   createGUI( 0 );
00104 
00105   resize( 700, 520 ); // initial size to prevent a scrollbar in sidepane
00106   setAutoSaveSettings();
00107 
00108   if ( mSidePane )
00109     mSidePane->updatePlugins();
00110 
00111 #if 0
00112   KSettings::Dispatcher::self()->registerInstance( instance(), this,
00113       SLOT( updateConfig() ) );
00114 #endif
00115   loadSettings();
00116 
00117   showTip( false );
00118 
00119   statusBar()->show();
00120 }
00121 
00122 MainWindow::~MainWindow()
00123 {
00124   saveSettings();
00125 
00126   QPtrList<KParts::Part> parts = *mPartManager->parts();
00127   parts.setAutoDelete( true );
00128   parts.clear();
00129 
00130   Prefs::self()->writeConfig();
00131 }
00132 
00133 void MainWindow::initWidgets()
00134 {
00135   QHBox *topWidget = new QHBox( this );
00136   topWidget->setFrameStyle( QFrame::Panel | QFrame::Sunken );
00137 
00138   mTopWidget = topWidget;
00139 
00140   setCentralWidget( mTopWidget );
00141 
00142   mSidePaneType = Prefs::self()->mSidePaneType;
00143 
00144   QHBox *mBox = 0;
00145 
00146   if ( mSidePaneType == Prefs::SidePaneBars ) {
00147     mSplitter = new QSplitter( mTopWidget );
00148     mSidePane = new SidePane( this, mSplitter );
00149     mSidePane->setSizePolicy( QSizePolicy( QSizePolicy::Maximum,
00150                                            QSizePolicy::Preferred ) );
00151     mSplitter->setResizeMode( mSidePane, QSplitter::KeepSize );
00152   } else {
00153     mSplitter = 0;
00154     mBox = new QHBox( mTopWidget );
00155     mSidePane = new IconSidePane( this, mBox );
00156     mSidePane->setSizePolicy( QSizePolicy( QSizePolicy::Maximum,
00157                                            QSizePolicy::Preferred ) );
00158   }
00159 
00160   connect( mSidePane, SIGNAL( pluginSelected( Kontact::Plugin * ) ),
00161            SLOT( selectPlugin( Kontact::Plugin * ) ) );
00162 
00163   QVBox *vBox;
00164   if ( mSplitter ) {
00165     vBox = new QVBox( mSplitter );
00166   } else {
00167     vBox = new QVBox( mBox );
00168   }
00169 
00170   initHeaderWidget( vBox );
00171   if ( mSidePaneType != Prefs::SidePaneBars )
00172     mHeaderFrame->hide();
00173 
00174   vBox->setSpacing( 0 );
00175 
00176   mStack = new QWidgetStack( vBox );
00177 }
00178 
00179 void MainWindow::setupActions()
00180 {
00181   (void) KStdAction::quit( this, SLOT( slotQuit() ), actionCollection() );
00182   mNewActions = new KToolBarPopupAction( KGuiItem(i18n( "New" ), ""),
00183           KShortcut(), this, SLOT(slotNewClicked()),actionCollection(), "action_new" );
00184 
00185   new KAction( i18n("Configure Kontact..."), "configure", 0, this, SLOT( slotPreferences() ),
00186                actionCollection(), "settings_configure_kontact" );
00187 
00188  ( void )new KAction( i18n( "&Tip of the Day" ), 0,
00189                      this, SLOT( slotShowTip() ), actionCollection(), "help_tipofday" );
00190 
00191 }
00192 
00193 void MainWindow::initHeaderWidget(QVBox *vBox)
00194 {
00195   // Initiate the headerWidget
00196   mHeaderFrame = new QHBox( vBox );
00197   mHeaderFrame->setSizePolicy( QSizePolicy::MinimumExpanding,
00198                                 QSizePolicy::Maximum );
00199   mHeaderFrame->setSpacing( 0 );
00200   mHeaderFrame->setFixedHeight( 22 );
00201 
00202   mHeaderText = new QLabel( mHeaderFrame );
00203   mHeaderText->setSizePolicy( QSizePolicy::MinimumExpanding,
00204                                QSizePolicy::Preferred );
00205   mHeaderText->setPaletteForegroundColor( colorGroup().light() );
00206   mHeaderText->setPaletteBackgroundColor( colorGroup().dark() );
00207 
00208   mHeaderPixmap = new QLabel( mHeaderFrame );
00209   mHeaderPixmap->setSizePolicy( QSizePolicy::Maximum,
00210                                  QSizePolicy::Preferred );
00211   mHeaderPixmap->setAlignment( AlignRight|AlignVCenter );
00212   mHeaderPixmap->setPaletteBackgroundColor( colorGroup().dark() );
00213 
00214   connect( this, SIGNAL( textChanged( const QString& ) ),
00215            this, SLOT( setHeaderText( const QString& ) ) );
00216   connect( this, SIGNAL( iconChanged( const QPixmap& ) ),
00217            this, SLOT( setHeaderPixmap( const QPixmap& ) ) );
00218 
00219   QFont fnt( mSidePane->font() );
00220   fnt.setBold( true );
00221   fnt.setPointSize( mSidePane->font().pointSize() + 3 );
00222   mHeaderText->setFont( fnt );
00223 }
00224 
00225 bool MainWindow::isPluginLoaded( const KPluginInfo * info )
00226 {
00227   return ( pluginFromInfo( info ) != 0 );
00228 }
00229 
00230 Plugin *MainWindow::pluginFromInfo( const KPluginInfo *info )
00231 {
00232   PluginList::ConstIterator end = mPlugins.end();
00233   for ( PluginList::ConstIterator it = mPlugins.begin(); it != end; ++it )
00234     if ( ( *it )->identifier() == info->pluginName() )
00235       return *it;
00236 
00237   return 0;
00238 }
00239 
00240 void MainWindow::loadPlugins()
00241 {
00242   QPtrList<Plugin> plugins;
00243   QPtrList<KParts::Part> loadDelayed;
00244 
00245   uint i;
00246 
00247   for( KPluginInfo::List::ConstIterator it = mPluginInfos.begin();
00248       it != mPluginInfos.end(); ++it )
00249   {
00250     if( ! ( *it )->isPluginEnabled() )
00251       continue;
00252     if( isPluginLoaded( *it ) ) {
00253       Plugin *plugin = pluginFromInfo( *it );
00254       if ( plugin )
00255         plugin->configUpdated();
00256       continue;
00257     }
00258 
00259     kdDebug(5600) << "Loading Plugin: " << ( *it )->name() << endl;
00260     Kontact::Plugin *plugin =
00261       KParts::ComponentFactory::createInstanceFromService<Kontact::Plugin>(
00262           ( *it )->service(), this );
00263 
00264     if ( !plugin )
00265       continue;
00266 
00267     plugin->setIdentifier( ( *it )->pluginName() );
00268     plugin->setTitle( ( *it )->name() );
00269     plugin->setIcon( ( *it )->icon() );
00270 
00271     QVariant libNameProp = ( *it )->property( "X-KDE-KontactPartLibraryName" );
00272     QVariant exeNameProp = ( *it )->property( "X-KDE-KontactPartExecutableName" );
00273     QVariant loadOnStart = ( *it )->property( "X-KDE-KontactPartLoadOnStart" );
00274 
00275     if (!loadOnStart.isNull() && loadOnStart.toBool() )
00276     {
00277       mDelayedPreload.append(plugin);
00278     }
00279 
00280     kdDebug() << "LIBNAMEPART: " << libNameProp.toString() << endl;
00281 
00282     plugin->setPartLibraryName( libNameProp.toString().utf8() );
00283     plugin->setExecutableName( exeNameProp.toString() );
00284 
00285     for( i = 0; i < plugins.count(); ++i ) {
00286       Plugin *p = plugins.at( i );
00287       if ( plugin->weight() < p->weight() ) break;
00288     }
00289 
00290     plugins.insert( i, plugin );
00291   }
00292 
00293   for( i = 0; i < plugins.count(); ++ i ) {
00294     Plugin *plugin = plugins.at( i );
00295 
00296     KAction *action;
00297     QPtrList<KAction> *actionList = plugin->newActions();
00298 
00299     for(action = actionList->first(); action; action = actionList->next()){
00300       kdDebug() << "Plugging " << action->name() << endl;
00301       action->plug(mNewActions->popupMenu());
00302     }
00303     addPlugin( plugin );
00304   }
00305 
00306   mLastInfoExtension = 0;
00307 }
00308 
00309 void MainWindow::unloadPlugins()
00310 {
00311   KPluginInfo::List::ConstIterator end = mPluginInfos.end();
00312   for ( KPluginInfo::List::ConstIterator it = mPluginInfos.begin();
00313       it != end; ++it ) {
00314     if ( ! ( *it )->isPluginEnabled() )
00315       removePlugin( *it );
00316   }
00317 }
00318 
00319 bool MainWindow::removePlugin( const KPluginInfo * info )
00320 {
00321   PluginList::Iterator end = mPlugins.end();
00322   for ( PluginList::Iterator it = mPlugins.begin(); it != end; ++it )
00323     if( ( *it )->identifier() == info->pluginName() ) {
00324       Plugin *plugin = *it;
00325 
00326       KAction *action;
00327       QPtrList<KAction> *actionList = plugin->newActions();
00328 
00329       for ( action = actionList->first(); action; action = actionList->next() )
00330       {
00331         kdDebug() << "Unplugging " << action->name() << endl;
00332         action->unplug( mNewActions->popupMenu() );
00333       }
00334 
00335       removeChildClient( plugin );
00336       delete plugin; // removes the part automatically
00337       mPlugins.remove( it );
00338       return true;
00339     }
00340   return false;
00341 }
00342 
00343 void MainWindow::addPlugin( Kontact::Plugin *plugin )
00344 {
00345   kdDebug(5600) << "Added plugin" << endl;
00346 
00347   mPlugins.append( plugin );
00348 
00349   // merge the plugins GUI into the main window
00350   insertChildClient( plugin );
00351 }
00352 
00353 void MainWindow::partLoaded( Kontact::Plugin * /*plugin*/, KParts::Part *part )
00354 {
00355   if ( part->widget() )
00356     mStack->addWidget( part->widget(), 0 );
00357 
00358   mPartManager->addPart( part, false );
00359 }
00360 
00361 void MainWindow::slotActivePartChanged( KParts::Part *part )
00362 {
00363   if ( !part ) {
00364     createGUI( 0 );
00365     return;
00366   }
00367 
00368   if ( mLastInfoExtension ) {
00369     disconnect( mLastInfoExtension, SIGNAL( textChanged( const QString& ) ),
00370                 this, SLOT( setHeaderText( const QString& ) ) );
00371     disconnect( mLastInfoExtension, SIGNAL( iconChanged( const QPixmap& ) ),
00372                 this, SLOT( setHeaderPixmap( const QPixmap& ) ) );
00373   }
00374 
00375   kdDebug(5600) << "Part activated: " << part << " with stack id. "
00376       << mStack->id( part->widget() )<< endl;
00377   QObjectList *l = part->queryList( "KParts::InfoExtension" );
00378   KParts::InfoExtension *ie = 0;
00379   if ( l )
00380       ie = static_cast<KParts::InfoExtension*>( l->first() );
00381   delete l;
00382   if ( ie ) {
00383     connect( ie, SIGNAL( textChanged( const QString& ) ),
00384              SLOT( setHeaderText( const QString& ) ) );
00385     connect( ie, SIGNAL( iconChanged( const QPixmap& ) ),
00386              SLOT( setHeaderPixmap( const QPixmap& ) ) );
00387   }
00388 
00389   mLastInfoExtension = ie;
00390 
00391   InfoExtData data = mInfoExtCache[ ie ];
00392   setHeaderPixmap( data.pixmap );
00393   setHeaderText( data.text );
00394 
00395   createGUI( part );
00396 
00397   statusBar()->clear();
00398 }
00399 
00400 void MainWindow::slotNewClicked()
00401 {
00402   KAction *action = mCurrentPlugin->newActions()->first();
00403   if ( action ) {
00404     action->activate();
00405   } else {
00406     PluginList::Iterator it;
00407     for ( it = mPlugins.begin(); it != mPlugins.end(); ++it ) {
00408       action = (*it)->newActions()->first();
00409       if ( action ) {
00410         action->activate();
00411         return;
00412       }
00413     }
00414   }
00415 }
00416 
00417 void MainWindow::selectPlugin( Kontact::Plugin *plugin )
00418 {
00419   if ( !plugin )
00420     return;
00421 
00422   if ( plugin->isRunningStandalone() )
00423   {
00424     statusBar()->message(
00425         i18n("Application is running standalone. Foregrounding..."), 1000);
00426     plugin->bringToForeground();
00427     return;
00428   }
00429 
00430   KApplication::setOverrideCursor( QCursor( Qt::WaitCursor ) );
00431 
00432   if ( mSidePane )
00433     mSidePane->selectPlugin( plugin );
00434 
00435   KParts::Part *part = plugin->part();
00436 
00437   if ( !part ) {
00438     KMessageBox::error( this, i18n("Can't load Part for %1")
00439         .arg( plugin->title() ) );
00440     KApplication::restoreOverrideCursor();
00441     return;
00442   }
00443 
00444   plugin->select();
00445 
00446   mPartManager->setActivePart( part );
00447   QWidget *view = part->widget();
00448   Q_ASSERT( view );
00449 
00450   if ( view ) {
00451     mStack->raiseWidget( view );
00452     view->show();
00453     view->setFocus();
00454     mCurrentPlugin = plugin;
00455     KAction *action = plugin->newActions()->first();
00456     setCaption( i18n("Plugin dependent window title" ,"%1 - Kontact").arg( plugin->title() ) );
00457     if ( action ) {
00458       mNewActions->setIconSet( action->iconSet() );
00459       mNewActions->setText( action->text() );
00460     } else { // we'll use the action of the first plugin which offers one
00461       PluginList::Iterator it;
00462       for ( it = mPlugins.begin(); it != mPlugins.end(); ++it ) {
00463         action = (*it)->newActions()->first();
00464         if ( action ) {
00465           mNewActions->setIconSet( action->iconSet() );
00466           mNewActions->setText( action->text() );
00467           break;
00468         }
00469       }
00470     }
00471   }
00472 
00473   QStringList invisibleActions = plugin->invisibleToolbarActions();
00474 
00475   QStringList::ConstIterator it;
00476   for ( it = invisibleActions.begin(); it != invisibleActions.end(); ++it ) {
00477     KAction *action = part->actionCollection()->action( (*it).latin1() );
00478     if ( action )
00479       action->unplug( toolBar() );
00480   }
00481 
00482   KApplication::restoreOverrideCursor();
00483 }
00484 
00485 void MainWindow::selectPlugin( const QString &pluginName )
00486 {
00487   PluginList::ConstIterator end = mPlugins.end();
00488   for ( PluginList::ConstIterator it = mPlugins.begin(); it != end; ++it )
00489     if ( ( *it )->identifier() == pluginName ) {
00490       selectPlugin( *it );
00491       return;
00492     }
00493 }
00494 
00495 void MainWindow::loadSettings()
00496 {
00497   if ( mSplitter )
00498     mSplitter->setSizes( Prefs::self()->mSidePaneSplitter );
00499 
00500   // Preload Plugins. This _must_ happen before the default part is loaded
00501   PluginList::ConstIterator it;
00502   for ( it = mDelayedPreload.begin(); it != mDelayedPreload.end(); ++it )
00503     selectPlugin( *it );
00504 
00505   selectPlugin( Prefs::self()->mActivePlugin );
00506 }
00507 
00508 void MainWindow::saveSettings()
00509 {
00510   if ( mSplitter )
00511     Prefs::self()->mSidePaneSplitter = mSplitter->sizes();
00512 
00513   if ( mCurrentPlugin )
00514     Prefs::self()->mActivePlugin = mCurrentPlugin->identifier();
00515 }
00516 
00517 void MainWindow::slotShowTip()
00518 {
00519   showTip( true );
00520 }
00521 
00522 void MainWindow::showTip(bool force)
00523 {
00524   QStringList tips;
00525   PluginList::ConstIterator end = mPlugins.end();
00526   for ( PluginList::ConstIterator it = mPlugins.begin(); it != end; ++it ) {
00527     QString file = ( *it )->tipFile();
00528     if ( !file.isEmpty() )
00529       tips.append( file );
00530   }
00531 
00532   KTipDialog::showMultiTip(this, tips, force);
00533 }
00534 
00535 void MainWindow::slotQuit()
00536 {
00537   close();
00538 }
00539 
00540 void MainWindow::slotPreferences()
00541 {
00542   static KSettings::ComponentsDialog *dlg = 0;
00543   if( !dlg ) {
00544     dlg = new KSettings::ComponentsDialog( this );
00545     dlg->setPluginInfos( mPluginInfos );
00546     connect( dlg, SIGNAL( okClicked() ), SLOT( pluginsChanged() ) );
00547     connect( dlg, SIGNAL( applyClicked() ), SLOT( pluginsChanged() ) );
00548   }
00549 
00550   dlg->show();
00551 }
00552 
00553 int MainWindow::startServiceFor( const QString& serviceType,
00554                                  const QString& constraint,
00555                                  const QString& preferences,
00556                                  QString *error, QCString* dcopService,
00557                                  int flags )
00558 {
00559   PluginList::ConstIterator end = mPlugins.end();
00560   for ( PluginList::ConstIterator it = mPlugins.begin(); it != end; ++it ) {
00561     if ( ( *it )->createDCOPInterface( serviceType ) ) {
00562       kdDebug(5600) << "found interface for " << serviceType << endl;
00563       if ( dcopService )
00564         *dcopService = ( *it )->dcopClient()->appId();
00565       kdDebug(5600) << "appId=" << ( *it )->dcopClient()->appId() << endl;
00566       return 0; // success
00567     }
00568   }
00569   kdDebug(5600) <<
00570     "Didn't find dcop interface, falling back to external process" << endl;
00571   return KDCOPServiceStarter::startServiceFor( serviceType, constraint,
00572       preferences, error, dcopService, flags );
00573 }
00574 
00575 void MainWindow::setHeaderText( const QString &text )
00576 {
00577   mInfoExtCache[ mLastInfoExtension ].text = text;
00578   mHeaderText->setText( text );
00579 }
00580 
00581 void MainWindow::setHeaderPixmap( const QPixmap &pixmap )
00582 {
00583   QPixmap pm( pixmap );
00584 
00585   if ( pm.height() > 22 || pm.width() > 22 ) {
00586     QImage img;
00587     img = pixmap;
00588     pm = img.smoothScale( 22, 22, QImage::ScaleMin );
00589   }
00590 
00591   mInfoExtCache[ mLastInfoExtension ].pixmap = pm;
00592   mHeaderPixmap->setPixmap( pm );
00593 }
00594 
00595 void MainWindow::pluginsChanged()
00596 {
00597   unloadPlugins();
00598   loadPlugins();
00599   mSidePane->updatePlugins();
00600 }
00601 
00602 void MainWindow::updateConfig()
00603 {
00604   kdDebug( 5600 ) << k_funcinfo << endl;
00605 
00606   saveSettings();
00607 
00608 #if 0
00609   bool sidePaneChanged = ( Prefs::self()->mSidePaneType != mSidePaneType );
00610 
00611   if ( sidePaneChanged ) {
00612     mSidePaneType = Prefs::self()->mSidePaneType;
00613 
00614     delete mSidePane;
00615 
00616     switch ( mSidePaneType ) {
00617       case Prefs::SidePaneIcons:
00618         mSidePane = new IconSidePane( this, mSplitter );
00619         mHeaderFrame->hide();
00620         break;
00621       default:
00622         kdError() << "Invalid SidePaneType: " << mSidePaneType << endl;
00623       case Prefs::SidePaneBars:
00624         mSidePane = new SidePane( this, mSplitter );
00625         mHeaderFrame->show();
00626         break;
00627     }
00628 
00629     mSplitter->setResizeMode( mSidePane, QSplitter::KeepSize );
00630 
00631     mSidePane->setSizePolicy( QSizePolicy( QSizePolicy::Maximum,
00632                                QSizePolicy::Preferred ) );
00633 
00634     connect( mSidePane, SIGNAL( pluginSelected( Kontact::Plugin * ) ),
00635              SLOT( selectPlugin( Kontact::Plugin * ) ) );
00636 
00637     mSplitter->moveToFirst( mSidePane );
00638 
00639     mSidePane->show();
00640   }
00641 
00642   if ( sidePaneChanged )
00643     mSidePane->updatePlugins();
00644 #endif
00645 
00646   loadSettings();
00647 }
00648 
00649 void MainWindow::showAboutDialog()
00650 {
00651   KApplication::setOverrideCursor( QCursor( Qt::WaitCursor ) );
00652 
00653   if ( !mAboutDialog ) {
00654     mAboutDialog = new AboutDialog( this );
00655   }
00656 
00657   mAboutDialog->show();
00658   mAboutDialog->raise();
00659   KApplication::restoreOverrideCursor();
00660 }
00661 
00662 void MainWindow::configureShortcuts()
00663 {
00664   KKeyDialog dialog( true, this );
00665   dialog.insert( actionCollection() );
00666 
00667   if ( mCurrentPlugin && mCurrentPlugin->part() )
00668     dialog.insert( mCurrentPlugin->part()->actionCollection() );
00669 
00670   dialog.configure();
00671 }
00672 
00673 void MainWindow::configureToolbars()
00674 {
00675   saveMainWindowSettings( KGlobal::config(), "MainWindow" );
00676 
00677   KEditToolbar edit( factory() );
00678   connect( &edit, SIGNAL( newToolbarConfig() ),
00679            this, SLOT( slotNewToolbarConfig() ) );
00680   edit.exec();
00681 }
00682 
00683 void MainWindow::slotNewToolbarConfig()
00684 {
00685   createGUI( mCurrentPlugin->part() );
00686   applyMainWindowSettings( KGlobal::config(), "MainWindow" );
00687 }
00688 
00689 #include "mainwindow.moc"
00690 // vim: sw=2 sts=2 et
KDE Logo
This file is part of the documentation for kontact Library Version 3.2.2.
Documentation copyright © 1996-2004 the KDE developers.
Generated on Sat May 1 11:39:00 2004 by doxygen 1.2.15 written by Dimitri van Heesch, © 1997-2003