00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
#ifndef __itkCommand_h
00018
#define __itkCommand_h
00019
00020
#include "itkObject.h"
00021
#include "itkObjectFactory.h"
00022
00023
00024
namespace itk
00025 {
00026
00039
00040 class ITKCommon_EXPORT Command :
public Object
00041 {
00042
public:
00044 typedef Command
Self;
00045 typedef Object Superclass;
00046 typedef SmartPointer<Self> Pointer;
00047 typedef SmartPointer<const Self> ConstPointer;
00048
00050
itkTypeMacro(Command,
Object);
00051
00053
virtual void Execute(
Object *caller,
const EventObject & event ) = 0;
00054
00058
virtual void Execute(
const Object *caller,
const EventObject & event ) = 0;
00059
00060 };
00061
00062
00063
00064
00073
template <
class T>
00074 class MemberCommand :
public Command
00075 {
00076
public:
00078
typedef void (T::*
TMemberFunctionPointer)(
Object*,
const EventObject &);
00079 typedef void (T::*
TConstMemberFunctionPointer)(
const Object*,
const EventObject &);
00080
00082
typedef MemberCommand Self;
00083
typedef SmartPointer<Self> Pointer;
00084
00086
itkNewMacro(
Self);
00087
00089
itkTypeMacro(
MemberCommand,Command);
00090
00093
void SetCallbackFunction(T* object,
00094 TMemberFunctionPointer memberFunction)
00095 {
00096
m_This = object;
00097
m_MemberFunction = memberFunction;
00098 }
00099
void SetCallbackFunction(T* object,
00100 TConstMemberFunctionPointer memberFunction)
00101 {
00102
m_This = object;
00103
m_ConstMemberFunction = memberFunction;
00104 }
00105
00107
virtual void Execute(
Object *caller,
const EventObject & event )
00108 {
00109
if( m_MemberFunction )
00110 {
00111 ((*m_This).*(
m_MemberFunction))(caller, event);
00112 }
00113 }
00114
00116
virtual void Execute(
const Object *caller,
const EventObject & event )
00117 {
00118
if( m_ConstMemberFunction )
00119 {
00120 ((*m_This).*(
m_ConstMemberFunction))(caller, event);
00121 }
00122 }
00123
00124
protected:
00125 T* m_This;
00126 TMemberFunctionPointer m_MemberFunction;
00127 TConstMemberFunctionPointer m_ConstMemberFunction;
00128
MemberCommand():m_MemberFunction(0),m_ConstMemberFunction(0) {}
00129
virtual ~MemberCommand(){}
00130
00131 private:
00132 MemberCommand(
const Self&);
00133 void operator=(
const Self&);
00134
00135 };
00136
00137
00146
template <
class T>
00147
class ReceptorMemberCommand :
public Command
00148 {
00149
public:
00151
typedef void (T::*TMemberFunctionPointer)(
const EventObject &);
00152
00154
typedef ReceptorMemberCommand Self;
00155
typedef SmartPointer<Self> Pointer;
00156
00158
itkNewMacro(
Self);
00159
00161 itkTypeMacro(
ReceptorMemberCommand,Command);
00162
00165
void SetCallbackFunction(T* object,
00166 TMemberFunctionPointer memberFunction)
00167 {
00168
m_This = object;
00169
m_MemberFunction = memberFunction;
00170 }
00171
00173
virtual void Execute(
Object *,
const EventObject & event )
00174 {
00175
if(
m_MemberFunction )
00176 {
00177 ((*m_This).*(
m_MemberFunction))(event);
00178 }
00179 }
00180
00182
virtual void Execute(
const Object *,
const EventObject & event )
00183 {
00184
if( m_MemberFunction )
00185 {
00186 ((*m_This).*(m_MemberFunction))(event);
00187 }
00188 }
00189
00190
protected:
00191 T*
m_This;
00192 TMemberFunctionPointer
m_MemberFunction;
00193
ReceptorMemberCommand():
m_MemberFunction(0) {}
00194
virtual ~ReceptorMemberCommand() {}
00195
00196
private:
00197
ReceptorMemberCommand(
const Self&);
00198
void operator=(
const Self&);
00199
00200 };
00201
00202
00211
template <
class T>
00212
class SimpleMemberCommand :
public Command
00213 {
00214
public:
00216
typedef void (T::*
TMemberFunctionPointer)();
00217
00219
typedef SimpleMemberCommand Self;
00220 typedef SmartPointer<Self> Pointer;
00221
00223
itkTypeMacro(
SimpleMemberCommand,Command);
00224
00226
itkNewMacro(
Self);
00227
00229 void SetCallbackFunction(T* object,
00230 TMemberFunctionPointer memberFunction)
00231 {
00232
m_This = object;
00233
m_MemberFunction = memberFunction;
00234 }
00235
00237
virtual void Execute(
Object *,
const EventObject & )
00238 {
00239
if(
m_MemberFunction )
00240 {
00241 ((*m_This).*(
m_MemberFunction))();
00242 }
00243 }
00244
virtual void Execute(
const Object *,
const EventObject & )
00245 {
00246 if(
m_MemberFunction )
00247 {
00248 ((*m_This).*(
m_MemberFunction))();
00249 }
00250 }
00251
00252
protected:
00253 T*
m_This;
00254 TMemberFunctionPointer
m_MemberFunction;
00255
SimpleMemberCommand():
m_MemberFunction(0) {}
00256
virtual ~SimpleMemberCommand() {}
00257
00258
private:
00259
SimpleMemberCommand(
const Self&);
00260
void operator=(
const Self&);
00261
00262 };
00263
00264
00273
template <
class T>
00274
class SimpleConstMemberCommand :
public Command
00275 {
00276
public:
00278
typedef void (T::*
TMemberFunctionPointer)()
const;
00279
00281
typedef SimpleConstMemberCommand Self;
00282
typedef SmartPointer<Self> Pointer;
00283
00285
itkTypeMacro(
SimpleConstMemberCommand,Command);
00286
00288
itkNewMacro(
Self);
00289
00291
void SetCallbackFunction(
const T* object,
00292 TMemberFunctionPointer memberFunction)
00293 {
00294
m_This = object;
00295
m_MemberFunction = memberFunction;
00296 }
00297
00299
virtual void Execute(
Object *,
const EventObject & )
00300 {
00301
if( m_MemberFunction )
00302 {
00303 ((*m_This).*(
m_MemberFunction))();
00304 }
00305 }
00306
virtual void Execute(
const Object *,
const EventObject & )
00307 {
00308
if( m_MemberFunction )
00309 {
00310 ((*m_This).*(
m_MemberFunction))();
00311 }
00312 }
00313
00314
protected:
00315
const T* m_This;
00316 TMemberFunctionPointer m_MemberFunction;
00317 SimpleConstMemberCommand():
m_MemberFunction(0) {}
00318
virtual ~SimpleConstMemberCommand() {}
00319
00320
private:
00321
SimpleConstMemberCommand(
const Self&);
00322
void operator=(
const Self&);
00323
00324 };
00325
00326
00338
class CStyleCommand :
public Command
00339 {
00340
public:
00342
typedef void (*FunctionPointer)(
Object*,
const EventObject &,
void*);
00343
typedef void (*ConstFunctionPointer)(
const Object*,
const EventObject &,
void*);
00344
typedef void (*DeleteDataFunctionPointer)(
void*);
00345
00347
typedef CStyleCommand Self;
00348
typedef SmartPointer<Self>
Pointer;
00349
00351
itkTypeMacro(CStyleCommand,Command);
00352
00354 itkNewMacro(
Self);
00355
00358
void SetClientData(
void *cd) {
m_ClientData = cd;}
00359
00361 void SetCallback(
FunctionPointer f)
00362 {
m_Callback = f;}
00363
void SetConstCallback(ConstFunctionPointer f)
00364 {m_ConstCallback = f;}
00365
00367
void SetClientDataDeleteCallback(DeleteDataFunctionPointer f)
00368 {m_ClientDataDeleteCallback = f;}
00369
00371 void Execute(
Object *caller,
const EventObject & event )
00372 {
00373
if (
m_Callback)
00374 {
00375
m_Callback(caller, event,
m_ClientData );
00376 }
00377 };
00378
00380
void Execute(
const Object *caller,
const EventObject & event )
00381 {
00382
if (
m_ConstCallback)
00383 {
00384
m_ConstCallback(caller, event,
m_ClientData );
00385 }
00386 };
00387
00388
protected:
00389
CStyleCommand(): m_ClientData(0),
00390 m_Callback(0),
00391 m_ConstCallback(0),
00392 m_ClientDataDeleteCallback(0) {}
00393
~CStyleCommand()
00394 {
00395 if (
m_ClientDataDeleteCallback)
00396 {
00397
m_ClientDataDeleteCallback(
m_ClientData);
00398 }
00399 };
00400
void *m_ClientData;
00401 FunctionPointer m_Callback;
00402 ConstFunctionPointer m_ConstCallback;
00403 DeleteDataFunctionPointer m_ClientDataDeleteCallback;
00404 };
00405
00406
00407 }
00408
00409 #endif