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 <qgroupbox.h>
00025 #include <qlabel.h>
00026 #include <qlayout.h>
00027
00028 #include <kapplication.h>
00029 #include <kcombobox.h>
00030 #include <kdebug.h>
00031 #include <klocale.h>
00032 #include <kmessagebox.h>
00033 #include <ksimpleconfig.h>
00034 #include <kstandarddirs.h>
00035 #include <kurlrequester.h>
00036 #include <klistview.h>
00037 #include <kbuttonbox.h>
00038 #include <ktrader.h>
00039 #include <kinputdialog.h>
00040
00041 #include "resource.h"
00042 #include "configdialog.h"
00043
00044 #include "configpage.h"
00045
00046 namespace KRES {
00047
00048 ResourcePageInfo::ResourcePageInfo() : KShared() {
00049 mManager = 0L;
00050 mConfig = 0L;
00051 }
00052
00053 ResourcePageInfo::~ResourcePageInfo() {
00054
00055 mManager = 0L;
00056
00057 mConfig = 0L;
00058 }
00059
00060
00061 class ConfigViewItem : public QCheckListItem
00062 {
00063 public:
00064 ConfigViewItem( QListView *parent, Resource* resource ) :
00065 QCheckListItem( parent, resource->resourceName(), CheckBox ),
00066 mResource( resource ),
00067 mIsStandard( false )
00068 {
00069 setText( 1, mResource->type() );
00070 setOn( mResource->isActive() );
00071 }
00072
00073 void setStandard( bool value )
00074 {
00075 setText( 2, ( value ? i18n( "Yes" ) : QString::null ) );
00076 mIsStandard = value;
00077 }
00078
00079 bool standard() const { return mIsStandard; }
00080 bool readOnly() const { return mResource->readOnly(); }
00081
00082 Resource *resource() { return mResource; }
00083
00084 void updateItem()
00085 {
00086 setOn( mResource->isActive() );
00087 setText( 0, mResource->resourceName() );
00088 setText( 1, mResource->type() );
00089 setText( 2, mIsStandard ? i18n( "Yes" ) : QString::null );
00090 }
00091
00092 private:
00093 Resource* mResource;
00094
00095 bool mIsStandard;
00096 };
00097
00098 ConfigPage::ConfigPage( QWidget *parent, const char *name )
00099 : QWidget( parent, name ),
00100 mCurrentManager( 0 ),
00101 mCurrentConfig( 0 )
00102 {
00103 setCaption( i18n( "Resource Configuration" ) );
00104
00105 QVBoxLayout *mainLayout = new QVBoxLayout( this );
00106
00107 QGroupBox *groupBox = new QGroupBox( i18n( "Resources" ), this );
00108 groupBox->setColumnLayout(0, Qt::Vertical );
00109 groupBox->layout()->setSpacing( 6 );
00110 groupBox->layout()->setMargin( 11 );
00111 QGridLayout *groupBoxLayout = new QGridLayout( groupBox->layout(), 2, 2 );
00112
00113 mFamilyCombo = new KComboBox( false, groupBox );
00114 groupBoxLayout->addMultiCellWidget( mFamilyCombo, 0, 0, 0, 1 );
00115
00116 mListView = new KListView( groupBox );
00117 mListView->setAllColumnsShowFocus( true );
00118 mListView->addColumn( i18n( "Name" ) );
00119 mListView->addColumn( i18n( "Type" ) );
00120 mListView->addColumn( i18n( "Standard" ) );
00121
00122 groupBoxLayout->addWidget( mListView, 1, 0 );
00123 connect( mListView, SIGNAL( doubleClicked( QListViewItem *, const QPoint &, int ) ), this, SLOT( slotEdit() ) );
00124 KButtonBox *buttonBox = new KButtonBox( groupBox, Vertical );
00125 mAddButton = buttonBox->addButton( i18n( "&Add..." ), this, SLOT(slotAdd()) );
00126 mRemoveButton = buttonBox->addButton( i18n( "&Remove" ), this, SLOT(slotRemove()) );
00127 mRemoveButton->setEnabled( false );
00128 mEditButton = buttonBox->addButton( i18n( "&Edit..." ), this, SLOT(slotEdit()) );
00129 mEditButton->setEnabled( false );
00130 mStandardButton = buttonBox->addButton( i18n( "&Use as Standard" ), this, SLOT(slotStandard()) );
00131 mStandardButton->setEnabled( false );
00132 buttonBox->layout();
00133
00134 groupBoxLayout->addWidget( buttonBox, 1, 1 );
00135
00136 mainLayout->addWidget( groupBox );
00137
00138 connect( mFamilyCombo, SIGNAL( activated( int ) ),
00139 SLOT( slotFamilyChanged( int ) ) );
00140 connect( mListView, SIGNAL( selectionChanged() ),
00141 SLOT( slotSelectionChanged() ) );
00142 connect( mListView, SIGNAL( clicked( QListViewItem * ) ),
00143 SLOT( slotItemClicked( QListViewItem * ) ) );
00144
00145 mLastItem = 0;
00146
00147 mConfig = new KConfig( "kcmkresourcesrc" );
00148 mConfig->setGroup( "General" );
00149
00150 load();
00151 }
00152
00153 ConfigPage::~ConfigPage()
00154 {
00155 QValueList<KSharedPtr<ResourcePageInfo> >::Iterator it;
00156 for ( it = mInfoMap.begin(); it != mInfoMap.end(); ++it ) {
00157 (*it)->mManager->removeObserver( this );
00158 }
00159
00160 mConfig->writeEntry( "CurrentFamily", mFamilyCombo->currentItem() );
00161 delete mConfig;
00162 mConfig = 0;
00163 }
00164
00165 void ConfigPage::load()
00166 {
00167 kdDebug(5650) << "ConfigPage::load()" << endl;
00168
00169 mListView->clear();
00170
00171 KTrader::OfferList plugins = KTrader::self()->query( "KResources/Plugin" );
00172 KTrader::OfferList::ConstIterator it;
00173 for ( it = plugins.begin(); it != plugins.end(); ++it ) {
00174 QVariant tmp = (*it)->property( "X-KDE-ResourceFamily" );
00175 QString family = tmp.toString();
00176 if ( !family.isEmpty() ) {
00177 if ( !mFamilyMap.contains( family ) ) {
00178 mCurrentManager = new Manager<Resource>( family );
00179 if ( mCurrentManager ) {
00180 mFamilyMap.append( family );
00181 mCurrentManager->addObserver( this );
00182
00183 ResourcePageInfo *info = new ResourcePageInfo;
00184 info->mManager = mCurrentManager;
00185 info->mConfig = new KConfig( KRES::ManagerImpl::defaultConfigFile( family ) );
00186 info->mManager->readConfig( info->mConfig );
00187
00188 mInfoMap.append( KSharedPtr<ResourcePageInfo>(info) );
00189 }
00190 }
00191 }
00192 }
00193 mCurrentManager = 0;
00194
00195 mFamilyCombo->insertStringList( mFamilyMap );
00196
00197 int currentFamily = mConfig->readNumEntry( "CurrentFamily", 0 );
00198 mFamilyCombo->setCurrentItem( currentFamily );
00199 slotFamilyChanged( currentFamily );
00200 emit changed( false );
00201 }
00202
00203 void ConfigPage::save()
00204 {
00205 saveResourceSettings();
00206
00207 QValueList<KSharedPtr<ResourcePageInfo> >::Iterator it;
00208 for ( it = mInfoMap.begin(); it != mInfoMap.end(); ++it )
00209 (*it)->mManager->writeConfig( (*it)->mConfig );
00210
00211 emit changed( false );
00212 }
00213
00214 void ConfigPage::defaults()
00215 {
00216 }
00217
00218 void ConfigPage::slotFamilyChanged( int pos )
00219 {
00220 if ( pos < 0 || pos >= (int)mFamilyMap.count() )
00221 return;
00222
00223 saveResourceSettings();
00224
00225 mFamily = mFamilyMap[ pos ];
00226
00227 mCurrentManager = mInfoMap[ pos ]->mManager;
00228 mCurrentConfig = mInfoMap[ pos ]->mConfig;
00229
00230 if ( !mCurrentManager )
00231 kdDebug(5650) << "ERROR: cannot create ResourceManager<Resource>( mFamily )" << endl;
00232
00233 mListView->clear();
00234
00235 if ( mCurrentManager->isEmpty() )
00236 defaults();
00237
00238 Resource *standardResource = mCurrentManager->standardResource();
00239
00240 Manager<Resource>::Iterator it;
00241 for ( it = mCurrentManager->begin(); it != mCurrentManager->end(); ++it ) {
00242 ConfigViewItem *item = new ConfigViewItem( mListView, *it );
00243 if ( *it == standardResource )
00244 item->setStandard( true );
00245 }
00246
00247 if ( mListView->childCount() == 0 ) {
00248 defaults();
00249 emit changed( true );
00250 mCurrentManager->writeConfig( mCurrentConfig );
00251 } else {
00252 if ( !standardResource )
00253 KMessageBox::sorry( this, i18n( "There is no standard resource! Please select one." ) );
00254
00255 emit changed( false );
00256 }
00257 }
00258
00259 void ConfigPage::slotAdd()
00260 {
00261 if ( !mCurrentManager )
00262 return;
00263
00264 QStringList types = mCurrentManager->resourceTypeNames();
00265 QStringList descs = mCurrentManager->resourceTypeDescriptions();
00266 bool ok = false;
00267 QString desc = KInputDialog::getItem( i18n( "Resource Configuration" ),
00268 i18n( "Please select type of the new resource:" ), descs,
00269 0, false, &ok, this );
00270 if ( !ok )
00271 return;
00272
00273 QString type = types[ descs.findIndex( desc ) ];
00274
00275
00276 Resource *resource = mCurrentManager->createResource( type );
00277 if ( !resource ) {
00278 KMessageBox::error( this, i18n("Unable to create resource of type '%1'.")
00279 .arg( type ) );
00280 return;
00281 }
00282
00283 resource->setResourceName( type + "-resource" );
00284
00285 ConfigDialog dlg( this, mFamily, resource, "KRES::ConfigDialog" );
00286
00287 if ( dlg.exec() ) {
00288 mCurrentManager->add( resource );
00289
00290 ConfigViewItem *item = new ConfigViewItem( mListView, resource );
00291
00292 mLastItem = item;
00293
00294
00295
00296 if ( !resource->readOnly() ) {
00297 bool onlyReadOnly = true;
00298 QListViewItem *it = mListView->firstChild();
00299 while ( it != 0 ) {
00300 ConfigViewItem *confIt = static_cast<ConfigViewItem*>( it );
00301 if ( !confIt->readOnly() && confIt != item )
00302 onlyReadOnly = false;
00303
00304 it = it->itemBelow();
00305 }
00306
00307 if ( onlyReadOnly )
00308 item->setStandard( true );
00309 }
00310
00311 emit changed( true );
00312 } else {
00313 delete resource;
00314 resource = 0;
00315 }
00316 }
00317
00318 void ConfigPage::slotRemove()
00319 {
00320 if ( !mCurrentManager )
00321 return;
00322
00323 QListViewItem *item = mListView->currentItem();
00324 ConfigViewItem *confItem = static_cast<ConfigViewItem*>( item );
00325
00326 if ( !confItem )
00327 return;
00328
00329 if ( confItem->standard() ) {
00330 KMessageBox::sorry( this, i18n( "You cannot remove your standard resource! Please select a new standard resource first." ) );
00331 return;
00332 }
00333
00334 mCurrentManager->remove( confItem->resource() );
00335
00336 if ( item == mLastItem )
00337 mLastItem = 0;
00338
00339 mListView->takeItem( item );
00340 delete item;
00341
00342 emit changed( true );
00343 }
00344
00345 void ConfigPage::slotEdit()
00346 {
00347 if ( !mCurrentManager )
00348 return;
00349
00350 QListViewItem *item = mListView->currentItem();
00351 ConfigViewItem *configItem = static_cast<ConfigViewItem*>( item );
00352 if ( !configItem )
00353 return;
00354
00355 Resource *resource = configItem->resource();
00356
00357 ConfigDialog dlg( this, mFamily, resource, "KRES::ConfigDialog" );
00358
00359 if ( dlg.exec() ) {
00360 configItem->setText( 0, resource->resourceName() );
00361 configItem->setText( 1, resource->type() );
00362
00363 if ( configItem->standard() && configItem->readOnly() ) {
00364 KMessageBox::sorry( this, i18n( "You cannot use a read-only resource as standard!" ) );
00365 configItem->setStandard( false );
00366 }
00367
00368 mCurrentManager->change( resource );
00369 emit changed( true );
00370 }
00371 }
00372
00373 void ConfigPage::slotStandard()
00374 {
00375 if ( !mCurrentManager )
00376 return;
00377
00378 ConfigViewItem *item = static_cast<ConfigViewItem*>( mListView->currentItem() );
00379 if ( !item )
00380 return;
00381
00382 if ( item->readOnly() ) {
00383 KMessageBox::sorry( this, i18n( "You cannot use a read-only resource as standard!" ) );
00384 return;
00385 }
00386
00387 if ( !item->isOn() ) {
00388 KMessageBox::sorry( this, i18n( "You cannot use an inactive resource as standard!" ) );
00389 return;
00390 }
00391
00392 QListViewItem *it = mListView->firstChild();
00393 while ( it != 0 ) {
00394 ConfigViewItem *configItem = static_cast<ConfigViewItem*>( it );
00395 if ( configItem->standard() )
00396 configItem->setStandard( false );
00397 it = it->itemBelow();
00398 }
00399
00400 item->setStandard( true );
00401 mCurrentManager->setStandardResource( item->resource() );
00402
00403 emit changed( true );
00404 }
00405
00406 void ConfigPage::slotSelectionChanged()
00407 {
00408 bool state = ( mListView->currentItem() != 0 );
00409
00410 mRemoveButton->setEnabled( state );
00411 mEditButton->setEnabled( state );
00412 mStandardButton->setEnabled( state );
00413 }
00414
00415 void ConfigPage::resourceAdded( Resource *resource )
00416 {
00417 kdDebug(5650) << "ConfigPage::resourceAdded( " << resource->resourceName()
00418 << " )" << endl;
00419
00420 ConfigViewItem *item = new ConfigViewItem( mListView, resource );
00421
00422 item->setOn( resource->isActive() );
00423
00424 mLastItem = item;
00425
00426 emit changed( true );
00427 }
00428
00429 void ConfigPage::resourceModified( Resource *resource )
00430 {
00431 kdDebug(5650) << "ConfigPage::resourceModified( " << resource->resourceName()
00432 << " )" << endl;
00433 ConfigViewItem *item = findItem( resource );
00434 if ( !item ) return;
00435
00436
00437
00438 item->updateItem();
00439 }
00440
00441 void ConfigPage::resourceDeleted( Resource *resource )
00442 {
00443 kdDebug(5650) << "ConfigPage::resourceDeleted( " << resource->resourceName()
00444 << " )" << endl;
00445
00446 ConfigViewItem *item = findItem( resource );
00447 if ( !item ) return;
00448
00449 delete item;
00450 }
00451
00452 ConfigViewItem *ConfigPage::findItem( Resource *resource )
00453 {
00454 QListViewItem *i;
00455 for( i = mListView->firstChild(); i; i = i->nextSibling() ) {
00456 ConfigViewItem *item = static_cast<ConfigViewItem *>( i );
00457 if ( item->resource() == resource ) return item;
00458 }
00459 return 0;
00460 }
00461
00462 void ConfigPage::slotItemClicked( QListViewItem *item )
00463 {
00464 ConfigViewItem *configItem = static_cast<ConfigViewItem *>( item );
00465 if ( !configItem ) return;
00466
00467 if ( configItem->standard() && !configItem->isOn() ) {
00468 KMessageBox::sorry( this, i18n( "You cannot deactivate the standard resource. Choose another standard resource first." ) );
00469 configItem->setOn( true );
00470 return;
00471 }
00472
00473 if ( configItem->isOn() != configItem->resource()->isActive() ) {
00474 emit changed( true );
00475 }
00476 }
00477
00478 void ConfigPage::saveResourceSettings()
00479 {
00480 if ( mCurrentManager ) {
00481 QListViewItem *item = mListView->firstChild();
00482 while ( item ) {
00483 ConfigViewItem *configItem = static_cast<ConfigViewItem *>( item );
00484
00485
00486 if ( configItem->standard() && !configItem->readOnly() &&
00487 configItem->isOn() )
00488 mCurrentManager->setStandardResource( configItem->resource() );
00489
00490
00491 configItem->resource()->setActive( configItem->isOn() );
00492
00493 item = item->nextSibling();
00494 }
00495 mCurrentManager->writeConfig( mCurrentConfig );
00496
00497 if ( !mCurrentManager->standardResource() )
00498 KMessageBox::sorry( this, i18n( "There is no valid standard resource! Please select one which is neither read-only nor inactive." ) );
00499 }
00500 }
00501
00502 }
00503
00504 #include "configpage.moc"
00505