You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
536 lines
15 KiB
536 lines
15 KiB
/*
|
|
This file is part of libkresources.
|
|
|
|
Copyright (c) 2002 Tobias Koenig <tokoe@kde.org>
|
|
Copyright (c) 2002 Jan-Pascal van Best <janpascal@vanbest.org>
|
|
Copyright (c) 2003 Cornelius Schumacher <schumacher@kde.org>
|
|
|
|
This library is free software; you can redistribute it and/or
|
|
modify it under the terms of the GNU Library General Public
|
|
License as published by the Free Software Foundation; either
|
|
version 2 of the License, or (at your option) any later version.
|
|
|
|
This library is distributed in the hope that it will be useful,
|
|
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
|
Library General Public License for more details.
|
|
|
|
You should have received a copy of the GNU Library General Public License
|
|
along with this library; see the file COPYING.LIB. If not, write to
|
|
the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
|
|
Boston, MA 02110-1301, USA.
|
|
*/
|
|
|
|
#include <tqgroupbox.h>
|
|
#include <tqlabel.h>
|
|
#include <tqlayout.h>
|
|
|
|
#include <kapplication.h>
|
|
#include <kcombobox.h>
|
|
#include <kdebug.h>
|
|
#include <klocale.h>
|
|
#include <kmessagebox.h>
|
|
#include <ksimpleconfig.h>
|
|
#include <kstandarddirs.h>
|
|
#include <kurlrequester.h>
|
|
#include <klistview.h>
|
|
#include <kbuttonbox.h>
|
|
#include <ktrader.h>
|
|
#include <kinputdialog.h>
|
|
|
|
#include "resource.h"
|
|
#include "configdialog.h"
|
|
|
|
#include "configpage.h"
|
|
|
|
namespace KRES {
|
|
|
|
ResourcePageInfo::ResourcePageInfo() : KShared() {
|
|
mManager = 0L;
|
|
mConfig = 0L;
|
|
}
|
|
|
|
ResourcePageInfo::~ResourcePageInfo() {
|
|
//delete mManager;
|
|
mManager = 0L;
|
|
//delete mConfig;
|
|
mConfig = 0L;
|
|
}
|
|
|
|
|
|
class ConfigViewItem : public QCheckListItem
|
|
{
|
|
public:
|
|
ConfigViewItem( TQListView *parent, Resource* resource ) :
|
|
TQCheckListItem( parent, resource->resourceName(), CheckBox ),
|
|
mResource( resource ),
|
|
mIsStandard( false )
|
|
{
|
|
setText( 1, mResource->type() );
|
|
setOn( mResource->isActive() );
|
|
}
|
|
|
|
void setStandard( bool value )
|
|
{
|
|
setText( 2, ( value ? i18n( "Yes" ) : TQString::null ) );
|
|
mIsStandard = value;
|
|
}
|
|
|
|
bool standard() const { return mIsStandard; }
|
|
bool readOnly() const { return mResource->readOnly(); }
|
|
|
|
Resource *resource() { return mResource; }
|
|
|
|
void updateItem()
|
|
{
|
|
setOn( mResource->isActive() );
|
|
setText( 0, mResource->resourceName() );
|
|
setText( 1, mResource->type() );
|
|
setText( 2, mIsStandard ? i18n( "Yes" ) : TQString::null );
|
|
}
|
|
|
|
private:
|
|
Resource* mResource;
|
|
|
|
bool mIsStandard;
|
|
};
|
|
|
|
ConfigPage::ConfigPage( TQWidget *parent, const char *name )
|
|
: TQWidget( parent, name ),
|
|
mCurrentManager( 0 ),
|
|
mCurrentConfig( 0 )
|
|
{
|
|
setCaption( i18n( "Resource Configuration" ) );
|
|
|
|
TQVBoxLayout *mainLayout = new TQVBoxLayout( this );
|
|
|
|
TQGroupBox *groupBox = new TQGroupBox( i18n( "Resources" ), this );
|
|
groupBox->setColumnLayout(0, Qt::Vertical );
|
|
groupBox->tqlayout()->setSpacing( 6 );
|
|
groupBox->tqlayout()->setMargin( 11 );
|
|
TQGridLayout *groupBoxLayout = new TQGridLayout( groupBox->tqlayout(), 2, 2 );
|
|
|
|
mFamilyCombo = new KComboBox( false, groupBox );
|
|
groupBoxLayout->addMultiCellWidget( mFamilyCombo, 0, 0, 0, 1 );
|
|
|
|
mListView = new KListView( groupBox );
|
|
mListView->setAllColumnsShowFocus( true );
|
|
mListView->setFullWidth( true );
|
|
mListView->addColumn( i18n( "Name" ) );
|
|
mListView->addColumn( i18n( "Type" ) );
|
|
mListView->addColumn( i18n( "Standard" ) );
|
|
|
|
groupBoxLayout->addWidget( mListView, 1, 0 );
|
|
connect( mListView, TQT_SIGNAL( doubleClicked( TQListViewItem *, const TQPoint &, int ) ), this, TQT_SLOT( slotEdit() ) );
|
|
KButtonBox *buttonBox = new KButtonBox( groupBox, Vertical );
|
|
mAddButton = buttonBox->addButton( i18n( "&Add..." ), this, TQT_SLOT(slotAdd()) );
|
|
mRemoveButton = buttonBox->addButton( i18n( "&Remove" ), this, TQT_SLOT(slotRemove()) );
|
|
mRemoveButton->setEnabled( false );
|
|
mEditButton = buttonBox->addButton( i18n( "&Edit..." ), this, TQT_SLOT(slotEdit()) );
|
|
mEditButton->setEnabled( false );
|
|
mStandardButton = buttonBox->addButton( i18n( "&Use as Standard" ), this, TQT_SLOT(slotStandard()) );
|
|
mStandardButton->setEnabled( false );
|
|
buttonBox->tqlayout();
|
|
|
|
groupBoxLayout->addWidget( buttonBox, 1, 1 );
|
|
|
|
mainLayout->addWidget( groupBox );
|
|
|
|
connect( mFamilyCombo, TQT_SIGNAL( activated( int ) ),
|
|
TQT_SLOT( slotFamilyChanged( int ) ) );
|
|
connect( mListView, TQT_SIGNAL( selectionChanged() ),
|
|
TQT_SLOT( slotSelectionChanged() ) );
|
|
connect( mListView, TQT_SIGNAL( clicked( TQListViewItem * ) ),
|
|
TQT_SLOT( slotItemClicked( TQListViewItem * ) ) );
|
|
|
|
mLastItem = 0;
|
|
|
|
mConfig = new KConfig( "kcmkresourcesrc" );
|
|
mConfig->setGroup( "General" );
|
|
|
|
load();
|
|
}
|
|
|
|
ConfigPage::~ConfigPage()
|
|
{
|
|
TQValueList<KSharedPtr<ResourcePageInfo> >::Iterator it;
|
|
for ( it = mInfoMap.begin(); it != mInfoMap.end(); ++it ) {
|
|
(*it)->mManager->removeObserver( this );
|
|
}
|
|
|
|
mConfig->writeEntry( "CurrentFamily", mFamilyCombo->currentItem() );
|
|
delete mConfig;
|
|
mConfig = 0;
|
|
}
|
|
|
|
void ConfigPage::load()
|
|
{
|
|
kdDebug(5650) << "ConfigPage::load()" << endl;
|
|
|
|
mListView->clear();
|
|
mFamilyMap.clear();
|
|
mInfoMap.clear();
|
|
TQStringList familyDisplayNames;
|
|
|
|
// KDE-3.3 compatibility code: get families from the plugins
|
|
TQStringList compatFamilyNames;
|
|
const KTrader::OfferList plugins = KTrader::self()->query( "KResources/Plugin" );
|
|
KTrader::OfferList::ConstIterator it = plugins.begin();
|
|
KTrader::OfferList::ConstIterator end = plugins.end();
|
|
for ( ; it != end; ++it ) {
|
|
const TQString family = (*it)->property( "X-KDE-ResourceFamily" ).toString();
|
|
if ( compatFamilyNames.tqfind( family ) == compatFamilyNames.end() )
|
|
compatFamilyNames.append( family );
|
|
}
|
|
|
|
const KTrader::OfferList managers = KTrader::self()->query( "KResources/Manager" );
|
|
KTrader::OfferList::ConstIterator m_it;
|
|
for( m_it = managers.begin(); m_it != managers.end(); ++m_it ) {
|
|
TQString displayName = (*m_it)->property( "Name" ).toString();
|
|
familyDisplayNames.append( displayName );
|
|
TQString family = (*m_it)->property( "X-KDE-ResourceFamily" ).toString();
|
|
if ( !family.isEmpty() ) {
|
|
compatFamilyNames.remove( family );
|
|
mFamilyMap.append( family );
|
|
loadManager( family );
|
|
}
|
|
}
|
|
|
|
// Rest of the kde-3.3 compat code
|
|
TQStringList::ConstIterator cfit = compatFamilyNames.begin();
|
|
for ( ; cfit != compatFamilyNames.end(); ++cfit ) {
|
|
mFamilyMap.append( *cfit );
|
|
familyDisplayNames.append( *cfit );
|
|
loadManager( *cfit );
|
|
}
|
|
|
|
mCurrentManager = 0;
|
|
|
|
mFamilyCombo->clear();
|
|
mFamilyCombo->insertStringList( familyDisplayNames );
|
|
|
|
int currentFamily = mConfig->readNumEntry( "CurrentFamily", 0 );
|
|
mFamilyCombo->setCurrentItem( currentFamily );
|
|
slotFamilyChanged( currentFamily );
|
|
emit changed( false );
|
|
}
|
|
|
|
void ConfigPage::loadManager( const TQString& family )
|
|
{
|
|
mCurrentManager = new Manager<Resource>( family );
|
|
if ( mCurrentManager ) {
|
|
mCurrentManager->addObserver( this );
|
|
|
|
ResourcePageInfo *info = new ResourcePageInfo;
|
|
info->mManager = mCurrentManager;
|
|
info->mConfig = new KConfig( KRES::ManagerImpl::defaultConfigFile( family ) );
|
|
info->mManager->readConfig( info->mConfig );
|
|
|
|
mInfoMap.append( KSharedPtr<ResourcePageInfo>(info) );
|
|
}
|
|
}
|
|
|
|
void ConfigPage::save()
|
|
{
|
|
saveResourceSettings();
|
|
|
|
TQValueList<KSharedPtr<ResourcePageInfo> >::Iterator it;
|
|
for ( it = mInfoMap.begin(); it != mInfoMap.end(); ++it )
|
|
(*it)->mManager->writeConfig( (*it)->mConfig );
|
|
|
|
emit changed( false );
|
|
}
|
|
|
|
void ConfigPage::defaults()
|
|
{
|
|
}
|
|
|
|
void ConfigPage::slotFamilyChanged( int pos )
|
|
{
|
|
if ( pos < 0 || pos >= (int)mFamilyMap.count() )
|
|
return;
|
|
|
|
saveResourceSettings();
|
|
|
|
mFamily = mFamilyMap[ pos ];
|
|
|
|
mCurrentManager = mInfoMap[ pos ]->mManager;
|
|
mCurrentConfig = mInfoMap[ pos ]->mConfig;
|
|
|
|
if ( !mCurrentManager )
|
|
kdDebug(5650) << "ERROR: cannot create ResourceManager<Resource>( mFamily )" << endl;
|
|
|
|
mListView->clear();
|
|
|
|
if ( mCurrentManager->isEmpty() )
|
|
defaults();
|
|
|
|
Resource *standardResource = mCurrentManager->standardResource();
|
|
|
|
Manager<Resource>::Iterator it;
|
|
for ( it = mCurrentManager->begin(); it != mCurrentManager->end(); ++it ) {
|
|
ConfigViewItem *item = new ConfigViewItem( mListView, *it );
|
|
if ( *it == standardResource )
|
|
item->setStandard( true );
|
|
}
|
|
|
|
if ( mListView->childCount() == 0 ) {
|
|
defaults();
|
|
emit changed( true );
|
|
mCurrentManager->writeConfig( mCurrentConfig );
|
|
} else {
|
|
if ( !standardResource )
|
|
KMessageBox::sorry( this, i18n( "There is no standard resource! Please select one." ) );
|
|
|
|
emit changed( false );
|
|
}
|
|
}
|
|
|
|
void ConfigPage::slotAdd()
|
|
{
|
|
if ( !mCurrentManager )
|
|
return;
|
|
|
|
TQStringList types = mCurrentManager->resourceTypeNames();
|
|
TQStringList descs = mCurrentManager->resourceTypeDescriptions();
|
|
bool ok = false;
|
|
TQString desc = KInputDialog::getItem( i18n( "Resource Configuration" ),
|
|
i18n( "Please select type of the new resource:" ), descs,
|
|
0, false, &ok, this );
|
|
if ( !ok )
|
|
return;
|
|
|
|
TQString type = types[ descs.tqfindIndex( desc ) ];
|
|
|
|
// Create new resource
|
|
Resource *resource = mCurrentManager->createResource( type );
|
|
if ( !resource ) {
|
|
KMessageBox::error( this, i18n("Unable to create resource of type '%1'.")
|
|
.arg( type ) );
|
|
return;
|
|
}
|
|
|
|
resource->setResourceName( type + "-resource" );
|
|
|
|
ConfigDialog dlg( this, mFamily, resource, "KRES::ConfigDialog" );
|
|
|
|
if ( dlg.exec() ) {
|
|
mCurrentManager->add( resource );
|
|
|
|
ConfigViewItem *item = new ConfigViewItem( mListView, resource );
|
|
|
|
mLastItem = item;
|
|
|
|
// if there are only read-only resources we'll set this resource
|
|
// as standard resource
|
|
if ( !resource->readOnly() ) {
|
|
bool onlyReadOnly = true;
|
|
TQListViewItem *it = mListView->firstChild();
|
|
while ( it != 0 ) {
|
|
ConfigViewItem *confIt = static_cast<ConfigViewItem*>( it );
|
|
if ( !confIt->readOnly() && confIt != item )
|
|
onlyReadOnly = false;
|
|
|
|
it = it->itemBelow();
|
|
}
|
|
|
|
if ( onlyReadOnly )
|
|
item->setStandard( true );
|
|
}
|
|
|
|
emit changed( true );
|
|
} else {
|
|
delete resource;
|
|
resource = 0;
|
|
}
|
|
}
|
|
|
|
void ConfigPage::slotRemove()
|
|
{
|
|
if ( !mCurrentManager )
|
|
return;
|
|
|
|
TQListViewItem *item = mListView->currentItem();
|
|
ConfigViewItem *confItem = static_cast<ConfigViewItem*>( item );
|
|
|
|
if ( !confItem )
|
|
return;
|
|
|
|
if ( confItem->standard() ) {
|
|
KMessageBox::sorry( this, i18n( "You cannot remove your standard resource! Please select a new standard resource first." ) );
|
|
return;
|
|
}
|
|
|
|
mCurrentManager->remove( confItem->resource() );
|
|
|
|
if ( item == mLastItem )
|
|
mLastItem = 0;
|
|
|
|
mListView->takeItem( item );
|
|
delete item;
|
|
|
|
emit changed( true );
|
|
}
|
|
|
|
void ConfigPage::slotEdit()
|
|
{
|
|
if ( !mCurrentManager )
|
|
return;
|
|
|
|
TQListViewItem *item = mListView->currentItem();
|
|
ConfigViewItem *configItem = static_cast<ConfigViewItem*>( item );
|
|
if ( !configItem )
|
|
return;
|
|
|
|
Resource *resource = configItem->resource();
|
|
|
|
ConfigDialog dlg( this, mFamily, resource, "KRES::ConfigDialog" );
|
|
|
|
if ( dlg.exec() ) {
|
|
configItem->setText( 0, resource->resourceName() );
|
|
configItem->setText( 1, resource->type() );
|
|
|
|
if ( configItem->standard() && configItem->readOnly() ) {
|
|
KMessageBox::sorry( this, i18n( "You cannot use a read-only resource as standard!" ) );
|
|
configItem->setStandard( false );
|
|
}
|
|
|
|
mCurrentManager->change( resource );
|
|
emit changed( true );
|
|
}
|
|
}
|
|
|
|
void ConfigPage::slotStandard()
|
|
{
|
|
if ( !mCurrentManager )
|
|
return;
|
|
|
|
ConfigViewItem *item = static_cast<ConfigViewItem*>( mListView->currentItem() );
|
|
if ( !item )
|
|
return;
|
|
|
|
if ( item->readOnly() ) {
|
|
KMessageBox::sorry( this, i18n( "You cannot use a read-only resource as standard!" ) );
|
|
return;
|
|
}
|
|
|
|
if ( !item->isOn() ) {
|
|
KMessageBox::sorry( this, i18n( "You cannot use an inactive resource as standard!" ) );
|
|
return;
|
|
}
|
|
|
|
TQListViewItem *it = mListView->firstChild();
|
|
while ( it != 0 ) {
|
|
ConfigViewItem *configItem = static_cast<ConfigViewItem*>( it );
|
|
if ( configItem->standard() )
|
|
configItem->setStandard( false );
|
|
it = it->itemBelow();
|
|
}
|
|
|
|
item->setStandard( true );
|
|
mCurrentManager->setStandardResource( item->resource() );
|
|
|
|
emit changed( true );
|
|
}
|
|
|
|
void ConfigPage::slotSelectionChanged()
|
|
{
|
|
bool state = ( mListView->currentItem() != 0 );
|
|
|
|
mRemoveButton->setEnabled( state );
|
|
mEditButton->setEnabled( state );
|
|
mStandardButton->setEnabled( state );
|
|
}
|
|
|
|
void ConfigPage::resourceAdded( Resource *resource )
|
|
{
|
|
kdDebug(5650) << "ConfigPage::resourceAdded( " << resource->resourceName()
|
|
<< " )" << endl;
|
|
|
|
ConfigViewItem *item = new ConfigViewItem( mListView, resource );
|
|
|
|
item->setOn( resource->isActive() );
|
|
|
|
mLastItem = item;
|
|
|
|
emit changed( true );
|
|
}
|
|
|
|
void ConfigPage::resourceModified( Resource *resource )
|
|
{
|
|
kdDebug(5650) << "ConfigPage::resourceModified( " << resource->resourceName()
|
|
<< " )" << endl;
|
|
ConfigViewItem *item = tqfindItem( resource );
|
|
if ( !item ) return;
|
|
|
|
// TODO: Reread resource config. Otherwise we won't see the modification.
|
|
|
|
item->updateItem();
|
|
}
|
|
|
|
void ConfigPage::resourceDeleted( Resource *resource )
|
|
{
|
|
kdDebug(5650) << "ConfigPage::resourceDeleted( " << resource->resourceName()
|
|
<< " )" << endl;
|
|
|
|
ConfigViewItem *item = tqfindItem( resource );
|
|
if ( !item ) return;
|
|
|
|
delete item;
|
|
}
|
|
|
|
ConfigViewItem *ConfigPage::tqfindItem( Resource *resource )
|
|
{
|
|
TQListViewItem *i;
|
|
for( i = mListView->firstChild(); i; i = i->nextSibling() ) {
|
|
ConfigViewItem *item = static_cast<ConfigViewItem *>( i );
|
|
if ( item->resource() == resource ) return item;
|
|
}
|
|
return 0;
|
|
}
|
|
|
|
void ConfigPage::slotItemClicked( TQListViewItem *item )
|
|
{
|
|
ConfigViewItem *configItem = static_cast<ConfigViewItem *>( item );
|
|
if ( !configItem ) return;
|
|
|
|
if ( configItem->standard() && !configItem->isOn() ) {
|
|
KMessageBox::sorry( this, i18n( "You cannot deactivate the standard resource. Choose another standard resource first." ) );
|
|
configItem->setOn( true );
|
|
return;
|
|
}
|
|
|
|
if ( configItem->isOn() != configItem->resource()->isActive() ) {
|
|
emit changed( true );
|
|
}
|
|
}
|
|
|
|
void ConfigPage::saveResourceSettings()
|
|
{
|
|
if ( mCurrentManager ) {
|
|
TQListViewItem *item = mListView->firstChild();
|
|
while ( item ) {
|
|
ConfigViewItem *configItem = static_cast<ConfigViewItem *>( item );
|
|
|
|
// check if standard resource
|
|
if ( configItem->standard() && !configItem->readOnly() &&
|
|
configItem->isOn() )
|
|
mCurrentManager->setStandardResource( configItem->resource() );
|
|
|
|
// check if active or passive resource
|
|
configItem->resource()->setActive( configItem->isOn() );
|
|
|
|
item = item->nextSibling();
|
|
}
|
|
mCurrentManager->writeConfig( mCurrentConfig );
|
|
|
|
if ( !mCurrentManager->standardResource() )
|
|
KMessageBox::sorry( this, i18n( "There is no valid standard resource! Please select one which is neither read-only nor inactive." ) );
|
|
}
|
|
}
|
|
|
|
}
|
|
|
|
#include "configpage.moc"
|
|
|