1 ///////////////////////////////////////////////////////////////////////////////
2 // Name:        dbgrid.h
3 // Purpose:     Displays a wxDbTable in a wxGrid.
4 // Author:      Roger Gammans, Paul Gammans
5 // Modified by:
6 // Created:
7 // RCS-ID:      $Id: dbgrid.h 61872 2009-09-09 22:37:05Z VZ $
8 // Copyright:   (c) 1999 The Computer Surgery (roger@computer-surgery.co.uk)
9 // Licence:     wxWindows licence
10 ///////////////////////////////////////////////////////////////////////////////
11 // Branched From : dbgrid.h,v 1.19 2001/03/28 11:16:01
12 ///////////////////////////////////////////////////////////////////////////////
13 
14 #ifndef _WX_GENERIC_DBGRID_H_
15 #define _WX_GENERIC_DBGRID_H_
16 
17 #if wxUSE_ODBC
18 #if wxUSE_GRID
19 
20 #include "wx/log.h"
21 #include "wx/dbtable.h"
22 #include "wx/dynarray.h"
23 #include "wx/grid.h"
24 #include "wx/dbkeyg.h"
25 
26 #define wxGRID_VALUE_DBAUTO     wxT("dbauto")
27 
28 WX_DECLARE_USER_EXPORTED_OBJARRAY(GenericKey,keyarray,WXDLLIMPEXP_DBGRID);
29 
30 static const int wxUSE_QUERY = -1;
31 
32 class WXDLLIMPEXP_DBGRID wxDbGridColInfoBase
33 {
34 public:
35     //Default ctor
wxDbGridColInfoBase()36     wxDbGridColInfoBase() { }
wxDbGridColInfoBase(int colNo,wxString type,wxString title)37     wxDbGridColInfoBase(int colNo,
38                         wxString type, wxString title) :
39                         DbCol(colNo),
40                         wxtypename(type),
41                         Title(title)
42                         { }
43     //Copy Ctor
wxDbGridColInfoBase(const wxDbGridColInfoBase & ref)44     wxDbGridColInfoBase(const wxDbGridColInfoBase& ref)
45     {
46         DbCol       = ref.DbCol;
47         wxtypename  = ref.wxtypename;
48         Title       = ref.Title;
49     }
50     //Empty destructor for member obj's
~wxDbGridColInfoBase()51     ~wxDbGridColInfoBase() {}
52 
53     int        DbCol;
54     wxString   wxtypename;
55     wxString   Title;
56 };
57 
58 
59 class WXDLLIMPEXP_DBGRID wxDbGridColInfo
60 {
61 public:
wxDbGridColInfo(int colNo,wxString type,wxString title,wxDbGridColInfo * next)62     wxDbGridColInfo(int colNo,
63                     wxString type,
64                     wxString title,
65                     wxDbGridColInfo *next) :
66         m_data(colNo,type,title)
67     {
68         m_next=next;
69     }
70 
71     //Empty List
~wxDbGridColInfo()72     ~wxDbGridColInfo() { delete m_next; }
73 
74     //Recurse to find length.
Length()75     int Length() { return (m_next ? m_next->Length() +1 :  1); }
76 
77     // Adds a new column info (2 step creation)
AddColInfo(int colNo,wxString type,wxString title)78     void AddColInfo (int colNo,
79                     wxString type,
80                     wxString title)
81     {
82         GetLast()->m_next = new wxDbGridColInfo (colNo, type, title, NULL);
83     }
84 
85     // Searches last
GetLast()86     wxDbGridColInfo *GetLast() { return (m_next ? m_next->GetLast() : this); }
87 
88 
89     protected:
90     wxDbGridColInfoBase  m_data;
91     wxDbGridColInfo     *m_next;
92 
93     friend class wxDbGridTableBase;
94 };
95 
96 
97 class WXDLLIMPEXP_DBGRID wxDbGridCellAttrProvider : public wxGridCellAttrProvider
98 {
99 public:
100     wxDbGridCellAttrProvider();
101     wxDbGridCellAttrProvider(wxDbTable *tab, wxDbGridColInfoBase* ColInfo);
102     virtual ~wxDbGridCellAttrProvider();
103 
104     virtual wxGridCellAttr *GetAttr(int row, int col,
105                                     wxGridCellAttr::wxAttrKind kind) const;
106     virtual void AssignDbTable(wxDbTable *tab);
107 private:
108     wxDbTable           *m_data;
109     wxDbGridColInfoBase *m_ColInfo;
110 };
111 
112 
113 class WXDLLIMPEXP_DBGRID wxDbGridTableBase : public wxGridTableBase
114 {
115 public:
116     wxDbGridTableBase(wxDbTable *tab, wxDbGridColInfo *ColInfo,
117               int count = wxUSE_QUERY, bool takeOwnership = true);
118     virtual ~wxDbGridTableBase();
119 
GetNumberRows()120     virtual int GetNumberRows()
121     {
122         wxLogDebug(wxT(" GetNumberRows() = %i"),m_rowtotal);
123         return m_rowtotal;
124     }
GetNumberCols()125     virtual int GetNumberCols()
126     {
127         wxLogDebug(wxT(" GetNumberCols() = %i"),m_nocols);
128         return m_nocols;
129     }
130     virtual bool     IsEmptyCell(int row, int col) ;
131     virtual wxString GetValue(int row, int col) ;
132     virtual void     SetValue(int row, int col, const wxString& value);
133     virtual bool     CanHaveAttributes();
134     virtual wxString GetTypeName(int row, int col);
135     virtual bool     CanGetValueAs(int row, int col, const wxString& typeName);
136     virtual bool     CanSetValueAs(int row, int col, const wxString& typeName);
137     virtual long     GetValueAsLong(int row, int col);
138     virtual double   GetValueAsDouble(int row, int col);
139     virtual bool     GetValueAsBool(int row, int col);
140     virtual void     SetValueAsLong(int row, int col, long value);
141     virtual void     SetValueAsDouble(int row, int col, double value);
142     virtual void     SetValueAsBool(int row, int col, bool value);
143     virtual void    *GetValueAsCustom(int row, int col, const wxString& typeName);
144     virtual void     SetValueAsCustom(int row, int col, const wxString& typeName, void* value);
145 
146 
147     virtual wxString GetColLabelValue(int col);
148 
149     virtual bool     AssignDbTable(wxDbTable *tab, int count = wxUSE_QUERY, bool takeOwnership=true);
150     virtual void     ValidateRow(int row);
UpdateRow(int row)151     virtual bool     UpdateRow(int row) const
152     {
153         if (m_row != row)
154             return true;
155         else
156             return Writeback();
157     }
158 
159 private:
160     //Operates on the current row
161     bool Writeback() const;
162 
163     typedef wxGridTableBase inherited;
164     keyarray     m_keys;
165     wxDbTable   *m_data;
166     bool         m_dbowner;
167     int          m_rowtotal;
168     int          m_nocols;
169     int          m_row;
170     wxDbGridColInfoBase *m_ColInfo;
171     bool         m_rowmodified;
172 };
173 
174 #endif  // #if wxUSE_GRID
175 #endif  // #if wxUSE_ODBC
176 
177 #endif  // _WX_GENERIC_DBGRID_H_
178