00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024 #ifndef FXDATATARGET_H
00025 #define FXDATATARGET_H
00026
00027 #ifndef FXOBJECT_H
00028 #include "FXObject.h"
00029 #endif
00030 #include <qptrvector.h>
00031
00032 namespace FX {
00033
00034 #ifdef _MSC_VER
00035 #pragma warning(push)
00036 #pragma warning(disable: 4251)
00037 #endif
00038
00055 class FXAPI FXDataTarget : public FXObject {
00056 FXDECLARE(FXDataTarget)
00057 protected:
00058 FXObject *target;
00059 void *data;
00060 FXSelector message;
00061 FXuint type;
00062 QPtrVector<Generic::BoundFunctorV> upcalls;
00063 private:
00064 FXDataTarget(const FXDataTarget&);
00065 FXDataTarget& operator=(const FXDataTarget&);
00066 public:
00067 long onCmdValue(FXObject*,FXSelector,void*);
00068 long onUpdValue(FXObject*,FXSelector,void*);
00069 long onCmdOption(FXObject*,FXSelector,void*);
00070 long onUpdOption(FXObject*,FXSelector,void*);
00071 public:
00072 enum {
00073 DT_VOID=0,
00074 DT_CHAR,
00075 DT_UCHAR,
00076 DT_SHORT,
00077 DT_USHORT,
00078 DT_INT,
00079 DT_UINT,
00080 DT_LONG,
00081 DT_ULONG,
00082 DT_FLOAT,
00083 DT_DOUBLE,
00084 DT_STRING,
00085 DT_LAST
00086 };
00087 public:
00088 enum {
00089 ID_VALUE=1,
00090 ID_OPTION=ID_VALUE+10001,
00091 ID_LAST=ID_OPTION+10000
00092 };
00093 public:
00094
00096 FXDataTarget():target(NULL),data(NULL),message(0),type(DT_VOID){}
00097
00099 FXDataTarget(FXObject* tgt,FXSelector sel):target(tgt),data(NULL),message(sel),type(DT_VOID){}
00100
00102 FXDataTarget(FXchar& value,FXObject* tgt=NULL,FXSelector sel=0):target(tgt),data(&value),message(sel),type(DT_CHAR),upcalls(true){}
00103
00105 FXDataTarget(FXuchar& value,FXObject* tgt=NULL,FXSelector sel=0):target(tgt),data(&value),message(sel),type(DT_UCHAR),upcalls(true){}
00106
00108 FXDataTarget(FXshort& value,FXObject* tgt=NULL,FXSelector sel=0):target(tgt),data(&value),message(sel),type(DT_SHORT),upcalls(true){}
00109
00111 FXDataTarget(FXushort& value,FXObject* tgt=NULL,FXSelector sel=0):target(tgt),data(&value),message(sel),type(DT_USHORT),upcalls(true){}
00112
00114 FXDataTarget(FXint& value,FXObject* tgt=NULL,FXSelector sel=0):target(tgt),data(&value),message(sel),type(DT_INT),upcalls(true){}
00115
00117 FXDataTarget(FXuint& value,FXObject* tgt=NULL,FXSelector sel=0):target(tgt),data(&value),message(sel),type(DT_UINT),upcalls(true){}
00118
00120 FXDataTarget(FXlong& value,FXObject* tgt=NULL,FXSelector sel=0):target(tgt),data(&value),message(sel),type(DT_LONG){}
00121
00123 FXDataTarget(FXulong& value,FXObject* tgt=NULL,FXSelector sel=0):target(tgt),data(&value),message(sel),type(DT_ULONG){}
00124
00126 FXDataTarget(FXfloat& value,FXObject* tgt=NULL,FXSelector sel=0):target(tgt),data(&value),message(sel),type(DT_FLOAT),upcalls(true){}
00127
00129 FXDataTarget(FXdouble& value,FXObject* tgt=NULL,FXSelector sel=0):target(tgt),data(&value),message(sel),type(DT_DOUBLE),upcalls(true){}
00130
00132 FXDataTarget(FXString& value,FXObject* tgt=NULL,FXSelector sel=0):target(tgt),data(&value),message(sel),type(DT_STRING),upcalls(true){}
00133
00134
00136 void setTarget(FXObject *t){ target=t; }
00137
00139 FXObject* getTarget() const { return target; }
00140
00141
00143 void setSelector(FXSelector sel){ message=sel; }
00144
00146 FXSelector getSelector() const { return message; }
00147
00148
00150 FXuint getType() const { return type; }
00151
00153 void* getData() const { return data; }
00154
00155
00157 Generic::BoundFunctorV *addUpcall(FXAutoPtr<Generic::BoundFunctorV> upcall);
00158
00160 bool removeUpcall(Generic::BoundFunctorV *upcall);
00161
00162
00164 void connect(){ data=NULL; type=DT_VOID; }
00165
00167 void connect(FXchar& value){ data=&value; type=DT_CHAR; }
00168
00170 void connect(FXuchar& value){ data=&value; type=DT_UCHAR; }
00171
00173 void connect(FXshort& value){ data=&value; type=DT_SHORT; }
00174
00176 void connect(FXushort& value){ data=&value; type=DT_USHORT; }
00177
00179 void connect(FXint& value){ data=&value; type=DT_INT; }
00180
00182 void connect(FXuint& value){ data=&value; type=DT_UINT; }
00183
00185 void connect(FXlong& value){ data=&value; type=DT_LONG; }
00186
00188 void connect(FXulong& value){ data=&value; type=DT_ULONG; }
00189
00191 void connect(FXfloat& value){ data=&value; type=DT_FLOAT; }
00192
00194 void connect(FXdouble& value){ data=&value; type=DT_DOUBLE; }
00195
00197 void connect(FXString& value){ data=&value; type=DT_STRING; }
00198
00199
00201 void connect(FXObject* tgt,FXSelector sel){ target=tgt; data=NULL; message=sel; type=DT_VOID; }
00202
00204 void connect(FXchar& value,FXObject* tgt,FXSelector sel){ target=tgt; data=&value; message=sel; type=DT_CHAR; }
00205
00207 void connect(FXuchar& value,FXObject* tgt,FXSelector sel){ target=tgt; data=&value; message=sel; type=DT_UCHAR; }
00208
00210 void connect(FXshort& value,FXObject* tgt,FXSelector sel){ target=tgt; data=&value; message=sel; type=DT_SHORT; }
00211
00213 void connect(FXushort& value,FXObject* tgt,FXSelector sel){ target=tgt; data=&value; message=sel; type=DT_USHORT; }
00214
00216 void connect(FXint& value,FXObject* tgt,FXSelector sel){ target=tgt; data=&value; message=sel; type=DT_INT; }
00217
00219 void connect(FXuint& value,FXObject* tgt,FXSelector sel){ target=tgt; data=&value; message=sel; type=DT_UINT; }
00220
00222 void connect(FXlong& value,FXObject* tgt,FXSelector sel){ target=tgt; data=&value; message=sel; type=DT_LONG; }
00223
00225 void connect(FXulong& value,FXObject* tgt,FXSelector sel){ target=tgt; data=&value; message=sel; type=DT_ULONG; }
00226
00228 void connect(FXfloat& value,FXObject* tgt,FXSelector sel){ target=tgt; data=&value; message=sel; type=DT_FLOAT; }
00229
00231 void connect(FXdouble& value,FXObject* tgt,FXSelector sel){ target=tgt; data=&value; message=sel; type=DT_DOUBLE; }
00232
00234 void connect(FXString& value,FXObject* tgt,FXSelector sel){ target=tgt; data=&value; message=sel; type=DT_STRING; }
00235
00236
00238 virtual ~FXDataTarget();
00239 };
00240
00241 #ifdef _MSC_VER
00242 #pragma warning(pop)
00243 #endif
00244
00248 template<typename T> class FXDataTargetI : public FXDataTarget
00249 {
00250 T mydata;
00251 void callTarget() { if(target) target->handle(this,FXSEL(SEL_COMMAND,message),data); }
00252 public:
00254 FXDataTargetI(FXObject* tgt=NULL, FXSelector sel=0) : FXDataTarget(mydata, tgt, sel) { }
00255
00257 const T& operator *() const { return mydata; }
00258
00259 friend struct Returner;
00261 struct Returner {
00262 FXDataTargetI& dt;
00263 Returner(const Returner &o) : dt(o.dt) { }
00264 const T& operator=(const T& val) {
00265 dt.mydata=val;
00266 dt.callTarget();
00267 return dt.mydata;
00268 }
00269 const T& operator=(const Returner &val) { return operator=(static_cast<const T &>(val)); }
00270 operator T&() { return dt.mydata; }
00271 operator const T&() const { return dt.mydata; }
00272 private:
00273 friend class FXDataTargetI;
00274 Returner(FXDataTargetI& _dt) : dt(_dt) { }
00275 };
00276
00278 Returner operator *() { return Returner(*this); }
00279 };
00280
00281 }
00282
00283 #endif
00284