Main Page Class Hierarchy Alphabetical List Compound List File List Compound Members

DbControl.h

Go to the documentation of this file.
00001 /////////////////////////////////////////////////////////////////////////////
00002 //
00003 // DbControl
00004 //
00005 /////////////////////////////////////////////////////////////////////////////
00006 //
00007 // Hakki Dogusan
00008 // dogusanh@tr.net
00009 // http://www.dynaset.org/dogusanh
00010 //
00011 /////////////////////////////////////////////////////////////////////////////
00012 #ifndef DBCONTROL_H
00013 #define DBCONTROL_H
00014 
00015 #ifndef FXBASEOBJECT_H
00016 #include "FXBaseObject.h"
00017 #endif
00018 namespace FXEX {
00019 class DbField;
00020 
00021 /**
00022  * DbControl is an object which is a storage unit for some type of in-memory database (I think?)
00023  */
00024 class FXAPI DbControl : public FXBaseObject {
00025   FXDECLARE(DbControl)
00026   typedef FXObjectListOf<DbField> DbFields;
00027 
00028   public:
00029     enum {
00030       ID_DB_FIRST=50000,
00031       ID_OPEN,
00032       ID_CLOSE,
00033       ID_FIELD,                       // field operation
00034       ID_FOCUSIN,
00035       ID_FOCUSOUT,
00036       ID_INSERT,                      // record operation
00037       ID_EDIT,
00038       ID_KILL,
00039       ID_POST,
00040       ID_CANCEL,
00041       ID_QUERY,                      // navigation
00042       ID_SCROLL,
00043       ID_FIRST,
00044       ID_PRIOR,
00045       ID_NEXT,
00046       ID_LAST,
00047       ID_PRINT,                      // misc operations
00048       ID_DB_LAST,
00049       };
00050 
00051   public:
00052     /// Current mode of operation
00053     enum DbMode {
00054       DB_INACTIVE,
00055       DB_BROWSE,
00056       DB_INSERT,
00057       DB_EDIT
00058       };
00059 
00060     // Current position of data pointer
00061     enum DbPosition {
00062       DB_BOF = -4,
00063       DB_EOF = -3,
00064       DB_FIRST = -2,
00065       DB_PRIOR = -1,
00066       DB_CURRENT = 0,
00067       DB_NEXT = 1,
00068       DB_LAST = 2,
00069       DB_FIND = 3
00070       };
00071 
00072   public:
00073     /// ctor
00074     DbControl(FXWindow* own,FXObject* tgt=NULL,FXSelector sel=0);
00075 
00076     /// dtor
00077     virtual ~DbControl();
00078 
00079   public:
00080     /// accessor methods
00081     FXbool open();
00082     FXbool close();
00083     FXbool insert();
00084     FXbool post();
00085     FXbool cancel();
00086     FXbool kill(); //Delete
00087     FXbool edit();
00088     FXbool query();
00089     FXbool first();
00090     FXbool prior();
00091     FXbool next();
00092     FXbool last();
00093     FXbool print();
00094 
00095     /// are we at the bottom of the dataset
00096     FXbool isBof() const;
00097 
00098     /// are we are the end of the file
00099     FXbool isEof() const;
00100 
00101   public:
00102     /// get the current mode of operation
00103     DbMode getMode() const { return mode; }
00104 
00105     /// get pointer to specific column (by column number), from current row
00106     DbField* getField(FXint i=-1) const; // i=-1 => current focused field
00107 
00108     /// get pointer to specific column (by column name), from current row
00109     DbField* getField(const FXString&) const; // NULL => current focused field
00110 
00111     /// return the query applied to the data
00112     FXString getQuery() const { return query_; }
00113 
00114     /// set the query applied to the data
00115     void setQuery(const FXString& q) { query_=q; }
00116 
00117   protected:
00118     /// add specified field to database
00119     void addField(DbField* field) { fields.append(field); }
00120 
00121     /// add field using field name/title for FXchar type
00122     void addField(const FXString& name,const FXString& title,FXchar& value) { fields.append(new DbField(name,title,value,this,ID_FIELD)); }
00123 
00124     /// add field using field name/title for FXuchar type
00125     void addField(const FXString& name,const FXString& title,FXuchar& value) { fields.append(new DbField(name,title,value,this,ID_FIELD)); }
00126 
00127     /// add field using field name/title for FXshort type
00128     void addField(const FXString& name,const FXString& title,FXshort& value) { fields.append(new DbField(name,title,value,this,ID_FIELD)); }
00129 
00130     /// add field using field name/title for FXushort type
00131     void addField(const FXString& name,const FXString& title,FXushort& value) { fields.append(new DbField(name,title,value,this,ID_FIELD)); }
00132 
00133     /// add field using field name/title for FXint type
00134     void addField(const FXString& name,const FXString& title,FXint& value) { fields.append(new DbField(name,title,value,this,ID_FIELD)); }
00135 
00136     /// add field using field name/title for FXuint type
00137     void addField(const FXString& name,const FXString& title,FXuint& value) { fields.append(new DbField(name,title,value,this,ID_FIELD)); }
00138 
00139     /// add field using field name/title for FXFloat type
00140     void addField(const FXString& name,const FXString& title,FXfloat& value) { fields.append(new DbField(name,title,value,this,ID_FIELD)); }
00141 
00142     /// add field using field name/title for FXdouble type
00143     void addField(const FXString& name,const FXString& title,FXdouble& value) { fields.append(new DbField(name,title,value,this,ID_FIELD)); }
00144 
00145     /// add field using field name/title for FXString type
00146     void addField(const FXString& name,const FXString& title,FXString& value) { fields.append(new DbField(name,title,value,this,ID_FIELD)); }
00147 
00148     /// add field using field name/title for DateFiled type
00149     void addField(const FXString& name,const FXString& title,DateField& value) { fields.append(new DbField(name,title,value,this,ID_FIELD)); }
00150 
00151     /// add field using field name/title for CurrencyField type
00152     void addField(const FXString& name,const FXString& title,CurrencyField& value) { fields.append(new DbField(name,title,value,this,ID_FIELD)); }
00153 
00154   protected:
00155 
00156     /// return widget owner
00157     FXWindow* getOwner() const { return owner; }
00158 
00159     /// return handle to list of database fields
00160     DbFields& getFields() { return fields; }
00161 
00162   private:
00163     /// these virtual methods are meant to be handled by the actual database instance object
00164     virtual FXbool doOpen() { return FALSE; }
00165     virtual FXbool doClose() { return FALSE; }
00166     virtual FXbool doClear() { return FALSE; }
00167     virtual FXbool doInsert() { return FALSE; }
00168     virtual FXbool doPost() { return FALSE; }
00169     virtual FXbool doCancel() { return FALSE; }
00170     virtual FXbool doKill() { return FALSE; }
00171     virtual FXbool doEdit() { return FALSE; }
00172     virtual FXbool doQuery() { return FALSE; }
00173     virtual FXbool doFetch(DbPosition&) { return FALSE; }
00174     virtual FXbool doPrint() { return FALSE; }
00175     virtual FXbool doShowError(const FXString&) { return FALSE; }
00176 
00177   public:
00178     long onFieldChanged(FXObject*, FXSelector, void*);
00179     long onFieldUpdate(FXObject*, FXSelector, void*);
00180     long onFieldFocusIn(FXObject*, FXSelector, void*);
00181     long onFieldFocusOut(FXObject*, FXSelector, void*);
00182     long onCmdOpen(FXObject*, FXSelector, void*);
00183     long onUpdOpen(FXObject*, FXSelector, void*);
00184     long onCmdClose(FXObject*, FXSelector, void*);
00185     long onUpdClose(FXObject*, FXSelector, void*);
00186     long onCmdInsert(FXObject*, FXSelector, void*);
00187     long onUpdInsert(FXObject*, FXSelector, void*);
00188     long onCmdKill(FXObject*, FXSelector, void*);
00189     long onUpdKill(FXObject*, FXSelector, void*);
00190     long onCmdPost(FXObject*, FXSelector, void*);
00191     long onUpdPost(FXObject*, FXSelector, void*);
00192     long onCmdCancel(FXObject*, FXSelector, void*);
00193     long onUpdCancel(FXObject*, FXSelector, void*);
00194     long onCmdQuery(FXObject*, FXSelector, void*);
00195     long onUpdQuery(FXObject*, FXSelector, void*);
00196     long onCmdFirst(FXObject*, FXSelector, void*);
00197     long onUpdFirst(FXObject*, FXSelector, void*);
00198     long onCmdPrior(FXObject*, FXSelector, void*);
00199     long onUpdPrior(FXObject*, FXSelector, void*);
00200     long onCmdNext(FXObject*, FXSelector, void*);
00201     long onUpdNext(FXObject*, FXSelector, void*);
00202     long onCmdLast(FXObject*, FXSelector, void*);
00203     long onUpdLast(FXObject*, FXSelector, void*);
00204     long onCmdPrint(FXObject*, FXSelector, void*);
00205     long onUpdPrint(FXObject*, FXSelector, void*);
00206 
00207   private:
00208     FXWindow*   owner;
00209     DbMode      mode;
00210     DbFields    fields;
00211     DbField*    focusedField;
00212     FXString    query_;
00213     DbPosition  position;
00214     void setMode(DbMode m) { mode=m; }
00215     FXbool before(FXuint sel, void* ptr);
00216     FXbool after(FXuint sel, void* ptr);
00217 
00218   protected:
00219     /// serialisation
00220     DbControl(){}
00221 
00222   private:
00223     /// disable access to these operations
00224     DbControl(const DbControl&);
00225     DbControl& operator=(const DbControl&);
00226   };
00227 
00228 } // namespace FXEX
00229 #endif // DBCONTROL_H