VTK
dox/Common/vtkObject.h
Go to the documentation of this file.
00001 /*=========================================================================
00002 
00003   Program:   Visualization Toolkit
00004   Module:    vtkObject.h
00005 
00006   Copyright (c) Ken Martin, Will Schroeder, Bill Lorensen
00007   All rights reserved.
00008   See Copyright.txt or http://www.kitware.com/Copyright.htm for details.
00009 
00010      This software is distributed WITHOUT ANY WARRANTY; without even
00011      the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR
00012      PURPOSE.  See the above copyright notice for more information.
00013 
00014 =========================================================================*/
00049 #ifndef __vtkObject_h
00050 #define __vtkObject_h
00051 
00052 #include "vtkObjectBase.h"
00053 #include "vtkSetGet.h"
00054 #include "vtkTimeStamp.h"
00055 #include "vtkWeakPointerBase.h" // needed for vtkWeakPointer
00056 
00057 class vtkSubjectHelper;
00058 class vtkCommand;
00059 
00060 class VTK_COMMON_EXPORT vtkObject : public vtkObjectBase
00061 {
00062 public:
00063   vtkTypeMacro(vtkObject,vtkObjectBase);
00064 
00067   static vtkObject *New();
00068 
00069 #ifdef _WIN32
00070   // avoid dll boundary problems
00071   void* operator new( size_t tSize );
00072   void operator delete( void* p );
00073 #endif 
00074   
00076   virtual void DebugOn();
00077 
00079   virtual void DebugOff();
00080   
00082   unsigned char GetDebug();
00083   
00085   void SetDebug(unsigned char debugFlag);
00086   
00089   static void BreakOnError();
00090   
00095   virtual void Modified();
00096   
00098   virtual unsigned long GetMTime();
00099 
00104   virtual void PrintSelf(ostream& os, vtkIndent indent);
00105 
00107 
00109   static void SetGlobalWarningDisplay(int val);
00110   static void GlobalWarningDisplayOn(){vtkObject::SetGlobalWarningDisplay(1);};
00111   static void GlobalWarningDisplayOff() 
00112     {vtkObject::SetGlobalWarningDisplay(0);};
00113   static int  GetGlobalWarningDisplay();
00115 
00116 //BTX
00118 
00127   unsigned long AddObserver(unsigned long event, vtkCommand *, 
00128                             float priority=0.0f);
00129   unsigned long AddObserver(const char *event, vtkCommand *, 
00130                             float priority=0.0f);
00131   vtkCommand *GetCommand(unsigned long tag);
00132   void RemoveObserver(vtkCommand*);
00133   void RemoveObservers(unsigned long event, vtkCommand *);
00134   void RemoveObservers(const char *event, vtkCommand *);
00135   int HasObserver(unsigned long event, vtkCommand *);
00136   int HasObserver(const char *event, vtkCommand *);
00137 //ETX
00138   void RemoveObserver(unsigned long tag);
00139   void RemoveObservers(unsigned long event);
00140   void RemoveObservers(const char *event);
00141   void RemoveAllObservers(); //remove every last one of them
00142   int HasObserver(unsigned long event);
00143   int HasObserver(const char *event);
00145 
00146 //BTX
00148 
00166   template <class U, class T>
00167   unsigned long AddObserver(unsigned long event,
00168     U observer, void (T::*callback)(), float priority=0.0f)
00169     {
00170     vtkClassMemberCallback<T> *callable =
00171       new vtkClassMemberCallback<T>(observer, callback);
00172     // callable is deleted when the observer is cleaned up (look at
00173     // vtkObjectCommandInternal)
00174     return this->AddTemplatedObserver(event, callable, priority);
00175     }
00176   template <class U, class T>
00177   unsigned long AddObserver(unsigned long event,
00178     U observer, void (T::*callback)(vtkObject*, unsigned long, void*),
00179     float priority=0.0f)
00180     {
00181     vtkClassMemberCallback<T> *callable =
00182       new vtkClassMemberCallback<T>(observer, callback);
00183     // callable is deleted when the observer is cleaned up (look at
00184     // vtkObjectCommandInternal)
00185     return this->AddTemplatedObserver(event, callable, priority);
00186     }
00188 
00190 
00192   template <class U, class T>
00193   unsigned long AddObserver(unsigned long event,
00194     U observer, bool (T::*callback)(vtkObject*, unsigned long, void*),
00195     float priority=0.0f)
00196     {
00197     vtkClassMemberCallback<T> *callable =
00198       new vtkClassMemberCallback<T>(observer, callback);
00199     // callable is deleted when the observer is cleaned up (look at
00200     // vtkObjectCommandInternal)
00201     return this->AddTemplatedObserver(event, callable, priority);
00202     }
00203 //ETX
00205 
00206 //BTX
00208 
00211   int InvokeEvent(unsigned long event, void *callData);
00212   int InvokeEvent(const char *event, void *callData);
00213 //ETX
00214   int InvokeEvent(unsigned long event) { return this->InvokeEvent(event, NULL); };
00215   int InvokeEvent(const char *event) { return this->InvokeEvent(event, NULL); };
00217   
00218 protected:
00219   vtkObject(); 
00220   virtual ~vtkObject(); 
00221 
00222   // See vtkObjectBase.h.
00223   virtual void RegisterInternal(vtkObjectBase*, int check);
00224   virtual void UnRegisterInternal(vtkObjectBase*, int check);
00225 
00226   unsigned char     Debug;      // Enable debug messages
00227   vtkTimeStamp      MTime;      // Keep track of modification time
00228   vtkSubjectHelper *SubjectHelper; // List of observers on this object
00229 
00230 //BTX
00232 
00239   void InternalGrabFocus(vtkCommand *mouseEvents, vtkCommand *keypressEvents=NULL);
00240   void InternalReleaseFocus();
00241 //ETX
00242 //BTX
00243 private:
00244   vtkObject(const vtkObject&);  // Not implemented.
00245   void operator=(const vtkObject&);  // Not implemented.
00247 
00249 
00254   class vtkClassMemberCallbackBase
00255     {
00256   public:
00258 
00259 
00260     virtual bool operator()(vtkObject*, unsigned long, void*) = 0;
00261     virtual ~vtkClassMemberCallbackBase(){}
00262     };
00264 
00266 
00268   template<class T>
00269     class vtkClassMemberHandlerPointer
00270       {
00271     public:
00272       void operator=(vtkObjectBase *o)
00273         {
00274         // The cast is needed in case "o" has multi-inheritance,
00275         // to offset the pointer to get the vtkObjectBase.
00276         if ((this->VoidPointer = dynamic_cast<T*>(o)) == 0)
00277           {
00278           // fallback to just using its vtkObjectBase as-is.
00279           this->VoidPointer = o;
00280           }
00281         this->WeakPointer = o;
00282         this->UseWeakPointer = true;
00283         }
00284       void operator=(void *o)
00285         {
00286         this->VoidPointer = o;
00287         this->WeakPointer = 0;
00288         this->UseWeakPointer = false;
00289         }
00290       T *GetPointer()
00291         {
00292         if (this->UseWeakPointer && !this->WeakPointer.GetPointer())
00293           {
00294           return 0;
00295           }
00296         return static_cast<T*>(this->VoidPointer);
00297         }
00298     private:
00299       vtkWeakPointerBase WeakPointer;
00300       void *VoidPointer;
00301       bool UseWeakPointer;
00302       };
00304 
00306 
00307   template <class T>
00308     class vtkClassMemberCallback : public vtkClassMemberCallbackBase
00309       {
00310       vtkClassMemberHandlerPointer<T> Handler;
00311       void (T::*Method1)();
00312       void (T::*Method2)(vtkObject*, unsigned long, void*);
00313       bool (T::*Method3)(vtkObject*, unsigned long, void*);
00315 
00316     public:
00317       vtkClassMemberCallback(T* handler, void (T::*method)())
00318         {
00319         this->Handler = handler;
00320         this->Method1 = method;
00321         this->Method2 = NULL;
00322         this->Method3 = NULL;
00323         }
00324 
00325       vtkClassMemberCallback(
00326         T* handler, void (T::*method)(vtkObject*, unsigned long, void*))
00327         {
00328         this->Handler = handler;
00329         this->Method1 = NULL;
00330         this->Method2 = method;
00331         this->Method3 = NULL;
00332         }
00333 
00334       vtkClassMemberCallback(
00335         T* handler, bool (T::*method)(vtkObject*, unsigned long, void*))
00336         {
00337         this->Handler = handler;
00338         this->Method1 = NULL;
00339         this->Method2 = NULL;
00340         this->Method3 = method;
00341         }
00342       virtual ~vtkClassMemberCallback() { }
00343 
00344       // Called when the event is invoked
00345       virtual bool operator()(
00346         vtkObject* caller, unsigned long event, void* calldata)
00347         {
00348         T *handler = this->Handler.GetPointer();
00349         if (handler)
00350           {
00351           if (this->Method1)
00352             {
00353             (handler->*this->Method1)();
00354             }
00355           else if (this->Method2)
00356             {
00357             (handler->*this->Method2)(caller, event, calldata);
00358             }
00359           else if (this->Method3)
00360             {
00361             return (handler->*this->Method3)(caller, event, calldata);
00362             }
00363           }
00364         return false;
00365         }
00366       };
00367 
00369 
00370   unsigned long AddTemplatedObserver(
00371     unsigned long event, vtkClassMemberCallbackBase* callable, float priority);
00372   // Friend to access AddTemplatedObserver().
00373   friend class vtkObjectCommandInternal;
00374 //ETX
00375 };
00377 
00378 #endif