]> git.saurik.com Git - wxWidgets.git/blobdiff - interface/wx/grid.h
add note for wxWidgets user with a skeleton for a very minimal console app
[wxWidgets.git] / interface / wx / grid.h
index 057ef18b7f11dd8aae7ce7dc274a0359c806e093..1258d4cede21a0bd31b8abbf3a387201fcee97de 100644 (file)
@@ -186,7 +186,13 @@ public:
 
     /**
         Fetch the value from the table and prepare the edit control to begin
 
     /**
         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;
 
     */
     virtual void BeginEdit(int row, int col, wxGrid* grid) = 0;
 
@@ -207,12 +213,27 @@ public:
     virtual void Destroy();
 
     /**
     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
 
     /**
         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",
         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.
     */
     /**
         Default constructor.
     */
-    wxGridCellAttr();
+    wxGridCellAttr(wxGridCellAttr* attrDefault = NULL);
     /**
         Constructor specifying some of the often used attributes.
     */
     /**
         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.
 
     /**
         Same as IsEmptyCell() but taking wxGridCellCoords.
@@ -1042,7 +1068,7 @@ public:
     - wxGridCellFloatEditor
     - wxGridCellNumberEditor
     - wxGridCellTextEditor
     - wxGridCellFloatEditor
     - wxGridCellNumberEditor
     - wxGridCellTextEditor
-    
+
     Please see wxGridEvent, wxGridSizeEvent, wxGridRangeSelectEvent, and
     wxGridEditorCreatedEvent for the documentation of all event types you can
     use with wxGrid.
     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.
         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);
 
     */
     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.
     */
         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.
 
     /**
         Returns a pointer to the current default grid cell editor.
@@ -1982,6 +2035,11 @@ public:
     */
     int GetColSize(int col) const;
 
     */
     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.
     */
     /**
         Returns the default height for column labels.
     */
@@ -2022,6 +2080,11 @@ public:
     */
     int GetRowSize(int row) const;
 
     */
     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.
 
     /**
         Sets the height of the column labels.
 
@@ -2053,17 +2116,33 @@ public:
     /**
         Sets the width of the specified column.
 
     /**
         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
         @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);
 
     */
     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.
 
     /**
         Sets the default width for columns in the grid.
 
@@ -2116,6 +2195,24 @@ public:
     */
     void SetRowSize(int row, int height);
 
     */
     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);
 
     */
     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
     //@}
 
 
     /**
         @name Cursor Movement
-     */
+    */
     //@{
 
     /**
     //@{
 
     /**
@@ -2659,7 +2770,7 @@ public:
 
         @see BlockToDeviceRect()
     */
 
         @see BlockToDeviceRect()
     */
-    const wxRect CellToRect(const wxGridCellCoords& coords) const;
+    wxRect CellToRect(const wxGridCellCoords& coords) const;
 
     /**
         Returns the column at the given pixel position.
 
     /**
         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.
 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.
 
 
     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}
     @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.
     @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_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}
     @endEventTable
 
     @library{wxadv}
-    @category{grid}
+    @category{grid,events}
 */
 class wxGridEvent : public wxNotifyEvent
 {
 */
 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,
     */
     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.
 
     /**
         Returns @true if the Alt key was down at the time of the event.
@@ -3258,7 +3502,7 @@ public:
     @endEventTable
 
     @library{wxadv}
     @endEventTable
 
     @library{wxadv}
-    @category{grid}
+    @category{grid,events}
 */
 class wxGridSizeEvent : public wxNotifyEvent
 {
 */
 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,
     */
     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.
 
     /**
         Returns @true if the Alt key was down at the time of the event.
@@ -3321,7 +3564,7 @@ public:
     @endEventTable
 
     @library{wxadv}
     @endEventTable
 
     @library{wxadv}
-    @category{grid}
+    @category{grid,events}
 */
 class wxGridRangeSelectEvent : public wxNotifyEvent
 {
 */
 class wxGridRangeSelectEvent : public wxNotifyEvent
 {
@@ -3337,9 +3580,7 @@ public:
                            wxObject* obj,
                            const wxGridCellCoords& topLeft,
                            const wxGridCellCoords& bottomRight,
                            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.
 
     /**
         Returns @true if the Alt key was down at the time of the event.
@@ -3412,7 +3653,7 @@ public:
     @endEventTable
 
     @library{wxadv}
     @endEventTable
 
     @library{wxadv}
-    @category{grid}
+    @category{grid,events}
 */
 class wxGridEditorCreatedEvent : public wxCommandEvent
 {
 */
 class wxGridEditorCreatedEvent : public wxCommandEvent
 {