X-Git-Url: https://git.saurik.com/wxWidgets.git/blobdiff_plain/c0c133e13b36a923c65f94499554e432bc3a0daa..cbeda384e51acb82e13994cb67ac1714669cae10:/include/wx/generic/grid.h diff --git a/include/wx/generic/grid.h b/include/wx/generic/grid.h index cc23938ef4..9490b030c8 100644 --- a/include/wx/generic/grid.h +++ b/include/wx/generic/grid.h @@ -16,6 +16,8 @@ #if wxUSE_GRID +#include "wx/hashmap.h" + #include "wx/scrolwin.h" // ---------------------------------------------------------------------------- @@ -85,6 +87,8 @@ class WXDLLIMPEXP_FWD_CORE wxTextCtrl; class WXDLLIMPEXP_FWD_CORE wxSpinCtrl; #endif +class wxGridFixedIndicesSet; + class wxGridOperations; class wxGridRowOperations; class wxGridColumnOperations; @@ -218,8 +222,10 @@ public: // new value in its string form in the newval output parameter. // // This should also store the new value in its real type internally so that - // it could be used by ApplyEdit(). - virtual bool EndEdit(const wxString& oldval, wxString *newval) = 0; + // it could be used by ApplyEdit() but it must not modify the grid as the + // change could still be vetoed. + virtual bool EndEdit(int row, int col, const wxGrid *grid, + const wxString& oldval, wxString *newval) = 0; // Complete the editing of the current cell by storing the value saved by // the previous call to EndEdit() in the grid @@ -761,6 +767,39 @@ private: // Grid view classes // ============================================================================ +// ---------------------------------------------------------------------------- +// wxGridSizesInfo stores information about sizes of the rows or columns. +// +// It assumes that most of the columns or rows have default size and so stores +// the default size separately and uses a hash to map column or row numbers to +// their non default size for those which don't have the default size. +// ---------------------------------------------------------------------------- + +// hash map to store positions as the keys and sizes as the values +WX_DECLARE_HASH_MAP_WITH_DECL( unsigned, int, wxIntegerHash, wxIntegerEqual, + wxUnsignedToIntHashMap, class WXDLLIMPEXP_ADV ); + +struct WXDLLIMPEXP_ADV wxGridSizesInfo +{ + // default ctor, initialize m_sizeDefault and m_customSizes later + wxGridSizesInfo() { } + + // ctor used by wxGrid::Get{Col,Row}Sizes() + wxGridSizesInfo(int defSize, const wxArrayInt& allSizes); + + // default copy ctor, assignment operator and dtor are ok + + // Get the size of the element with the given index + int GetSize(unsigned pos) const; + + + // default size + int m_sizeDefault; + + // position -> size map containing all elements with non-default size + wxUnsignedToIntHashMap m_customSizes; +}; + // ---------------------------------------------------------------------------- // wxGrid // ---------------------------------------------------------------------------- @@ -1066,19 +1105,42 @@ public: void SetCellHighlightPenWidth(int width); void SetCellHighlightROPenWidth(int width); + + // interactive grid mouse operations control + // ----------------------------------------- + + // functions globally enabling row/column interactive resizing (enabled by + // default) void EnableDragRowSize( bool enable = true ); void DisableDragRowSize() { EnableDragRowSize( false ); } - bool CanDragRowSize() const { return m_canDragRowSize; } + void EnableDragColSize( bool enable = true ); void DisableDragColSize() { EnableDragColSize( false ); } - bool CanDragColSize() const { return m_canDragColSize; } + + // if interactive resizing is enabled, some rows/columns can still have + // fixed size + void DisableRowResize(int row) { DoDisableLineResize(row, m_setFixedRows); } + void DisableColResize(int col) { DoDisableLineResize(col, m_setFixedCols); } + + // these functions return whether the given row/column can be + // effectively resized: for this interactive resizing must be enabled + // and this index must not have been passed to DisableRow/ColResize() + bool CanDragRowSize(int row) const + { return m_canDragRowSize && DoCanResizeLine(row, m_setFixedRows); } + bool CanDragColSize(int col) const + { return m_canDragColSize && DoCanResizeLine(col, m_setFixedCols); } + + // interactive column reordering (disabled by default) void EnableDragColMove( bool enable = true ); void DisableDragColMove() { EnableDragColMove( false ); } bool CanDragColMove() const { return m_canDragColMove; } + + // interactive resizing of grid cells (enabled by default) void EnableDragGridSize(bool enable = true); void DisableDragGridSize() { EnableDragGridSize(false); } bool CanDragGridSize() const { return m_canDragGridSize; } + // interactive dragging of cells (disabled by default) void EnableDragCell( bool enable = true ); void DisableDragCell() { EnableDragCell( false ); } bool CanDragCell() const { return m_canDragCell; } @@ -1170,6 +1232,17 @@ public: void HideCol(int col) { SetColSize(col, 0); } void ShowCol(int col) { SetColSize(col, -1); } + // the row and column sizes can be also set all at once using + // wxGridSizesInfo which holds all of them at once + + wxGridSizesInfo GetColSizes() const + { return wxGridSizesInfo(GetDefaultColSize(), m_colWidths); } + wxGridSizesInfo GetRowSizes() const + { return wxGridSizesInfo(GetDefaultRowSize(), m_rowHeights); } + + void SetColSizes(const wxGridSizesInfo& sizeInfo); + void SetRowSizes(const wxGridSizesInfo& sizeInfo); + // ------- columns (only, for now) reordering @@ -1613,6 +1686,9 @@ public: wxGRID_CHECKBOX, wxGRID_CHOICE, wxGRID_COMBOBOX }; + + wxDEPRECATED_INLINE(bool CanDragRowSize() const, return m_canDragRowSize; ) + wxDEPRECATED_INLINE(bool CanDragColSize() const, return m_canDragColSize; ) #endif // WXWIN_COMPATIBILITY_2_8 @@ -1880,10 +1956,10 @@ protected: // it was processed (but not vetoed) and 0 if it wasn't processed int SendEvent(const wxEventType evtType, int row, int col, - wxMouseEvent& e); + const wxMouseEvent& e); int SendEvent(const wxEventType evtType, const wxGridCellCoords& coords, - wxMouseEvent& e) + const wxMouseEvent& e) { return SendEvent(evtType, coords.GetRow(), coords.GetCol(), e); } int SendEvent(const wxEventType evtType, int row, int col, @@ -1895,6 +1971,11 @@ protected: int SendEvent(const wxEventType evtType, const wxString& s = wxString()) { return SendEvent(evtType, m_currentCellCoords, s); } + // send wxEVT_GRID_{ROW,COL}_SIZE + void SendSizeEvent(wxEventType type, + int row, int col, + const wxMouseEvent& mouseEv); + void OnPaint( wxPaintEvent& ); void OnSize( wxSizeEvent& ); void OnKeyDown( wxKeyEvent& ); @@ -2008,14 +2089,14 @@ private: void DoUpdateResizeColWidth(int w); void DoStartMoveCol(int col); - void DoEndDragResizeRow(); - void DoEndDragResizeCol(wxMouseEvent *event = NULL); + void DoEndDragResizeRow(const wxMouseEvent& event); + void DoEndDragResizeCol(const wxMouseEvent& event); void DoEndMoveCol(int pos); // common implementations of methods defined for both rows and columns void DeselectLine(int line, const wxGridOperations& oper); - void DoEndDragResizeLine(const wxGridOperations& oper); + bool DoEndDragResizeLine(const wxGridOperations& oper); int PosToLinePos(int pos, bool clipToMinMax, const wxGridOperations& oper) const; int PosToLine(int pos, bool clipToMinMax, @@ -2037,6 +2118,22 @@ private: bool DoAppendLines(bool (wxGridTableBase::*funcAppend)(size_t), int num, bool updateLabels); + // common part of Set{Col,Row}Sizes + void DoSetSizes(const wxGridSizesInfo& sizeInfo, + const wxGridOperations& oper); + + // common part of Disable{Row,Col}Resize and CanDrag{Row,Col}Size + void DoDisableLineResize(int line, wxGridFixedIndicesSet *& setFixed); + bool DoCanResizeLine(int line, const wxGridFixedIndicesSet *setFixed) const; + + + + // these sets contain the indices of fixed, i.e. non-resizable + // interactively, grid rows or columns and are NULL if there are no fixed + // elements (which is the default) + wxGridFixedIndicesSet *m_setFixedRows, + *m_setFixedCols; + DECLARE_DYNAMIC_CLASS( wxGrid ) DECLARE_EVENT_TABLE() wxDECLARE_NO_COPY_CLASS(wxGrid); @@ -2113,7 +2210,7 @@ public: // explicitly specifying inline allows gcc < 3.4 to // handle the deprecation attribute even in the constructor. - wxDEPRECATED( inline + wxDEPRECATED_CONSTRUCTOR( wxGridEvent(int id, wxEventType type, wxObject* obj, @@ -2174,7 +2271,7 @@ public: SetEventObject(obj); } - wxDEPRECATED( inline + wxDEPRECATED_CONSTRUCTOR( wxGridSizeEvent(int id, wxEventType type, wxObject* obj, @@ -2232,7 +2329,7 @@ public: SetEventObject(obj); } - wxDEPRECATED( inline + wxDEPRECATED_CONSTRUCTOR( wxGridRangeSelectEvent(int id, wxEventType type, wxObject* obj,