diff options
Diffstat (limited to 'kutils/tdecmodulecontainer.h')
-rw-r--r-- | kutils/tdecmodulecontainer.h | 207 |
1 files changed, 207 insertions, 0 deletions
diff --git a/kutils/tdecmodulecontainer.h b/kutils/tdecmodulecontainer.h new file mode 100644 index 000000000..5708f80cf --- /dev/null +++ b/kutils/tdecmodulecontainer.h @@ -0,0 +1,207 @@ +/* This file is part of the KDE libraries + Copyright (C) 2004 Frans Englich <frans.englich@telia.com> + + 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. +*/ + +#ifndef KCMODULECONTAINER_H +#define KCMODULECONTAINER_H + +#include <tqvaluelist.h> +#include <tqstring.h> +#include <tqstringlist.h> + +#include <tdecmodule.h> +#include <tdecmoduleloader.h> + +class TQTabWidget; +class TQWidget; +class TQVBoxLayout; + +class TDECModuleProxy; + +/** + * @ingroup tdecmodule + * @brief TDECModuleContainer is a convenience class encapsulating several TDECModules. + * + * The TDECModuleContainer class is a convenience class for organizing a multiple set + * of TDECModule. TDECModuleContainer is a sub class of TDECModule and builds an interface mainly + * consisting of a tab widget where each tab contains one of the modules specified via one of the + * constructors. TDECModuleContainer can handle modules which requires root permissions. What you + * most likely want is the KCMODULECONTAINER macro. \n + * Sometimes it is of interest to detect in runtime whether a module should be loaded or not. This + * can be achieved by sub classing TDECModuleContainer, doing the probing/testing checks and then manually + * call addModule for each module which should be displayed. When all calls to addModule is done, call + * finalize() which performs some necessary final steps. + * + * @author Frans Englich <frans.englich@telia.com> + * @since 3.4 + */ +class KUTILS_EXPORT TDECModuleContainer : public TDECModule +{ + Q_OBJECT + public: + /** + * Creates a TDECModuleContainer with tabs, each one containing one of the + * specified modules in @p mods. + * + * @param parent the parent TQWidget. + * @param name the module's name. + * @param mods The list of TDECModules to be loaded. The name of each + * TDECModule is its service name, that is the name of the desktop file without + * the ".desktop" part + * + */ + TDECModuleContainer( TQWidget* parent, const char* name, const TQStringList& mods ); + + /** + * This is a convenience function, instead of building a TQStringList you + * can specify the modules in a comma separated TQString. For example; + * \code + * TDECModuleContainer* cont = TDECModuleContainer( this, "kcm_misc", TQString("kcm_energy, kcm_keyboard ,kcm_useraccount, kcm_mouse") ); + * \endcode + * The other constructor takes its modules in a QStringlist which also can be constructed from a + * string and thus you will have to be explicit on the data type. + * + * What you probably want is the KCMODULECONTAINER macro which builds an TDECModule + * for you, taking the modules you want as argument. + * + * @param parent The parent widget + * @param name The service name + * @param mods The modules to load + * @return The TDECModule containing the requested modules. + */ + TDECModuleContainer( TQWidget *parent, const char* name, const TQString& mods = TQString() ); + + /** + * Adds the specified module to the tab widget. Setting the tab icon, text, + * tool tip, connecting the signals is what it does. + * + * @param module the name of the module to add. The name is the desktop file's name + * without the ".desktop" part. + */ + void addModule( const TQString& module ); + + /** + * Default destructor. + */ + virtual ~TDECModuleContainer(); + + /** + * Reimplemented for internal purposes. + * @internal + */ + void save(); + + /** + * Reimplemented for internal purposes. + * @internal + */ + void load(); + + /** + * Reimplemented for internal purposes. + * @internal + */ + void defaults(); + + protected: + + /** + * Sets this KCM's buttons and adds a AdminMode button + * if necessary. If TDECModuleContainer is subclassed finalize() + * should be called in the constructor after all calls to addModule + * have been done. Call it once. + */ + void finalize(); + + typedef TQValueList<TDECModuleProxy*> ModuleList; + + /** + * A list containing TDECModuleProxy objects which + * have changed and must be saved. + */ + ModuleList changedModules; + + /** + * A list of all modules which are encapsulated. + */ + ModuleList allModules; // KDE 4 put in the Private class and abstract with getter + + private slots: + + /** + * Enables/disables the Admin Mode button, as appropriate. + */ + void tabSwitched( TQWidget * module ); + + void moduleChanged(TDECModuleProxy *proxy); + + /** + * Called when the user clicks our custom root button. + */ + void runAsRoot(); + + /** + * Enables the admin mode button + */ + void rootExited(); + + private: + + void init(); + + class TDECModuleContainerPrivate; + TDECModuleContainerPrivate *d; + +}; + +/** + * @ingroup tdecmodule + * This macro creates an factory declaration which when run creates an TDECModule with specified + * modules. For example: + * \code + * KCMODULECONTAINER( "kcm_fonts, kcm_keyboard,kcm_fonts", misc_modules) + * \endcode + * would create a TDECModule with three tabs, each containing one of the specified KCMs. Each + * use of the macro must be accompanied by a desktop file where the factory name equals + * the second argument in the macro(in this example, misc_modules). \n + * The module container takes care of testing the contained modules when being shown, as well + * as when the module itself is asked whether it should be shown. + * + * @param modules the modules to put in the container + * @param factoryName what factory name the module should have + */ +#define KCMODULECONTAINER( modules, factoryName ) \ +extern "C" \ +{ \ + TDECModule *create_## factoryName(TQWidget *parent, const char *name) \ + { \ + return new TDECModuleContainer( parent, name, TQString( modules ) ); \ + } \ + \ + bool test_## factoryName() \ + { \ + TQStringList modList = TQStringList::split( ",", TQString(modules).remove( " " )); \ + for ( TQStringList::Iterator it = modList.begin(); it != modList.end(); ++it ) \ + if ( TDECModuleLoader::testModule( *it ) ) \ + return true; \ + return false; \ + } \ +} + +#endif // KCMODULECONTAINER_H + |