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
8 // Copyright: (c) Michael Bedward
9 // Licence: wxWindows licence
10 /////////////////////////////////////////////////////////////////////////////
12 #ifndef _WX_GENERIC_GRID_PRIVATE_H_
13 #define _WX_GENERIC_GRID_PRIVATE_H_
19 // ----------------------------------------------------------------------------
21 // ----------------------------------------------------------------------------
23 WX_DEFINE_ARRAY_WITH_DECL_PTR(wxGridCellAttr
*, wxArrayAttrs
,
24 class WXDLLIMPEXP_ADV
);
26 struct wxGridCellWithAttr
28 wxGridCellWithAttr(int row
, int col
, wxGridCellAttr
*attr_
)
29 : coords(row
, col
), attr(attr_
)
34 wxGridCellWithAttr(const wxGridCellWithAttr
& other
)
35 : coords(other
.coords
),
41 wxGridCellWithAttr
& operator=(const wxGridCellWithAttr
& other
)
43 coords
= other
.coords
;
44 if (attr
!= other
.attr
)
53 void ChangeAttr(wxGridCellAttr
* new_attr
)
57 // "Delete" (i.e. DecRef) the old attribute.
60 // Take ownership of the new attribute, i.e. no IncRef.
69 wxGridCellCoords coords
;
73 WX_DECLARE_OBJARRAY_WITH_DECL(wxGridCellWithAttr
, wxGridCellWithAttrArray
,
74 class WXDLLIMPEXP_ADV
);
77 // ----------------------------------------------------------------------------
79 // ----------------------------------------------------------------------------
81 // header column providing access to the column information stored in wxGrid
82 // via wxHeaderColumn interface
83 class wxGridHeaderColumn
: public wxHeaderColumn
86 wxGridHeaderColumn(wxGrid
*grid
, int col
)
92 virtual wxString
GetTitle() const { return m_grid
->GetColLabelValue(m_col
); }
93 virtual wxBitmap
GetBitmap() const { return wxNullBitmap
; }
94 virtual int GetWidth() const { return m_grid
->GetColSize(m_col
); }
95 virtual int GetMinWidth() const { return 0; }
96 virtual wxAlignment
GetAlignment() const
100 m_grid
->GetColLabelAlignment(&horz
, &vert
);
102 return static_cast<wxAlignment
>(horz
);
105 virtual int GetFlags() const
107 // we can't know in advance whether we can sort by this column or not
108 // with wxGrid API so suppose we can by default
109 int flags
= wxCOL_SORTABLE
;
110 if ( m_grid
->CanDragColSize() )
111 flags
|= wxCOL_RESIZABLE
;
112 if ( m_grid
->CanDragColMove() )
113 flags
|= wxCOL_REORDERABLE
;
114 if ( GetWidth() == 0 )
115 flags
|= wxCOL_HIDDEN
;
120 virtual bool IsSortKey() const
122 return m_grid
->IsSortingBy(m_col
);
125 virtual bool IsSortOrderAscending() const
127 return m_grid
->IsSortOrderAscending();
131 // these really should be const but are not because the column needs to be
132 // assignable to be used in a wxVector (in STL build, in non-STL build we
133 // avoid the need for this)
138 // header control retreiving column information from the grid
139 class wxGridHeaderCtrl
: public wxHeaderCtrl
142 wxGridHeaderCtrl(wxGrid
*owner
)
143 : wxHeaderCtrl(owner
,
148 (owner
->CanDragColMove() ? wxHD_ALLOW_REORDER
: 0))
153 virtual const wxHeaderColumn
& GetColumn(unsigned int idx
) const
155 return m_columns
[idx
];
159 wxGrid
*GetOwner() const { return static_cast<wxGrid
*>(GetParent()); }
161 // override the base class method to update our m_columns array
162 virtual void OnColumnCountChanging(unsigned int count
)
164 const unsigned countOld
= m_columns
.size();
165 if ( count
< countOld
)
167 // just discard the columns which don't exist any more (notice that
168 // we can't use resize() here as it would require the vector
169 // value_type, i.e. wxGridHeaderColumn to be default constructible,
171 m_columns
.erase(m_columns
.begin() + count
, m_columns
.end());
173 else // new columns added
175 // add columns for the new elements
176 for ( unsigned n
= countOld
; n
< count
; n
++ )
177 m_columns
.push_back(wxGridHeaderColumn(GetOwner(), n
));
181 // override to implement column auto sizing
182 virtual bool UpdateColumnWidthToFit(unsigned int idx
, int widthTitle
)
184 // TODO: currently grid doesn't support computing the column best width
185 // from its contents so we just use the best label width as is
186 GetOwner()->SetColSize(idx
, widthTitle
);
191 // overridden to react to the actions using the columns popup menu
192 virtual void UpdateColumnVisibility(unsigned int idx
, bool show
)
194 GetOwner()->SetColSize(idx
, show
? wxGRID_AUTOSIZE
: 0);
196 // as this is done by the user we should notify the main program about
198 GetOwner()->SendEvent(wxEVT_GRID_COL_SIZE
, -1, idx
);
201 // overridden to react to the columns order changes in the customization
203 virtual void UpdateColumnsOrder(const wxArrayInt
& order
)
205 GetOwner()->SetColumnsOrder(order
);
209 // event handlers forwarding wxHeaderCtrl events to wxGrid
210 void OnClick(wxHeaderCtrlEvent
& event
)
212 GetOwner()->DoColHeaderClick(event
.GetColumn());
215 void OnBeginResize(wxHeaderCtrlEvent
& event
)
217 GetOwner()->DoStartResizeCol(event
.GetColumn());
222 void OnResizing(wxHeaderCtrlEvent
& event
)
224 GetOwner()->DoUpdateResizeColWidth(event
.GetWidth());
227 void OnEndResize(wxHeaderCtrlEvent
& event
)
229 GetOwner()->DoEndDragResizeCol();
234 void OnBeginReorder(wxHeaderCtrlEvent
& event
)
236 GetOwner()->DoStartMoveCol(event
.GetColumn());
239 void OnEndReorder(wxHeaderCtrlEvent
& event
)
241 GetOwner()->DoEndMoveCol(event
.GetNewOrder());
244 wxVector
<wxGridHeaderColumn
> m_columns
;
246 DECLARE_EVENT_TABLE()
247 wxDECLARE_NO_COPY_CLASS(wxGridHeaderCtrl
);
250 // common base class for various grid subwindows
251 class WXDLLIMPEXP_ADV wxGridSubwindow
: public wxWindow
254 wxGridSubwindow(wxGrid
*owner
,
255 int additionalStyle
= 0,
256 const wxString
& name
= wxPanelNameStr
)
257 : wxWindow(owner
, wxID_ANY
,
258 wxDefaultPosition
, wxDefaultSize
,
259 wxBORDER_NONE
| additionalStyle
,
265 virtual bool AcceptsFocus() const { return false; }
267 wxGrid
*GetOwner() { return m_owner
; }
270 void OnMouseCaptureLost(wxMouseCaptureLostEvent
& event
);
274 DECLARE_EVENT_TABLE()
275 wxDECLARE_NO_COPY_CLASS(wxGridSubwindow
);
278 class WXDLLIMPEXP_ADV wxGridRowLabelWindow
: public wxGridSubwindow
281 wxGridRowLabelWindow(wxGrid
*parent
)
282 : wxGridSubwindow(parent
)
288 void OnPaint( wxPaintEvent
& event
);
289 void OnMouseEvent( wxMouseEvent
& event
);
290 void OnMouseWheel( wxMouseEvent
& event
);
292 DECLARE_EVENT_TABLE()
293 wxDECLARE_NO_COPY_CLASS(wxGridRowLabelWindow
);
297 class WXDLLIMPEXP_ADV wxGridColLabelWindow
: public wxGridSubwindow
300 wxGridColLabelWindow(wxGrid
*parent
)
301 : wxGridSubwindow(parent
)
307 void OnPaint( wxPaintEvent
& event
);
308 void OnMouseEvent( wxMouseEvent
& event
);
309 void OnMouseWheel( wxMouseEvent
& event
);
311 DECLARE_EVENT_TABLE()
312 wxDECLARE_NO_COPY_CLASS(wxGridColLabelWindow
);
316 class WXDLLIMPEXP_ADV wxGridCornerLabelWindow
: public wxGridSubwindow
319 wxGridCornerLabelWindow(wxGrid
*parent
)
320 : wxGridSubwindow(parent
)
325 void OnMouseEvent( wxMouseEvent
& event
);
326 void OnMouseWheel( wxMouseEvent
& event
);
327 void OnPaint( wxPaintEvent
& event
);
329 DECLARE_EVENT_TABLE()
330 wxDECLARE_NO_COPY_CLASS(wxGridCornerLabelWindow
);
333 class WXDLLIMPEXP_ADV wxGridWindow
: public wxGridSubwindow
336 wxGridWindow(wxGrid
*parent
)
337 : wxGridSubwindow(parent
,
338 wxWANTS_CHARS
| wxCLIP_CHILDREN
,
344 virtual void ScrollWindow( int dx
, int dy
, const wxRect
*rect
);
346 virtual bool AcceptsFocus() const { return true; }
349 void OnPaint( wxPaintEvent
&event
);
350 void OnMouseWheel( wxMouseEvent
& event
);
351 void OnMouseEvent( wxMouseEvent
& event
);
352 void OnKeyDown( wxKeyEvent
& );
353 void OnKeyUp( wxKeyEvent
& );
354 void OnChar( wxKeyEvent
& );
355 void OnEraseBackground( wxEraseEvent
& );
356 void OnFocus( wxFocusEvent
& );
358 DECLARE_EVENT_TABLE()
359 wxDECLARE_NO_COPY_CLASS(wxGridWindow
);
362 // ----------------------------------------------------------------------------
363 // the internal data representation used by wxGridCellAttrProvider
364 // ----------------------------------------------------------------------------
366 // this class stores attributes set for cells
367 class WXDLLIMPEXP_ADV wxGridCellAttrData
370 void SetAttr(wxGridCellAttr
*attr
, int row
, int col
);
371 wxGridCellAttr
*GetAttr(int row
, int col
) const;
372 void UpdateAttrRows( size_t pos
, int numRows
);
373 void UpdateAttrCols( size_t pos
, int numCols
);
376 // searches for the attr for given cell, returns wxNOT_FOUND if not found
377 int FindIndex(int row
, int col
) const;
379 wxGridCellWithAttrArray m_attrs
;
382 // this class stores attributes set for rows or columns
383 class WXDLLIMPEXP_ADV wxGridRowOrColAttrData
386 // empty ctor to suppress warnings
387 wxGridRowOrColAttrData() {}
388 ~wxGridRowOrColAttrData();
390 void SetAttr(wxGridCellAttr
*attr
, int rowOrCol
);
391 wxGridCellAttr
*GetAttr(int rowOrCol
) const;
392 void UpdateAttrRowsOrCols( size_t pos
, int numRowsOrCols
);
395 wxArrayInt m_rowsOrCols
;
396 wxArrayAttrs m_attrs
;
399 // NB: this is just a wrapper around 3 objects: one which stores cell
400 // attributes, and 2 others for row/col ones
401 class WXDLLIMPEXP_ADV wxGridCellAttrProviderData
404 wxGridCellAttrData m_cellAttrs
;
405 wxGridRowOrColAttrData m_rowAttrs
,
409 // ----------------------------------------------------------------------------
410 // operations classes abstracting the difference between operating on rows and
412 // ----------------------------------------------------------------------------
414 // This class allows to write a function only once because by using its methods
415 // it will apply to both columns and rows.
417 // This is an abstract interface definition, the two concrete implementations
418 // below should be used when working with rows and columns respectively.
419 class wxGridOperations
422 // Returns the operations in the other direction, i.e. wxGridRowOperations
423 // if this object is a wxGridColumnOperations and vice versa.
424 virtual wxGridOperations
& Dual() const = 0;
426 // Return the number of rows or columns.
427 virtual int GetNumberOfLines(const wxGrid
*grid
) const = 0;
429 // Return the selection mode which allows selecting rows or columns.
430 virtual wxGrid::wxGridSelectionModes
GetSelectionMode() const = 0;
432 // Make a wxGridCellCoords from the given components: thisDir is row or
433 // column and otherDir is column or row
434 virtual wxGridCellCoords
MakeCoords(int thisDir
, int otherDir
) const = 0;
436 // Calculate the scrolled position of the given abscissa or ordinate.
437 virtual int CalcScrolledPosition(wxGrid
*grid
, int pos
) const = 0;
439 // Selects the horizontal or vertical component from the given object.
440 virtual int Select(const wxGridCellCoords
& coords
) const = 0;
441 virtual int Select(const wxPoint
& pt
) const = 0;
442 virtual int Select(const wxSize
& sz
) const = 0;
443 virtual int Select(const wxRect
& r
) const = 0;
444 virtual int& Select(wxRect
& r
) const = 0;
446 // Returns width or height of the rectangle
447 virtual int& SelectSize(wxRect
& r
) const = 0;
449 // Make a wxSize such that Select() applied to it returns first component
450 virtual wxSize
MakeSize(int first
, int second
) const = 0;
452 // Sets the row or column component of the given cell coordinates
453 virtual void Set(wxGridCellCoords
& coords
, int line
) const = 0;
456 // Draws a line parallel to the row or column, i.e. horizontal or vertical:
457 // pos is the horizontal or vertical position of the line and start and end
458 // are the coordinates of the line extremities in the other direction
460 DrawParallelLine(wxDC
& dc
, int start
, int end
, int pos
) const = 0;
462 // Draw a horizontal or vertical line across the given rectangle
463 // (this is implemented in terms of above and uses Select() to extract
464 // start and end from the given rectangle)
465 void DrawParallelLineInRect(wxDC
& dc
, const wxRect
& rect
, int pos
) const
467 const int posStart
= Select(rect
.GetPosition());
468 DrawParallelLine(dc
, posStart
, posStart
+ Select(rect
.GetSize()), pos
);
472 // Return the index of the row or column at the given pixel coordinate.
474 PosToLine(const wxGrid
*grid
, int pos
, bool clip
= false) const = 0;
476 // Get the top/left position, in pixels, of the given row or column
477 virtual int GetLineStartPos(const wxGrid
*grid
, int line
) const = 0;
479 // Get the bottom/right position, in pixels, of the given row or column
480 virtual int GetLineEndPos(const wxGrid
*grid
, int line
) const = 0;
482 // Get the height/width of the given row/column
483 virtual int GetLineSize(const wxGrid
*grid
, int line
) const = 0;
485 // Get wxGrid::m_rowBottoms/m_colRights array
486 virtual const wxArrayInt
& GetLineEnds(const wxGrid
*grid
) const = 0;
488 // Get default height row height or column width
489 virtual int GetDefaultLineSize(const wxGrid
*grid
) const = 0;
491 // Return the minimal acceptable row height or column width
492 virtual int GetMinimalAcceptableLineSize(const wxGrid
*grid
) const = 0;
494 // Return the minimal row height or column width
495 virtual int GetMinimalLineSize(const wxGrid
*grid
, int line
) const = 0;
497 // Set the row height or column width
498 virtual void SetLineSize(wxGrid
*grid
, int line
, int size
) const = 0;
500 // Set the row default height or column default width
501 virtual void SetDefaultLineSize(wxGrid
*grid
, int size
, bool resizeExisting
) const = 0;
503 // True if rows/columns can be resized by user
504 virtual bool CanResizeLines(const wxGrid
*grid
) const = 0;
507 // Return the index of the line at the given position
509 // NB: currently this is always identity for the rows as reordering is only
510 // implemented for the lines
511 virtual int GetLineAt(const wxGrid
*grid
, int line
) const = 0;
514 // Get the row or column label window
515 virtual wxWindow
*GetHeaderWindow(wxGrid
*grid
) const = 0;
517 // Get the width or height of the row or column label window
518 virtual int GetHeaderWindowSize(wxGrid
*grid
) const = 0;
521 // This class is never used polymorphically but give it a virtual dtor
522 // anyhow to suppress g++ complaints about it
523 virtual ~wxGridOperations() { }
526 class wxGridRowOperations
: public wxGridOperations
529 virtual wxGridOperations
& Dual() const;
531 virtual int GetNumberOfLines(const wxGrid
*grid
) const
532 { return grid
->GetNumberRows(); }
534 virtual wxGrid::wxGridSelectionModes
GetSelectionMode() const
535 { return wxGrid::wxGridSelectRows
; }
537 virtual wxGridCellCoords
MakeCoords(int thisDir
, int otherDir
) const
538 { return wxGridCellCoords(thisDir
, otherDir
); }
540 virtual int CalcScrolledPosition(wxGrid
*grid
, int pos
) const
541 { return grid
->CalcScrolledPosition(wxPoint(pos
, 0)).x
; }
543 virtual int Select(const wxGridCellCoords
& c
) const { return c
.GetRow(); }
544 virtual int Select(const wxPoint
& pt
) const { return pt
.x
; }
545 virtual int Select(const wxSize
& sz
) const { return sz
.x
; }
546 virtual int Select(const wxRect
& r
) const { return r
.x
; }
547 virtual int& Select(wxRect
& r
) const { return r
.x
; }
548 virtual int& SelectSize(wxRect
& r
) const { return r
.width
; }
549 virtual wxSize
MakeSize(int first
, int second
) const
550 { return wxSize(first
, second
); }
551 virtual void Set(wxGridCellCoords
& coords
, int line
) const
552 { coords
.SetRow(line
); }
554 virtual void DrawParallelLine(wxDC
& dc
, int start
, int end
, int pos
) const
555 { dc
.DrawLine(start
, pos
, end
, pos
); }
557 virtual int PosToLine(const wxGrid
*grid
, int pos
, bool clip
= false) const
558 { return grid
->YToRow(pos
, clip
); }
559 virtual int GetLineStartPos(const wxGrid
*grid
, int line
) const
560 { return grid
->GetRowTop(line
); }
561 virtual int GetLineEndPos(const wxGrid
*grid
, int line
) const
562 { return grid
->GetRowBottom(line
); }
563 virtual int GetLineSize(const wxGrid
*grid
, int line
) const
564 { return grid
->GetRowHeight(line
); }
565 virtual const wxArrayInt
& GetLineEnds(const wxGrid
*grid
) const
566 { return grid
->m_rowBottoms
; }
567 virtual int GetDefaultLineSize(const wxGrid
*grid
) const
568 { return grid
->GetDefaultRowSize(); }
569 virtual int GetMinimalAcceptableLineSize(const wxGrid
*grid
) const
570 { return grid
->GetRowMinimalAcceptableHeight(); }
571 virtual int GetMinimalLineSize(const wxGrid
*grid
, int line
) const
572 { return grid
->GetRowMinimalHeight(line
); }
573 virtual void SetLineSize(wxGrid
*grid
, int line
, int size
) const
574 { grid
->SetRowSize(line
, size
); }
575 virtual bool CanResizeLines(const wxGrid
*grid
) const
576 { return grid
->CanDragRowSize(); }
577 virtual void SetDefaultLineSize(wxGrid
*grid
, int size
, bool resizeExisting
) const
578 { grid
->SetDefaultRowSize(size
, resizeExisting
); }
580 virtual int GetLineAt(const wxGrid
* WXUNUSED(grid
), int line
) const
581 { return line
; } // TODO: implement row reordering
583 virtual wxWindow
*GetHeaderWindow(wxGrid
*grid
) const
584 { return grid
->GetGridRowLabelWindow(); }
585 virtual int GetHeaderWindowSize(wxGrid
*grid
) const
586 { return grid
->GetRowLabelSize(); }
589 class wxGridColumnOperations
: public wxGridOperations
592 virtual wxGridOperations
& Dual() const;
594 virtual int GetNumberOfLines(const wxGrid
*grid
) const
595 { return grid
->GetNumberCols(); }
597 virtual wxGrid::wxGridSelectionModes
GetSelectionMode() const
598 { return wxGrid::wxGridSelectColumns
; }
600 virtual wxGridCellCoords
MakeCoords(int thisDir
, int otherDir
) const
601 { return wxGridCellCoords(otherDir
, thisDir
); }
603 virtual int CalcScrolledPosition(wxGrid
*grid
, int pos
) const
604 { return grid
->CalcScrolledPosition(wxPoint(0, pos
)).y
; }
606 virtual int Select(const wxGridCellCoords
& c
) const { return c
.GetCol(); }
607 virtual int Select(const wxPoint
& pt
) const { return pt
.y
; }
608 virtual int Select(const wxSize
& sz
) const { return sz
.y
; }
609 virtual int Select(const wxRect
& r
) const { return r
.y
; }
610 virtual int& Select(wxRect
& r
) const { return r
.y
; }
611 virtual int& SelectSize(wxRect
& r
) const { return r
.height
; }
612 virtual wxSize
MakeSize(int first
, int second
) const
613 { return wxSize(second
, first
); }
614 virtual void Set(wxGridCellCoords
& coords
, int line
) const
615 { coords
.SetCol(line
); }
617 virtual void DrawParallelLine(wxDC
& dc
, int start
, int end
, int pos
) const
618 { dc
.DrawLine(pos
, start
, pos
, end
); }
620 virtual int PosToLine(const wxGrid
*grid
, int pos
, bool clip
= false) const
621 { return grid
->XToCol(pos
, clip
); }
622 virtual int GetLineStartPos(const wxGrid
*grid
, int line
) const
623 { return grid
->GetColLeft(line
); }
624 virtual int GetLineEndPos(const wxGrid
*grid
, int line
) const
625 { return grid
->GetColRight(line
); }
626 virtual int GetLineSize(const wxGrid
*grid
, int line
) const
627 { return grid
->GetColWidth(line
); }
628 virtual const wxArrayInt
& GetLineEnds(const wxGrid
*grid
) const
629 { return grid
->m_colRights
; }
630 virtual int GetDefaultLineSize(const wxGrid
*grid
) const
631 { return grid
->GetDefaultColSize(); }
632 virtual int GetMinimalAcceptableLineSize(const wxGrid
*grid
) const
633 { return grid
->GetColMinimalAcceptableWidth(); }
634 virtual int GetMinimalLineSize(const wxGrid
*grid
, int line
) const
635 { return grid
->GetColMinimalWidth(line
); }
636 virtual void SetLineSize(wxGrid
*grid
, int line
, int size
) const
637 { grid
->SetColSize(line
, size
); }
638 virtual bool CanResizeLines(const wxGrid
*grid
) const
639 { return grid
->CanDragColSize(); }
640 virtual void SetDefaultLineSize(wxGrid
*grid
, int size
, bool resizeExisting
) const
641 { grid
->SetDefaultColSize(size
, resizeExisting
); }
643 virtual int GetLineAt(const wxGrid
*grid
, int line
) const
644 { return grid
->GetColAt(line
); }
646 virtual wxWindow
*GetHeaderWindow(wxGrid
*grid
) const
647 { return grid
->GetGridColLabelWindow(); }
648 virtual int GetHeaderWindowSize(wxGrid
*grid
) const
649 { return grid
->GetColLabelSize(); }
652 // This class abstracts the difference between operations going forward
653 // (down/right) and backward (up/left) and allows to use the same code for
654 // functions which differ only in the direction of grid traversal
656 // Like wxGridOperations it's an ABC with two concrete subclasses below. Unlike
657 // it, this is a normal object and not just a function dispatch table and has a
660 // Note: the explanation of this discrepancy is the existence of (very useful)
661 // Dual() method in wxGridOperations which forces us to make wxGridOperations a
662 // function dispatcher only.
663 class wxGridDirectionOperations
666 // The oper parameter to ctor selects whether we work with rows or columns
667 wxGridDirectionOperations(wxGrid
*grid
, const wxGridOperations
& oper
)
673 // Check if the component of this point in our direction is at the
674 // boundary, i.e. is the first/last row/column
675 virtual bool IsAtBoundary(const wxGridCellCoords
& coords
) const = 0;
677 // Increment the component of this point in our direction
678 virtual void Advance(wxGridCellCoords
& coords
) const = 0;
680 // Find the line at the given distance, in pixels, away from this one
681 // (this uses clipping, i.e. anything after the last line is counted as the
682 // last one and anything before the first one as 0)
683 virtual int MoveByPixelDistance(int line
, int distance
) const = 0;
685 // This class is never used polymorphically but give it a virtual dtor
686 // anyhow to suppress g++ complaints about it
687 virtual ~wxGridDirectionOperations() { }
690 wxGrid
* const m_grid
;
691 const wxGridOperations
& m_oper
;
694 class wxGridBackwardOperations
: public wxGridDirectionOperations
697 wxGridBackwardOperations(wxGrid
*grid
, const wxGridOperations
& oper
)
698 : wxGridDirectionOperations(grid
, oper
)
702 virtual bool IsAtBoundary(const wxGridCellCoords
& coords
) const
704 wxASSERT_MSG( m_oper
.Select(coords
) >= 0, "invalid row/column" );
706 return m_oper
.Select(coords
) == 0;
709 virtual void Advance(wxGridCellCoords
& coords
) const
711 wxASSERT( !IsAtBoundary(coords
) );
713 m_oper
.Set(coords
, m_oper
.Select(coords
) - 1);
716 virtual int MoveByPixelDistance(int line
, int distance
) const
718 int pos
= m_oper
.GetLineStartPos(m_grid
, line
);
719 return m_oper
.PosToLine(m_grid
, pos
- distance
+ 1, true);
723 class wxGridForwardOperations
: public wxGridDirectionOperations
726 wxGridForwardOperations(wxGrid
*grid
, const wxGridOperations
& oper
)
727 : wxGridDirectionOperations(grid
, oper
),
728 m_numLines(oper
.GetNumberOfLines(grid
))
732 virtual bool IsAtBoundary(const wxGridCellCoords
& coords
) const
734 wxASSERT_MSG( m_oper
.Select(coords
) < m_numLines
, "invalid row/column" );
736 return m_oper
.Select(coords
) == m_numLines
- 1;
739 virtual void Advance(wxGridCellCoords
& coords
) const
741 wxASSERT( !IsAtBoundary(coords
) );
743 m_oper
.Set(coords
, m_oper
.Select(coords
) + 1);
746 virtual int MoveByPixelDistance(int line
, int distance
) const
748 int pos
= m_oper
.GetLineStartPos(m_grid
, line
);
749 return m_oper
.PosToLine(m_grid
, pos
+ distance
, true);
753 const int m_numLines
;
756 // ----------------------------------------------------------------------------
758 // ----------------------------------------------------------------------------
763 // ensure that first is less or equal to second, swapping the values if
765 void EnsureFirstLessThanSecond(int& first
, int& second
)
767 if ( first
> second
)
768 wxSwap(first
, second
);
771 } // anonymous namespace
773 // ----------------------------------------------------------------------------
774 // data structures used for the data type registry
775 // ----------------------------------------------------------------------------
777 struct wxGridDataTypeInfo
779 wxGridDataTypeInfo(const wxString
& typeName
,
780 wxGridCellRenderer
* renderer
,
781 wxGridCellEditor
* editor
)
782 : m_typeName(typeName
), m_renderer(renderer
), m_editor(editor
)
785 ~wxGridDataTypeInfo()
787 wxSafeDecRef(m_renderer
);
788 wxSafeDecRef(m_editor
);
792 wxGridCellRenderer
* m_renderer
;
793 wxGridCellEditor
* m_editor
;
795 wxDECLARE_NO_COPY_CLASS(wxGridDataTypeInfo
);
799 WX_DEFINE_ARRAY_WITH_DECL_PTR(wxGridDataTypeInfo
*, wxGridDataTypeInfoArray
,
800 class WXDLLIMPEXP_ADV
);
803 class WXDLLIMPEXP_ADV wxGridTypeRegistry
806 wxGridTypeRegistry() {}
807 ~wxGridTypeRegistry();
809 void RegisterDataType(const wxString
& typeName
,
810 wxGridCellRenderer
* renderer
,
811 wxGridCellEditor
* editor
);
813 // find one of already registered data types
814 int FindRegisteredDataType(const wxString
& typeName
);
816 // try to FindRegisteredDataType(), if this fails and typeName is one of
817 // standard typenames, register it and return its index
818 int FindDataType(const wxString
& typeName
);
820 // try to FindDataType(), if it fails see if it is not one of already
821 // registered data types with some params in which case clone the
822 // registered data type and set params for it
823 int FindOrCloneDataType(const wxString
& typeName
);
825 wxGridCellRenderer
* GetRenderer(int index
);
826 wxGridCellEditor
* GetEditor(int index
);
829 wxGridDataTypeInfoArray m_typeinfo
;
833 #endif // _WX_GENERIC_GRID_PRIVATE_H_