kaddressbook
extensionmanager.cpp
Go to the documentation of this file.00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
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
00195 foreach ( const ExtensionData& i, mExtensionMap )
00196 delete i.widget;
00197 mExtensionMap.clear();
00198
00199 {
00200
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
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"