VTK
|
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