]> git.saurik.com Git - wxWidgets.git/blobdiff - interface/wx/grid.h
Return wxFONTFAMILY_DEFAULT, not UNKNOWN, from wxFont::GetFamily().
[wxWidgets.git] / interface / wx / grid.h
index 3d6f26a5f99f52c90b0c5d6ad9d003e5feeced49..6203daa4db98ef58ef32e5f74661b45ebe4fa0b0 100644 (file)
@@ -3,7 +3,7 @@
 // Purpose:     interface of wxGrid and related classes
 // Author:      wxWidgets team
 // RCS-ID:      $Id$
-// Licence:     wxWindows license
+// Licence:     wxWindows licence
 /////////////////////////////////////////////////////////////////////////////
 
 /**
     @library{wxadv}
     @category{grid}
 
-    @see wxGridCellBoolRenderer, wxGridCellFloatRenderer,
-         wxGridCellNumberRenderer, wxGridCellStringRenderer
+    @see wxGridCellAutoWrapStringRenderer, wxGridCellBoolRenderer,
+         wxGridCellDateTimeRenderer, wxGridCellEnumRenderer,
+         wxGridCellFloatRenderer, wxGridCellNumberRenderer,
+         wxGridCellStringRenderer
 */
 class wxGridCellRenderer
 {
@@ -50,6 +52,31 @@ public:
                                int row, int col) = 0;
 };
 
+/**
+    @class wxGridCellAutoWrapStringRenderer
+
+    This class may be used to format string data in a cell. The too
+    long lines are wrapped to be shown entirely at word boundaries.
+
+    @library{wxadv}
+    @category{grid}
+
+    @see wxGridCellRenderer, wxGridCellBoolRenderer,
+         wxGridCellDateTimeRenderer, wxGridCellEnumRenderer,
+         wxGridCellFloatRenderer, wxGridCellNumberRenderer,
+         wxGridCellStringRenderer
+*/
+
+class wxGridCellAutoWrapStringRenderer : public wxGridCellStringRenderer
+{
+public:
+    /**
+        Default constructor.
+    */
+    wxGridCellAutoWrapStringRenderer();
+};
+
+
 /**
     @class wxGridCellBoolRenderer
 
@@ -58,7 +85,9 @@ public:
     @library{wxadv}
     @category{grid}
 
-    @see wxGridCellRenderer, wxGridCellFloatRenderer, wxGridCellNumberRenderer,
+    @see wxGridCellRenderer, wxGridCellAutoWrapStringRenderer,
+         wxGridCellDateTimeRenderer, wxGridCellEnumRenderer,
+         wxGridCellFloatRenderer, wxGridCellNumberRenderer,
          wxGridCellStringRenderer
 */
 class wxGridCellBoolRenderer : public wxGridCellRenderer
@@ -70,6 +99,85 @@ public:
     wxGridCellBoolRenderer();
 };
 
+/**
+    @class wxGridCellDateTimeRenderer
+
+    This class may be used to format a date/time data in a cell.
+    The class wxDateTime is used internally to display the local date/time
+    or to parse the string date entered in the cell thanks to the defined format.
+
+    @library{wxadv}
+    @category{grid}
+
+    @see wxGridCellRenderer, wxGridCellAutoWrapStringRenderer,
+         wxGridCellBoolRenderer, wxGridCellEnumRenderer,
+         wxGridCellFloatRenderer, wxGridCellNumberRenderer,
+         wxGridCellStringRenderer
+*/
+class wxGridCellDateTimeRenderer : public wxGridCellStringRenderer
+{
+public:
+    /**
+        Date/time renderer constructor.
+
+        @param outformat
+            strptime()-like format string used the parse the output date/time.
+        @param informat
+            strptime()-like format string used to parse the string entered in the cell.
+    */
+    wxGridCellDateTimeRenderer(const wxString& outformat = wxDefaultDateTimeFormat,
+                               const wxString& informat = wxDefaultDateTimeFormat);
+
+
+    /**
+        Sets the strptime()-like format string which will be used to parse
+        the date/time.
+
+        @param params
+            strptime()-like format string used to parse the date/time.
+    */
+    virtual void SetParameters(const wxString& params);
+};
+
+/**
+    @class wxGridCellEnumRenderer
+
+    This class may be used to render in a cell a number as a textual
+    equivalent.
+
+    The corresponding text strings are specified as comma-separated items in
+    the string passed to this renderer ctor or SetParameters() method. For
+    example, if this string is @c "John,Fred,Bob" the cell will be rendered as
+    "John", "Fred" or "Bob" if its contents is 0, 1 or 2 respectively.
+
+    @library{wxadv}
+    @category{grid}
+
+    @see wxGridCellRenderer, wxGridCellAutoWrapStringRenderer,
+         wxGridCellBoolRenderer, wxGridCellDateTimeRenderer,
+         wxGridCellFloatRenderer, wxGridCellNumberRenderer,
+         wxGridCellStringRenderer
+*/
+class wxGridCellEnumRenderer : public wxGridCellStringRenderer
+{
+public:
+    /**
+        Enum renderer ctor.
+
+        @param choices
+            Comma separated string parameters "item1[,item2[...,itemN]]".
+    */
+    wxGridCellEnumRenderer( const wxString& choices = wxEmptyString );
+
+    /**
+        Sets the comma separated string content of the enum.
+
+        @param params
+            Comma separated string parameters "item1[,item2[...,itemN]]".
+    */
+    virtual void SetParameters(const wxString& params);
+};
+
 /**
     @class wxGridCellFloatRenderer
 
@@ -78,13 +186,17 @@ public:
     @library{wxadv}
     @category{grid}
 
-    @see wxGridCellRenderer, wxGridCellBoolRenderer, wxGridCellNumberRenderer,
+    @see wxGridCellRenderer, wxGridCellAutoWrapStringRenderer,
+         wxGridCellBoolRenderer, wxGridCellDateTimeRenderer,
+         wxGridCellEnumRenderer, wxGridCellNumberRenderer,
          wxGridCellStringRenderer
 */
 class wxGridCellFloatRenderer : public wxGridCellStringRenderer
 {
 public:
     /**
+        Float cell renderer ctor.
+
         @param width
             Minimum number of characters to be shown.
         @param precision
@@ -126,7 +238,9 @@ public:
     @library{wxadv}
     @category{grid}
 
-    @see wxGridCellRenderer, wxGridCellBoolRenderer, wxGridCellFloatRenderer,
+    @see wxGridCellRenderer, wxGridCellAutoWrapStringRenderer,
+         wxGridCellBoolRenderer, wxGridCellDateTimeRenderer,
+         wxGridCellEnumRenderer, wxGridCellFloatRenderer,
          wxGridCellStringRenderer
 */
 class wxGridCellNumberRenderer : public wxGridCellStringRenderer
@@ -147,7 +261,9 @@ public:
     @library{wxadv}
     @category{grid}
 
-    @see wxGridCellRenderer, wxGridCellBoolRenderer, wxGridCellFloatRenderer,
+    @see wxGridCellRenderer, wxGridCellAutoWrapStringRenderer,
+         wxGridCellBoolRenderer, wxGridCellDateTimeRenderer,
+         wxGridCellEnumRenderer, wxGridCellFloatRenderer,
          wxGridCellNumberRenderer
 */
 class wxGridCellStringRenderer : public wxGridCellRenderer
@@ -160,7 +276,6 @@ public:
 };
 
 
