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 <qcursor.h>
00025 #include <qhbox.h>
00026 #include <qlayout.h>
00027 #include <qpushbutton.h>
00028
00029 #include <kaboutdata.h>
00030 #include <kapplication.h>
00031 #include <kdebug.h>
00032 #include <kiconloader.h>
00033 #include <klibloader.h>
00034 #include <klocale.h>
00035 #include <kmessagebox.h>
00036 #include <kprocess.h>
00037 #include <krun.h>
00038 #include <kstdguiitem.h>
00039 #include <kuser.h>
00040
00041 #include "kcmoduleloader.h"
00042 #include "kcmoduleproxy.h"
00043 #include "kcmultidialog.h"
00044 #include "kcmultidialog.moc"
00045
00046 class KCMultiDialog::KCMultiDialogPrivate
00047 {
00048 public:
00049 KCMultiDialogPrivate()
00050 : hasRootKCM( false ), currentModule( 0 )
00051 {}
00052
00053 bool hasRootKCM;
00054 KCModuleProxy* currentModule;
00055 };
00056
00057
00058 KCMultiDialog::KCMultiDialog(QWidget *parent, const char *name, bool modal)
00059 : KDialogBase(IconList, i18n("Configure"), Help | Default |Cancel | Apply |
00060 Ok | User1 | User2, Ok, parent, name, modal, true,
00061 KStdGuiItem::reset(), KStdGuiItem::adminMode())
00062 , dialogface( IconList ), d( new KCMultiDialogPrivate )
00063 {
00064 init();
00065 }
00066
00067 KCMultiDialog::KCMultiDialog( int dialogFace, const QString & caption, QWidget * parent, const char * name, bool modal )
00068 : KDialogBase( dialogFace, caption, Help | Default | Cancel | Apply | Ok |
00069 User1 | User2, Ok, parent, name, modal, true,
00070 KStdGuiItem::reset(), KStdGuiItem::adminMode())
00071 , dialogface( dialogFace ), d( new KCMultiDialogPrivate )
00072 {
00073 init();
00074 }
00075
00076 KCMultiDialog::KCMultiDialog( int dialogFace, const KGuiItem &user2,
00077 const KGuiItem &user3, int buttonMask, const QString &caption,
00078 QWidget *parent, const char *name, bool modal )
00079 : KDialogBase( dialogFace, caption, buttonMask | Help | Default | Cancel |
00080 Apply | Ok | User1, Ok, parent, name, modal, true,
00081 KStdGuiItem::reset(), user2, user3 )
00082 , dialogface( dialogFace ), d( new KCMultiDialogPrivate )
00083 {
00084 kdDebug( 710 ) << "Root modules will not work with this constructor. See the API documentation." << endl;
00085 init();
00086 if ( buttonMask & User2 )
00087 showButton( User2, true );
00088 }
00089
00090 inline void KCMultiDialog::init()
00091 {
00092 connect( this, SIGNAL( finished()), SLOT( dialogClosed()));
00093 showButton( User1, false );
00094 showButton( User2, false );
00095 enableButton(Apply, false);
00096 connect(this, SIGNAL(aboutToShowPage(QWidget *)), this, SLOT(slotAboutToShow(QWidget *)));
00097 setInitialSize(QSize(640,480));
00098 moduleParentComponents.setAutoDelete( true );
00099
00100 }
00101
00102 KCMultiDialog::~KCMultiDialog()
00103 {
00104 OrphanMap::Iterator end2 = m_orphanModules.end();
00105 for( OrphanMap::Iterator it = m_orphanModules.begin(); it != end2; ++it )
00106 delete ( *it );
00107 delete d;
00108 }
00109
00110 void KCMultiDialog::slotDefault()
00111 {
00112 int curPageIndex = activePageIndex();
00113
00114 ModuleList::Iterator end = m_modules.end();
00115 for( ModuleList::Iterator it = m_modules.begin(); it != end; ++it )
00116 if( pageIndex( ( QWidget * )( *it ).kcm->parent() ) == curPageIndex )
00117 {
00118 ( *it ).kcm->defaults();
00119 clientChanged( true );
00120 return;
00121 }
00122 }
00123
00124 void KCMultiDialog::slotUser1()
00125 {
00126 int curPageIndex = activePageIndex();
00127
00128 ModuleList::Iterator end = m_modules.end();
00129 for( ModuleList::Iterator it = m_modules.begin(); it != end; ++it )
00130 if( pageIndex( ( QWidget * )( *it ).kcm->parent() ) == curPageIndex )
00131 {
00132 ( *it ).kcm->load();
00133 clientChanged( false );
00134 return;
00135 }
00136 }
00137
00138 void KCMultiDialog::apply()
00139 {
00140 QStringList updatedModules;
00141 ModuleList::Iterator end = m_modules.end();
00142 for( ModuleList::Iterator it = m_modules.begin(); it != end; ++it )
00143 {
00144 KCModuleProxy * m = ( *it ).kcm;
00145 if( m->changed() )
00146 {
00147 m->save();
00148 QStringList * names = moduleParentComponents[ m ];
00149 kdDebug(710) << k_funcinfo << *names << " saved and added to the list" << endl;
00150 for( QStringList::ConstIterator it = names->begin(); it != names->end(); ++it )
00151 if( updatedModules.find( *it ) == updatedModules.end() )
00152 updatedModules.append( *it );
00153 }
00154 }
00155 for( QStringList::const_iterator it = updatedModules.begin(); it != updatedModules.end(); ++it )
00156 {
00157 kdDebug(710) << k_funcinfo << *it << " " << ( *it ).latin1() << endl;
00158 emit configCommitted( ( *it ).latin1() );
00159 }
00160 emit configCommitted();
00161 }
00162
00163 void KCMultiDialog::slotApply()
00164 {
00165 QPushButton *button = actionButton(Apply);
00166 if (button)
00167 button->setFocus();
00168 emit applyClicked();
00169 apply();
00170 }
00171
00172
00173 void KCMultiDialog::slotOk()
00174 {
00175 QPushButton *button = actionButton(Ok);
00176 if (button)
00177 button->setFocus();
00178 emit okClicked();
00179 apply();
00180 accept();
00181 }
00182
00183 void KCMultiDialog::slotHelp()
00184 {
00185 QString docPath;
00186
00187 int curPageIndex = activePageIndex();
00188 ModuleList::Iterator end = m_modules.end();
00189 for( ModuleList::Iterator it = m_modules.begin(); it != end; ++it )
00190 if( pageIndex( ( QWidget * )( *it ).kcm->parent() ) == curPageIndex )
00191 {
00192 docPath = ( *it ).kcm->moduleInfo().docPath();
00193 break;
00194 }
00195
00196 KURL url( KURL("help:/"), docPath );
00197
00198 if (url.protocol() == "help" || url.protocol() == "man" || url.protocol() == "info") {
00199 KProcess process;
00200 process << "khelpcenter"
00201 << url.url();
00202 process.start(KProcess::DontCare);
00203 process.detach();
00204 } else {
00205 new KRun(url);
00206 }
00207 }
00208
00209 void KCMultiDialog::clientChanged(bool state)
00210 {
00211 kdDebug( 710 ) << k_funcinfo << state << endl;
00212 ModuleList::Iterator end = m_modules.end();
00213 for( ModuleList::Iterator it = m_modules.begin(); it != end; ++it )
00214 if( ( *it ).kcm->changed() )
00215 {
00216 enableButton( Apply, true );
00217 return;
00218 }
00219 enableButton( Apply, false );
00220 }
00221
00222 void KCMultiDialog::addModule(const QString& path, bool withfallback)
00223 {
00224 QString complete = path;
00225
00226 if( !path.endsWith( ".desktop" ))
00227 complete += ".desktop";
00228
00229 KService::Ptr service = KService::serviceByStorageId( complete );
00230
00231 addModule( KCModuleInfo( service ), QStringList(), withfallback);
00232 }
00233
00234 void KCMultiDialog::addModule(const KCModuleInfo& moduleinfo,
00235 QStringList parentmodulenames, bool withfallback)
00236 {
00237 kdDebug(710) << "KCMultiDialog::addModule "
00238 << moduleinfo.moduleName() << endl;
00239
00240 if( !moduleinfo.service() )
00241 return;
00242
00243 if ( !kapp->authorizeControlModule( moduleinfo.service()->menuId() ))
00244 return;
00245
00246 if( !KCModuleLoader::testModule( moduleinfo ))
00247 return;
00248
00249 QFrame* page = 0;
00250 if (!moduleinfo.service()->noDisplay())
00251 switch( dialogface )
00252 {
00253 case TreeList:
00254 parentmodulenames += moduleinfo.moduleName();
00255 page = addHBoxPage( parentmodulenames, moduleinfo.comment(),
00256 SmallIcon( moduleinfo.icon(),
00257 IconSize( KIcon::Small ) ) );
00258 break;
00259 case IconList:
00260 page = addHBoxPage( moduleinfo.moduleName(),
00261 moduleinfo.comment(), DesktopIcon( moduleinfo.icon(),
00262 KIcon::SizeMedium ) );
00263 break;
00264 case Plain:
00265 page = plainPage();
00266 ( new QHBoxLayout( page ) )->setAutoAdd( true );
00267 break;
00268 default:
00269 kdError( 710 ) << "unsupported dialog face for KCMultiDialog"
00270 << endl;
00271 break;
00272 }
00273 if(!page) {
00274 KCModuleLoader::unloadModule(moduleinfo);
00275 return;
00276 }
00277 KCModuleProxy * module;
00278 if( m_orphanModules.contains( moduleinfo.service() ) )
00279 {
00280
00281
00282 module = m_orphanModules[ moduleinfo.service() ];
00283 m_orphanModules.remove( moduleinfo.service() );
00284 kdDebug( 710 ) << "Use KCModule from the list of orphans for " <<
00285 moduleinfo.moduleName() << ": " << module << endl;
00286
00287 module->reparent( page, 0, QPoint( 0, 0 ), true );
00288
00289 if( module->changed() )
00290 clientChanged( true );
00291
00292 if( activePageIndex() == -1 )
00293 showPage( pageIndex( page ) );
00294 }
00295 else
00296 {
00297 module = new KCModuleProxy( moduleinfo, withfallback, page );
00298 QStringList parentComponents = moduleinfo.service()->property(
00299 "X-KDE-ParentComponents" ).toStringList();
00300 moduleParentComponents.insert( module,
00301 new QStringList( parentComponents ) );
00302
00303 connect(module, SIGNAL(changed(bool)), this, SLOT(clientChanged(bool)));
00304
00305 if( m_modules.count() == 0 )
00306 aboutToShowPage( page );
00307 }
00308 CreatedModule cm;
00309 cm.kcm = module;
00310 cm.service = moduleinfo.service();
00311 m_modules.append( cm );
00312 if ( moduleinfo.needsRootPrivileges() &&
00313 !d->hasRootKCM &&
00314 !KUser().isSuperUser() )
00315 {
00316 d->hasRootKCM = true;
00317 showButton( User2, true );
00318 if( plainPage() )
00319 slotAboutToShow( page );
00320 }
00321 }
00322
00323 void KCMultiDialog::removeAllModules()
00324 {
00325 kdDebug( 710 ) << k_funcinfo << endl;
00326 ModuleList::Iterator end = m_modules.end();
00327 for( ModuleList::Iterator it = m_modules.begin(); it != end; ++it )
00328 {
00329 kdDebug( 710 ) << "remove 2" << endl;
00330 KCModuleProxy * kcm = ( *it ).kcm;
00331 QObject * page = kcm->parent();
00332 kcm->hide();
00333 if( page )
00334 {
00335
00336 kcm->reparent( 0, QPoint( 0, 0 ), false );
00337 delete page;
00338 }
00339 m_orphanModules[ ( *it ).service ] = kcm;
00340 kdDebug( 710 ) << "added KCModule to the list of orphans: " <<
00341 kcm << endl;
00342 }
00343 m_modules.clear();
00344
00345 clientChanged( false );
00346 }
00347
00348 void KCMultiDialog::show()
00349 {
00350 KDialogBase::show();
00351 }
00352
00353 void KCMultiDialog::slotAboutToShow(QWidget *page)
00354 {
00355 kdDebug(710) << k_funcinfo << endl;
00356
00357 QObject * obj = page->child( 0, "KCModuleProxy" );
00358 if( ! obj )
00359 return;
00360
00361 KCModuleProxy * module = ( KCModuleProxy* )obj->qt_cast(
00362 "KCModuleProxy" );
00363 if( ! module )
00364 return;
00365 d->currentModule = module;
00366
00367 enableButton( KDialogBase::Help,
00368 d->currentModule->buttons() & KCModule::Help );
00369 enableButton( KDialogBase::Default,
00370 d->currentModule->buttons() & KCModule::Default );
00371
00372 disconnect( this, SIGNAL(user2Clicked()), 0, 0 );
00373
00374 if (d->currentModule->moduleInfo().needsRootPrivileges())
00375 {
00376 if ( !d->currentModule->rootMode() )
00377 {
00378 enableButton( User2, true );
00379 connect( this, SIGNAL(user2Clicked()), d->currentModule, SLOT( runAsRoot() ));
00380 connect( this, SIGNAL(user2Clicked()), SLOT( disableRModeButton() ));
00381 }
00382 else
00383 enableButton( User2, false);
00384 }
00385 }
00386
00387 void KCMultiDialog::rootExit()
00388 {
00389 enableButton( User2, true);
00390 }
00391
00392 void KCMultiDialog::disableRModeButton()
00393 {
00394 enableButton( User2, false );
00395 connect ( d->currentModule, SIGNAL( childClosed() ), SLOT( rootExit() ));
00396 }
00397
00398 void KCMultiDialog::dialogClosed()
00399 {
00400 kdDebug(710) << k_funcinfo << endl;
00401
00402
00403
00404
00405 ModuleList::Iterator end = m_modules.end();
00406 for( ModuleList::Iterator it = m_modules.begin(); it != end; ++it )
00407 ( *it ).kcm->deleteClient();
00408 }
00409
00410
00411