manager.h
00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024 #ifndef KRESOURCES_MANAGER_H
00025 #define KRESOURCES_MANAGER_H
00026
00027 #include <qdict.h>
00028 #include <qstringlist.h>
00029
00030 #include <kdebug.h>
00031 #include <kresources/factory.h>
00032 #include <kresources/managerimpl.h>
00033
00034 namespace KRES {
00035
00036 class Resource;
00037
00046 template<class T>
00047 class ManagerObserver
00048 {
00049 public:
00050 virtual void resourceAdded( T *resource ) = 0;
00051 virtual void resourceModified( T *resource ) = 0;
00052 virtual void resourceDeleted( T *resource ) = 0;
00053 };
00054
00058 class ManagerNotifier
00059 {
00060 public:
00061 virtual void notifyResourceAdded( Resource *resource ) = 0;
00062 virtual void notifyResourceModified( Resource *resource ) = 0;
00063 virtual void notifyResourceDeleted( Resource *resource ) = 0;
00064 };
00065
00074 template<class T>
00075 class Manager : private ManagerNotifier
00076 {
00077 public:
00081 class Iterator
00082 {
00083 friend class Manager;
00084 public:
00085 Iterator() {};
00086 Iterator( const Iterator &it ) { mIt = it.mIt; }
00087
00088 T *operator*() { return static_cast<T *>( *mIt ); }
00089 Iterator &operator++() { mIt++; return *this; }
00090 Iterator &operator++( int ) { mIt++; return *this; }
00091 Iterator &operator--() { mIt--; return *this; }
00092 Iterator &operator--( int ) { mIt--; return *this; }
00093 bool operator==( const Iterator &it ) { return mIt == it.mIt; }
00094 bool operator!=( const Iterator &it ) { return mIt != it.mIt; }
00095
00096 private:
00097 Resource::List::Iterator mIt;
00098 };
00099
00103 Iterator begin()
00104 {
00105 Iterator it;
00106 it.mIt = mImpl->resourceList()->begin();
00107 return it;
00108 }
00109
00113 Iterator end()
00114 {
00115 Iterator it;
00116 it.mIt = mImpl->resourceList()->end();
00117 return it;
00118 }
00119
00123 class ActiveIterator
00124 {
00125 friend class Manager;
00126 public:
00127 ActiveIterator() : mList( 0 ) {};
00128 ActiveIterator( const ActiveIterator &it )
00129 {
00130 mIt = it.mIt;
00131 mList = it.mList;
00132 }
00133
00134 T *operator*() { return static_cast<T *>( *mIt ); }
00135 ActiveIterator &operator++()
00136 {
00137 do { mIt++; } while ( checkActive() );
00138 return *this;
00139 }
00140 ActiveIterator &operator++( int )
00141 {
00142 do { mIt++; } while ( checkActive() );
00143 return *this;
00144 }
00145 ActiveIterator &operator--()
00146 {
00147 do { mIt--; } while ( checkActive() );
00148 return *this;
00149 }
00150 ActiveIterator &operator--( int )
00151 {
00152 do { mIt--; } while ( checkActive() );
00153 return *this;
00154 }
00155 bool operator==( const ActiveIterator &it ) { return mIt == it.mIt; }
00156 bool operator!=( const ActiveIterator &it ) { return mIt != it.mIt; }
00157
00158 private:
00162 bool checkActive()
00163 {
00164 if ( !mList || mIt == mList->end() ) return false;
00165 return !(*mIt)->isActive();
00166 }
00167
00168 Resource::List::Iterator mIt;
00169 Resource::List *mList;
00170 };
00171
00176 ActiveIterator activeBegin()
00177 {
00178 ActiveIterator it;
00179 it.mIt = mImpl->resourceList()->begin();
00180 it.mList = mImpl->resourceList();
00181 if ( it.mIt != mImpl->resourceList()->end() ) {
00182 if ( !(*it)->isActive() ) it++;
00183 }
00184 return it;
00185 }
00186
00190 ActiveIterator activeEnd()
00191 {
00192 ActiveIterator it;
00193 it.mIt = mImpl->resourceList()->end();
00194 it.mList = mImpl->resourceList();
00195 return it;
00196 }
00197
00202 bool isEmpty() const { return mImpl->resourceList()->isEmpty(); }
00203
00208 Manager( const QString &family )
00209 {
00210 mFactory = Factory::self( family );
00211
00212
00213 mImpl = new ManagerImpl( this, family );
00214 mObservers.setAutoDelete( false );
00215 }
00216
00217 virtual ~Manager()
00218 {
00219 delete mImpl;
00220 }
00221
00226 void readConfig( KConfig *cfg = 0 )
00227 {
00228 mImpl->readConfig( cfg );
00229 }
00230
00235 void writeConfig( KConfig *cfg = 0 )
00236 {
00237 mImpl->writeConfig( cfg );
00238 }
00239
00244 void add( Resource *resource )
00245 {
00246 if ( resource ) mImpl->add( resource );
00247 }
00248
00252 void remove( Resource *resource )
00253 {
00254 if ( resource ) mImpl->remove( resource );
00255 }
00256
00261 void change( T *resource )
00262 {
00263 mImpl->change( resource );
00264 }
00265
00269 T *standardResource()
00270 {
00271 return static_cast<T *>( mImpl->standardResource() );
00272 }
00273
00277 void setStandardResource( T *resource )
00278 {
00279 if ( resource ) mImpl->setStandardResource( resource );
00280 }
00281
00285 void setActive( Resource *resource, bool active )
00286 {
00287 if ( resource ) mImpl->setActive( resource, active );
00288 }
00289
00294 QStringList resourceNames() const
00295 {
00296 return mImpl->resourceNames();
00297 }
00298
00309 T *createResource( const QString& type )
00310 {
00311 return dynamic_cast<T *>( mFactory->resource( type, 0 ) );
00312 }
00313
00317 QStringList resourceTypeNames() const
00318 {
00319 return mFactory->typeNames();
00320 }
00321
00325 QStringList resourceTypeDescriptions() const
00326 {
00327 QStringList typeDescs;
00328 QStringList types = mFactory->typeNames();
00329
00330 for ( QStringList::ConstIterator it = types.begin(); it != types.end();
00331 ++it ) {
00332 QString desc = mFactory->typeName( *it );
00333 if ( !mFactory->typeDescription( *it ).isEmpty() )
00334 desc += " (" + mFactory->typeDescription( *it ) + ")";
00335
00336 typeDescs.append( desc );
00337 }
00338
00339 return typeDescs;
00340 }
00341
00346 void addObserver( ManagerObserver<T> *observer )
00347 {
00348 mObservers.append( observer );
00349 }
00350
00355 void removeObserver( ManagerObserver<T> *observer )
00356 {
00357 mObservers.remove( observer );
00358 }
00359
00360 private:
00364 void notifyResourceAdded( Resource *res )
00365 {
00366 kdDebug(5650) << "Manager::resourceAdded " << res->resourceName() << endl;
00367 T *resource = dynamic_cast<T *>( res );
00368 if ( resource ) {
00369 ManagerObserver<T> *observer;
00370 for ( observer = mObservers.first(); observer;
00371 observer = mObservers.next() )
00372 observer->resourceAdded( resource );
00373 }
00374 }
00375
00379 void notifyResourceModified( Resource *res )
00380 {
00381 kdDebug(5650) << "Manager::resourceModified " << res->resourceName()
00382 << endl;
00383 T *resource = dynamic_cast<T *>( res );
00384 if ( resource ) {
00385 ManagerObserver<T> *observer;
00386 for ( observer = mObservers.first(); observer;
00387 observer = mObservers.next() )
00388 observer->resourceModified( resource );
00389 }
00390 }
00391
00395 void notifyResourceDeleted( Resource *res )
00396 {
00397 kdDebug(5650) << "Manager::resourceDeleted " << res->resourceName()
00398 << endl;
00399 T *resource = dynamic_cast<T *>( res );
00400 if ( resource ) {
00401 ManagerObserver<T> *observer;
00402 for ( observer = mObservers.first(); observer;
00403 observer = mObservers.next() ) {
00404 kdDebug(5650) << "Notifying a observer to Manager..." << endl;
00405 observer->resourceDeleted( resource );
00406 }
00407 }
00408 }
00409
00410 private:
00411 ManagerImpl *mImpl;
00412 Factory *mFactory;
00413 QPtrList<ManagerObserver<T> > mObservers;
00414 };
00415
00416 }
00417
00418 #endif
This file is part of the documentation for kresources Library Version 3.3.90.