1 /////////////////////////////////////////////////////////////////////////////
2 // Name: wx/generic/private/grid.h
3 // Purpose: Private wxGrid structures
4 // Author: Michael Bedward (based on code by Julian Smart, Robin Dunn)
5 // Modified by: Santiago Palacios
7 // Copyright: (c) Michael Bedward
8 // Licence: wxWindows licence
9 /////////////////////////////////////////////////////////////////////////////
11 #ifndef _WX_GENERIC_GRID_PRIVATE_H_
12 #define _WX_GENERIC_GRID_PRIVATE_H_
18 // Internally used (and hence intentionally not exported) event telling wxGrid
19 // to hide the currently shown editor.
20 wxDECLARE_EVENT( wxEVT_GRID_HIDE_EDITOR
, wxCommandEvent
);
22 // ----------------------------------------------------------------------------
24 // ----------------------------------------------------------------------------
26 WX_DEFINE_ARRAY_WITH_DECL_PTR(wxGridCellAttr
*, wxArrayAttrs
,
27 class WXDLLIMPEXP_ADV
);
29 struct wxGridCellWithAttr
31 wxGridCellWithAttr(int row
, int col
, wxGridCellAttr
*attr_
)
32 : coords(row
, col
), attr(attr_
)
37 wxGridCellWithAttr(const wxGridCellWithAttr
& other
)
38 : coords(other
.coords
),
44 wxGridCellWithAttr
& operator=(const wxGridCellWithAttr
& other
)
46 coords
= other
.coords
;
47 if (attr
!= other
.attr
)
56 void ChangeAttr(wxGridCellAttr
* new_attr
)
60 // "Delete" (i.e. DecRef) the old attribute.
63 // Take ownership of the new attribute, i.e. no IncRef.
72 wxGridCellCoords coords
;
76 WX_DECLARE_OBJARRAY_WITH_DECL(wxGridCellWithAttr
, wxGridCellWithAttrArray
,
77 class WXDLLIMPEXP_ADV
);
80 // ----------------------------------------------------------------------------
82 // ----------------------------------------------------------------------------
84 // header column providing access to the column information stored in wxGrid
85 // via wxHeaderColumn interface
86 class wxGridHeaderColumn
: public wxHeaderColumn
89 wxGridHeaderColumn(wxGrid
*grid
, int col
)
95 virtual wxString
GetTitle() const { return m_grid
->GetColLabelValue(m_col
); }
96 virtual wxBitmap
GetBitmap() const { return wxNullBitmap
; }
97 virtual int GetWidth() const { return m_grid
->GetColSize(m_col
); }
98 virtual int GetMinWidth() const { return 0; }
99 virtual wxAlignment
GetAlignment() const
103 m_grid
->GetColLabelAlignment(&horz
, &vert
);
105 return static_cast<wxAlignment
>(horz
);
108 virtual int GetFlags() const
110 // we can't know in advance whether we can sort by this column or not
111 // with wxGrid API so suppose we can by default
112 int flags
= wxCOL_SORTABLE
;
113 if ( m_grid
->CanDragColSize(m_col
) )
114 flags
|= wxCOL_RESIZABLE
;
115 if ( m_grid
->CanDragColMove() )
116 flags
|= wxCOL_REORDERABLE
;
117 if ( GetWidth() == 0 )
118 flags
|= wxCOL_HIDDEN
;
123 virtual bool IsSortKey() const
125 return m_grid
->IsSortingBy(m_col
);
128 virtual bool IsSortOrderAscending() const
130 return m_grid
->IsSortOrderAscending();
134 // these really should be const but are not because the column needs to be
135 // assignable to be used in a wxVector (in STL build, in non-STL build we
136 // avoid the need for this)
141 // header control retreiving column information from the grid
142 class wxGridHeaderCtrl
: public wxHeaderCtrl
145 wxGridHeaderCtrl(wxGrid
*owner
)
146 : wxHeaderCtrl(owner
,
151 (owner
->CanDragColMove() ? wxHD_ALLOW_REORDER
: 0))
156 virtual const wxHeaderColumn
& GetColumn(unsigned int idx
) const
158 return m_columns
[idx
];
162 wxGrid
*GetOwner() const { return static_cast<wxGrid
*>(GetParent()); }
164 static wxMouseEvent
GetDummyMouseEvent()
166 // make up a dummy event for the grid event to use -- unfortunately we
167 // can't do anything else here
169 e
.SetState(wxGetMouseState());
173 // override the base class method to update our m_columns array
174 virtual void OnColumnCountChanging(unsigned int count
)
176 const unsigned countOld
= m_columns
.size();
177 if ( count
< countOld
)
179 // just discard the columns which don't exist any more (notice that
180 // we can't use resize() here as it would require the vector
181 // value_type, i.e. wxGridHeaderColumn to be default constructible,
183 m_columns
.erase(m_columns
.begin() + count
, m_columns
.end());
185 else // new columns added
187 // add columns for the new elements
188 for ( unsigned n
= countOld
; n
< count
; n
++ )
189 m_columns
.push_back(wxGridHeaderColumn(GetOwner(), n
));
193 // override to implement column auto sizing
194 virtual bool UpdateColumnWidthToFit(unsigned int idx
, int widthTitle
)
196 // TODO: currently grid doesn't support computing the column best width
197 // from its contents so we just use the best label width as is
198 GetOwner()->SetColSize(idx
, widthTitle
);
203 // overridden to react to the actions using the columns popup menu
204 virtual void UpdateColumnVisibility(unsigned int idx
, bool show
)
206 GetOwner()->SetColSize(idx
, show
? wxGRID_AUTOSIZE
: 0);
208 // as this is done by the user we should notify the main program about
210 GetOwner()->SendGridSizeEvent(wxEVT_GRID_COL_SIZE
, -1, idx
,
211 GetDummyMouseEvent());
214 // overridden to react to the columns order changes in the customization
216 virtual void UpdateColumnsOrder(const wxArrayInt
& order
)
218 GetOwner()->SetColumnsOrder(order
);
222 // event handlers forwarding wxHeaderCtrl events to wxGrid
223 void OnClick(wxHeaderCtrlEvent
& event
)
225 GetOwner()->SendEvent(wxEVT_GRID_LABEL_LEFT_CLICK
,
226 -1, event
.GetColumn(),
227 GetDummyMouseEvent());
229 GetOwner()->DoColHeaderClick(event
.GetColumn());
232 void OnDoubleClick(wxHeaderCtrlEvent
& event
)
234 if ( !GetOwner()->SendEvent(wxEVT_GRID_LABEL_LEFT_DCLICK
,
235 -1, event
.GetColumn(),
236 GetDummyMouseEvent()) )
242 void OnRightClick(wxHeaderCtrlEvent
& event
)
244 if ( !GetOwner()->SendEvent(wxEVT_GRID_LABEL_RIGHT_CLICK
,
245 -1, event
.GetColumn(),
246 GetDummyMouseEvent()) )
252 void OnBeginResize(wxHeaderCtrlEvent
& event
)
254 GetOwner()->DoStartResizeCol(event
.GetColumn());
259 void OnResizing(wxHeaderCtrlEvent
& event
)
261 GetOwner()->DoUpdateResizeColWidth(event
.GetWidth());
264 void OnEndResize(wxHeaderCtrlEvent
& event
)
266 // we again need to pass a mouse event to be used for the grid event
267 // generation but we don't have it here so use a dummy one as in
268 // UpdateColumnVisibility()
270 e
.SetState(wxGetMouseState());
271 GetOwner()->DoEndDragResizeCol(e
);
276 void OnBeginReorder(wxHeaderCtrlEvent
& event
)
278 GetOwner()->DoStartMoveCol(event
.GetColumn());
281 void OnEndReorder(wxHeaderCtrlEvent
& event
)
283 GetOwner()->DoEndMoveCol(event
.GetNewOrder());
286 wxVector
<wxGridHeaderColumn
> m_columns
;
288 DECLARE_EVENT_TABLE()
289 wxDECLARE_NO_COPY_CLASS(wxGridHeaderCtrl
);
292 // common base class for various grid subwindows
293 class WXDLLIMPEXP_ADV wxGridSubwindow
: public wxWindow
296 wxGridSubwindow(wxGrid
*owner
,
297 int additionalStyle
= 0,
298 const wxString
& name
= wxPanelNameStr
)
299 : wxWindow(owner
, wxID_ANY
,
300 wxDefaultPosition
, wxDefaultSize
,
301 wxBORDER_NONE
| additionalStyle
,
307 virtual wxWindow
*GetMainWindowOfCompositeControl() { return m_owner
; }
309 virtual bool AcceptsFocus() const { return false; }
311 wxGrid
*GetOwner() { return m_owner
; }
314 void OnMouseCaptureLost(wxMouseCaptureLostEvent
& event
);
318 DECLARE_EVENT_TABLE()
319 wxDECLARE_NO_COPY_CLASS(wxGridSubwindow
);
322 class WXDLLIMPEXP_ADV wxGridRowLabelWindow
: public wxGridSubwindow
325 wxGridRowLabelWindow(wxGrid
*parent
)
326 : wxGridSubwindow(parent
)
332 void OnPaint( wxPaintEvent
& event
);
333 void OnMouseEvent( wxMouseEvent
& event
);
334 void OnMouseWheel( wxMouseEvent
& event
);
336 DECLARE_EVENT_TABLE()
337 wxDECLARE_NO_COPY_CLASS(wxGridRowLabelWindow
);
341 class WXDLLIMPEXP_ADV wxGridColLabelWindow
: public wxGridSubwindow
344 wxGridColLabelWindow(wxGrid
*parent
)
345 : wxGridSubwindow(parent
)
351 void OnPaint( wxPaintEvent
& event
);
352 void OnMouseEvent( wxMouseEvent
& event
);
353 void OnMouseWheel( wxMouseEvent
& event
);
355 DECLARE_EVENT_TABLE()
356 wxDECLARE_NO_COPY_CLASS(wxGridColLabelWindow
);
360 class WXDLLIMPEXP_ADV wxGridCornerLabelWindow
: public wxGridSubwindow
363 wxGridCornerLabelWindow(wxGrid
*parent
)
364 : wxGridSubwindow(parent
)
369 void OnMouseEvent( wxMouseEvent
& event
);
370 void OnMouseWheel( wxMouseEvent
& event
);
371 void OnPaint( wxPaintEvent
& event
);
373 DECLARE_EVENT_TABLE()
374 wxDECLARE_NO_COPY_CLASS(wxGridCornerLabelWindow
);
377 class WXDLLIMPEXP_ADV wxGridWindow
: public wxGridSubwindow
380 wxGridWindow(wxGrid
*parent
)
381 : wxGridSubwindow(parent
,
382 wxWANTS_CHARS
| wxCLIP_CHILDREN
,
388 virtual void ScrollWindow( int dx
, int dy
, const wxRect
*rect
);
390 virtual bool AcceptsFocus() const { return true; }
393 void OnPaint( wxPaintEvent
&event
);
394 void OnMouseWheel( wxMouseEvent
& event
);
395 void OnMouseEvent( wxMouseEvent
& event
);
396 void OnKeyDown( wxKeyEvent
& );
397 void OnKeyUp( wxKeyEvent
& );
398 void OnChar( wxKeyEvent
& );
399 void OnEraseBackground( wxEraseEvent
& );
400 void OnFocus( wxFocusEvent
& );
402 DECLARE_EVENT_TABLE()
403 wxDECLARE_NO_COPY_CLASS(wxGridWindow
);
406 // ----------------------------------------------------------------------------
407 // the internal data representation used by wxGridCellAttrProvider
408 // ----------------------------------------------------------------------------
410 // this class stores attributes set for cells
411 class WXDLLIMPEXP_ADV wxGridCellAttrData
414 void SetAttr(wxGridCellAttr
*attr
, int row
, int col
);
415 wxGridCellAttr
*GetAttr(int row
, int col
) const;
416 void UpdateAttrRows( size_t pos
, int numRows
);
417 void UpdateAttrCols( size_t pos
, int numCols
);
420 // searches for the attr for given cell, returns wxNOT_FOUND if not found
421 int FindIndex(int row
, int col
) const;
423 wxGridCellWithAttrArray m_attrs
;
426 // this class stores attributes set for rows or columns
427 class WXDLLIMPEXP_ADV wxGridRowOrColAttrData
430 // empty ctor to suppress warnings
431 wxGridRowOrColAttrData() {}
432 ~wxGridRowOrColAttrData();
434 void SetAttr(wxGridCellAttr
*attr
, int rowOrCol
);
435 wxGridCellAttr
*GetAttr(int rowOrCol
) const;
436 void UpdateAttrRowsOrCols( size_t pos
, int numRowsOrCols
);
439 wxArrayInt m_rowsOrCols
;
440 wxArrayAttrs m_attrs
;
443 // NB: this is just a wrapper around 3 objects: one which stores cell
444 // attributes, and 2 others for row/col ones
445 class WXDLLIMPEXP_ADV wxGridCellAttrProviderData
448 wxGridCellAttrData m_cellAttrs
;
449 wxGridRowOrColAttrData m_rowAttrs
,
453 // ----------------------------------------------------------------------------
454 // operations classes abstracting the difference between operating on rows and
456 // ----------------------------------------------------------------------------
458 // This class allows to write a function only once because by using its methods
459 // it will apply to both columns and rows.
461 // This is an abstract interface definition, the two concrete implementations
462 // below should be used when working with rows and columns respectively.
463 class wxGridOperations
466 // Returns the operations in the other direction, i.e. wxGridRowOperations
467 // if this object is a wxGridColumnOperations and vice versa.
468 virtual wxGridOperations
& Dual() const = 0;
470 // Return the number of rows or columns.
471 virtual int GetNumberOfLines(const wxGrid
*grid
) const = 0;
473 // Return the selection mode which allows selecting rows or columns.
474 virtual wxGrid::wxGridSelectionModes
GetSelectionMode() const = 0;
476 // Make a wxGridCellCoords from the given components: thisDir is row or
477 // column and otherDir is column or row
478 virtual wxGridCellCoords
MakeCoords(int thisDir
, int otherDir
) const = 0;
480 // Calculate the scrolled position of the given abscissa or ordinate.
481 virtual int CalcScrolledPosition(wxGrid
*grid
, int pos
) const = 0;
483 // Selects the horizontal or vertical component from the given object.
484 virtual int Select(const wxGridCellCoords
& coords
) const = 0;
485 virtual int Select(const wxPoint
& pt
) const = 0;
486 virtual int Select(const wxSize
& sz
) const = 0;
487 virtual int Select(const wxRect
& r
) const = 0;
488 virtual int& Select(wxRect
& r
) const = 0;
490 // Returns width or height of the rectangle
491 virtual int& SelectSize(wxRect
& r
) const = 0;
493 // Make a wxSize such that Select() applied to it returns first component
494 virtual wxSize
MakeSize(int first
, int second
) const = 0;
496 // Sets the row or column component of the given cell coordinates
497 virtual void Set(wxGridCellCoords
& coords
, int line
) const = 0;
500 // Draws a line parallel to the row or column, i.e. horizontal or vertical:
501 // pos is the horizontal or vertical position of the line and start and end
502 // are the coordinates of the line extremities in the other direction
504 DrawParallelLine(wxDC
& dc
, int start
, int end
, int pos
) const = 0;
506 // Draw a horizontal or vertical line across the given rectangle
507 // (this is implemented in terms of above and uses Select() to extract
508 // start and end from the given rectangle)
509 void DrawParallelLineInRect(wxDC
& dc
, const wxRect
& rect
, int pos
) const
511 const int posStart
= Select(rect
.GetPosition());
512 DrawParallelLine(dc
, posStart
, posStart
+ Select(rect
.GetSize()), pos
);
516 // Return the index of the row or column at the given pixel coordinate.
518 PosToLine(const wxGrid
*grid
, int pos
, bool clip
= false) const = 0;
520 // Get the top/left position, in pixels, of the given row or column
521 virtual int GetLineStartPos(const wxGrid
*grid
, int line
) const = 0;
523 // Get the bottom/right position, in pixels, of the given row or column
524 virtual int GetLineEndPos(const wxGrid
*grid
, int line
) const = 0;
526 // Get the height/width of the given row/column
527 virtual int GetLineSize(const wxGrid
*grid
, int line
) const = 0;
529 // Get wxGrid::m_rowBottoms/m_colRights array
530 virtual const wxArrayInt
& GetLineEnds(const wxGrid
*grid
) const = 0;
532 // Get default height row height or column width
533 virtual int GetDefaultLineSize(const wxGrid
*grid
) const = 0;
535 // Return the minimal acceptable row height or column width
536 virtual int GetMinimalAcceptableLineSize(const wxGrid
*grid
) const = 0;
538 // Return the minimal row height or column width
539 virtual int GetMinimalLineSize(const wxGrid
*grid
, int line
) const = 0;
541 // Set the row height or column width
542 virtual void SetLineSize(wxGrid
*grid
, int line
, int size
) const = 0;
544 // Set the row default height or column default width
545 virtual void SetDefaultLineSize(wxGrid
*grid
, int size
, bool resizeExisting
) const = 0;
548 // Return the index of the line at the given position
550 // NB: currently this is always identity for the rows as reordering is only
551 // implemented for the lines
552 virtual int GetLineAt(const wxGrid
*grid
, int pos
) const = 0;
554 // Return the display position of the line with the given index.
556 // NB: As GetLineAt(), currently this is always identity for rows.
557 virtual int GetLinePos(const wxGrid
*grid
, int line
) const = 0;
559 // Return the index of the line just before the given one or wxNOT_FOUND.
560 virtual int GetLineBefore(const wxGrid
* grid
, int line
) const = 0;
562 // Get the row or column label window
563 virtual wxWindow
*GetHeaderWindow(wxGrid
*grid
) const = 0;
565 // Get the width or height of the row or column label window
566 virtual int GetHeaderWindowSize(wxGrid
*grid
) const = 0;
569 // This class is never used polymorphically but give it a virtual dtor
570 // anyhow to suppress g++ complaints about it
571 virtual ~wxGridOperations() { }
574 class wxGridRowOperations
: public wxGridOperations
577 virtual wxGridOperations
& Dual() const;
579 virtual int GetNumberOfLines(const wxGrid
*grid
) const
580 { return grid
->GetNumberRows(); }
582 virtual wxGrid::wxGridSelectionModes
GetSelectionMode() const
583 { return wxGrid::wxGridSelectRows
; }
585 virtual wxGridCellCoords
MakeCoords(int thisDir
, int otherDir
) const
586 { return wxGridCellCoords(thisDir
, otherDir
); }
588 virtual int CalcScrolledPosition(wxGrid
*grid
, int pos
) const
589 { return grid
->CalcScrolledPosition(wxPoint(pos
, 0)).x
; }
591 virtual int Select(const wxGridCellCoords
& c
) const { return c
.GetRow(); }
592 virtual int Select(const wxPoint
& pt
) const { return pt
.x
; }
593 virtual int Select(const wxSize
& sz
) const { return sz
.x
; }
594 virtual int Select(const wxRect
& r
) const { return r
.x
; }
595 virtual int& Select(wxRect
& r
) const { return r
.x
; }
596 virtual int& SelectSize(wxRect
& r
) const { return r
.width
; }
597 virtual wxSize
MakeSize(int first
, int second
) const
598 { return wxSize(first
, second
); }
599 virtual void Set(wxGridCellCoords
& coords
, int line
) const
600 { coords
.SetRow(line
); }
602 virtual void DrawParallelLine(wxDC
& dc
, int start
, int end
, int pos
) const
603 { dc
.DrawLine(start
, pos
, end
, pos
); }
605 virtual int PosToLine(const wxGrid
*grid
, int pos
, bool clip
= false) const
606 { return grid
->YToRow(pos
, clip
); }
607 virtual int GetLineStartPos(const wxGrid
*grid
, int line
) const
608 { return grid
->GetRowTop(line
); }
609 virtual int GetLineEndPos(const wxGrid
*grid
, int line
) const
610 { return grid
->GetRowBottom(line
); }
611 virtual int GetLineSize(const wxGrid
*grid
, int line
) const
612 { return grid
->GetRowHeight(line
); }
613 virtual const wxArrayInt
& GetLineEnds(const wxGrid
*grid
) const
614 { return grid
->m_rowBottoms
; }
615 virtual int GetDefaultLineSize(const wxGrid
*grid
) const
616 { return grid
->GetDefaultRowSize(); }
617 virtual int GetMinimalAcceptableLineSize(const wxGrid
*grid
) const
618 { return grid
->GetRowMinimalAcceptableHeight(); }
619 virtual int GetMinimalLineSize(const wxGrid
*grid
, int line
) const
620 { return grid
->GetRowMinimalHeight(line
); }
621 virtual void SetLineSize(wxGrid
*grid
, int line
, int size
) const
622 { grid
->SetRowSize(line
, size
); }
623 virtual void SetDefaultLineSize(wxGrid
*grid
, int size
, bool resizeExisting
) const
624 { grid
->SetDefaultRowSize(size
, resizeExisting
); }
626 virtual int GetLineAt(const wxGrid
* WXUNUSED(grid
), int pos
) const
627 { return pos
; } // TODO: implement row reordering
628 virtual int GetLinePos(const wxGrid
* WXUNUSED(grid
), int line
) const
629 { return line
; } // TODO: implement row reordering
631 virtual int GetLineBefore(const wxGrid
* WXUNUSED(grid
), int line
) const
634 virtual wxWindow
*GetHeaderWindow(wxGrid
*grid
) const
635 { return grid
->GetGridRowLabelWindow(); }
636 virtual int GetHeaderWindowSize(wxGrid
*grid
) const
637 { return grid
->GetRowLabelSize(); }
640 class wxGridColumnOperations
: public wxGridOperations
643 virtual wxGridOperations
& Dual() const;
645 virtual int GetNumberOfLines(const wxGrid
*grid
) const
646 { return grid
->GetNumberCols(); }
648 virtual wxGrid::wxGridSelectionModes
GetSelectionMode() const
649 { return wxGrid::wxGridSelectColumns
; }
651 virtual wxGridCellCoords
MakeCoords(int thisDir
, int otherDir
) const
652 { return wxGridCellCoords(otherDir
, thisDir
); }
654 virtual int CalcScrolledPosition(wxGrid
*grid
, int pos
) const
655 { return grid
->CalcScrolledPosition(wxPoint(0, pos
)).y
; }
657 virtual int Select(const wxGridCellCoords
& c
) const { return c
.GetCol(); }
658 virtual int Select(const wxPoint
& pt
) const { return pt
.y
; }
659 virtual int Select(const wxSize
& sz
) const { return sz
.y
; }
660 virtual int Select(const wxRect
& r
) const { return r
.y
; }
661 virtual int& Select(wxRect
& r
) const { return r
.y
; }
662 virtual int& SelectSize(wxRect
& r
) const { return r
.height
; }
663 virtual wxSize
MakeSize(int first
, int second
) const
664 { return wxSize(second
, first
); }
665 virtual void Set(wxGridCellCoords
& coords
, int line
) const
666 { coords
.SetCol(line
); }
668 virtual void DrawParallelLine(wxDC
& dc
, int start
, int end
, int pos
) const
669 { dc
.DrawLine(pos
, start
, pos
, end
); }
671 virtual int PosToLine(const wxGrid
*grid
, int pos
, bool clip
= false) const
672 { return grid
->XToCol(pos
, clip
); }
673 virtual int GetLineStartPos(const wxGrid
*grid
, int line
) const
674 { return grid
->GetColLeft(line
); }
675 virtual int GetLineEndPos(const wxGrid
*grid
, int line
) const
676 { return grid
->GetColRight(line
); }
677 virtual int GetLineSize(const wxGrid
*grid
, int line
) const
678 { return grid
->GetColWidth(line
); }
679 virtual const wxArrayInt
& GetLineEnds(const wxGrid
*grid
) const
680 { return grid
->m_colRights
; }
681 virtual int GetDefaultLineSize(const wxGrid
*grid
) const
682 { return grid
->GetDefaultColSize(); }
683 virtual int GetMinimalAcceptableLineSize(const wxGrid
*grid
) const
684 { return grid
->GetColMinimalAcceptableWidth(); }
685 virtual int GetMinimalLineSize(const wxGrid
*grid
, int line
) const
686 { return grid
->GetColMinimalWidth(line
); }
687 virtual void SetLineSize(wxGrid
*grid
, int line
, int size
) const
688 { grid
->SetColSize(line
, size
); }
689 virtual void SetDefaultLineSize(wxGrid
*grid
, int size
, bool resizeExisting
) const
690 { grid
->SetDefaultColSize(size
, resizeExisting
); }
692 virtual int GetLineAt(const wxGrid
*grid
, int pos
) const
693 { return grid
->GetColAt(pos
); }
694 virtual int GetLinePos(const wxGrid
*grid
, int line
) const
695 { return grid
->GetColPos(line
); }
697 virtual int GetLineBefore(const wxGrid
* grid
, int line
) const
699 int posBefore
= grid
->GetColPos(line
) - 1;
700 return posBefore
>= 0 ? grid
->GetColAt(posBefore
) : wxNOT_FOUND
;
703 virtual wxWindow
*GetHeaderWindow(wxGrid
*grid
) const
704 { return grid
->GetGridColLabelWindow(); }
705 virtual int GetHeaderWindowSize(wxGrid
*grid
) const
706 { return grid
->GetColLabelSize(); }
709 // This class abstracts the difference between operations going forward
710 // (down/right) and backward (up/left) and allows to use the same code for
711 // functions which differ only in the direction of grid traversal.
713 // Notice that all operations in this class work with display positions and not
714 // internal indices which can be different if the columns were reordered.
716 // Like wxGridOperations it's an ABC with two concrete subclasses below. Unlike
717 // it, this is a normal object and not just a function dispatch table and has a
720 // Note: the explanation of this discrepancy is the existence of (very useful)
721 // Dual() method in wxGridOperations which forces us to make wxGridOperations a
722 // function dispatcher only.
723 class wxGridDirectionOperations
726 // The oper parameter to ctor selects whether we work with rows or columns
727 wxGridDirectionOperations(wxGrid
*grid
, const wxGridOperations
& oper
)
733 // Check if the component of this point in our direction is at the
734 // boundary, i.e. is the first/last row/column
735 virtual bool IsAtBoundary(const wxGridCellCoords
& coords
) const = 0;
737 // Increment the component of this point in our direction
738 virtual void Advance(wxGridCellCoords
& coords
) const = 0;
740 // Find the line at the given distance, in pixels, away from this one
741 // (this uses clipping, i.e. anything after the last line is counted as the
742 // last one and anything before the first one as 0)
744 // TODO: Implementation of this method currently doesn't support column
745 // reordering as it mixes up indices and positions. But this doesn't
746 // really matter as it's only called for rows (Page Up/Down only work
747 // vertically) and row reordering is not currently supported. We'd
748 // need to fix it if this ever changes however.
749 virtual int MoveByPixelDistance(int line
, int distance
) const = 0;
751 // This class is never used polymorphically but give it a virtual dtor
752 // anyhow to suppress g++ complaints about it
753 virtual ~wxGridDirectionOperations() { }
756 // Get the position of the row or column from the given coordinates pair.
758 // This is just a shortcut to avoid repeating m_oper and m_grid multiple
759 // times in the derived classes code.
760 int GetLinePos(const wxGridCellCoords
& coords
) const
762 return m_oper
.GetLinePos(m_grid
, m_oper
.Select(coords
));
765 // Get the index of the row or column from the position.
766 int GetLineAt(int pos
) const
768 return m_oper
.GetLineAt(m_grid
, pos
);
771 // Check if the given line is visible, i.e. has non 0 size.
772 bool IsLineVisible(int line
) const
774 return m_oper
.GetLineSize(m_grid
, line
) != 0;
778 wxGrid
* const m_grid
;
779 const wxGridOperations
& m_oper
;
782 class wxGridBackwardOperations
: public wxGridDirectionOperations
785 wxGridBackwardOperations(wxGrid
*grid
, const wxGridOperations
& oper
)
786 : wxGridDirectionOperations(grid
, oper
)
790 virtual bool IsAtBoundary(const wxGridCellCoords
& coords
) const
792 wxASSERT_MSG( m_oper
.Select(coords
) >= 0, "invalid row/column" );
794 int pos
= GetLinePos(coords
);
797 // Check the previous line.
798 int line
= GetLineAt(--pos
);
799 if ( IsLineVisible(line
) )
801 // There is another visible line before this one, hence it's
807 // We reached the boundary without finding any visible lines.
811 virtual void Advance(wxGridCellCoords
& coords
) const
813 int pos
= GetLinePos(coords
);
816 // This is not supposed to happen if IsAtBoundary() returned false.
817 wxCHECK_RET( pos
, "can't advance when already at boundary" );
819 int line
= GetLineAt(--pos
);
820 if ( IsLineVisible(line
) )
822 m_oper
.Set(coords
, line
);
828 virtual int MoveByPixelDistance(int line
, int distance
) const
830 int pos
= m_oper
.GetLineStartPos(m_grid
, line
);
831 return m_oper
.PosToLine(m_grid
, pos
- distance
+ 1, true);
835 // Please refer to the comments above when reading this class code, it's
836 // absolutely symmetrical to wxGridBackwardOperations.
837 class wxGridForwardOperations
: public wxGridDirectionOperations
840 wxGridForwardOperations(wxGrid
*grid
, const wxGridOperations
& oper
)
841 : wxGridDirectionOperations(grid
, oper
),
842 m_numLines(oper
.GetNumberOfLines(grid
))
846 virtual bool IsAtBoundary(const wxGridCellCoords
& coords
) const
848 wxASSERT_MSG( m_oper
.Select(coords
) < m_numLines
, "invalid row/column" );
850 int pos
= GetLinePos(coords
);
851 while ( pos
< m_numLines
- 1 )
853 int line
= GetLineAt(++pos
);
854 if ( IsLineVisible(line
) )
861 virtual void Advance(wxGridCellCoords
& coords
) const
863 int pos
= GetLinePos(coords
);
866 wxCHECK_RET( pos
< m_numLines
- 1,
867 "can't advance when already at boundary" );
869 int line
= GetLineAt(++pos
);
870 if ( IsLineVisible(line
) )
872 m_oper
.Set(coords
, line
);
878 virtual int MoveByPixelDistance(int line
, int distance
) const
880 int pos
= m_oper
.GetLineStartPos(m_grid
, line
);
881 return m_oper
.PosToLine(m_grid
, pos
+ distance
, true);
885 const int m_numLines
;
888 // ----------------------------------------------------------------------------
889 // data structures used for the data type registry
890 // ----------------------------------------------------------------------------
892 struct wxGridDataTypeInfo
894 wxGridDataTypeInfo(const wxString
& typeName
,
895 wxGridCellRenderer
* renderer
,
896 wxGridCellEditor
* editor
)
897 : m_typeName(typeName
), m_renderer(renderer
), m_editor(editor
)
900 ~wxGridDataTypeInfo()
902 wxSafeDecRef(m_renderer
);
903 wxSafeDecRef(m_editor
);
907 wxGridCellRenderer
* m_renderer
;
908 wxGridCellEditor
* m_editor
;
910 wxDECLARE_NO_COPY_CLASS(wxGridDataTypeInfo
);
914 WX_DEFINE_ARRAY_WITH_DECL_PTR(wxGridDataTypeInfo
*, wxGridDataTypeInfoArray
,
915 class WXDLLIMPEXP_ADV
);
918 class WXDLLIMPEXP_ADV wxGridTypeRegistry
921 wxGridTypeRegistry() {}
922 ~wxGridTypeRegistry();
924 void RegisterDataType(const wxString
& typeName
,
925 wxGridCellRenderer
* renderer
,
926 wxGridCellEditor
* editor
);
928 // find one of already registered data types
929 int FindRegisteredDataType(const wxString
& typeName
);
931 // try to FindRegisteredDataType(), if this fails and typeName is one of
932 // standard typenames, register it and return its index
933 int FindDataType(const wxString
& typeName
);
935 // try to FindDataType(), if it fails see if it is not one of already
936 // registered data types with some params in which case clone the
937 // registered data type and set params for it
938 int FindOrCloneDataType(const wxString
& typeName
);
940 wxGridCellRenderer
* GetRenderer(int index
);
941 wxGridCellEditor
* GetEditor(int index
);
944 wxGridDataTypeInfoArray m_typeinfo
;
948 #endif // _WX_GENERIC_GRID_PRIVATE_H_