]> git.saurik.com Git - wxWidgets.git/blob - demos/dbbrowse/dbgrid.cpp
As per the docs, the value returned is -1 if the value entered is out of range [patch...
[wxWidgets.git] / demos / dbbrowse / dbgrid.cpp
1 //----------------------------------------------------------------------------------------
2 // Name: DBGrid.cpp
3 // Purpose: wxGrid sample
4 // Author: Mark Johnson
5 // Modified by: 19990929.mj10777 a reuseable DBGrid
6 // Created: 19990929
7 // Copyright: (c)
8 // Licence: wxWindows license
9 // RCS-ID: $Id$
10 //----------------------------------------------------------------------------------------
11 //-- all #ifdefs that the whole Project needs. -------------------------------------------
12 //----------------------------------------------------------------------------------------
13 #ifdef __GNUG__
14 #pragma implementation
15 #pragma interface
16 #endif
17 //----------------------------------------------------------------------------------------
18 // For compilers that support precompilation, includes "wx/wx.h".
19 #include "wx/wxprec.h"
20 //----------------------------------------------------------------------------------------
21 #ifdef __BORLANDC__
22 #pragma hdrstop
23 #endif
24 //----------------------------------------------------------------------------------------
25 #ifndef WX_PRECOMP
26 #include "wx/wx.h"
27 #endif
28 //----------------------------------------------------------------------------------------
29 //-- all #includes that every .cpp needs --- 19990807.mj10777 ----------------
30 //----------------------------------------------------------------------------------------
31 #include "std.h" // sorgsam Pflegen !
32 //----------------------------------------------------------------------------------------
33 BEGIN_EVENT_TABLE(DBGrid, wxGrid)
34 EVT_MOTION (DBGrid::OnMouseMove)
35 // DBGrid
36 // ------------
37 EVT_GRID_CELL_CHANGE( DBGrid::OnCellChange )
38 EVT_GRID_CELL_LEFT_CLICK( DBGrid::OnCellLeftClick )
39 EVT_GRID_CELL_LEFT_DCLICK( DBGrid::OnCellLeftDClick )
40 EVT_GRID_CELL_RIGHT_CLICK( DBGrid::OnCellRightClick )
41 EVT_GRID_CELL_RIGHT_DCLICK( DBGrid::OnCellRightDClick )
42 // EVT_GRID_COL_SIZE( DBGrid::OnColSize )
43 // EVT_GRID_ROW_SIZE( DBGrid::OnRowSize )
44 EVT_GRID_EDITOR_SHOWN( DBGrid::OnEditorShown )
45 EVT_GRID_EDITOR_HIDDEN( DBGrid::OnEditorHidden )
46 EVT_GRID_LABEL_LEFT_CLICK( DBGrid::OnLabelLeftClick )
47 EVT_GRID_LABEL_LEFT_DCLICK( DBGrid::OnLabelLeftDClick )
48 EVT_GRID_LABEL_RIGHT_CLICK( DBGrid::OnLabelRightClick )
49 EVT_GRID_LABEL_RIGHT_DCLICK( DBGrid::OnLabelRightDClick )
50 EVT_GRID_RANGE_SELECT( DBGrid::OnRangeSelected )
51 EVT_GRID_ROW_SIZE( DBGrid::OnRowSize )
52 EVT_GRID_SELECT_CELL( DBGrid::OnSelectCell )
53 EVT_MENU(GRID_EDIT,DBGrid::OnModusEdit)
54 EVT_MENU(GRID_BROWSE,DBGrid::OnModusBrowse)
55 END_EVENT_TABLE()
56
57 //----------------------------------------------------------------------------------------
58 // wxListCtrl(parent, id, pos, size, style)
59 // wxGrid(parent,wxID_ANY,wxPoint( 0, 0 ), wxSize( 400, 300 ) );
60 //----------------------------------------------------------------------------------------
61 // DBGrid
62 //----------------------------------------------------------------------------------------
63 // DBGrid::DBGrid(wxWindow *parent, const wxWindowID id,const wxPoint& pos,const wxSize& size):
64 // wxGrid(parent, id, pos, size)
65 DBGrid::DBGrid(wxWindow *parent, const wxWindowID id,const wxPoint& pos,const wxSize& size, long style):
66 wxGrid(parent, id, pos, size, style)
67 {
68 b_EditModus = false;
69 //---------------------------------------------------------------------------------------
70 popupMenu1 = new wxMenu;
71 popupMenu1->Append(GRID_EDIT, _("Edit Modus"));
72 popupMenu2 = new wxMenu;
73 popupMenu2->Append(GRID_BROWSE, _("Browse Modus"));
74 }
75
76 //----------------------------------------------------------------------------------------
77 DBGrid::~DBGrid()
78 {
79 delete popupMenu1;
80 delete popupMenu2;
81 }
82
83 //----------------------------------------------------------------------------------------
84 int DBGrid::OnTableView(wxString Table)
85 {
86 wxStopWatch sw;
87 //---------------------------------------------------------------------------------------
88 int x,y,z;
89 wxString Temp0;
90 wxBeginBusyCursor();
91 SetDefaultCellFont(* pDoc->ft_Doc);
92 //---------------------------------------------------------------------------------------
93 ct_BrowserDB = (db_Br+i_Which)->ct_BrowserDB; // Get the DSN Pointer
94 //---------------------------------------------------------------------------------------
95 if (ct_BrowserDB) // Valid pointer (!= NULL) ?
96 { // Pointer is Valid, use the wxDatabase Information
97 for (x=0;x<ct_BrowserDB->numTables;x++) // go through the Tables
98 {
99 if (!wxStrcmp((ct_BrowserDB->pTableInf+x)->tableName,Table)) // is this our Table ?
100 { // Yes, the Data of this Table shall be put into the Grid
101 int ValidTable = x; // Save the Tablenumber
102 (db_Br+i_Which)->OnSelect(Table,false); // Select * from "table"
103 // Set the local Pointer to the Column Information we are going to use
104 (db_Br+i_Which)->cl_BrowserDB = (ct_BrowserDB->pTableInf+x)->pColInf;
105 if ((ct_BrowserDB->pTableInf+x)->pColInf) // Valid pointer (!= NULL) ?
106 { // Pointer is Valid, Column Informationen sind Vorhanden
107 int i = (db_Br+i_Which)->i_Records; // How many Records are there
108 (db_Br+i_Which)->i_Which = ValidTable; // Still used ???? mj10777
109 if (i == 0) // If the Table is empty, then show one empty row
110 i++;
111 // wxLogMessage(_("\n-I-> DBGrid::OnTableView() : Vor CreateGrid"));
112 CreateGrid(i,(ct_BrowserDB->pTableInf+x)->numCols); // Records , Columns
113 for (y=0;y<(ct_BrowserDB->pTableInf+x)->numCols;y++) // Loop through the Fields
114 { // The Field / Column name is used here as Row Titel
115 SetColLabelValue(y,((ct_BrowserDB->pTableInf+x)->pColInf+y)->colName);
116 SetColSize(y,95);
117 } // for (y=0;y<(ct_BrowserDB->pTableInf+x)->numCols;y++)
118 SetColSize(((ct_BrowserDB->pTableInf+x)->numCols-1),120); // Make the last Column Wider
119 // The Grid has been created, now fill it
120 for (z=0;z<(db_Br+i_Which)->i_Records;z++) // Loop through the Records
121 {
122 Temp0.Printf(_T("%06d"),z+1); SetRowLabelValue(z,Temp0); // Set Row Lable Value
123 (db_Br+i_Which)->OnGetNext((ct_BrowserDB->pTableInf+ValidTable)->numCols,false);
124 for (y=0;y<(ct_BrowserDB->pTableInf+ValidTable)->numCols;y++) // Loop through the Fields
125 { // BrowserDB::OnGetNext Formats the field Value into tablename
126 SetCellValue(z, y,((db_Br+i_Which)->cl_BrowserDB+y)->tableName);
127 }
128 #if wxUSE_STATUSBAR
129 if (z % 50 == 0)
130 {
131 Temp0.Printf(_("-I-> DBGrid::OnTableView(%s) - Record %6d (from %d) has been read."),Table.c_str(),z,(db_Br+i_Which)->i_Records);
132 pDoc->p_MainFrame->SetStatusText(Temp0, 0);
133 }
134 #endif // wxUSE_STATUSBAR
135 } // for (z=0;z<(db_Br+i_Which)->i_Records;z++)
136 Temp0.Printf(_("-I-> DBGrid::OnTableView(%s) - %6d Records have been read. - Time needed : %ld ms"),Table.c_str(),z,sw.Time());
137 wxLogMessage(Temp0);
138 #if wxUSE_STATUSBAR
139 pDoc->p_MainFrame->SetStatusText(Temp0, 0);
140 #endif // wxUSE_STATUSBAR
141 // The Grid has been filled, now leave
142 goto Weiter;
143 } // if ((ct_BrowserDB->pTableInf+x)->pColInf)
144 else
145 wxLogMessage(_("\n-E-> DBGrid::OnTableView() : Invalid Column Pointer : Failed"));
146 } // if ((ct_BrowserDB->pTableInf+x)->tableType == "TABLE")
147 } // for (x=0;x<ct_BrowserDB->numTables;x++)
148 } // if (ct_BrowserDB)
149 else
150 wxLogMessage(_("\n-E-> DBGrid::OnTableView() : Invalid DSN Pointer : Failed"));
151 //---------------------------------------------------------------------------------------
152 Weiter:
153 EnableEditing(b_EditModus); // Deactivate in-place Editing
154 wxEndBusyCursor();
155 //---------------------------------------------------------------------------------------
156 wxLogMessage(_("-I-> DBGrid::OnTableView() - End"));
157 return 0;
158 }
159
160 //----------------------------------------------------------------------------------------
161 void DBGrid::OnModusEdit(wxCommandEvent& WXUNUSED(event))
162 {
163 b_EditModus = true; // Needed by PopupMenu
164 EnableEditing(b_EditModus); // Activate in-place Editing
165 UpdateDimensions(); // Redraw the Grid
166 // wxLogMessage(_("-I-> DBGrid::OnModusEdit() - End"));
167 }
168
169 //----------------------------------------------------------------------------------------
170 void DBGrid::OnModusBrowse(wxCommandEvent& WXUNUSED(event))
171 {
172 b_EditModus = false; // Needed by PopupMenu
173 EnableEditing(b_EditModus); // Deactivate in-place Editing
174 UpdateDimensions(); // Redraw the Grid
175 // wxLogMessage(_("-I-> DBGrid::OnModusBrowse() - End"));
176 }
177
178 //----------------------------------------------------------------------------------------
179 void DBGrid::OnEditorShown( wxGridEvent& ev )
180 {
181 // wxLogMessage(_("-I-> DBGrid::OnEditorShown() - End"));
182 ev.Skip();
183 }
184
185 //----------------------------------------------------------------------------------------
186 void DBGrid::OnEditorHidden( wxGridEvent& ev )
187 {
188 // wxLogMessage(_("-I-> DBGrid::OnEditorHidden() - End"));
189 ev.Skip();
190 }
191
192 //----------------------------------------------------------------------------------------
193 void DBGrid::OnSelectCell( wxGridEvent& ev )
194 {
195 logBuf = wxEmptyString;
196 logBuf << _T("Selected cell at row ") << ev.GetRow()
197 << _T(" col ") << ev.GetCol();
198 wxLogMessage( _T("%s"), logBuf.c_str() );
199 // you must call Skip() if you want the default processing
200 // to occur in wxGrid
201 ev.Skip();
202 }
203
204 //----------------------------------------------------------------------------------------
205 void DBGrid::OnMouseMove(wxMouseEvent &event)
206 {
207 MousePos = event.GetPosition();
208 }
209
210 //----------------------------------------------------------------------------------------
211 void DBGrid::OnLabelLeftClick( wxGridEvent& ev )
212 {
213 logBuf = _T("DBGrid::OnLabelLeftClick : ");
214 if ( ev.GetRow() != -1 )
215 {
216 logBuf << _T("row label ") << ev.GetRow();
217 }
218 else if ( ev.GetCol() != -1 )
219 {
220 logBuf << _T("col label ") << ev.GetCol();
221 }
222 else
223 {
224 logBuf << _T("corner label");
225 }
226 if ( ev.ShiftDown() )
227 logBuf << _T(" (shift down)");
228
229 // wxLogMessage( "%s", logBuf.c_str() );
230 logBuf += _T("\n");
231 wxLogMessage(logBuf.c_str());
232 ev.Skip();
233 }
234
235 //----------------------------------------------------------------------------------------
236 void DBGrid::OnLabelRightClick( wxGridEvent& ev )
237 {
238 //-------------------------------------------------------
239 if (b_EditModus)
240 PopupMenu(popupMenu2,MousePos.x,MousePos.y);
241 else
242 PopupMenu(popupMenu1,MousePos.x,MousePos.y);
243 //-------------------
244 logBuf = _T("DBGrid::OnLabelRightClick : ");
245 if ( ev.GetRow() != -1 )
246 {
247 logBuf << _T("row label ") << ev.GetRow();
248 }
249 else if ( ev.GetCol() != -1 )
250 {
251 logBuf << _T("col label ") << ev.GetCol();
252 }
253 else
254 {
255 logBuf << _T("corner label");
256 }
257 if ( ev.ShiftDown() )
258 logBuf << _T(" (shift down)");
259
260 // wxLogMessage( "%s", logBuf.c_str() );
261 logBuf += _T("\n");
262 wxLogMessage(logBuf.c_str());
263 ev.Skip();
264 }
265
266 //----------------------------------------------------------------------------------------
267 void DBGrid::OnLabelLeftDClick( wxGridEvent& ev )
268 {
269 logBuf = _T("DBGrid::OnLabelLeftDClick : ");
270 if ( ev.GetRow() != -1 )
271 {
272 logBuf << _T("row label ") << ev.GetRow();
273 }
274 else if ( ev.GetCol() != -1 )
275 {
276 logBuf << _T("col label ") << ev.GetCol();
277 }
278 else
279 {
280 logBuf << _T("corner label");
281 }
282 if ( ev.ShiftDown() )
283 logBuf << _T(" (shift down)");
284
285 // wxLogMessage( _T("%s"), logBuf.c_str() );
286 logBuf += _T("\n");
287 wxLogMessage(logBuf.c_str());
288 ev.Skip();
289 }
290
291 //----------------------------------------------------------------------------------------
292 void DBGrid::OnLabelRightDClick( wxGridEvent& ev )
293 {
294 logBuf = _T("DBGrid::OnLabelRightDClick : ");
295 if ( ev.GetRow() != -1 )
296 {
297 logBuf << _T("row label ") << ev.GetRow();
298 }
299 else if ( ev.GetCol() != -1 )
300 {
301 logBuf << _T("col label ") << ev.GetCol();
302 }
303 else
304 {
305 logBuf << _T("corner label");
306 }
307 if ( ev.ShiftDown() )
308 logBuf << _T(" (shift down)");
309 // wxLogMessage( "%s", logBuf.c_str() );
310 logBuf += _T("\n");
311 wxLogMessage(logBuf.c_str());
312 ev.Skip();
313 }
314
315 //----------------------------------------------------------------------------------------
316 void DBGrid::OnCellLeftClick( wxGridEvent& ev )
317 {
318 logBuf = _T("DBGrid::OnCellLeftClick : ");
319 logBuf << _T("Cell at row ") << ev.GetRow()
320 << _T(" col ") << ev.GetCol();
321 // wxLogMessage( "%s", logBuf.c_str() );
322 // wxMessageBox(logBuf);
323 logBuf += _T("\n");
324 wxLogMessage(logBuf.c_str());
325 // you must call event skip if you want default grid processing
326 // (cell highlighting etc.)
327 //
328 ev.Skip();
329 }
330
331 //----------------------------------------------------------------------------------------
332 void DBGrid::OnCellRightClick( wxGridEvent& ev )
333 {
334 logBuf = _T("DBGrid::OnCellRightClick : ");
335 logBuf << _T("Cell at row ") << ev.GetRow()
336 << _T(" col ") << ev.GetCol();
337 // wxLogMessage( "%s", logBuf.c_str() );
338 // wxMessageBox(logBuf);
339 logBuf += _T("\n");
340 wxLogMessage(logBuf.c_str());
341 // you must call event skip if you want default grid processing
342 // (cell highlighting etc.)
343 //
344 ev.Skip();
345 }
346
347 //----------------------------------------------------------------------------------------
348 void DBGrid::OnCellLeftDClick( wxGridEvent& ev )
349 {
350 logBuf = _T("DBGrid::OnCellLeftDClick : ");
351 logBuf << _T("Cell at row ") << ev.GetRow()
352 << _T(" col ") << ev.GetCol();
353 // wxLogMessage( "%s", logBuf.c_str() );
354 // wxMessageBox(logBuf);
355 logBuf += _T("\n");
356 wxLogMessage(logBuf.c_str());
357 // you must call event skip if you want default grid processing
358 // (cell highlighting etc.)
359 //
360 ev.Skip();
361 }
362
363 //----------------------------------------------------------------------------------------
364 void DBGrid::OnCellRightDClick( wxGridEvent& ev )
365 {
366 logBuf = _T("DBGrid::OnCellRightDClick : ");
367 logBuf << _T("Cell at row ") << ev.GetRow()
368 << _T(" col ") << ev.GetCol();
369 // wxLogMessage( "%s", logBuf.c_str() );
370 // wxMessageBox(logBuf);
371 logBuf += _T("\n");
372 wxLogMessage(logBuf.c_str());
373 // you must call event skip if you want default grid processing
374 // (cell highlighting etc.)
375 //
376 ev.Skip();
377 }
378
379 //----------------------------------------------------------------------------------------
380 void DBGrid::OnCellChange( wxGridEvent& ev )
381 {
382 logBuf = _T("DBGrid::OnCellChange : ");
383 logBuf << _T("Cell at row ") << ev.GetRow()
384 << _T(" col ") << ev.GetCol();
385 // wxLogMessage( "%s", logBuf.c_str() );
386 // wxMessageBox(logBuf);
387 logBuf += _T("\n");
388 wxLogMessage(logBuf.c_str());
389 // you must call event skip if you want default grid processing
390 // (cell highlighting etc.)
391 //
392 ev.Skip();
393 }
394
395 //----------------------------------------------------------------------------------------
396 void DBGrid::OnRowSize( wxGridSizeEvent& ev )
397 {
398 logBuf = _T("DBGrid::OnRowSize : ");
399 logBuf << _T("Resized row ") << ev.GetRowOrCol();
400 // wxLogMessage( "%s", logBuf.c_str() );
401 logBuf += _T("\n");
402 wxLogMessage(logBuf.c_str());
403 ev.Skip();
404 }
405
406 //----------------------------------------------------------------------------------------
407 void DBGrid::OnColSize( wxGridSizeEvent& ev )
408 {
409 logBuf = _T("DBGrid::OnColSize : ");
410 logBuf << _T("Resized col ") << ev.GetRowOrCol();
411 // wxLogMessage( "%s", logBuf.c_str() );
412 logBuf += _T("\n");
413 wxLogMessage(logBuf.c_str());
414 ev.Skip();
415 }
416
417 //----------------------------------------------------------------------------------------
418 void DBGrid::OnRangeSelected( wxGridRangeSelectEvent& ev )
419 {
420 logBuf = _T("DBGrid::OnRangeSelected : ");
421 logBuf << _T("Selected cells from row ") << ev.GetTopRow()
422 << _T(" col ") << ev.GetLeftCol()
423 << _T(" to row ") << ev.GetBottomRow()
424 << _T(" col ") << ev.GetRightCol();
425 logBuf += _T("\n");
426 // wxLogMessage( "%s", logBuf.c_str() );
427 wxLogMessage(logBuf.c_str());
428 ev.Skip();
429 }
430 //----------------------------------------------------------------------------------------