]> git.saurik.com Git - wxWidgets.git/blob - include/wx/generic/grid.h
b169892b98f10487def07c9216f79f05a3660f7e
[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 private:
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
464 // this one is useful when you just need to draw one or a few
465 // cells
466 void DrawCell( int row, int col );
467 void DrawCell( const wxGridCellCoords& coords )
468 { DrawCell( coords.GetRow(), coords.GetCol() ); }
469
470 void DrawCellHighlight( wxDC& dc, int row, int col );
471 void DrawCellHighlight( wxDC& dc, wxGridCellCoords& coords )
472 { DrawCellHighlight( dc, coords.GetRow(), coords.GetCol() ); }
473 void ShowCurrentCellHighlight( wxDC& dc );
474 void HideCurrentCellHighlight( wxDC& dc );
475
476
477 // ------ generic drawing functions
478 //
479 void DrawTextRectangle( wxDC& dc, const wxString&, const wxRect&,
480 int horizontalAlignment = wxLEFT,
481 int verticalAlignment = wxTOP );
482
483 // Split a string containing newline chararcters into an array of
484 // strings and return the number of lines
485 //
486 void StringToLines( const wxString& value, wxArrayString& lines );
487
488 void GetTextBoxSize( wxDC& dc,
489 wxArrayString& lines,
490 long *width, long *height );
491
492
493 // ------ functions to get/send data (see also public functions)
494 //
495 bool GetModelValues();
496 bool SetModelValues();
497
498
499 ////////////////////// Public section ////////////////////
500
501 public:
502 wxGrid()
503 { Create(); }
504
505 wxGrid( wxWindow *parent,
506 wxWindowID id,
507 const wxPoint& pos = wxDefaultPosition,
508 const wxSize& size = wxDefaultSize,
509 long style = 0,
510 const wxString& name = wxPanelNameStr )
511 : wxPanel( parent, id, pos, size, style, name )
512 {
513 Create();
514 }
515
516 ~wxGrid();
517
518 bool CreateGrid( int numRows = WXGRID_DEFAULT_NUMBER_ROWS,
519 int numCols = WXGRID_DEFAULT_NUMBER_COLS );
520
521 wxGridTableBase * GetTable() const { return m_table; }
522 void SetTable( wxGridTableBase *table ) { m_table = table; }
523
524 void ClearGrid();
525 bool InsertRows( int pos = 0, int numRows = 1, bool updateLabels=TRUE );
526 bool AppendRows( int numRows = 1, bool updateLabels=TRUE );
527 bool DeleteRows( int pos = 0, int numRows = 1, bool updateLabels=TRUE );
528 bool InsertCols( int pos = 0, int numCols = 1, bool updateLabels=TRUE );
529 bool AppendCols( int numCols = 1, bool updateLabels=TRUE );
530 bool DeleteCols( int pos = 0, int numCols = 1, bool updateLabels=TRUE );
531
532 // ------ editing and edit controls
533 //
534 bool IsEditable() { return m_editable; }
535 void EnableEditing( bool edit );
536
537 void EnableTopEditControl( bool enable );
538 bool IsTopEditControlEnabled()
539 { return (m_topEditCtrl && m_topEditCtrlEnabled); }
540 void EnableCellEditControl( bool enable );
541 bool IsCellEditControlEnabled()
542 { return (m_cellEditCtrl && m_cellEditCtrlEnabled); }
543 void SetEditControlValue( const wxString& s = wxEmptyString );
544
545
546 // ------ grid dimensions
547 //
548 int GetNumberRows() { return m_numRows; }
549 int GetNumberCols() { return m_numCols; }
550 int GetNumberVisibleRows() { return m_wholeRowsVisible; }
551 int GetNumberVisibleCols() { return m_wholeColsVisible; }
552
553
554 // ------
555 // Code that does a lot of grid modification can be enclosed
556 // between BeginBatch() and EndBatch() calls to avoid screen
557 // flicker
558 //
559 void BeginBatch() { m_batchCount++; }
560 void EndBatch() { if ( m_batchCount > 0 ) m_batchCount--; }
561 int GetBatchCount() { return m_batchCount; }
562
563
564 // ------ label and gridline formatting
565 //
566 int GetDefaultRowLabelSize() { return WXGRID_DEFAULT_ROW_LABEL_WIDTH; }
567 int GetRowLabelSize() { return m_rowLabelWidth; }
568 int GetDefaultColLabelSize() { return WXGRID_DEFAULT_COL_LABEL_HEIGHT; }
569 int GetColLabelSize() { return m_colLabelHeight; }
570 wxColour GetLabelBackgroundColour() { return m_labelBackgroundColour; }
571 wxColour GetLabelTextColour() { return m_labelTextColour; }
572 wxFont GetLabelFont() { return m_labelFont; }
573 void GetRowLabelAlignment( int *horiz, int *vert );
574 void GetColLabelAlignment( int *horiz, int *vert );
575 wxString GetRowLabelValue( int row );
576 wxString GetColLabelValue( int col );
577 wxColour GetGridLineColour() { return m_gridLineColour; }
578
579 void SetRowLabelSize( int width );
580 void SetColLabelSize( int height );
581 void SetLabelBackgroundColour( const wxColour& );
582 void SetLabelTextColour( const wxColour& );
583 void SetLabelFont( const wxFont& );
584 void SetRowLabelAlignment( int horiz, int vert );
585 void SetColLabelAlignment( int horiz, int vert );
586 void SetRowLabelValue( int row, const wxString& );
587 void SetColLabelValue( int col, const wxString& );
588 void SetGridLineColour( const wxColour& );
589
590 void EnableGridLines( bool enable = TRUE );
591 bool GridLinesEnabled() { return m_gridLinesEnabled; }
592
593
594 // ------ row and col formatting
595 //
596 int GetDefaultRowSize();
597 int GetRowSize( int row );
598 int GetDefaultColSize();
599 int GetColSize( int col );
600 wxColour GetDefaultCellBackgroundColour();
601 wxColour GetCellBackgroundColour( int row, int col );
602 wxColour GetDefaultCellTextColour();
603 wxColour GetCellTextColour( int row, int col );
604 wxColour GetCellHighlightColour();
605 wxFont GetDefaultCellFont();
606 wxFont GetCellFont( int row, int col );
607 void GetDefaultCellAlignment( int *horiz, int *vert );
608 void GetCellAlignment( int row, int col, int *horiz, int *vert );
609
610 void SetDefaultRowSize( int height, bool resizeExistingRows = FALSE );
611 void SetRowSize( int row, int height );
612 void SetDefaultColSize( int width, bool resizeExistingCols = FALSE );
613 void SetColSize( int col, int width );
614 void SetDefaultCellBackgroundColour( const wxColour& );
615 void SetCellBackgroundColour( int row, int col, const wxColour& );
616 void SetDefaultCellTextColour( const wxColour& );
617 void SetCellTextColour( int row, int col, const wxColour& );
618 void SetCellHighlightColour( const wxColour& );
619 void SetDefaultCellFont( const wxFont& );
620 void SetCellFont( int row, int col, const wxFont& );
621 void SetDefaultCellAlignment( int horiz, int vert );
622 void SetCellAlignment( int row, int col, int horiz, int vert );
623
624
625 // ------ cell value accessors
626 //
627 wxString GetCellValue( int row, int col )
628 {
629 if ( m_table )
630 {
631 return m_table->GetValue( row, col );
632 }
633 else
634 {
635 return wxEmptyString;
636 }
637 }
638
639 wxString GetCellValue( const wxGridCellCoords& coords )
640 { return GetCellValue( coords.GetRow(), coords.GetCol() ); }
641
642 void SetCellValue( int row, int col, const wxString& s );
643 void SetCellValue( const wxGridCellCoords& coords, const wxString& s )
644 { SetCellValue( coords.GetRow(), coords.GetCol(), s ); }
645
646
647 // ------ interaction with data model
648 //
649 bool ProcessTableMessage( wxGridTableMessage& );
650
651
652
653 // ------ grid location functions
654 //
655
656 int GetGridCursorRow() { return m_currentCellCoords.GetRow(); }
657 int GetGridCursorCol() { return m_currentCellCoords.GetCol(); }
658 int GetHorizontalScrollPos() { return m_scrollPosX; }
659 int GetVerticalScrollPos() { return m_scrollPosY; }
660
661 bool IsVisible( const wxGridCellCoords& );
662 void MakeCellVisible( int row, int col );
663 void MakeCellVisible( const wxGridCellCoords& coords )
664 { MakeCellVisible( coords.GetRow(), coords.GetCol() ); }
665
666 void SetGridCursor( int row, int col )
667 { SelectCell( wxGridCellCoords(row, col) ); }
668
669 void SetHorizontalScrollPos( int leftMostCol );
670 void SetVerticalScrollPos( int topMostRow );
671
672
673 // ------ selections of blocks of cells
674 //
675 void SelectRow( int row, bool addToSelected = FALSE );
676 void SelectCol( int col, bool addToSelected = FALSE );
677
678 void SelectBlock( int topRow, int leftCol, int bottomRow, int rightCol );
679
680 void SelectBlock( const wxGridCellCoords& topLeft,
681 const wxGridCellCoords& bottomRight )
682 { SelectBlock( topLeft.GetRow(), topLeft.GetCol(),
683 bottomRight.GetRow(), bottomRight.GetCol() ); }
684
685 void SelectAll();
686
687 bool IsSelection()
688 { return ( m_selectedTopLeft != wxGridNoCellCoords &&
689 m_selectedBottomRight != wxGridNoCellCoords );
690 }
691
692 void ClearSelection();
693
694 bool IsInSelection( int row, int col )
695 { return ( IsSelection() &&
696 row >= m_selectedTopLeft.GetRow() &&
697 col >= m_selectedTopLeft.GetCol() &&
698 row <= m_selectedBottomRight.GetRow() &&
699 col <= m_selectedBottomRight.GetCol() );
700 }
701
702 bool IsInSelection( const wxGridCellCoords& coords )
703 { return IsInSelection( coords.GetRow(), coords.GetCol() ); }
704
705 void GetSelection( int* topRow, int* leftCol, int* bottomRow, int* rightCol )
706 {
707 // these will all be -1 if there is no selected block
708 //
709 *topRow = m_selectedTopLeft.GetRow();
710 *leftCol = m_selectedTopLeft.GetCol();
711 *bottomRow = m_selectedBottomRight.GetRow();
712 *rightCol = m_selectedBottomRight.GetCol();
713 }
714
715 // get coordinates of selected block edges for repainting etc.
716 //
717 wxRect SelectionToRect();
718
719
720 // ------ For compatibility with previous wxGrid only...
721 //
722 // ************************************************
723 // ** Don't use these in new code because they **
724 // ** are liable to disappear in a future **
725 // ** revision **
726 // ************************************************
727 //
728
729 wxGrid( wxWindow *parent,
730 int x = -1, int y = -1, int w = -1, int h = -1,
731 long style = 0,
732 const wxString& name = wxPanelNameStr )
733 : wxPanel( parent, -1, wxPoint(x,y), wxSize(w,h), style, name )
734 {
735 Create();
736 }
737
738 void SetCellValue( const wxString& val, int row, int col )
739 { SetCellValue( row, col, val ); }
740
741 void AdjustScrollbars()
742 { CalcDimensions(); }
743
744 void UpdateDimensions()
745 { CalcDimensions(); }
746
747 int GetRows() { return GetNumberRows(); }
748 int GetCols() { return GetNumberCols(); }
749 int GetCursorRow() { return GetGridCursorRow(); }
750 int GetCursorColumn() { return GetGridCursorCol(); }
751 int GetScrollPosX() { return GetHorizontalScrollPos(); }
752 int GetScrollPosY() { return GetVerticalScrollPos(); }
753
754 void SetScrollX( int x ) { SetHorizontalScrollPos( x ); }
755 void SetScrollY( int y ) { SetVerticalScrollPos( y ); }
756
757 void SetColumnWidth( int col, int width )
758 { SetColSize( col, width ); }
759
760 int GetColumnWidth( int col )
761 { return GetColSize( col ); }
762
763 void SetRowHeight( int row, int height )
764 { SetRowSize( row, height ); }
765
766 int GetRowHeight( int row )
767 { return GetRowSize( row ); }
768
769 int GetViewHeight()
770 { return m_wholeRowsVisible; }
771
772 int GetViewWidth()
773 { return m_wholeColsVisible; }
774
775 void SetLabelSize( int orientation, int sz )
776 {
777 if ( orientation == wxHORIZONTAL )
778 SetColLabelSize( sz );
779 else
780 SetRowLabelSize( sz );
781 }
782
783 int GetLabelSize( int orientation )
784 {
785 if ( orientation == wxHORIZONTAL )
786 return GetColLabelSize();
787 else
788 return GetRowLabelSize();
789 }
790
791 void SetLabelAlignment( int orientation, int align )
792 {
793 if ( orientation == wxHORIZONTAL )
794 SetColLabelAlignment( align, -1 );
795 else
796 SetRowLabelAlignment( align, -1 );
797 }
798
799 int GetLabelAlignment( int orientation, int WXUNUSED(align) )
800 {
801 int h, v;
802 if ( orientation == wxHORIZONTAL )
803 {
804 GetColLabelAlignment( &h, &v );
805 return h;
806 }
807 else
808 {
809 GetRowLabelAlignment( &h, &v );
810 return h;
811 }
812 }
813
814 void SetLabelValue( int orientation, const wxString& val, int pos )
815 {
816 if ( orientation == wxHORIZONTAL )
817 SetColLabelValue( pos, val );
818 else
819 SetRowLabelValue( pos, val );
820 }
821
822 wxString GetLabelValue( int orientation, int pos)
823 {
824 if ( orientation == wxHORIZONTAL )
825 return GetColLabelValue( pos );
826 else
827 return GetRowLabelValue( pos );
828 }
829
830 wxFont GetCellTextFont() const
831 { return m_defaultCellFont; }
832
833 wxFont GetCellTextFont(int WXUNUSED(row), int WXUNUSED(col)) const
834 { return m_defaultCellFont; }
835
836 void SetCellTextFont(const wxFont& fnt)
837 { SetDefaultCellFont( fnt ); }
838
839 void SetCellTextFont(const wxFont& fnt, int row, int col)
840 { SetCellFont( row, col, fnt ); }
841
842 void SetCellTextColour(const wxColour& val, int row, int col)
843 { SetCellTextColour( row, col, val ); }
844
845 void SetCellTextColour(const wxColour& col)
846 { SetDefaultCellTextColour( col ); }
847
848 void SetCellBackgroundColour(const wxColour& col)
849 { SetDefaultCellBackgroundColour( col ); }
850
851 void SetCellBackgroundColour(const wxColour& colour, int row, int col)
852 { SetCellBackgroundColour( row, col, colour ); }
853
854 bool GetEditable() { return IsEditable(); }
855 void SetEditable( bool edit = TRUE ) { EnableEditing( edit ); }
856 bool GetEditInPlace() { return IsCellEditControlEnabled(); }
857 void SetEditInPlace(bool edit = TRUE) { EnableCellEditControl( edit ); }
858
859 void SetCellAlignment( int align, int row, int col)
860 { SetCellAlignment(row, col, align, wxCENTER); }
861 void SetCellAlignment( int WXUNUSED(align) ) {}
862 void SetCellBitmap(wxBitmap *WXUNUSED(bitmap), int WXUNUSED(row), int WXUNUSED(col))
863 { }
864 void SetDividerPen(const wxPen& WXUNUSED(pen)) { }
865 wxPen& GetDividerPen() const { return wxNullPen; }
866 void OnActivate(bool WXUNUSED(active)) {}
867
868 // ******** End of compatibility functions **********
869
870
871 // ------ control IDs
872 enum { wxGRID_HORIZSCROLL = 2000,
873 wxGRID_VERTSCROLL,
874 wxGRID_CELLCTRL,
875 wxGRID_TOPCTRL };
876
877 // ------ control types
878 enum { wxGRID_TEXTCTRL = 100,
879 wxGRID_CHECKBOX,
880 wxGRID_CHOICE,
881 wxGRID_COMBOBOX };
882
883
884 DECLARE_EVENT_TABLE()
885 };
886
887
888
889
890
891 //
892 // ------ Grid event class and event types
893 //
894
895 class WXDLLEXPORT wxGridEvent : public wxNotifyEvent
896 {
897 DECLARE_DYNAMIC_CLASS(wxGridEvent)
898
899 private:
900 int m_row;
901 int m_col;
902 int m_x;
903 int m_y;
904 bool m_control;
905 bool m_meta;
906 bool m_shift;
907 bool m_alt;
908
909 public:
910 wxGridEvent()
911 : wxNotifyEvent(), m_row(-1), m_col(-1), m_x(-1), m_y(-1),
912 m_control(0), m_meta(0), m_shift(0), m_alt(0)
913 {
914 }
915
916 wxGridEvent(int id, wxEventType type, wxObject* obj,
917 int row=-1, int col=-1, int x=-1, int y=-1,
918 bool control=FALSE, bool shift=FALSE, bool alt=FALSE, bool meta=FALSE);
919
920 virtual int GetRow() { return m_row; }
921 virtual int GetCol() { return m_col; }
922 wxPoint GetPosition() { return wxPoint( m_x, m_y ); }
923 bool ControlDown() { return m_control; }
924 bool MetaDown() { return m_meta; }
925 bool ShiftDown() { return m_shift; }
926 bool AltDown() { return m_alt; }
927 };
928
929
930 class WXDLLEXPORT wxGridSizeEvent : public wxNotifyEvent
931 {
932 DECLARE_DYNAMIC_CLASS(wxGridSizeEvent)
933
934 private:
935 int m_rowOrCol;
936 int m_x;
937 int m_y;
938 bool m_control;
939 bool m_meta;
940 bool m_shift;
941 bool m_alt;
942
943 public:
944 wxGridSizeEvent()
945 : wxNotifyEvent(), m_rowOrCol(-1), m_x(-1), m_y(-1),
946 m_control(0), m_meta(0), m_shift(0), m_alt(0)
947 {
948 }
949
950 wxGridSizeEvent(int id, wxEventType type, wxObject* obj,
951 int rowOrCol=-1, int x=-1, int y=-1,
952 bool control=FALSE, bool shift=FALSE, bool alt=FALSE, bool meta=FALSE);
953
954 int GetRowOrCol() { return m_rowOrCol; }
955 wxPoint GetPosition() { return wxPoint( m_x, m_y ); }
956 bool ControlDown() { return m_control; }
957 bool MetaDown() { return m_meta; }
958 bool ShiftDown() { return m_shift; }
959 bool AltDown() { return m_alt; }
960 };
961
962
963 class WXDLLEXPORT wxGridRangeSelectEvent : public wxNotifyEvent
964 {
965 DECLARE_DYNAMIC_CLASS(wxGridRangeSelectEvent)
966
967 private:
968 wxGridCellCoords m_topLeft;
969 wxGridCellCoords m_bottomRight;
970 bool m_control;
971 bool m_meta;
972 bool m_shift;
973 bool m_alt;
974
975 public:
976 wxGridRangeSelectEvent()
977 : wxNotifyEvent()
978 {
979 m_topLeft = wxGridNoCellCoords;
980 m_bottomRight = wxGridNoCellCoords;
981 m_control = FALSE;
982 m_meta = FALSE;
983 m_shift = FALSE;
984 m_alt = FALSE;
985 }
986
987 wxGridRangeSelectEvent(int id, wxEventType type, wxObject* obj,
988 const wxGridCellCoords& topLeft,
989 const wxGridCellCoords& bottomRight,
990 bool control=FALSE, bool shift=FALSE,
991 bool alt=FALSE, bool meta=FALSE);
992
993 wxGridCellCoords GetTopLeftCoords() { return m_topLeft; }
994 wxGridCellCoords GetBottomRightCoords() { return m_bottomRight; }
995 int GetTopRow() { return m_topLeft.GetRow(); }
996 int GetBottomRow() { return m_bottomRight.GetRow(); }
997 int GetLeftCol() { return m_topLeft.GetCol(); }
998 int GetRightCol() { return m_bottomRight.GetCol(); }
999 bool ControlDown() { return m_control; }
1000 bool MetaDown() { return m_meta; }
1001 bool ShiftDown() { return m_shift; }
1002 bool AltDown() { return m_alt; }
1003 };
1004
1005
1006 const wxEventType EVT_GRID_CELL_LEFT_CLICK = wxEVT_FIRST + 1580;
1007 const wxEventType EVT_GRID_CELL_RIGHT_CLICK = wxEVT_FIRST + 1581;
1008 const wxEventType EVT_GRID_CELL_LEFT_DCLICK = wxEVT_FIRST + 1582;
1009 const wxEventType EVT_GRID_CELL_RIGHT_DCLICK = wxEVT_FIRST + 1583;
1010 const wxEventType EVT_GRID_LABEL_LEFT_CLICK = wxEVT_FIRST + 1584;
1011 const wxEventType EVT_GRID_LABEL_RIGHT_CLICK = wxEVT_FIRST + 1585;
1012 const wxEventType EVT_GRID_LABEL_LEFT_DCLICK = wxEVT_FIRST + 1586;
1013 const wxEventType EVT_GRID_LABEL_RIGHT_DCLICK = wxEVT_FIRST + 1587;
1014 const wxEventType EVT_GRID_ROW_SIZE = wxEVT_FIRST + 1588;
1015 const wxEventType EVT_GRID_COL_SIZE = wxEVT_FIRST + 1589;
1016 const wxEventType EVT_GRID_RANGE_SELECT = wxEVT_FIRST + 1590;
1017 const wxEventType EVT_GRID_CELL_CHANGE = wxEVT_FIRST + 1591;
1018 const wxEventType EVT_GRID_SELECT_CELL = wxEVT_FIRST + 1592;
1019
1020
1021 typedef void (wxEvtHandler::*wxGridEventFunction)(wxGridEvent&);
1022 typedef void (wxEvtHandler::*wxGridSizeEventFunction)(wxGridSizeEvent&);
1023 typedef void (wxEvtHandler::*wxGridRangeSelectEventFunction)(wxGridRangeSelectEvent&);
1024
1025 #define EVT_GRID_CELL_LEFT_CLICK(fn) { EVT_GRID_CELL_LEFT_CLICK, -1, -1, (wxObjectEventFunction) (wxEventFunction) (wxGridEventFunction) &fn, NULL },
1026 #define EVT_GRID_CELL_RIGHT_CLICK(fn) { EVT_GRID_CELL_RIGHT_CLICK, -1, -1, (wxObjectEventFunction) (wxEventFunction) (wxGridEventFunction) &fn, NULL },
1027 #define EVT_GRID_CELL_LEFT_DCLICK(fn) { EVT_GRID_CELL_LEFT_DCLICK, -1, -1, (wxObjectEventFunction) (wxEventFunction) (wxGridEventFunction) &fn, NULL },
1028 #define EVT_GRID_CELL_RIGHT_DCLICK(fn) { EVT_GRID_CELL_RIGHT_DCLICK, -1, -1, (wxObjectEventFunction) (wxEventFunction) (wxGridEventFunction) &fn, NULL },
1029 #define EVT_GRID_LABEL_LEFT_CLICK(fn) { EVT_GRID_LABEL_LEFT_CLICK, -1, -1, (wxObjectEventFunction) (wxEventFunction) (wxGridEventFunction) &fn, NULL },
1030 #define EVT_GRID_LABEL_RIGHT_CLICK(fn) { EVT_GRID_LABEL_RIGHT_CLICK, -1, -1, (wxObjectEventFunction) (wxEventFunction) (wxGridEventFunction) &fn, NULL },
1031 #define EVT_GRID_LABEL_LEFT_DCLICK(fn) { EVT_GRID_LABEL_LEFT_DCLICK, -1, -1, (wxObjectEventFunction) (wxEventFunction) (wxGridEventFunction) &fn, NULL },
1032 #define EVT_GRID_LABEL_RIGHT_DCLICK(fn) { EVT_GRID_LABEL_RIGHT_DCLICK, -1, -1, (wxObjectEventFunction) (wxEventFunction) (wxGridEventFunction) &fn, NULL },
1033 #define EVT_GRID_ROW_SIZE(fn) { EVT_GRID_ROW_SIZE, -1, -1, (wxObjectEventFunction) (wxEventFunction) (wxGridSizeEventFunction) &fn, NULL },
1034 #define EVT_GRID_COL_SIZE(fn) { EVT_GRID_COL_SIZE, -1, -1, (wxObjectEventFunction) (wxEventFunction) (wxGridSizeEventFunction) &fn, NULL },
1035 #define EVT_GRID_RANGE_SELECT(fn) { EVT_GRID_RANGE_SELECT, -1, -1, (wxObjectEventFunction) (wxEventFunction) (wxGridRangeSelectEventFunction) &fn, NULL },
1036 #define EVT_GRID_CELL_CHANGE(fn) { EVT_GRID_CELL_CHANGE, -1, -1, (wxObjectEventFunction) (wxEventFunction) (wxGridEventFunction) &fn, NULL },
1037 #define EVT_GRID_SELECT_CELL(fn) { EVT_GRID_SELECT_CELL, -1, -1, (wxObjectEventFunction) (wxEventFunction) (wxGridEventFunction) &fn, NULL },
1038
1039
1040 #if 0 // TODO: implement these ? others ?
1041
1042 const wxEventType EVT_GRID_CREATE_CELL = wxEVT_FIRST + 1576;
1043 const wxEventType EVT_GRID_CHANGE_LABELS = wxEVT_FIRST + 1577;
1044 const wxEventType EVT_GRID_CHANGE_SEL_LABEL = wxEVT_FIRST + 1578;
1045
1046 #define EVT_GRID_CREATE_CELL(fn) { EVT_GRID_CREATE_CELL, -1, -1, (wxObjectEventFunction) (wxEventFunction) (wxGridEventFunction) &fn, NULL },
1047 #define EVT_GRID_CHANGE_LABELS(fn) { EVT_GRID_CHANGE_LABELS, -1, -1, (wxObjectEventFunction) (wxEventFunction) (wxGridEventFunction) &fn, NULL },
1048 #define EVT_GRID_CHANGE_SEL_LABEL(fn) { EVT_GRID_CHANGE_SEL_LABEL, -1, -1, (wxObjectEventFunction) (wxEventFunction) (wxGridEventFunction) &fn, NULL },
1049
1050 #endif
1051
1052 #endif // #ifndef __WXGRID_H__
1053
1054 #endif // ifndef wxUSE_NEW_GRID