27 #include <tqpushbutton.h>
29 #include <kaboutdata.h>
30 #include <kapplication.h>
32 #include <kiconloader.h>
33 #include <klibloader.h>
35 #include <kmessagebox.h>
38 #include <kstdguiitem.h>
41 #include "kcmoduleloader.h"
42 #include "kcmoduleproxy.h"
43 #include "kcmultidialog.h"
44 #include "kcmultidialog.moc"
46 class KCMultiDialog::KCMultiDialogPrivate
49 KCMultiDialogPrivate()
50 : hasRootKCM( false ), currentModule( 0 )
59 :
KDialogBase(IconList, i18n(
"Configure"), Help | Default |Cancel | Apply |
60 Ok | User1 | User2, Ok, parent, name, modal, true,
62 , dialogface( IconList ), d( new KCMultiDialogPrivate )
68 :
KDialogBase( dialogFace, caption, Help | Default | Cancel | Apply | Ok |
69 User1 | User2, Ok, parent, name, modal, true,
71 , dialogface( dialogFace ), d( new KCMultiDialogPrivate )
77 const KGuiItem &user3,
int buttonMask,
const TQString &caption,
78 TQWidget *parent,
const char *name,
bool modal )
79 :
KDialogBase( dialogFace, caption, buttonMask | Help | Default | Cancel |
80 Apply | Ok | User1, Ok, parent, name, modal, true,
82 , dialogface( dialogFace ), d( new KCMultiDialogPrivate )
84 kdDebug( 710 ) <<
"Root modules will not work with this constructor. See the API documentation." <<
endl;
86 if ( buttonMask &
User2 )
90 inline void KCMultiDialog::init()
92 connect(
this, TQT_SIGNAL(
finished()), TQT_SLOT( dialogClosed()));
96 connect(
this, TQT_SIGNAL(
aboutToShowPage(TQWidget *)),
this, TQT_SLOT(slotAboutToShow(TQWidget *)));
98 moduleParentComponents.setAutoDelete(
true );
104 OrphanMap::Iterator end2 = m_orphanModules.end();
105 for( OrphanMap::Iterator it = m_orphanModules.begin(); it != end2; ++it )
114 ModuleList::Iterator end = m_modules.end();
115 for( ModuleList::Iterator it = m_modules.begin(); it != end; ++it )
116 if(
pageIndex( ( TQWidget * )( *it ).kcm->parent() ) == curPageIndex )
118 ( *it ).kcm->defaults();
119 clientChanged(
true );
128 ModuleList::Iterator end = m_modules.end();
129 for( ModuleList::Iterator it = m_modules.begin(); it != end; ++it )
130 if(
pageIndex( ( TQWidget * )( *it ).kcm->parent() ) == curPageIndex )
133 clientChanged(
false );
138 void KCMultiDialog::apply()
140 TQStringList updatedModules;
141 ModuleList::Iterator end = m_modules.end();
142 for( ModuleList::Iterator it = m_modules.begin(); it != end; ++it )
148 TQStringList * names = moduleParentComponents[ m ];
150 for( TQStringList::ConstIterator it = names->begin(); it != names->end(); ++it )
151 if( updatedModules.find( *it ) == updatedModules.end() )
152 updatedModules.append( *it );
155 for( TQStringList::const_iterator it = updatedModules.begin(); it != updatedModules.end(); ++it )
188 ModuleList::Iterator end = m_modules.end();
189 for( ModuleList::Iterator it = m_modules.begin(); it != end; ++it )
190 if(
pageIndex( ( TQWidget * )( *it ).kcm->parent() ) == curPageIndex )
192 docPath = ( *it ).kcm->moduleInfo().docPath();
196 KURL url(
KURL(
"help:/"), docPath );
200 process <<
"khelpcenter"
209 void KCMultiDialog::clientChanged(
bool state)
212 ModuleList::Iterator end = m_modules.end();
213 for( ModuleList::Iterator it = m_modules.begin(); it != end; ++it )
214 if( ( *it ).kcm->changed() )
224 TQString complete = path;
226 if( !path.endsWith(
".desktop" ))
227 complete +=
".desktop";
229 KService::Ptr service = KService::serviceByStorageId( complete );
235 TQStringList parentmodulenames,
bool withfallback)
237 kdDebug(710) <<
"KCMultiDialog::addModule "
243 if ( !kapp->authorizeControlModule( moduleinfo.
service()->menuId() ))
250 if (!moduleinfo.
service()->noDisplay())
256 SmallIcon( moduleinfo.
icon(),
261 moduleinfo.
comment(), DesktopIcon( moduleinfo.
icon(),
266 (
new TQHBoxLayout( page ) )->setAutoAdd(
true );
269 kdError( 710 ) <<
"unsupported dialog face for KCMultiDialog"
278 if( m_orphanModules.contains( moduleinfo.
service() ) )
282 module = m_orphanModules[ moduleinfo.
service() ];
283 m_orphanModules.remove( moduleinfo.
service() );
284 kdDebug( 710 ) <<
"Use KCModule from the list of orphans for " <<
287 module->reparent( page, 0, TQPoint( 0, 0 ),
true );
290 clientChanged(
true );
297 module =
new KCModuleProxy( moduleinfo, withfallback, page );
298 TQStringList parentComponents = moduleinfo.
service()->property(
299 "X-KDE-ParentComponents" ).toStringList();
300 moduleParentComponents.insert( module,
301 new TQStringList( parentComponents ) );
303 connect(module, TQT_SIGNAL(changed(
bool)),
this, TQT_SLOT(clientChanged(
bool)));
305 if( m_modules.count() == 0 )
310 cm.service = moduleinfo.
service();
311 m_modules.append( cm );
316 d->hasRootKCM =
true;
319 slotAboutToShow( page );
326 ModuleList::Iterator end = m_modules.end();
327 for( ModuleList::Iterator it = m_modules.begin(); it != end; ++it )
331 TQObject * page = TQT_TQOBJECT(kcm->parent());
336 kcm->reparent( 0, TQPoint( 0, 0 ),
false );
339 m_orphanModules[ ( *it ).service ] = kcm;
340 kdDebug( 710 ) <<
"added KCModule to the list of orphans: " <<
345 clientChanged(
false );
348 void KCMultiDialog::show()
353 void KCMultiDialog::slotAboutToShow(TQWidget *page)
357 TQObject * obj = page->child( 0,
"KCModuleProxy" );
364 d->currentModule = module;
373 if (d->currentModule->moduleInfo().needsRootPrivileges())
375 if ( !d->currentModule->rootMode() )
378 connect(
this, TQT_SIGNAL(
user2Clicked()), d->currentModule, TQT_SLOT( runAsRoot() ));
379 connect(
this, TQT_SIGNAL(
user2Clicked()), TQT_SLOT( disableRModeButton() ));
386 void KCMultiDialog::rootExit()
391 void KCMultiDialog::disableRModeButton()
394 connect ( d->currentModule, TQT_SIGNAL( childClosed() ), TQT_SLOT( rootExit() ));
397 void KCMultiDialog::dialogClosed()
404 ModuleList::Iterator end = m_modules.end();
405 for( ModuleList::Iterator it = m_modules.begin(); it != end; ++it )
406 ( *it ).kcm->deleteClient();