]> git.saurik.com Git - wxWidgets.git/blob - samples/newgrid/griddemo.cpp
bool editor/renderer added
[wxWidgets.git] / samples / newgrid / griddemo.cpp
1 /////////////////////////////////////////////////////////////////////////////
2 // Name: griddemo.cpp
3 // Purpose: Grid control wxWindows sample
4 // Author: Michael Bedward
5 // Modified by:
6 // RCS-ID: $Id$
7 // Copyright: (c) Michael Bedward, Julian Smart
8 // Licence: wxWindows license
9 /////////////////////////////////////////////////////////////////////////////
10
11 // ============================================================================
12 // declarations
13 // ============================================================================
14
15 // ----------------------------------------------------------------------------
16 // headers
17 // ----------------------------------------------------------------------------
18
19 #ifdef __GNUG__
20 #pragma implementation
21 #pragma interface
22 #endif
23
24 // For compilers that support precompilation, includes "wx/wx.h".
25 #include "wx/wxprec.h"
26
27 #ifdef __BORLANDC__
28 #pragma hdrstop
29 #endif
30
31 #ifndef WX_PRECOMP
32 #include "wx/wx.h"
33 #endif
34
35 #include "wx/colordlg.h"
36
37 #include "wx/grid.h"
38
39 #include "griddemo.h"
40
41 // ----------------------------------------------------------------------------
42 // wxWin macros
43 // ----------------------------------------------------------------------------
44
45 IMPLEMENT_APP( GridApp )
46
47 // ============================================================================
48 // implementation
49 // ============================================================================
50
51 // ----------------------------------------------------------------------------
52 // GridApp
53 // ----------------------------------------------------------------------------
54
55 bool GridApp::OnInit()
56 {
57 GridFrame *frame = new GridFrame;
58 frame->Show( TRUE );
59
60 return TRUE;
61 }
62
63 // ----------------------------------------------------------------------------
64 // GridFrame
65 // ----------------------------------------------------------------------------
66
67 BEGIN_EVENT_TABLE( GridFrame, wxFrame )
68 EVT_MENU( ID_TOGGLEROWLABELS, GridFrame::ToggleRowLabels )
69 EVT_MENU( ID_TOGGLECOLLABELS, GridFrame::ToggleColLabels )
70 EVT_MENU( ID_TOGGLEEDIT, GridFrame::ToggleEditing )
71 EVT_MENU( ID_SETLABELCOLOUR, GridFrame::SetLabelColour )
72 EVT_MENU( ID_SETLABELTEXTCOLOUR, GridFrame::SetLabelTextColour )
73 EVT_MENU( ID_ROWLABELHORIZALIGN, GridFrame::SetRowLabelHorizAlignment )
74 EVT_MENU( ID_ROWLABELVERTALIGN, GridFrame::SetRowLabelVertAlignment )
75 EVT_MENU( ID_COLLABELHORIZALIGN, GridFrame::SetColLabelHorizAlignment )
76 EVT_MENU( ID_COLLABELVERTALIGN, GridFrame::SetColLabelVertAlignment )
77 EVT_MENU( ID_GRIDLINECOLOUR, GridFrame::SetGridLineColour )
78 EVT_MENU( ID_INSERTROW, GridFrame::InsertRow )
79 EVT_MENU( ID_INSERTCOL, GridFrame::InsertCol )
80 EVT_MENU( ID_DELETEROW, GridFrame::DeleteSelectedRows )
81 EVT_MENU( ID_DELETECOL, GridFrame::DeleteSelectedCols )
82 EVT_MENU( ID_CLEARGRID, GridFrame::ClearGrid )
83
84 EVT_MENU( ID_SET_CELL_FG_COLOUR, GridFrame::SetCellFgColour )
85 EVT_MENU( ID_SET_CELL_BG_COLOUR, GridFrame::SetCellBgColour )
86
87 EVT_MENU( ID_ABOUT, GridFrame::About )
88 EVT_MENU( wxID_EXIT, GridFrame::OnQuit )
89 EVT_MENU( ID_VTABLE, GridFrame::OnVTable)
90
91 EVT_GRID_LABEL_LEFT_CLICK( GridFrame::OnLabelLeftClick )
92 EVT_GRID_CELL_LEFT_CLICK( GridFrame::OnCellLeftClick )
93 EVT_GRID_ROW_SIZE( GridFrame::OnRowSize )
94 EVT_GRID_COL_SIZE( GridFrame::OnColSize )
95 EVT_GRID_SELECT_CELL( GridFrame::OnSelectCell )
96 EVT_GRID_RANGE_SELECT( GridFrame::OnRangeSelected )
97 EVT_GRID_CELL_CHANGE( GridFrame::OnCellValueChanged )
98
99 EVT_GRID_EDITOR_SHOWN( GridFrame::OnEditorShown )
100 EVT_GRID_EDITOR_HIDDEN( GridFrame::OnEditorHidden )
101 END_EVENT_TABLE()
102
103
104 GridFrame::GridFrame()
105 : wxFrame( (wxFrame *)NULL, -1, "wxWindows grid class demo",
106 wxDefaultPosition,
107 wxDefaultSize )
108 {
109 int gridW = 600, gridH = 300;
110 int logW = gridW, logH = 100;
111
112 wxMenu *fileMenu = new wxMenu;
113 fileMenu->Append( ID_VTABLE, "&Virtual table test");
114 fileMenu->AppendSeparator();
115 fileMenu->Append( wxID_EXIT, "E&xit\tAlt-X" );
116
117 wxMenu *viewMenu = new wxMenu;
118 viewMenu->Append( ID_TOGGLEROWLABELS, "&Row labels", "", TRUE );
119 viewMenu->Append( ID_TOGGLECOLLABELS, "&Col labels", "", TRUE );
120 viewMenu->Append( ID_TOGGLEEDIT, "&Editable", "", TRUE );
121
122 wxMenu *rowLabelMenu = new wxMenu;
123
124 viewMenu->Append( ID_ROWLABELALIGN, "R&ow label alignment",
125 rowLabelMenu,
126 "Change alignment of row labels" );
127
128 rowLabelMenu->Append( ID_ROWLABELHORIZALIGN, "&Horizontal" );
129 rowLabelMenu->Append( ID_ROWLABELVERTALIGN, "&Vertical" );
130
131 wxMenu *colLabelMenu = new wxMenu;
132
133 viewMenu->Append( ID_COLLABELALIGN, "Col l&abel alignment",
134 colLabelMenu,
135 "Change alignment of col labels" );
136
137 colLabelMenu->Append( ID_COLLABELHORIZALIGN, "&Horizontal" );
138 colLabelMenu->Append( ID_COLLABELVERTALIGN, "&Vertical" );
139
140 wxMenu *colMenu = new wxMenu;
141 colMenu->Append( ID_SETLABELCOLOUR, "Set &label colour" );
142 colMenu->Append( ID_SETLABELTEXTCOLOUR, "Set label &text colour" );
143 colMenu->Append( ID_GRIDLINECOLOUR, "&Grid line colour" );
144 colMenu->Append( ID_SET_CELL_FG_COLOUR, "Set cell &foreground colour" );
145 colMenu->Append( ID_SET_CELL_BG_COLOUR, "Set cell &background colour" );
146
147 wxMenu *editMenu = new wxMenu;
148 editMenu->Append( ID_INSERTROW, "Insert &row" );
149 editMenu->Append( ID_INSERTCOL, "Insert &column" );
150 editMenu->Append( ID_DELETEROW, "Delete selected ro&ws" );
151 editMenu->Append( ID_DELETECOL, "Delete selected co&ls" );
152 editMenu->Append( ID_CLEARGRID, "Cl&ear grid cell contents" );
153
154 wxMenu *helpMenu = new wxMenu;
155 helpMenu->Append( ID_ABOUT, "&About wxGrid demo" );
156
157 wxMenuBar *menuBar = new wxMenuBar;
158 menuBar->Append( fileMenu, "&File" );
159 menuBar->Append( viewMenu, "&View" );
160 menuBar->Append( colMenu, "&Colours" );
161 menuBar->Append( editMenu, "&Edit" );
162 menuBar->Append( helpMenu, "&Help" );
163
164 SetMenuBar( menuBar );
165
166 grid = new wxGrid( this,
167 -1,
168 wxPoint( 0, 0 ),
169 wxSize( 400, 300 ) );
170
171 logWin = new wxTextCtrl( this,
172 -1,
173 wxEmptyString,
174 wxPoint( 0, gridH + 20 ),
175 wxSize( logW, logH ),
176 wxTE_MULTILINE );
177
178 logger = new wxLogTextCtrl( logWin );
179 logger->SetActiveTarget( logger );
180 logger->SetTimestamp( NULL );
181
182 // this will create a grid and, by default, an associated grid
183 // table for string data
184 //
185 grid->CreateGrid( 100, 100 );
186
187 grid->SetRowSize( 0, 60 );
188 grid->SetCellValue( 0, 0, "Ctrl+Home\nwill go to\nthis cell" );
189
190 grid->SetCellValue( 0, 1, "Blah" );
191 grid->SetCellValue( 0, 2, "Blah" );
192 grid->SetCellValue( 0, 3, "Read only" );
193 grid->SetReadOnly( 0, 3 );
194
195 grid->SetCellValue( 0, 5, "Press\nCtrl+arrow\nto skip over\ncells" );
196
197 grid->SetRowSize( 99, 60 );
198 grid->SetCellValue( 99, 99, "Ctrl+End\nwill go to\nthis cell" );
199
200 grid->SetCellValue(2, 2, "red");
201
202 grid->SetCellTextColour(2, 2, *wxRED);
203 grid->SetCellValue(3, 3, "green on grey");
204 grid->SetCellTextColour(3, 3, *wxGREEN);
205 grid->SetCellBackgroundColour(3, 3, *wxLIGHT_GREY);
206
207 grid->SetCellValue(4, 4, "a weird looking cell");
208 grid->SetCellAlignment(4, 4, wxCENTRE, wxCENTRE);
209 grid->SetCellRenderer(4, 4, new MyGridCellRenderer);
210
211 grid->SetCellValue(3, 0, "1");
212 grid->SetCellRenderer(3, 0, new wxGridCellBoolRenderer);
213 grid->SetCellEditor(3, 0, new wxGridCellBoolEditor);
214
215 wxGridCellAttr *attr;
216 attr = new wxGridCellAttr;
217 attr->SetTextColour(*wxBLUE);
218 grid->SetColAttr(5, attr);
219 attr = new wxGridCellAttr;
220 attr->SetBackgroundColour(*wxBLUE);
221 grid->SetRowAttr(5, attr);
222
223 // VZ: cell borders don't look nice otherwise :-) (for now...)
224 grid->SetDefaultCellBackgroundColour(wxColour(200, 200, 180));
225
226 wxBoxSizer *topSizer = new wxBoxSizer( wxVERTICAL );
227 topSizer->Add( grid,
228 1,
229 wxEXPAND );
230
231 topSizer->Add( logWin,
232 0,
233 wxEXPAND );
234
235 SetAutoLayout( TRUE );
236 SetSizer( topSizer );
237
238 topSizer->Fit( this );
239 topSizer->SetSizeHints( this );
240
241 Centre();
242 SetDefaults();
243 }
244
245
246 GridFrame::~GridFrame()
247 {
248 }
249
250
251 void GridFrame::SetDefaults()
252 {
253 GetMenuBar()->Check( ID_TOGGLEROWLABELS, TRUE );
254 GetMenuBar()->Check( ID_TOGGLECOLLABELS, TRUE );
255 GetMenuBar()->Check( ID_TOGGLEEDIT, TRUE );
256 }
257
258
259 void GridFrame::ToggleRowLabels( wxCommandEvent& WXUNUSED(ev) )
260 {
261 if ( GetMenuBar()->IsChecked( ID_TOGGLEROWLABELS ) )
262 {
263 grid->SetRowLabelSize( grid->GetDefaultRowLabelSize() );
264 }
265 else
266 {
267 grid->SetRowLabelSize( 0 );
268 }
269 }
270
271
272 void GridFrame::ToggleColLabels( wxCommandEvent& WXUNUSED(ev) )
273 {
274 if ( GetMenuBar()->IsChecked( ID_TOGGLECOLLABELS ) )
275 {
276 grid->SetColLabelSize( grid->GetDefaultColLabelSize() );
277 }
278 else
279 {
280 grid->SetColLabelSize( 0 );
281 }
282 }
283
284
285 void GridFrame::ToggleEditing( wxCommandEvent& WXUNUSED(ev) )
286 {
287 grid->EnableEditing(
288 GetMenuBar()->IsChecked( ID_TOGGLEEDIT ) );
289 }
290
291
292 void GridFrame::SetLabelColour( wxCommandEvent& WXUNUSED(ev) )
293 {
294 wxColourDialog dlg( NULL );
295 if ( dlg.ShowModal() == wxID_OK )
296 {
297 wxColourData retData;
298 retData = dlg.GetColourData();
299 wxColour colour = retData.GetColour();
300
301 grid->SetLabelBackgroundColour( colour );
302 }
303 }
304
305
306 void GridFrame::SetLabelTextColour( wxCommandEvent& WXUNUSED(ev) )
307 {
308 wxColourDialog dlg( NULL );
309 if ( dlg.ShowModal() == wxID_OK )
310 {
311 wxColourData retData;
312 retData = dlg.GetColourData();
313 wxColour colour = retData.GetColour();
314
315 grid->SetLabelTextColour( colour );
316 }
317 }
318
319
320 void GridFrame::SetRowLabelHorizAlignment( wxCommandEvent& WXUNUSED(ev) )
321 {
322 int horiz, vert;
323 grid->GetRowLabelAlignment( &horiz, &vert );
324
325 switch ( horiz )
326 {
327 case wxLEFT:
328 horiz = wxCENTRE;
329 break;
330
331 case wxCENTRE:
332 horiz = wxRIGHT;
333 break;
334
335 case wxRIGHT:
336 horiz = wxLEFT;
337 break;
338 }
339
340 grid->SetRowLabelAlignment( horiz, -1 );
341 }
342
343 void GridFrame::SetRowLabelVertAlignment( wxCommandEvent& WXUNUSED(ev) )
344 {
345 int horiz, vert;
346 grid->GetRowLabelAlignment( &horiz, &vert );
347
348 switch ( vert )
349 {
350 case wxTOP:
351 vert = wxCENTRE;
352 break;
353
354 case wxCENTRE:
355 vert = wxBOTTOM;
356 break;
357
358 case wxBOTTOM:
359 vert = wxTOP;
360 break;
361 }
362
363 grid->SetRowLabelAlignment( -1, vert );
364 }
365
366
367 void GridFrame::SetColLabelHorizAlignment( wxCommandEvent& WXUNUSED(ev) )
368 {
369 int horiz, vert;
370 grid->GetColLabelAlignment( &horiz, &vert );
371
372 switch ( horiz )
373 {
374 case wxLEFT:
375 horiz = wxCENTRE;
376 break;
377
378 case wxCENTRE:
379 horiz = wxRIGHT;
380 break;
381
382 case wxRIGHT:
383 horiz = wxLEFT;
384 break;
385 }
386
387 grid->SetColLabelAlignment( horiz, -1 );
388 }
389
390
391 void GridFrame::SetColLabelVertAlignment( wxCommandEvent& WXUNUSED(ev) )
392 {
393 int horiz, vert;
394 grid->GetColLabelAlignment( &horiz, &vert );
395
396 switch ( vert )
397 {
398 case wxTOP:
399 vert = wxCENTRE;
400 break;
401
402 case wxCENTRE:
403 vert = wxBOTTOM;
404 break;
405
406 case wxBOTTOM:
407 vert = wxTOP;
408 break;
409 }
410
411 grid->SetColLabelAlignment( -1, vert );
412 }
413
414
415 void GridFrame::SetGridLineColour( wxCommandEvent& WXUNUSED(ev) )
416 {
417 wxColourDialog dlg( NULL );
418 if ( dlg.ShowModal() == wxID_OK )
419 {
420 wxColourData retData;
421 retData = dlg.GetColourData();
422 wxColour colour = retData.GetColour();
423
424 grid->SetGridLineColour( colour );
425 }
426 }
427
428
429 void GridFrame::InsertRow( wxCommandEvent& WXUNUSED(ev) )
430 {
431 grid->InsertRows( grid->GetGridCursorRow(), 1 );
432 }
433
434
435 void GridFrame::InsertCol( wxCommandEvent& WXUNUSED(ev) )
436 {
437 grid->InsertCols( grid->GetGridCursorCol(), 1 );
438 }
439
440
441 void GridFrame::DeleteSelectedRows( wxCommandEvent& WXUNUSED(ev) )
442 {
443 if ( grid->IsSelection() )
444 {
445 int topRow, bottomRow, leftCol, rightCol;
446 grid->GetSelection( &topRow, &leftCol, &bottomRow, &rightCol );
447 grid->DeleteRows( topRow, bottomRow - topRow + 1 );
448 }
449 }
450
451
452 void GridFrame::DeleteSelectedCols( wxCommandEvent& WXUNUSED(ev) )
453 {
454 if ( grid->IsSelection() )
455 {
456 int topRow, bottomRow, leftCol, rightCol;
457 grid->GetSelection( &topRow, &leftCol, &bottomRow, &rightCol );
458 grid->DeleteCols( leftCol, rightCol - leftCol + 1 );
459 }
460 }
461
462
463 void GridFrame::ClearGrid( wxCommandEvent& WXUNUSED(ev) )
464 {
465 grid->ClearGrid();
466 }
467
468 void GridFrame::SetCellFgColour( wxCommandEvent& WXUNUSED(ev) )
469 {
470 wxColour col = wxGetColourFromUser(this);
471 if ( col.Ok() )
472 {
473 grid->SetDefaultCellTextColour(col);
474 grid->Refresh();
475 }
476 }
477
478 void GridFrame::SetCellBgColour( wxCommandEvent& WXUNUSED(ev) )
479 {
480 wxColour col = wxGetColourFromUser(this);
481 if ( col.Ok() )
482 {
483 grid->SetDefaultCellBackgroundColour(col);
484 grid->Refresh();
485 }
486 }
487
488 void GridFrame::OnLabelLeftClick( wxGridEvent& ev )
489 {
490 logBuf = "";
491 if ( ev.GetRow() != -1 )
492 {
493 logBuf << "Left click on row label " << ev.GetRow();
494 }
495 else if ( ev.GetCol() != -1 )
496 {
497 logBuf << "Left click on col label " << ev.GetCol();
498 }
499 else
500 {
501 logBuf << "Left click on corner label";
502 }
503
504 if ( ev.ShiftDown() ) logBuf << " (shift down)";
505 wxLogMessage( "%s", logBuf.c_str() );
506
507 // you must call event skip if you want default grid processing
508 //
509 ev.Skip();
510 }
511
512
513 void GridFrame::OnCellLeftClick( wxGridEvent& ev )
514 {
515 logBuf = "";
516 logBuf << "Left click at row " << ev.GetRow()
517 << " col " << ev.GetCol();
518 wxLogMessage( "%s", logBuf.c_str() );
519
520 // you must call event skip if you want default grid processing
521 // (cell highlighting etc.)
522 //
523 ev.Skip();
524 }
525
526
527 void GridFrame::OnRowSize( wxGridSizeEvent& ev )
528 {
529 logBuf = "";
530 logBuf << "Resized row " << ev.GetRowOrCol();
531 wxLogMessage( "%s", logBuf.c_str() );
532
533 ev.Skip();
534 }
535
536
537 void GridFrame::OnColSize( wxGridSizeEvent& ev )
538 {
539 logBuf = "";
540 logBuf << "Resized col " << ev.GetRowOrCol();
541 wxLogMessage( "%s", logBuf.c_str() );
542
543 ev.Skip();
544 }
545
546
547 void GridFrame::OnSelectCell( wxGridEvent& ev )
548 {
549 logBuf = "";
550 logBuf << "Selected cell at row " << ev.GetRow()
551 << " col " << ev.GetCol();
552 wxLogMessage( "%s", logBuf.c_str() );
553
554 // you must call Skip() if you want the default processing
555 // to occur in wxGrid
556 ev.Skip();
557 }
558
559 void GridFrame::OnRangeSelected( wxGridRangeSelectEvent& ev )
560 {
561 logBuf = "";
562 logBuf << "Selected cells from row " << ev.GetTopRow()
563 << " col " << ev.GetLeftCol()
564 << " to row " << ev.GetBottomRow()
565 << " col " << ev.GetRightCol();
566
567 wxLogMessage( "%s", logBuf.c_str() );
568
569 ev.Skip();
570 }
571
572 void GridFrame::OnCellValueChanged( wxGridEvent& ev )
573 {
574 logBuf = "";
575 logBuf << "Value changed for cell at"
576 << " row " << ev.GetRow()
577 << " col " << ev.GetCol();
578
579 wxLogMessage( "%s", logBuf.c_str() );
580
581 ev.Skip();
582 }
583
584 void GridFrame::OnEditorShown( wxGridEvent& ev )
585 {
586 wxLogMessage( "Cell editor shown." );
587
588 ev.Skip();
589 }
590
591 void GridFrame::OnEditorHidden( wxGridEvent& ev )
592 {
593 wxLogMessage( "Cell editor hidden." );
594
595 ev.Skip();
596 }
597
598 void GridFrame::About( wxCommandEvent& WXUNUSED(ev) )
599 {
600 (void)wxMessageBox( "\n\nwxGrid demo \n\n"
601 "Michael Bedward \n"
602 "mbedward@ozemail.com.au \n\n",
603 "About",
604 wxOK );
605 }
606
607
608 void GridFrame::OnQuit( wxCommandEvent& WXUNUSED(ev) )
609 {
610 Close( TRUE );
611 }
612
613 void GridFrame::OnVTable(wxCommandEvent& )
614 {
615 BigGridFrame* win = new BigGridFrame();
616 win->Show(TRUE);
617 }
618
619 // ----------------------------------------------------------------------------
620 // MyGridCellRenderer
621 // ----------------------------------------------------------------------------
622
623 // do something that the default renderer doesn't here just to show that it is
624 // possible to alter the appearance of the cell beyond what the attributes
625 // allow
626 void MyGridCellRenderer::Draw(wxGrid& grid,
627 wxGridCellAttr& attr,
628 wxDC& dc,
629 const wxRect& rect,
630 int row, int col,
631 bool isSelected)
632 {
633 wxGridCellStringRenderer::Draw(grid, attr, dc, rect, row, col, isSelected);
634
635 dc.SetPen(*wxGREEN_PEN);
636 dc.SetBrush(*wxTRANSPARENT_BRUSH);
637 dc.DrawEllipse(rect);
638 }
639
640
641 // ----------------------------------------------------------------------------
642 // BigGridFrame and BigGridTable: Sample of a non-standard table
643 // ----------------------------------------------------------------------------
644
645 BigGridFrame::BigGridFrame()
646 : wxFrame(NULL, -1, "Plugin Virtual Table", wxDefaultPosition,
647 wxSize(500, 450))
648 {
649 m_grid = new wxGrid(this, -1, wxDefaultPosition, wxDefaultSize);
650 m_table = new BigGridTable;
651 m_grid->SetTable(m_table, TRUE);
652 }