Diffstat (limited to 'kaddressbook/extensionmanager.cpp') (more/less context) (show whitespace changes)
-rw-r--r-- | kaddressbook/extensionmanager.cpp | 246 |
1 files changed, 246 insertions, 0 deletions
diff --git a/kaddressbook/extensionmanager.cpp b/kaddressbook/extensionmanager.cpp new file mode 100644 index 0000000..9114cdc --- a/dev/null +++ b/kaddressbook/extensionmanager.cpp @@ -0,0 +1,246 @@ +/* + This file is part of KAddressbook. + Copyright (c) 2003 Tobias Koenig <tokoe@kde.org> + + This program is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 2 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program; if not, write to the Free Software + Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. + + As a special exception, permission is given to link this program + with any edition of Qt, and distribute the resulting executable, + without including the source code for Qt in the source distribution. +*/ +#include <qlayout.h> +#include <qapplication.h> +#include <kactionclasses.h> +#include <kconfig.h> +#include <kdebug.h> +#include <klocale.h> + +#ifndef KAB_EMBEDDED +#include <ktrader.h> +#else //KAB_EMBEDDED +#include <features/mergewidget.h> +#include <features/distributionlistwidget.h> +#endif //KAB_EMBEDDED + +#include "addresseeeditorwidget.h" +#include "kabcore.h" +#include "kabprefs.h" + +#include "extensionmanager.h" + +ExtensionManager::ExtensionManager( KABCore *core, QWidget *parent, + const char *name ) + : QScrollView( parent, name ), mCore( core ), mCurrentExtensionWidget( 0 ) +{ +#ifdef KAB_EMBEDDED +//US QPopupMenu *settingsmenu = (QPopupMenu*)mCore->getSettingsMenu(); + QWidget *settingsmenu = (QWidget*)mCore->getSettingsMenu(); +#endif //KAB_EMBEDDED + + mActionExtensions = new KSelectAction( i18n( "Show Extension Bar" ), 0, + mCore->actionCollection(), + "options_show_extensions" ); + + mActionExtensions->plug( settingsmenu ); + + connect( mActionExtensions, SIGNAL( activated( int ) ), + SLOT( setActiveExtension( int ) ) ); + mWidgetBox = new QWidget( viewport() ); + addChild( mWidgetBox ); + setResizePolicy(AutoOneFit); + createExtensionWidgets(); + hide(); +} + +ExtensionManager::~ExtensionManager() +{ +} + +void ExtensionManager::restoreSettings() +{ + mActionExtensions->setCurrentItem( KABPrefs::instance()->mCurrentExtension ); + int i = 1; + mCurrentExtensionWidget = mExtensionWidgetList.at( i-1 ); + while ( mCurrentExtensionWidget ) { + if( i != KABPrefs::instance()->mCurrentExtension ) + mCurrentExtensionWidget->hide(); + mCurrentExtensionWidget = mExtensionWidgetList.at( ++i-1 ); + + } + setActiveExtension( mActionExtensions->currentItem() ); +} + +void ExtensionManager::saveSettings() +{ + KABPrefs::instance()->mCurrentExtension = mActionExtensions->currentItem(); +} + +void ExtensionManager::reconfigure() +{ + saveSettings(); + createExtensionWidgets(); + restoreSettings(); +} + +bool ExtensionManager::isQuickEditVisible() const +{ + return ( mCurrentExtensionWidget && + mCurrentExtensionWidget->identifier() == "contact_editor" ); +} + +void ExtensionManager::setSelectionChanged() +{ + if ( mCurrentExtensionWidget ) + mCurrentExtensionWidget->contactsSelectionChanged(); +} + +void ExtensionManager::setActiveExtension( int id ) +{ + //qDebug("+++++++++++++++++++ExtensionManager::setActiveExtension %d ", id); + if ( id == 0 ) { + hide(); + mCurrentExtensionWidget = 0; +#ifndef DESKTOP_VERSION +//US our screen is so small, that we better hide the detailscreen, just in case. + mCore->setDetailsToState( ); +#endif //KAB_EMBEDDED + } else if ( id > 0 ) { + if ( mCurrentExtensionWidget ) + mCurrentExtensionWidget->hide(); + + mCurrentExtensionWidget = mExtensionWidgetList.at( id - 1 ); + + if ( mCurrentExtensionWidget ) { +#ifndef DESKTOP_VERSION +//US our screen is so small, that we better hide the detailscreen, just in case. + mCore->setDetailsVisible( false ); +#endif //KAB_EMBEDDED + show(); + mWidgetBox->show(); + mCurrentExtensionWidget->show(); + } else { + hide(); + mCurrentExtensionWidget = 0; +#ifndef DESKTOP_VERSION +//US our screen is so small, that we better hide the detailscreen, just in case. + mCore->setDetailsToState( ); +#endif //KAB_EMBEDDED + } + } +} + +void ExtensionManager::createExtensionWidgets() +{ + // clear extension widget list + mExtensionWidgetList.setAutoDelete( true ); + QPtrListIterator<ExtensionWidget> wdgIt( mExtensionWidgetList ); + ExtensionWidget *wdg = 0; + while ( ( wdg = wdgIt.current() ) != 0 ) + mExtensionWidgetList.remove( wdg ); + + mExtensionWidgetList.setAutoDelete( false ); + + QStringList extensionNames( i18n( "None" ) ); + + // add addressee editor as default + + QHBoxLayout *hbl = new QHBoxLayout (mWidgetBox ); + + wdg = new AddresseeEditorWidget( mCore, true, mWidgetBox ); + hbl->addWidget( wdg ); + //wdg->hide(); + connect( wdg, SIGNAL( modified( const KABC::Addressee::List& ) ), + SIGNAL( modified( const KABC::Addressee::List& ) ) ); + mExtensionWidgetList.append( wdg ); + extensionNames.append( wdg->title() ); + + // load the other extensions + QStringList activeExtensions = KABPrefs::instance()->mActiveExtensions; + +#ifndef KAB_EMBEDDED + KTrader::OfferList plugins = KTrader::self()->query( "KAddressBook/Extension" ); + KTrader::OfferList::ConstIterator it; + for ( it = plugins.begin(); it != plugins.end(); ++it ) { + if ( !(*it)->hasServiceType( "KAddressBook/Extension" ) ) + continue; + + KLibFactory *factory = KLibLoader::self()->factory( (*it)->library().latin1() ); + if ( !factory ) { + kdDebug(5720) << "ExtensionManager::loadExtensions(): Factory creation failed" << endl; + continue; + } + + ExtensionFactory *extensionFactory = static_cast<ExtensionFactory*>( factory ); + + if ( !extensionFactory ) { + kdDebug(5720) << "ExtensionManager::loadExtensions(): Cast failed" << endl; + continue; + } + + if ( !activeExtensions.contains( extensionFactory->identifier() ) ) + continue; + + wdg = extensionFactory->extension( mCore, this ); + if ( wdg ) { + //wdg->hide(); + connect( wdg, SIGNAL( modified( const KABC::Addressee::List& ) ), + SIGNAL( modified( const KABC::Addressee::List& ) ) ); + mExtensionWidgetList.append( wdg ); + extensionNames.append( wdg->title() ); + } + } +#else //KAB_EMBEDDED + //load Mergefactory/extension + ExtensionFactory *extensionFactory = new MergeFactory(); + if ( activeExtensions.contains( extensionFactory->identifier() ) ) + { + wdg = extensionFactory->extension( mCore, mWidgetBox ); + if ( wdg ) { + hbl->addWidget( wdg ); + //wdg->hide(); + connect( wdg, SIGNAL( modified( const KABC::Addressee::List& ) ), + SIGNAL( modified( const KABC::Addressee::List& ) ) ); + mExtensionWidgetList.append( wdg ); + extensionNames.append( wdg->title() ); + } + } + + //load DistributionListfactory/extension + extensionFactory = new DistributionListFactory(); + if (activeExtensions.contains( extensionFactory->identifier() ) ) + { + wdg = extensionFactory->extension( mCore, mWidgetBox ); + if ( wdg ) { + hbl->addWidget( wdg ); + //wdg->hide(); + connect( wdg, SIGNAL( modified( const KABC::Addressee::List& ) ), + SIGNAL( modified( const KABC::Addressee::List& ) ) ); + mExtensionWidgetList.append( wdg ); + extensionNames.append( wdg->title() ); + } + } + + hbl->addStretch(); + +#endif //KAB_EMBEDDED + + + mActionExtensions->setItems( extensionNames ); + mCurrentExtensionWidget = 0; +} + +#ifndef KAB_EMBEDDED +#include "extensionmanager.moc" +#endif //KAB_EMBEDDED |