• Skip to content
  • Skip to link menu
KDE 4.2 API Reference
  • KDE API Reference
  • kdepim
  • Sitemap
  • Contact Us
 

kaddressbook

extensionmanager.cpp

Go to the documentation of this file.
00001 /*
00002     This file is part of KAddressbook.
00003     Copyright (c) 2003 Tobias Koenig <tokoe@kde.org>
00004 
00005     This program is free software; you can redistribute it and/or modify
00006     it under the terms of the GNU General Public License as published by
00007     the Free Software Foundation; either version 2 of the License, or
00008     (at your option) any later version.
00009 
00010     This program is distributed in the hope that it will be useful,
00011     but WITHOUT ANY WARRANTY; without even the implied warranty of
00012     MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
00013     GNU General Public License for more details.
00014 
00015     You should have received a copy of the GNU General Public License
00016     along with this program; if not, write to the Free Software
00017     Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
00018 
00019     As a special exception, permission is given to link this program
00020     with any edition of Qt, and distribute the resulting executable,
00021     without including the source code for Qt in the source distribution.
00022 */
00023 
00024 #include <QtCore/QSignalMapper>
00025 #include <QtCore/QTimer>
00026 #include <QtGui/QHBoxLayout>
00027 #include <QtGui/QSplitter>
00028 #include <QtGui/QStackedWidget>
00029 
00030 #include <kactioncollection.h>
00031 #include <kconfig.h>
00032 #include <kdebug.h>
00033 #include <klocale.h>
00034 #include <kservicetypetrader.h>
00035 #include <ktoggleaction.h>
00036 #include <kvbox.h>
00037 
00038 #include "addresseeeditorextension.h"
00039 #include "core.h"
00040 #include "kabprefs.h"
00041 
00042 #include "extensionmanager.h"
00043 
00044 ExtensionData::ExtensionData() : action( 0 ), widget( 0 ), weight( 0 ), isDetailsExtension( false )
00045 {
00046 }
00047 
00048 ExtensionManager::ExtensionManager( QWidget* extensionBar, QStackedWidget* detailsStack, KAB::Core *core, QObject *parent )
00049     : QObject( parent ), mExtensionBar( extensionBar ), mCore( core ),
00050     mMapper( 0 ), mDetailsStack( detailsStack ), mActiveDetailsWidget( 0 )
00051 {
00052   Q_ASSERT( mCore );
00053   Q_ASSERT( mExtensionBar );
00054   Q_ASSERT( mDetailsStack );
00055   QBoxLayout *layout = new QHBoxLayout( mExtensionBar );
00056   layout->setMargin( 0 );
00057   layout->setSpacing( 0 );
00058   mSplitter = new QSplitter( mExtensionBar );
00059   mSplitter->setOrientation( Qt::Vertical );
00060   mSplitter->setChildrenCollapsible( false );
00061   layout->addWidget( mSplitter );
00062 
00063   createExtensionWidgets();
00064 
00065   mActionCollection = new KActionCollection( this );
00066   mActionCollection->setObjectName( "ActionCollection" );
00067   QTimer::singleShot( 0, this, SLOT( createActions() ) );
00068 }
00069 
00070 ExtensionManager::~ExtensionManager()
00071 {
00072 }
00073 
00074 
00075 void ExtensionManager::restoreSettings()
00076 {
00077   const QStringList activeExtensions = KABPrefs::instance()->activeExtensions();
00078   Q_FOREACH ( const ExtensionData& data, mExtensionMap ) {
00079       if ( activeExtensions.contains( data.identifier ) ) {
00080       KToggleAction *action = static_cast<KToggleAction*>( data.action );
00081       if ( action )
00082         action->setChecked( true );
00083       setExtensionActive( data.identifier, true );
00084     }
00085   }
00086   const QList<int> sizes = KABPrefs::instance()->extensionsSplitterSizes();
00087   if (!sizes.isEmpty()) {
00088     mSplitter->setSizes( sizes );
00089   }
00090 }
00091 
00092 void ExtensionManager::saveSettings()
00093 {
00094   KABPrefs::instance()->setActiveExtensions( mActiveExtensions );
00095   KABPrefs::instance()->setExtensionsSplitterSizes( mSplitter->sizes() );
00096 }
00097 
00098 bool ExtensionManager::isQuickEditVisible() const
00099 {
00100   return mActiveExtensions.contains( "contact_editor" );
00101 }
00102 
00103 void ExtensionManager::setSelectionChanged()
00104 {
00105   foreach ( const QString& i, mActiveExtensions ) {
00106     if ( mExtensionMap.contains( i ) && mExtensionMap[i].widget )
00107       mExtensionMap[i].widget->contactsSelectionChanged();
00108   }
00109 }
00110 
00111 void ExtensionManager::activationToggled( const QString &extid )
00112 {
00113   if ( !mExtensionMap.contains( extid ) )
00114     return;
00115   setExtensionActive( extid, mExtensionMap[ extid ].action->isChecked() );
00116 }
00117 
00118 void ExtensionManager::updateExtensionBarVisibility()
00119 {
00120   foreach ( const QString& i, mActiveExtensions ) {
00121     if ( mExtensionMap[i].widget && !mExtensionMap[i].isDetailsExtension ) {
00122       mExtensionBar->setVisible( true );
00123       return;
00124     }
00125   }
00126 
00127   mExtensionBar->setVisible( false );
00128 }
00129 
00130 void ExtensionManager::setExtensionActive( const QString& extid, bool active )
00131 {
00132   if ( !mExtensionMap.contains( extid ) )
00133     return;
00134   if ( mActiveExtensions.contains( extid ) == active )
00135     return;
00136   const ExtensionData data = mExtensionMap[ extid ];
00137   if ( active ) {
00138     mActiveExtensions.append( extid );
00139     if ( data.widget ) {
00140       if ( data.isDetailsExtension ) {
00141         mActiveDetailsWidget = data.widget;
00142         emit detailsWidgetActivated( data.widget );
00143       } else {
00144           data.widget->setVisible( true );
00145       }
00146       data.widget->contactsSelectionChanged();
00147     }
00148   } else {
00149     mActiveExtensions.removeAll( extid );
00150     if ( data.isDetailsExtension ) {
00151       mActiveDetailsWidget = 0;
00152       emit detailsWidgetDeactivated( data.widget );
00153     } else {
00154         data.widget->setVisible( false );
00155     }
00156   }
00157   updateExtensionBarVisibility();
00158 }
00159 
00160 void ExtensionManager::createActions()
00161 {
00162   mCore->guiClient()->unplugActionList( "extensions_list" );
00163   qDeleteAll( mActionList );
00164   mActionList.clear();
00165 
00166   delete mMapper;
00167   mMapper = new QSignalMapper( this );
00168   mMapper->setObjectName( "SignalMapper" );
00169   connect( mMapper, SIGNAL( mapped( const QString& ) ),
00170            this, SLOT( activationToggled( const QString& ) ) );
00171 
00172   foreach ( const QString& i, mExtensionMap.keys() ) {
00173     ExtensionData& data = mExtensionMap[i];
00174     data.action = mActionCollection->add<KToggleAction>( QString( data.identifier + "_extension" ) );
00175     data.action->setText( data.title );
00176     connect( data.action, SIGNAL(triggered(bool) ), mMapper, SLOT( map() ));
00177     mMapper->setMapping( data.action, data.identifier );
00178     mActionList.append( data.action );
00179     if ( mActiveExtensions.contains( data.identifier ) )
00180       data.action->setChecked( true );
00181   }
00182 
00183   mCore->guiClient()->plugActionList( "extensions_list", mActionList );
00184   updateExtensionBarVisibility();
00185 }
00186 
00187 QWidget* ExtensionManager::activeDetailsWidget() const
00188 {
00189     return mActiveDetailsWidget;
00190 }
00191 
00192 void ExtensionManager::createExtensionWidgets()
00193 {
00194   // clean up
00195   foreach ( const ExtensionData& i, mExtensionMap )
00196     delete i.widget;
00197   mExtensionMap.clear();
00198 
00199   {
00200     // add addressee editor as default
00201     KAB::ExtensionWidget *wdg = new AddresseeEditorExtension( mCore, 0 );
00202     mDetailsStack->addWidget( wdg );
00203     wdg->setVisible( false );
00204 
00205     connect( wdg, SIGNAL( modified( const KABC::Addressee::List& ) ),
00206              SIGNAL( modified( const KABC::Addressee::List& ) ) );
00207     connect( wdg, SIGNAL( deleted( const QStringList& ) ),
00208              SIGNAL( deleted( const QStringList& ) ) );
00209 
00210     ExtensionData data;
00211     data.identifier = wdg->identifier();
00212     data.title = wdg->title();
00213     data.widget = wdg;
00214     data.isDetailsExtension = true;
00215     mExtensionMap.insert( data.identifier, data );
00216   }
00217 
00218   // load the other extensions
00219   const KService::List plugins = KServiceTypeTrader::self()->query( "KAddressBook/Extension",
00220     QString( "[X-KDE-KAddressBook-ExtensionPluginVersion] == %1" ).arg( KAB_EXTENSIONWIDGET_PLUGIN_VERSION ) );
00221 
00222   foreach ( const KService::Ptr& pluginService, plugins ) {
00223     KPluginFactory *factory = KPluginLoader( *pluginService ).factory();
00224     if ( !factory ) {
00225       kDebug(5720) <<"ExtensionManager::loadExtensions(): Factory creation failed";
00226       continue;
00227     }
00228 
00229     KAB::ExtensionFactory *extensionFactory = qobject_cast<KAB::ExtensionFactory*>( factory );
00230 
00231     if ( !extensionFactory ) {
00232       kDebug(5720) <<"ExtensionManager::loadExtensions(): Cast failed";
00233       continue;
00234     }
00235 
00236     KAB::ExtensionWidget *wdg = extensionFactory->extension( mCore, 0 );
00237     if ( wdg ) {
00238       mSplitter->addWidget( wdg );
00239       if ( wdg->identifier() == "distribution_list_editor_ng" )
00240           mSplitter->insertWidget( 0, wdg );
00241       wdg->updateGeometry();
00242       wdg->setVisible( false );
00243       connect( wdg, SIGNAL( modified( const KABC::Addressee::List& ) ),
00244                SIGNAL( modified( const KABC::Addressee::List& ) ) );
00245       connect( wdg, SIGNAL( deleted( const QStringList& ) ),
00246                SIGNAL( deleted( const QStringList& ) ) );
00247 
00248       ExtensionData data;
00249       data.identifier = wdg->identifier();
00250       data.title = wdg->title();
00251       data.widget = wdg;
00252       mExtensionMap.insert( data.identifier, data );
00253     }
00254   }
00255 }
00256 
00257 #include "extensionmanager.moc"

kaddressbook

Skip menu "kaddressbook"
  • Main Page
  • Namespace List
  • Class Hierarchy
  • Alphabetical List
  • Class List
  • File List
  • Class Members
  • Related Pages

kdepim

Skip menu "kdepim"
  • akonadi
  •   clients
  •   kabc
  •   kcal
  •   kcm
  • akregator
  • console
  •   kabcclient
  •   konsolekalendar
  • kaddressbook
  • kalarm
  •   lib
  • kdgantt
  • kdgantt1
  • kjots
  • kleopatra
  • kmail
  • kmobiletools
  • knode
  • knotes
  • kontact
  • kontactinterfaces
  • korganizer
  •   korgac
  • kpilot
  • ktimetracker
  • libkdepim
  • libkholidays
  • libkleo
  • libkpgp
  • maildir
Generated for kdepim by doxygen 1.5.4
This website is maintained by Adriaan de Groot and Allen Winter.
KDE® and the K Desktop Environment® logo are registered trademarks of KDE e.V. | Legal