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 <qcheckbox.h>
00025 #include <qframe.h>
00026 #include <qgroupbox.h>
00027 #include <qlabel.h>
00028 #include <qlayout.h>
00029 #include <qlineedit.h>
00030 #include <qpushbutton.h>
00031 #include <qtabwidget.h>
00032 #include <qtooltip.h>
00033
00034 #include <kconfig.h>
00035 #include <kdebug.h>
00036 #include <kdialog.h>
00037 #include <klistview.h>
00038 #include <klocale.h>
00039 #include <kmessagebox.h>
00040 #include <ktrader.h>
00041
00042 #include "addresseewidget.h"
00043 #include "extensionconfigdialog.h"
00044 #include "extensionwidget.h"
00045 #include "kabprefs.h"
00046
00047 #include "kabconfigwidget.h"
00048
00049 class ExtensionItem : public QCheckListItem
00050 {
00051 public:
00052 ExtensionItem( QListView *parent, const QString &text );
00053
00054 void setService( const KService::Ptr &ptr );
00055 bool configWidgetAvailable() const;
00056 KAB::ExtensionFactory *factory() const;
00057
00058 virtual QString text( int column ) const;
00059
00060 private:
00061 KService::Ptr mPtr;
00062 };
00063
00064 KABConfigWidget::KABConfigWidget( QWidget *parent, const char *name )
00065 : QWidget( parent, name )
00066 {
00067 QVBoxLayout *topLayout = new QVBoxLayout( this, 0,
00068 KDialog::spacingHint() );
00069
00070 QTabWidget *tabWidget = new QTabWidget( this );
00071 topLayout->addWidget( tabWidget );
00072
00073
00074 QWidget *generalPage = new QWidget( this );
00075 QVBoxLayout *layout = new QVBoxLayout( generalPage, KDialog::marginHint(),
00076 KDialog::spacingHint() );
00077
00078 QGroupBox *groupBox = new QGroupBox( 0, Qt::Vertical, i18n( "General" ), generalPage );
00079 QBoxLayout *boxLayout = new QVBoxLayout( groupBox->layout() );
00080 boxLayout->setAlignment( Qt::AlignTop );
00081
00082 mViewsSingleClickBox = new QCheckBox( i18n( "Honor KDE single click" ), groupBox, "msingle" );
00083 boxLayout->addWidget( mViewsSingleClickBox );
00084
00085 mNameParsing = new QCheckBox( i18n( "Automatic name parsing for new addressees" ), groupBox, "mparse" );
00086 boxLayout->addWidget( mNameParsing );
00087
00088 layout->addWidget( groupBox );
00089
00090 groupBox = new QGroupBox( 0, Qt::Vertical, i18n( "Script-Hooks" ), generalPage );
00091 QGridLayout *grid = new QGridLayout( groupBox->layout(), 2, 2,
00092 KDialog::spacingHint() );
00093 QLabel *label = new QLabel( i18n( "Phone:" ), groupBox );
00094 grid->addWidget( label, 0, 0 );
00095
00096 mPhoneHook = new QLineEdit( groupBox );
00097 QToolTip::add( mPhoneHook, i18n( "<ul><li>%N: Phone Number</li></ul>" ) );
00098 grid->addWidget( mPhoneHook, 0, 1 );
00099
00100 label = new QLabel( i18n( "Fax:" ), groupBox );
00101 grid->addWidget( label, 1, 0 );
00102
00103 mFaxHook = new QLineEdit( groupBox );
00104 QToolTip::add( mFaxHook, i18n( "<ul><li>%N: Fax Number</li></ul>" ) );
00105 grid->addWidget( mFaxHook, 1, 1 );
00106 grid->setColStretch( 1, 1 );
00107
00108 layout->addWidget( groupBox );
00109
00110 groupBox = new QGroupBox( 0, Qt::Vertical, i18n( "Extensions" ), generalPage );
00111 boxLayout = new QVBoxLayout( groupBox->layout() );
00112 boxLayout->setAlignment( Qt::AlignTop );
00113
00114 mExtensionView = new KListView( groupBox );
00115 mExtensionView->setAllColumnsShowFocus( true );
00116 mExtensionView->addColumn( i18n( "Name" ) );
00117 mExtensionView->addColumn( i18n( "Description" ) );
00118 boxLayout->addWidget( mExtensionView );
00119 connect( mExtensionView, SIGNAL(doubleClicked ( QListViewItem *)), this, SLOT(configureExtension(QListViewItem *)));
00120 mConfigureButton = new QPushButton( i18n( "Configure..." ), groupBox );
00121 mConfigureButton->setEnabled( false );
00122 boxLayout->addWidget( mConfigureButton );
00123
00124 layout->addWidget( groupBox );
00125
00126 connect( mNameParsing, SIGNAL( toggled( bool ) ), this, SLOT( modified() ) );
00127 connect( mViewsSingleClickBox, SIGNAL( toggled( bool ) ), this, SLOT( modified() ) );
00128 connect( mPhoneHook, SIGNAL( textChanged( const QString& ) ), this, SLOT( modified() ) );
00129 connect( mFaxHook, SIGNAL( textChanged( const QString& ) ), this, SLOT( modified() ) );
00130 connect( mExtensionView, SIGNAL( selectionChanged( QListViewItem* ) ),
00131 SLOT( selectionChanged( QListViewItem* ) ) );
00132 connect( mExtensionView, SIGNAL( clicked( QListViewItem* ) ),
00133 SLOT( itemClicked( QListViewItem* ) ) );
00134 connect( mConfigureButton, SIGNAL( clicked() ),
00135 SLOT( configureExtension() ) );
00136
00137 tabWidget->addTab( generalPage, i18n( "General" ) );
00138
00139
00140 mAddresseeWidget = new AddresseeWidget( this );
00141 tabWidget->addTab( mAddresseeWidget, i18n( "Contact" ) );
00142 connect( mAddresseeWidget, SIGNAL( modified() ), SLOT( modified() ) );
00143 }
00144
00145 void KABConfigWidget::configureExtension(QListViewItem *i)
00146 {
00147 ExtensionItem *item = static_cast<ExtensionItem*>( i );
00148 if ( !item )
00149 return;
00150 if ( item->configWidgetAvailable() )
00151 configureExtension();
00152 }
00153
00154 void KABConfigWidget::restoreSettings()
00155 {
00156 bool blocked = signalsBlocked();
00157 blockSignals( true );
00158
00159 mNameParsing->setChecked( KABPrefs::instance()->mAutomaticNameParsing );
00160 mViewsSingleClickBox->setChecked( KABPrefs::instance()->mHonorSingleClick );
00161 mPhoneHook->setText( KABPrefs::instance()->mPhoneHookApplication );
00162 mFaxHook->setText( KABPrefs::instance()->mFaxHookApplication );
00163 mAddresseeWidget->restoreSettings();
00164
00165 restoreExtensionSettings();
00166
00167 blockSignals( blocked );
00168
00169 emit changed( false );
00170 }
00171
00172 void KABConfigWidget::saveSettings()
00173 {
00174 KABPrefs::instance()->mAutomaticNameParsing = mNameParsing->isChecked();
00175 KABPrefs::instance()->mHonorSingleClick = mViewsSingleClickBox->isChecked();
00176 KABPrefs::instance()->mPhoneHookApplication = mPhoneHook->text();
00177 KABPrefs::instance()->mFaxHookApplication = mFaxHook->text();
00178 mAddresseeWidget->saveSettings();
00179
00180 saveExtensionSettings();
00181 KABPrefs::instance()->writeConfig();
00182
00183 emit changed( false );
00184 }
00185
00186 void KABConfigWidget::defaults()
00187 {
00188 mNameParsing->setChecked( true );
00189 mViewsSingleClickBox->setChecked( false );
00190
00191 emit changed( true );
00192 }
00193
00194 void KABConfigWidget::modified()
00195 {
00196 emit changed( true );
00197 }
00198
00199 void KABConfigWidget::restoreExtensionSettings()
00200 {
00201 QStringList activeExtensions = KABPrefs::instance()->mActiveExtensions;
00202
00203 mExtensionView->clear();
00204
00205 KTrader::OfferList plugins = KTrader::self()->query( "KAddressBook/Extension" );
00206 KTrader::OfferList::ConstIterator it;
00207 for ( it = plugins.begin(); it != plugins.end(); ++it ) {
00208 if ( !(*it)->hasServiceType( "KAddressBook/Extension" ) )
00209 continue;
00210
00211 ExtensionItem *item = new ExtensionItem( mExtensionView, (*it)->name() );
00212 item->setService( *it );
00213 if ( activeExtensions.contains( item->factory()->identifier() ) )
00214 item->setOn( true );
00215 }
00216 }
00217
00218 void KABConfigWidget::saveExtensionSettings()
00219 {
00220 QStringList activeExtensions;
00221
00222 QPtrList<QListViewItem> list;
00223 QListViewItemIterator it( mExtensionView );
00224 while ( it.current() ) {
00225 ExtensionItem *item = static_cast<ExtensionItem*>( it.current() );
00226 if ( item ) {
00227 if ( item->isOn() )
00228 activeExtensions.append( item->factory()->identifier() );
00229 }
00230 ++it;
00231 }
00232
00233 KABPrefs::instance()->mActiveExtensions = activeExtensions;
00234 }
00235
00236 void KABConfigWidget::configureExtension()
00237 {
00238 ExtensionItem *item = static_cast<ExtensionItem*>( mExtensionView->currentItem() );
00239 if ( !item )
00240 return;
00241
00242 KConfig config( "kaddressbookrc" );
00243 config.setGroup( QString( "Extensions_%1" ).arg( item->factory()->identifier() ) );
00244
00245 ExtensionConfigDialog dlg( item->factory(), &config, this );
00246 dlg.exec();
00247
00248 config.sync();
00249 }
00250
00251 void KABConfigWidget::selectionChanged( QListViewItem *i )
00252 {
00253 ExtensionItem *item = static_cast<ExtensionItem*>( i );
00254 if ( !item )
00255 return;
00256
00257 mConfigureButton->setEnabled( item->configWidgetAvailable() );
00258 }
00259
00260 void KABConfigWidget::itemClicked( QListViewItem *item )
00261 {
00262 if ( item != 0 )
00263 modified();
00264 }
00265
00266
00267
00268 ExtensionItem::ExtensionItem( QListView *parent, const QString &text )
00269 : QCheckListItem( parent, text, CheckBox )
00270 {
00271 }
00272
00273 void ExtensionItem::setService( const KService::Ptr &ptr )
00274 {
00275 mPtr = ptr;
00276 }
00277
00278 bool ExtensionItem::configWidgetAvailable() const
00279 {
00280 KLibFactory *factory = KLibLoader::self()->factory( mPtr->library().latin1() );
00281 if ( !factory )
00282 return false;
00283
00284 KAB::ExtensionFactory *extensionFactory = static_cast<KAB::ExtensionFactory*>( factory );
00285 if ( !extensionFactory )
00286 return false;
00287
00288 return extensionFactory->configureWidgetAvailable();
00289 }
00290
00291 KAB::ExtensionFactory *ExtensionItem::factory() const
00292 {
00293 KLibFactory *factory = KLibLoader::self()->factory( mPtr->library().latin1() );
00294 if ( !factory )
00295 return 0;
00296
00297 return static_cast<KAB::ExtensionFactory*>( factory );
00298 }
00299
00300 QString ExtensionItem::text( int column ) const
00301 {
00302 if ( column == 0 )
00303 return mPtr->name();
00304 else if ( column == 1 )
00305 return mPtr->comment();
00306 else
00307 return QString::null;
00308 }
00309
00310 #include "kabconfigwidget.moc"