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