• Skip to content
  • Skip to link menu
Trinity API Reference
  • Trinity API Reference
  • tdeutils
 

tdeutils

  • tdeutils
  • ksettings
dialog.cpp
1 /* This file is part of the KDE project
2  Copyright (C) 2003 Matthias Kretz <kretz@kde.org>
3 
4  This library is free software; you can redistribute it and/or
5  modify it under the terms of the GNU Library General Public
6  License version 2 as published by the Free Software Foundation.
7 
8  This library is distributed in the hope that it will be useful,
9  but WITHOUT ANY WARRANTY; without even the implied warranty of
10  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
11  Library General Public License for more details.
12 
13  You should have received a copy of the GNU Library General Public License
14  along with this library; see the file COPYING.LIB. If not, write to
15  the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
16  Boston, MA 02110-1301, USA.
17 
18 */
19 
20 #include "ksettings/dialog.h"
21 
22 
23 #include <kcmultidialog.h>
24 #include <tdelocale.h>
25 #include <kservicegroup.h>
26 #include <kdebug.h>
27 #include <ktrader.h>
28 #include <kplugininfo.h>
29 #include "ksettings/dispatcher.h"
30 #include "ksettings/componentsdialog.h"
31 #include <ksimpleconfig.h>
32 #include <kstandarddirs.h>
33 #include <kiconloader.h>
34 #include <tqvbox.h>
35 #include <tqlabel.h>
36 #include "tdecmoduleinfo.h"
37 
38 namespace KSettings
39 {
40 
41 struct GroupInfo
42 {
43  TQString id;
44  TQString name;
45  TQString comment;
46  TQString icon;
47  int weight;
48  TQString parentid;
49  TQWidget * page;
50 };
51 
52 // The TreeList can get really complicated. That's why a tree data structure
53 // is necessary to make it suck less
54 class PageNode
55 {
56  private:
57  typedef TQValueList<PageNode*> List;
58  enum Type { KCM, Group, Root };
59  union Value
60  {
61  TDECModuleInfo * kcm;
62  GroupInfo * group;
63  };
64  Type m_type;
65  Value m_value;
66 
67  Dialog * m_dialog;
68  List m_children;
69  PageNode * m_parent;
70  bool m_visible;
71  bool m_dirty;
72 
73  protected:
74  PageNode( TDECModuleInfo * info, PageNode * parent )
75  : m_type( KCM )
76  , m_parent( parent )
77  , m_visible( true )
78  , m_dirty( true )
79  {
80  m_value.kcm = info;
81  m_dialog = parent->m_dialog;
82  }
83 
84  PageNode( GroupInfo & group, PageNode * parent )
85  : m_type( Group )
86  , m_parent( parent )
87  , m_visible( true )
88  , m_dirty( true )
89  {
90  m_value.group = new GroupInfo( group );
91  m_value.group->page = 0;
92  m_dialog = parent->m_dialog;
93  }
94 
95  void bubbleSort( List::Iterator begin, List::Iterator end )
96  {
97  --end;
98  bool finished;
99  List::Iterator lastswapped = begin;
100  List::Iterator i;
101  List::Iterator j;
102  while( begin != end )
103  {
104  finished = true;
105  i = j = end;
106  do {
107  --j;
108  if( **i < **j )
109  {
110  finished = false;
111  tqSwap( *i, *j );
112  lastswapped = j;
113  }
114  --i;
115  } while( j != begin );
116  if( finished )
117  return;
118  ++lastswapped;
119  begin = lastswapped;
120  }
121  }
122 
123  public:
124  PageNode( Dialog * dialog )
125  : m_type( Root )
126  , m_dialog( dialog )
127  , m_parent( 0 )
128  , m_visible( true )
129  , m_dirty( true )
130  {}
131 
132  ~PageNode()
133  {
134  if( KCM == m_type )
135  delete m_value.kcm;
136  else if( Group == m_type )
137  delete m_value.group;
138  List::Iterator end = m_children.end();
139  for( List::Iterator it = m_children.begin(); it != end; ++it )
140  delete ( *it );
141  }
142 
143  int weight() const
144  {
145  int w = ( KCM == m_type ) ? m_value.kcm->weight()
146  : m_value.group->weight;
147  kdDebug( 700 ) << k_funcinfo << name() << " " << w << endl;
148  return w;
149  }
150 
151  bool operator<( const PageNode & rhs ) const
152  {
153  return weight() < rhs.weight();
154  }
155 
156  bool isVisible()
157  {
158  if( m_dirty )
159  {
160  if( KCM == m_type )
161  m_visible = m_dialog->isPluginForKCMEnabled( m_value.kcm );
162  else
163  {
164  m_visible = false;
165  List::Iterator end = m_children.end();
166  for( List::Iterator it = m_children.begin(); it != end;
167  ++it )
168  if( ( *it )->isVisible() )
169  {
170  m_visible = true;
171  break;
172  }
173  }
174  m_dirty = false;
175  }
176  kdDebug( 700 ) << k_funcinfo << "returns " << m_visible << endl;
177  return m_visible;
178  }
179 
180  void makeDirty()
181  {
182  m_dirty = true;
183  List::Iterator end = m_children.end();
184  for( List::Iterator it = m_children.begin(); it != end; ++it )
185  ( *it )->makeDirty();
186  }
187 
188  TQString name() const
189  {
190  if( Root == m_type )
191  return TQString::fromAscii( "root node" );
192  return ( KCM == m_type ) ? m_value.kcm->moduleName()
193  : m_value.group->name;
194  }
195 
196  TQStringList parentNames() const
197  {
198  TQStringList ret;
199  PageNode * node = m_parent;
200  while( node && node->m_type != Root )
201  {
202  ret.prepend( node->name() );
203  node = node->m_parent;
204  }
205  return ret;
206  }
207 
208  void addToDialog( KCMultiDialog * dlg )
209  {
210  kdDebug( 700 ) << k_funcinfo << "for " << name() << endl;
211  if( ! isVisible() )
212  return;
213 
214  if( KCM == m_type )
215  {
216  dlg->addModule( *m_value.kcm, parentNames() );
217  return;
218  }
219  if( Group == m_type && 0 == m_value.group->page )
220  {
221  TQPixmap icon;
222  if( ! m_value.group->icon.isNull() )
223  icon = SmallIcon( m_value.group->icon,
224  IconSize( TDEIcon::Small ) );
225  TQVBox * page = dlg->addVBoxPage( m_value.group->name,
226  TQString::null, icon );
227  TQLabel * comment = new TQLabel( m_value.group->comment, page );
228  comment->setTextFormat( TQt::RichText );
229  m_value.group->page = page;
230  }
231  List::Iterator end = m_children.end();
232  for( List::Iterator it = m_children.begin(); it != end; ++it )
233  ( *it )->addToDialog( dlg );
234  }
235 
236  void removeFromDialog( KCMultiDialog * dlg )
237  {
238  kdDebug( 700 ) << k_funcinfo << "for " << name() << endl;
239  if( KCM == m_type )
240  return;
241  if( Root == m_type )
242  dlg->removeAllModules();
243  List::Iterator end = m_children.end();
244  for( List::Iterator it = m_children.begin(); it != end; ++it )
245  ( *it )->removeFromDialog( dlg );
246  if( Group == m_type )
247  {
248  delete m_value.group->page;
249  m_value.group->page = 0;
250  }
251  }
252 
253  void sort()
254  {
255  kdDebug( 700 ) << k_funcinfo << name() << endl;
256  List::Iterator begin = m_children.begin();
257  List::Iterator end = m_children.end();
258  bubbleSort( begin, end );
259  for( List::Iterator it = begin ; it != end; ++it )
260  ( *it )->sort();
261  }
262 
263  bool insert( GroupInfo & group )
264  {
265  if( group.parentid.isNull() )
266  {
267  if( Root == m_type )
268  {
269  m_children.append( new PageNode( group, this ) );
270  return true;
271  }
272  else
273  kdFatal( 700 ) << "wrong PageNode insertion"
274  << kdBacktrace() << endl;
275  }
276  if( Group == m_type && group.parentid == m_value.group->id )
277  {
278  m_children.append( new PageNode( group, this ) );
279  return true;
280  }
281  List::Iterator end = m_children.end();
282  for( List::Iterator it = m_children.begin(); it != end; ++it )
283  if( ( *it )->insert( group ) )
284  return true;
285  // no parent with the right parentid
286  if( Root == m_type )
287  {
288  m_children.append( new PageNode( group, this ) );
289  return true;
290  }
291  return false;
292  }
293 
294  bool insert( TDECModuleInfo * info, const TQString & parentid )
295  {
296  if( parentid.isNull() )
297  {
298  if( Root == m_type )
299  {
300  m_children.append( new PageNode( info, this ) );
301  return true;
302  }
303  else
304  kdFatal( 700 ) << "wrong PageNode insertion"
305  << kdBacktrace() << endl;
306  }
307  if( Group == m_type && parentid == m_value.group->id )
308  {
309  m_children.append( new PageNode( info, this ) );
310  return true;
311  }
312  List::Iterator end = m_children.end();
313  for( List::Iterator it = m_children.begin(); it != end; ++it )
314  if( ( *it )->insert( info, parentid ) )
315  return true;
316  // no parent with the right parentid
317  if( Root == m_type )
318  {
319  m_children.append( new PageNode( info, this ) );
320  return true;
321  }
322  return false;
323  }
324 
325  bool needTree()
326  {
327  List::ConstIterator end = m_children.end();
328  for( List::ConstIterator it = m_children.begin(); it != end; ++it )
329  if( ( *it )->m_children.count() > 0 )
330  return true;
331  return false;
332  }
333 
334  bool singleChild()
335  {
336  return ( m_children.count() == 1 );
337  }
338 };
339 
340 class Dialog::DialogPrivate
341 {
342  public:
343  DialogPrivate( Dialog * parent )
344  : dlg( 0 )
345  , pagetree( parent )
346  {
347  }
348 
349  bool staticlistview;
350  KCMultiDialog * dlg;
351  PageNode pagetree;
352  TQWidget * parentwidget;
353  TQStringList registeredComponents;
354  TQValueList<KService::Ptr> services;
355  TQMap<TQString, KPluginInfo*> plugininfomap;
356 };
357 
358 Dialog::Dialog( TQWidget * parent, const char * name )
359  : TQObject( parent, name )
360  , d( new DialogPrivate( this ) )
361 {
362  d->parentwidget = parent;
363  d->staticlistview = true;
364  d->services = instanceServices();
365 }
366 
367 Dialog::Dialog( ContentInListView content,
368  TQWidget * parent, const char * name )
369  : TQObject( parent, name )
370  , d( new DialogPrivate( this ) )
371 {
372  d->parentwidget = parent;
373  d->staticlistview = ( content == Static );
374  d->services = instanceServices();
375 }
376 
377 Dialog::Dialog( const TQStringList & components,
378  TQWidget * parent, const char * name )
379  : TQObject( parent, name )
380  , d( new DialogPrivate( this ) )
381 {
382  d->parentwidget = parent;
383  d->staticlistview = true;
384  d->services = instanceServices() + parentComponentsServices( components );
385 }
386 
387 Dialog::Dialog( const TQStringList & components,
388  ContentInListView content, TQWidget * parent, const char * name )
389  : TQObject( parent, name )
390  , d( new DialogPrivate( this ) )
391 {
392  d->parentwidget = parent;
393  d->staticlistview = ( content == Static );
394  d->services = instanceServices() + parentComponentsServices( components );
395 }
396 
397 Dialog::~Dialog()
398 {
399  delete d;
400 }
401 
402 void Dialog::addPluginInfos( const TQValueList<KPluginInfo*> & plugininfos )
403 {
404  for( TQValueList<KPluginInfo*>::ConstIterator it = plugininfos.begin();
405  it != plugininfos.end(); ++it )
406  {
407  d->registeredComponents.append( ( *it )->pluginName() );
408  d->services += ( *it )->kcmServices();
409  d->plugininfomap[ ( *it )->pluginName() ] = *it;
410  }
411 }
412 
413 void Dialog::show()
414 {
415  if( 0 == d->dlg )
416  createDialogFromServices();
417  Dispatcher::self()->syncConfiguration();
418  return d->dlg->show();
419 }
420 
421 KCMultiDialog * Dialog::dialog()
422 {
423  if( 0 == d->dlg )
424  createDialogFromServices();
425  return d->dlg;
426 }
427 
428 TQValueList<KService::Ptr> Dialog::instanceServices() const
429 {
430  kdDebug( 700 ) << k_funcinfo << endl;
431  TQString instanceName = TDEGlobal::instance()->instanceName();
432  d->registeredComponents.append( instanceName );
433  kdDebug( 700 ) << "calling KServiceGroup::childGroup( " << instanceName
434  << " )" << endl;
435  KServiceGroup::Ptr service = KServiceGroup::childGroup( instanceName );
436 
437  TQValueList<KService::Ptr> ret;
438 
439  if( service && service->isValid() )
440  {
441  kdDebug( 700 ) << "call was successfull" << endl;
442  KServiceGroup::List list = service->entries();
443  for( KServiceGroup::List::ConstIterator it = list.begin();
444  it != list.end(); ++it )
445  {
446  KSycocaEntry * p = *it;
447  if( p->isType( KST_KService ) )
448  {
449  kdDebug( 700 ) << "found service" << endl;
450  ret << static_cast<KService *>( p );
451  }
452  else
453  kdWarning( 700 ) << "KServiceGroup::childGroup returned"
454  " something else than a KService (kinda)" << endl;
455  }
456  }
457 
458  return ret;
459 }
460 
461 TQValueList<KService::Ptr> Dialog::parentComponentsServices(
462  const TQStringList & kcdparents ) const
463 {
464  d->registeredComponents += kcdparents;
465  TQString constraint = kcdparents.join(
466  "' in [X-TDE-ParentComponents]) or ('" );
467  constraint = "('" + constraint + "' in [X-TDE-ParentComponents])";
468 
469  kdDebug( 700 ) << "constraint = " << constraint << endl;
470  return TDETrader::self()->query( "TDECModule", constraint );
471 }
472 
473 bool Dialog::isPluginForKCMEnabled( TDECModuleInfo * moduleinfo ) const
474 {
475  // if the user of this class requested to hide disabled modules
476  // we check whether it should be enabled or not
477  bool enabled = true;
478  kdDebug( 700 ) << "check whether the " << moduleinfo->moduleName()
479  << " KCM should be shown" << endl;
480  // for all parent components
481  TQStringList parentComponents = moduleinfo->service()->property(
482  "X-TDE-ParentComponents" ).toStringList();
483  for( TQStringList::ConstIterator pcit = parentComponents.begin();
484  pcit != parentComponents.end(); ++pcit )
485  {
486  // if the parentComponent is not registered ignore it
487  if( d->registeredComponents.find( *pcit ) ==
488  d->registeredComponents.end() )
489  continue;
490 
491  // we check if the parent component is a plugin
492  if( ! d->plugininfomap.contains( *pcit ) )
493  {
494  // if not the TDECModule must be enabled
495  enabled = true;
496  // we're done for this TDECModuleInfo
497  break;
498  }
499  // if it is a plugin we check whether the plugin is enabled
500  KPluginInfo * pinfo = d->plugininfomap[ *pcit ];
501  pinfo->load();
502  enabled = pinfo->isPluginEnabled();
503  kdDebug( 700 ) << "parent " << *pcit << " is "
504  << ( enabled ? "enabled" : "disabled" ) << endl;
505  // if it is enabled we're done for this TDECModuleInfo
506  if( enabled )
507  break;
508  }
509  return enabled;
510 }
511 
512 void Dialog::parseGroupFile( const TQString & filename )
513 {
514  KSimpleConfig file( filename );
515  TQStringList groups = file.groupList();
516  for( TQStringList::ConstIterator it = groups.begin(); it != groups.end();
517  ++it )
518  {
519  GroupInfo group;
520  TQString id = *it;
521  file.setGroup( id.utf8() );
522  group.id = id;
523  group.name = file.readEntry( "Name" );
524  group.comment = file.readEntry( "Comment" );
525  group.weight = file.readNumEntry( "Weight", 100 );
526  group.parentid = file.readEntry( "Parent" );
527  group.icon = file.readEntry( "Icon" );
528  d->pagetree.insert( group );
529  }
530 }
531 
532 void Dialog::createDialogFromServices()
533 {
534  // read .setdlg files
535  TQString setdlgpath = locate( "appdata",
536  TDEGlobal::instance()->instanceName() + ".setdlg" );
537  TQStringList setdlgaddon = TDEGlobal::dirs()->findAllResources( "appdata",
538  "ksettingsdialog/*.setdlg" );
539  if( ! setdlgpath.isNull() )
540  parseGroupFile( setdlgpath );
541  if( setdlgaddon.size() > 0 )
542  for( TQStringList::ConstIterator it = setdlgaddon.begin();
543  it != setdlgaddon.end(); ++it )
544  parseGroupFile( *it );
545 
546  // now we process the TDECModule services
547  for( TQValueList<KService::Ptr>::ConstIterator it = d->services.begin();
548  it != d->services.end(); ++it )
549  {
550  // we create the TDECModuleInfo
551  TDECModuleInfo * info = new TDECModuleInfo( *it );
552  TQString parentid;
553  TQVariant tmp = info->service()->property( "X-TDE-CfgDlgHierarchy",
554  TQVariant::String );
555  if( tmp.isValid() )
556  parentid = tmp.toString();
557  d->pagetree.insert( info, parentid );
558  }
559 
560  // At this point d->pagetree holds a nice structure of the pages we want
561  // to show. It's not going to change anymore so we can sort it now.
562  d->pagetree.sort();
563 
564  int dialogface = KJanusWidget::IconList;
565  if( d->pagetree.needTree() )
566  dialogface = KJanusWidget::TreeList;
567  else if( d->pagetree.singleChild() )
568  dialogface = KJanusWidget::Plain;
569 
570  kdDebug( 700 ) << "creating KCMultiDialog" << endl;
571  d->dlg = new KCMultiDialog( dialogface, i18n( "Configure" ),
572  d->parentwidget );
573 
574  if( dialogface == KJanusWidget::TreeList )
575  d->dlg->setShowIconsInTreeList( true );
576 
577  // TODO: Don't show the reset button until the issue with the
578  // KPluginSelector::load() method is solved.
579  // Problem:
580  // KCMultiDialog::show() call TDECModule::load() to reset all KCMs
581  // (KPluginSelector::load() resets all plugin selections and all plugin
582  // KCMs).
583  // The reset button calls TDECModule::load(), too but in this case we want the
584  // KPluginSelector to only reset the current visible plugin KCM and not
585  // touch the plugin selections.
586  // I have no idea how to check that in KPluginSelector::load()...
587  //d->dlg->showButton( KDialogBase::User1, true );
588 
589  if( ! d->staticlistview )
590  d->dlg->addButtonBelowList( i18n( "Select Components..." ), this,
591  TQ_SLOT( configureTree() ) );
592 
593  connect( d->dlg, TQ_SIGNAL( okClicked() ), Dispatcher::self(),
594  TQ_SLOT( syncConfiguration() ) );
595  connect( d->dlg, TQ_SIGNAL( applyClicked() ), Dispatcher::self(),
596  TQ_SLOT( syncConfiguration() ) );
597  connect( d->dlg, TQ_SIGNAL( configCommitted( const TQCString & ) ),
598  Dispatcher::self(), TQ_SLOT( reparseConfiguration( const TQCString & ) ) );
599 
600  d->pagetree.addToDialog( d->dlg );
601 
602  if( dialogface == KJanusWidget::TreeList )
603  d->dlg->unfoldTreeList();
604 }
605 
606 void Dialog::configureTree()
607 {
608  kdDebug( 700 ) << k_funcinfo << endl;
609  ComponentsDialog * subdlg = new ComponentsDialog( d->dlg );
610  subdlg->setPluginInfos( d->plugininfomap );
611  subdlg->show();
612  connect( subdlg, TQ_SIGNAL( okClicked() ), this, TQ_SLOT( updateTreeList() ) );
613  connect( subdlg, TQ_SIGNAL( applyClicked() ), this, TQ_SLOT( updateTreeList() ) );
614  connect( subdlg, TQ_SIGNAL( okClicked() ), this,
615  TQ_SIGNAL( pluginSelectionChanged() ) );
616  connect( subdlg, TQ_SIGNAL( applyClicked() ), this,
617  TQ_SIGNAL( pluginSelectionChanged() ) );
618  connect( subdlg, TQ_SIGNAL( finished() ), subdlg, TQ_SLOT( delayedDestruct() ) );
619 }
620 
621 void Dialog::updateTreeList()
622 {
623  kdDebug( 700 ) << k_funcinfo << endl;
624 
625  d->pagetree.makeDirty();
626 
627  // remove all pages from the dialog and then add them again. This is needed
628  // because KDialogBase/KJanusWidget can only append to the end of the list
629  // and we need to have a predefined order.
630 
631  d->pagetree.removeFromDialog( d->dlg );
632  d->pagetree.addToDialog( d->dlg );
633 
634  if( d->pagetree.needTree() )
635  d->dlg->unfoldTreeList( true );
636 }
637 
638 } //namespace
639 
640 #include "dialog.moc"
KCMultiDialog
A method that offers a KDialogBase containing arbitrary KControl Modules.
Definition: kcmultidialog.h:44
KCMultiDialog::addModule
void addModule(const TQString &module, bool withfallback=true, TQStringList args=TQStringList())
Add a module.
Definition: kcmultidialog.cpp:232
KCMultiDialog::removeAllModules
void removeAllModules()
Remove all modules from the dialog.
Definition: kcmultidialog.cpp:333
KDialogBase::addVBoxPage
TQVBox * addVBoxPage(const TQString &itemName, const TQString &header=TQString::null, const TQPixmap &pixmap=TQPixmap())
KJanusWidget::Plain
Plain
KJanusWidget::IconList
IconList
KJanusWidget::TreeList
TreeList
KPluginInfo
Information about a plugin.
Definition: kplugininfo.h:43
KPluginInfo::isPluginEnabled
virtual bool isPluginEnabled() const
Definition: kplugininfo.cpp:198
KPluginInfo::load
virtual void load(TDEConfigGroup *config=0)
Load the state of the plugin - enabled or not.
Definition: kplugininfo.cpp:336
KSettings::Dialog::pluginSelectionChanged
void pluginSelectionChanged()
If you use the dialog in Configurable mode and want to be notified when the user changes the plugin s...
KSettings::Dialog::ContentInListView
ContentInListView
Tells the dialog whether the entries in the listview are all static or whether it should add a Config...
Definition: dialog.h:84
KSettings::Dialog::Static
@ Static
Static listview, while running no entries are added or deleted.
Definition: dialog.h:88
KSettings::Dialog::Dialog
Dialog(TQWidget *parent=0, const char *name=0)
Construct a new Preferences Dialog for the application.
Definition: dialog.cpp:358
KSettings::Dialog::addPluginInfos
void addPluginInfos(const TQValueList< KPluginInfo * > &plugininfos)
If you use a Configurable dialog you need to pass KPluginInfo objects that the dialog should configur...
Definition: dialog.cpp:402
KSettings::Dialog::show
void show()
Show the config dialog.
Definition: dialog.cpp:413
KSettings::Dispatcher::syncConfiguration
void syncConfiguration()
When this slot is called the TDEConfig objects of all the registered instances are sync()ed.
Definition: dispatcher.cpp:127
KSettings::Dispatcher::self
static Dispatcher * self()
Get a reference the the Dispatcher object.
Definition: dispatcher.cpp:40
KSimpleConfig
KSycocaEntry
TDECModuleInfo
A class that provides information about a TDECModule.
Definition: tdecmoduleinfo.h:50
TDECModuleInfo::service
KService::Ptr service() const
Definition: tdecmoduleinfo.h:137
TDECModuleInfo::moduleName
TQString moduleName() const
Definition: tdecmoduleinfo.h:131
TDEGlobal::dirs
static TDEStandardDirs * dirs()
TDEGlobal::instance
static TDEInstance * instance()
TDEIcon::Small
Small
TDEInstance::instanceName
TQCString instanceName() const
TDEShortcut::append
bool append(const KKeySequence &keySeq)
TDEStandardDirs::findAllResources
TQStringList findAllResources(const char *type, const TQString &filter=TQString::null, bool recursive=false, bool unique=false) const
kdFatal
kdbgstream kdFatal(int area=0)
endl
kndbgstream & endl(kndbgstream &s)
kdBacktrace
TQString kdBacktrace(int levels=-1)
kdWarning
kdbgstream kdWarning(int area=0)
kdDebug
kdbgstream kdDebug(int area=0)
locate
TQString locate(const char *type, const TQString &filename, const TDEInstance *instance=TDEGlobal::instance())
KSettings
A collection of classes to create configuration dialogs that work over component boundaries.
Definition: componentsdialog.cpp:33
TDEStdAccel::insert
const TDEShortcut & insert()
TDEStdAccel::name
TQString name(StdAccel id)
TDEStdAccel::end
const TDEShortcut & end()
tdelocale.h

tdeutils

Skip menu "tdeutils"
  • Main Page
  • Modules
  • Namespace List
  • Class Hierarchy
  • Alphabetical List
  • Class List
  • File List
  • Class Members
  • Related Pages

tdeutils

Skip menu "tdeutils"
  • arts
  • dcop
  • dnssd
  • interfaces
  •   kspeech
  •     interface
  •     library
  •   tdetexteditor
  • kate
  • kded
  • kdoctools
  • kimgio
  • kjs
  • libtdemid
  • libtdescreensaver
  • tdeabc
  • tdecmshell
  • tdecore
  • tdefx
  • tdehtml
  • tdeinit
  • tdeio
  •   bookmarks
  •   httpfilter
  •   kpasswdserver
  •   kssl
  •   tdefile
  •   tdeio
  •   tdeioexec
  • tdeioslave
  •   http
  • tdemdi
  •   tdemdi
  • tdenewstuff
  • tdeparts
  • tdeprint
  • tderandr
  • tderesources
  • tdespell2
  • tdesu
  • tdeui
  • tdeunittest
  • tdeutils
  • tdewallet
Generated for tdeutils by doxygen 1.9.1
This website is maintained by Timothy Pearson.