wxGridCellCoords XYToCell(const wxPoint& pos) const
{ return XYToCell(pos.x, pos.y); }
+ // these functions return the index of the row/columns corresponding to the
+ // given logical position in pixels
+ //
+ // if clipToMinMax is false (default, wxNOT_FOUND is returned if the
+ // position is outside any row/column, otherwise the first/last element is
+ // returned in this case
int YToRow( int y, bool clipToMinMax = false ) const;
int XToCol( int x, bool clipToMinMax = false ) const;
return s;
}
+ // ------ row and col sizes
void SetDefaultRowSize( int height, bool resizeExistingRows = false );
void SetRowSize( int row, int height );
- void SetDefaultColSize( int width, bool resizeExistingCols = false );
+ void HideRow(int row) { SetRowSize(row, 0); }
+ void ShowRow(int row) { SetRowSize(row, -1); }
+ void SetDefaultColSize( int width, bool resizeExistingCols = false );
void SetColSize( int col, int width );
+ void HideCol(int col) { SetColSize(col, 0); }
+ void ShowCol(int col) { SetColSize(col, -1); }
- //Column positions
- int GetColAt( int colPos ) const
+
+ // ------- columns (only, for now) reordering
+
+ // columns index <-> positions mapping: by default, the position of the
+ // column is the same as its index, but the columns can also be reordered
+ // (either by calling SetColPos() explicitly or by the user dragging the
+ // columns around) in which case their indices don't correspond to their
+ // positions on display any longer
+ //
+ // internally we always work with indices except for the functions which
+ // have "Pos" in their names (and which work with columns, not pixels) and
+ // only the display and hit testing code really cares about display
+ // positions at all
+
+ // return the column index corresponding to the given (valid) position
+ int GetColAt(int pos) const
{
- if ( m_colAt.IsEmpty() )
- return colPos;
- else
- return m_colAt[colPos];
+ return m_colAt.empty() ? pos : m_colAt[pos];
}
- void SetColPos( int colID, int newPos );
+ // reorder the columns so that the column with the given index is now shown
+ // as the position pos
+ void SetColPos(int idx, int pos);
- int GetColPos( int colID ) const
+ // return the position at which the column with the given index is
+ // displayed: notice that this is a slow operation as we don't maintain the
+ // reverse mapping currently
+ int GetColPos(int idx) const
{
if ( m_colAt.IsEmpty() )
- return colID;
- else
+ return idx;
+
+ for ( int i = 0; i < m_numCols; i++ )
{
- for ( int i = 0; i < m_numCols; i++ )
- {
- if ( m_colAt[i] == colID )
- return i;
- }
+ if ( m_colAt[i] == idx )
+ return i;
}
- return -1;
+ wxFAIL_MSG( "invalid column index" );
+
+ return wxNOT_FOUND;
}
+ // reset the columns positions to the default order
+ void ResetColPos();
+
+
// automatically size the column or row to fit to its contents, if
// setAsMin is true, this optimal width will also be set as minimal width
// for this column
#endif // wxUSE_DRAG_AND_DROP
+ // ------- sorting support
+
+ // wxGrid doesn't support sorting on its own but it can indicate the sort
+ // order in the column header (currently only if native header control is
+ // used though)
+
+ // return the column currently displaying the sort indicator or wxNOT_FOUND
+ // if none
+ int GetSortingColumn() const { return m_sortCol; }
+
+ // return true if this column is currently used for sorting
+ bool IsSortingBy(int col) const { return GetSortingColumn() == col; }
+
+ // return the current sorting order (on GetSortingColumn()): true for
+ // ascending sort and false for descending; it doesn't make sense to call
+ // it if GetSortingColumn() returns wxNOT_FOUND
+ bool IsSortOrderAscending() const { return m_sortIsAscending; }
+
+ // set the sorting column (or unsets any existing one if wxNOT_FOUND) and
+ // the order in which to sort
+ void SetSortingColumn(int col, bool ascending = true);
+
+ // unset any existing sorting column
+ void UnsetSortingColumn() { SetSortingColumn(wxNOT_FOUND); }
+
#ifdef WXWIN_COMPATIBILITY_2_8
// ------ For compatibility with previous wxGrid only...
//
wxArrayInt m_colWidths;
wxArrayInt m_colRights;
+ int m_sortCol;
+ bool m_sortIsAscending;
+
bool m_useNativeHeader,
m_nativeColumnLabels;
//Column positions
wxArrayInt m_colAt;
- int m_moveToCol;
bool m_canDragRowSize;
bool m_canDragColSize;
// common part of Clip{Horz,Vert}GridLines
void DoClipGridLines(bool& var, bool clip);
+ // update the sorting indicator shown in the specified column (whose index
+ // must be valid)
+ //
+ // this will use GetSortingColumn() and IsSortOrderAscending() to determine
+ // the sorting indicator to effectively show
+ void UpdateColumnSortingIndicator(int col);
+
+ // update column right positions after their order changed (does nothing if
+ // we only use the default widths as in this case m_colRights is not used
+ // neither)
+ void UpdateColumnRights();
+
+
+ // return the position (not index) of the column at the given logical pixel
+ // position
+ //
+ // this always returns a valid position, even if the coordinate is out of
+ // bounds (in which case first/last column is returned)
+ int XToPos(int x) const;
+
// event handlers and their helpers
// --------------------------------
void ProcessColLabelMouseEvent(wxMouseEvent& event);
void ProcessCornerLabelMouseEvent(wxMouseEvent& event);
+ void DoColHeaderClick(int col);
+
void DoStartResizeCol(int col);
void DoUpdateResizeCol(int x);
void DoUpdateResizeColWidth(int w);
+ void DoStartMoveCol(int col);
void DoEndDragResizeRow();
void DoEndDragResizeCol(wxMouseEvent *event = NULL);
- void DoEndDragMoveCol();
+ 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);
- int PosToLine(int pos, bool clipToMinMax,
- const wxGridOperations& oper) const;
+ int PosToLinePos(int pos, bool clipToMinMax,
+ const wxGridOperations& oper) const;
+ int PosToLine(int pos, bool clipToMinMax,
+ const wxGridOperations& oper) const;
int PosToEdgeOfLine(int pos, const wxGridOperations& oper) const;
bool DoMoveCursor(bool expandSelection,
extern WXDLLIMPEXP_ADV const wxEventType wxEVT_GRID_EDITOR_CREATED;
extern WXDLLIMPEXP_ADV const wxEventType wxEVT_GRID_CELL_BEGIN_DRAG;
extern WXDLLIMPEXP_ADV const wxEventType wxEVT_GRID_COL_MOVE;
+extern WXDLLIMPEXP_ADV const wxEventType wxEVT_GRID_COL_SORT;
typedef void (wxEvtHandler::*wxGridEventFunction)(wxGridEvent&);
#define EVT_GRID_CMD_ROW_SIZE(id, fn) wx__DECLARE_GRIDSIZEEVT(ROW_SIZE, id, fn)
#define EVT_GRID_CMD_COL_SIZE(id, fn) wx__DECLARE_GRIDSIZEEVT(COL_SIZE, id, fn)
#define EVT_GRID_CMD_COL_MOVE(id, fn) wx__DECLARE_GRIDEVT(COL_MOVE, id, fn)
+#define EVT_GRID_CMD_COL_SORT(id, fn) wx__DECLARE_GRIDEVT(COL_SORT, id, fn)
#define EVT_GRID_CMD_RANGE_SELECT(id, fn) wx__DECLARE_GRIDRANGESELEVT(RANGE_SELECT, id, fn)
#define EVT_GRID_CMD_CELL_CHANGE(id, fn) wx__DECLARE_GRIDEVT(CELL_CHANGE, id, fn)
#define EVT_GRID_CMD_SELECT_CELL(id, fn) wx__DECLARE_GRIDEVT(SELECT_CELL, id, fn)
#define EVT_GRID_ROW_SIZE(fn) EVT_GRID_CMD_ROW_SIZE(wxID_ANY, fn)
#define EVT_GRID_COL_SIZE(fn) EVT_GRID_CMD_COL_SIZE(wxID_ANY, fn)
#define EVT_GRID_COL_MOVE(fn) EVT_GRID_CMD_COL_MOVE(wxID_ANY, fn)
+#define EVT_GRID_COL_SORT(fn) EVT_GRID_CMD_COL_SORT(wxID_ANY, fn)
#define EVT_GRID_RANGE_SELECT(fn) EVT_GRID_CMD_RANGE_SELECT(wxID_ANY, fn)
#define EVT_GRID_CELL_CHANGE(fn) EVT_GRID_CMD_CELL_CHANGE(wxID_ANY, fn)
#define EVT_GRID_SELECT_CELL(fn) EVT_GRID_CMD_SELECT_CELL(wxID_ANY, fn)