X-Git-Url: https://git.saurik.com/wxWidgets.git/blobdiff_plain/caac7804114079a6ab0dcf1a6c15f9fd8340e4a0..42fb9cdf6f1778ce06d5545fc37c85a966521f6c:/interface/wx/grid.h diff --git a/interface/wx/grid.h b/interface/wx/grid.h index 057ef18b7f..1258d4cede 100644 --- a/interface/wx/grid.h +++ b/interface/wx/grid.h @@ -186,7 +186,13 @@ public: /** Fetch the value from the table and prepare the edit control to begin - editing. Sets the focus to the edit control. + editing. + + This function should save the original value of the grid cell at the + given @a row and @a col and show the control allowing the user to + change it. + + @see EndEdit() */ virtual void BeginEdit(int row, int col, wxGrid* grid) = 0; @@ -207,12 +213,27 @@ public: virtual void Destroy(); /** - Complete the editing of the current cell. If necessary, the control may - be destroyed. + End editing the cell. - @return @true if the value has changed. + This function must check if the current value of the editing control is + valid and different from the original value (available as @a oldval in + its string form and possibly saved internally using its real type by + BeginEdit()). If it isn't, it just returns @false, otherwise it fills + @a newval with the representation of the new value in the string form, + if necessary saves it using its real type internally, and returns @true. + + If the user-defined wxEVT_GRID_CELL_CHANGING event handler doesn't veto + this change, ApplyEdit() will be called next. */ - virtual bool EndEdit(int row, int col, wxGrid* grid) = 0; + virtual bool EndEdit(const wxString& oldval, wxString* newval) = 0; + + /** + Effectively save the changes in the grid. + + This function should save the value of the control in the grid. It is + called only after EndEdit() returns @true. + */ + virtual void ApplyEdit(int row, int col, wxGrid* grid) = 0; /** Some types of controls on some platforms may need some help with the @@ -300,7 +321,7 @@ public: an empty string otherwise. */ static void UseStringValues(const wxString& valueTrue = "1", - const wxString& valueFalse = wxEmptyString) const; + const wxString& valueFalse = wxEmptyString); }; /** @@ -459,7 +480,7 @@ public: /** Default constructor. */ - wxGridCellAttr(); + wxGridCellAttr(wxGridCellAttr* attrDefault = NULL); /** Constructor specifying some of the often used attributes. */ @@ -673,9 +694,14 @@ public: //@{ /** - Must be overridden to implement testing for empty cells. + May be overridden to implement testing for empty cells. + + This method is used by the grid to test if the given cell is not used + and so whether a neighbouring cell may overflow into it. By default it + only returns true if the value of the given cell, as returned by + GetValue(), is empty. */ - virtual bool IsEmptyCell(int row, int col) = 0; + virtual bool IsEmptyCell(int row, int col); /** Same as IsEmptyCell() but taking wxGridCellCoords. @@ -1042,7 +1068,7 @@ public: - wxGridCellFloatEditor - wxGridCellNumberEditor - wxGridCellTextEditor - + Please see wxGridEvent, wxGridSizeEvent, wxGridRangeSelectEvent, and wxGridEditorCreatedEvent for the documentation of all event types you can use with wxGrid. @@ -1376,9 +1402,36 @@ public: There is no equivalent method for drawing row columns as there is not native look for that. This option is useful when using wxGrid for displaying tables and not as a spread-sheet. + + @see UseNativeHeader() */ void SetUseNativeColLabels(bool native = true); + /** + Enable the use of native header window for column labels. + + If this function is called with @true argument, a wxHeaderCtrl is used + instead to display the column labels instead of drawing them in wxGrid + code itself. This has the advantage of making the grid look and feel + perfectly the same as native applications (using SetUseNativeColLabels() + the grid can be made to look more natively but it still doesn't feel + natively, notably the column resizing and dragging still works slightly + differently as it is implemented in wxWidgets itself) but results in + different behaviour for column and row headers, for which there is no + equivalent function, and, most importantly, is unsuitable for grids + with huge numbers of columns as wxHeaderCtrl doesn't support virtual + mode. Because of this, by default the grid does not use the native + header control but you should call this function to enable it if you + are using the grid to display tabular data and don't have thousands of + columns in it. + + Also note that currently @c wxEVT_GRID_LABEL_LEFT_DCLICK and @c + wxEVT_GRID_LABEL_RIGHT_DCLICK events are not generated for the column + labels if the native columns header is used (but this limitation could + possibly be lifted in the future). + */ + void UseNativeColHeader(bool native = true); + //@} @@ -1612,7 +1665,7 @@ public: See wxGridTableBase::CanGetValueAs() and the @ref overview_grid for more information. */ - const wxString GetCellValue(const wxGridCellCoords& coords) const; + wxString GetCellValue(const wxGridCellCoords& coords) const; /** Returns a pointer to the current default grid cell editor. @@ -1982,6 +2035,11 @@ public: */ int GetColSize(int col) const; + /** + Returns @true if the specified column is not currently hidden. + */ + bool IsColShown(int col) const; + /** Returns the default height for column labels. */ @@ -2022,6 +2080,11 @@ public: */ int GetRowSize(int row) const; + /** + Returns @true if the specified row is not currently hidden. + */ + bool IsRowShown(int row) const; + /** Sets the height of the column labels. @@ -2053,17 +2116,33 @@ public: /** Sets the width of the specified column. - Notice that this function does not refresh the grid, you need to call - ForceRefresh() to make the changes take effect immediately. - @param col The column index. @param width - The new column width in pixels or a negative value to fit the - column width to its label width. + The new column width in pixels, 0 to hide the column or -1 to fit + the column width to its label width. */ void SetColSize(int col, int width); + /** + Hides the specified column. + + To show the column later you need to call SetColSize() with non-0 + width or ShowCol(). + + @param col + The column index. + */ + void HideCol(int col); + + /** + Shows the previously hidden column by resizing it to non-0 size. + + @see HideCol(), SetColSize() + */ + void ShowCol(int col); + + /** Sets the default width for columns in the grid. @@ -2116,6 +2195,24 @@ public: */ void SetRowSize(int row, int height); + /** + Hides the specified row. + + To show the row later you need to call SetRowSize() with non-0 + width or ShowRow(). + + @param col + The row index. + */ + void HideRow(int col); + + /** + Shows the previously hidden row by resizing it to non-0 size. + + @see HideRow(), SetRowSize() + */ + void ShowRow(int col); + //@} @@ -2229,12 +2326,26 @@ public: */ void SetColPos(int colID, int newPos); + /** + Sets the positions of all columns at once. + + This method takes an array containing the indices of the columns in + their display order, i.e. uses the same convention as + wxHeaderCtrl::SetColumnsOrder(). + */ + void SetColumnsOrder(const wxArrayInt& order); + + /** + Resets the position of the columns to the default. + */ + void ResetColPos(); + //@} /** @name Cursor Movement - */ + */ //@{ /** @@ -2659,7 +2770,7 @@ public: @see BlockToDeviceRect() */ - const wxRect CellToRect(const wxGridCellCoords& coords) const; + wxRect CellToRect(const wxGridCellCoords& coords) const; /** Returns the column at the given pixel position. @@ -2987,6 +3098,143 @@ public: //@} + + /** + @name Sorting support. + + wxGrid doesn't provide any support for sorting the data but it does + generate events allowing the user code to sort it and supports + displaying the sort indicator in the column used for sorting. + + To use wxGrid sorting support you need to handle wxEVT_GRID_COL_SORT + event (and not veto it) and resort the data displayed in the grid. The + grid will automatically update the sorting indicator on the column + which was clicked. + + You can also call the functions in this section directly to update the + sorting indicator. Once again, they don't do anything with the grid + data, it remains your responsibility to actually sort it appropriately. + */ + //@{ + + /** + Return the column in which the sorting indicator is currently + displayed. + + Returns @c wxNOT_FOUND if sorting indicator is not currently displayed + at all. + + @see SetSortingColumn() + */ + int GetSortingColumn() const; + + /** + Return @true if this column is currently used for sorting. + + @see GetSortingColumn() + */ + bool IsSortingBy(int col) const; + + /** + Return @true if the current sorting order is ascending or @false if it + is descending. + + It only makes sense to call this function if GetSortingColumn() returns + a valid column index and not @c wxNOT_FOUND. + + @see SetSortingColumn() + */ + bool IsSortOrderAscending() const; + + /** + Set the column to display the sorting indicator in and its direction. + + @param col + The column to display the sorting indicator in or @c wxNOT_FOUND to + remove any currently displayed sorting indicator. + @param ascending + If @true, display the ascending sort indicator, otherwise display + the descending sort indicator. + + @see GetSortingColumn(), IsSortOrderAscending() + */ + void SetSortingColumn(int col, bool ascending = true); + + /** + Remove any currently shown sorting indicator. + + This is equivalent to calling SetSortingColumn() with @c wxNOT_FOUND + first argument. + */ + void UnsetSortingColumn(); + //@} + + + /** + @name Accessors for component windows. + + Return the various child windows of wxGrid. + + wxGrid is an empty parent window for 4 children representing the column + labels window (top), the row labels window (left), the corner window + (top left) and the main grid window. It may be necessary to use these + individual windows and not the wxGrid window itself if you need to + handle events for them (this can be done using wxEvtHandler::Connect() + or wxWindow::PushEventHandler()) or do something else requiring the use + of the correct window pointer. Notice that you should not, however, + change these windows (e.g. reposition them or draw over them) because + they are managed by wxGrid itself. + */ + //@{ + + /** + Return the main grid window containing the grid cells. + + This window is always shown. + */ + wxWindow *GetGridWindow() const; + + /** + Return the row labels window. + + This window is not shown if the row labels were hidden using + HideRowLabels(). + */ + wxWindow *GetGridRowLabelWindow() const; + + /** + Return the column labels window. + + This window is not shown if the columns labels were hidden using + HideColLabels(). + + Depending on whether UseNativeColHeader() was called or not this can be + either a wxHeaderCtrl or a plain wxWindow. This function returns a valid + window pointer in either case but in the former case you can also use + GetGridColHeader() to access it if you need wxHeaderCtrl-specific + functionality. + */ + wxWindow *GetGridColLabelWindow() const; + + /** + Return the window in the top left grid corner. + + This window is shown only of both columns and row labels are shown and + normally doesn't contain anything. Clicking on it is handled by wxGrid + however and can be used to select the entire grid. + */ + wxWindow *GetGridCornerLabelWindow() const; + + /** + Return the header control used for column labels display. + + This function can only be called if UseNativeColHeader() had been + called. + */ + wxHeaderCtrl *GetGridColHeader() const; + + //@} + protected: /** Returns @true if this grid has support for cell attributes. @@ -3092,10 +3340,29 @@ public: This event class contains information about various grid events. + Notice that all grid event table macros are available in two versions: + @c EVT_GRID_XXX and @c EVT_GRID_CMD_XXX. The only difference between the + two is that the former doesn't allow to specify the grid window identifier + and so takes a single parameter, the event handler, but is not suitable if + there is more than one grid control in the window where the event table is + used (as it would catch the events from all the grids). The version with @c + CMD takes the id as first argument and the event handler as the second one + and so can be used with multiple grids as well. Otherwise there are no + difference between the two and only the versions without the id are + documented below for brevity. + @beginEventTable{wxGridEvent} - @event{EVT_GRID_CELL_CHANGE(func)} - The user changed the data in a cell. Processes a - @c wxEVT_GRID_CELL_CHANGE event type. + @event{EVT_GRID_CELL_CHANGING(func)} + The user is about to change the data in a cell. The new cell value as + string is available from GetString() event object method. This event + can be vetoed if the change is not allowed. + Processes a @c wxEVT_GRID_CELL_CHANGING event type. + @event{EVT_GRID_CELL_CHANGED(func)} + The user changed the data in a cell. The old cell value as string is + available from GetString() event object method. Notice that vetoing + this event still works for backwards compatibility reasons but any new + code should only veto EVT_GRID_CELL_CHANGING event and not this one. + Processes a @c wxEVT_GRID_CELL_CHANGED event type. @event{EVT_GRID_CELL_LEFT_CLICK(func)} The user clicked a cell with the left mouse button. Processes a @c wxEVT_GRID_CELL_LEFT_CLICK event type. @@ -3129,54 +3396,32 @@ public: @event{EVT_GRID_SELECT_CELL(func)} The user moved to, and selected a cell. Processes a @c wxEVT_GRID_SELECT_CELL event type. - @event{EVT_GRID_CMD_CELL_CHANGE(id, func)} - The user changed the data in a cell; variant taking a window - identifier. Processes a @c wxEVT_GRID_CELL_CHANGE event type. - @event{EVT_GRID_CMD_CELL_LEFT_CLICK(id, func)} - The user clicked a cell with the left mouse button; variant taking a - window identifier. Processes a @c wxEVT_GRID_CELL_LEFT_CLICK event - type. - @event{EVT_GRID_CMD_CELL_LEFT_DCLICK(id, func)} - The user double-clicked a cell with the left mouse button; variant - taking a window identifier. Processes a @c wxEVT_GRID_CELL_LEFT_DCLICK - event type. - @event{EVT_GRID_CMD_CELL_RIGHT_CLICK(id, func)} - The user clicked a cell with the right mouse button; variant taking a - window identifier. Processes a @c wxEVT_GRID_CELL_RIGHT_CLICK event - type. - @event{EVT_GRID_CMD_CELL_RIGHT_DCLICK(id, func)} - The user double-clicked a cell with the right mouse button; variant - taking a window identifier. Processes a @c wxEVT_GRID_CELL_RIGHT_DCLICK - event type. - @event{EVT_GRID_CMD_EDITOR_HIDDEN(id, func)} - The editor for a cell was hidden; variant taking a window identifier. - Processes a @c wxEVT_GRID_EDITOR_HIDDEN event type. - @event{EVT_GRID_CMD_EDITOR_SHOWN(id, func)} - The editor for a cell was shown; variant taking a window identifier. - Processes a @c wxEVT_GRID_EDITOR_SHOWN event type. - @event{EVT_GRID_CMD_LABEL_LEFT_CLICK(id, func)} - The user clicked a label with the left mouse button; variant taking a - window identifier. Processes a @c wxEVT_GRID_LABEL_LEFT_CLICK event - type. - @event{EVT_GRID_CMD_LABEL_LEFT_DCLICK(id, func)} - The user double-clicked a label with the left mouse button; variant - taking a window identifier. Processes a @c wxEVT_GRID_LABEL_LEFT_DCLICK - event type. - @event{EVT_GRID_CMD_LABEL_RIGHT_CLICK(id, func)} - The user clicked a label with the right mouse button; variant taking a - window identifier. Processes a @c wxEVT_GRID_LABEL_RIGHT_CLICK event - type. - @event{EVT_GRID_CMD_LABEL_RIGHT_DCLICK(id, func)} - The user double-clicked a label with the right mouse button; variant - taking a window identifier. Processes a - @c wxEVT_GRID_LABEL_RIGHT_DCLICK event type. - @event{EVT_GRID_CMD_SELECT_CELL(id, func)} - The user moved to, and selected a cell; variant taking a window - identifier. Processes a @c wxEVT_GRID_SELECT_CELL event type. + @event{EVT_GRID_COL_MOVE(func)} + The user tries to change the order of the columns in the grid by + dragging the column specified by GetCol(). This event can be vetoed to + either prevent the user from reordering the column change completely + (but notice that if you don't want to allow it at all, you simply + shouldn't call wxGrid::EnableDragColMove() in the first place), vetoed + but handled in some way in the handler, e.g. by really moving the + column to the new position at the associated table level, or allowed to + proceed in which case wxGrid::SetColPos() is used to reorder the + columns display order without affecting the use of the column indices + otherwise. + This event macro corresponds to @c wxEVT_GRID_COL_MOVE event type. + @event{EVT_GRID_COL_SORT(func)} + This event is generated when a column is clicked by the user and its + name is explained by the fact that the custom reaction to a click on a + column is to sort the grid contents by this column. However the grid + itself has no special support for sorting and it's up to the handler of + this event to update the associated table. But if the event is handled + (and not vetoed) the grid supposes that the table was indeed resorted + and updates the column to indicate the new sort order and refreshes + itself. + This event macro corresponds to @c wxEVT_GRID_COL_SORT event type. @endEventTable @library{wxadv} - @category{grid} + @category{grid,events} */ class wxGridEvent : public wxNotifyEvent { @@ -3190,8 +3435,7 @@ public: */ wxGridEvent(int id, wxEventType type, wxObject* obj, int row = -1, int col = -1, int x = -1, int y = -1, - bool sel = true, bool control = false, bool shift = false, - bool alt = false, bool meta = false); + bool sel = true, const wxKeyboardState& kbd = wxKeyboardState()); /** Returns @true if the Alt key was down at the time of the event. @@ -3258,7 +3502,7 @@ public: @endEventTable @library{wxadv} - @category{grid} + @category{grid,events} */ class wxGridSizeEvent : public wxNotifyEvent { @@ -3272,8 +3516,7 @@ public: */ wxGridSizeEvent(int id, wxEventType type, wxObject* obj, int rowOrCol = -1, int x = -1, int y = -1, - bool control = false, bool shift = false, - bool alt = false, bool meta = false); + const wxKeyboardState& kbd = wxKeyboardState()); /** Returns @true if the Alt key was down at the time of the event. @@ -3321,7 +3564,7 @@ public: @endEventTable @library{wxadv} - @category{grid} + @category{grid,events} */ class wxGridRangeSelectEvent : public wxNotifyEvent { @@ -3337,9 +3580,7 @@ public: wxObject* obj, const wxGridCellCoords& topLeft, const wxGridCellCoords& bottomRight, - bool sel = true, bool control = false, - bool shift = false, bool alt = false, - bool meta = false); + bool sel = true, const wxKeyboardState& kbd = wxKeyboardState()); /** Returns @true if the Alt key was down at the time of the event. @@ -3412,7 +3653,7 @@ public: @endEventTable @library{wxadv} - @category{grid} + @category{grid,events} */ class wxGridEditorCreatedEvent : public wxCommandEvent {