]> git.saurik.com Git - wxWidgets.git/blob - include/wx/generic/grid.h
eb39abc46993b529e1032badf500d5a056188327
[wxWidgets.git] / include / wx / generic / grid.h
1 /////////////////////////////////////////////////////////////////////////////
2 // Name: grid.h
3 // Purpose: wxGrid and related classes
4 // Author: Michael Bedward (based on code by Julian Smart, Robin Dunn)
5 // Modified by:
6 // Created: 1/08/1999
7 // RCS-ID: $Id$
8 // Copyright: (c) Michael Bedward
9 // Licence: wxWindows licence
10 /////////////////////////////////////////////////////////////////////////////
11
12
13 #include "wx/defs.h"
14
15 #if !defined(wxUSE_NEW_GRID) || !(wxUSE_NEW_GRID)
16 #include "gridg.h"
17 #else
18
19 #ifndef __WXGRID_H__
20 #define __WXGRID_H__
21
22 #ifdef __GNUG__
23 #pragma interface "grid.h"
24 #endif
25
26 #include "wx/panel.h"
27 #include "wx/string.h"
28 #include "wx/scrolbar.h"
29 #include "wx/event.h"
30 #include "wx/textctrl.h"
31 #include "wx/combobox.h"
32 #include "wx/dynarray.h"
33
34
35 // Default parameters for wxGrid
36 //
37 #define WXGRID_DEFAULT_NUMBER_ROWS 10
38 #define WXGRID_DEFAULT_NUMBER_COLS 10
39 #ifdef __WXMSW__
40 #define WXGRID_DEFAULT_ROW_HEIGHT 25
41 #else
42 #define WXGRID_DEFAULT_ROW_HEIGHT 30
43 #endif // __WXMSW__
44 #define WXGRID_DEFAULT_COL_WIDTH 80
45 #define WXGRID_DEFAULT_COL_LABEL_HEIGHT 32
46 #define WXGRID_DEFAULT_ROW_LABEL_WIDTH 82
47 #define WXGRID_LABEL_EDGE_ZONE 5
48 #define WXGRID_MIN_ROW_HEIGHT 15
49 #define WXGRID_MIN_COL_WIDTH 15
50 #define WXGRID_DEFAULT_SCROLLBAR_WIDTH 16
51 #define WXGRID_DEFAULT_TOPEDIT_WIDTH 300
52 #define WXGRID_DEFAULT_TOPEDIT_HEIGHT 60
53
54
55 class wxGrid;
56
57
58 //////////////////////////////////////////////////////////////////////
59 //
60 // Grid table classes
61 //
62 //////////////////////////////////////////////////////////////////////
63
64
65 class wxGridTableBase : public wxObject
66 {
67 wxGrid * m_view;
68
69 public:
70 wxGridTableBase();
71 virtual ~wxGridTableBase();
72
73 // You must override these functions in a derived table class
74 //
75 virtual long GetNumberRows() = 0;
76 virtual long GetNumberCols() = 0;
77 virtual wxString GetValue( int row, int col ) = 0;
78 virtual void SetValue( int row, int col, const wxString& s ) = 0;
79 virtual bool IsEmptyCell( int row, int col ) = 0;
80
81 // Overriding these is optional
82 //
83 virtual void SetView( wxGrid *grid ) { m_view = grid; }
84 virtual wxGrid * GetView() const { return m_view; }
85
86 virtual void Clear() {}
87 virtual bool InsertRows( size_t pos = 0, size_t numRows = 1 );
88 virtual bool AppendRows( size_t numRows = 1 );
89 virtual bool DeleteRows( size_t pos = 0, size_t numRows = 1 );
90 virtual bool InsertCols( size_t pos = 0, size_t numCols = 1 );
91 virtual bool AppendCols( size_t numCols = 1 );
92 virtual bool DeleteCols( size_t pos = 0, size_t numCols = 1 );
93
94 virtual wxString GetRowLabelValue( int row );
95 virtual wxString GetColLabelValue( int col );
96 virtual void SetRowLabelValue( int WXUNUSED(row), const wxString& ) {}
97 virtual void SetColLabelValue( int WXUNUSED(col), const wxString& ) {}
98
99 DECLARE_ABSTRACT_CLASS( wxGridTableBase );
100 };
101
102
103
104 // IDs for messages sent from grid table to view
105 //
106 enum wxGridTableRequest {
107 wxGRIDTABLE_REQUEST_VIEW_GET_VALUES = 2000,
108 wxGRIDTABLE_REQUEST_VIEW_SEND_VALUES,
109 wxGRIDTABLE_NOTIFY_ROWS_INSERTED,
110 wxGRIDTABLE_NOTIFY_ROWS_APPENDED,
111 wxGRIDTABLE_NOTIFY_ROWS_DELETED,
112 wxGRIDTABLE_NOTIFY_COLS_INSERTED,
113 wxGRIDTABLE_NOTIFY_COLS_APPENDED,
114 wxGRIDTABLE_NOTIFY_COLS_DELETED
115 };
116
117 class wxGridTableMessage
118 {
119 wxGridTableBase *m_table;
120 int m_id;
121 int m_comInt1;
122 int m_comInt2;
123
124 public:
125 wxGridTableMessage();
126 wxGridTableMessage( wxGridTableBase *table, int id,
127 int comInt1 = -1,
128 int comInt2 = -1 );
129
130 void SetTableObject( wxGridTableBase *table ) { m_table = table; }
131 wxGridTableBase * GetTableObject() const { return m_table; }
132 void SetId( int id ) { m_id = id; }
133 int GetId() { return m_id; }
134 void SetCommandInt( int comInt1 ) { m_comInt1 = comInt1; }
135 int GetCommandInt() { return m_comInt1; }
136 void SetCommandInt2( int comInt2 ) { m_comInt2 = comInt2; }
137 int GetCommandInt2() { return m_comInt2; }
138 };
139
140
141
142 // ------ wxGridStringArray
143 // A 2-dimensional array of strings for data values
144 //
145
146 WX_DECLARE_OBJARRAY(wxArrayString, wxGridStringArray);
147
148
149 // ------ wxGridStringTable
150 //
151 // Simplest type of data table for a grid for small tables of strings
152 // that are stored in memory
153 //
154
155 class wxGridStringTable : public wxGridTableBase
156 {
157 wxGridStringArray m_data;
158
159 // These only get used if you set your own labels, otherwise the
160 // GetRow/ColLabelValue functions return wxGridTableBase defaults
161 //
162 wxArrayString m_rowLabels;
163 wxArrayString m_colLabels;
164
165 public:
166 wxGridStringTable();
167 wxGridStringTable( int numRows, int numCols );
168 ~wxGridStringTable();
169
170 // these are pure virtual in wxGridTableBase
171 //
172 long GetNumberRows();
173 long GetNumberCols();
174 wxString GetValue( int row, int col );
175 void SetValue( int row, int col, const wxString& s );
176 bool IsEmptyCell( int row, int col );
177
178 // overridden functions from wxGridTableBase
179 //
180 void Clear();
181 bool InsertRows( size_t pos = 0, size_t numRows = 1 );
182 bool AppendRows( size_t numRows = 1 );
183 bool DeleteRows( size_t pos = 0, size_t numRows = 1 );
184 bool InsertCols( size_t pos = 0, size_t numCols = 1 );
185 bool AppendCols( size_t numCols = 1 );
186 bool DeleteCols( size_t pos = 0, size_t numCols = 1 );
187
188 void SetRowLabelValue( int row, const wxString& );
189 void SetColLabelValue( int col, const wxString& );
190 wxString GetRowLabelValue( int row );
191 wxString GetColLabelValue( int col );
192
193 DECLARE_DYNAMIC_CLASS( wxGridStringTable )
194 };
195
196
197
198 //////////////////////////////////////////////////////////////////////
199 //
200 // Grid view classes
201 //
202 //////////////////////////////////////////////////////////////////////
203
204 class wxGridCellCoords
205 {
206 long m_row;
207 long m_col;
208
209 public:
210 wxGridCellCoords() { m_row = m_col = -1; }
211 wxGridCellCoords( int r, int c ) { m_row = r; m_col = c; }
212
213 // default copy ctor is ok
214
215 long GetRow() const { return m_row; }
216 void SetRow( long n ) { m_row = n; }
217 long GetCol() const { return m_col; }
218 void SetCol( long n ) { m_col = n; }
219 void Set( long row, long col ) { m_row = row; m_col = col; }
220
221 wxGridCellCoords& operator=( const wxGridCellCoords& other )
222 {
223 if ( &other != this )
224 {
225 m_row=other.m_row;
226 m_col=other.m_col;
227 }
228 return *this;
229 }
230
231 bool operator==( const wxGridCellCoords& other )
232 {
233 return (m_row == other.m_row && m_col == other.m_col);
234 }
235
236 bool operator!=( const wxGridCellCoords& other )
237 {
238 return (m_row != other.m_row || m_col != other.m_col);
239 }
240
241 bool operator!()
242 {
243 return (m_row == -1 && m_col == -1 );
244 }
245 };
246
247
248 // For comparisons...
249 //
250 extern wxGridCellCoords wxGridNoCellCoords;
251 extern wxRect wxGridNoCellRect;
252
253
254 // This set of classes is to provide for the use of different types of
255 // cell edit controls in the grid while avoiding the wx class info
256 // system in deference to wxPython
257
258 class wxGridTextCtrl : public wxTextCtrl
259 {
260 // TRUE for controls placed over cells,
261 // FALSE for a control on a grid control panel
262 bool m_isCellControl;
263
264 wxString startValue;
265
266 void OnKeyDown( wxKeyEvent& );
267
268 public:
269 wxGridTextCtrl() {}
270 wxGridTextCtrl( wxWindow *,
271 bool isCellControl,
272 wxWindowID id,
273 const wxString& value = wxEmptyString,
274 const wxPoint& pos = wxDefaultPosition,
275 const wxSize& size = wxDefaultSize,
276 long style = 0 );
277
278 void SetStartValue( const wxString& );
279 wxString GetStartValue() { return startValue; }
280
281 DECLARE_DYNAMIC_CLASS( wxGridTextCtrl )
282 DECLARE_EVENT_TABLE()
283 };
284
285
286 class wxGrid : public wxPanel
287 {
288 DECLARE_DYNAMIC_CLASS( wxGrid )
289
290 protected:
291 bool m_created;
292
293 wxGridTableBase *m_table;
294
295 int m_left;
296 int m_top;
297 int m_right;
298 int m_bottom;
299
300 int m_numRows;
301 int m_numCols;
302
303 wxGridCellCoords m_currentCellCoords;
304 bool m_currentCellHighlighted;
305
306 wxGridCellCoords m_selectedTopLeft;
307 wxGridCellCoords m_selectedBottomRight;
308
309 int m_defaultRowHeight;
310 wxArrayInt m_rowHeights;
311 wxArrayInt m_rowBottoms;
312
313 int m_defaultColWidth;
314 wxArrayInt m_colWidths;
315 wxArrayInt m_colRights;
316
317 int m_rowLabelWidth;
318 int m_colLabelHeight;
319
320 wxColour m_labelBackgroundColour;
321 wxColour m_labelTextColour;
322 wxFont m_labelFont;
323
324 int m_rowLabelHorizAlign;
325 int m_rowLabelVertAlign;
326 int m_colLabelHorizAlign;
327 int m_colLabelVertAlign;
328
329 bool m_defaultRowLabelValues;
330 bool m_defaultColLabelValues;
331
332 wxColour m_gridLineColour;
333 bool m_gridLinesEnabled;
334
335 wxFont m_defaultCellFont;
336
337 wxScrollBar * m_horizScrollBar;
338 wxScrollBar * m_vertScrollBar;
339 int m_scrollBarWidth;
340 int m_scrollPosX;
341 int m_scrollPosY;
342 int m_wholeColsVisible;
343 int m_wholeRowsVisible;
344
345 bool m_inOnKeyDown;
346 bool m_inOnText;
347 bool m_firstPaint;
348 int m_batchCount;
349
350 int m_cursorMode;
351 enum { WXGRID_CURSOR_DEFAULT,
352 WXGRID_CURSOR_SELECT_CELL,
353 WXGRID_CURSOR_RESIZE_ROW,
354 WXGRID_CURSOR_RESIZE_COL,
355 WXGRID_CURSOR_SELECT_ROW,
356 WXGRID_CURSOR_SELECT_COL
357 };
358
359 int m_dragLastPos;
360 int m_dragRowOrCol;
361 bool m_isDragging;
362
363 wxGridCellCoords m_selectionStart;
364
365 wxCursor m_rowResizeCursor;
366 wxCursor m_colResizeCursor;
367
368 bool m_editable; // applies to whole grid
369 int m_editCtrlType; // for current cell
370 wxWindow* m_cellEditCtrl;
371 bool m_cellEditCtrlEnabled;
372 wxWindow* m_topEditCtrl;
373 bool m_topEditCtrlEnabled;
374
375 // ------ internal init and update functions
376 //
377 void Create();
378 void Init();
379 void CalcDimensions();
380 bool IsOnScreen();
381 bool Redimension( wxGridTableMessage& );
382
383 // ------ event processing
384 //
385 bool SendEvent( const wxEventType,
386 int row, int col,
387 wxMouseEvent& );
388
389 bool SendEvent( const wxEventType,
390 int row, int col );
391
392 void OnPaint( wxPaintEvent& );
393 void OnSize( wxSizeEvent& );
394 void OnMouse( wxMouseEvent& );
395 void OnKeyDown( wxKeyEvent& );
396 void OnText( wxKeyEvent& );
397 void OnGridScroll( wxScrollEvent& );
398
399 void SelectCell( const wxGridCellCoords& coords );
400 void SelectCell( int row, int col )
401 { SelectCell( wxGridCellCoords(row, col) ); }
402
403
404 // ------ edit controls
405 //
406 void ShowCellEditControl();
407 void HideCellEditControl();
408 void SaveEditControlValue();
409
410
411 // ------ grid location functions
412 //
413 int XYToArea( int x, int y ); // returns one of the following...
414 enum { WXGRID_NOAREA,
415 WXGRID_ROWLABEL,
416 WXGRID_ROWLABEL_EDGE,
417 WXGRID_COLLABEL,
418 WXGRID_COLLABEL_EDGE,
419 WXGRID_CORNERLABEL,
420 WXGRID_CELL };
421
422 void XYToCell( int x, int y, wxGridCellCoords& );
423 int YToRow( int y );
424 int XToCol( int x );
425
426 int YToEdgeOfRow( int y );
427 int XToEdgeOfCol( int x );
428
429 wxRect CellToRect( int row, int col );
430 wxRect CellToRect( const wxGridCellCoords& coords )
431 { return CellToRect( coords.GetRow(), coords.GetCol() ); }
432
433 bool MoveCursorUp();
434 bool MoveCursorDown();
435 bool MoveCursorLeft();
436 bool MoveCursorRight();
437 bool MovePageDown();
438 bool MovePageUp();
439 bool MoveCursorUpBlock();
440 bool MoveCursorDownBlock();
441 bool MoveCursorLeftBlock();
442 bool MoveCursorRightBlock();
443
444
445 // ------ label drawing functions
446 //
447 void DrawLabelAreas( wxDC& dc );
448 void DrawColLabelBorders( wxDC& dc );
449 void DrawColLabels( wxDC& dc );
450 void DrawColLabel( wxDC& dc, const wxRect&, int col );
451 void DrawRowLabelBorders( wxDC& dc );
452 void DrawRowLabels( wxDC& dc );
453 void DrawRowLabel( wxDC& dc, const wxRect&, int col );
454
455
456 // ------ cell drawing functions
457 //
458 void DrawCellArea( wxDC& dc );
459 void DrawGridLines( wxDC& dc );
460 void DrawCells( wxDC& dc );
461 void DrawCellBackground( wxDC& dc, const wxRect&, int row, int col );
462 void DrawCellValue( wxDC& dc, const wxRect&, int row, int col,
463 const wxString& value = wxEmptyString, bool useValueArg = FALSE );
464
465 // this updates the displayed cell text value but not the underlying
466 // table cell value (it is used to echo text being entered into
467 // the top edit control when in-place editing is turned off)
468 //
469 void DrawCellValue( const wxGridCellCoords& coords, const wxString& value );
470
471 // these are useful when you just need to draw one or a few
472 // cells
473 void DrawCell( int row, int col );
474 void DrawCell( const wxGridCellCoords& coords )
475 { DrawCell( coords.GetRow(), coords.GetCol() ); }
476
477 void DrawCellHighlight( wxDC& dc, int row, int col );
478 void DrawCellHighlight( wxDC& dc, wxGridCellCoords& coords )
479 { DrawCellHighlight( dc, coords.GetRow(), coords.GetCol() ); }
480 void ShowCurrentCellHighlight( wxDC& dc );
481 void HideCurrentCellHighlight( wxDC& dc );
482
483
484 // ------ generic drawing functions
485 //
486 void DrawTextRectangle( wxDC& dc, const wxString&, const wxRect&,
487 int horizontalAlignment = wxLEFT,
488 int verticalAlignment = wxTOP );
489
490 // Split a string containing newline chararcters into an array of
491 // strings and return the number of lines
492 //
493 void StringToLines( const wxString& value, wxArrayString& lines );
494
495 void GetTextBoxSize( wxDC& dc,
496 wxArrayString& lines,
497 long *width, long *height );
498
499
500 // ------ functions to get/send data (see also public functions)
501 //
502 bool GetModelValues();
503 bool SetModelValues();
504
505
506 ////////////////////// Public section ////////////////////
507
508 public:
509 wxGrid()
510 { Create(); }
511
512 wxGrid( wxWindow *parent,
513 wxWindowID id,
514 const wxPoint& pos = wxDefaultPosition,
515 const wxSize& size = wxDefaultSize,
516 long style = 0,
517 const wxString& name = wxPanelNameStr )
518 : wxPanel( parent, id, pos, size, style, name )
519 {
520 Create();
521 }
522
523 ~wxGrid();
524
525 bool CreateGrid( int numRows = WXGRID_DEFAULT_NUMBER_ROWS,
526 int numCols = WXGRID_DEFAULT_NUMBER_COLS );
527
528 wxGridTableBase * GetTable() const { return m_table; }
529 void SetTable( wxGridTableBase *table ) { m_table = table; }
530
531 void ClearGrid();
532 bool InsertRows( int pos = 0, int numRows = 1, bool updateLabels=TRUE );
533 bool AppendRows( int numRows = 1, bool updateLabels=TRUE );
534 bool DeleteRows( int pos = 0, int numRows = 1, bool updateLabels=TRUE );
535 bool InsertCols( int pos = 0, int numCols = 1, bool updateLabels=TRUE );
536 bool AppendCols( int numCols = 1, bool updateLabels=TRUE );
537 bool DeleteCols( int pos = 0, int numCols = 1, bool updateLabels=TRUE );
538
539 // ------ editing and edit controls
540 //
541 bool IsEditable() { return m_editable; }
542 void EnableEditing( bool edit );
543
544 void EnableTopEditControl( bool enable );
545 bool IsTopEditControlEnabled()
546 { return (m_topEditCtrl && m_topEditCtrlEnabled); }
547 void EnableCellEditControl( bool enable );
548 bool IsCellEditControlEnabled()
549 { return (m_cellEditCtrl && m_cellEditCtrlEnabled); }
550 void SetEditControlValue( const wxString& s = wxEmptyString );
551
552
553 // ------ grid dimensions
554 //
555 int GetNumberRows() { return m_numRows; }
556 int GetNumberCols() { return m_numCols; }
557 int GetNumberVisibleRows() { return m_wholeRowsVisible; }
558 int GetNumberVisibleCols() { return m_wholeColsVisible; }
559
560
561 // ------
562 // Code that does a lot of grid modification can be enclosed
563 // between BeginBatch() and EndBatch() calls to avoid screen
564 // flicker
565 //
566 void BeginBatch() { m_batchCount++; }
567 void EndBatch() { if ( m_batchCount > 0 ) m_batchCount--; }
568 int GetBatchCount() { return m_batchCount; }
569
570
571 // ------ label and gridline formatting
572 //
573 int GetDefaultRowLabelSize() { return WXGRID_DEFAULT_ROW_LABEL_WIDTH; }
574 int GetRowLabelSize() { return m_rowLabelWidth; }
575 int GetDefaultColLabelSize() { return WXGRID_DEFAULT_COL_LABEL_HEIGHT; }
576 int GetColLabelSize() { return m_colLabelHeight; }
577 wxColour GetLabelBackgroundColour() { return m_labelBackgroundColour; }
578 wxColour GetLabelTextColour() { return m_labelTextColour; }
579 wxFont GetLabelFont() { return m_labelFont; }
580 void GetRowLabelAlignment( int *horiz, int *vert );
581 void GetColLabelAlignment( int *horiz, int *vert );
582 wxString GetRowLabelValue( int row );
583 wxString GetColLabelValue( int col );
584 wxColour GetGridLineColour() { return m_gridLineColour; }
585
586 void SetRowLabelSize( int width );
587 void SetColLabelSize( int height );
588 void SetLabelBackgroundColour( const wxColour& );
589 void SetLabelTextColour( const wxColour& );
590 void SetLabelFont( const wxFont& );
591 void SetRowLabelAlignment( int horiz, int vert );
592 void SetColLabelAlignment( int horiz, int vert );
593 void SetRowLabelValue( int row, const wxString& );
594 void SetColLabelValue( int col, const wxString& );
595 void SetGridLineColour( const wxColour& );
596
597 void EnableGridLines( bool enable = TRUE );
598 bool GridLinesEnabled() { return m_gridLinesEnabled; }
599
600
601 // ------ row and col formatting
602 //
603 int GetDefaultRowSize();
604 int GetRowSize( int row );
605 int GetDefaultColSize();
606 int GetColSize( int col );
607 wxColour GetDefaultCellBackgroundColour();
608 wxColour GetCellBackgroundColour( int row, int col );
609 wxColour GetDefaultCellTextColour();
610 wxColour GetCellTextColour( int row, int col );
611 wxColour GetCellHighlightColour();
612 wxFont GetDefaultCellFont();
613 wxFont GetCellFont( int row, int col );
614 void GetDefaultCellAlignment( int *horiz, int *vert );
615 void GetCellAlignment( int row, int col, int *horiz, int *vert );
616
617 void SetDefaultRowSize( int height, bool resizeExistingRows = FALSE );
618 void SetRowSize( int row, int height );
619 void SetDefaultColSize( int width, bool resizeExistingCols = FALSE );
620 void SetColSize( int col, int width );
621 void SetDefaultCellBackgroundColour( const wxColour& );
622 void SetCellBackgroundColour( int row, int col, const wxColour& );
623 void SetDefaultCellTextColour( const wxColour& );
624 void SetCellTextColour( int row, int col, const wxColour& );
625 void SetCellHighlightColour( const wxColour& );
626 void SetDefaultCellFont( const wxFont& );
627 void SetCellFont( int row, int col, const wxFont& );
628 void SetDefaultCellAlignment( int horiz, int vert );
629 void SetCellAlignment( int row, int col, int horiz, int vert );
630
631
632 // ------ cell value accessors
633 //
634 wxString GetCellValue( int row, int col )
635 {
636 if ( m_table )
637 {
638 return m_table->GetValue( row, col );
639 }
640 else
641 {
642 return wxEmptyString;
643 }
644 }
645
646 wxString GetCellValue( const wxGridCellCoords& coords )
647 { return GetCellValue( coords.GetRow(), coords.GetCol() ); }
648
649 void SetCellValue( int row, int col, const wxString& s );
650 void SetCellValue( const wxGridCellCoords& coords, const wxString& s )
651 { SetCellValue( coords.GetRow(), coords.GetCol(), s ); }
652
653
654 // ------ interaction with data model
655 //
656 bool ProcessTableMessage( wxGridTableMessage& );
657
658
659
660 // ------ grid location functions
661 //
662
663 int GetGridCursorRow() { return m_currentCellCoords.GetRow(); }
664 int GetGridCursorCol() { return m_currentCellCoords.GetCol(); }
665 int GetHorizontalScrollPos() { return m_scrollPosX; }
666 int GetVerticalScrollPos() { return m_scrollPosY; }
667
668 bool IsVisible( const wxGridCellCoords& );
669 void MakeCellVisible( int row, int col );
670 void MakeCellVisible( const wxGridCellCoords& coords )
671 { MakeCellVisible( coords.GetRow(), coords.GetCol() ); }
672
673 void SetGridCursor( int row, int col )
674 { SelectCell( wxGridCellCoords(row, col) ); }
675
676 void SetHorizontalScrollPos( int leftMostCol );
677 void SetVerticalScrollPos( int topMostRow );
678
679
680 // ------ selections of blocks of cells
681 //
682 void SelectRow( int row, bool addToSelected = FALSE );
683 void SelectCol( int col, bool addToSelected = FALSE );
684
685 void SelectBlock( int topRow, int leftCol, int bottomRow, int rightCol );
686
687 void SelectBlock( const wxGridCellCoords& topLeft,
688 const wxGridCellCoords& bottomRight )
689 { SelectBlock( topLeft.GetRow(), topLeft.GetCol(),
690 bottomRight.GetRow(), bottomRight.GetCol() ); }
691
692 void SelectAll();
693
694 bool IsSelection()
695 { return ( m_selectedTopLeft != wxGridNoCellCoords &&
696 m_selectedBottomRight != wxGridNoCellCoords );
697 }
698
699 void ClearSelection();
700
701 bool IsInSelection( int row, int col )
702 { return ( IsSelection() &&
703 row >= m_selectedTopLeft.GetRow() &&
704 col >= m_selectedTopLeft.GetCol() &&
705 row <= m_selectedBottomRight.GetRow() &&
706 col <= m_selectedBottomRight.GetCol() );
707 }
708
709 bool IsInSelection( const wxGridCellCoords& coords )
710 { return IsInSelection( coords.GetRow(), coords.GetCol() ); }
711
712 void GetSelection( int* topRow, int* leftCol, int* bottomRow, int* rightCol )
713 {
714 // these will all be -1 if there is no selected block
715 //
716 *topRow = m_selectedTopLeft.GetRow();
717 *leftCol = m_selectedTopLeft.GetCol();
718 *bottomRow = m_selectedBottomRight.GetRow();
719 *rightCol = m_selectedBottomRight.GetCol();
720 }
721
722 // get coordinates of selected block edges for repainting etc.
723 //
724 wxRect SelectionToRect();
725
726
727 // ------ For compatibility with previous wxGrid only...
728 //
729 // ************************************************
730 // ** Don't use these in new code because they **
731 // ** are liable to disappear in a future **
732 // ** revision **
733 // ************************************************
734 //
735
736 wxGrid( wxWindow *parent,
737 int x = -1, int y = -1, int w = -1, int h = -1,
738 long style = 0,
739 const wxString& name = wxPanelNameStr )
740 : wxPanel( parent, -1, wxPoint(x,y), wxSize(w,h), style, name )
741 {
742 Create();
743 }
744
745 void SetCellValue( const wxString& val, int row, int col )
746 { SetCellValue( row, col, val ); }
747
748 void AdjustScrollbars()
749 { CalcDimensions(); }
750
751 void UpdateDimensions()
752 { CalcDimensions(); }
753
754 int GetRows() { return GetNumberRows(); }
755 int GetCols() { return GetNumberCols(); }
756 int GetCursorRow() { return GetGridCursorRow(); }
757 int GetCursorColumn() { return GetGridCursorCol(); }
758 int GetScrollPosX() { return GetHorizontalScrollPos(); }
759 int GetScrollPosY() { return GetVerticalScrollPos(); }
760
761 void SetScrollX( int x ) { SetHorizontalScrollPos( x ); }
762 void SetScrollY( int y ) { SetVerticalScrollPos( y ); }
763
764 void SetColumnWidth( int col, int width )
765 { SetColSize( col, width ); }
766
767 int GetColumnWidth( int col )
768 { return GetColSize( col ); }
769
770 void SetRowHeight( int row, int height )
771 { SetRowSize( row, height ); }
772
773 int GetRowHeight( int row )
774 { return GetRowSize( row ); }
775
776 int GetViewHeight()
777 { return m_wholeRowsVisible; }
778
779 int GetViewWidth()
780 { return m_wholeColsVisible; }
781
782 void SetLabelSize( int orientation, int sz )
783 {
784 if ( orientation == wxHORIZONTAL )
785 SetColLabelSize( sz );
786 else
787 SetRowLabelSize( sz );
788 }
789
790 int GetLabelSize( int orientation )
791 {
792 if ( orientation == wxHORIZONTAL )
793 return GetColLabelSize();
794 else
795 return GetRowLabelSize();
796 }
797
798 void SetLabelAlignment( int orientation, int align )
799 {
800 if ( orientation == wxHORIZONTAL )
801 SetColLabelAlignment( align, -1 );
802 else
803 SetRowLabelAlignment( align, -1 );
804 }
805
806 int GetLabelAlignment( int orientation, int WXUNUSED(align) )
807 {
808 int h, v;
809 if ( orientation == wxHORIZONTAL )
810 {
811 GetColLabelAlignment( &h, &v );
812 return h;
813 }
814 else
815 {
816 GetRowLabelAlignment( &h, &v );
817 return h;
818 }
819 }
820
821 void SetLabelValue( int orientation, const wxString& val, int pos )
822 {
823 if ( orientation == wxHORIZONTAL )
824 SetColLabelValue( pos, val );
825 else
826 SetRowLabelValue( pos, val );
827 }
828
829 wxString GetLabelValue( int orientation, int pos)
830 {
831 if ( orientation == wxHORIZONTAL )
832 return GetColLabelValue( pos );
833 else
834 return GetRowLabelValue( pos );
835 }
836
837 wxFont GetCellTextFont() const
838 { return m_defaultCellFont; }
839
840 wxFont GetCellTextFont(int WXUNUSED(row), int WXUNUSED(col)) const
841 { return m_defaultCellFont; }
842
843 void SetCellTextFont(const wxFont& fnt)
844 { SetDefaultCellFont( fnt ); }
845
846 void SetCellTextFont(const wxFont& fnt, int row, int col)
847 { SetCellFont( row, col, fnt ); }
848
849 void SetCellTextColour(const wxColour& val, int row, int col)
850 { SetCellTextColour( row, col, val ); }
851
852 void SetCellTextColour(const wxColour& col)
853 { SetDefaultCellTextColour( col ); }
854
855 void SetCellBackgroundColour(const wxColour& col)
856 { SetDefaultCellBackgroundColour( col ); }
857
858 void SetCellBackgroundColour(const wxColour& colour, int row, int col)
859 { SetCellBackgroundColour( row, col, colour ); }
860
861 bool GetEditable() { return IsEditable(); }
862 void SetEditable( bool edit = TRUE ) { EnableEditing( edit ); }
863 bool GetEditInPlace() { return IsCellEditControlEnabled(); }
864 void SetEditInPlace(bool edit = TRUE) { EnableCellEditControl( edit ); }
865
866 void SetCellAlignment( int align, int row, int col)
867 { SetCellAlignment(row, col, align, wxCENTER); }
868 void SetCellAlignment( int WXUNUSED(align) ) {}
869 void SetCellBitmap(wxBitmap *WXUNUSED(bitmap), int WXUNUSED(row), int WXUNUSED(col))
870 { }
871 void SetDividerPen(const wxPen& WXUNUSED(pen)) { }
872 wxPen& GetDividerPen() const { return wxNullPen; }
873 void OnActivate(bool WXUNUSED(active)) {}
874
875 // ******** End of compatibility functions **********
876
877
878 // ------ control IDs
879 enum { wxGRID_HORIZSCROLL = 2000,
880 wxGRID_VERTSCROLL,
881 wxGRID_CELLCTRL,
882 wxGRID_TOPCTRL };
883
884 // ------ control types
885 enum { wxGRID_TEXTCTRL = 100,
886 wxGRID_CHECKBOX,
887 wxGRID_CHOICE,
888 wxGRID_COMBOBOX };
889
890
891 DECLARE_EVENT_TABLE()
892 };
893
894
895
896
897
898 //
899 // ------ Grid event class and event types
900 //
901
902 class WXDLLEXPORT wxGridEvent : public wxNotifyEvent
903 {
904 DECLARE_DYNAMIC_CLASS(wxGridEvent)
905
906 protected:
907 int m_row;
908 int m_col;
909 int m_x;
910 int m_y;
911 bool m_control;
912 bool m_meta;
913 bool m_shift;
914 bool m_alt;
915
916 public:
917 wxGridEvent()
918 : wxNotifyEvent(), m_row(-1), m_col(-1), m_x(-1), m_y(-1),
919 m_control(0), m_meta(0), m_shift(0), m_alt(0)
920 {
921 }
922
923 wxGridEvent(int id, wxEventType type, wxObject* obj,
924 int row=-1, int col=-1, int x=-1, int y=-1,
925 bool control=FALSE, bool shift=FALSE, bool alt=FALSE, bool meta=FALSE);
926
927 virtual int GetRow() { return m_row; }
928 virtual int GetCol() { return m_col; }
929 wxPoint GetPosition() { return wxPoint( m_x, m_y ); }
930 bool ControlDown() { return m_control; }
931 bool MetaDown() { return m_meta; }
932 bool ShiftDown() { return m_shift; }
933 bool AltDown() { return m_alt; }
934 };
935
936
937 class WXDLLEXPORT wxGridSizeEvent : public wxNotifyEvent
938 {
939 DECLARE_DYNAMIC_CLASS(wxGridSizeEvent)
940
941 protected:
942 int m_rowOrCol;
943 int m_x;
944 int m_y;
945 bool m_control;
946 bool m_meta;
947 bool m_shift;
948 bool m_alt;
949
950 public:
951 wxGridSizeEvent()
952 : wxNotifyEvent(), m_rowOrCol(-1), m_x(-1), m_y(-1),
953 m_control(0), m_meta(0), m_shift(0), m_alt(0)
954 {
955 }
956
957 wxGridSizeEvent(int id, wxEventType type, wxObject* obj,
958 int rowOrCol=-1, int x=-1, int y=-1,
959 bool control=FALSE, bool shift=FALSE, bool alt=FALSE, bool meta=FALSE);
960
961 int GetRowOrCol() { return m_rowOrCol; }
962 wxPoint GetPosition() { return wxPoint( m_x, m_y ); }
963 bool ControlDown() { return m_control; }
964 bool MetaDown() { return m_meta; }
965 bool ShiftDown() { return m_shift; }
966 bool AltDown() { return m_alt; }
967 };
968
969
970 class WXDLLEXPORT wxGridRangeSelectEvent : public wxNotifyEvent
971 {
972 DECLARE_DYNAMIC_CLASS(wxGridRangeSelectEvent)
973
974 protected:
975 wxGridCellCoords m_topLeft;
976 wxGridCellCoords m_bottomRight;
977 bool m_control;
978 bool m_meta;
979 bool m_shift;
980 bool m_alt;
981
982 public:
983 wxGridRangeSelectEvent()
984 : wxNotifyEvent()
985 {
986 m_topLeft = wxGridNoCellCoords;
987 m_bottomRight = wxGridNoCellCoords;
988 m_control = FALSE;
989 m_meta = FALSE;
990 m_shift = FALSE;
991 m_alt = FALSE;
992 }
993
994 wxGridRangeSelectEvent(int id, wxEventType type, wxObject* obj,
995 const wxGridCellCoords& topLeft,
996 const wxGridCellCoords& bottomRight,
997 bool control=FALSE, bool shift=FALSE,
998 bool alt=FALSE, bool meta=FALSE);
999
1000 wxGridCellCoords GetTopLeftCoords() { return m_topLeft; }
1001 wxGridCellCoords GetBottomRightCoords() { return m_bottomRight; }
1002 int GetTopRow() { return m_topLeft.GetRow(); }
1003 int GetBottomRow() { return m_bottomRight.GetRow(); }
1004 int GetLeftCol() { return m_topLeft.GetCol(); }
1005 int GetRightCol() { return m_bottomRight.GetCol(); }
1006 bool ControlDown() { return m_control; }
1007 bool MetaDown() { return m_meta; }
1008 bool ShiftDown() { return m_shift; }
1009 bool AltDown() { return m_alt; }
1010 };
1011
1012
1013 const wxEventType EVT_GRID_CELL_LEFT_CLICK = wxEVT_FIRST + 1580;
1014 const wxEventType EVT_GRID_CELL_RIGHT_CLICK = wxEVT_FIRST + 1581;
1015 const wxEventType EVT_GRID_CELL_LEFT_DCLICK = wxEVT_FIRST + 1582;
1016 const wxEventType EVT_GRID_CELL_RIGHT_DCLICK = wxEVT_FIRST + 1583;
1017 const wxEventType EVT_GRID_LABEL_LEFT_CLICK = wxEVT_FIRST + 1584;
1018 const wxEventType EVT_GRID_LABEL_RIGHT_CLICK = wxEVT_FIRST + 1585;
1019 const wxEventType EVT_GRID_LABEL_LEFT_DCLICK = wxEVT_FIRST + 1586;
1020 const wxEventType EVT_GRID_LABEL_RIGHT_DCLICK = wxEVT_FIRST + 1587;
1021 const wxEventType EVT_GRID_ROW_SIZE = wxEVT_FIRST + 1588;
1022 const wxEventType EVT_GRID_COL_SIZE = wxEVT_FIRST + 1589;
1023 const wxEventType EVT_GRID_RANGE_SELECT = wxEVT_FIRST + 1590;
1024 const wxEventType EVT_GRID_CELL_CHANGE = wxEVT_FIRST + 1591;
1025 const wxEventType EVT_GRID_SELECT_CELL = wxEVT_FIRST + 1592;
1026
1027
1028 typedef void (wxEvtHandler::*wxGridEventFunction)(wxGridEvent&);
1029 typedef void (wxEvtHandler::*wxGridSizeEventFunction)(wxGridSizeEvent&);
1030 typedef void (wxEvtHandler::*wxGridRangeSelectEventFunction)(wxGridRangeSelectEvent&);
1031
1032 #define EVT_GRID_CELL_LEFT_CLICK(fn) { EVT_GRID_CELL_LEFT_CLICK, -1, -1, (wxObjectEventFunction) (wxEventFunction) (wxGridEventFunction) &fn, NULL },
1033 #define EVT_GRID_CELL_RIGHT_CLICK(fn) { EVT_GRID_CELL_RIGHT_CLICK, -1, -1, (wxObjectEventFunction) (wxEventFunction) (wxGridEventFunction) &fn, NULL },
1034 #define EVT_GRID_CELL_LEFT_DCLICK(fn) { EVT_GRID_CELL_LEFT_DCLICK, -1, -1, (wxObjectEventFunction) (wxEventFunction) (wxGridEventFunction) &fn, NULL },
1035 #define EVT_GRID_CELL_RIGHT_DCLICK(fn) { EVT_GRID_CELL_RIGHT_DCLICK, -1, -1, (wxObjectEventFunction) (wxEventFunction) (wxGridEventFunction) &fn, NULL },
1036 #define EVT_GRID_LABEL_LEFT_CLICK(fn) { EVT_GRID_LABEL_LEFT_CLICK, -1, -1, (wxObjectEventFunction) (wxEventFunction) (wxGridEventFunction) &fn, NULL },
1037 #define EVT_GRID_LABEL_RIGHT_CLICK(fn) { EVT_GRID_LABEL_RIGHT_CLICK, -1, -1, (wxObjectEventFunction) (wxEventFunction) (wxGridEventFunction) &fn, NULL },
1038 #define EVT_GRID_LABEL_LEFT_DCLICK(fn) { EVT_GRID_LABEL_LEFT_DCLICK, -1, -1, (wxObjectEventFunction) (wxEventFunction) (wxGridEventFunction) &fn, NULL },
1039 #define EVT_GRID_LABEL_RIGHT_DCLICK(fn) { EVT_GRID_LABEL_RIGHT_DCLICK, -1, -1, (wxObjectEventFunction) (wxEventFunction) (wxGridEventFunction) &fn, NULL },
1040 #define EVT_GRID_ROW_SIZE(fn) { EVT_GRID_ROW_SIZE, -1, -1, (wxObjectEventFunction) (wxEventFunction) (wxGridSizeEventFunction) &fn, NULL },
1041 #define EVT_GRID_COL_SIZE(fn) { EVT_GRID_COL_SIZE, -1, -1, (wxObjectEventFunction) (wxEventFunction) (wxGridSizeEventFunction) &fn, NULL },
1042 #define EVT_GRID_RANGE_SELECT(fn) { EVT_GRID_RANGE_SELECT, -1, -1, (wxObjectEventFunction) (wxEventFunction) (wxGridRangeSelectEventFunction) &fn, NULL },
1043 #define EVT_GRID_CELL_CHANGE(fn) { EVT_GRID_CELL_CHANGE, -1, -1, (wxObjectEventFunction) (wxEventFunction) (wxGridEventFunction) &fn, NULL },
1044 #define EVT_GRID_SELECT_CELL(fn) { EVT_GRID_SELECT_CELL, -1, -1, (wxObjectEventFunction) (wxEventFunction) (wxGridEventFunction) &fn, NULL },
1045
1046
1047 #if 0 // TODO: implement these ? others ?
1048
1049 const wxEventType EVT_GRID_CREATE_CELL = wxEVT_FIRST + 1576;
1050 const wxEventType EVT_GRID_CHANGE_LABELS = wxEVT_FIRST + 1577;
1051 const wxEventType EVT_GRID_CHANGE_SEL_LABEL = wxEVT_FIRST + 1578;
1052
1053 #define EVT_GRID_CREATE_CELL(fn) { EVT_GRID_CREATE_CELL, -1, -1, (wxObjectEventFunction) (wxEventFunction) (wxGridEventFunction) &fn, NULL },
1054 #define EVT_GRID_CHANGE_LABELS(fn) { EVT_GRID_CHANGE_LABELS, -1, -1, (wxObjectEventFunction) (wxEventFunction) (wxGridEventFunction) &fn, NULL },
1055 #define EVT_GRID_CHANGE_SEL_LABEL(fn) { EVT_GRID_CHANGE_SEL_LABEL, -1, -1, (wxObjectEventFunction) (wxEventFunction) (wxGridEventFunction) &fn, NULL },
1056
1057 #endif
1058
1059 #endif // #ifndef __WXGRID_H__
1060
1061 #endif // ifndef wxUSE_NEW_GRID