-
 /**
     @class wxGridCellEditor
 
@@ -173,8 +288,10 @@ public:
     @library{wxadv}
     @category{grid}
 
-    @see wxGridCellBoolEditor, wxGridCellChoiceEditor, wxGridCellFloatEditor,
-         wxGridCellNumberEditor, wxGridCellTextEditor
+    @see wxGridCellAutoWrapStringEditor, wxGridCellBoolEditor,
+         wxGridCellChoiceEditor, wxGridCellEnumEditor,
+         wxGridCellFloatEditor, wxGridCellNumberEditor,
+         wxGridCellTextEditor
 */
 class wxGridCellEditor
 {
@@ -186,7 +303,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 +330,34 @@ public:
     virtual void Destroy();
 
     /**
-        Complete the editing of the current cell. If necessary, the control may
-        be destroyed.
+        End editing the cell.
+
+        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 must do
+        the following:
+            # Save the new value internally so that ApplyEdit() could apply it.
+            # Fill @a newval (which is never @NULL) with the string
+            representation of the new value.
+            # Return @true
+
+        Notice that it must @em not modify the grid as the change could still
+        be vetoed.
 
-        @return @true if the value has changed.
+        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(int row, int col, const wxGrid* grid,
+                         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
@@ -267,6 +412,24 @@ protected:
     virtual ~wxGridCellEditor();
 };
 
+/**
+    @class wxGridCellAutoWrapStringEditor
+
+    Grid cell editor for wrappable string/text data.
+
+    @library{wxadv}
+    @category{grid}
+
+    @see wxGridCellEditor, wxGridCellBoolEditor, wxGridCellChoiceEditor,
+         wxGridCellEnumEditor, wxGridCellFloatEditor,
+         wxGridCellNumberEditor, wxGridCellTextEditor
+*/
+class wxGridCellAutoWrapStringEditor : public wxGridCellTextEditor
+{
+public:
+    wxGridCellAutoWrapStringEditor();
+};
+
 /**
     @class wxGridCellBoolEditor
 
@@ -275,8 +438,10 @@ protected:
     @library{wxadv}
     @category{grid}
 
-    @see wxGridCellEditor, wxGridCellChoiceEditor, wxGridCellFloatEditor,
-         wxGridCellNumberEditor, wxGridCellTextEditor
+    @see wxGridCellEditor, wxGridCellAutoWrapStringEditor,
+         wxGridCellChoiceEditor, wxGridCellEnumEditor,
+         wxGridCellFloatEditor, wxGridCellNumberEditor,
+         wxGridCellTextEditor
 */
 class wxGridCellBoolEditor : public wxGridCellEditor
 {
@@ -300,7 +465,7 @@ public:
         an empty string otherwise.
     */
     static void UseStringValues(const wxString& valueTrue = "1",
-                                const wxString& valueFalse = wxEmptyString) const;
+                                const wxString& valueFalse = wxEmptyString);
 };
 
 /**
@@ -312,13 +477,17 @@ public:
     @library{wxadv}
     @category{grid}
 
-    @see wxGridCellEditor, wxGridCellBoolEditor, wxGridCellFloatEditor,
-         wxGridCellNumberEditor, wxGridCellTextEditor
+    @see wxGridCellEditor, wxGridCellAutoWrapStringEditor,
+         wxGridCellBoolEditor, wxGridCellEnumEditor,
+         wxGridCellFloatEditor, wxGridCellNumberEditor,
+         wxGridCellTextEditor
 */
 class wxGridCellChoiceEditor : public wxGridCellEditor
 {
 public:
     /**
+        Choice cell renderer ctor.
+
         @param count
             Number of strings from which the user can choose.
         @param choices
@@ -330,7 +499,10 @@ public:
     wxGridCellChoiceEditor(size_t count = 0,
                            const wxString choices[] = NULL,
                            bool allowOthers = false);
+
     /**
+        Choice cell renderer ctor.
+
         @param choices
             An array of strings from which the user can choose.
         @param allowOthers
@@ -346,6 +518,33 @@ public:
     virtual void SetParameters(const wxString& params);
 };
 
+/**
+    @class wxGridCellEnumEditor
+
+    Grid cell editor which displays an enum number as a textual equivalent
+    (eg. data in cell is 0,1,2 ... n the cell could be displayed as
+    "John","Fred"..."Bob" in the combo choice box).
+
+    @library{wxadv}
+    @category{grid}
+
+    @see wxGridCellEditor, wxGridCellAutoWrapStringEditor,
+         wxGridCellBoolEditor, wxGridCellChoiceEditor,
+         wxGridCellTextEditor, wxGridCellFloatEditor,
+         wxGridCellNumberEditor
+*/
+class wxGridCellEnumEditor : public wxGridCellChoiceEditor
+{
+public:
+    /**
+        Enum cell editor ctor.
+
+        @param choices
+            Comma separated choice parameters "item1[,item2[...,itemN]]".
+    */
+    wxGridCellEnumEditor( const wxString& choices = wxEmptyString );
+};
+
 /**
     @class wxGridCellTextEditor
 
@@ -354,8 +553,10 @@ public:
     @library{wxadv}
     @category{grid}
 
-    @see wxGridCellEditor, wxGridCellBoolEditor, wxGridCellChoiceEditor,
-         wxGridCellFloatEditor, wxGridCellNumberEditor
+    @see wxGridCellEditor, wxGridCellAutoWrapStringEditor,
+         wxGridCellBoolEditor, wxGridCellChoiceEditor,
+         wxGridCellEnumEditor, wxGridCellFloatEditor,
+         wxGridCellNumberEditor
 */
 class wxGridCellTextEditor : public wxGridCellEditor
 {
@@ -380,13 +581,17 @@ public:
     @library{wxadv}
     @category{grid}
 
-    @see wxGridCellEditor, wxGridCellNumberEditor, wxGridCellBoolEditor,
-    wxGridCellTextEditor, wxGridCellChoiceEditor
+    @see wxGridCellEditor, wxGridCellAutoWrapStringEditor,
+         wxGridCellBoolEditor, wxGridCellChoiceEditor,
+         wxGridCellEnumEditor, wxGridCellNumberEditor,
+         wxGridCellTextEditor
 */
 class wxGridCellFloatEditor : public wxGridCellTextEditor
 {
 public:
     /**
+        Float cell editor ctor.
+
         @param width
             Minimum number of characters to be shown.
         @param precision
@@ -408,8 +613,10 @@ public:
     @library{wxadv}
     @category{grid}
 
-    @see wxGridCellEditor, wxGridCellBoolEditor, wxGridCellChoiceEditor,
-         wxGridCellFloatEditor, wxGridCellTextEditor
+    @see wxGridCellEditor, wxGridCellAutoWrapStringEditor,
+         wxGridCellBoolEditor, wxGridCellChoiceEditor,
+         wxGridCellEnumEditor, wxGridCellFloatEditor,
+         wxGridCellTextEditor
 */
 class wxGridCellNumberEditor : public wxGridCellTextEditor
 {
@@ -456,10 +663,30 @@ protected:
 class wxGridCellAttr
 {
 public:
+    /**
+        Kind of the attribute to retrieve.
+
+        @see wxGridCellAttrProvider::GetAttr(), wxGridTableBase::GetAttr()
+     */
+    enum wxAttrKind
+    {
+        /// Return the combined effective attribute for the cell.
+        Any,
+
+        /// Return the attribute explicitly set for this cell.
+        Cell,
+
+        /// Return the attribute set for this cells row.
+        Row,
+
+        /// Return the attribute set for this cells column.
+        Col
+    };
+
     /**
         Default constructor.
     */
-    wxGridCellAttr();
+    wxGridCellAttr(wxGridCellAttr* attrDefault = NULL);
     /**
         Constructor specifying some of the often used attributes.
     */
@@ -479,7 +706,21 @@ public:
     void DecRef();
 
     /**
-        See SetAlignment() for the returned values.
+        Get the alignment to use for the cell with the given attribute.
+
+        If this attribute doesn't specify any alignment, the default attribute
+        alignment is used (which can be changed using
+        wxGrid::SetDefaultCellAlignment() but is left and top by default).
+
+        Notice that @a hAlign and @a vAlign values are always overwritten by
+        this function, use GetNonDefaultAlignment() if this is not desirable.
+
+        @param hAlign
+            Horizontal alignment is returned here if this argument is non-@NULL.
+            It is one of wxALIGN_LEFT, wxALIGN_CENTRE or wxALIGN_RIGHT.
+        @param vAlign
+            Vertical alignment is returned here if this argument is non-@NULL.
+            It is one of wxALIGN_TOP, wxALIGN_CENTRE or wxALIGN_BOTTOM.
     */
     void GetAlignment(int* hAlign, int* vAlign) const;
 
@@ -498,6 +739,29 @@ public:
     */
     const wxFont& GetFont() const;
 
+    /**
+        Get the alignment defined by this attribute.
+
+        Unlike GetAlignment() this function only modifies @a hAlign and @a
+        vAlign if this attribute does define a non-default alignment. This
+        means that they must be initialized before calling this function and
+        that their values will be preserved unchanged if they are different
+        from wxALIGN_INVALID.
+
+        For example, the following fragment can be used to use the cell
+        alignment if one is defined but right-align its contents by default
+        (instead of left-aligning it by default) while still using the default
+        vertical alignment:
+        @code
+            int hAlign = wxALIGN_RIGHT,
+                vAlign = wxALIGN_INVALID;
+            attr.GetNonDefaultAlignment(&hAlign, &vAlign);
+        @endcode
+
+        @since 2.9.1
+     */
+    void GetNonDefaultAlignment(int *hAlign, int *vAlign) const;
+
     /**
         Returns the cell renderer.
     */
@@ -594,6 +858,282 @@ public:
     void SetTextColour(const wxColour& colText);
 };
 
+/**
+    Base class for corner window renderer.
+
+    This is the simplest of all header renderers and only has a single
+    function.
+
+    @see wxGridCellAttrProvider::GetCornerRenderer()
+
+    @since 2.9.1
+ */
+class wxGridCornerHeaderRenderer
+{
+public:
+    /**
+        Called by the grid to draw the corner window border.
+
+        This method is responsible for drawing the border inside the given @a
+        rect and adjusting the rectangle size to correspond to the area inside
+        the border, i.e. usually call wxRect::Deflate() to account for the
+        border width.
+
+        @param grid
+            The grid whose corner window is being drawn.
+        @param dc
+            The device context to use for drawing.
+        @param rect
+            Input/output parameter which contains the border rectangle on input
+            and should be updated to contain the area inside the border on
+            function return.
+     */
+    virtual void DrawBorder(const wxGrid& grid,
+                            wxDC& dc,
+                            wxRect& rect) const = 0;
+};
+/**
+    Common base class for row and column headers renderers.
+
+    @see wxGridColumnHeaderRenderer, wxGridRowHeaderRenderer
+
+    @since 2.9.1
+ */
+class wxGridHeaderLabelsRenderer : public wxGridCornerHeaderRenderer
+{
+public:
+    /**
+        Called by the grid to draw the specified label.
+
+        Notice that the base class DrawBorder() method is called before this
+        one.
+
+        The default implementation uses wxGrid::GetLabelTextColour() and
+        wxGrid::GetLabelFont() to draw the label.
+     */
+    virtual void DrawLabel(const wxGrid& grid,
+                           wxDC& dc,
+                           const wxString& value,
+                           const wxRect& rect,
+                           int horizAlign,
+                           int vertAlign,
+                           int textOrientation) const;
+};
+
+/**
+    Base class for row headers renderer.
+
+    This is the same as wxGridHeaderLabelsRenderer currently but we still use a
+    separate class for it to distinguish it from wxGridColumnHeaderRenderer.
+
+    @see wxGridRowHeaderRendererDefault
+
+    @see wxGridCellAttrProvider::GetRowHeaderRenderer()
+
+    @since 2.9.1
+ */
+class wxGridRowHeaderRenderer : public wxGridHeaderLabelsRenderer
+{
+};
+
+/**
+    Base class for column headers renderer.
+
+    This is the same as wxGridHeaderLabelsRenderer currently but we still use a
+    separate class for it to distinguish it from wxGridRowHeaderRenderer.
+
+    @see wxGridColumnHeaderRendererDefault
+
+    @see wxGridCellAttrProvider::GetColumnHeaderRenderer()
+
+    @since 2.9.1
+ */
+class wxGridColumnHeaderRenderer : public wxGridHeaderLabelsRenderer
+{
+};
+
+/**
+    Default row header renderer.
+
+    You may derive from this class if you need to only override one of its
+    methods (i.e. either DrawLabel() or DrawBorder()) but continue to use the
+    default implementation for the other one.
+
+    @see wxGridColumnHeaderRendererDefault
+
+    @since 2.9.1
+ */
+class wxGridRowHeaderRendererDefault : public wxGridRowHeaderRenderer
+{
+public:
+    /// Implement border drawing for the row labels.
+    virtual void DrawBorder(const wxGrid& grid,
+                            wxDC& dc,
+                            wxRect& rect) const;
+};
+
+/**
+    Default column header renderer.
+
+    @see wxGridRowHeaderRendererDefault
+
+    @since 2.9.1
+ */
+class wxGridColumnHeaderRendererDefault : public wxGridColumnHeaderRenderer
+{
+public:
+    /// Implement border drawing for the column labels.
+    virtual void DrawBorder(const wxGrid& grid,
+                            wxDC& dc,
+                            wxRect& rect) const;
+};
+
+/**
+    Default corner window renderer.
+
+    @see wxGridColumnHeaderRendererDefault, wxGridRowHeaderRendererDefault
+
+    @since 2.9.1
+ */
+class wxGridCornerHeaderRendererDefault : public wxGridCornerHeaderRenderer
+{
+public:
+    /// Implement border drawing for the corner window.
+    virtual void DrawBorder(const wxGrid& grid,
+                            wxDC& dc,
+                            wxRect& rect) const;
+};
+
+/**
+    Class providing attributes to be used for the grid cells.
+
+    This class both defines an interface which grid cell attributes providers
+    should implement -- and which can be implemented differently in derived
+    classes -- and a default implementation of this interface which is often
+    good enough to be used without modification, especially with not very large
+    grids for which the efficiency of attributes storage hardly matters (see
+    the discussion below).
+
+    An object of this class can be associated with a wxGrid using
+    wxGridTableBase::SetAttrProvider() but it's not necessary to call it if you
+    intend to use the default provider as it is used by wxGridTableBase by
+    default anyhow.
+
+    Notice that while attributes provided by this class can be set for
+    individual cells using SetAttr() or the entire rows or columns using
+    SetRowAttr() and SetColAttr() they are always retrieved using GetAttr()
+    function.
+
+
+    The default implementation of this class stores the attributes passed to
+    its SetAttr(), SetRowAttr() and SetColAttr() in a straightforward way. A
+    derived class may use its knowledge about how the attributes are used in
+    your program to implement it much more efficiently: for example, using a
+    special background colour for all even-numbered rows can be implemented by
+    simply returning the same attribute from GetAttr() if the row number is
+    even instead of having to store N/2 row attributes where N is the total
+    number of rows in the grid.
+
+    Notice that objects of this class can't be copied.
+ */
+class wxGridCellAttrProvider : public wxClientDataContainer
+{
+public:
+    /// Trivial default constructor.
+    wxGridCellAttrProvider();
+
+    /// Destructor releases any attributes held by this class.
+    virtual ~wxGridCellAttrProvider();
+
+    /**
+        Get the attribute to use for the specified cell.
+
+        If wxGridCellAttr::Any is used as @a kind value, this function combines
+        the attributes set for this cell using SetAttr() and those for its row
+        or column (set with SetRowAttr() or SetColAttr() respectively), with
+        the cell attribute having the highest precedence.
+
+        Notice that the caller must call DecRef() on the returned pointer if it
+        is non-@NULL.
+
+        @param row
+            The row of the cell.
+        @param col
+            The column of the cell.
+        @param kind
+            The kind of the attribute to return.
+        @return
+            The attribute to use which should be DecRef()'d by caller or @NULL
+            if no attributes are defined for this cell.
+     */
+    virtual wxGridCellAttr *GetAttr(int row, int col,
+                                    wxGridCellAttr::wxAttrKind kind) const;
+
+    /**
+        Setting attributes.
+
+        All these functions take ownership of the attribute passed to them,
+        i.e. will call DecRef() on it themselves later and so it should not be
+        destroyed by the caller. And the attribute can be @NULL to reset a
+        previously set value.
+     */
+    //@{
+
+    /// Set attribute for the specified cell.
+    virtual void SetAttr(wxGridCellAttr *attr, int row, int col);
+
+    /// Set attribute for the specified row.
+    virtual void SetRowAttr(wxGridCellAttr *attr, int row);
+
+    /// Set attribute for the specified column.
+    virtual void SetColAttr(wxGridCellAttr *attr, int col);
+
+    //@}
+
+    /**
+        Getting header renderers.
+
+        These functions return the renderers for the given row or column header
+        label and the corner window. Unlike cell attributes, these objects are
+        not reference counted and are never @NULL so they are returned by
+        reference and not pointer and DecRef() shouldn't (and can't) be called
+        for them.
+
+        All these functions were added in wxWidgets 2.9.1.
+     */
+    //@{
+
+    /**
+        Return the renderer used for drawing column headers.
+
+        By default wxGridColumnHeaderRendererDefault is returned.
+
+        @see wxGrid::SetUseNativeColLabels(), wxGrid::UseNativeColHeader()
+
+        @since 2.9.1
+     */
+    virtual const wxGridColumnHeaderRenderer& GetColumnHeaderRenderer(int col);
+
+    /**
+        Return the renderer used for drawing row headers.
+
+        By default wxGridRowHeaderRendererDefault is returned.
+
+        @since 2.9.1
+     */
+    virtual const wxGridRowHeaderRenderer& GetRowHeaderRenderer(int row);
+
+    /**
+        Return the renderer used for drawing the corner window.
+
+        By default wxGridCornerHeaderRendererDefault is returned.
+
+        @since 2.9.1
+     */
+    virtual const wxGridCornerHeaderRenderer& GetCornerRenderer();
+
+    //@}
+};
 
 
 /**
@@ -673,9 +1213,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.
@@ -1002,57 +1547,122 @@ public:
     virtual bool CanHaveAttributes();
 };
 
-
-
 /**
-    @class wxGrid
+    @class wxGridSizesInfo
 
-    wxGrid and its related classes are used for displaying and editing tabular
-    data.
-    They provide a rich set of features for display, editing, and interacting
-    with a variety of data sources. For simple applications, and to help you
-    get started, wxGrid is the only class you need to refer to directly. It
-    will set up default instances of the other classes and manage them for you.
-    For more complex applications you can derive your own classes for custom
-    grid views, grid data tables, cell editors and renderers. The @ref
-    overview_grid "wxGrid overview" has examples of simple and more complex applications,
-    explains the relationship between the various grid classes and has a
-    summary of the keyboard shortcuts and mouse functions provided by wxGrid.
-
-    wxGrid has been greatly expanded and redesigned for wxWidgets 2.2 onwards.
-    The new grid classes are reasonably backward-compatible but there are some
-    exceptions. There are also easier ways of doing many things compared to the
-    previous implementation.
-
-    A wxGridTableBase class holds the actual data to be displayed by a wxGrid
-    class. One or more wxGrid classes may act as a view for one table class.
-    The default table class is called wxGridStringTable and holds an array of
-    strings. An instance of such a class is created by wxGrid::CreateGrid.
+    wxGridSizesInfo stores information about sizes of all wxGrid rows or
+    columns.
 
-    wxGridCellRenderer is the abstract base class for rendereing contents in a
-    cell. The following renderers are predefined:
-     - wxGridCellStringRenderer,
-     - wxGridCellBoolRenderer,
-     - wxGridCellFloatRenderer,
-     - wxGridCellNumberRenderer.
-    The look of a cell can be further defined using wxGridCellAttr. An object
-    of this type may be returned by wxGridTableBase::GetAttr.
+    It assumes that most of the rows or columns (which are both called elements
+    here as the difference between them doesn't matter at this class level)
+    have the default size and so stores it separately. And it uses a wxHashMap
+    to store the sizes of all elements which have the non-default size.
 
-    wxGridCellEditor is the abstract base class for editing the value of a
-    cell. The following editors are predefined:
-     - wxGridCellTextEditor
-     - wxGridCellBoolEditor
-     - wxGridCellChoiceEditor
-     - wxGridCellNumberEditor.
+    This structure is particularly useful for serializing the sizes of all
+    wxGrid elements at once.
 
     @library{wxadv}
     @category{grid}
-
-    @see @ref overview_grid "wxGrid overview"
-*/
-class wxGrid : public wxScrolledWindow
+ */
+struct wxGridSizesInfo
+{
+    /**
+        Default constructor.
+
+        m_sizeDefault and m_customSizes must be initialized later.
+     */
+    wxGridSizesInfo();
+
+    /**
+        Constructor.
+
+        This constructor is used by wxGrid::GetRowSizes() and GetColSizes()
+        methods. User code will usually use the default constructor instead.
+
+        @param defSize
+            The default element size.
+        @param allSizes
+            Array containing the sizes of @em all elements, including those
+            which have the default size.
+     */
+    wxGridSizesInfo(int defSize, const wxArrayInt& allSizes);
+
+    /**
+        Get the element size.
+
+        @param pos
+            The index of the element.
+        @return
+            The size for this element, using m_customSizes if @a pos is in it
+            or m_sizeDefault otherwise.
+     */
+    int GetSize(unsigned pos) const;
+
+
+    /// Default size
+    int m_sizeDefault;
+
+    /**
+        Map with element indices as keys and their sizes as values.
+
+        This map only contains the elements with non-default size.
+     */
+    wxUnsignedToIntHashMap m_customSizes;
+};
+
+
+/**
+    @class wxGrid
+
+    wxGrid and its related classes are used for displaying and editing tabular
+    data. They provide a rich set of features for display, editing, and
+    interacting with a variety of data sources. For simple applications, and to
+    help you get started, wxGrid is the only class you need to refer to
+    directly. It will set up default instances of the other classes and manage
+    them for you. For more complex applications you can derive your own classes
+    for custom grid views, grid data tables, cell editors and renderers. The
+    @ref overview_grid has examples of simple and more complex applications,
+    explains the relationship between the various grid classes and has a
+    summary of the keyboard shortcuts and mouse functions provided by wxGrid.
+
+    A wxGridTableBase class holds the actual data to be displayed by a wxGrid
+    class. One or more wxGrid classes may act as a view for one table class.
+    The default table class is called wxGridStringTable and holds an array of
+    strings. An instance of such a class is created by CreateGrid().
+
+    wxGridCellRenderer is the abstract base class for rendereing contents in a
+    cell. The following renderers are predefined:
+
+    - wxGridCellBoolRenderer
+    - wxGridCellFloatRenderer
+    - wxGridCellNumberRenderer
+    - wxGridCellStringRenderer
+
+    The look of a cell can be further defined using wxGridCellAttr. An object
+    of this type may be returned by wxGridTableBase::GetAttr().
+
+    wxGridCellEditor is the abstract base class for editing the value of a
+    cell. The following editors are predefined:
+
+    - wxGridCellBoolEditor
+    - wxGridCellChoiceEditor
+    - wxGridCellFloatEditor
+    - wxGridCellNumberEditor
+    - wxGridCellTextEditor
+
+    Please see wxGridEvent, wxGridSizeEvent, wxGridRangeSelectEvent, and
+    wxGridEditorCreatedEvent for the documentation of all event types you can
+    use with wxGrid.
+
+    @library{wxadv}
+    @category{grid}
+
+    @see @ref overview_grid, wxGridUpdateLocker
+*/
+class wxGrid : public wxScrolledWindow
 {
 public:
+
     /**
         Different selection modes supported by the grid.
      */
@@ -1076,9 +1686,44 @@ public:
 
             The user won't be able to select any cells or rows in this mode.
          */
-        wxGridSelectColumns
+        wxGridSelectColumns,
+
+        /**
+            The selection mode allowing the user to select either the entire
+            columns or the entire rows but not individual cells nor blocks.
+
+            Notice that while this constant is defined as @code
+            wxGridSelectColumns | wxGridSelectRows @endcode this doesn't mean
+            that all the other combinations are valid -- at least currently
+            they are not.
+
+            @since 2.9.1
+         */
+        wxGridSelectRowsOrColumns
+    };
+
+    /**
+        Return values for GetCellSize().
+
+        @since 2.9.1
+     */
+    enum CellSpan
+    {
+        /// This cell is inside a span covered by another cell.
+        CellSpan_Inside = -1,
+
+        /// This is a normal, non-spanning cell.
+        CellSpan_None = 0,
+
+        /// This cell spans several physical wxGrid cells.
+        CellSpan_Main
     };
 
+    /**
+        @name Constructors and Initialization
+     */
+    //@{
+
     /**
         Default constructor.
 
@@ -1086,20 +1731,27 @@ public:
         CreateGrid() or SetTable() to initialize the grid contents.
      */
     wxGrid();
-
     /**
         Constructor creating the grid window.
 
         You must call either CreateGrid() or SetTable() to initialize the grid
         contents before using it.
     */
-    wxGrid(wxWindow* parent,
-           wxWindowID id,
+    wxGrid(wxWindow* parent, wxWindowID id,
            const wxPoint& pos = wxDefaultPosition,
            const wxSize& size = wxDefaultSize,
            long style = wxWANTS_CHARS,
            const wxString& name = wxGridNameStr);
 
+    /**
+        Destructor.
+
+        This will also destroy the associated grid table unless you passed a
+        table object to the grid and specified that the grid should not take
+        ownership of the table (see SetTable()).
+    */
+    virtual ~wxGrid();
+
     /**
         Creates the grid window for an object initialized using the default
         constructor.
@@ -1107,427 +1759,503 @@ public:
         You must call either CreateGrid() or SetTable() to initialize the grid
         contents before using it.
      */
-    bool Create(wxWindow* parent,
-                wxWindowID id,
+    bool Create(wxWindow* parent, wxWindowID id,
                 const wxPoint& pos = wxDefaultPosition,
                 const wxSize& size = wxDefaultSize,
                 long style = wxWANTS_CHARS,
                 const wxString& name = wxGridNameStr);
 
     /**
-        Destructor.
-
-        This will also destroy the associated grid table unless you passed a
-        table object to the grid and specified that the grid should not take
-        ownership of the table (see wxGrid::SetTable).
-    */
-    virtual ~wxGrid();
-
-    /**
-        Appends one or more new columns to the right of the grid.
+        Creates a grid with the specified initial number of rows and columns.
 
-        The @a updateLabels argument is not used at present. If you are using a
-        derived grid table class you will need to override
-        wxGridTableBase::AppendCols. See InsertCols() for further information.
+        Call this directly after the grid constructor. When you use this
+        function wxGrid will create and manage a simple table of string values
+        for you. All of the grid data will be stored in memory.
 
-        @return @true on success or @false if appending columns failed.
+        For applications with more complex data types or relationships, or for
+        dealing with very large datasets, you should derive your own grid table
+        class and pass a table object to the grid with SetTable().
     */
-    bool AppendCols(int numCols = 1, bool updateLabels = true);
+    bool CreateGrid(int numRows, int numCols,
+                    wxGridSelectionModes selmode = wxGridSelectCells);
 
     /**
-        Appends one or more new rows to the bottom of the grid.
+        Passes a pointer to a custom grid table to be used by the grid.
 
-        The @a updateLabels argument is not used at present. If you are using a
-        derived grid table class you will need to override
-        wxGridTableBase::AppendRows. See InsertRows() for further information.
+        This should be called after the grid constructor and before using the
+        grid object. If @a takeOwnership is set to @true then the table will be
+        deleted by the wxGrid destructor.
 
-        @return @true on success or @false if appending rows failed.
+        Use this function instead of CreateGrid() when your application
+        involves complex or non-string data or data sets that are too large to
+        fit wholly in memory.
     */
-    bool AppendRows(int numRows = 1, bool updateLabels = true);
-
-    /**
-        Return @true if the horizontal grid lines stop at the last column
-        boundary or @false if they continue to the end of the window.
+    bool SetTable(wxGridTableBase* table, bool takeOwnership = false,
+                  wxGridSelectionModes selmode = wxGridSelectCells);
 
-        The default is to clip grid lines.
+    //@}
 
-        @see ClipHorzGridLines(), AreVertGridLinesClipped()
-     */
-    bool AreHorzGridLinesClipped() const;
 
     /**
-        Return @true if the vertical grid lines stop at the last row
-        boundary or @false if they continue to the end of the window.
-
-        The default is to clip grid lines.
-
-        @see ClipVertGridLines(), AreHorzGridLinesClipped()
+        @name Grid Line Formatting
      */
-    bool AreVertGridLinesClipped() const;
+    //@{
 
     /**
-        Automatically sets the height and width of all rows and columns to fit their
-        contents.
+        Turns the drawing of grid lines on or off.
     */
-    void AutoSize();
+    void EnableGridLines(bool enable = true);
 
     /**
-        Automatically adjusts width of the column to fit its label.
+        Returns the pen used for vertical grid lines.
+
+        This virtual function may be overridden in derived classes in order to
+        change the appearance of individual grid lines for the given column
+        @a col.
+
+        See GetRowGridLinePen() for an example.
     */
-    void AutoSizeColLabelSize(int col);
+    virtual wxPen GetColGridLinePen(int col);
 
     /**
-        Automatically sizes the column to fit its contents. If setAsMin is @true the
-        calculated width will
-        also be set as the minimal width for the column.
+        Returns the pen used for grid lines.
+
+        This virtual function may be overridden in derived classes in order to
+        change the appearance of grid lines. Note that currently the pen width
+        must be 1.
+
+        @see GetColGridLinePen(), GetRowGridLinePen()
     */
-    void AutoSizeColumn(int col, bool setAsMin = true);
+    virtual wxPen GetDefaultGridLinePen();
 
     /**
-        Automatically sizes all columns to fit their contents. If setAsMin is @true the
-        calculated widths will
-        also be set as the minimal widths for the columns.
+        Returns the colour used for grid lines.
+
+        @see GetDefaultGridLinePen()
     */
-    void AutoSizeColumns(bool setAsMin = true);
+    wxColour GetGridLineColour() const;
 
     /**
-        Automatically sizes the row to fit its contents. If setAsMin is @true the
-        calculated height will
-        also be set as the minimal height for the row.
+        Returns the pen used for horizontal grid lines.
+
+        This virtual function may be overridden in derived classes in order to
+        change the appearance of individual grid line for the given @a row.
+
+        Example:
+        @code
+        // in a grid displaying music notation, use a solid black pen between
+        // octaves (C0=row 127, C1=row 115 etc.)
+        wxPen MidiGrid::GetRowGridLinePen(int row)
+        {
+            if ( row % 12 == 7 )
+                return wxPen(*wxBLACK, 1, wxSOLID);
+            else
+                return GetDefaultGridLinePen();
+        }
+        @endcode
     */
-    void AutoSizeRow(int row, bool setAsMin = true);
+    virtual wxPen GetRowGridLinePen(int row);
 
     /**
-        Automatically adjusts height of the row to fit its label.
+        Returns @true if drawing of grid lines is turned on, @false otherwise.
     */
-    void AutoSizeRowLabelSize(int col);
+    bool GridLinesEnabled() const;
 
     /**
-        Automatically sizes all rows to fit their contents. If setAsMin is @true the
-        calculated heights will
-        also be set as the minimal heights for the rows.
+        Sets the colour used to draw grid lines.
     */
-    void AutoSizeRows(bool setAsMin = true);
+    void SetGridLineColour(const wxColour& colour);
 
-    /**
-        Increments the grid's batch count.
+    //@}
 
-        When the count is greater than zero repainting of the grid is
-        suppressed. Each call to BeginBatch must be matched by a later call to
-        EndBatch(). Code that does a lot of grid modification can be enclosed
-        between BeginBatch and EndBatch calls to avoid screen flicker. The
-        final EndBatch will cause the grid to be repainted.
 
-        Notice that you should use wxGridUpdateLocker which ensures that there
-        is always a matching EndBatch() call for this BeginBatch() if possible
-        instead of calling this method directly.
-    */
-    void BeginBatch();
+    /**
+        @name Label Values and Formatting
+     */
+    //@{
 
     /**
-        Convert grid cell coordinates to grid window pixel coordinates.
+        Sets the arguments to the current column label alignment values.
 
-        This function returns the rectangle that encloses the block of cells
-        limited by @a topLeft and @a bottomRight cell in device coords and
-        clipped to the client size of the grid window.
+        Horizontal alignment will be one of @c wxALIGN_LEFT, @c wxALIGN_CENTRE
+        or @c wxALIGN_RIGHT.
 
-        @see CellToRect()
+        Vertical alignment will be one of @c wxALIGN_TOP, @c wxALIGN_CENTRE or
+        @c wxALIGN_BOTTOM.
     */
-    wxRect BlockToDeviceRect(const wxGridCellCoords& topLeft,
-                             const wxGridCellCoords& bottomRight) const;
+    void GetColLabelAlignment(int* horiz, int* vert) const;
 
     /**
-        Returns @true if columns can be moved by dragging with the mouse.
-
-        Columns can be moved by dragging on their labels.
+        Returns the orientation of the column labels (either @c wxHORIZONTAL or
+        @c wxVERTICAL).
     */
-    bool CanDragColMove() const;
+    int GetColLabelTextOrientation() const;
 
     /**
-        Returns @true if columns can be resized by dragging with the mouse.
+        Returns the specified column label.
 
-        Columns can be resized by dragging the edges of their labels. If grid
-        line dragging is enabled they can also be resized by dragging the right
-        edge of the column in the grid cell area (see
-        wxGrid::EnableDragGridSize).
+        The default grid table class provides column labels of the form
+        A,B...Z,AA,AB...ZZ,AAA... If you are using a custom grid table you can
+        override wxGridTableBase::GetColLabelValue() to provide your own
+        labels.
     */
-    bool CanDragColSize() const;
+    wxString GetColLabelValue(int col) const;
 
     /**
-        Return @true if the dragging of grid lines to resize rows and columns
-        is enabled or @false otherwise.
+        Returns the colour used for the background of row and column labels.
     */
-    bool CanDragGridSize() const;
+    wxColour GetLabelBackgroundColour() const;
 
     /**
-        Returns @true if rows can be resized by dragging with the mouse.
+        Returns the font used for row and column labels.
+    */
+    wxFont GetLabelFont() const;
 
-        Rows can be resized by dragging the edges of their labels. If grid line
-        dragging is enabled they can also be resized by dragging the lower edge
-        of the row in the grid cell area (see wxGrid::EnableDragGridSize).
+    /**
+        Returns the colour used for row and column label text.
     */
-    bool CanDragRowSize() const;
+    wxColour GetLabelTextColour() const;
 
     /**
-        Returns @true if the in-place edit control for the current grid cell
-        can be used and @false otherwise.
+        Returns the alignment used for row labels.
 
-        This function always returns @false for the read-only cells.
+        Horizontal alignment will be one of @c wxALIGN_LEFT, @c wxALIGN_CENTRE
+        or @c wxALIGN_RIGHT.
+
+        Vertical alignment will be one of @c wxALIGN_TOP, @c wxALIGN_CENTRE or
+        @c wxALIGN_BOTTOM.
     */
-    bool CanEnableCellControl() const;
+    void GetRowLabelAlignment(int* horiz, int* vert) const;
 
-    //@{
     /**
-        Return the rectangle corresponding to the grid cell's size and position
-        in logical coordinates.
+        Returns the specified row label.
 
-        @see BlockToDeviceRect()
+        The default grid table class provides numeric row labels. If you are
+        using a custom grid table you can override
+        wxGridTableBase::GetRowLabelValue() to provide your own labels.
     */
-    wxRect CellToRect(int row, int col) const;
-    const wxRect CellToRect(const wxGridCellCoords& coords) const;
+    wxString GetRowLabelValue(int row) const;
 
-    //@}
+    /**
+        Hides the column labels by calling SetColLabelSize() with a size of 0.
+        Show labels again by calling that method with a width greater than 0.
+    */
+    void HideColLabels();
 
     /**
-        Clears all data in the underlying grid table and repaints the grid.
+        Hides the row labels by calling SetRowLabelSize() with a size of 0.
 
-        The table is not deleted by this function. If you are using a derived
-        table class then you need to override wxGridTableBase::Clear() for this
-        function to have any effect.
+        The labels can be shown again by calling SetRowLabelSize() with a width
+        greater than 0.
     */
-    void ClearGrid();
+    void HideRowLabels();
 
     /**
-        Deselects all cells that are currently selected.
+        Sets the horizontal and vertical alignment of column label text.
+
+        Horizontal alignment should be one of @c wxALIGN_LEFT,
+        @c wxALIGN_CENTRE or @c wxALIGN_RIGHT. Vertical alignment should be one
+        of @c wxALIGN_TOP, @c wxALIGN_CENTRE or @c wxALIGN_BOTTOM.
     */
-    void ClearSelection();
+    void SetColLabelAlignment(int horiz, int vert);
 
     /**
-        Change whether the horizontal grid lines are clipped by the end of the
-        last column.
+        Sets the orientation of the column labels (either @c wxHORIZONTAL or
+        @c wxVERTICAL).
+    */
+    void SetColLabelTextOrientation(int textOrientation);
 
-        By default the grid lines are not drawn beyond the end of the last
-        column but after calling this function with @a clip set to @false they
-        will be drawn across the entire grid window.
+    /**
+        Set the value for the given column label.
 
-        @see AreHorzGridLinesClipped(), ClipVertGridLines()
-     */
-    void ClipHorzGridLines(bool clip);
+        If you are using a custom grid table you must override
+        wxGridTableBase::SetColLabelValue() for this to have any effect.
+    */
+    void SetColLabelValue(int col, const wxString& value);
 
     /**
-        Change whether the vertical grid lines are clipped by the end of the
-        last row.
+        Sets the background colour for row and column labels.
+    */
+    void SetLabelBackgroundColour(const wxColour& colour);
 
-        By default the grid lines are not drawn beyond the end of the last
-        row but after calling this function with @a clip set to @false they
-        will be drawn across the entire grid window.
+    /**
+        Sets the font for row and column labels.
+    */
+    void SetLabelFont(const wxFont& font);
 
-        @see AreVertzGridLinesClipped(), ClipHorzGridLines()
-     */
-    void ClipVertzGridLines(bool clip);
+    /**
+        Sets the colour for row and column label text.
+    */
+    void SetLabelTextColour(const wxColour& colour);
 
     /**
-        Creates a grid with the specified initial number of rows and columns.
+        Sets the horizontal and vertical alignment of row label text.
 
-        Call this directly after the grid constructor. When you use this
-        function wxGrid will create and manage a simple table of string values
-        for you. All of the grid data will be stored in memory.
-        For applications with more complex data types or relationships, or for
-        dealing with very large datasets, you should derive your own grid table
-        class and pass a table object to the grid with SetTable().
+        Horizontal alignment should be one of @c wxALIGN_LEFT,
+        @c wxALIGN_CENTRE or @c wxALIGN_RIGHT. Vertical alignment should be one
+        of @c wxALIGN_TOP, @c wxALIGN_CENTRE or @c wxALIGN_BOTTOM.
     */
-    bool CreateGrid(int numRows, int numCols,
-                    wxGridSelectionModes selmode = wxGridSelectCells);
+    void SetRowLabelAlignment(int horiz, int vert);
 
     /**
-        Deletes one or more columns from a grid starting at the specified
-        position.
-
-        The @a updateLabels argument is not used at present. If you are using a
-        derived grid table class you will need to override
-        wxGridTableBase::DeleteCols. See InsertCols() for further information.
+        Sets the value for the given row label.
 
-        @return @true on success or @false if deleting columns failed.
+        If you are using a derived grid table you must override
+        wxGridTableBase::SetRowLabelValue() for this to have any effect.
     */
-    bool DeleteCols(int pos = 0, int numCols = 1, bool updateLabels = true);
+    void SetRowLabelValue(int row, const wxString& value);
 
     /**
-        Deletes one or more rows from a grid starting at the specified position.
+        Call this in order to make the column labels use a native look by using
+        wxRendererNative::DrawHeaderButton() internally.
 
-        The @a updateLabels argument is not used at present. If you are using a
-        derived grid table class you will need to override
-        wxGridTableBase::DeleteRows. See InsertRows() for further information.
+        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.
 
-        @return @true on success or @false if appending rows failed.
+        @see UseNativeColHeader()
     */
-    bool DeleteRows(int pos = 0, int numRows = 1, bool updateLabels = true);
+    void SetUseNativeColLabels(bool native = true);
 
     /**
-        Disables in-place editing of grid cells.
+        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.
+
+        Another difference between the default behaviour and the native header
+        behaviour is that the latter provides the user with a context menu
+        (which appears on right clicking the header) allowing to rearrange the
+        grid columns if CanDragColMove() returns @true. If you want to prevent
+        this from happening for some reason, you need to define a handler for
+        @c wxEVT_GRID_LABEL_RIGHT_CLICK event which simply does nothing (in
+        particular doesn't skip the event) as this will prevent the default
+        right click handling from working.
+
+        Also note that currently @c wxEVT_GRID_LABEL_RIGHT_DCLICK event is 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);
+
+    //@}
 
-        Equivalent to calling EnableCellEditControl(@false).
-    */
-    void DisableCellEditControl();
 
     /**
-        Disables column moving by dragging with the mouse.
+        @name Cell Formatting
 
-        Equivalent to passing @false to EnableDragColMove().
-    */
-    void DisableDragColMove();
+        Note that wxGridCellAttr can be used alternatively to most of these
+        methods. See the "Attributes Management" of wxGridTableBase.
+     */
+    //@{
 
     /**
-        Disables column sizing by dragging with the mouse.
+        Sets the arguments to the horizontal and vertical text alignment values
+        for the grid cell at the specified location.
 
-        Equivalent to passing @false to EnableDragColSize().
+        Horizontal alignment will be one of @c wxALIGN_LEFT, @c wxALIGN_CENTRE
+        or @c wxALIGN_RIGHT.
+
+        Vertical alignment will be one of @c wxALIGN_TOP, @c wxALIGN_CENTRE or
+        @c wxALIGN_BOTTOM.
     */
-    void DisableDragColSize();
+    void GetCellAlignment(int row, int col, int* horiz, int* vert) const;
 
     /**
-        Disable mouse dragging of grid lines to resize rows and columns.
-
-        Equivalent to passing @false to EnableDragGridSize()
+        Returns the background colour of the cell at the specified location.
     */
-    void DisableDragGridSize();
+    wxColour GetCellBackgroundColour(int row, int col) const;
 
     /**
-        Disables row sizing by dragging with the mouse.
+        Returns the font for text in the grid cell at the specified location.
+    */
+    wxFont GetCellFont(int row, int col) const;
 
-        Equivalent to passing @false to EnableDragRowSize().
+    /**
+        Returns the text colour for the grid cell at the specified location.
     */
-    void DisableDragRowSize();
+    wxColour GetCellTextColour(int row, int col) const;
 
     /**
-        Enables or disables in-place editing of grid cell data.
+        Returns the default cell alignment.
+
+        Horizontal alignment will be one of @c wxALIGN_LEFT, @c wxALIGN_CENTRE
+        or @c wxALIGN_RIGHT.
+
+        Vertical alignment will be one of @c wxALIGN_TOP, @c wxALIGN_CENTRE or
+        @c wxALIGN_BOTTOM.
 
-        The grid will issue either a wxEVT_GRID_EDITOR_SHOWN or
-        wxEVT_GRID_EDITOR_HIDDEN event.
+        @see SetDefaultCellAlignment()
     */
-    void EnableCellEditControl(bool enable = true);
+    void GetDefaultCellAlignment(int* horiz, int* vert) const;
 
     /**
-        Enables or disables column moving by dragging with the mouse.
+        Returns the current default background colour for grid cells.
     */
-    void EnableDragColMove(bool enable = true);
+    wxColour GetDefaultCellBackgroundColour() const;
 
     /**
-        Enables or disables column sizing by dragging with the mouse.
+        Returns the current default font for grid cell text.
     */
-    void EnableDragColSize(bool enable = true);
+    wxFont GetDefaultCellFont() const;
 
     /**
-        Enables or disables row and column resizing by dragging gridlines with the
-        mouse.
+        Returns the current default colour for grid cell text.
     */
-    void EnableDragGridSize(bool enable = true);
+    wxColour GetDefaultCellTextColour() const;
 
     /**
-        Enables or disables row sizing by dragging with the mouse.
-    */
-    void EnableDragRowSize(bool enable = true);
+        Sets the horizontal and vertical alignment for grid cell text at the
+        specified location.
 
+        Horizontal alignment should be one of @c wxALIGN_LEFT,
+        @c wxALIGN_CENTRE or @c wxALIGN_RIGHT.
+
+        Vertical alignment should be one of @c wxALIGN_TOP, @c wxALIGN_CENTRE
+        or @c wxALIGN_BOTTOM.
+    */
+    void SetCellAlignment(int row, int col, int horiz, int vert);
     /**
-        Makes the grid globally editable or read-only.
+        Sets the horizontal and vertical alignment for grid cell text at the
+        specified location.
 
-        If the edit argument is @false this function sets the whole grid as
-        read-only. If the argument is @true the grid is set to the default
-        state where cells may be editable. In the default state you can set
-        single grid cells and whole rows and columns to be editable or
-        read-only via wxGridCellAttribute::SetReadOnly. For single cells you
-        can also use the shortcut function SetReadOnly().
+        Horizontal alignment should be one of @c wxALIGN_LEFT,
+        @c wxALIGN_CENTRE or @c wxALIGN_RIGHT.
 
-        For more information about controlling grid cell attributes see the
-        wxGridCellAttr cell attribute class and the
-        @ref overview_grid "wxGrid overview".
+        Vertical alignment should be one of @c wxALIGN_TOP, @c wxALIGN_CENTRE
+        or @c wxALIGN_BOTTOM.
     */
-    void EnableEditing(bool edit);
+    void SetCellAlignment(int align, int row, int col);
 
     /**
-        Turns the drawing of grid lines on or off.
+        Set the background colour for the given cell or all cells by default.
     */
-    void EnableGridLines(bool enable = true);
+    void SetCellBackgroundColour(int row, int col, const wxColour& colour);
 
     /**
-        Decrements the grid's batch count.
+        Sets the font for text in the grid cell at the specified location.
+    */
+    void SetCellFont(int row, int col, const wxFont& font);
 
-        When the count is greater than zero repainting of the grid is
-        suppressed. Each previous call to BeginBatch() must be matched by a
-        later call to EndBatch. Code that does a lot of grid modification can
-        be enclosed between BeginBatch and EndBatch calls to avoid screen
-        flicker. The final EndBatch will cause the grid to be repainted.
+    /**
+        Sets the text colour for the given cell.
+    */
+    void SetCellTextColour(int row, int col, const wxColour& colour);
+    /**
+        Sets the text colour for the given cell.
+    */
+    void SetCellTextColour(const wxColour& val, int row, int col);
+    /**
+        Sets the text colour for all cells by default.
+    */
+    void SetCellTextColour(const wxColour& colour);
 
-        @see wxGridUpdateLocker
+    /**
+        Sets the default horizontal and vertical alignment for grid cell text.
+
+        Horizontal alignment should be one of @c wxALIGN_LEFT,
+        @c wxALIGN_CENTRE or @c wxALIGN_RIGHT. Vertical alignment should be one
+        of @c wxALIGN_TOP, @c wxALIGN_CENTRE or @c wxALIGN_BOTTOM.
     */
-    void EndBatch();
+    void SetDefaultCellAlignment(int horiz, int vert);
 
     /**
-        Overridden wxWindow method.
+        Sets the default background colour for grid cells.
     */
-    virtual void Fit();
+    void SetDefaultCellBackgroundColour(const wxColour& colour);
 
     /**
-        Causes immediate repainting of the grid.
+        Sets the default font to be used for grid cell text.
+    */
+    void SetDefaultCellFont(const wxFont& font);
 
-        Use this instead of the usual wxWindow::Refresh.
+    /**
+        Sets the current default colour for grid cell text.
     */
-    void ForceRefresh();
+    void SetDefaultCellTextColour(const wxColour& colour);
+
+    //@}
+
+
+    /**
+        @name Cell Values, Editors, and Renderers
+
+        Note that wxGridCellAttr can be used alternatively to most of these
+        methods. See the "Attributes Management" of wxGridTableBase.
+     */
+    //@{
 
     /**
-        Returns the number of times that BeginBatch() has been called
-        without (yet) matching calls to EndBatch(). While
-        the grid's batch count is greater than zero the display will not be updated.
+        Returns @true if the in-place edit control for the current grid cell
+        can be used and @false otherwise.
+
+        This function always returns @false for the read-only cells.
     */
-    int GetBatchCount();
+    bool CanEnableCellControl() const;
 
     /**
-        Sets the arguments to the horizontal and vertical text alignment values
-        for the grid cell at the specified location.
+        Disables in-place editing of grid cells.
 
-        Horizontal alignment will be one of @c wxALIGN_LEFT, @c wxALIGN_CENTRE
-        or @c wxALIGN_RIGHT.
+        Equivalent to calling EnableCellEditControl(@false).
+    */
+    void DisableCellEditControl();
 
-        Vertical alignment will be one of @c wxALIGN_TOP, @c wxALIGN_CENTRE or
-        @c wxALIGN_BOTTOM.
+    /**
+        Enables or disables in-place editing of grid cell data.
+
+        The grid will issue either a @c wxEVT_GRID_EDITOR_SHOWN or
+        @c wxEVT_GRID_EDITOR_HIDDEN event.
     */
-    void GetCellAlignment(int row, int col, int* horiz, int* vert) const;
+    void EnableCellEditControl(bool enable = true);
 
     /**
-        Returns the background colour of the cell at the specified location.
+        Makes the grid globally editable or read-only.
+
+        If the edit argument is @false this function sets the whole grid as
+        read-only. If the argument is @true the grid is set to the default
+        state where cells may be editable. In the default state you can set
+        single grid cells and whole rows and columns to be editable or
+        read-only via wxGridCellAttr::SetReadOnly(). For single cells you
+        can also use the shortcut function SetReadOnly().
+
+        For more information about controlling grid cell attributes see the
+        wxGridCellAttr class and the @ref overview_grid.
     */
-    wxColour GetCellBackgroundColour(int row, int col) const;
+    void EnableEditing(bool edit);
 
     /**
         Returns a pointer to the editor for the cell at the specified location.
 
-        See wxGridCellEditor and the @ref overview_grid "wxGrid overview"
-        for more information about cell editors and renderers.
+        See wxGridCellEditor and the @ref overview_grid for more information
+        about cell editors and renderers.
 
         The caller must call DecRef() on the returned pointer.
     */
     wxGridCellEditor* GetCellEditor(int row, int col) const;
 
-    /**
-        Returns the font for text in the grid cell at the specified location.
-    */
-    wxFont GetCellFont(int row, int col) const;
-
     /**
         Returns a pointer to the renderer for the grid cell at the specified
         location.
 
-        See wxGridCellRenderer and the @ref overview_grid "wxGrid overview"
-        for more information about cell editors and renderers.
+        See wxGridCellRenderer and the @ref overview_grid for more information
+        about cell editors and renderers.
 
         The caller must call DecRef() on the returned pointer.
     */
     wxGridCellRenderer* GetCellRenderer(int row, int col) const;
 
-    /**
-        Returns the text colour for the grid cell at the specified location.
-    */
-    wxColour GetCellTextColour(int row, int col) const;
-
-    //@{
     /**
         Returns the string contained in the cell at the specified location.
 
@@ -1538,119 +2266,46 @@ public:
         data types (e.g. numeric, boolean or user-defined custom types) then
         you only use this function for those cells that contain string values.
 
-        See wxGridTableBase::CanGetValueAs and the @ref overview_grid "wxGrid overview"
-        for more information.
+        See wxGridTableBase::CanGetValueAs() and the @ref overview_grid for
+        more information.
     */
     wxString GetCellValue(int row, int col) const;
-    const wxString  GetCellValue(const wxGridCellCoords& coords) const;
-    //@}
-
     /**
-        Returns the column ID of the specified column position.
+        Returns the string contained in the cell at the specified location.
+
+        For simple applications where a grid object automatically uses a
+        default grid table of string values you use this function together with
+        SetCellValue() to access cell values. For more complex applications
+        where you have derived your own grid table class that contains various
+        data types (e.g. numeric, boolean or user-defined custom types) then
+        you only use this function for those cells that contain string values.
+
+        See wxGridTableBase::CanGetValueAs() and the @ref overview_grid for
+        more information.
     */
-    int GetColAt(int colPos) const;
+    wxString GetCellValue(const wxGridCellCoords& coords) const;
 
     /**
-        Returns the pen used for vertical grid lines.
-
-        This virtual function may be overridden in derived classes in order to
-        change the appearance of individual grid lines for the given column @e
-        col.
+        Returns a pointer to the current default grid cell editor.
 
-        See GetRowGridLinePen() for an example.
+        See wxGridCellEditor and the @ref overview_grid for more information
+        about cell editors and renderers.
     */
-    virtual wxPen GetColGridLinePen(int col);
+    wxGridCellEditor* GetDefaultEditor() const;
 
     /**
-        Sets the arguments to the current column label alignment values.
-
-        Horizontal alignment will be one of @c wxALIGN_LEFT, @c wxALIGN_CENTRE
-        or @c wxALIGN_RIGHT.
-
-        Vertical alignment will be one of @c wxALIGN_TOP, @c wxALIGN_CENTRE or
-        @c wxALIGN_BOTTOM.
-    */
-    void GetColLabelAlignment(int* horiz, int* vert) const;
-
-    /**
-        Returns the current height of the column labels.
-    */
-    int GetColLabelSize() const;
-
-    /**
-        Returns the specified column label.
-
-        The default grid table class provides column labels of the form
-        A,B...Z,AA,AB...ZZ,AAA... If you are using a custom grid table you can
-        override wxGridTableBase::GetColLabelValue to provide your own labels.
-    */
-    wxString GetColLabelValue(int col) const;
-
-    /**
-        Returns the minimal width to which a column may be resized.
-
-        Use SetColMinimalAcceptableWidth() to change this value globally or
-        SetColMinimalWidth() to do it for individual columns.
-    */
-    int GetColMinimalAcceptableWidth() const;
-
-    /**
-        Returns the position of the specified column.
-    */
-    int GetColPos(int colID) const;
-
-    /**
-        Returns the width of the specified column.
-    */
-    int GetColSize(int col) const;
-
-    /**
-        Returns the default cell alignment.
-
-        Horizontal alignment will be one of @c wxALIGN_LEFT, @c wxALIGN_CENTRE
-        or @c wxALIGN_RIGHT.
-
-        Vertical alignment will be one of @c wxALIGN_TOP, @c wxALIGN_CENTRE or
-        @c wxALIGN_BOTTOM.
-
-        @see SetDefaultCellAlignment()
-    */
-    void GetDefaultCellAlignment(int* horiz, int* vert) const;
-
-    /**
-        Returns the current default background colour for grid cells.
-    */
-    wxColour GetDefaultCellBackgroundColour() const;
-
-    /**
-        Returns the current default font for grid cell text.
-    */
-    wxFont GetDefaultCellFont() const;
-
-    /**
-        Returns the current default colour for grid cell text.
-    */
-    wxColour GetDefaultCellTextColour() const;
-
-    /**
-        Returns the default height for column labels.
-    */
-    int GetDefaultColLabelSize() const;
+        Returns the default editor for the specified cell.
 
-    /**
-        Returns the current default width for grid columns.
-    */
-    int GetDefaultColSize() const;
+        The base class version returns the editor appropriate for the current
+        cell type but this method may be overridden in the derived classes to
+        use custom editors for some cells by default.
 
-    /**
-        Returns a pointer to the current default grid cell editor.
+        Notice that the same may be achieved in a usually simpler way by
+        associating a custom editor with the given cell or cells.
 
-        See wxGridCellEditor and the @ref overview_grid "wxGrid overview"
-        for more information about cell editors and renderers.
+        The caller must call DecRef() on the returned pointer.
     */
-    wxGridCellEditor* GetDefaultEditor() const;
-
-    //@{
+    virtual wxGridCellEditor* GetDefaultEditorForCell(int row, int col) const;
     /**
         Returns the default editor for the specified cell.
 
@@ -1658,14 +2313,12 @@ public:
         cell type but this method may be overridden in the derived classes to
         use custom editors for some cells by default.
 
-        Notice that the same may be usually achieved in simpler way by
+        Notice that the same may be achieved in a usually simpler way by
         associating a custom editor with the given cell or cells.
 
         The caller must call DecRef() on the returned pointer.
     */
-    virtual wxGridCellEditor* GetDefaultEditorForCell(int row, int col) const;
-    wxGridCellEditor*  GetDefaultEditorForCell(const wxGridCellCoords& c) const;
-    //@}
+    wxGridCellEditor* GetDefaultEditorForCell(const wxGridCellCoords& c) const;
 
     /**
         Returns the default editor for the cells containing values of the given
@@ -1678,25 +2331,13 @@ public:
 
         The caller must call DecRef() on the returned pointer.
     */
-    virtual wxGridCellEditor *
-    GetDefaultEditorForType(const wxString& typeName) const;
-
-    /**
-        Returns the pen used for grid lines.
-
-        This virtual function may be overridden in derived classes in order to
-        change the appearance of grid lines. Note that currently the pen width
-        must be 1.
-
-        @see GetColGridLinePen(), GetRowGridLinePen()
-    */
-    virtual wxPen GetDefaultGridLinePen();
+    virtual wxGridCellEditor* GetDefaultEditorForType(const wxString& typeName) const;
 
     /**
         Returns a pointer to the current default grid cell renderer.
 
-        See wxGridCellRenderer and the @ref overview_grid "wxGrid overview"
-        for more information about cell editors and renderers.
+        See wxGridCellRenderer and the @ref overview_grid for more information
+        about cell editors and renderers.
 
         The caller must call DecRef() on the returned pointer.
     */
@@ -1711,7 +2352,7 @@ public:
 
         The caller must call DecRef() on the returned pointer.
     */
-    virtual wxGridCellRenderer *GetDefaultRendererForCell(int row, int col) const;
+    virtual wxGridCellRendererGetDefaultRendererForCell(int row, int col) const;
 
     /**
         Returns the default renderer for the cell containing values of the
@@ -1719,730 +2360,742 @@ public:
 
         @see GetDefaultEditorForType()
     */
-    virtual wxGridCellRenderer *
-    GetDefaultRendererForType(const wxString& typeName) const;
+    virtual wxGridCellRenderer* GetDefaultRendererForType(const wxString& typeName) const;
 
     /**
-        Returns the default width for the row labels.
+        Hides the in-place cell edit control.
     */
-    int GetDefaultRowLabelSize() const;
+    void HideCellEditControl();
 
     /**
-        Returns the current default height for grid rows.
+        Returns @true if the in-place edit control is currently enabled.
     */
-    int GetDefaultRowSize() const;
+    bool IsCellEditControlEnabled() const;
 
     /**
-        Returns the current grid cell column position.
-    */
-    int GetGridCursorCol() const;
+        Returns @true if the current cell is read-only.
 
-    /**
-        Returns the current grid cell row position.
+        @see SetReadOnly(), IsReadOnly()
     */
-    int GetGridCursorRow() const;
+    bool IsCurrentCellReadOnly() const;
 
     /**
-        Returns the colour used for grid lines.
+        Returns @false if the whole grid has been set as read-only or @true
+        otherwise.
 
-        @see GetDefaultGridLinePen()
+        See EnableEditing() for more information about controlling the editing
+        status of grid cells.
     */
-    wxColour GetGridLineColour() const;
+    bool IsEditable() const;
 
     /**
-        Returns the colour used for the background of row and column labels.
-    */
-    wxColour GetLabelBackgroundColour() const;
+        Returns @true if the cell at the specified location can't be edited.
 
-    /**
-        Returns the font used for row and column labels.
+        @see SetReadOnly(), IsCurrentCellReadOnly()
     */
-    wxFont GetLabelFont() const;
+    bool IsReadOnly(int row, int col) const;
 
     /**
-        Returns the colour used for row and column label text.
-    */
-    wxColour GetLabelTextColour() const;
+        Register a new data type.
 
-    /**
-        Returns the total number of grid columns.
+        The data types allow to naturally associate specific renderers and
+        editors to the cells containing values of the given type. For example,
+        the grid automatically registers a data type with the name
+        @c wxGRID_VALUE_STRING which uses wxGridCellStringRenderer and
+        wxGridCellTextEditor as its renderer and editor respectively -- this is
+        the data type used by all the cells of the default wxGridStringTable,
+        so this renderer and editor are used by default for all grid cells.
+
+        However if a custom table returns @c wxGRID_VALUE_BOOL from its
+        wxGridTableBase::GetTypeName() method, then wxGridCellBoolRenderer and
+        wxGridCellBoolEditor are used for it because the grid also registers a
+        boolean data type with this name.
+
+        And as this mechanism is completely generic, you may register your own
+        data types using your own custom renderers and editors. Just remember
+        that the table must identify a cell as being of the given type for them
+        to be used for this cell.
 
-        This is the same as the number of columns in the underlying grid
-        table.
+        @param typeName
+            Name of the new type. May be any string, but if the type name is
+            the same as the name of an already registered type, including one
+            of the standard ones (which are @c wxGRID_VALUE_STRING, @c
+            wxGRID_VALUE_BOOL, @c wxGRID_VALUE_NUMBER, @c wxGRID_VALUE_FLOAT
+            and @c wxGRID_VALUE_CHOICE), then the new registration information
+            replaces the previously used renderer and editor.
+        @param renderer
+            The renderer to use for the cells of this type. Its ownership is
+            taken by the grid, i.e. it will call DecRef() on this pointer when
+            it doesn't need it any longer.
+        @param editor
+            The editor to use for the cells of this type. Its ownership is also
+            taken by the grid.
     */
-    int GetNumberCols() const;
+    void RegisterDataType(const wxString& typeName,
+                          wxGridCellRenderer* renderer,
+                          wxGridCellEditor* editor);
 
     /**
-        Returns the total number of grid rows.
+        Sets the value of the current grid cell to the current in-place edit
+        control value.
 
-        This is the same as the number of rows in the underlying grid table.
+        This is called automatically when the grid cursor moves from the
+        current cell to a new cell. It is also a good idea to call this
+        function when closing a grid since any edits to the final cell location
+        will not be saved otherwise.
     */
-    int GetNumberRows() const;
+    void SaveEditControlValue();
 
     /**
-        Returns the attribute for the given cell creating one if necessary.
+        Sets the editor for the grid cell at the specified location.
 
-        If the cell already has an attribute, it is returned. Otherwise a new
-        attribute is created, associated with the cell and returned. In any
-        case the caller must call DecRef() on the returned pointer.
+        The grid will take ownership of the pointer.
 
-        This function may only be called if CanHaveAttributes() returns @true.
+        See wxGridCellEditor and the @ref overview_grid for more information
+        about cell editors and renderers.
     */
-    wxGridCellAttr *GetOrCreateCellAttr(int row, int col) const;
+    void SetCellEditor(int row, int col, wxGridCellEditor* editor);
 
     /**
-        Returns the pen used for horizontal grid lines.
+        Sets the renderer for the grid cell at the specified location.
 
-        This virtual function may be overridden in derived classes in order to
-        change the appearance of individual grid line for the given row @e row.
+        The grid will take ownership of the pointer.
 
-        Example:
-        @code
-           // in a grid displaying music notation, use a solid black pen between
-           // octaves (C0=row 127, C1=row 115 etc.)
-           wxPen MidiGrid::GetRowGridLinePen(int row)
-           {
-               if ( row % 12 == 7 )
-                  return wxPen(*wxBLACK, 1, wxSOLID);
-               else
-                  return GetDefaultGridLinePen();
-           }
-        @endcode
+        See wxGridCellRenderer and the @ref overview_grid for more information
+        about cell editors and renderers.
     */
-    virtual wxPen GetRowGridLinePen(int row);
+    void SetCellRenderer(int row, int col, wxGridCellRenderer* renderer);
 
     /**
-        Returns the alignment used for row labels.
+        Sets the string value for the cell at the specified location.
 
-        Horizontal alignment will be one of @c wxALIGN_LEFT, @c wxALIGN_CENTRE
-        or @c wxALIGN_RIGHT.
+        For simple applications where a grid object automatically uses a
+        default grid table of string values you use this function together with
+        GetCellValue() to access cell values. For more complex applications
+        where you have derived your own grid table class that contains various
+        data types (e.g. numeric, boolean or user-defined custom types) then
+        you only use this function for those cells that contain string values.
 
-        Vertical alignment will be one of @c wxALIGN_TOP, @c wxALIGN_CENTRE or
-        @c wxALIGN_BOTTOM.
+        See wxGridTableBase::CanSetValueAs() and the @ref overview_grid for
+        more information.
     */
-    void GetRowLabelAlignment(int* horiz, int* vert) const;
-
+    void SetCellValue(int row, int col, const wxString& s);
     /**
-        Returns the current width of the row labels.
-    */
-    int GetRowLabelSize() const;
+        Sets the string value for the cell at the specified location.
 
-    /**
-        Returns the specified row label.
+        For simple applications where a grid object automatically uses a
+        default grid table of string values you use this function together with
+        GetCellValue() to access cell values. For more complex applications
+        where you have derived your own grid table class that contains various
+        data types (e.g. numeric, boolean or user-defined custom types) then
+        you only use this function for those cells that contain string values.
 
-        The default grid table class provides numeric row labels. If you are
-        using a custom grid table you can override
-        wxGridTableBase::GetRowLabelValue to provide your own labels.
+        See wxGridTableBase::CanSetValueAs() and the @ref overview_grid for
+        more information.
     */
-    wxString GetRowLabelValue(int row) const;
-
+    void SetCellValue(const wxGridCellCoords& coords, const wxString& s);
     /**
-        Returns the minimal size to which rows can be resized.
+        @deprecated Please use SetCellValue(int,int,const wxString&) or
+                    SetCellValue(const wxGridCellCoords&,const wxString&)
+                    instead.
 
-        Use SetRowMinimalAcceptableHeight() to change this value globally or
-        SetRowMinimalHeight() to do it for individual cells.
+        Sets the string value for the cell at the specified location.
 
-        @see GetColMinimalAcceptableWidth()
+        For simple applications where a grid object automatically uses a
+        default grid table of string values you use this function together with
+        GetCellValue() to access cell values. For more complex applications
+        where you have derived your own grid table class that contains various
+        data types (e.g. numeric, boolean or user-defined custom types) then
+        you only use this function for those cells that contain string values.
+
+        See wxGridTableBase::CanSetValueAs() and the @ref overview_grid for
+        more information.
     */
-    int GetRowMinimalAcceptableHeight() const;
+    void SetCellValue(const wxString& val, int row, int col);
 
     /**
-        Returns the height of the specified row.
+        Sets the specified column to display boolean values.
+
+        @see SetColFormatCustom()
     */
-    int GetRowSize(int row) const;
+    void SetColFormatBool(int col);
 
     /**
-        Returns the number of pixels per horizontal scroll increment.
+        Sets the specified column to display data in a custom format.
 
-        The default is 15.
+        This method provides an alternative to defining a custom grid table
+        which would return @a typeName from its GetTypeName() method for the
+        cells in this column: while it doesn't really change the type of the
+        cells in this column, it does associate the renderer and editor used
+        for the cells of the specified type with them.
 
-        @see GetScrollLineY(), SetScrollLineX(), SetScrollLineY()
+        See the @ref overview_grid for more information on working with custom
+        data types.
     */
-    int GetScrollLineX() const;
+    void SetColFormatCustom(int col, const wxString& typeName);
 
     /**
-        Returns the number of pixels per vertical scroll increment.
-
-        The default is 15.
+        Sets the specified column to display floating point values with the
+        given width and precision.
 
-        @see GetScrollLineX(), SetScrollLineX(), SetScrollLineY()
+        @see SetColFormatCustom()
     */
-    int GetScrollLineY() const;
+    void SetColFormatFloat(int col, int width = -1, int precision = -1);
 
     /**
-        Returns an array of individually selected cells.
-
-        Notice that this array does @em not contain all the selected cells in
-        general as it doesn't include the cells selected as part of column, row
-        or block selection. You must use this method, GetSelectedCols(),
-        GetSelectedRows() and GetSelectionBlockTopLeft() and
-        GetSelectionBlockBottomRight() methods to obtain the entire selection
-        in general.
+        Sets the specified column to display integer values.
 
-        Please notice this behaviour is by design and is needed in order to
-        support grids of arbitrary size (when an entire column is selected in
-        a grid with a million of columns, we don't want to create an array with
-        a million of entries in this function, instead it returns an empty
-        array and GetSelectedCols() returns an array containing one element).
+        @see SetColFormatCustom()
     */
-    wxGridCellCoordsArray GetSelectedCells() const;
+    void SetColFormatNumber(int col);
 
     /**
-        Returns an array of selected columns.
+        Sets the default editor for grid cells.
 
-        Please notice that this method alone is not sufficient to find all the
-        selected columns as it contains only the columns which were
-        individually selected but not those being part of the block selection
-        or being selected in virtue of all of their cells being selected
-        individually, please see GetSelectedCells() for more details.
+        The grid will take ownership of the pointer.
+
+        See wxGridCellEditor and the @ref overview_grid for more information
+        about cell editors and renderers.
     */
-    wxArrayInt GetSelectedCols() const;
+    void SetDefaultEditor(wxGridCellEditor* editor);
 
     /**
-        Returns an array of selected rows.
+        Sets the default renderer for grid cells.
 
-        Please notice that this method alone is not sufficient to find all the
-        selected rows as it contains only the rows which were individually
-        selected but not those being part of the block selection or being
-        selected in virtue of all of their cells being selected individually,
-        please see GetSelectedCells() for more details.
+        The grid will take ownership of the pointer.
+
+        See wxGridCellRenderer and the @ref overview_grid for more information
+        about cell editors and renderers.
     */
-    wxArrayInt GetSelectedRows() const;
+    void SetDefaultRenderer(wxGridCellRenderer* renderer);
 
     /**
-        Access or update the selection fore/back colours
+        Makes the cell at the specified location read-only or editable.
+
+        @see IsReadOnly()
     */
-    wxColour GetSelectionBackground() const;
+    void SetReadOnly(int row, int col, bool isReadOnly = true);
 
     /**
-        Returns an array of the bottom right corners of blocks of selected
-        cells.
+        Displays the in-place cell edit control for the current cell.
+    */
+    void ShowCellEditControl();
 
-        Please see GetSelectedCells() for more information about the selection
-        representation in wxGrid.
+    //@}
 
-        @see GetSelectionBlockTopLeft()
-    */
-    wxGridCellCoordsArray GetSelectionBlockBottomRight() const;
 
     /**
-        Returns an array of the top left corners of blocks of selected cells.
-
-        Please see GetSelectedCells() for more information about the selection
-        representation in wxGrid.
+        @name Column and Row Sizes
 
-        @see GetSelectionBlockBottomRight()
-    */
-    wxGridCellCoordsArray GetSelectionBlockTopLeft() const;
+        @see @ref overview_grid_resizing
+     */
+    //@{
 
     /**
-        Returns the colour used for drawing the selection foreground.
+        Automatically sets the height and width of all rows and columns to fit
+        their contents.
     */
-    wxColour GetSelectionForeground() const;
+    void AutoSize();
 
     /**
-        Returns the current selection mode.
-
-        @see SetSelectionMode().
+        Automatically adjusts width of the column to fit its label.
     */
-    wxGridSelectionModes GetSelectionMode() const;
+    void AutoSizeColLabelSize(int col);
 
     /**
-        Returns a base pointer to the current table object.
-
-        The returned pointer is still owned by the grid.
+        Automatically sizes the column to fit its contents. If @a setAsMin is
+        @true the calculated width will also be set as the minimal width for
+        the column.
     */
-    wxGridTableBase *GetTable() const;
+    void AutoSizeColumn(int col, bool setAsMin = true);
 
-    //@{
     /**
-        Make the given cell current and ensure it is visible.
-
-        This method is equivalent to calling MakeCellVisible() and
-        SetGridCursor() and so, as with the latter, a wxEVT_GRID_SELECT_CELL
-        event is generated by it and the selected cell doesn't change if the
-        event is vetoed.
-     */
-    void GoToCell(int row, int col);
-    void GoToCell(const wxGridCellCoords& coords);
-    //@}
+        Automatically sizes all columns to fit their contents. If @a setAsMin
+        is @true the calculated widths will also be set as the minimal widths
+        for the columns.
+    */
+    void AutoSizeColumns(bool setAsMin = true);
 
     /**
-        Returns @true if drawing of grid lines is turned on, @false otherwise.
+        Automatically sizes the row to fit its contents. If @a setAsMin is
+        @true the calculated height will also be set as the minimal height for
+        the row.
     */
-    bool GridLinesEnabled() const;
+    void AutoSizeRow(int row, bool setAsMin = true);
 
     /**
-        Hides the in-place cell edit control.
+        Automatically adjusts height of the row to fit its label.
     */
-    void HideCellEditControl();
+    void AutoSizeRowLabelSize(int col);
 
     /**
-        Hides the column labels by calling SetColLabelSize()
-        with a size of 0. Show labels again by calling that method with
-        a width greater than 0.
+        Automatically sizes all rows to fit their contents. If @a setAsMin is
+        @true the calculated heights will also be set as the minimal heights
+        for the rows.
     */
-    void HideColLabels();
+    void AutoSizeRows(bool setAsMin = true);
 
     /**
-        Hides the row labels by calling SetRowLabelSize() with a size of 0.
-
-        The labels can be shown again by calling SetRowLabelSize() with a width
-        greater than 0.
+        Returns the current height of the column labels.
     */
-    void HideRowLabels();
+    int GetColLabelSize() const;
 
     /**
-        Inserts one or more new columns into a grid with the first new column
-        at the specified position.
+        Returns the minimal width to which a column may be resized.
 
-        Notice that inserting the columns in the grid requires grid table
-        cooperation: when this method is called, grid object begins by
-        requesting the underlying grid table to insert new columns. If this is
-        successful the table notifies the grid and the grid updates the
-        display. For a default grid (one where you have called
-        wxGrid::CreateGrid) this process is automatic. If you are using a
-        custom grid table (specified with wxGrid::SetTable) then you must
-        override wxGridTableBase::InsertCols() in your derived table class.
+        Use SetColMinimalAcceptableWidth() to change this value globally or
+        SetColMinimalWidth() to do it for individual columns.
 
-        @param pos
-            The position which the first newly inserted column will have.
-        @param numCols
-            The number of columns to insert.
-        @param updateLabels
-            Currently not used.
-        @return
-            @true if the columns were successfully inserted, @false if an error
-            occurred (most likely the table couldn't be updated).
+        @see GetRowMinimalAcceptableHeight()
     */
-    bool InsertCols(int pos = 0, int numCols = 1, bool updateLabels = true);
+    int GetColMinimalAcceptableWidth() const;
 
     /**
-        Inserts one or more new rows into a grid with the first new row at the
-        specified position.
+        Returns the width of the specified column.
+    */
+    int GetColSize(int col) const;
 
-        Notice that you must implement wxGridTableBase::InsertRows() if you use
-        a grid with a custom table, please see InsertCols() for more
-        information.
+    /**
+        Returns @true if the specified column is not currently hidden.
+     */
+    bool IsColShown(int col) const;
 
-        @param pos
-            The position which the first newly inserted row will have.
-        @param numRows
-            The number of rows to insert.
-        @param updateLabels
-            Currently not used.
-        @return
-            @true if the rows were successfully inserted, @false if an error
-            occurred (most likely the table couldn't be updated).
+    /**
+        Returns the default height for column labels.
     */
-    bool InsertRows(int pos = 0, int numRows = 1, bool updateLabels = true);
+    int GetDefaultColLabelSize() const;
 
     /**
-        Returns @true if the in-place edit control is currently enabled.
+        Returns the current default width for grid columns.
     */
-    bool IsCellEditControlEnabled() const;
+    int GetDefaultColSize() const;
 
     /**
-        Returns @true if the current cell is read-only.
+        Returns the default width for the row labels.
+    */
+    int GetDefaultRowLabelSize() const;
 
-        @see SetReadOnly(), IsReadOnly()
+    /**
+        Returns the current default height for grid rows.
     */
-    bool IsCurrentCellReadOnly() const;
+    int GetDefaultRowSize() const;
 
     /**
-        Returns @false if the whole grid has been set as read-only or @true
-        otherwise.
+        Returns the minimal size to which rows can be resized.
 
-        See EnableEditing() for more information about controlling the editing
-        status of grid cells.
+        Use SetRowMinimalAcceptableHeight() to change this value globally or
+        SetRowMinimalHeight() to do it for individual cells.
+
+        @see GetColMinimalAcceptableWidth()
     */
-    bool IsEditable() const;
+    int GetRowMinimalAcceptableHeight() const;
 
-    //@{
     /**
-        Is this cell currently selected?
+        Returns the current width of the row labels.
     */
-    bool IsInSelection(int row, int col) const;
-    bool IsInSelection(const wxGridCellCoords& coords) const;
-    //@}
+    int GetRowLabelSize() const;
 
     /**
-        Returns @true if the cell at the specified location can't be edited.
-
-        @see SetReadOnly(), IsCurrentCellReadOnly()
+        Returns the height of the specified row.
     */
-    bool IsReadOnly(int row, int col) const;
+    int GetRowSize(int row) const;
 
     /**
-        Returns @true if there are currently any selected cells, rows, columns
-        or blocks.
-    */
-    bool IsSelection() const;
+        Returns @true if the specified row is not currently hidden.
+     */
+    bool IsRowShown(int row) const;
 
-    //@{
     /**
-        Returns @true if a cell is either wholly or at least partially visible
-        in the grid window.
+        Sets the height of the column labels.
 
-        By default, the cell must be entirely visible for this function to
-        return true but if @a wholeCellVisible is @false, the function returns
-        @true even if the cell is only partially visible.
+        If @a height equals to @c wxGRID_AUTOSIZE then height is calculated
+        automatically so that no label is truncated. Note that this could be
+        slow for a large table.
     */
-    bool IsVisible(int row, int col, bool wholeCellVisible = true) const;
-    bool IsVisible(const wxGridCellCoords& coords,
-                   bool wholeCellVisible = true) const;
-    //@}
+    void SetColLabelSize(int height);
 
-    //@{
     /**
-        Brings the specified cell into the visible grid cell area with minimal
-        scrolling.
+        Sets the minimal @a width to which the user can resize columns.
 
-        Does nothing if the cell is already visible.
+        @see GetColMinimalAcceptableWidth()
     */
-    void MakeCellVisible(int row, int col);
-    void MakeCellVisible(const wxGridCellCoords& coords);
-    //@}
+    void SetColMinimalAcceptableWidth(int width);
 
     /**
-        Moves the grid cursor down by one row.
+        Sets the minimal @a width for the specified column @a col.
 
-        If a block of cells was previously selected it will expand if the
-        argument is @true or be cleared if the argument is @false.
+        It is usually best to call this method during grid creation as calling
+        it later will not resize the column to the given minimal width even if
+        it is currently narrower than it.
+
+        @a width must be greater than the minimal acceptable column width as
+        returned by GetColMinimalAcceptableWidth().
     */
-    bool MoveCursorDown(bool expandSelection);
+    void SetColMinimalWidth(int col, int width);
 
     /**
-        Moves the grid cursor down in the current column such that it skips to
-        the beginning or end of a block of non-empty cells.
+        Sets the width of the specified column.
 
-        If a block of cells was previously selected it will expand if the
-        argument is @true or be cleared if the argument is @false.
+        @param col
+            The column index.
+        @param width
+            The new column width in pixels, 0 to hide the column or -1 to fit
+            the column width to its label width.
     */
-    bool MoveCursorDownBlock(bool expandSelection);
+    void SetColSize(int col, int width);
 
     /**
-        Moves the grid cursor left by one column.
+        Hides the specified column.
 
-        If a block of cells was previously selected it will expand if the
-        argument is @true or be cleared if the argument is @false.
-    */
-    bool MoveCursorLeft(bool expandSelection);
+        To show the column later you need to call SetColSize() with non-0
+        width or ShowCol().
 
-    /**
-        Moves the grid cursor left in the current row such that it skips to the
-        beginning or end of a block of non-empty cells.
+        @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);
 
-        If a block of cells was previously selected it will expand if the
-        argument is @true or be cleared if the argument is @false.
-    */
-    bool MoveCursorLeftBlock(bool expandSelection);
 
     /**
-        Moves the grid cursor right by one column.
+        Sets the default width for columns in the grid.
 
-        If a block of cells was previously selected it will expand if the
-        argument is @true or be cleared if the argument is @false.
+        This will only affect columns subsequently added to the grid unless
+        @a resizeExistingCols is @true.
+
+        If @a width is less than GetColMinimalAcceptableWidth(), then the
+        minimal acceptable width is used instead of it.
     */
-    bool MoveCursorRight(bool expandSelection);
+    void SetDefaultColSize(int width, bool resizeExistingCols = false);
 
     /**
-        Moves the grid cursor right in the current row such that it skips to
-        the beginning or end of a block of non-empty cells.
+        Sets the default height for rows in the grid.
 
-        If a block of cells was previously selected it will expand if the
-        argument is @true or be cleared if the argument is @false.
+        This will only affect rows subsequently added to the grid unless
+        @a resizeExistingRows is @true.
+
+        If @a height is less than GetRowMinimalAcceptableHeight(), then the
+        minimal acceptable heihgt is used instead of it.
     */
-    bool MoveCursorRightBlock(bool expandSelection);
+    void SetDefaultRowSize(int height, bool resizeExistingRows = false);
 
     /**
-        Moves the grid cursor up by one row.
+        Sets the width of the row labels.
 
-        If a block of cells was previously selected it will expand if the
-        argument is @true or be cleared if the argument is @false.
+        If @a width equals @c wxGRID_AUTOSIZE then width is calculated
+        automatically so that no label is truncated. Note that this could be
+        slow for a large table.
     */
-    bool MoveCursorUp(bool expandSelection);
+    void SetRowLabelSize(int width);
 
     /**
-        Moves the grid cursor up in the current column such that it skips to
-        the beginning or end of a block of non-empty cells.
+        Sets the minimal row @a height used by default.
 
-        If a block of cells was previously selected it will expand if the
-        argument is @true or be cleared if the argument is @false.
+        See SetColMinimalAcceptableWidth() for more information.
     */
-    bool MoveCursorUpBlock(bool expandSelection);
+    void SetRowMinimalAcceptableHeight(int height);
 
     /**
-        Moves the grid cursor down by some number of rows so that the previous
-        bottom visible row becomes the top visible row.
+        Sets the minimal @a height for the specified @a row.
+
+        See SetColMinimalWidth() for more information.
     */
-    bool MovePageDown();
+    void SetRowMinimalHeight(int row, int height);
 
     /**
-        Moves the grid cursor up by some number of rows so that the previous
-        top visible row becomes the bottom visible row.
+        Sets the height of the specified row.
+
+        See SetColSize() for more information.
     */
-    bool MovePageUp();
+    void SetRowSize(int row, int height);
 
     /**
-        Register a new data type.
+        Hides the specified row.
 
-        The data types allow to naturally associate specific renderers and
-        editors to the cells containing values of the given type. For example,
-        the grid automatically registers a data type with the name @c
-        wxGRID_VALUE_STRING which uses wxGridCellStringRenderer and
-        wxGridCellTextEditor as its renderer and editor respectively -- this is
-        the data type used by all the cells of the default wxGridStringTable,
-        so this renderer and editor are used by default for all grid cells.
+        To show the row later you need to call SetRowSize() with non-0
+        width or ShowRow().
 
-        However if a custom table returns @c wxGRID_VALUE_BOOL from its
-        wxGridTableBase::GetTypeName() method, then wxGridCellBoolRenderer and
-        wxGridCellBoolEditor are used for it because the grid also registers a
-        boolean data type with this name.
+        @param col
+            The row index.
+     */
+    void HideRow(int col);
 
-        And as this mechanism is completely generic, you may register your own
-        data types using your own custom renderers and editors. Just remember
-        that the table must identify a cell as being of the given type for them
-        to be used for this cell.
+    /**
+        Shows the previously hidden row by resizing it to non-0 size.
 
-        @param typeName
-            Name of the new type. May be any string, but if the type name is
-            the same as the name of an already registered type, including one
-            of the standard ones (which are @c wxGRID_VALUE_STRING, @c
-            wxGRID_VALUE_BOOL, @c wxGRID_VALUE_NUMBER, @c wxGRID_VALUE_FLOAT
-            and @c wxGRID_VALUE_CHOICE), then the new registration information
-            replaces the previously used renderer and editor.
-        @param renderer
-            The renderer to use for the cells of this type. Its ownership is
-            taken by the grid, i.e. it will call DecRef() on this pointer when
-            it doesn't need it any longer.
-        @param editor
-            The editor to use for the cells of this type. Its ownership is also
-            taken by the grid.
-    */
-    void RegisterDataType(const wxString& typeName,
-                          wxGridCellRenderer* renderer,
-                          wxGridCellEditor* editor);
+        @see HideRow(), SetRowSize()
+     */
+    void ShowRow(int col);
 
     /**
-        Sets the value of the current grid cell to the current in-place edit
-        control value.
+        Get size information for all columns at once.
 
-        This is called automatically when the grid cursor moves from the
-        current cell to a new cell. It is also a good idea to call this
-        function when closing a grid since any edits to the final cell location
-        will not be saved otherwise.
-    */
-    void SaveEditControlValue();
+        This method is useful when the information about all column widths
+        needs to be saved. The widths can be later restored using
+        SetColSizes().
 
-    /**
-        Selects all cells in the grid.
-    */
-    void SelectAll();
+        @sa wxGridSizesInfo, GetRowSizes()
+     */
+    wxGridSizesInfo GetColSizes() const;
 
-    //@{
     /**
-        Selects a rectangular block of cells.
+        Get size information for all row at once.
 
-        If @a addToSelected is @false then any existing selection will be
-        deselected; if @true the column will be added to the existing
-        selection.
-    */
-    void SelectBlock(int topRow, int leftCol, int bottomRow, int rightCol,
-                     bool addToSelected = false);
-    void SelectBlock(const wxGridCellCoords& topLeft,
-                     const wxGridCellCoords& bottomRight,
-                     bool addToSelected = false);
-    //@}
+        @sa wxGridSizesInfo, GetColSizes()
+     */
+    wxGridSizesInfo GetRowSizes() const;
 
     /**
-        Selects the specified column.
+        Restore all columns sizes.
 
-        If @a addToSelected is @false then any existing selection will be
-        deselected; if @true the column will be added to the existing
-        selection.
+        This is usually called with wxGridSizesInfo object previously returned
+        by GetColSizes().
 
-        This method won't select anything if the current selection mode is
-        wxGridSelectRows.
-    */
-    void SelectCol(int col, bool addToSelected = false);
+        @sa SetRowSizes()
+     */
+    void SetColSizes(const wxGridSizesInfo& sizeInfo);
 
     /**
-        Selects the specified row.
+        Restore all rows sizes.
 
-        If @a addToSelected is @false then any existing selection will be
-        deselected; if @true the row will be added to the existing selection.
+        @sa SetColSizes()
+     */
+    void SetRowSizes(const wxGridSizesInfo& sizeInfo);
 
-        This method won't select anything if the current selection mode is
-        wxGridSelectColumns.
-    */
-    void SelectRow(int row, bool addToSelected = false);
+    /**
+        Set the size of the cell.
+
+        Specifying a value of more than 1 in @a num_rows or @a num_cols will
+        make the cell at (@a row, @a col) span the block of the specified size,
+        covering the other cells which would be normally shown in it. Passing 1
+        for both arguments resets the cell to normal appearance.
+
+        @see GetCellSize()
+
+        @param row
+            The row of the cell.
+        @param col
+            The column of the cell.
+        @param num_rows
+            Number of rows to be occupied by this cell, must be >= 1.
+        @param num_cols
+            Number of columns to be occupied by this cell, must be >= 1.
+     */
+    void SetCellSize(int row, int col, int num_rows, int num_cols);
 
-    //@{
     /**
-        Sets the horizontal and vertical alignment for grid cell text at the
-        specified location.
+        Get the size of the cell in number of cells covered by it.
 
-        Horizontal alignment should be one of @c wxALIGN_LEFT, @c
-        wxALIGN_CENTRE or @c wxALIGN_RIGHT.
+        For normal cells, the function fills both @a num_rows and @a num_cols
+        with 1 and returns CellSpan_None. For cells which span multiple cells, i.e.
+        for which SetCellSize() had been called, the returned values are the
+        same ones as were passed to SetCellSize() call and the function return
+        value is CellSpan_Main.
 
-        Vertical alignment should be one of @c wxALIGN_TOP, @c wxALIGN_CENTRE
-        or @c wxALIGN_BOTTOM.
-    */
-    void SetCellAlignment(int row, int col, int horiz, int vert);
-    void SetCellAlignment(int align, int row, int col);
-    //@}
+        More unexpectedly, perhaps, the returned values may be @em negative for
+        the cells which are inside a span covered by a cell occupying multiple
+        rows or columns. They correspond to the offset of the main cell of the
+        span from the cell passed to this functions and the function returns
+        CellSpan_Inside value to indicate this.
+
+        As an example, consider a 3*3 grid with the cell (1, 1) (the one in the
+        middle) having a span of 2 rows and 2 columns, i.e. the grid looks like
+        @code
+            +----+----+----+
+            |    |    |    |
+            +----+----+----+
+            |    |         |
+            +----+         |
+            |    |         |
+            +----+----+----+
+        @endcode
+        Then the function returns 2 and 2 in @a num_rows and @a num_cols for
+        the cell (1, 1) itself and -1 and -1 for the cell (2, 2) as well as -1
+        and 0 for the cell (2, 1).
+
+        @param row
+            The row of the cell.
+        @param col
+            The column of the cell.
+        @param num_rows
+            Pointer to variable receiving the number of rows, must not be @NULL.
+        @param num_cols
+            Pointer to variable receiving the number of columns, must not be
+            @NULL.
+        @return
+            The kind of this cell span (the return value is new in wxWidgets
+            2.9.1, this function was void in previous wxWidgets versions).
+     */
+    CellSpan GetCellSize( int row, int col, int *num_rows, int *num_cols ) const;
 
-    //@{
     /**
-        Set the background colour for the given cell or all cells by default.
-    */
-    void SetCellBackgroundColour(int row, int col, const wxColour& colour);
+        Get the number of rows and columns allocated for this cell.
+
+        This overload doesn't return a CellSpan value but the values returned
+        may still be negative, see GetCellSize(int, int, int *, int *) for
+        details.
+     */
+    wxSize GetCellSize(const wxGridCellCoords& coords);
+
     //@}
 
+
     /**
-        Sets the editor for the grid cell at the specified location.
+        @name User-Resizing and Dragging
 
-        The grid will take ownership of the pointer.
+        Functions controlling various interactive mouse operations.
 
-        See wxGridCellEditor and the @ref overview_grid "wxGrid overview"
-        for more information about cell editors and renderers.
-    */
-    void SetCellEditor(int row, int col, wxGridCellEditor* editor);
+        By default, columns and rows can be resized by dragging the edges of
+        their labels (this can be disabled using DisableDragColSize() and
+        DisableDragRowSize() methods). And if grid line dragging is enabled with
+        EnableDragGridSize() they can also be resized by dragging the right or
+        bottom edge of the grid cells.
+
+        Columns can also be moved to interactively change their order but this
+        needs to be explicitly enabled with EnableDragColMove().
+     */
+    //@{
 
     /**
-        Sets the font for text in the grid cell at the specified location.
+        Return @true if the dragging of cells is enabled or @false otherwise.
     */
-    void SetCellFont(int row, int col, const wxFont& font);
+    bool CanDragCell() const;
 
     /**
-        Sets the renderer for the grid cell at the specified location.
-
-        The grid will take ownership of the pointer.
+        Returns @true if columns can be moved by dragging with the mouse.
 
-        See wxGridCellRenderer and the @ref overview_grid "wxGrid overview"
-        for more information about cell editors and renderers.
+        Columns can be moved by dragging on their labels.
     */
-    void SetCellRenderer(int row, int col, wxGridCellRenderer* renderer);
+    bool CanDragColMove() const;
 
-    //@{
     /**
-        Sets the text colour for the given cell or all cells by default.
+        Returns @true if the given column can be resized by dragging with the
+        mouse.
+
+        This function returns @true if resizing the columns interactively is
+        globally enabled, i.e. if DisableDragColSize() hadn't been called, and
+        if this column wasn't explicitly marked as non-resizable with
+        DisableColResize().
     */
-    void SetCellTextColour(int row, int col, const wxColour& colour);
-    void SetCellTextColour(const wxColour& val, int row, int col);
-    void SetCellTextColour(const wxColour& colour);
-    //@}
+    bool CanDragColSize(int col) const;
 
-    //@{
     /**
-        Sets the string value for the cell at the specified location.
-
-        For simple applications where a grid object automatically uses a
-        default grid table of string values you use this function together with
-        GetCellValue() to access cell values. For more complex applications
-        where you have derived your own grid table class that contains various
-        data types (e.g. numeric, boolean or user-defined custom types) then
-        you only use this function for those cells that contain string values.
-        The last form is for backward compatibility only.
-
-        See wxGridTableBase::CanSetValueAs and the @ref overview_grid
-        "wxGrid overview" for more information.
+        Return @true if the dragging of grid lines to resize rows and columns
+        is enabled or @false otherwise.
     */
-    void SetCellValue(int row, int col, const wxString& s);
-    void SetCellValue(const wxGridCellCoords& coords, const wxString& s);
-    void SetCellValue(const wxString& val, int row, int col);
-    //@}
+    bool CanDragGridSize() const;
 
     /**
-        Sets the cell attributes for all cells in the specified column.
+        Returns @true if the given row can be resized by dragging with the
+        mouse.
 
-        For more information about controlling grid cell attributes see the
-        wxGridCellAttr cell attribute class and the @ref overview_grid "wxGrid overview".
+        This is the same as CanDragColSize() but for rows.
     */
-    void SetColAttr(int col, wxGridCellAttr* attr);
+    bool CanDragRowSize(int row) const;
 
     /**
-        Sets the specified column to display boolean values.
+        Disable interactive resizing of the specified column.
 
-        @see SetColFormatCustom()
-    */
-    void SetColFormatBool(int col);
+        This method allows to disable resizing of an individual column in a
+        grid where the columns are otherwise resizable (which is the case by
+        default).
+
+        Notice that currently there is no way to make some columns resizable in
+        a grid where columns can't be resized by default as there doesn't seem
+        to be any need for this in practice. There is also no way to make the
+        column marked as fixed using this method resizeable again because it is
+        supposed that fixed columns are used for static parts of the grid and
+        so should remain fixed during the entire grid lifetime.
+
+        Also notice that disabling interactive column resizing will not prevent
+        the program from changing the column size.
+
+        @see EnableDragColSize()
+     */
+    void DisableColResize(int col);
 
     /**
-        Sets the specified column to display data in a custom format.
+        Disable interactive resizing of the specified row.
 
-        This method provides an alternative to defining a custom grid table
-        which would return @a typeName from its GetTypeName() method for the
-        cells in this column: while it doesn't really change the type of the
-        cells in this column, it does associate the renderer and editor used
-        for the cells of the specified type with them.
+        This is the same as DisableColResize() but for rows.
 
-        See the @ref overview_grid "wxGrid overview" for more
-        information on working with custom data types.
-    */
-    void SetColFormatCustom(int col, const wxString& typeName);
+        @see EnableDragRowSize()
+     */
+    void DisableRowResize(int row);
 
     /**
-        Sets the specified column to display floating point values with the
-        given width and precision.
+        Disables column moving by dragging with the mouse.
 
-        @see SetColFormatCustom()
+        Equivalent to passing @false to EnableDragColMove().
     */
-    void SetColFormatFloat(int col, int width = -1, int precision = -1);
+    void DisableDragColMove();
 
     /**
-        Sets the specified column to display integer values.
+        Disables column sizing by dragging with the mouse.
 
-        @see SetColFormatCustom()
+        Equivalent to passing @false to EnableDragColSize().
     */
-    void SetColFormatNumber(int col);
+    void DisableDragColSize();
 
     /**
-        Sets the horizontal and vertical alignment of column label text.
+        Disable mouse dragging of grid lines to resize rows and columns.
 
-        Horizontal alignment should be one of @c wxALIGN_LEFT, @c
-        wxALIGN_CENTRE or @c wxALIGN_RIGHT.
-        Vertical alignment should be one of @c wxALIGN_TOP, @c wxALIGN_CENTRE
-        or @c wxALIGN_BOTTOM.
+        Equivalent to passing @false to EnableDragGridSize()
     */
-    void SetColLabelAlignment(int horiz, int vert);
+    void DisableDragGridSize();
 
     /**
-        Sets the height of the column labels.
+        Disables row sizing by dragging with the mouse.
 
-        If @a height equals to @c wxGRID_AUTOSIZE then height is calculated
-        automatically so that no label is truncated. Note that this could be
-        slow for a large table.
+        Equivalent to passing @false to EnableDragRowSize().
     */
-    void SetColLabelSize(int height);
+    void DisableDragRowSize();
 
     /**
-        Set the value for the given column label.
+        Enables or disables cell dragging with the mouse.
+    */
+    void EnableDragCell(bool enable = true);
 
-        If you are using a custom grid table you must override
-        wxGridTableBase::SetColLabelValue for this to have any effect.
+    /**
+        Enables or disables column moving by dragging with the mouse.
     */
-    void SetColLabelValue(int col, const wxString& value);
+    void EnableDragColMove(bool enable = true);
 
     /**
-        Sets the minimal width to which the user can resize columns.
+        Enables or disables column sizing by dragging with the mouse.
 
-        @see GetColMinimalAcceptableWidth()
+        @see DisableColResize()
     */
-    void SetColMinimalAcceptableWidth(int width);
+    void EnableDragColSize(bool enable = true);
 
     /**
-        Sets the minimal width for the specified column.
+        Enables or disables row and column resizing by dragging gridlines with
+        the mouse.
+    */
+    void EnableDragGridSize(bool enable = true);
 
-        It is usually best to call this method during grid creation as calling
-        it later will not resize the column to the given minimal width even if
-        it is currently narrower than it.
+    /**
+        Enables or disables row sizing by dragging with the mouse.
 
-        @a width must be greater than the minimal acceptable column width as
-        returned by GetColMinimalAcceptableWidth().
+        @see DisableRowResize()
     */
-    void SetColMinimalWidth(int col, int width);
+    void EnableDragRowSize(bool enable = true);
+
+    /**
+        Returns the column ID of the specified column position.
+    */
+    int GetColAt(int colPos) const;
+
+    /**
+        Returns the position of the specified column.
+    */
+    int GetColPos(int colID) const;
 
     /**
         Sets the position of the specified column.
@@ -2450,321 +3103,938 @@ public:
     void SetColPos(int colID, int newPos);
 
     /**
-        Sets the width of the specified column.
+        Sets the positions of all columns at once.
 
-        Notice that this function does not refresh the grid, you need to call
-        ForceRefresh() to make the changes take effect immediately.
+        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);
 
-        @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.
+    /**
+        Resets the position of the columns to the default.
     */
-    void SetColSize(int col, int width);
+    void ResetColPos();
+
+    //@}
+
 
     /**
-        Sets the default horizontal and vertical alignment for grid cell text.
+        @name Cursor Movement
+    */
+    //@{
 
-        Horizontal alignment should be one of @c wxALIGN_LEFT, @c
-        wxALIGN_CENTRE or @c wxALIGN_RIGHT.
-        Vertical alignment should be one of @c wxALIGN_TOP, @c wxALIGN_CENTRE
-        or @c wxALIGN_BOTTOM.
+    /**
+        Returns the current grid cell column position.
     */
-    void SetDefaultCellAlignment(int horiz, int vert);
+    int GetGridCursorCol() const;
 
     /**
-        Sets the default background colour for grid cells.
+        Returns the current grid cell row position.
     */
-    void SetDefaultCellBackgroundColour(const wxColour& colour);
+    int GetGridCursorRow() const;
 
     /**
-        Sets the default font to be used for grid cell text.
+        Make the given cell current and ensure it is visible.
+
+        This method is equivalent to calling MakeCellVisible() and
+        SetGridCursor() and so, as with the latter, a @c wxEVT_GRID_SELECT_CELL
+        event is generated by it and the selected cell doesn't change if the
+        event is vetoed.
+     */
+    void GoToCell(int row, int col);
+    /**
+        Make the given cell current and ensure it is visible.
+
+        This method is equivalent to calling MakeCellVisible() and
+        SetGridCursor() and so, as with the latter, a @c wxEVT_GRID_SELECT_CELL
+        event is generated by it and the selected cell doesn't change if the
+        event is vetoed.
+     */
+    void GoToCell(const wxGridCellCoords& coords);
+
+    /**
+        Moves the grid cursor down by one row.
+
+        If a block of cells was previously selected it will expand if the
+        argument is @true or be cleared if the argument is @false.
     */
-    void SetDefaultCellFont(const wxFont& font);
+    bool MoveCursorDown(bool expandSelection);
 
     /**
-        Sets the current default colour for grid cell text.
+        Moves the grid cursor down in the current column such that it skips to
+        the beginning or end of a block of non-empty cells.
+
+        If a block of cells was previously selected it will expand if the
+        argument is @true or be cleared if the argument is @false.
     */
-    void SetDefaultCellTextColour(const wxColour& colour);
+    bool MoveCursorDownBlock(bool expandSelection);
 
     /**
-        Sets the default width for columns in the grid.
+        Moves the grid cursor left by one column.
 
-        This will only affect columns subsequently added to the grid unless
-        @a resizeExistingCols is @true.
+        If a block of cells was previously selected it will expand if the
+        argument is @true or be cleared if the argument is @false.
+    */
+    bool MoveCursorLeft(bool expandSelection);
 
-        If @a width is less than GetColMinimalAcceptableWidth(), then the
-        minimal acceptable width is used instead of it.
+    /**
+        Moves the grid cursor left in the current row such that it skips to the
+        beginning or end of a block of non-empty cells.
+
+        If a block of cells was previously selected it will expand if the
+        argument is @true or be cleared if the argument is @false.
     */
-    void SetDefaultColSize(int width, bool resizeExistingCols = false);
+    bool MoveCursorLeftBlock(bool expandSelection);
 
     /**
-        Sets the default editor for grid cells.
+        Moves the grid cursor right by one column.
 
-        The grid will take ownership of the pointer.
+        If a block of cells was previously selected it will expand if the
+        argument is @true or be cleared if the argument is @false.
+    */
+    bool MoveCursorRight(bool expandSelection);
+
+    /**
+        Moves the grid cursor right in the current row such that it skips to
+        the beginning or end of a block of non-empty cells.
 
-        See wxGridCellEditor and the @ref overview_grid "wxGrid overview"
-        for more information about cell editors and renderers.
+        If a block of cells was previously selected it will expand if the
+        argument is @true or be cleared if the argument is @false.
     */
-    void SetDefaultEditor(wxGridCellEditor* editor);
+    bool MoveCursorRightBlock(bool expandSelection);
 
     /**
-        Sets the default renderer for grid cells.
+        Moves the grid cursor up by one row.
 
-        The grid will take ownership of the pointer.
+        If a block of cells was previously selected it will expand if the
+        argument is @true or be cleared if the argument is @false.
+    */
+    bool MoveCursorUp(bool expandSelection);
+
+    /**
+        Moves the grid cursor up in the current column such that it skips to
+        the beginning or end of a block of non-empty cells.
+
+        If a block of cells was previously selected it will expand if the
+        argument is @true or be cleared if the argument is @false.
+    */
+    bool MoveCursorUpBlock(bool expandSelection);
+
+    /**
+        Moves the grid cursor down by some number of rows so that the previous
+        bottom visible row becomes the top visible row.
+    */
+    bool MovePageDown();
+
+    /**
+        Moves the grid cursor up by some number of rows so that the previous
+        top visible row becomes the bottom visible row.
+    */
+    bool MovePageUp();
+
+    /**
+        Set the grid cursor to the specified cell.
+
+        The grid cursor indicates the current cell and can be moved by the user
+        using the arrow keys or the mouse.
+
+        Calling this function generates a @c wxEVT_GRID_SELECT_CELL event and
+        if the event handler vetoes this event, the cursor is not moved.
+
+        This function doesn't make the target call visible, use GoToCell() to
+        do this.
+    */
+    void SetGridCursor(int row, int col);
+    /**
+        Set the grid cursor to the specified cell.
+
+        The grid cursor indicates the current cell and can be moved by the user
+        using the arrow keys or the mouse.
+
+        Calling this function generates a @c wxEVT_GRID_SELECT_CELL event and
+        if the event handler vetoes this event, the cursor is not moved.
+
+        This function doesn't make the target call visible, use GoToCell() to
+        do this.
+    */
+    void SetGridCursor(const wxGridCellCoords& coords);
+
+    //@}
+
+
+    /**
+        @name User Selection
+     */
+    //@{
+
+    /**
+        Deselects all cells that are currently selected.
+    */
+    void ClearSelection();
+
+    /**
+        Returns an array of individually selected cells.
+
+        Notice that this array does @em not contain all the selected cells in
+        general as it doesn't include the cells selected as part of column, row
+        or block selection. You must use this method, GetSelectedCols(),
+        GetSelectedRows() and GetSelectionBlockTopLeft() and
+        GetSelectionBlockBottomRight() methods to obtain the entire selection
+        in general.
+
+        Please notice this behaviour is by design and is needed in order to
+        support grids of arbitrary size (when an entire column is selected in
+        a grid with a million of columns, we don't want to create an array with
+        a million of entries in this function, instead it returns an empty
+        array and GetSelectedCols() returns an array containing one element).
+    */
+    wxGridCellCoordsArray GetSelectedCells() const;
+
+    /**
+        Returns an array of selected columns.
+
+        Please notice that this method alone is not sufficient to find all the
+        selected columns as it contains only the columns which were
+        individually selected but not those being part of the block selection
+        or being selected in virtue of all of their cells being selected
+        individually, please see GetSelectedCells() for more details.
+    */
+    wxArrayInt GetSelectedCols() const;
+
+    /**
+        Returns an array of selected rows.
+
+        Please notice that this method alone is not sufficient to find all the
+        selected rows as it contains only the rows which were individually
+        selected but not those being part of the block selection or being
+        selected in virtue of all of their cells being selected individually,
+        please see GetSelectedCells() for more details.
+    */
+    wxArrayInt GetSelectedRows() const;
+
+    /**
+        Returns the colour used for drawing the selection background.
+    */
+    wxColour GetSelectionBackground() const;
+
+    /**
+        Returns an array of the bottom right corners of blocks of selected
+        cells.
+
+        Please see GetSelectedCells() for more information about the selection
+        representation in wxGrid.
+
+        @see GetSelectionBlockTopLeft()
+    */
+    wxGridCellCoordsArray GetSelectionBlockBottomRight() const;
+
+    /**
+        Returns an array of the top left corners of blocks of selected cells.
+
+        Please see GetSelectedCells() for more information about the selection
+        representation in wxGrid.
+
+        @see GetSelectionBlockBottomRight()
+    */
+    wxGridCellCoordsArray GetSelectionBlockTopLeft() const;
+
+    /**
+        Returns the colour used for drawing the selection foreground.
+    */
+    wxColour GetSelectionForeground() const;
+
+    /**
+        Returns the current selection mode.
+
+        @see SetSelectionMode().
+    */
+    wxGridSelectionModes GetSelectionMode() const;
+
+    /**
+        Returns @true if the given cell is selected.
+    */
+    bool IsInSelection(int row, int col) const;
+    /**
+        Returns @true if the given cell is selected.
+    */
+    bool IsInSelection(const wxGridCellCoords& coords) const;
+
+    /**
+        Returns @true if there are currently any selected cells, rows, columns
+        or blocks.
+    */
+    bool IsSelection() const;
+
+    /**
+        Selects all cells in the grid.
+    */
+    void SelectAll();
+
+    /**
+        Selects a rectangular block of cells.
+
+        If @a addToSelected is @false then any existing selection will be
+        deselected; if @true the column will be added to the existing
+        selection.
+    */
+    void SelectBlock(int topRow, int leftCol, int bottomRow, int rightCol,
+                     bool addToSelected = false);
+    /**
+        Selects a rectangular block of cells.
+
+        If @a addToSelected is @false then any existing selection will be
+        deselected; if @true the column will be added to the existing
+        selection.
+    */
+    void SelectBlock(const wxGridCellCoords& topLeft,
+                     const wxGridCellCoords& bottomRight,
+                     bool addToSelected = false);
+
+    /**
+        Selects the specified column.
+
+        If @a addToSelected is @false then any existing selection will be
+        deselected; if @true the column will be added to the existing
+        selection.
+
+        This method won't select anything if the current selection mode is
+        wxGridSelectRows.
+    */
+    void SelectCol(int col, bool addToSelected = false);
+
+    /**
+        Selects the specified row.
+
+        If @a addToSelected is @false then any existing selection will be
+        deselected; if @true the row will be added to the existing selection.
+
+        This method won't select anything if the current selection mode is
+        wxGridSelectColumns.
+    */
+    void SelectRow(int row, bool addToSelected = false);
+
+    /**
+        Set the colour to be used for drawing the selection background.
+    */
+    void SetSelectionBackground(const wxColour& c);
+
+    /**
+        Set the colour to be used for drawing the selection foreground.
+    */
+    void SetSelectionForeground(const wxColour& c);
+
+    /**
+        Set the selection behaviour of the grid.
+
+        The existing selection is converted to conform to the new mode if
+        possible and discarded otherwise (e.g. any individual selected cells
+        are deselected if the new mode allows only the selection of the entire
+        rows or columns).
+    */
+    void SetSelectionMode(wxGridSelectionModes selmode);
+
+    //@}
+
+
+    /**
+        @name Scrolling
+     */
+    //@{
+
+    /**
+        Returns the number of pixels per horizontal scroll increment.
+
+        The default is 15.
+
+        @see GetScrollLineY(), SetScrollLineX(), SetScrollLineY()
+    */
+    int GetScrollLineX() const;
+
+    /**
+        Returns the number of pixels per vertical scroll increment.
+
+        The default is 15.
+
+        @see GetScrollLineX(), SetScrollLineX(), SetScrollLineY()
+    */
+    int GetScrollLineY() const;
+
+    /**
+        Returns @true if a cell is either entirely or at least partially
+        visible in the grid window.
+
+        By default, the cell must be entirely visible for this function to
+        return @true but if @a wholeCellVisible is @false, the function returns
+        @true even if the cell is only partially visible.
+    */
+    bool IsVisible(int row, int col, bool wholeCellVisible = true) const;
+    /**
+        Returns @true if a cell is either entirely or at least partially
+        visible in the grid window.
+
+        By default, the cell must be entirely visible for this function to
+        return @true but if @a wholeCellVisible is @false, the function returns
+        @true even if the cell is only partially visible.
+    */
+    bool IsVisible(const wxGridCellCoords& coords,
+                   bool wholeCellVisible = true) const;
+
+    /**
+        Brings the specified cell into the visible grid cell area with minimal
+        scrolling.
+
+        Does nothing if the cell is already visible.
+    */
+    void MakeCellVisible(int row, int col);
+    /**
+        Brings the specified cell into the visible grid cell area with minimal
+        scrolling.
+
+        Does nothing if the cell is already visible.
+    */
+    void MakeCellVisible(const wxGridCellCoords& coords);
+
+    /**
+        Sets the number of pixels per horizontal scroll increment.
+
+        The default is 15.
+
+        @see GetScrollLineX(), GetScrollLineY(), SetScrollLineY()
+    */
+    void SetScrollLineX(int x);
+
+    /**
+        Sets the number of pixels per vertical scroll increment.
+
+        The default is 15.
+
+        @see GetScrollLineX(), GetScrollLineY(), SetScrollLineX()
+    */
+    void SetScrollLineY(int y);
+
+    //@}
+
+
+    /**
+        @name Cell and Device Coordinate Translation
+     */
+    //@{
+
+    /**
+        Convert grid cell coordinates to grid window pixel coordinates.
+
+        This function returns the rectangle that encloses the block of cells
+        limited by @a topLeft and @a bottomRight cell in device coords and
+        clipped to the client size of the grid window.
+
+        @see CellToRect()
+    */
+    wxRect BlockToDeviceRect(const wxGridCellCoords& topLeft,
+                             const wxGridCellCoords& bottomRight) const;
+
+    /**
+        Return the rectangle corresponding to the grid cell's size and position
+        in logical coordinates.
+
+        @see BlockToDeviceRect()
+    */
+    wxRect CellToRect(int row, int col) const;
+    /**
+        Return the rectangle corresponding to the grid cell's size and position
+        in logical coordinates.
+
+        @see BlockToDeviceRect()
+    */
+    wxRect CellToRect(const wxGridCellCoords& coords) const;
+
+    /**
+        Returns the column at the given pixel position.
+
+        @param x
+            The x position to evaluate.
+        @param clipToMinMax
+            If @true, rather than returning @c wxNOT_FOUND, it returns either
+            the first or last column depending on whether @a x is too far to
+            the left or right respectively.
+        @return
+            The column index or @c wxNOT_FOUND.
+    */
+    int XToCol(int x, bool clipToMinMax = false) const;
+
+    /**
+        Returns the column whose right hand edge is close to the given logical
+        @a x position.
+
+        If no column edge is near to this position @c wxNOT_FOUND is returned.
+    */
+    int XToEdgeOfCol(int x) const;
+
+    /**
+        Translates logical pixel coordinates to the grid cell coordinates.
+
+        Notice that this function expects logical coordinates on input so if
+        you use this function in a mouse event handler you need to translate
+        the mouse position, which is expressed in device coordinates, to
+        logical ones.
+
+        @see XToCol(), YToRow()
+     */
+    wxGridCellCoords XYToCell(int x, int y) const;
+    /**
+        Translates logical pixel coordinates to the grid cell coordinates.
+
+        Notice that this function expects logical coordinates on input so if
+        you use this function in a mouse event handler you need to translate
+        the mouse position, which is expressed in device coordinates, to
+        logical ones.
+
+        @see XToCol(), YToRow()
+     */
+    wxGridCellCoords XYToCell(const wxPoint& pos) const;
+    // XYToCell(int, int, wxGridCellCoords&) overload is intentionally
+    // undocumented, using it is ugly and non-const reference parameters are
+    // not used in wxWidgets API
+
+    /**
+        Returns the row whose bottom edge is close to the given logical @a y
+        position.
+
+        If no row edge is near to this position @c wxNOT_FOUND is returned.
+    */
+    int YToEdgeOfRow(int y) const;
+
+    /**
+        Returns the grid row that corresponds to the logical @a y coordinate.
+
+        Returns @c wxNOT_FOUND if there is no row at the @a y position.
+    */
+    int YToRow(int y, bool clipToMinMax = false) const;
+
+    //@}
+
+
+    /**
+        @name Miscellaneous Functions
+     */
+    //@{
+
+    /**
+        Appends one or more new columns to the right of the grid.
+
+        The @a updateLabels argument is not used at present. If you are using a
+        derived grid table class you will need to override
+        wxGridTableBase::AppendCols(). See InsertCols() for further
+        information.
+
+        @return @true on success or @false if appending columns failed.
+    */
+    bool AppendCols(int numCols = 1, bool updateLabels = true);
+
+    /**
+        Appends one or more new rows to the bottom of the grid.
+
+        The @a updateLabels argument is not used at present. If you are using a
+        derived grid table class you will need to override
+        wxGridTableBase::AppendRows(). See InsertRows() for further
+        information.
+
+        @return @true on success or @false if appending rows failed.
+    */
+    bool AppendRows(int numRows = 1, bool updateLabels = true);
+
+    /**
+        Return @true if the horizontal grid lines stop at the last column
+        boundary or @false if they continue to the end of the window.
+
+        The default is to clip grid lines.
+
+        @see ClipHorzGridLines(), AreVertGridLinesClipped()
+     */
+    bool AreHorzGridLinesClipped() const;
+
+    /**
+        Return @true if the vertical grid lines stop at the last row
+        boundary or @false if they continue to the end of the window.
+
+        The default is to clip grid lines.
+
+        @see ClipVertGridLines(), AreHorzGridLinesClipped()
+     */
+    bool AreVertGridLinesClipped() const;
+
+    /**
+        Increments the grid's batch count.
+
+        When the count is greater than zero repainting of the grid is
+        suppressed. Each call to BeginBatch must be matched by a later call to
+        EndBatch(). Code that does a lot of grid modification can be enclosed
+        between BeginBatch() and EndBatch() calls to avoid screen flicker. The
+        final EndBatch() call will cause the grid to be repainted.
+
+        Notice that you should use wxGridUpdateLocker which ensures that there
+        is always a matching EndBatch() call for this BeginBatch() if possible
+        instead of calling this method directly.
+    */
+    void BeginBatch();
+
+    /**
+        Clears all data in the underlying grid table and repaints the grid.
+
+        The table is not deleted by this function. If you are using a derived
+        table class then you need to override wxGridTableBase::Clear() for this
+        function to have any effect.
+    */
+    void ClearGrid();
+
+    /**
+        Change whether the horizontal grid lines are clipped by the end of the
+        last column.
+
+        By default the grid lines are not drawn beyond the end of the last
+        column but after calling this function with @a clip set to @false they
+        will be drawn across the entire grid window.
+
+        @see AreHorzGridLinesClipped(), ClipVertGridLines()
+     */
+    void ClipHorzGridLines(bool clip);
+
+    /**
+        Change whether the vertical grid lines are clipped by the end of the
+        last row.
+
+        By default the grid lines are not drawn beyond the end of the last
+        row but after calling this function with @a clip set to @false they
+        will be drawn across the entire grid window.
+
+        @see AreVertGridLinesClipped(), ClipHorzGridLines()
+     */
+    void ClipVertGridLines(bool clip);
+
+    /**
+        Deletes one or more columns from a grid starting at the specified
+        position.
+
+        The @a updateLabels argument is not used at present. If you are using a
+        derived grid table class you will need to override
+        wxGridTableBase::DeleteCols(). See InsertCols() for further
+        information.
 
-        See wxGridCellRenderer and the @ref overview_grid "wxGrid overview"
-        for more information about cell editors and renderers.
+        @return @true on success or @false if deleting columns failed.
     */
-    void SetDefaultRenderer(wxGridCellRenderer* renderer);
+    bool DeleteCols(int pos = 0, int numCols = 1, bool updateLabels = true);
 
     /**
-        Sets the default height for rows in the grid.
+        Deletes one or more rows from a grid starting at the specified
+        position.
 
-        This will only affect rows subsequently added to the grid unless
-        @a resizeExistingRows is @true.
+        The @a updateLabels argument is not used at present. If you are using a
+        derived grid table class you will need to override
+        wxGridTableBase::DeleteRows(). See InsertRows() for further
+        information.
 
-        If @a height is less than GetRowMinimalAcceptableHeight(), then the
-        minimal acceptable heihgt is used instead of it.
+        @return @true on success or @false if appending rows failed.
     */
-    void SetDefaultRowSize(int height, bool resizeExistingRows = false);
+    bool DeleteRows(int pos = 0, int numRows = 1, bool updateLabels = true);
 
-    //@{
     /**
-        Set the grid cursor to the specified cell.
-
-        The grid cursor indicates the current cell and can be moved by the user
-        using the arrow keys or the mouse.
+        Decrements the grid's batch count.
 
-        Calling this function generates a wxEVT_GRID_SELECT_CELL event and if
-        the event handler vetoes this event, the cursor is not moved.
+        When the count is greater than zero repainting of the grid is
+        suppressed. Each previous call to BeginBatch() must be matched by a
+        later call to EndBatch(). Code that does a lot of grid modification can
+        be enclosed between BeginBatch() and EndBatch() calls to avoid screen
+        flicker. The final EndBatch() will cause the grid to be repainted.
 
-        This function doesn't make the target call visible, use GoToCell() to
-        do this.
+        @see wxGridUpdateLocker
     */
-    void SetGridCursor(int row, int col);
-    void SetGridCursor(const wxGridCellCoords& coords);
-    //@}
+    void EndBatch();
 
     /**
-        Sets the colour used to draw grid lines.
+        Overridden wxWindow method.
     */
-    void SetGridLineColour(const wxColour& colour);
+    virtual void Fit();
 
     /**
-        Sets the background colour for row and column labels.
-    */
-    void SetLabelBackgroundColour(const wxColour& colour);
+        Causes immediate repainting of the grid.
 
-    /**
-        Sets the font for row and column labels.
+        Use this instead of the usual wxWindow::Refresh().
     */
-    void SetLabelFont(const wxFont& font);
+    void ForceRefresh();
 
     /**
-        Sets the colour for row and column label text.
+        Returns the number of times that BeginBatch() has been called without
+        (yet) matching calls to EndBatch(). While the grid's batch count is
+        greater than zero the display will not be updated.
     */
-    void SetLabelTextColour(const wxColour& colour);
+    int GetBatchCount();
 
     /**
-        Sets the extra margins used around the grid area.
+        Returns the total number of grid columns.
 
-        A grid may occupy more space than needed for its data display and
-        this function allows to set how big this extra space is
+        This is the same as the number of columns in the underlying grid table.
     */
-    void SetMargins(int extraWidth, int extraHeight);
+    int GetNumberCols() const;
 
     /**
-        Makes the cell at the specified location read-only or editable.
+        Returns the total number of grid rows.
 
-        @see IsReadOnly()
+        This is the same as the number of rows in the underlying grid table.
     */
-    void SetReadOnly(int row, int col, bool isReadOnly = true);
+    int GetNumberRows() const;
 
     /**
-        Sets the cell attributes for all cells in the specified row.
+        Returns the attribute for the given cell creating one if necessary.
 
-        The grid takes ownership of the attribute pointer.
+        If the cell already has an attribute, it is returned. Otherwise a new
+        attribute is created, associated with the cell and returned. In any
+        case the caller must call DecRef() on the returned pointer.
 
-        See the wxGridCellAttr class for more information about controlling
-        cell attributes.
+        This function may only be called if CanHaveAttributes() returns @true.
     */
-    void SetRowAttr(int row, wxGridCellAttr* attr);
+    wxGridCellAttr *GetOrCreateCellAttr(int row, int col) const;
 
     /**
-        Sets the horizontal and vertical alignment of row label text.
+        Returns a base pointer to the current table object.
 
-        Horizontal alignment should be one of @c wxALIGN_LEFT, @c
-        wxALIGN_CENTRE or @c wxALIGN_RIGHT.
-        Vertical alignment should be one of @c wxALIGN_TOP, @c wxALIGN_CENTRE
-        or @c wxALIGN_BOTTOM.
+        The returned pointer is still owned by the grid.
     */
-    void SetRowLabelAlignment(int horiz, int vert);
+    wxGridTableBase *GetTable() const;
 
     /**
-        Sets the width of the row labels.
+        Inserts one or more new columns into a grid with the first new column
+        at the specified position.
 
-        If @a width equals @c wxGRID_AUTOSIZE then width is calculated
-        automatically so that no label is truncated. Note that this could be
-        slow for a large table.
+        Notice that inserting the columns in the grid requires grid table
+        cooperation: when this method is called, grid object begins by
+        requesting the underlying grid table to insert new columns. If this is
+        successful the table notifies the grid and the grid updates the
+        display. For a default grid (one where you have called CreateGrid())
+        this process is automatic. If you are using a custom grid table
+        (specified with SetTable()) then you must override
+        wxGridTableBase::InsertCols() in your derived table class.
+
+        @param pos
+            The position which the first newly inserted column will have.
+        @param numCols
+            The number of columns to insert.
+        @param updateLabels
+            Currently not used.
+        @return
+            @true if the columns were successfully inserted, @false if an error
+            occurred (most likely the table couldn't be updated).
     */
-    void SetRowLabelSize(int width);
+    bool InsertCols(int pos = 0, int numCols = 1, bool updateLabels = true);
 
     /**
-        Sets the value for the given row label.
+        Inserts one or more new rows into a grid with the first new row at the
+        specified position.
 
-        If you are using a derived grid table you must override
-        wxGridTableBase::SetRowLabelValue for this to have any effect.
+        Notice that you must implement wxGridTableBase::InsertRows() if you use
+        a grid with a custom table, please see InsertCols() for more
+        information.
+
+        @param pos
+            The position which the first newly inserted row will have.
+        @param numRows
+            The number of rows to insert.
+        @param updateLabels
+            Currently not used.
+        @return
+            @true if the rows were successfully inserted, @false if an error
+            occurred (most likely the table couldn't be updated).
     */
-    void SetRowLabelValue(int row, const wxString& value);
+    bool InsertRows(int pos = 0, int numRows = 1, bool updateLabels = true);
 
     /**
-        Sets the minimal row height used by default.
+        Invalidates the cached attribute for the given cell.
 
-        See SetColMinimalAcceptableWidth() for more information.
-    */
-    void SetRowMinimalAcceptableHeight(int height);
+        For efficiency reasons, wxGrid may cache the recently used attributes
+        (currently it caches only the single most recently used one, in fact)
+        which can result in the cell appearance not being refreshed even when
+        the attribute returned by your custom wxGridCellAttrProvider-derived
+        class has changed. To force the grid to refresh the cell attribute,
+        this function may be used. Notice that calling it will not result in
+        actually redrawing the cell, you still need to call
+        wxWindow::RefreshRect() to invalidate the area occupied by the cell in
+        the window to do this. Also note that you don't need to call this
+        function if you store the attributes in wxGrid itself, i.e. use its
+        SetAttr() and similar methods, it is only useful when using a separate
+        custom attributes provider.
+
+        @param row
+            The row of the cell whose attribute needs to be queried again.
+        @param col
+            The column of the cell whose attribute needs to be queried again.
+
+        @since 2.9.2
+     */
+    void RefreshAttr(int row, int col);
 
     /**
-        Sets the minimal height for the specified row.
+        Sets the cell attributes for all cells in the specified column.
 
-        See SetColMinimalWidth() for more information.
+        For more information about controlling grid cell attributes see the
+        wxGridCellAttr cell attribute class and the @ref overview_grid.
     */
-    void SetRowMinimalHeight(int row, int height);
+    void SetColAttr(int col, wxGridCellAttr* attr);
 
     /**
-        Sets the height of the specified row.
+        Sets the extra margins used around the grid area.
 
-        See SetColSize() for more information.
+        A grid may occupy more space than needed for its data display and
+        this function allows to set how big this extra space is
     */
-    void SetRowSize(int row, int height);
+    void SetMargins(int extraWidth, int extraHeight);
 
     /**
-        Sets the number of pixels per horizontal scroll increment.
+        Sets the cell attributes for all cells in the specified row.
 
-        The default is 15.
+        The grid takes ownership of the attribute pointer.
 
-        @see GetScrollLineX(), GetScrollLineY(), SetScrollLineY()
+        See the wxGridCellAttr class for more information about controlling
+        cell attributes.
     */
-    void SetScrollLineX(int x);
+    void SetRowAttr(int row, wxGridCellAttr* attr);
+
+    //@}
+
 
     /**
-        Sets the number of pixels per vertical scroll increment.
+        @name Sorting support.
 
-        The default is 15.
+        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.
 
-        @see GetScrollLineX(), GetScrollLineY(), SetScrollLineX()
-    */
-    void SetScrollLineY(int y);
+        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.
 
-    /**
-        Set the colour to be used for drawing the selection background.
-    */
-    void SetSelectionBackground(const wxColour& c);
+        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.
+     */
+    //@{
 
     /**
-        Set the colour to be used for drawing the selection foreground.
-    */
-    void SetSelectionForeground(const wxColour& c);
+        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;
 
     /**
-        Set the selection behaviour of the grid.
+        Return @true if this column is currently used for sorting.
 
-        The existing selection is converted to conform to the new mode if
-        possible and discarded otherwise (e.g. any individual selected cells
-        are deselected if the new mode allows only the selection of the entire
-        rows or columns).
-    */
-    void SetSelectionMode(wxGridSelectionModes selmode);
+        @see GetSortingColumn()
+     */
+    bool IsSortingBy(int col) const;
 
     /**
-        Passes a pointer to a custom grid table to be used by the grid.
+        Return @true if the current sorting order is ascending or @false if it
+        is descending.
 
-        This should be called after the grid constructor and before using the
-        grid object. If @a takeOwnership is set to @true then the table will be
-        deleted by the wxGrid destructor.
+        It only makes sense to call this function if GetSortingColumn() returns
+        a valid column index and not @c wxNOT_FOUND.
 
-        Use this function instead of CreateGrid() when your application
-        involves complex or non-string data or data sets that are too large to
-        fit wholly in memory.
-    */
-    bool SetTable(wxGridTableBase* table,
-                  bool takeOwnership = false,
-                  wxGridSelectionModes selmode = wxGridSelectCells);
+        @see SetSortingColumn()
+     */
+    bool IsSortOrderAscending() const;
 
     /**
-        Call this in order to make the column labels use a native look by using
-        wxRenderer::DrawHeaderButton internally.
+        Set the column to display the sorting indicator in and its direction.
 
-        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.
-    */
-    void SetUseNativeColLabels(bool native = true);
+        @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.
 
-    /**
-        Displays the in-place cell edit control for the current cell.
-    */
-    void ShowCellEditControl();
+        @see GetSortingColumn(), IsSortOrderAscending()
+     */
+    void SetSortingColumn(int col, bool ascending = true);
 
     /**
-        Returns the column at the given pixel position.
+        Remove any currently shown sorting indicator.
+
+        This is equivalent to calling SetSortingColumn() with @c wxNOT_FOUND
+        first argument.
+     */
+    void UnsetSortingColumn();
+    //@}
 
-        @param x
-            The x position to evaluate.
-        @param clipToMinMax
-            If @true, rather than returning wxNOT_FOUND, it returns either the
-            first or last column depending on whether x is too far to the left
-            or right respectively.
-        @return
-            The column index or wxNOT_FOUND.
-    */
-    int XToCol(int x, bool clipToMinMax = false) const;
 
     /**
-        Returns the column whose right hand edge is close to the given logical
-        x position.
+        @name Accessors for component windows.
 
-        If no column edge is near to this position @c wxNOT_FOUND is returned.
-    */
-    int XToEdgeOfCol(int x) const;
+        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.
+     */
     //@{
+
     /**
-        Translates logical pixel coordinates to the grid cell coordinates.
+        Return the main grid window containing the grid cells.
 
-        Notice that this function expects logical coordinates on input so if
-        you use this function in a mouse event handler you need to translate
-        the mouse position, which is expressed in device coordinates, to
-        logical ones.
+        This window is always shown.
+     */
+    wxWindow *GetGridWindow() const;
 
-        @see XToCol(), YToRow()
+    /**
+        Return the row labels window.
+
+        This window is not shown if the row labels were hidden using
+        HideRowLabels().
      */
+    wxWindow *GetGridRowLabelWindow() const;
 
-    // XYToCell(int, int, wxGridCellCoords&) overload is intentionally
-    // undocumented, using it is ugly and non-const reference parameters are
-    // not used in wxWidgets API
+    /**
+        Return the column labels window.
 
-    wxGridCellCoords XYToCell(int x, int y) const;
-    wxGridCellCoords XYToCell(const wxPoint& pos) const;
+        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;
 
     /**
-        Returns the row whose bottom edge is close to the given logical y
-        position.
+        Return the window in the top left grid corner.
 
-        If no row edge is near to this position @c wxNOT_FOUND is returned.
-    */
-    int YToEdgeOfRow(int y) const;
+        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;
 
     /**
-        Returns the grid row that corresponds to the logical y coordinate.
+        Return the header control used for column labels display.
 
-        Returns @c wxNOT_FOUND if there is no row at the y position.
-    */
-    int YToRow(int y, bool clipToMinMax = false) const;
+        This function can only be called if UseNativeColHeader() had been
+        called.
+     */
+    wxHeaderCtrl *GetGridColHeader() const;
+
+    //@}
 
 protected:
     /**
@@ -2871,10 +4141,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.
@@ -2906,56 +4195,35 @@ public:
         The user double-clicked a label with the right mouse button. Processes
         a @c wxEVT_GRID_LABEL_RIGHT_DCLICK event type.
     @event{EVT_GRID_SELECT_CELL(func)}
-        The user moved to, and selected a cell. Processes a
+        The given cell was made current, either by user or by the program via a
+        call to SetGridCursor() or GoToCell(). 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
 {
@@ -2969,8 +4237,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.
@@ -3022,22 +4289,20 @@ public:
     This event class contains information about a row/column resize event.
 
     @beginEventTable{wxGridSizeEvent}
-    @event{EVT_GRID_COL_SIZE(func)}
-        The user resized a column by dragging it. Processes a
-        @c wxEVT_GRID_COL_SIZE event type.
-    @event{EVT_GRID_ROW_SIZE(func)}
-        The user resized a row by dragging it. Processes a
-        @c wxEVT_GRID_ROW_SIZE event type.
     @event{EVT_GRID_CMD_COL_SIZE(id, func)}
-        The user resized a column by dragging it; variant taking a window
-        identifier. Processes a @c wxEVT_GRID_COL_SIZE event type.
+        The user resized a column, corresponds to @c wxEVT_GRID_COL_SIZE event
+        type.
     @event{EVT_GRID_CMD_ROW_SIZE(id, func)}
-        The user resized a row by dragging it; variant taking a window
-        identifier. Processes a @c wxEVT_GRID_ROW_SIZE event type.
+        The user resized a row, corresponds to @c wxEVT_GRID_ROW_SIZE event
+        type.
+    @event{EVT_GRID_COL_SIZE(func)}
+        Same as EVT_GRID_CMD_COL_SIZE() but uses `wxID_ANY` id.
+    @event{EVT_GRID_ROW_SIZE(func)}
+        Same as EVT_GRID_CMD_ROW_SIZE() but uses `wxID_ANY` id.
     @endEventTable
 
     @library{wxadv}
-    @category{grid}
+    @category{grid,events}
 */
 class wxGridSizeEvent : public wxNotifyEvent
 {
@@ -3051,8 +4316,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.
@@ -3100,7 +4364,7 @@ public:
     @endEventTable
 
     @library{wxadv}
-    @category{grid}
+    @category{grid,events}
 */
 class wxGridRangeSelectEvent : public wxNotifyEvent
 {
@@ -3116,9 +4380,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.
@@ -3191,7 +4453,7 @@ public:
     @endEventTable
 
     @library{wxadv}
-    @category{grid}
+    @category{grid,events}
 */
 class wxGridEditorCreatedEvent : public wxCommandEvent
 {