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     }
00187 //ETX
00189 
00190 //BTX
00192 
00195   int InvokeEvent(unsigned long event, void *callData);
00196   int InvokeEvent(const char *event, void *callData);
00197 //ETX
00198   int InvokeEvent(unsigned long event) { return this->InvokeEvent(event, NULL); };
00199   int InvokeEvent(const char *event) { return this->InvokeEvent(event, NULL); };
00201   
00202 protected:
00203   vtkObject(); 
00204   virtual ~vtkObject(); 
00205 
00206   // See vtkObjectBase.h.
00207   virtual void RegisterInternal(vtkObjectBase*, int check);
00208   virtual void UnRegisterInternal(vtkObjectBase*, int check);
00209 
00210   unsigned char     Debug;      // Enable debug messages
00211   vtkTimeStamp      MTime;      // Keep track of modification time
00212   vtkSubjectHelper *SubjectHelper; // List of observers on this object
00213 
00214 //BTX
00216 
00223   void InternalGrabFocus(vtkCommand *mouseEvents, vtkCommand *keypressEvents=NULL);
00224   void InternalReleaseFocus();
00225 //ETX
00226 //BTX
00227 private:
00228   vtkObject(const vtkObject&);  // Not implemented.
00229   void operator=(const vtkObject&);  // Not implemented.
00231 
00233 
00238   class vtkClassMemberCallbackBase
00239     {
00240   public:
00241     // Description:
00242     // Called when the event is invoked
00243     virtual void operator()(vtkObject*, unsigned long, void*) = 0;
00244     virtual ~vtkClassMemberCallbackBase(){}
00245     };
00247 
00249 
00251   template<class T>
00252     class vtkClassMemberHandlerPointer
00253       {
00254     public:
00255       void operator=(vtkObjectBase *o)
00256         {
00257         // The cast is needed in case "o" has multi-inheritance,
00258         // to offset the pointer to get the vtkObjectBase.
00259         if ((this->VoidPointer = dynamic_cast<T*>(o)) == 0)
00260           {
00261           // fallback to just using its vtkObjectBase as-is.
00262           this->VoidPointer = o;
00263           }
00264         this->WeakPointer = o;
00265         this->UseWeakPointer = true;
00266         }
00267       void operator=(void *o)
00268         {
00269         this->VoidPointer = o;
00270         this->WeakPointer = 0;
00271         this->UseWeakPointer = false;
00272         }
00273       T *GetPointer()
00274         {
00275         if (this->UseWeakPointer && !this->WeakPointer.GetPointer())
00276           {
00277           return 0;
00278           }
00279         return static_cast<T*>(this->VoidPointer);
00280         }
00281     private:
00282       vtkWeakPointerBase WeakPointer;
00283       void *VoidPointer;
00284       bool UseWeakPointer;
00285       };
00287 
00289 
00290   template <class T>
00291     class vtkClassMemberCallback : public vtkClassMemberCallbackBase
00292       {
00293       vtkClassMemberHandlerPointer<T> Handler;
00294       void (T::*Method1)();
00295       void (T::*Method2)(vtkObject*, unsigned long, void*);
00297 
00298     public:
00299       vtkClassMemberCallback(T* handler, void (T::*method)())
00300         {
00301         this->Handler = handler;
00302         this->Method1 = method;
00303         this->Method2 = NULL;
00304         }
00305 
00306       vtkClassMemberCallback(
00307         T* handler, void (T::*method)(vtkObject*, unsigned long, void*))
00308         {
00309         this->Handler = handler;
00310         this->Method1 = NULL;
00311         this->Method2 = method;
00312         }
00313       virtual ~vtkClassMemberCallback() { }
00314 
00315       // Called when the event is invoked
00316       virtual void operator()(
00317         vtkObject* caller, unsigned long event, void* calldata)
00318         {
00319         T *handler = this->Handler.GetPointer();
00320         if (handler)
00321           {
00322           if (this->Method1)
00323             {
00324             (handler->*this->Method1)();
00325             }
00326           else if (this->Method2)
00327             {
00328             (handler->*this->Method2)(caller, event, calldata);
00329             }
00330           }
00331         }
00332       };
00333 
00335 
00336   unsigned long AddTemplatedObserver(
00337     unsigned long event, vtkClassMemberCallbackBase* callable, float priority);
00338   // Friend to access AddTemplatedObserver().
00339   friend class vtkObjectCommandInternal;
00340 //ETX
00341 };
00343 
00344 #endif