00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021 #include <qgroupbox.h>
00022 #include <qinputdialog.h>
00023 #include <qlabel.h>
00024 #include <qlayout.h>
00025
00026 #include <kapplication.h>
00027 #include <kcombobox.h>
00028 #include <kdebug.h>
00029 #include <klocale.h>
00030 #include <kmessagebox.h>
00031 #include <ksimpleconfig.h>
00032 #include <kstandarddirs.h>
00033 #include <kurlrequester.h>
00034 #include <kaboutdata.h>
00035
00036 #include "kcmkabc.h"
00037
00038 #include "resource.h"
00039 #include "resourceconfigdlg.h"
00040 #include "resourcefactory.h"
00041 #include "stdaddressbook.h"
00042
00043 ConfigViewItem::ConfigViewItem( QListView *parent, QString name,
00044 QString type, QString )
00045 : QObject( 0, "" ), QCheckListItem( parent, name, CheckBox )
00046 {
00047 isStandard = false;
00048 readOnly = false;
00049 setText( 1, type );
00050 }
00051
00052 void ConfigViewItem::setStandard( bool value )
00053 {
00054 setText( 2, ( value ? i18n( "yes" ) : "" ) );
00055 isStandard = value;
00056 }
00057
00058 bool ConfigViewItem::standard()
00059 {
00060 return isStandard;
00061 }
00062
00063 void ConfigViewItem::stateChange( bool )
00064 {
00065 emit changed( true );
00066 }
00067
00068 ConfigPage::ConfigPage( QWidget *parent, const char *name )
00069 : QWidget( parent, name )
00070 {
00071 setCaption( i18n( "Resource Configuration" ) );
00072
00073 QVBoxLayout *mainLayout = new QVBoxLayout( this );
00074
00075 QGroupBox *groupBox = new QGroupBox( i18n( "Resources" ), this );
00076 groupBox->setColumnLayout(0, Qt::Vertical );
00077 groupBox->layout()->setSpacing( 6 );
00078 groupBox->layout()->setMargin( 11 );
00079 QHBoxLayout *groupBoxLayout = new QHBoxLayout( groupBox->layout() );
00080
00081 mListView = new KListView( groupBox );
00082 mListView->setAllColumnsShowFocus( true );
00083 mListView->addColumn( i18n( "Name" ) );
00084 mListView->addColumn( i18n( "Type" ) );
00085 mListView->addColumn( i18n( "Standard" ) );
00086
00087
00088
00089 groupBoxLayout->addWidget( mListView );
00090
00091 KButtonBox *buttonBox = new KButtonBox( groupBox, Vertical );
00092 mAddButton = buttonBox->addButton( i18n( "&Add..." ), this, SLOT(slotAdd()) );
00093 mRemoveButton = buttonBox->addButton( i18n( "&Remove" ), this, SLOT(slotRemove()) );
00094 mRemoveButton->setEnabled( false );
00095 mEditButton = buttonBox->addButton( i18n( "&Edit..." ), this, SLOT(slotEdit()) );
00096 mEditButton->setEnabled( false );
00097 mConvertButton = buttonBox->addButton( i18n( "&Convert..." ), this, SLOT(slotConvert()) );
00098 mConvertButton->setEnabled( false );
00099 mStandardButton = buttonBox->addButton( i18n( "&Use as Standard" ), this, SLOT(slotStandard()) );
00100 mStandardButton->setEnabled( false );
00101 buttonBox->layout();
00102
00103 groupBoxLayout->addWidget( buttonBox );
00104
00105 mainLayout->addWidget( groupBox );
00106
00107 connect( mListView, SIGNAL(selectionChanged()), this, SLOT(slotSelectionChanged()) );
00108
00109 connect( mListView, SIGNAL( doubleClicked( QListViewItem *, const QPoint &, int )), this, SLOT( slotEdit()));
00110
00111 config = 0;
00112 mLastItem = 0;
00113
00114 load();
00115 }
00116
00117 void ConfigPage::load()
00118 {
00119 delete config;
00120 config = new KConfig( "kabcrc" );
00121
00122 config->setGroup( "General" );
00123
00124 QStringList keys = config->readListEntry( "ResourceKeys" );
00125 uint numActiveKeys = keys.count();
00126 keys += config->readListEntry( "PassiveResourceKeys" );
00127
00128 QString standardKey = config->readEntry( "Standard" );
00129
00130 mListView->clear();
00131
00132 uint counter = 0;
00133 bool haveStandardResource = false;
00134 for ( QStringList::Iterator it = keys.begin(); it != keys.end(); ++it ) {
00135 config->setGroup( "Resource_" + (*it) );
00136 ConfigViewItem *item = new ConfigViewItem( mListView,
00137 config->readEntry( "ResourceName" ),
00138 config->readEntry( "ResourceType" ) );
00139 connect( item, SIGNAL( changed( bool ) ), SIGNAL( changed( bool ) ) );
00140
00141 item->key = (*it);
00142 item->type = config->readEntry( "ResourceType" );
00143 item->readOnly = config->readBoolEntry( "ResourceIsReadOnly" );
00144 if ( standardKey == (*it) ) {
00145 item->setStandard( true );
00146 haveStandardResource = true;
00147 }
00148
00149 item->setOn( counter < numActiveKeys );
00150
00151 counter++;
00152 }
00153
00154 if ( mListView->childCount() == 0 ) {
00155 defaults();
00156 config->sync();
00157 } else {
00158 if ( !haveStandardResource )
00159 KMessageBox::error( this, i18n( "There is no standard resource! Please select one." ) );
00160
00161 emit changed( false );
00162 }
00163 }
00164
00165 void ConfigPage::save()
00166 {
00167 QStringList activeKeys;
00168 QStringList passiveKeys;
00169 QString standardKey;
00170
00171 config->setGroup( "General" );
00172
00173 QListViewItem *item = mListView->firstChild();
00174 while ( item != 0 ) {
00175 ConfigViewItem *configItem = dynamic_cast<ConfigViewItem*>( item );
00176
00177
00178 if ( configItem->standard() && !configItem->readOnly && configItem->isOn() )
00179 standardKey = configItem->key;
00180
00181
00182 if ( ( (QCheckListItem*)item )->isOn() )
00183 activeKeys.append( configItem->key );
00184 else
00185 passiveKeys.append( configItem->key );
00186
00187 item = item->itemBelow();
00188 }
00189
00190 config->writeEntry( "ResourceKeys", activeKeys );
00191 config->writeEntry( "PassiveResourceKeys", passiveKeys );
00192 config->writeEntry( "Standard", standardKey );
00193
00194 config->sync();
00195
00196 if ( standardKey.isEmpty() )
00197 KMessageBox::error( this, i18n( "There is no valid standard resource! Please select one which is neither read-only nor inactive." ) );
00198
00199 emit changed( false );
00200 }
00201
00202 void ConfigPage::defaults()
00203 {
00204 QStringList groups = config->groupList();
00205 QStringList::Iterator it;
00206 for ( it = groups.begin(); it != groups.end(); ++it )
00207 config->deleteGroup( (*it) );
00208
00209 QString key = KApplication::randomString( 10 );
00210 QString type = "file";
00211
00212 groups.clear();
00213 groups << key;
00214
00215 config->setGroup( "General" );
00216 config->writeEntry( "ResourceKeys", groups );
00217 config->writeEntry( "Standard", key );
00218
00219 config->setGroup( "Resource_" + key );
00220 config->writeEntry( "ResourceName", "Default" );
00221 config->writeEntry( "ResourceType", type );
00222 config->writeEntry( "ResourceIsReadOnly", false );
00223 config->writeEntry( "ResourceIsFast", true );
00224 config->writeEntry( "FileFormat", 0 );
00225 config->writeEntry( "FileName", KABC::StdAddressBook::fileName() );
00226
00227 mListView->clear();
00228
00229 ConfigViewItem *item = new ConfigViewItem( mListView, "Default", type );
00230 item->key = key;
00231 item->type = type;
00232 item->setStandard(true);
00233 item->setOn( true );
00234 connect( item, SIGNAL( changed( bool ) ), SIGNAL( changed( bool ) ) );
00235
00236 mLastItem = item;
00237
00238 emit changed( true );
00239 }
00240
00241 void ConfigPage::slotAdd()
00242 {
00243 KABC::ResourceFactory *factory = KABC::ResourceFactory::self();
00244 QString key = KApplication::randomString( 10 );
00245
00246 QStringList types = factory->resources();
00247 bool ok = false;
00248 QString type = QInputDialog::getItem( i18n( "Resource Configuration" ),
00249 i18n( "Please select type of the new resource:" ), types, 0, false, &ok, this );
00250 if ( !ok )
00251 return;
00252
00253 config->setGroup( "Resource_" + key );
00254
00255 ResourceConfigDlg dlg( this, type, config, "ResourceConfigDlg" );
00256
00257 dlg.setResourceName( type + "-resource" );
00258 dlg.setFast( true );
00259
00260 if ( dlg.exec() ) {
00261 config->writeEntry( "ResourceName", dlg.resourceName() );
00262 config->writeEntry( "ResourceType", type );
00263 config->writeEntry( "ResourceIsReadOnly", dlg.readOnly() );
00264 config->writeEntry( "ResourceIsFast", dlg.fast() );
00265
00266 ConfigViewItem *item = new ConfigViewItem( mListView, dlg.resourceName(), type );
00267 item->key = key;
00268 item->type = type;
00269 item->readOnly = dlg.readOnly();
00270 item->setOn( true );
00271 connect( item, SIGNAL( changed( bool ) ), SIGNAL( changed( bool ) ) );
00272
00273 mLastItem = item;
00274
00275
00276
00277 if ( !item->readOnly ) {
00278 bool onlyReadOnly = true;
00279 QListViewItem *it = mListView->firstChild();
00280 while ( it != 0 ) {
00281 ConfigViewItem *confIt = dynamic_cast<ConfigViewItem*>( it );
00282 if ( !confIt->readOnly && confIt != item )
00283 onlyReadOnly = false;
00284
00285 it = it->itemBelow();
00286 }
00287
00288 if ( onlyReadOnly )
00289 item->setStandard( true );
00290 }
00291
00292 emit changed( true );
00293 } else {
00294 config->deleteGroup( "Resource_" + key );
00295 }
00296 }
00297
00298 void ConfigPage::slotRemove()
00299 {
00300 QListViewItem *item = mListView->currentItem();
00301 ConfigViewItem *confItem = dynamic_cast<ConfigViewItem*>( item );
00302
00303 if ( !confItem )
00304 return;
00305
00306 if ( confItem->standard() ) {
00307 KMessageBox::error( this, i18n( "You cannot remove your standard resource! Please select a new standard resource first." ) );
00308 return;
00309 }
00310
00311 config->deleteGroup( "Resource_" + confItem->key );
00312
00313 if ( item == mLastItem )
00314 mLastItem = 0;
00315
00316 mListView->takeItem( item );
00317 delete item;
00318
00319 emit changed( true );
00320 }
00321
00322 void ConfigPage::slotEdit()
00323 {
00324 QListViewItem *item = mListView->currentItem();
00325 ConfigViewItem *configItem = dynamic_cast<ConfigViewItem*>( item );
00326 if ( !configItem )
00327 return;
00328
00329 QString key = configItem->key;
00330 QString type = configItem->type;
00331
00332 config->setGroup( "Resource_" + key );
00333
00334 ResourceConfigDlg dlg( this, type, config, "ResourceConfigDlg" );
00335
00336 dlg.setResourceName( config->readEntry( "ResourceName" ) );
00337 dlg.setReadOnly( config->readBoolEntry( "ResourceIsReadOnly" ) );
00338 dlg.setFast( config->readBoolEntry( "ResourceIsFast" ) );
00339 dlg.setEditMode( true );
00340
00341 if ( dlg.exec() ) {
00342 config->writeEntry( "ResourceName", dlg.resourceName() );
00343 config->writeEntry( "ResourceType", type );
00344 config->writeEntry( "ResourceIsReadOnly", dlg.readOnly() );
00345 config->writeEntry( "ResourceIsFast", dlg.fast() );
00346
00347 configItem->setText( 0, dlg.resourceName() );
00348 configItem->setText( 1, type );
00349 configItem->readOnly = dlg.readOnly();
00350
00351 if ( configItem->standard() && configItem->readOnly ) {
00352 KMessageBox::error( this, i18n( "You cannot use a read-only resource as standard!" ) );
00353 configItem->setStandard( false );
00354 }
00355
00356 emit changed( true );
00357 }
00358 }
00359
00360 void ConfigPage::slotConvert()
00361 {
00362 QListViewItem *item = mListView->currentItem();
00363 QListViewItem *oldItem = item;
00364 ConfigViewItem *oldConfigItem = dynamic_cast<ConfigViewItem*>( item );
00365 if ( !oldConfigItem )
00366 return;
00367
00368 bool isStandard = oldConfigItem->standard();
00369
00370 KABC::ResourceFactory *factory = KABC::ResourceFactory::self();
00371 KABC::AddressBook ab;
00372
00373
00374 int numItems = mListView->childCount();
00375 slotAdd();
00376 if ( numItems == mListView->childCount() || mLastItem == 0 )
00377 return;
00378
00379
00380 QString oldKey = oldConfigItem->key;
00381 QString oldType = oldConfigItem->type;
00382
00383 config->setGroup( "Resource_" + oldKey );
00384 KABC::Resource *oldResource = factory->resource( oldType, &ab, config );
00385 if ( !oldResource ) {
00386 KMessageBox::error( this, i18n( "Unable to create resource from type '%1'." ).arg( oldType ) );
00387 mListView->takeItem( mLastItem );
00388 delete mLastItem;
00389 mLastItem = 0;
00390 return;
00391 }
00392
00393 if ( !ab.addResource( oldResource ) ) {
00394 KMessageBox::error( this, i18n( "Unable to add resource '%1' to address book." ).arg( oldResource->name() ) );
00395 delete oldResource;
00396 mListView->takeItem( mLastItem );
00397 delete mLastItem;
00398 mLastItem = 0;
00399 return;
00400 }
00401
00402
00403 ab.load();
00404
00405
00406 ab.removeResource( oldResource );
00407
00408
00409 QString newKey, newType;
00410
00411 ConfigViewItem *newConfigItem = dynamic_cast<ConfigViewItem*>( mLastItem );
00412 newConfigItem->setStandard( isStandard );
00413 newType = newConfigItem->type;
00414 newKey = newConfigItem->key;
00415
00416 config->setGroup( "Resource_" + newKey );
00417 KABC::Resource *newResource = factory->resource( newType, &ab, config );
00418 if ( !newResource ) {
00419 KMessageBox::error( this, i18n( "Unable to create resource from type '%1'." ).arg( newType ) );
00420 mListView->takeItem( mLastItem );
00421 delete mLastItem;
00422 mLastItem = 0;
00423 return;
00424 }
00425
00426 if ( !ab.addResource( newResource ) ) {
00427 KMessageBox::error( this, i18n( "Unable to add resource '%1' to address book." ).arg( newResource->name() ) );
00428 delete newResource;
00429 mListView->takeItem( mLastItem );
00430 delete mLastItem;
00431 mLastItem = 0;
00432 return;
00433 }
00434
00435 KABC::AddressBook::Iterator it;
00436 for ( it = ab.begin(); it != ab.end(); ++it ) {
00437 (*it).setResource( newResource );
00438 (*it).setChanged( true );
00439 }
00440
00441 KABC::Ticket *ticket = ab.requestSaveTicket( newResource );
00442 ab.save( ticket );
00443
00444
00445 config->deleteGroup( "Resource_" + oldKey );
00446 mListView->takeItem( oldItem );
00447 delete oldItem;
00448
00449 emit changed( true );
00450 return;
00451 }
00452
00453 void ConfigPage::slotStandard()
00454 {
00455 ConfigViewItem *item = dynamic_cast<ConfigViewItem*>( mListView->currentItem() );
00456 if ( !item )
00457 return;
00458
00459 if ( item->readOnly ) {
00460 KMessageBox::error( this, i18n( "You cannot use a read-only resource as standard!" ) );
00461 return;
00462 }
00463
00464 if ( !item->isOn() ) {
00465 KMessageBox::error( this, i18n( "You cannot use an inactive resource as standard!" ) );
00466 return;
00467 }
00468
00469 QListViewItem *it = mListView->firstChild();
00470 while ( it != 0 ) {
00471 ConfigViewItem *configItem = dynamic_cast<ConfigViewItem*>( it );
00472 if ( configItem->standard() )
00473 configItem->setStandard( false );
00474 it = it->itemBelow();
00475 }
00476
00477 item->setStandard( true );
00478 }
00479
00480 void ConfigPage::slotSelectionChanged()
00481 {
00482 bool state = ( mListView->currentItem() != 0 );
00483
00484 mRemoveButton->setEnabled( state );
00485 mEditButton->setEnabled( state );
00486 mConvertButton->setEnabled( state );
00487 mStandardButton->setEnabled( state );
00488 }
00489
00490 KCMkabc::KCMkabc( QWidget *parent, const char *name )
00491 : KCModule( parent, name )
00492 {
00493 QVBoxLayout *layout = new QVBoxLayout( this );
00494 mConfigPage = new ConfigPage( this );
00495 layout->addWidget( mConfigPage );
00496 connect( mConfigPage, SIGNAL( changed( bool ) ), SIGNAL( changed( bool ) ) );
00497 }
00498
00499 void KCMkabc::load()
00500 {
00501 mConfigPage->load();
00502 }
00503
00504 void KCMkabc::save()
00505 {
00506 mConfigPage->save();
00507 }
00508
00509 void KCMkabc::defaults()
00510 {
00511 mConfigPage->defaults();
00512 }
00513
00514 const KAboutData* KCMkabc::aboutData() const
00515 {
00516 KAboutData *about =
00517 new KAboutData(I18N_NOOP("kcmkabc"), I18N_NOOP("Address book configuration module"),
00518 0, 0, KAboutData::License_GPL,
00519 I18N_NOOP("(c), 2002 Tobias Koenig"));
00520
00521 about->addAuthor("Tobias Koenig",0 , "tokoe@kde.org");
00522
00523 return about;
00524 }
00525
00526
00527 extern "C"
00528 {
00529 KCModule *create_kabc( QWidget *parent, const char * ) {
00530 return new KCMkabc( parent, "kcmkabc" );
00531 }
00532 }
00533
00534 #include "kcmkabc.moc"