ITK
4.1.0
Insight Segmentation and Registration Toolkit
|
00001 /*========================================================================= 00002 * 00003 * Copyright Insight Software Consortium 00004 * 00005 * Licensed under the Apache License, Version 2.0 (the "License"); 00006 * you may not use this file except in compliance with the License. 00007 * You may obtain a copy of the License at 00008 * 00009 * http://www.apache.org/licenses/LICENSE-2.0.txt 00010 * 00011 * Unless required by applicable law or agreed to in writing, software 00012 * distributed under the License is distributed on an "AS IS" BASIS, 00013 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 00014 * See the License for the specific language governing permissions and 00015 * limitations under the License. 00016 * 00017 *=========================================================================*/ 00018 #ifndef __itkCommand_h 00019 #define __itkCommand_h 00020 00021 #include "itkObject.h" 00022 #include "itkObjectFactory.h" 00023 00024 namespace itk 00025 { 00043 // The superclass that all commands should be subclasses of 00044 class ITKCommon_EXPORT Command:public Object 00045 { 00046 public: 00048 typedef Command Self; 00049 typedef Object Superclass; 00050 typedef SmartPointer< Self > Pointer; 00051 typedef SmartPointer< const Self > ConstPointer; 00052 00054 itkTypeMacro(Command, Object); 00055 00057 virtual void Execute(Object *caller, const EventObject & event) = 0; 00058 00062 virtual void Execute(const Object *caller, const EventObject & event) = 0; 00063 00064 protected: 00065 Command(); 00066 ~Command(); 00067 private: 00068 Command(const Self &); //purposely not implemented 00069 void operator=(const Self &); //purposely not implemented 00070 }; 00071 00072 // some implementations for several callback types 00073 00083 template< class T > 00084 class MemberCommand:public Command 00085 { 00086 public: 00088 typedef void ( T::*TMemberFunctionPointer )(Object *, const EventObject &); 00089 typedef void ( T::*TConstMemberFunctionPointer )(const Object *, 00090 const EventObject &); 00092 00094 typedef MemberCommand Self; 00095 typedef SmartPointer< Self > Pointer; 00096 00098 itkNewMacro(Self); 00099 00101 itkTypeMacro(MemberCommand, Command); 00102 00105 void SetCallbackFunction(T *object, 00106 TMemberFunctionPointer memberFunction) 00107 { 00108 m_This = object; 00109 m_MemberFunction = memberFunction; 00110 } 00111 00112 void SetCallbackFunction(T *object, 00113 TConstMemberFunctionPointer memberFunction) 00114 { 00115 m_This = object; 00116 m_ConstMemberFunction = memberFunction; 00117 } 00118 00120 virtual void Execute(Object *caller, const EventObject & event) 00121 { 00122 if ( m_MemberFunction ) 00123 { 00124 ( ( *m_This ).*( m_MemberFunction ) )( caller, event ); 00125 } 00126 } 00128 00130 virtual void Execute(const Object *caller, const EventObject & event) 00131 { 00132 if ( m_ConstMemberFunction ) 00133 { 00134 ( ( *m_This ).*( m_ConstMemberFunction ) )( caller, event ); 00135 } 00136 } 00138 00139 protected: 00140 00141 T * m_This; 00142 TMemberFunctionPointer m_MemberFunction; 00143 TConstMemberFunctionPointer m_ConstMemberFunction; 00144 MemberCommand():m_MemberFunction(0), m_ConstMemberFunction(0) {} 00145 virtual ~MemberCommand(){} 00146 private: 00147 MemberCommand(const Self &); //purposely not implemented 00148 void operator=(const Self &); //purposely not implemented 00149 }; 00150 00160 template< class T > 00161 class ReceptorMemberCommand:public Command 00162 { 00163 public: 00165 typedef void ( T::*TMemberFunctionPointer )(const EventObject &); 00166 00168 typedef ReceptorMemberCommand Self; 00169 typedef SmartPointer< Self > Pointer; 00170 00172 itkNewMacro(Self); 00173 00175 itkTypeMacro(ReceptorMemberCommand, Command); 00176 00179 void SetCallbackFunction(T *object, 00180 TMemberFunctionPointer memberFunction) 00181 { 00182 m_This = object; 00183 m_MemberFunction = memberFunction; 00184 } 00185 00187 virtual void Execute(Object *, const EventObject & event) 00188 { 00189 if ( m_MemberFunction ) 00190 { 00191 ( ( *m_This ).*( m_MemberFunction ) )( event ); 00192 } 00193 } 00195 00197 virtual void Execute(const Object *, const EventObject & event) 00198 { 00199 if ( m_MemberFunction ) 00200 { 00201 ( ( *m_This ).*( m_MemberFunction ) )( event ); 00202 } 00203 } 00205 00206 protected: 00207 T * m_This; 00208 TMemberFunctionPointer m_MemberFunction; 00209 ReceptorMemberCommand():m_MemberFunction(0) {} 00210 virtual ~ReceptorMemberCommand() {} 00211 private: 00212 ReceptorMemberCommand(const Self &); //purposely not implemented 00213 void operator=(const Self &); //purposely not implemented 00214 }; 00215 00225 template< class T > 00226 class SimpleMemberCommand:public Command 00227 { 00228 public: 00230 typedef void ( T::*TMemberFunctionPointer )(); 00231 00233 typedef SimpleMemberCommand Self; 00234 typedef SmartPointer< Self > Pointer; 00235 00237 itkTypeMacro(SimpleMemberCommand, Command); 00238 00240 itkNewMacro(Self); 00241 00243 void SetCallbackFunction(T *object, 00244 TMemberFunctionPointer memberFunction) 00245 { 00246 m_This = object; 00247 m_MemberFunction = memberFunction; 00248 } 00249 00251 virtual void Execute(Object *, const EventObject &) 00252 { 00253 if ( m_MemberFunction ) 00254 { 00255 ( ( *m_This ).*( m_MemberFunction ) )( ); 00256 } 00257 } 00259 00260 virtual void Execute(const Object *, const EventObject &) 00261 { 00262 if ( m_MemberFunction ) 00263 { 00264 ( ( *m_This ).*( m_MemberFunction ) )( ); 00265 } 00266 } 00267 00268 protected: 00269 T * m_This; 00270 TMemberFunctionPointer m_MemberFunction; 00271 SimpleMemberCommand():m_MemberFunction(0) {} 00272 virtual ~SimpleMemberCommand() {} 00273 private: 00274 SimpleMemberCommand(const Self &); //purposely not implemented 00275 void operator=(const Self &); //purposely not implemented 00276 }; 00277 00287 template< class T > 00288 class SimpleConstMemberCommand:public Command 00289 { 00290 public: 00292 typedef void ( T::*TMemberFunctionPointer )() const; 00293 00295 typedef SimpleConstMemberCommand Self; 00296 typedef SmartPointer< Self > Pointer; 00297 00299 itkTypeMacro(SimpleConstMemberCommand, Command); 00300 00302 itkNewMacro(Self); 00303 00305 void SetCallbackFunction(const T *object, 00306 TMemberFunctionPointer memberFunction) 00307 { 00308 m_This = object; 00309 m_MemberFunction = memberFunction; 00310 } 00311 00313 virtual void Execute(Object *, const EventObject &) 00314 { 00315 if ( m_MemberFunction ) 00316 { 00317 ( ( *m_This ).*( m_MemberFunction ) )( ); 00318 } 00319 } 00321 00322 virtual void Execute(const Object *, const EventObject &) 00323 { 00324 if ( m_MemberFunction ) 00325 { 00326 ( ( *m_This ).*( m_MemberFunction ) )( ); 00327 } 00328 } 00329 00330 protected: 00331 const T * m_This; 00332 TMemberFunctionPointer m_MemberFunction; 00333 SimpleConstMemberCommand():m_MemberFunction(0) {} 00334 virtual ~SimpleConstMemberCommand() {} 00335 private: 00336 SimpleConstMemberCommand(const Self &); //purposely not implemented 00337 void operator=(const Self &); //purposely not implemented 00338 }; 00339 00352 class CStyleCommand:public Command 00353 { 00354 public: 00356 typedef void ( *FunctionPointer )(Object *, const EventObject &, void *); 00357 typedef void ( *ConstFunctionPointer )(const Object *, 00358 const EventObject &, void *); 00359 typedef void ( *DeleteDataFunctionPointer )(void *); 00361 00363 typedef CStyleCommand Self; 00364 typedef SmartPointer< Self > Pointer; 00365 00367 itkTypeMacro(CStyleCommand, Command); 00368 00370 itkNewMacro(Self); 00371 00374 void SetClientData(void *cd) { m_ClientData = cd; } 00375 00377 void SetCallback(FunctionPointer f) 00378 { m_Callback = f; } 00379 void SetConstCallback(ConstFunctionPointer f) 00380 { m_ConstCallback = f; } 00382 00384 void SetClientDataDeleteCallback(DeleteDataFunctionPointer f) 00385 { m_ClientDataDeleteCallback = f; } 00386 00388 void Execute(Object *caller, const EventObject & event) 00389 { 00390 if ( m_Callback ) 00391 { 00392 m_Callback(caller, event, m_ClientData); 00393 } 00394 } 00396 00398 void Execute(const Object *caller, const EventObject & event) 00399 { 00400 if ( m_ConstCallback ) 00401 { 00402 m_ConstCallback(caller, event, m_ClientData); 00403 } 00404 } 00406 00407 protected: 00408 CStyleCommand():m_ClientData(0), m_Callback(0), m_ConstCallback(0), 00409 m_ClientDataDeleteCallback(0) 00410 { 00411 // not implemented 00412 } 00413 00414 ~CStyleCommand() 00415 { 00416 if ( m_ClientDataDeleteCallback ) 00417 { 00418 m_ClientDataDeleteCallback(m_ClientData); 00419 } 00420 } 00421 00422 void * m_ClientData; 00423 FunctionPointer m_Callback; 00424 ConstFunctionPointer m_ConstCallback; 00425 DeleteDataFunctionPointer m_ClientDataDeleteCallback; 00426 }; 00427 } // end namespace itk 00428 00429 #endif 00430