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