FXDataTarget.h

Go to the documentation of this file.
00001 /********************************************************************************
00002 *                                                                               *
00003 *                              D a t a   T a r g e t                            *
00004 *                                                                               *
00005 *********************************************************************************
00006 * Copyright (C) 1998,2006 by Jeroen van der Zijp.   All Rights Reserved.        *
00007 *********************************************************************************
00008 * This library is free software; you can redistribute it and/or                 *
00009 * modify it under the terms of the GNU Lesser General Public                    *
00010 * License as published by the Free Software Foundation; either                  *
00011 * version 2.1 of the License, or (at your option) any later version.            *
00012 *                                                                               *
00013 * This library is distributed in the hope that it will be useful,               *
00014 * but WITHOUT ANY WARRANTY; without even the implied warranty of                *
00015 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU             *
00016 * Lesser General Public License for more details.                               *
00017 *                                                                               *
00018 * You should have received a copy of the GNU Lesser General Public              *
00019 * License along with this library; if not, write to the Free Software           *
00020 * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA.    *
00021 *********************************************************************************
00022 * $Id: FXDataTarget.h,v 1.25 2006/01/22 17:58:00 fox Exp $                      *
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;                 // Target object
00059   void         *data;                   // Associated data
00060   FXSelector    message;                // Message ID
00061   FXuint        type;                   // Type of data
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 

(C) 2002-2009 Niall Douglas. Some parts (C) to assorted authors.
Generated on Fri Nov 20 18:31:20 2009 for TnFOX by doxygen v1.4.7