00001 
00002 
00003 
00004 
00005 
00006 
00007 
00008 
00009 
00010 
00011 
00012 
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" 
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   
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 
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 
00138   void RemoveObserver(unsigned long tag);
00139   void RemoveObservers(unsigned long event);
00140   void RemoveObservers(const char *event);
00141   void RemoveAllObservers(); 
00142   int HasObserver(unsigned long event);
00143   int HasObserver(const char *event);
00145 
00146 
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     
00173     
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     
00184     
00185     return this->AddTemplatedObserver(event, callable, priority);
00186     }
00187 
00189 
00190 
00192 
00195   int InvokeEvent(unsigned long event, void *callData);
00196   int InvokeEvent(const char *event, void *callData);
00197 
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   
00207   virtual void RegisterInternal(vtkObjectBase*, int check);
00208   virtual void UnRegisterInternal(vtkObjectBase*, int check);
00209 
00210   unsigned char     Debug;      
00211   vtkTimeStamp      MTime;      
00212   vtkSubjectHelper *SubjectHelper; 
00213 
00214 
00216 
00223   void InternalGrabFocus(vtkCommand *mouseEvents, vtkCommand *keypressEvents=NULL);
00224   void InternalReleaseFocus();
00225 
00226 
00227 private:
00228   vtkObject(const vtkObject&);  
00229   void operator=(const vtkObject&);  
00231 
00233 
00238   class vtkClassMemberCallbackBase
00239     {
00240   public:
00241     
00242     
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         
00258         
00259         if ((this->VoidPointer = dynamic_cast<T*>(o)) == 0)
00260           {
00261           
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       
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   
00339   friend class vtkObjectCommandInternal;
00340 
00341 };
00343 
00344 #endif