11#ifndef _WX_GENERIC_GRID_PRIVATE_H_
12#define _WX_GENERIC_GRID_PRIVATE_H_
20wxDECLARE_EVENT( wxEVT_GRID_HIDE_EDITOR, wxCommandEvent );
26WX_DEFINE_ARRAY_WITH_DECL_PTR(wxGridCellAttr *, wxArrayAttrs,
27 class WXDLLIMPEXP_ADV);
29struct 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)
72 wxGridCellCoords coords;
76WX_DECLARE_OBJARRAY_WITH_DECL(wxGridCellWithAttr, wxGridCellWithAttrArray,
77 class WXDLLIMPEXP_ADV);
86class 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
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();
142class 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()
169 e.SetState(wxGetMouseState());
174 virtual void OnColumnCountChanging(
unsigned int count)
176 const unsigned countOld = m_columns.size();
177 if ( count < countOld )
183 m_columns.erase(m_columns.begin() + count, m_columns.end());
188 for (
unsigned n = countOld; n < count; n++ )
189 m_columns.push_back(wxGridHeaderColumn(GetOwner(), n));
194 virtual bool UpdateColumnWidthToFit(
unsigned int idx,
int widthTitle)
198 GetOwner()->SetColSize(idx, widthTitle);
204 virtual void UpdateColumnVisibility(
unsigned int idx,
bool show)
206 GetOwner()->SetColSize(idx, show ? wxGRID_AUTOSIZE : 0);
210 GetOwner()->SendGridSizeEvent(wxEVT_GRID_COL_SIZE, -1, idx,
211 GetDummyMouseEvent());
216 virtual void UpdateColumnsOrder(
const wxArrayInt& order)
218 GetOwner()->SetColumnsOrder(order);
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)
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);
293class 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);
322class 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);
341class 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);
360class 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);
377class 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);
411class 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 );
418 void RemoveAttrsFromRow(
int row);
419 void RemoveAttrsFromCol(
int col);
423 int FindIndex(
int row,
int col)
const;
425 wxGridCellWithAttrArray m_attrs;
429class WXDLLIMPEXP_ADV wxGridRowOrColAttrData
433 wxGridRowOrColAttrData() {}
434 ~wxGridRowOrColAttrData();
436 void SetAttr(wxGridCellAttr *attr,
int rowOrCol);
437 wxGridCellAttr *GetAttr(
int rowOrCol)
const;
438 void UpdateAttrRowsOrCols(
size_t pos,
int numRowsOrCols );
441 wxArrayInt m_rowsOrCols;
442 wxArrayAttrs m_attrs;
447class WXDLLIMPEXP_ADV wxGridCellAttrProviderData
450 wxGridCellAttrData m_cellAttrs;
451 wxGridRowOrColAttrData m_rowAttrs,
465class wxGridOperations
470 virtual wxGridOperations& Dual()
const = 0;
473 virtual int GetNumberOfLines(
const wxGrid *grid)
const = 0;
476 virtual wxGrid::wxGridSelectionModes GetSelectionMode()
const = 0;
480 virtual wxGridCellCoords MakeCoords(
int thisDir,
int otherDir)
const = 0;
483 virtual int CalcScrolledPosition(wxGrid *grid,
int pos)
const = 0;
486 virtual int Select(
const wxGridCellCoords& coords)
const = 0;
487 virtual int Select(
const wxPoint& pt)
const = 0;
488 virtual int Select(
const wxSize& sz)
const = 0;
489 virtual int Select(
const wxRect& r)
const = 0;
490 virtual int& Select(wxRect& r)
const = 0;
493 virtual int& SelectSize(wxRect& r)
const = 0;
496 virtual wxSize MakeSize(
int first,
int second)
const = 0;
499 virtual void Set(wxGridCellCoords& coords,
int line)
const = 0;
506 DrawParallelLine(wxDC& dc,
int start,
int end,
int pos)
const = 0;
511 void DrawParallelLineInRect(wxDC& dc,
const wxRect& rect,
int pos)
const
513 const int posStart = Select(rect.GetPosition());
514 DrawParallelLine(dc, posStart, posStart + Select(rect.GetSize()), pos);
520 PosToLine(
const wxGrid *grid,
int pos,
bool clip =
false)
const = 0;
523 virtual int GetLineStartPos(
const wxGrid *grid,
int line)
const = 0;
526 virtual int GetLineEndPos(
const wxGrid *grid,
int line)
const = 0;
529 virtual int GetLineSize(
const wxGrid *grid,
int line)
const = 0;
532 virtual const wxArrayInt& GetLineEnds(
const wxGrid *grid)
const = 0;
535 virtual int GetDefaultLineSize(
const wxGrid *grid)
const = 0;
538 virtual int GetMinimalAcceptableLineSize(
const wxGrid *grid)
const = 0;
541 virtual int GetMinimalLineSize(
const wxGrid *grid,
int line)
const = 0;
544 virtual void SetLineSize(wxGrid *grid,
int line,
int size)
const = 0;
547 virtual void SetDefaultLineSize(wxGrid *grid,
int size,
bool resizeExisting)
const = 0;
554 virtual int GetLineAt(
const wxGrid *grid,
int pos)
const = 0;
559 virtual int GetLinePos(
const wxGrid *grid,
int line)
const = 0;
562 virtual int GetLineBefore(
const wxGrid* grid,
int line)
const = 0;
565 virtual wxWindow *GetHeaderWindow(wxGrid *grid)
const = 0;
568 virtual int GetHeaderWindowSize(wxGrid *grid)
const = 0;
573 virtual ~wxGridOperations() { }
576class wxGridRowOperations :
public wxGridOperations
579 virtual wxGridOperations& Dual()
const;
581 virtual int GetNumberOfLines(
const wxGrid *grid)
const
582 {
return grid->GetNumberRows(); }
584 virtual wxGrid::wxGridSelectionModes GetSelectionMode()
const
585 {
return wxGrid::wxGridSelectRows; }
587 virtual wxGridCellCoords MakeCoords(
int thisDir,
int otherDir)
const
588 {
return wxGridCellCoords(thisDir, otherDir); }
590 virtual int CalcScrolledPosition(wxGrid *grid,
int pos)
const
591 {
return grid->CalcScrolledPosition(wxPoint(pos, 0)).x; }
593 virtual int Select(
const wxGridCellCoords& c)
const {
return c.GetRow(); }
594 virtual int Select(
const wxPoint& pt)
const {
return pt.x; }
595 virtual int Select(
const wxSize& sz)
const {
return sz.x; }
596 virtual int Select(
const wxRect& r)
const {
return r.x; }
597 virtual int& Select(wxRect& r)
const {
return r.x; }
598 virtual int& SelectSize(wxRect& r)
const {
return r.width; }
599 virtual wxSize MakeSize(
int first,
int second)
const
600 {
return wxSize(first, second); }
601 virtual void Set(wxGridCellCoords& coords,
int line)
const
602 { coords.SetRow(line); }
604 virtual void DrawParallelLine(wxDC& dc,
int start,
int end,
int pos)
const
605 { dc.DrawLine(start, pos, end, pos); }
607 virtual int PosToLine(
const wxGrid *grid,
int pos,
bool clip =
false)
const
608 {
return grid->YToRow(pos, clip); }
609 virtual int GetLineStartPos(
const wxGrid *grid,
int line)
const
610 {
return grid->GetRowTop(line); }
611 virtual int GetLineEndPos(
const wxGrid *grid,
int line)
const
612 {
return grid->GetRowBottom(line); }
613 virtual int GetLineSize(
const wxGrid *grid,
int line)
const
614 {
return grid->GetRowHeight(line); }
615 virtual const wxArrayInt& GetLineEnds(
const wxGrid *grid)
const
616 {
return grid->m_rowBottoms; }
617 virtual int GetDefaultLineSize(
const wxGrid *grid)
const
618 {
return grid->GetDefaultRowSize(); }
619 virtual int GetMinimalAcceptableLineSize(
const wxGrid *grid)
const
620 {
return grid->GetRowMinimalAcceptableHeight(); }
621 virtual int GetMinimalLineSize(
const wxGrid *grid,
int line)
const
622 {
return grid->GetRowMinimalHeight(line); }
623 virtual void SetLineSize(wxGrid *grid,
int line,
int size)
const
624 { grid->SetRowSize(line, size); }
625 virtual void SetDefaultLineSize(wxGrid *grid,
int size,
bool resizeExisting)
const
626 { grid->SetDefaultRowSize(size, resizeExisting); }
628 virtual int GetLineAt(
const wxGrid * WXUNUSED(grid),
int pos)
const
630 virtual int GetLinePos(
const wxGrid * WXUNUSED(grid),
int line)
const
633 virtual int GetLineBefore(
const wxGrid* WXUNUSED(grid),
int line)
const
636 virtual wxWindow *GetHeaderWindow(wxGrid *grid)
const
637 {
return grid->GetGridRowLabelWindow(); }
638 virtual int GetHeaderWindowSize(wxGrid *grid)
const
639 {
return grid->GetRowLabelSize(); }
642class wxGridColumnOperations :
public wxGridOperations
645 virtual wxGridOperations& Dual()
const;
647 virtual int GetNumberOfLines(
const wxGrid *grid)
const
648 {
return grid->GetNumberCols(); }
650 virtual wxGrid::wxGridSelectionModes GetSelectionMode()
const
651 {
return wxGrid::wxGridSelectColumns; }
653 virtual wxGridCellCoords MakeCoords(
int thisDir,
int otherDir)
const
654 {
return wxGridCellCoords(otherDir, thisDir); }
656 virtual int CalcScrolledPosition(wxGrid *grid,
int pos)
const
657 {
return grid->CalcScrolledPosition(wxPoint(0, pos)).y; }
659 virtual int Select(
const wxGridCellCoords& c)
const {
return c.GetCol(); }
660 virtual int Select(
const wxPoint& pt)
const {
return pt.y; }
661 virtual int Select(
const wxSize& sz)
const {
return sz.y; }
662 virtual int Select(
const wxRect& r)
const {
return r.y; }
663 virtual int& Select(wxRect& r)
const {
return r.y; }
664 virtual int& SelectSize(wxRect& r)
const {
return r.height; }
665 virtual wxSize MakeSize(
int first,
int second)
const
666 {
return wxSize(second, first); }
667 virtual void Set(wxGridCellCoords& coords,
int line)
const
668 { coords.SetCol(line); }
670 virtual void DrawParallelLine(wxDC& dc,
int start,
int end,
int pos)
const
671 { dc.DrawLine(pos, start, pos, end); }
673 virtual int PosToLine(
const wxGrid *grid,
int pos,
bool clip =
false)
const
674 {
return grid->XToCol(pos, clip); }
675 virtual int GetLineStartPos(
const wxGrid *grid,
int line)
const
676 {
return grid->GetColLeft(line); }
677 virtual int GetLineEndPos(
const wxGrid *grid,
int line)
const
678 {
return grid->GetColRight(line); }
679 virtual int GetLineSize(
const wxGrid *grid,
int line)
const
680 {
return grid->GetColWidth(line); }
681 virtual const wxArrayInt& GetLineEnds(
const wxGrid *grid)
const
682 {
return grid->m_colRights; }
683 virtual int GetDefaultLineSize(
const wxGrid *grid)
const
684 {
return grid->GetDefaultColSize(); }
685 virtual int GetMinimalAcceptableLineSize(
const wxGrid *grid)
const
686 {
return grid->GetColMinimalAcceptableWidth(); }
687 virtual int GetMinimalLineSize(
const wxGrid *grid,
int line)
const
688 {
return grid->GetColMinimalWidth(line); }
689 virtual void SetLineSize(wxGrid *grid,
int line,
int size)
const
690 { grid->SetColSize(line, size); }
691 virtual void SetDefaultLineSize(wxGrid *grid,
int size,
bool resizeExisting)
const
692 { grid->SetDefaultColSize(size, resizeExisting); }
694 virtual int GetLineAt(
const wxGrid *grid,
int pos)
const
695 {
return grid->GetColAt(pos); }
696 virtual int GetLinePos(
const wxGrid *grid,
int line)
const
697 {
return grid->GetColPos(line); }
699 virtual int GetLineBefore(
const wxGrid* grid,
int line)
const
701 int posBefore = grid->GetColPos(line) - 1;
702 return posBefore >= 0 ? grid->GetColAt(posBefore) : wxNOT_FOUND;
705 virtual wxWindow *GetHeaderWindow(wxGrid *grid)
const
706 {
return grid->GetGridColLabelWindow(); }
707 virtual int GetHeaderWindowSize(wxGrid *grid)
const
708 {
return grid->GetColLabelSize(); }
725class wxGridDirectionOperations
729 wxGridDirectionOperations(wxGrid *grid,
const wxGridOperations& oper)
737 virtual bool IsAtBoundary(
const wxGridCellCoords& coords)
const = 0;
740 virtual void Advance(wxGridCellCoords& coords)
const = 0;
751 virtual int MoveByPixelDistance(
int line,
int distance)
const = 0;
755 virtual ~wxGridDirectionOperations() { }
762 int GetLinePos(
const wxGridCellCoords& coords)
const
764 return m_oper.GetLinePos(m_grid, m_oper.Select(coords));
768 int GetLineAt(
int pos)
const
770 return m_oper.GetLineAt(m_grid, pos);
774 bool IsLineVisible(
int line)
const
776 return m_oper.GetLineSize(m_grid, line) != 0;
780 wxGrid *
const m_grid;
781 const wxGridOperations& m_oper;
784class wxGridBackwardOperations :
public wxGridDirectionOperations
787 wxGridBackwardOperations(wxGrid *grid,
const wxGridOperations& oper)
788 : wxGridDirectionOperations(grid, oper)
792 virtual bool IsAtBoundary(
const wxGridCellCoords& coords)
const
794 wxASSERT_MSG( m_oper.Select(coords) >= 0,
"invalid row/column" );
796 int pos = GetLinePos(coords);
800 int line = GetLineAt(--pos);
801 if ( IsLineVisible(line) )
813 virtual void Advance(wxGridCellCoords& coords)
const
815 int pos = GetLinePos(coords);
819 wxCHECK_RET( pos,
"can't advance when already at boundary" );
821 int line = GetLineAt(--pos);
822 if ( IsLineVisible(line) )
824 m_oper.Set(coords, line);
830 virtual int MoveByPixelDistance(
int line,
int distance)
const
832 int pos = m_oper.GetLineStartPos(m_grid, line);
833 return m_oper.PosToLine(m_grid, pos - distance + 1,
true);
839class wxGridForwardOperations :
public wxGridDirectionOperations
842 wxGridForwardOperations(wxGrid *grid,
const wxGridOperations& oper)
843 : wxGridDirectionOperations(grid, oper),
844 m_numLines(oper.GetNumberOfLines(grid))
848 virtual bool IsAtBoundary(
const wxGridCellCoords& coords)
const
850 wxASSERT_MSG( m_oper.Select(coords) < m_numLines,
"invalid row/column" );
852 int pos = GetLinePos(coords);
853 while ( pos < m_numLines - 1 )
855 int line = GetLineAt(++pos);
856 if ( IsLineVisible(line) )
863 virtual void Advance(wxGridCellCoords& coords)
const
865 int pos = GetLinePos(coords);
868 wxCHECK_RET( pos < m_numLines - 1,
869 "can't advance when already at boundary" );
871 int line = GetLineAt(++pos);
872 if ( IsLineVisible(line) )
874 m_oper.Set(coords, line);
880 virtual int MoveByPixelDistance(
int line,
int distance)
const
882 int pos = m_oper.GetLineStartPos(m_grid, line);
883 return m_oper.PosToLine(m_grid, pos + distance,
true);
887 const int m_numLines;
894struct wxGridDataTypeInfo
896 wxGridDataTypeInfo(
const wxString& typeName,
897 wxGridCellRenderer* renderer,
898 wxGridCellEditor* editor)
899 : m_typeName(typeName), m_renderer(renderer), m_editor(editor)
902 ~wxGridDataTypeInfo()
904 wxSafeDecRef(m_renderer);
905 wxSafeDecRef(m_editor);
909 wxGridCellRenderer* m_renderer;
910 wxGridCellEditor* m_editor;
912 wxDECLARE_NO_COPY_CLASS(wxGridDataTypeInfo);
916WX_DEFINE_ARRAY_WITH_DECL_PTR(wxGridDataTypeInfo*, wxGridDataTypeInfoArray,
917 class WXDLLIMPEXP_ADV);
920class WXDLLIMPEXP_ADV wxGridTypeRegistry
923 wxGridTypeRegistry() {}
924 ~wxGridTypeRegistry();
926 void RegisterDataType(
const wxString& typeName,
927 wxGridCellRenderer* renderer,
928 wxGridCellEditor* editor);
931 int FindRegisteredDataType(
const wxString& typeName);
935 int FindDataType(
const wxString& typeName);
940 int FindOrCloneDataType(
const wxString& typeName);
942 wxGridCellRenderer* GetRenderer(
int index);
943 wxGridCellEditor* GetEditor(
int index);
946 wxGridDataTypeInfoArray m_typeinfo;