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 <tdeactionclasses.h>
00025 #include <tdeconfig.h>
00026 #include <kdebug.h>
00027 #include <tdelocale.h>
00028 #include <ktrader.h>
00029
00030 #include <tqlayout.h>
00031 #include <tqobjectlist.h>
00032 #include <tqsignalmapper.h>
00033 #include <tqsplitter.h>
00034 #include <tqtimer.h>
00035 #include <tqwidgetstack.h>
00036
00037 #include "addresseeeditorextension.h"
00038 #include "core.h"
00039 #include "kabprefs.h"
00040
00041 #include "extensionmanager.h"
00042
00043 ExtensionData::ExtensionData() : action( 0 ), widget( 0 ), weight( 0 ), isDetailsExtension( false )
00044 {
00045 }
00046
00047 ExtensionManager::ExtensionManager( TQWidget* extensionBar, TQWidgetStack* detailsStack, KAB::Core *core, TQObject *parent,
00048 const char *name )
00049 : TQObject( parent, name ), mExtensionBar( extensionBar ), mCore( core ),
00050 mMapper( 0 ), mDetailsStack( detailsStack ), mActiveDetailsWidget( 0 )
00051 {
00052 Q_ASSERT( mExtensionBar );
00053 TQVBoxLayout* layout = new TQVBoxLayout( mExtensionBar );
00054 mSplitter = new TQSplitter( mExtensionBar );
00055 mSplitter->setOrientation( Qt::Vertical );
00056 layout->addWidget( mSplitter );
00057
00058 createExtensionWidgets();
00059
00060 mActionCollection = new TDEActionCollection( this, "ActionCollection" );
00061
00062 extensionBar->setShown( false );
00063 TQTimer::singleShot( 0, this, TQT_SLOT( createActions() ) );
00064 }
00065
00066 ExtensionManager::~ExtensionManager()
00067 {
00068 }
00069
00070
00071 void ExtensionManager::restoreSettings()
00072 {
00073 const TQStringList activeExtensions = KABPrefs::instance()->activeExtensions();
00074
00075 typedef TQMap<TQString, ExtensionData>::ConstIterator ConstIterator;
00076 for ( ConstIterator it = mExtensionMap.begin(), end = mExtensionMap.end(); it != end; ++it ) {
00077 if ( activeExtensions.contains( it.data().identifier ) ) {
00078 TDEToggleAction *action = static_cast<TDEToggleAction*>( it.data().action );
00079 if ( action )
00080 action->setChecked( true );
00081 setExtensionActive( it.data().identifier, true );
00082 }
00083 }
00084 const TQValueList<int> sizes = KABPrefs::instance()->extensionsSplitterSizes();
00085 mSplitter->setSizes( sizes );
00086 }
00087
00088 void ExtensionManager::saveSettings()
00089 {
00090 KABPrefs::instance()->setActiveExtensions( mActiveExtensions );
00091 KABPrefs::instance()->setExtensionsSplitterSizes( mSplitter->sizes() );
00092 }
00093
00094 void ExtensionManager::reconfigure()
00095 {
00096 saveSettings();
00097 createExtensionWidgets();
00098 createActions();
00099 restoreSettings();
00100 mExtensionBar->setShown( !mActiveExtensions.isEmpty() );
00101 }
00102
00103 bool ExtensionManager::isQuickEditVisible() const
00104 {
00105 return mActiveExtensions.contains( "contact_editor" );
00106 }
00107
00108 void ExtensionManager::setSelectionChanged()
00109 {
00110 for ( TQStringList::ConstIterator it = mActiveExtensions.begin(), end = mActiveExtensions.end(); it != end; ++it ) {
00111 if ( mExtensionMap.contains( *it ) && mExtensionMap[*it].widget )
00112 mExtensionMap[*it].widget->contactsSelectionChanged();
00113 }
00114 }
00115
00116 void ExtensionManager::activationToggled( const TQString &extid )
00117 {
00118 if ( !mExtensionMap.contains( extid ) )
00119 return;
00120 const ExtensionData data = mExtensionMap[ extid ];
00121 const bool activated = data.action->isChecked();
00122 setExtensionActive( extid, activated );
00123 }
00124
00125 void ExtensionManager::setExtensionActive( const TQString& extid, bool active )
00126 {
00127 if ( !mExtensionMap.contains( extid ) )
00128 return;
00129 if ( mActiveExtensions.contains( extid ) == active )
00130 return;
00131 const ExtensionData data = mExtensionMap[ extid ];
00132 if ( active ) {
00133 mActiveExtensions.append( extid );
00134 if ( data.widget ) {
00135 if ( data.isDetailsExtension ) {
00136 mActiveDetailsWidget = data.widget;
00137 emit detailsWidgetActivated( data.widget );
00138 } else {
00139 data.widget->show();
00140 }
00141 data.widget->contactsSelectionChanged();
00142 }
00143 } else {
00144 mActiveExtensions.remove( extid );
00145 if ( data.widget && !data.isDetailsExtension ) {
00146 data.widget->hide();
00147 }
00148 if ( data.isDetailsExtension ) {
00149 mActiveDetailsWidget = 0;
00150 emit detailsWidgetDeactivated( data.widget );
00151 }
00152 }
00153 mExtensionBar->setShown( !mActiveExtensions.isEmpty() );
00154 }
00155
00156 void ExtensionManager::createActions()
00157 {
00158 mCore->guiClient()->unplugActionList( "extensions_list" );
00159 mActionList.setAutoDelete( true );
00160 mActionList.clear();
00161 mActionList.setAutoDelete( false );
00162
00163 delete mMapper;
00164 mMapper = new TQSignalMapper( this, "SignalMapper" );
00165 connect( mMapper, TQT_SIGNAL( mapped( const TQString& ) ),
00166 this, TQT_SLOT( activationToggled( const TQString& ) ) );
00167
00168 ExtensionData::List::ConstIterator it;
00169 for ( TQMap<TQString, ExtensionData>::Iterator it = mExtensionMap.begin(), end = mExtensionMap.end(); it != end; ++it ) {
00170 ExtensionData& data = it.data();
00171 data.action = new TDEToggleAction( data.title, 0, mMapper, TQT_SLOT( map() ),
00172 mActionCollection,
00173 TQString( data.identifier + "_extension" ).latin1() );
00174 mMapper->setMapping( data.action, data.identifier );
00175 mActionList.append( data.action );
00176
00177 if ( mActiveExtensions.contains( data.identifier ) )
00178 data.action->setChecked( true );
00179 }
00180
00181 mActionList.append( new TDEActionSeparator( mActionCollection ) );
00182 mCore->guiClient()->plugActionList( "extensions_list", mActionList );
00183 }
00184
00185 TQWidget* ExtensionManager::activeDetailsWidget() const
00186 {
00187 return mActiveDetailsWidget;
00188 }
00189
00190 void ExtensionManager::createExtensionWidgets()
00191 {
00192
00193 for ( TQMap<TQString, ExtensionData>::ConstIterator it = mExtensionMap.begin(), end = mExtensionMap.end(); it != end; ++it ) {
00194 delete it.data().widget;
00195 }
00196 mExtensionMap.clear();
00197
00198 KAB::ExtensionWidget *wdg = 0;
00199
00200 {
00201
00202 wdg = new AddresseeEditorExtension( mCore, mDetailsStack );
00203 wdg->hide();
00204
00205 connect( wdg, TQT_SIGNAL( modified( const TDEABC::Addressee::List& ) ),
00206 TQT_SIGNAL( modified( const TDEABC::Addressee::List& ) ) );
00207 connect( wdg, TQT_SIGNAL( deleted( const TQStringList& ) ),
00208 TQT_SIGNAL( deleted( const TQStringList& ) ) );
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 TDETrader::OfferList plugins = TDETrader::self()->query( "KAddressBook/Extension",
00220 TQString( "[X-TDE-KAddressBook-ExtensionPluginVersion] == %1" ).arg( KAB_EXTENSIONWIDGET_PLUGIN_VERSION ) );
00221
00222 TDETrader::OfferList::ConstIterator it;
00223 for ( it = plugins.begin(); it != plugins.end(); ++it ) {
00224 KLibFactory *factory = KLibLoader::self()->factory( (*it)->library().latin1() );
00225 if ( !factory ) {
00226 kdDebug(5720) << "ExtensionManager::loadExtensions(): Factory creation failed" << endl;
00227 continue;
00228 }
00229
00230 KAB::ExtensionFactory *extensionFactory = static_cast<KAB::ExtensionFactory*>( factory );
00231
00232 if ( !extensionFactory ) {
00233 kdDebug(5720) << "ExtensionManager::loadExtensions(): Cast failed" << endl;
00234 continue;
00235 }
00236
00237 wdg = extensionFactory->extension( mCore, mSplitter );
00238 if ( wdg ) {
00239 if ( wdg->identifier() == "distribution_list_editor_ng" )
00240 mSplitter->moveToFirst( wdg );
00241 wdg->hide();
00242 connect( wdg, TQT_SIGNAL( modified( const TDEABC::Addressee::List& ) ),
00243 TQT_SIGNAL( modified( const TDEABC::Addressee::List& ) ) );
00244 connect( wdg, TQT_SIGNAL( deleted( const TQStringList& ) ),
00245 TQT_SIGNAL( deleted( const TQStringList& ) ) );
00246
00247 ExtensionData data;
00248 data.identifier = wdg->identifier();
00249 data.title = wdg->title();
00250 data.widget = wdg;
00251 mExtensionMap.insert( data.identifier, data );
00252 }
00253 }
00254 }
00255
00256 #include "extensionmanager.moc"