summaryrefslogtreecommitdiffstats
path: root/tderesources/manager.h
diff options
context:
space:
mode:
Diffstat (limited to 'tderesources/manager.h')
-rw-r--r--tderesources/manager.h422
1 files changed, 422 insertions, 0 deletions
diff --git a/tderesources/manager.h b/tderesources/manager.h
new file mode 100644
index 000000000..8fd35632b
--- /dev/null
+++ b/tderesources/manager.h
@@ -0,0 +1,422 @@
+/*
+ This file is part of libtderesources.
+
+ 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.
+*/
+
+#ifndef KRESOURCES_MANAGER_H
+#define KRESOURCES_MANAGER_H
+
+#include <tqdict.h>
+#include <tqstringlist.h>
+
+#include <kdebug.h>
+#include <tderesources/factory.h>
+#include <tderesources/managerimpl.h>
+
+namespace KRES {
+
+class Resource;
+
+/**
+ Observer class for Manager class. For getting notified about changes of
+ Resources managed by a Manager object implement this Observer interface and
+ add an object of this implementation to the Manager using addObserver(). The
+ resourceAdded(), resourceModified() and resourceDeleted() functions of your
+ implementation will be called whenever resources managed by the Manager object
+ are added, modified or deleted.
+*/
+template<class T>
+class ManagerObserver
+{
+ public:
+ virtual void resourceAdded( T *resource ) = 0;
+ virtual void resourceModified( T *resource ) = 0;
+ virtual void resourceDeleted( T *resource ) = 0;
+};
+
+/**
+ @internal
+*/
+class ManagerNotifier
+{
+ public:
+ virtual void notifyResourceAdded( Resource *resource ) = 0;
+ virtual void notifyResourceModified( Resource *resource ) = 0;
+ virtual void notifyResourceDeleted( Resource *resource ) = 0;
+};
+
+/**
+ This class provides a manager for resources of a specified family. It takes
+ care of loading and saving resource configurations and provides access to the
+ resources and their attributes. External changes in the resource configuration
+ are notified by the ManagerObserver interface. If your application needs to be
+ notified about resource configuration changes, you have to subclass
+ ManagerObserver and add it to the Manager by addObserver().
+
+ Since KDE 3.4 it's required to supply your application with a *.desktop
+ file for each resource family you introduce. The ServiceType should be of
+ KResources/Manager.
+*/
+template<class T>
+class Manager : private ManagerNotifier
+{
+ public:
+ /**
+ Iterator for iterations over all resources managed by a manager.
+ */
+ class Iterator
+ {
+ friend class Manager;
+ public:
+ Iterator() {};
+ Iterator( const Iterator &it ) { mIt = it.mIt; }
+
+ T *operator*() { return static_cast<T *>( *mIt ); }
+ Iterator &operator++() { mIt++; return *this; }
+ Iterator &operator++( int ) { mIt++; return *this; }
+ Iterator &operator--() { mIt--; return *this; }
+ Iterator &operator--( int ) { mIt--; return *this; }
+ bool operator==( const Iterator &it ) { return mIt == it.mIt; }
+ bool operator!=( const Iterator &it ) { return mIt != it.mIt; }
+
+ private:
+ Resource::List::Iterator mIt;
+ };
+
+ /**
+ Return Iterator on first resource. If there is no resource returns end().
+ */
+ Iterator begin()
+ {
+ Iterator it;
+ it.mIt = mImpl->resourceList()->begin();
+ return it;
+ }
+
+ /**
+ Return Iterator indicating end of resource list.
+ */
+ Iterator end()
+ {
+ Iterator it;
+ it.mIt = mImpl->resourceList()->end();
+ return it;
+ }
+
+ /**
+ Iterator for iterations over only active resources managed by a manager.
+ */
+ class ActiveIterator
+ {
+ friend class Manager;
+ public:
+ ActiveIterator() : mList( 0 ) {};
+ ActiveIterator( const ActiveIterator &it )
+ {
+ mIt = it.mIt;
+ mList = it.mList;
+ }
+
+ T *operator*() { return static_cast<T *>( *mIt ); }
+ ActiveIterator &operator++()
+ {
+ do { mIt++; } while ( checkActive() );
+ return *this;
+ }
+ ActiveIterator &operator++( int )
+ {
+ do { mIt++; } while ( checkActive() );
+ return *this;
+ }
+ ActiveIterator &operator--()
+ {
+ do { mIt--; } while ( checkActive() );
+ return *this;
+ }
+ ActiveIterator &operator--( int )
+ {
+ do { mIt--; } while ( checkActive() );
+ return *this;
+ }
+ bool operator==( const ActiveIterator &it ) { return mIt == it.mIt; }
+ bool operator!=( const ActiveIterator &it ) { return mIt != it.mIt; }
+
+ private:
+ /**
+ Check if iterator needs to be advanced once more.
+ */
+ bool checkActive()
+ {
+ if ( !mList || mIt == mList->end() ) return false;
+ return !(*mIt)->isActive();
+ }
+
+ Resource::List::Iterator mIt;
+ Resource::List *mList;
+ };
+
+ /**
+ Return Iterator on first active resource. If there is no active resource
+ returns end().
+ */
+ ActiveIterator activeBegin()
+ {
+ ActiveIterator it;
+ it.mIt = mImpl->resourceList()->begin();
+ it.mList = mImpl->resourceList();
+ if ( it.mIt != mImpl->resourceList()->end() ) {
+ if ( !(*it)->isActive() ) it++;
+ }
+ return it;
+ }
+
+ /**
+ Return Iterator indicating end of active resource list.
+ */
+ ActiveIterator activeEnd()
+ {
+ ActiveIterator it;
+ it.mIt = mImpl->resourceList()->end();
+ it.mList = mImpl->resourceList();
+ return it;
+ }
+
+ /**
+ Return true, if manager doesn't hold any resources. If there are resources
+ return false.
+ */
+ bool isEmpty() const { return mImpl->resourceList()->isEmpty(); }
+
+ /**
+ Create manager for given resource family. The family argument is used as
+ identifier for loading and saving resource configurations.
+ */
+ Manager( const TQString &family )
+ {
+ mFactory = Factory::self( family );
+ // The managerimpl will use the same Factory object as the manager
+ // because of the Factory::self() pattern
+ mImpl = new ManagerImpl( this, family );
+ mObservers.setAutoDelete( false );
+ }
+
+ virtual ~Manager()
+ {
+ delete mImpl;
+ }
+
+ /**
+ Recreate Resource objects from configuration file. If cfg is 0, read
+ standard configuration file determined by family name.
+ */
+ void readConfig( TDEConfig *cfg = 0 )
+ {
+ mImpl->readConfig( cfg );
+ }
+
+ /**
+ Write configuration of Resource objects to configuration file. If cfg is
+ 0, write to standard configuration file determined by family name.
+ */
+ void writeConfig( TDEConfig *cfg = 0 )
+ {
+ mImpl->writeConfig( cfg );
+ }
+
+ /**
+ Add resource to manager. This passes ownership of the Resource object
+ to the manager.
+ */
+ void add( Resource *resource )
+ {
+ if ( resource ) mImpl->add( resource );
+ }
+
+ /**
+ Remove resource from manager. This deletes the Resource object.
+ */
+ void remove( Resource *resource )
+ {
+ if ( resource ) mImpl->remove( resource );
+ }
+
+ /**
+ Call this to notify manager about changes of the configuration of the
+ given resource.
+ */
+ void change( T *resource )
+ {
+ mImpl->change( resource );
+ }
+
+ /**
+ Return standard resource.
+ */
+ T *standardResource()
+ {
+ return static_cast<T *>( mImpl->standardResource() );
+ }
+
+ /**
+ Set standard resource.
+ */
+ void setStandardResource( T *resource )
+ {
+ if ( resource ) mImpl->setStandardResource( resource );
+ }
+
+ /**
+ Set active state of resource.
+ */
+ void setActive( Resource *resource, bool active )
+ {
+ if ( resource ) mImpl->setActive( resource, active );
+ }
+
+ /**
+ Returns a list of the names of the resources managed by the
+ Manager for this family.
+ */
+ TQStringList resourceNames() const
+ {
+ return mImpl->resourceNames();
+ }
+
+ /**
+ Creates a new resource of type @p type with default
+ settings. The resource is
+ not added to the manager, the application has to do that.
+ Returns a pointer to a resource object or a null pointer
+ if resource type doesn't exist.
+
+ @param type The type of the resource, one of those returned
+ by resourceTypeNames()
+ */
+ T *createResource( const TQString& type )
+ {
+ return dynamic_cast<T *>( mFactory->resource( type, 0 ) );
+ }
+
+ /**
+ Returns a list of the names of all available resource types.
+ */
+ TQStringList resourceTypeNames() const
+ {
+ return mFactory->typeNames();
+ }
+
+ /**
+ Return list of descriptions of all available resource types.
+ */
+ TQStringList resourceTypeDescriptions() const
+ {
+ TQStringList typeDescs;
+ TQStringList types = mFactory->typeNames();
+
+ for ( TQStringList::ConstIterator it = types.begin(); it != types.end();
+ ++it ) {
+ TQString desc = mFactory->typeName( *it );
+ if ( !mFactory->typeDescription( *it ).isEmpty() )
+ desc += TQString::fromLatin1(" (") + mFactory->typeDescription( *it ) + TQString::fromLatin1(")");
+
+ typeDescs.append( desc );
+ }
+
+ return typeDescs;
+ }
+
+ /**
+ Add observer for resource changes to manager. See ManagerObserver. The
+ Manager does not take ownership of the Observer object.
+ */
+ void addObserver( ManagerObserver<T> *observer )
+ {
+ mObservers.append( observer );
+ }
+
+ /**
+ Remove Observer for resource changes from manager. See ManagerObserver.
+ The Observer is not deleted by the Manager after being removed.
+ */
+ void removeObserver( ManagerObserver<T> *observer )
+ {
+ mObservers.remove( observer );
+ }
+
+ private:
+ /**
+ Implementation of the ManagerNotifier interface.
+ */
+ void notifyResourceAdded( Resource *res )
+ {
+ kdDebug(5650) << "Manager::resourceAdded " << res->resourceName() << endl;
+ T *resource = dynamic_cast<T *>( res );
+ if ( resource ) {
+ ManagerObserver<T> *observer;
+ for ( observer = mObservers.first(); observer;
+ observer = mObservers.next() )
+ observer->resourceAdded( resource );
+ }
+ }
+
+ /**
+ Implementation of the ManagerNotifier interface.
+ */
+ void notifyResourceModified( Resource *res )
+ {
+ kdDebug(5650) << "Manager::resourceModified " << res->resourceName()
+ << endl;
+ T *resource = dynamic_cast<T *>( res );
+ if ( resource ) {
+ ManagerObserver<T> *observer;
+ for ( observer = mObservers.first(); observer;
+ observer = mObservers.next() )
+ observer->resourceModified( resource );
+ }
+ }
+
+ /**
+ Implementation of the ManagerNotifier interface.
+ */
+ void notifyResourceDeleted( Resource *res )
+ {
+ kdDebug(5650) << "Manager::resourceDeleted " << res->resourceName()
+ << endl;
+ T *resource = dynamic_cast<T *>( res );
+ if ( resource ) {
+ ManagerObserver<T> *observer;
+ for ( observer = mObservers.first(); observer;
+ observer = mObservers.next() ) {
+ kdDebug(5650) << "Notifying a observer to Manager..." << endl;
+ observer->resourceDeleted( resource );
+ }
+ }
+ }
+
+ private:
+ ManagerImpl *mImpl;
+ Factory *mFactory;
+ TQPtrList<ManagerObserver<T> > mObservers;
+};
+
+}
+
+#endif