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