]> git.saurik.com Git - wxWidgets.git/blobdiff - interface/wx/grid.h
add note for wxWidgets user with a skeleton for a very minimal console app
[wxWidgets.git] / interface / wx / grid.h
index 82b700b5e145fd0bc94e88acf2a6f91016119743..1258d4cede21a0bd31b8abbf3a387201fcee97de 100644 (file)
@@ -1,11 +1,75 @@
 /////////////////////////////////////////////////////////////////////////////
 // Name:        grid.h
-// Purpose:     interface of wxGridCellFloatRenderer
+// Purpose:     interface of wxGrid and related classes
 // Author:      wxWidgets team
 // RCS-ID:      $Id$
 // Licence:     wxWindows license
 /////////////////////////////////////////////////////////////////////////////
 
+/**
+    @class wxGridCellRenderer
+
+    This class is responsible for actually drawing the cell in the grid. You
+    may pass it to the wxGridCellAttr (below) to change the format of one given
+    cell or to wxGrid::SetDefaultRenderer() to change the view of all cells.
+    This is an abstract class, and you will normally use one of the predefined
+    derived classes or derive your own class from it.
+
+    @library{wxadv}
+    @category{grid}
+
+    @see wxGridCellBoolRenderer, wxGridCellFloatRenderer,
+         wxGridCellNumberRenderer, wxGridCellStringRenderer
+*/
+class wxGridCellRenderer
+{
+public:
+    /**
+        This function must be implemented in derived classes to return a copy
+        of itself.
+    */
+    virtual wxGridCellRenderer* Clone() const = 0;
+
+    /**
+        Draw the given cell on the provided DC inside the given rectangle using
+        the style specified by the attribute and the default or selected state
+        corresponding to the isSelected value.
+
+        This pure virtual function has a default implementation which will
+        prepare the DC using the given attribute: it will draw the rectangle
+        with the background colour from attr and set the text colour and font.
+    */
+    virtual void Draw(wxGrid& grid, wxGridCellAttr& attr, wxDC& dc,
+                      const wxRect& rect, int row, int col,
+                      bool isSelected) = 0;
+
+    /**
+        Get the preferred size of the cell for its contents.
+    */
+    virtual wxSize GetBestSize(wxGrid& grid, wxGridCellAttr& attr, wxDC& dc,
+                               int row, int col) = 0;
+};
+
+/**
+    @class wxGridCellBoolRenderer
+
+    This class may be used to format boolean data in a cell.
+
+    @library{wxadv}
+    @category{grid}
+
+    @see wxGridCellRenderer, wxGridCellFloatRenderer, wxGridCellNumberRenderer,
+         wxGridCellStringRenderer
+*/
+class wxGridCellBoolRenderer : public wxGridCellRenderer
+{
+public:
+    /**
+        Default constructor.
+    */
+    wxGridCellBoolRenderer();
+};
+
 /**
     @class wxGridCellFloatRenderer
 
@@ -14,8 +78,8 @@
     @library{wxadv}
     @category{grid}
 
-    @see wxGridCellRenderer, wxGridCellNumberRenderer, wxGridCellStringRenderer,
-    wxGridCellBoolRenderer
+    @see wxGridCellRenderer, wxGridCellBoolRenderer, wxGridCellNumberRenderer,
+         wxGridCellStringRenderer
 */
 class wxGridCellFloatRenderer : public wxGridCellStringRenderer
 {
@@ -41,7 +105,7 @@ public:
     /**
         Parameters string format is "width[,precision]".
     */
-    void SetParameters(const wxString& params);
+    virtual void SetParameters(const wxString& params);
 
     /**
         Sets the precision.
@@ -54,1850 +118,2235 @@ public:
     void SetWidth(int width);
 };
 
-
-
 /**
-    @class wxGridTableBase
-
-    The almost abstract base class for grid tables.
-
-    A grid table is responsible for storing the grid data and, indirectly, grid
-    cell attributes. The data can be stored in the way most convenient for the
-    application but has to be provided in string form to wxGrid. It is also
-    possible to provide cells values in other formats if appropriate, e.g. as
-    numbers.
-
-    This base class is not quite abstract as it implements a trivial strategy
-    for storing the attributes by forwarding it to wxGridCellAttrProvider and
-    also provides stubs for some other functions. However it does have a number
-    of pure virtual methods which must be implemented in the derived classes.
+    @class wxGridCellNumberRenderer
 
-    @see wxGridStringTable
+    This class may be used to format integer data in a cell.
 
     @library{wxadv}
     @category{grid}
+
+    @see wxGridCellRenderer, wxGridCellBoolRenderer, wxGridCellFloatRenderer,
+         wxGridCellStringRenderer
 */
-class wxGridTableBase : public wxObject
+class wxGridCellNumberRenderer : public wxGridCellStringRenderer
 {
 public:
-    /// Default constructor.
-    wxGridTableBase();
-
-    /// Destructor frees the attribute provider if it was created.
-    virtual ~wxGridTableBase();
+    /**
+        Default constructor.
+    */
+    wxGridCellNumberRenderer();
+};
 
-    /// Must be overridden to return the number of rows in the table.
-    virtual int GetNumberRows() = 0;
+/**
+    @class wxGridCellStringRenderer
 
-    /// Must be overridden to return the number of columns in the table.
-    virtual int GetNumberCols() = 0;
+    This class may be used to format string data in a cell; it is the default
+    for string cells.
 
+    @library{wxadv}
+    @category{grid}
 
+    @see wxGridCellRenderer, wxGridCellBoolRenderer, wxGridCellFloatRenderer,
+         wxGridCellNumberRenderer
+*/
+class wxGridCellStringRenderer : public wxGridCellRenderer
+{
+public:
     /**
-        Accessing table cells.
-     */
-    //@{
+        Default constructor.
+    */
+    wxGridCellStringRenderer();
+};
 
-    /// Must be overridden to implement testing for empty cells.
-    virtual bool IsEmptyCell(int row, int col) = 0;
 
-    /**
-        Same as IsEmptyCell() but taking wxGridCellCoords.
 
-        Notice that this method is not virtual, only IsEmptyCell() should be
-        overridden.
-     */
-    bool IsEmpty(const wxGridCellCoords& coords);
+/**
+    @class wxGridCellEditor
 
-    /// Must be overridden to implement accessing the table values as text.
-    virtual wxString GetValue(int row, int col) = 0;
+    This class is responsible for providing and manipulating the in-place edit
+    controls for the grid.  Instances of wxGridCellEditor (actually, instances
+    of derived classes since it is an abstract class) can be associated with
+    the cell attributes for individual cells, rows, columns, or even for the
+    entire grid.
 
-    /// Must be overridden to implement setting the table values as text.
-    virtual void SetValue(int row, int col, const wxString& value) = 0;
+    @library{wxadv}
+    @category{grid}
 
+    @see wxGridCellBoolEditor, wxGridCellChoiceEditor, wxGridCellFloatEditor,
+         wxGridCellNumberEditor, wxGridCellTextEditor
+*/
+class wxGridCellEditor
+{
+public:
     /**
-        Returns the type of the value in the given cell.
-
-        By default all cells are strings and this method returns @c
-        wxGRID_VALUE_STRING.
-     */
-    virtual wxString GetTypeName(int row, int col);
+        Default constructor.
+    */
+    wxGridCellEditor();
 
     /**
-        Returns true if the value of the given cell can be accessed as if it
-        were of the specified type.
-
-        By default the cells can only be accessed as strings. Note that a cell
-        could be accessible in different ways, e.g. a numeric cell may return
-        @true for @c wxGRID_VALUE_NUMBER but also for @c wxGRID_VALUE_STRING
-        indicating that the value can be coerced to a string form.
-     */
-    virtual bool CanGetValueAs(int row, int col, const wxString& typeName);
+        Fetch the value from the table and prepare the edit control to begin
+        editing.
 
-    /**
-        Returns true if the value of the given cell can be set as if it were of
-        the specified type.
+        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 CanGetValueAs()
-     */
-    virtual bool CanSetValueAs(int row, int col, const wxString& typeName);
+        @see EndEdit()
+    */
+    virtual void BeginEdit(int row, int col, wxGrid* grid) = 0;
 
     /**
-        Returns the value of the given cell as a long.
-
-        This should only be called if CanGetValueAs() returns @true when called
-        with @c wxGRID_VALUE_NUMBER argument. Default implementation always
-        return 0.
-     */
-    virtual long GetValueAsLong(int row, int col);
+        Create a new object which is the copy of this one.
+    */
+    virtual wxGridCellEditor* Clone() const = 0;
 
     /**
-        Returns the value of the given cell as a double.
-
-        This should only be called if CanGetValueAs() returns @true when called
-        with @c wxGRID_VALUE_FLOAT argument. Default implementation always
-        return 0.0.
-     */
-    virtual double GetValueAsDouble(int row, int col);
+        Creates the actual edit control.
+    */
+    virtual void Create(wxWindow* parent, wxWindowID id,
+                        wxEvtHandler* evtHandler) = 0;
 
     /**
-        Returns the value of the given cell as a boolean.
-
-        This should only be called if CanGetValueAs() returns @true when called
-        with @c wxGRID_VALUE_BOOL argument. Default implementation always
-        return false.
-     */
-    virtual bool GetValueAsBool(int row, int col);
+        Final cleanup.
+    */
+    virtual void Destroy();
 
     /**
-        Returns the value of the given cell as a user-defined type.
+        End editing the cell.
 
-        This should only be called if CanGetValueAs() returns @true when called
-        with @a typeName. Default implementation always return @NULL.
-     */
-    virtual void *GetValueAsCustom(int row, int col, const wxString& typeName);
+        This function must check if the current value of the editing control is
+        valid and different from the original value (available as @a oldval in
+        its string form and possibly saved internally using its real type by
+        BeginEdit()). If it isn't, it just returns @false, otherwise it fills
+        @a newval with the representation of the new value in the string form,
+        if necessary saves it using its real type internally, and returns @true.
 
+        If the user-defined wxEVT_GRID_CELL_CHANGING event handler doesn't veto
+        this change, ApplyEdit() will be called next.
+    */
+    virtual bool EndEdit(const wxString& oldval, wxString* newval) = 0;
 
     /**
-        Sets the value of the given cell as a long.
+        Effectively save the changes in the grid.
 
-        This should only be called if CanSetValueAs() returns @true when called
-        with @c wxGRID_VALUE_NUMBER argument. Default implementation doesn't do
-        anything.
+        This function should save the value of the control in the grid. It is
+        called only after EndEdit() returns @true.
      */
-    virtual void SetValueAsLong(int row, int col, long value);
+    virtual void ApplyEdit(int row, int col, wxGrid* grid) = 0;
 
     /**
-        Sets the value of the given cell as a double.
-
-        This should only be called if CanSetValueAs() returns @true when called
-        with @c wxGRID_VALUE_FLOAT argument. Default implementation doesn't do
-        anything.
-     */
-    virtual void SetValueAsDouble(int row, int col, double value);
+        Some types of controls on some platforms may need some help with the
+        Return key.
+    */
+    virtual void HandleReturn(wxKeyEvent& event);
 
     /**
-        Sets the value of the given cell as a boolean.
-
-        This should only be called if CanSetValueAs() returns @true when called
-        with @c wxGRID_VALUE_BOOL argument. Default implementation doesn't do
-        anything.
-     */
-    virtual void SetValueAsBool( int row, int col, bool value );
+        Returns @true if the edit control has been created.
+    */
+    bool IsCreated();
 
     /**
-        Sets the value of the given cell as a user-defined type.
+        Draws the part of the cell not occupied by the control: the base class
+        version just fills it with background colour from the attribute.
+    */
+    virtual void PaintBackground(const wxRect& rectCell, wxGridCellAttr* attr);
 
-        This should only be called if CanSetValueAs() returns @true when called
-        with @a typeName. Default implementation doesn't do anything.
-     */
-    virtual void SetValueAsCustom(int row, int col, const wxString& typeName,
-                                  void *value);
+    /**
+        Reset the value in the control back to its starting value.
+    */
+    virtual void Reset() = 0;
 
-    //@}
+    /**
+        Size and position the edit control.
+    */
+    virtual void SetSize(const wxRect& rect);
 
     /**
-        Called by the grid when the table is associated with it.
+        Show or hide the edit control, use the specified attributes to set
+        colours/fonts for it.
+    */
+    virtual void Show(bool show, wxGridCellAttr* attr = NULL);
 
-        The default implementation stores the pointer and returns it from its
-        GetView() and so only makes sense if the table cannot be associated
-        with more than one grid at a time.
-     */
-    virtual void SetView(wxGrid *grid);
+    /**
+        If the editor is enabled by clicking on the cell, this method will be
+        called.
+    */
+    virtual void StartingClick();
 
     /**
-        Returns the last grid passed to SetView().
-     */
-    virtual wxGrid *GetView() const;
+        If the editor is enabled by pressing keys on the grid, this will be
+        called to let the editor do something about that first key if desired.
+    */
+    virtual void StartingKey(wxKeyEvent& event);
 
+protected:
 
     /**
-        Modifying the table structure.
+        The destructor is private because only DecRef() can delete us.
+    */
+    virtual ~wxGridCellEditor();
+};
 
-        Notice that none of these functions are pure virtual as they don't have
-        to be implemented if the table structure is never modified after
-        creation, i.e. neither rows nor columns are never added or deleted but
-        that you do need to implement them if they are called, i.e. if your
-        code either calls them directly or uses the matching wxGrid methods, as
-        by default they simply do nothing which is definitely inappropriate.
-     */
-    //@{
+/**
+    @class wxGridCellBoolEditor
 
-    /**
-        Clear the table contents.
+    Grid cell editor for boolean data.
 
-        This method is used by wxGrid::ClearGrid().
-     */
-    virtual void Clear();
+    @library{wxadv}
+    @category{grid}
 
+    @see wxGridCellEditor, wxGridCellChoiceEditor, wxGridCellFloatEditor,
+         wxGridCellNumberEditor, wxGridCellTextEditor
+*/
+class wxGridCellBoolEditor : public wxGridCellEditor
+{
+public:
     /**
-        Insert additional rows into the table.
-
-        @param pos
-            The position of the first new row.
-        @param numRows
-            The number of rows to insert.
-     */
-    virtual bool InsertRows(size_t pos = 0, size_t numRows = 1);
+        Default constructor.
+    */
+    wxGridCellBoolEditor();
 
     /**
-        Append additional rows at the end of the table.
-
-        This method is provided in addition to InsertRows() as some data models
-        may only support appending rows to them but not inserting them at
-        arbitrary locations. In such case you may implement this method only
-        and leave InsertRows() unimplemented.
-
-        @param pos
-            The position of the first new row.
-        @param numRows
-            The number of rows to add.
-     */
-    virtual bool AppendRows(size_t numRows = 1);
+        Returns @true if the given @a value is equal to the string
+        representation of the truth value we currently use (see
+        UseStringValues()).
+    */
+    static bool IsTrueValue(const wxString& value);
 
     /**
-        Delete rows from the table.
-
-        @param pos
-            The first row to delete.
-        @param numRows
-            The number of rows to delete.
-     */
-    virtual bool DeleteRows(size_t pos = 0, size_t numRows = 1);
-
-    /// Exactly the same as InsertRows() but for columns.
-    virtual bool InsertCols(size_t pos = 0, size_t numCols = 1);
+        This method allows you to customize the values returned by GetValue()
+        for the cell using this editor. By default, the default values of the
+        arguments are used, i.e. @c "1" is returned if the cell is checked and
+        an empty string otherwise.
+    */
+    static void UseStringValues(const wxString& valueTrue = "1",
+                                const wxString& valueFalse = wxEmptyString);
+};
 
-    /// Exactly the same as AppendRows() but for columns.
-    virtual bool AppendCols(size_t numCols = 1);
+/**
+    @class wxGridCellChoiceEditor
 
-    /// Exactly the same as DeleteRows() but for columns.
-    virtual bool DeleteCols(size_t pos = 0, size_t numCols = 1);
+    Grid cell editor for string data providing the user a choice from a list of
+    strings.
 
-    //@}
+    @library{wxadv}
+    @category{grid}
 
+    @see wxGridCellEditor, wxGridCellBoolEditor, wxGridCellFloatEditor,
+         wxGridCellNumberEditor, wxGridCellTextEditor
+*/
+class wxGridCellChoiceEditor : public wxGridCellEditor
+{
+public:
     /**
-        Table rows and columns labels.
-
-        By default the numbers are used for labeling rows and Latin letters for
-        labeling columns. If the table has more than 26 columns, the pairs of
-        letters are used starting from the 27-th one and so on, i.e. the
-        sequence of labels is A, B, ..., Z, AA, AB, ..., AZ, BA, ..., ..., ZZ,
-        AAA, ...
-     */
-    //@{
-
-    /// Return the label of the specified row.
-    virtual wxString GetRowLabelValue(int row);
-
-    /// Return the label of the specified column.
-    virtual wxString GetColLabelValue(int col);
-
+        @param count
+            Number of strings from which the user can choose.
+        @param choices
+            An array of strings from which the user can choose.
+        @param allowOthers
+            If allowOthers is @true, the user can type a string not in choices
+            array.
+    */
+    wxGridCellChoiceEditor(size_t count = 0,
+                           const wxString choices[] = NULL,
+                           bool allowOthers = false);
     /**
-        Set the given label for the specified row.
+        @param choices
+            An array of strings from which the user can choose.
+        @param allowOthers
+            If allowOthers is @true, the user can type a string not in choices
+            array.
+    */
+    wxGridCellChoiceEditor(const wxArrayString& choices,
+                           bool allowOthers = false);
 
-        The default version does nothing, i.e. the label is not stored. You
-        must override this method in your derived class if you wish
-        wxGrid::SetRowLabelValue() to work.
-     */
-    virtual void SetRowLabelValue(int row, const wxString& label);
+    /**
+        Parameters string format is "item1[,item2[...,itemN]]"
+    */
+    virtual void SetParameters(const wxString& params);
+};
 
-    /// Exactly the same as SetRowLabelValue() but for columns.
-    virtual void SetColLabelValue(int col, const wxString& label);
+/**
+    @class wxGridCellTextEditor
 
-    //@}
+    Grid cell editor for string/text data.
 
+    @library{wxadv}
+    @category{grid}
 
+    @see wxGridCellEditor, wxGridCellBoolEditor, wxGridCellChoiceEditor,
+         wxGridCellFloatEditor, wxGridCellNumberEditor
+*/
+class wxGridCellTextEditor : public wxGridCellEditor
+{
+public:
     /**
-        Attributes management.
-
-        By default the attributes management is delegated to
-        wxGridCellAttrProvider class. You may override the methods in this
-        section to handle the attributes directly if, for example, they can be
-        computed from the cell values.
-     */
-    //@{
+        Default constructor.
+    */
+    wxGridCellTextEditor();
 
     /**
-        Associate this attributes provider with the table.
+        The parameters string format is "n" where n is a number representing
+        the maximum width.
+    */
+    virtual void SetParameters(const wxString& params);
+};
 
-        The table takes ownership of @a attrProvider pointer and will delete it
-        when it doesn't need it any more. The pointer can be @NULL, however
-        this won't disable attributes management in the table but will just
-        result in a default attributes being recreated the next time any of the
-        other functions in this section is called. To completely disable the
-        attributes support, should this be needed, you need to override
-        CanHaveAttributes() to return @false.
-     */
-    void SetAttrProvider(wxGridCellAttrProvider *attrProvider);
+/**
+    @class wxGridCellFloatEditor
 
-    /**
-        Returns the attribute provider currently being used.
+    The editor for floating point numbers data.
 
-        This function may return @NULL if the attribute provider hasn't been
-        neither associated with this table by SetAttrProvider() nor created on
-        demand by any other methods.
-     */
-    wxGridCellAttrProvider *GetAttrProvider() const { return m_attrProvider; }
+    @library{wxadv}
+    @category{grid}
 
+    @see wxGridCellEditor, wxGridCellNumberEditor, wxGridCellBoolEditor,
+    wxGridCellTextEditor, wxGridCellChoiceEditor
+*/
+class wxGridCellFloatEditor : public wxGridCellTextEditor
+{
+public:
     /**
-        Returns true if this table supports attributes or false otherwise.
-
-        By default, the table automatically creates a wxGridCellAttrProvider
-        when this function is called if it had no attribute provider before and
-        returns @true.
-     */
-    virtual bool CanHaveAttributes();
+        @param width
+            Minimum number of characters to be shown.
+        @param precision
+            Number of digits after the decimal dot.
+    */
+    wxGridCellFloatEditor(int width = -1, int precision = -1);
 
     /**
-        Return the attribute for the given cell.
-
-        By default this function is simply forwarded to
-        wxGridCellAttrProvider::GetAttr() but it may be overridden to handle
-        attributes directly in the table.
-     */
-    virtual wxGridCellAttr *GetAttr(int row, int col,
-                                    wxGridCellAttr::wxAttrKind kind);
+        Parameters string format is "width,precision"
+    */
+    virtual void SetParameters(const wxString& params);
+};
 
-    /**
-        Set attribute of the specified cell.
+/**
+    @class wxGridCellNumberEditor
 
-        By default this function is simply forwarded to
-        wxGridCellAttrProvider::SetAttr().
+    Grid cell editor for numeric integer data.
 
-        The table takes ownership of @a attr, i.e. will call DecRef() on it.
-     */
-    virtual void SetAttr(wxGridCellAttr* attr, int row, int col);
+    @library{wxadv}
+    @category{grid}
 
+    @see wxGridCellEditor, wxGridCellBoolEditor, wxGridCellChoiceEditor,
+         wxGridCellFloatEditor, wxGridCellTextEditor
+*/
+class wxGridCellNumberEditor : public wxGridCellTextEditor
+{
+public:
     /**
-        Set attribute of the specified row.
-
-        By default this function is simply forwarded to
-        wxGridCellAttrProvider::SetRowAttr().
+        Allows you to specify the range for acceptable data. Values equal to
+        -1 for both @a min and @a max indicate that no range checking should be
+        done.
+    */
+    wxGridCellNumberEditor(int min = -1, int max = -1);
 
-        The table takes ownership of @a attr, i.e. will call DecRef() on it.
-     */
-    virtual void SetRowAttr(wxGridCellAttr *attr, int row);
 
     /**
-        Set attribute of the specified column.
+        Parameters string format is "min,max".
+    */
+    virtual void SetParameters(const wxString& params);
 
-        By default this function is simply forwarded to
-        wxGridCellAttrProvider::SetColAttr().
+protected:
 
-        The table takes ownership of @a attr, i.e. will call DecRef() on it.
-     */
-    virtual void SetColAttr(wxGridCellAttr *attr, int col);
+    /**
+        If the return value is @true, the editor uses a wxSpinCtrl to get user
+        input, otherwise it uses a wxTextCtrl.
+    */
+    bool HasRange() const;
 
-    //@}
+    /**
+        String representation of the value.
+    */
+    wxString GetString() const;
 };
 
 
 
 /**
-    @class wxGridCellEditor
+    @class wxGridCellAttr
 
-    This class is responsible for providing and manipulating
-    the in-place edit controls for the grid.  Instances of wxGridCellEditor
-    (actually, instances of derived classes since it is an abstract class) can be
-    associated with the cell attributes for individual cells, rows, columns, or
-    even for the entire grid.
+    This class can be used to alter the cells' appearance in the grid by
+    changing their attributes from the defaults. An object of this class may be
+    returned by wxGridTableBase::GetAttr().
 
     @library{wxadv}
     @category{grid}
-
-    @see wxGridCellTextEditor, wxGridCellFloatEditor, wxGridCellBoolEditor,
-    wxGridCellNumberEditor, wxGridCellChoiceEditor
 */
-class wxGridCellEditor
+class wxGridCellAttr
 {
 public:
     /**
-
+        Default constructor.
     */
-    wxGridCellEditor();
-
+    wxGridCellAttr(wxGridCellAttr* attrDefault = NULL);
     /**
-        The dtor is private because only DecRef() can delete us.
+        Constructor specifying some of the often used attributes.
     */
-    ~wxGridCellEditor();
+    wxGridCellAttr(const wxColour& colText, const wxColour& colBack,
+                   const wxFont& font, int hAlign, int vAlign);
 
     /**
-        Fetch the value from the table and prepare the edit control
-        to begin editing. Set the focus to the edit control.
+        Creates a new copy of this object.
     */
-    void BeginEdit(int row, int col, wxGrid* grid);
+    wxGridCellAttr* Clone() const;
 
     /**
-        Create a new object which is the copy of this one.
+        This class is reference counted: it is created with ref count of 1, so
+        calling DecRef() once will delete it. Calling IncRef() allows to lock
+        it until the matching DecRef() is called.
     */
-    wxGridCellEditor* Clone() const;
+    void DecRef();
 
     /**
-        Creates the actual edit control.
+        See SetAlignment() for the returned values.
     */
-    void Create(wxWindow* parent, wxWindowID id,
-                wxEvtHandler* evtHandler);
+    void GetAlignment(int* hAlign, int* vAlign) const;
 
     /**
-        Final cleanup.
+        Returns the background colour.
     */
-    void Destroy();
+    const wxColour& GetBackgroundColour() const;
 
     /**
-        Complete the editing of the current cell. Returns @true if the value has
-        changed. If necessary, the control may be destroyed.
+        Returns the cell editor.
     */
-    bool EndEdit(int row, int col, wxGrid* grid);
+    wxGridCellEditor* GetEditor(const wxGrid* grid, int row, int col) const;
 
     /**
-        Some types of controls on some platforms may need some help
-        with the Return key.
+        Returns the font.
     */
-    void HandleReturn(wxKeyEvent& event);
+    const wxFont& GetFont() const;
 
     /**
-
+        Returns the cell renderer.
     */
-    bool IsCreated();
+    wxGridCellRenderer* GetRenderer(const wxGrid* grid, int row, int col) const;
 
     /**
-        Draws the part of the cell not occupied by the control: the base class
-        version just fills it with background colour from the attribute.
+        Returns the text colour.
     */
-    void PaintBackground(const wxRect& rectCell,
-                         wxGridCellAttr* attr);
+    const wxColour& GetTextColour() const;
 
     /**
-        Reset the value in the control back to its starting value.
+        Returns @true if this attribute has a valid alignment set.
     */
-    void Reset();
+    bool HasAlignment() const;
 
     /**
-        Size and position the edit control.
+        Returns @true if this attribute has a valid background colour set.
     */
-    void SetSize(const wxRect& rect);
+    bool HasBackgroundColour() const;
 
     /**
-        Show or hide the edit control, use the specified attributes to set
-        colours/fonts for it.
+        Returns @true if this attribute has a valid cell editor set.
     */
-    void Show(bool show, wxGridCellAttr* attr = NULL);
+    bool HasEditor() const;
 
     /**
-        If the editor is enabled by clicking on the cell, this method will be
-        called.
+        Returns @true if this attribute has a valid font set.
     */
-    void StartingClick();
+    bool HasFont() const;
 
     /**
-        If the editor is enabled by pressing keys on the grid,
-        this will be called to let the editor do something about
-        that first key if desired.
+        Returns @true if this attribute has a valid cell renderer set.
     */
-    void StartingKey(wxKeyEvent& event);
-};
+    bool HasRenderer() const;
 
+    /**
+        Returns @true if this attribute has a valid text colour set.
+    */
+    bool HasTextColour() const;
 
+    /**
+        This class is reference counted: it is created with ref count of 1, so
+        calling DecRef() once will delete it. Calling IncRef() allows to lock
+        it until the matching DecRef() is called.
+    */
+    void IncRef();
 
-/**
-    @class wxGridCellTextEditor
+    /**
+        Returns @true if this cell is set as read-only.
+    */
+    bool IsReadOnly() const;
 
-    The editor for string/text data.
+    /**
+        Sets the alignment. @a hAlign can be one of @c wxALIGN_LEFT,
+        @c wxALIGN_CENTRE or @c wxALIGN_RIGHT and @a vAlign can be one of
+        @c wxALIGN_TOP, @c wxALIGN_CENTRE or @c wxALIGN_BOTTOM.
+    */
+    void SetAlignment(int hAlign, int vAlign);
 
-    @library{wxadv}
-    @category{grid}
+    /**
+        Sets the background colour.
+    */
+    void SetBackgroundColour(const wxColour& colBack);
 
-    @see wxGridCellEditor, wxGridCellFloatEditor, wxGridCellBoolEditor,
-    wxGridCellNumberEditor, wxGridCellChoiceEditor
-*/
-class wxGridCellTextEditor : public wxGridCellEditor
-{
-public:
     /**
-        Default constructor.
+        @todo Needs documentation.
     */
-    wxGridCellTextEditor();
+    void SetDefAttr(wxGridCellAttr* defAttr);
 
     /**
-        The parameters string format is "n" where n is a number representing the
-        maximum width.
+        Sets the editor to be used with the cells with this attribute.
     */
-    void SetParameters(const wxString& params);
-};
+    void SetEditor(wxGridCellEditor* editor);
 
+    /**
+        Sets the font.
+    */
+    void SetFont(const wxFont& font);
 
+    /**
+        Sets the cell as read-only.
+    */
+    void SetReadOnly(bool isReadOnly = true);
 
-/**
-    @class wxGridCellStringRenderer
-
-    This class may be used to format string data in a cell; it is the default
-    for string cells.
-
-    @library{wxadv}
-    @category{grid}
+    /**
+        Sets the renderer to be used for cells with this attribute. Takes
+        ownership of the pointer.
+    */
+    void SetRenderer(wxGridCellRenderer* renderer);
 
-    @see wxGridCellRenderer, wxGridCellNumberRenderer, wxGridCellFloatRenderer,
-    wxGridCellBoolRenderer
-*/
-class wxGridCellStringRenderer : public wxGridCellRenderer
-{
-public:
     /**
-        Default constructor
+        Sets the text colour.
     */
-    wxGridCellStringRenderer();
+    void SetTextColour(const wxColour& colText);
 };
 
 
 
 /**
-    @class wxGridCellChoiceEditor
+    @class wxGridTableBase
 
-    The editor for string data allowing to choose from a list of strings.
+    The almost abstract base class for grid tables.
+
+    A grid table is responsible for storing the grid data and, indirectly, grid
+    cell attributes. The data can be stored in the way most convenient for the
+    application but has to be provided in string form to wxGrid. It is also
+    possible to provide cells values in other formats if appropriate, e.g. as
+    numbers.
+
+    This base class is not quite abstract as it implements a trivial strategy
+    for storing the attributes by forwarding it to wxGridCellAttrProvider and
+    also provides stubs for some other functions. However it does have a number
+    of pure virtual methods which must be implemented in the derived classes.
+
+    @see wxGridStringTable
 
     @library{wxadv}
     @category{grid}
-
-    @see wxGridCellEditor, wxGridCellFloatEditor, wxGridCellBoolEditor,
-    wxGridCellTextEditor, wxGridCellNumberEditor
 */
-class wxGridCellChoiceEditor : public wxGridCellEditor
+class wxGridTableBase : public wxObject
 {
 public:
+    /**
+        Default constructor.
+     */
+    wxGridTableBase();
+
+    /**
+        Destructor frees the attribute provider if it was created.
+     */
+    virtual ~wxGridTableBase();
+
+    /**
+        Must be overridden to return the number of rows in the table.
+
+        For backwards compatibility reasons, this method is not const.
+        Use GetRowsCount() instead of it in const methods of derived table
+        classes.
+     */
+    virtual int GetNumberRows() = 0;
+
+    /**
+        Must be overridden to return the number of columns in the table.
+
+        For backwards compatibility reasons, this method is not const.
+        Use GetColsCount() instead of it in const methods of derived table
+        classes,
+     */
+    virtual int GetNumberCols() = 0;
+
+    /**
+        Return the number of rows in the table.
+
+        This method is not virtual and is only provided as a convenience for
+        the derived classes which can't call GetNumberRows() without a
+        @c const_cast from their const methods.
+     */
+    int GetRowsCount() const;
+
+    /**
+        Return the number of columns in the table.
+
+        This method is not virtual and is only provided as a convenience for
+        the derived classes which can't call GetNumberCols() without a
+        @c const_cast from their const methods.
+     */
+    int GetColsCount() const;
+
+
+    /**
+        @name Table Cell Accessors
+     */
     //@{
+
     /**
-        @param count
-            Number of strings from which the user can choose.
-        @param choices
-            An array of strings from which the user can choose.
-        @param allowOthers
-            If allowOthers is @true, the user can type a string not in choices array.
-    */
-    wxGridCellChoiceEditor(size_t count = 0,
-                           const wxString choices[] = NULL,
-                           bool allowOthers = false);
-    wxGridCellChoiceEditor(const wxArrayString& choices,
-                           bool allowOthers = false);
+        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);
+
+    /**
+        Same as IsEmptyCell() but taking wxGridCellCoords.
+
+        Notice that this method is not virtual, only IsEmptyCell() should be
+        overridden.
+     */
+    bool IsEmpty(const wxGridCellCoords& coords);
+
+    /**
+        Must be overridden to implement accessing the table values as text.
+     */
+    virtual wxString GetValue(int row, int col) = 0;
+
+    /**
+        Must be overridden to implement setting the table values as text.
+     */
+    virtual void SetValue(int row, int col, const wxString& value) = 0;
+
+    /**
+        Returns the type of the value in the given cell.
+
+        By default all cells are strings and this method returns
+        @c wxGRID_VALUE_STRING.
+     */
+    virtual wxString GetTypeName(int row, int col);
+
+    /**
+        Returns true if the value of the given cell can be accessed as if it
+        were of the specified type.
+
+        By default the cells can only be accessed as strings. Note that a cell
+        could be accessible in different ways, e.g. a numeric cell may return
+        @true for @c wxGRID_VALUE_NUMBER but also for @c wxGRID_VALUE_STRING
+        indicating that the value can be coerced to a string form.
+     */
+    virtual bool CanGetValueAs(int row, int col, const wxString& typeName);
+
+    /**
+        Returns true if the value of the given cell can be set as if it were of
+        the specified type.
+
+        @see CanGetValueAs()
+     */
+    virtual bool CanSetValueAs(int row, int col, const wxString& typeName);
+
+    /**
+        Returns the value of the given cell as a long.
+
+        This should only be called if CanGetValueAs() returns @true when called
+        with @c wxGRID_VALUE_NUMBER argument. Default implementation always
+        return 0.
+     */
+    virtual long GetValueAsLong(int row, int col);
+
+    /**
+        Returns the value of the given cell as a double.
+
+        This should only be called if CanGetValueAs() returns @true when called
+        with @c wxGRID_VALUE_FLOAT argument. Default implementation always
+        return 0.0.
+     */
+    virtual double GetValueAsDouble(int row, int col);
+
+    /**
+        Returns the value of the given cell as a boolean.
+
+        This should only be called if CanGetValueAs() returns @true when called
+        with @c wxGRID_VALUE_BOOL argument. Default implementation always
+        return false.
+     */
+    virtual bool GetValueAsBool(int row, int col);
+
+    /**
+        Returns the value of the given cell as a user-defined type.
+
+        This should only be called if CanGetValueAs() returns @true when called
+        with @a typeName. Default implementation always return @NULL.
+     */
+    virtual void *GetValueAsCustom(int row, int col, const wxString& typeName);
+
+    /**
+        Sets the value of the given cell as a long.
+
+        This should only be called if CanSetValueAs() returns @true when called
+        with @c wxGRID_VALUE_NUMBER argument. Default implementation doesn't do
+        anything.
+     */
+    virtual void SetValueAsLong(int row, int col, long value);
+
+    /**
+        Sets the value of the given cell as a double.
+
+        This should only be called if CanSetValueAs() returns @true when called
+        with @c wxGRID_VALUE_FLOAT argument. Default implementation doesn't do
+        anything.
+     */
+    virtual void SetValueAsDouble(int row, int col, double value);
+
+    /**
+        Sets the value of the given cell as a boolean.
+
+        This should only be called if CanSetValueAs() returns @true when called
+        with @c wxGRID_VALUE_BOOL argument. Default implementation doesn't do
+        anything.
+     */
+    virtual void SetValueAsBool( int row, int col, bool value );
+
+    /**
+        Sets the value of the given cell as a user-defined type.
+
+        This should only be called if CanSetValueAs() returns @true when called
+        with @a typeName. Default implementation doesn't do anything.
+     */
+    virtual void SetValueAsCustom(int row, int col, const wxString& typeName,
+                                  void *value);
+
     //@}
 
+
     /**
-        Parameters string format is "item1[,item2[...,itemN]]"
-    */
-    void SetParameters(const wxString& params);
-};
+        Called by the grid when the table is associated with it.
 
+        The default implementation stores the pointer and returns it from its
+        GetView() and so only makes sense if the table cannot be associated
+        with more than one grid at a time.
+     */
+    virtual void SetView(wxGrid *grid);
 
+    /**
+        Returns the last grid passed to SetView().
+     */
+    virtual wxGrid *GetView() const;
 
-/**
-    @class wxGridEditorCreatedEvent
 
+    /**
+        @name Table Structure Modifiers
 
-    @library{wxadv}
-    @category{grid}
-*/
-class wxGridEditorCreatedEvent : public wxCommandEvent
-{
-public:
+        Notice that none of these functions are pure virtual as they don't have
+        to be implemented if the table structure is never modified after
+        creation, i.e. neither rows nor columns are never added or deleted but
+        that you do need to implement them if they are called, i.e. if your
+        code either calls them directly or uses the matching wxGrid methods, as
+        by default they simply do nothing which is definitely inappropriate.
+     */
     //@{
+
     /**
+        Clear the table contents.
+
+        This method is used by wxGrid::ClearGrid().
+     */
+    virtual void Clear();
+
+    /**
+        Insert additional rows into the table.
+
+        @param pos
+            The position of the first new row.
+        @param numRows
+            The number of rows to insert.
+     */
+    virtual bool InsertRows(size_t pos = 0, size_t numRows = 1);
+
+    /**
+        Append additional rows at the end of the table.
+
+        This method is provided in addition to InsertRows() as some data models
+        may only support appending rows to them but not inserting them at
+        arbitrary locations. In such case you may implement this method only
+        and leave InsertRows() unimplemented.
+
+        @param numRows
+            The number of rows to add.
+     */
+    virtual bool AppendRows(size_t numRows = 1);
+
+    /**
+        Delete rows from the table.
+
+        @param pos
+            The first row to delete.
+        @param numRows
+            The number of rows to delete.
+     */
+    virtual bool DeleteRows(size_t pos = 0, size_t numRows = 1);
+
+    /**
+        Exactly the same as InsertRows() but for columns.
+     */
+    virtual bool InsertCols(size_t pos = 0, size_t numCols = 1);
+
+    /**
+        Exactly the same as AppendRows() but for columns.
+     */
+    virtual bool AppendCols(size_t numCols = 1);
+
+    /**
+        Exactly the same as DeleteRows() but for columns.
+     */
+    virtual bool DeleteCols(size_t pos = 0, size_t numCols = 1);
 
-    */
-    wxGridEditorCreatedEvent();
-    wxGridEditorCreatedEvent(int id, wxEventType type,
-                             wxObject* obj,
-                             int row,
-                             int col,
-                             wxControl* ctrl);
     //@}
 
     /**
-        Returns the column at which the event occurred.
-    */
-    int GetCol();
+        @name Table Row and Column Labels
+
+        By default the numbers are used for labeling rows and Latin letters for
+        labeling columns. If the table has more than 26 columns, the pairs of
+        letters are used starting from the 27-th one and so on, i.e. the
+        sequence of labels is A, B, ..., Z, AA, AB, ..., AZ, BA, ..., ..., ZZ,
+        AAA, ...
+     */
+    //@{
 
     /**
-        Returns the edit control.
-    */
-    wxControl* GetControl();
+        Return the label of the specified row.
+     */
+    virtual wxString GetRowLabelValue(int row);
 
     /**
-        Returns the row at which the event occurred.
-    */
-    int GetRow();
+        Return the label of the specified column.
+     */
+    virtual wxString GetColLabelValue(int col);
 
     /**
-        Sets the column at which the event occurred.
-    */
-    void SetCol(int col);
+        Set the given label for the specified row.
+
+        The default version does nothing, i.e. the label is not stored. You
+        must override this method in your derived class if you wish
+        wxGrid::SetRowLabelValue() to work.
+     */
+    virtual void SetRowLabelValue(int row, const wxString& label);
 
     /**
-        Sets the edit control.
-    */
-    void SetControl(wxControl* ctrl);
+        Exactly the same as SetRowLabelValue() but for columns.
+     */
+    virtual void SetColLabelValue(int col, const wxString& label);
+
+    //@}
+
 
     /**
-        Sets the row at which the event occurred.
-    */
-    void SetRow(int row);
+        @name Attributes Management
+
+        By default the attributes management is delegated to
+        wxGridCellAttrProvider class. You may override the methods in this
+        section to handle the attributes directly if, for example, they can be
+        computed from the cell values.
+     */
+    //@{
+
+    /**
+        Associate this attributes provider with the table.
+
+        The table takes ownership of @a attrProvider pointer and will delete it
+        when it doesn't need it any more. The pointer can be @NULL, however
+        this won't disable attributes management in the table but will just
+        result in a default attributes being recreated the next time any of the
+        other functions in this section is called. To completely disable the
+        attributes support, should this be needed, you need to override
+        CanHaveAttributes() to return @false.
+     */
+    void SetAttrProvider(wxGridCellAttrProvider *attrProvider);
+
+    /**
+        Returns the attribute provider currently being used.
+
+        This function may return @NULL if the attribute provider hasn't been
+        neither associated with this table by SetAttrProvider() nor created on
+        demand by any other methods.
+     */
+    wxGridCellAttrProvider *GetAttrProvider() const;
+
+    /**
+        Return the attribute for the given cell.
+
+        By default this function is simply forwarded to
+        wxGridCellAttrProvider::GetAttr() but it may be overridden to handle
+        attributes directly in the table.
+     */
+    virtual wxGridCellAttr *GetAttr(int row, int col,
+                                    wxGridCellAttr::wxAttrKind kind);
+
+    /**
+        Set attribute of the specified cell.
+
+        By default this function is simply forwarded to
+        wxGridCellAttrProvider::SetAttr().
+
+        The table takes ownership of @a attr, i.e. will call DecRef() on it.
+     */
+    virtual void SetAttr(wxGridCellAttr* attr, int row, int col);
+
+    /**
+        Set attribute of the specified row.
+
+        By default this function is simply forwarded to
+        wxGridCellAttrProvider::SetRowAttr().
+
+        The table takes ownership of @a attr, i.e. will call DecRef() on it.
+     */
+    virtual void SetRowAttr(wxGridCellAttr *attr, int row);
+
+    /**
+        Set attribute of the specified column.
+
+        By default this function is simply forwarded to
+        wxGridCellAttrProvider::SetColAttr().
+
+        The table takes ownership of @a attr, i.e. will call DecRef() on it.
+     */
+    virtual void SetColAttr(wxGridCellAttr *attr, int col);
+
+    //@}
+
+    /**
+        Returns true if this table supports attributes or false otherwise.
+
+        By default, the table automatically creates a wxGridCellAttrProvider
+        when this function is called if it had no attribute provider before and
+        returns @true.
+     */
+    virtual bool CanHaveAttributes();
 };
 
 
 
 /**
-    @class wxGridRangeSelectEvent
+    @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 wxGridRangeSelectEvent : public wxNotifyEvent
+class wxGrid : public wxScrolledWindow
 {
 public:
-    //@{
+
     /**
+        Different selection modes supported by the grid.
+     */
+    enum wxGridSelectionModes
+    {
+        /**
+            The default selection mode allowing selection of the individual
+            cells as well as of the entire rows and columns.
+         */
+        wxGridSelectCells,
 
-    */
-    wxGridRangeSelectEvent();
-    wxGridRangeSelectEvent(int id, wxEventType type,
-                           wxObject* obj,
-                           const wxGridCellCoords& topLeft,
-                           const wxGridCellCoords& bottomRight,
-                           bool sel = true,
-                           bool control = false,
-                           bool shift = false,
-                           bool alt = false,
-                           bool meta = false);
-    //@}
+        /**
+            The selection mode allowing the selection of the entire rows only.
+
+            The user won't be able to select any cells or columns in this mode.
+         */
+        wxGridSelectRows,
+
+        /**
+            The selection mode allowing the selection of the entire columns only.
+
+            The user won't be able to select any cells or rows in this mode.
+         */
+        wxGridSelectColumns
+    };
 
-    /**
-        Returns @true if the Alt key was down at the time of the event.
-    */
-    bool AltDown();
 
     /**
-        Returns @true if the Control key was down at the time of the event.
-    */
-    bool ControlDown();
+        @name Constructors and Initialization
+     */
+    //@{
 
     /**
-        Top left corner of the rectangular area that was (de)selected.
-    */
-    wxGridCellCoords GetBottomRightCoords();
+        Default constructor.
 
+        You must call Create() to really create the grid window and also call
+        CreateGrid() or SetTable() to initialize the grid contents.
+     */
+    wxGrid();
     /**
-        Bottom row of the rectangular area that was (de)selected.
-    */
-    int GetBottomRow();
+        Constructor creating the grid window.
 
-    /**
-        Left column of the rectangular area that was (de)selected.
+        You must call either CreateGrid() or SetTable() to initialize the grid
+        contents before using it.
     */
-    int GetLeftCol();
+    wxGrid(wxWindow* parent, wxWindowID id,
+           const wxPoint& pos = wxDefaultPosition,
+           const wxSize& size = wxDefaultSize,
+           long style = wxWANTS_CHARS,
+           const wxString& name = wxGridNameStr);
 
     /**
-        Right column of the rectangular area that was (de)selected.
-    */
-    int GetRightCol();
+        Destructor.
 
-    /**
-        Top left corner of the rectangular area that was (de)selected.
+        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()).
     */
-    wxGridCellCoords GetTopLeftCoords();
+    virtual ~wxGrid();
 
     /**
-        Top row of the rectangular area that was (de)selected.
-    */
-    int GetTopRow();
+        Creates the grid window for an object initialized using the default
+        constructor.
 
-    /**
-        Returns @true if the Meta key was down at the time of the event.
-    */
-    bool MetaDown();
+        You must call either CreateGrid() or SetTable() to initialize the grid
+        contents before using it.
+     */
+    bool Create(wxWindow* parent, wxWindowID id,
+                const wxPoint& pos = wxDefaultPosition,
+                const wxSize& size = wxDefaultSize,
+                long style = wxWANTS_CHARS,
+                const wxString& name = wxGridNameStr);
 
     /**
-        Returns @true if the area was selected, @false otherwise.
-    */
-    bool Selecting();
+        Creates a grid with the specified initial number of rows and columns.
 
-    /**
-        Returns @true if the Shift key was down at the time of the event.
+        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().
     */
-    bool ShiftDown();
-};
+    bool CreateGrid(int numRows, int numCols,
+                    wxGridSelectionModes selmode = wxGridSelectCells);
 
+    /**
+        Passes a pointer to a custom grid table to be used by the grid.
 
+        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.
 
-/**
-    @class wxGridCellRenderer
+        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);
 
-    This class is responsible for actually drawing the cell
-    in the grid. You may pass it to the wxGridCellAttr (below) to change the
-    format of one given cell or to wxGrid::SetDefaultRenderer() to change the
-    view of all cells. This is an abstract class, and you will normally use one of
-    the
-    predefined derived classes or derive your own class from it.
+    //@}
 
-    @library{wxadv}
-    @category{grid}
 
-    @see wxGridCellStringRenderer, wxGridCellNumberRenderer,
-    wxGridCellFloatRenderer, wxGridCellBoolRenderer
-*/
-class wxGridCellRenderer
-{
-public:
     /**
-
-    */
-    wxGridCellRenderer* Clone() const;
+        @name Grid Line Formatting
+     */
+    //@{
 
     /**
-        Draw the given cell on the provided DC inside the given rectangle
-        using the style specified by the attribute and the default or selected
-        state corresponding to the isSelected value.
-        This pure virtual function has a default implementation which will
-        prepare the DC using the given attribute: it will draw the rectangle
-        with the background colour from attr and set the text colour and font.
+        Turns the drawing of grid lines on or off.
     */
-    void Draw(wxGrid& grid, wxGridCellAttr& attr, wxDC& dc,
-              const wxRect& rect, int row, int col,
-              bool isSelected);
+    void EnableGridLines(bool enable = true);
 
     /**
-        Get the preferred size of the cell for its contents.
-    */
-    wxSize GetBestSize(wxGrid& grid, wxGridCellAttr& attr, wxDC& dc,
-                       int row, int col);
-};
+        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.
+    */
+    virtual wxPen GetColGridLinePen(int col);
 
-/**
-    @class wxGridCellNumberEditor
+    /**
+        Returns the pen used for grid lines.
 
-    The editor for numeric integer data.
+        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.
 
-    @library{wxadv}
-    @category{grid}
+        @see GetColGridLinePen(), GetRowGridLinePen()
+    */
+    virtual wxPen GetDefaultGridLinePen();
 
-    @see wxGridCellEditor, wxGridCellFloatEditor, wxGridCellBoolEditor,
-    wxGridCellTextEditor, wxGridCellChoiceEditor
-*/
-class wxGridCellNumberEditor : public wxGridCellTextEditor
-{
-public:
     /**
-        Allows to specify the range for acceptable data;
-        if min == max == -1, no range checking is done
+        Returns the colour used for grid lines.
+
+        @see GetDefaultGridLinePen()
     */
-    wxGridCellNumberEditor(int min = -1, int max = -1);
+    wxColour GetGridLineColour() const;
 
     /**
-        String representation of the value.
+        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
     */
-    wxString GetString() const;
+    virtual wxPen GetRowGridLinePen(int row);
 
     /**
-        If the return value is @true, the editor uses a wxSpinCtrl to get user input,
-        otherwise it uses a wxTextCtrl.
+        Returns @true if drawing of grid lines is turned on, @false otherwise.
     */
-    bool HasRange() const;
+    bool GridLinesEnabled() const;
 
     /**
-        Parameters string format is "min,max".
+        Sets the colour used to draw grid lines.
     */
-    void SetParameters(const wxString& params);
-};
-
-
+    void SetGridLineColour(const wxColour& colour);
 
-/**
-    @class wxGridSizeEvent
+    //@}
 
-    This event class contains information about a row/column resize event.
 
-    @library{wxadv}
-    @category{grid}
-*/
-class wxGridSizeEvent : public wxNotifyEvent
-{
-public:
+    /**
+        @name Label Values and Formatting
+     */
     //@{
+
     /**
+        Sets the arguments to the current column label alignment values.
 
-    */
-    wxGridSizeEvent();
-    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);
-    //@}
+        Horizontal alignment will be one of @c wxALIGN_LEFT, @c wxALIGN_CENTRE
+        or @c wxALIGN_RIGHT.
 
-    /**
-        Returns @true if the Alt key was down at the time of the event.
+        Vertical alignment will be one of @c wxALIGN_TOP, @c wxALIGN_CENTRE or
+        @c wxALIGN_BOTTOM.
     */
-    bool AltDown();
+    void GetColLabelAlignment(int* horiz, int* vert) const;
 
     /**
-        Returns @true if the Control key was down at the time of the event.
+        Returns the orientation of the column labels (either @c wxHORIZONTAL or
+        @c wxVERTICAL).
     */
-    bool ControlDown();
+    int GetColLabelTextOrientation() const;
 
     /**
-        Position in pixels at which the event occurred.
-    */
-    wxPoint GetPosition();
+        Returns the specified column label.
 
-    /**
-        Row or column at that was resized.
+        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.
     */
-    int GetRowOrCol();
+    wxString GetColLabelValue(int col) const;
 
     /**
-        Returns @true if the Meta key was down at the time of the event.
+        Returns the colour used for the background of row and column labels.
     */
-    bool MetaDown();
+    wxColour GetLabelBackgroundColour() const;
 
     /**
-        Returns @true if the Shift key was down at the time of the event.
+        Returns the font used for row and column labels.
     */
-    bool ShiftDown();
-};
-
-
-
-/**
-    @class wxGridCellNumberRenderer
-
-    This class may be used to format integer data in a cell.
-
-    @library{wxadv}
-    @category{grid}
+    wxFont GetLabelFont() const;
 
-    @see wxGridCellRenderer, wxGridCellStringRenderer, wxGridCellFloatRenderer,
-    wxGridCellBoolRenderer
-*/
-class wxGridCellNumberRenderer : public wxGridCellStringRenderer
-{
-public:
     /**
-        Default constructor
+        Returns the colour used for row and column label text.
     */
-    wxGridCellNumberRenderer();
-};
-
+    wxColour GetLabelTextColour() const;
 
+    /**
+        Returns the alignment used for row labels.
 
-/**
-    @class wxGridCellAttr
+        Horizontal alignment will be one of @c wxALIGN_LEFT, @c wxALIGN_CENTRE
+        or @c wxALIGN_RIGHT.
 
-    This class can be used to alter the cells' appearance in
-    the grid by changing their colour/font/... from default. An object of this
-    class may be returned by wxGridTableBase::GetAttr.
+        Vertical alignment will be one of @c wxALIGN_TOP, @c wxALIGN_CENTRE or
+        @c wxALIGN_BOTTOM.
+    */
+    void GetRowLabelAlignment(int* horiz, int* vert) const;
 
-    @library{wxadv}
-    @category{grid}
-*/
-class wxGridCellAttr
-{
-public:
-    //@{
     /**
-        Constructor specifying some of the often used attributes.
+        Returns the specified row label.
+
+        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.
     */
-    wxGridCellAttr();
-    wxGridCellAttr(const wxColour& colText,
-                   const wxColour& colBack,
-                   const wxFont& font,
-                   int hAlign, int vAlign);
-    //@}
+    wxString GetRowLabelValue(int row) const;
 
     /**
-        Creates a new copy of this object.
+        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.
     */
-    wxGridCellAttr* Clone() const;
+    void HideColLabels();
 
     /**
+        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.
     */
-    void DecRef();
+    void HideRowLabels();
 
     /**
-        See SetAlignment() for the returned values.
+        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 GetAlignment(int* hAlign, int* vAlign) const;
+    void SetColLabelAlignment(int horiz, int vert);
 
     /**
-
+        Sets the orientation of the column labels (either @c wxHORIZONTAL or
+        @c wxVERTICAL).
     */
-    const wxColour GetBackgroundColour() const;
+    void SetColLabelTextOrientation(int textOrientation);
 
     /**
+        Set the value for the given column label.
 
+        If you are using a custom grid table you must override
+        wxGridTableBase::SetColLabelValue() for this to have any effect.
     */
-    wxGridCellEditor* GetEditor(wxGrid* grid, int row, int col) const;
+    void SetColLabelValue(int col, const wxString& value);
 
     /**
-
+        Sets the background colour for row and column labels.
     */
-    const wxFont GetFont() const;
+    void SetLabelBackgroundColour(const wxColour& colour);
 
     /**
-
+        Sets the font for row and column labels.
     */
-    wxGridCellRenderer* GetRenderer(wxGrid* grid, int row, int col) const;
+    void SetLabelFont(const wxFont& font);
 
     /**
-
+        Sets the colour for row and column label text.
     */
-    const wxColour GetTextColour() const;
+    void SetLabelTextColour(const wxColour& colour);
 
     /**
+        Sets the horizontal and vertical alignment of row 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.
     */
-    bool HasAlignment() const;
+    void SetRowLabelAlignment(int horiz, int vert);
 
     /**
+        Sets the value for the given row label.
 
+        If you are using a derived grid table you must override
+        wxGridTableBase::SetRowLabelValue() for this to have any effect.
     */
-    bool HasBackgroundColour() const;
+    void SetRowLabelValue(int row, const wxString& value);
 
     /**
+        Call this in order to make the column labels use a native look by using
+        wxRenderer::DrawHeaderButton() internally.
+
+        There is no equivalent method for drawing row columns as there is not
+        native look for that. This option is useful when using wxGrid for
+        displaying tables and not as a spread-sheet.
 
+        @see UseNativeHeader()
     */
-    bool HasEditor() const;
+    void SetUseNativeColLabels(bool native = true);
 
     /**
+        Enable the use of native header window for column labels.
+
+        If this function is called with @true argument, a wxHeaderCtrl is used
+        instead to display the column labels instead of drawing them in wxGrid
+        code itself. This has the advantage of making the grid look and feel
+        perfectly the same as native applications (using SetUseNativeColLabels()
+        the grid can be made to look more natively but it still doesn't feel
+        natively, notably the column resizing and dragging still works slightly
+        differently as it is implemented in wxWidgets itself) but results in
+        different behaviour for column and row headers, for which there is no
+        equivalent function, and, most importantly, is unsuitable for grids
+        with huge numbers of columns as wxHeaderCtrl doesn't support virtual
+        mode. Because of this, by default the grid does not use the native
+        header control but you should call this function to enable it if you
+        are using the grid to display tabular data and don't have thousands of
+        columns in it.
+
+        Also note that currently @c wxEVT_GRID_LABEL_LEFT_DCLICK and @c
+        wxEVT_GRID_LABEL_RIGHT_DCLICK events are not generated for the column
+        labels if the native columns header is used (but this limitation could
+        possibly be lifted in the future).
+     */
+    void UseNativeColHeader(bool native = true);
+
+    //@}
 
-    */
-    bool HasFont() const;
 
     /**
+        @name Cell Formatting
 
-    */
-    bool HasRenderer() const;
+        Note that wxGridCellAttr can be used alternatively to most of these
+        methods. See the "Attributes Management" of wxGridTableBase.
+     */
+    //@{
 
     /**
-        accessors
-    */
-    bool HasTextColour() const;
+        Sets the arguments to the horizontal and vertical text alignment values
+        for the grid cell at the specified location.
 
-    /**
-        This class is ref counted: it is created with ref count of 1, so
-        calling DecRef() once will delete it. Calling IncRef() allows to lock
-        it until the matching DecRef() is called
+        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 IncRef();
+    void GetCellAlignment(int row, int col, int* horiz, int* vert) const;
 
     /**
-
+        Returns the background colour of the cell at the specified location.
     */
-    bool IsReadOnly() const;
+    wxColour GetCellBackgroundColour(int row, int col) const;
 
     /**
-        Sets the alignment. @a hAlign can be one of @c wxALIGN_LEFT,
-        @c wxALIGN_CENTRE or @c wxALIGN_RIGHT and @a vAlign can be one
-        of @c wxALIGN_TOP, @c wxALIGN_CENTRE or @c wxALIGN_BOTTOM.
+        Returns the font for text in the grid cell at the specified location.
     */
-    void SetAlignment(int hAlign, int vAlign);
+    wxFont GetCellFont(int row, int col) const;
 
     /**
-        Sets the background colour.
+        Returns the text colour for the grid cell at the specified location.
     */
-    void SetBackgroundColour(const wxColour& colBack);
+    wxColour GetCellTextColour(int row, int col) const;
 
     /**
+        Returns the default cell alignment.
 
-    */
-    void SetDefAttr(wxGridCellAttr* defAttr);
+        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 SetEditor(wxGridCellEditor* editor);
+    void GetDefaultCellAlignment(int* horiz, int* vert) const;
 
     /**
-        Sets the font.
+        Returns the current default background colour for grid cells.
     */
-    void SetFont(const wxFont& font);
+    wxColour GetDefaultCellBackgroundColour() const;
 
     /**
-
+        Returns the current default font for grid cell text.
     */
-    void SetReadOnly(bool isReadOnly = true);
+    wxFont GetDefaultCellFont() const;
 
     /**
-        takes ownership of the pointer
+        Returns the current default colour for grid cell text.
     */
-    void SetRenderer(wxGridCellRenderer* renderer);
+    wxColour GetDefaultCellTextColour() const;
 
     /**
-        Sets the text colour.
-    */
-    void SetTextColour(const wxColour& colText);
-};
-
-
-
-/**
-    @class wxGridCellBoolRenderer
-
-    This class may be used to format boolean data in a cell.
-    for string cells.
+        Sets the horizontal and vertical alignment for grid cell text at the
+        specified location.
 
-    @library{wxadv}
-    @category{grid}
+        Horizontal alignment should be one of @c wxALIGN_LEFT,
+        @c wxALIGN_CENTRE or @c wxALIGN_RIGHT.
 
-    @see wxGridCellRenderer, wxGridCellStringRenderer, wxGridCellFloatRenderer,
-    wxGridCellNumberRenderer
-*/
-class wxGridCellBoolRenderer : public wxGridCellRenderer
-{
-public:
-    /**
-        Default constructor
+        Vertical alignment should be one of @c wxALIGN_TOP, @c wxALIGN_CENTRE
+        or @c wxALIGN_BOTTOM.
     */
-    wxGridCellBoolRenderer();
-};
-
-
+    void SetCellAlignment(int row, int col, int horiz, int vert);
+    /**
+        Sets the horizontal and vertical alignment for grid cell text at the
+        specified location.
 
-/**
-    @class wxGridEvent
+        Horizontal alignment should be one of @c wxALIGN_LEFT,
+        @c wxALIGN_CENTRE or @c wxALIGN_RIGHT.
 
-    This event class contains information about various grid events.
+        Vertical alignment should be one of @c wxALIGN_TOP, @c wxALIGN_CENTRE
+        or @c wxALIGN_BOTTOM.
+    */
+    void SetCellAlignment(int align, int row, int col);
 
-    @library{wxadv}
-    @category{grid}
-*/
-class wxGridEvent : public wxNotifyEvent
-{
-public:
-    //@{
     /**
-
+        Set the background colour for the given cell or all cells by default.
     */
-    wxGridEvent();
-    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);
-    //@}
+    void SetCellBackgroundColour(int row, int col, const wxColour& colour);
 
     /**
-        Returns @true if the Alt key was down at the time of the event.
+        Sets the font for text in the grid cell at the specified location.
     */
-    bool AltDown();
+    void SetCellFont(int row, int col, const wxFont& font);
 
     /**
-        Returns @true if the Control key was down at the time of the event.
+        Sets the text colour for the given cell.
     */
-    bool ControlDown();
-
+    void SetCellTextColour(int row, int col, const wxColour& colour);
     /**
-        Column at which the event occurred.
+        Sets the text colour for the given cell.
     */
-    int GetCol();
-
+    void SetCellTextColour(const wxColour& val, int row, int col);
     /**
-        Position in pixels at which the event occurred.
+        Sets the text colour for all cells by default.
     */
-    wxPoint GetPosition();
+    void SetCellTextColour(const wxColour& colour);
 
     /**
-        Row at which the event occurred.
+        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.
     */
-    int GetRow();
+    void SetDefaultCellAlignment(int horiz, int vert);
 
     /**
-        Returns @true if the Meta key was down at the time of the event.
+        Sets the default background colour for grid cells.
     */
-    bool MetaDown();
+    void SetDefaultCellBackgroundColour(const wxColour& colour);
 
     /**
-        Returns @true if the user is selecting grid cells, @false -- if
-        deselecting.
+        Sets the default font to be used for grid cell text.
     */
-    bool Selecting();
+    void SetDefaultCellFont(const wxFont& font);
 
     /**
-        Returns @true if the Shift key was down at the time of the event.
+        Sets the current default colour for grid cell text.
     */
-    bool ShiftDown();
-};
-
+    void SetDefaultCellTextColour(const wxColour& colour);
 
+    //@}
 
-/**
-    @class wxGridCellFloatEditor
 
-    The editor for floating point numbers data.
+    /**
+        @name Cell Values, Editors, and Renderers
 
-    @library{wxadv}
-    @category{grid}
+        Note that wxGridCellAttr can be used alternatively to most of these
+        methods. See the "Attributes Management" of wxGridTableBase.
+     */
+    //@{
 
-    @see wxGridCellEditor, wxGridCellNumberEditor, wxGridCellBoolEditor,
-    wxGridCellTextEditor, wxGridCellChoiceEditor
-*/
-class wxGridCellFloatEditor : public wxGridCellTextEditor
-{
-public:
     /**
-        @param width
-            Minimum number of characters to be shown.
-        @param precision
-            Number of digits after the decimal dot.
+        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.
     */
-    wxGridCellFloatEditor(int width = -1, int precision = -1);
+    bool CanEnableCellControl() const;
 
     /**
-        Parameters string format is "width,precision"
-    */
-    void SetParameters(const wxString& params);
-};
+        Disables in-place editing of grid cells.
 
+        Equivalent to calling EnableCellEditControl(@false).
+    */
+    void DisableCellEditControl();
 
+    /**
+        Enables or disables in-place editing of grid cell data.
 
-/**
-    @class wxGrid
+        The grid will issue either a @c wxEVT_GRID_EDITOR_SHOWN or
+        @c wxEVT_GRID_EDITOR_HIDDEN event.
+    */
+    void EnableCellEditControl(bool enable = true);
 
-    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_gridoverview 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.
+    /**
+        Makes the grid globally editable or read-only.
 
-    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.
+        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().
 
-    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.
+        For more information about controlling grid cell attributes see the
+        wxGridCellAttr class and the @ref overview_grid.
+    */
+    void EnableEditing(bool edit);
 
-    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.
+    /**
+        Returns a pointer to the editor for the cell at the specified location.
 
-    wxGridCellEditor is the abstract base class for editing the value of a
-    cell. The following editors are predefined:
-     - wxGridCellTextEditor
-     - wxGridCellBoolEditor
-     - wxGridCellChoiceEditor
-     - wxGridCellNumberEditor.
+        See wxGridCellEditor and the @ref overview_grid for more information
+        about cell editors and renderers.
 
-    @library{wxadv}
-    @category{grid}
+        The caller must call DecRef() on the returned pointer.
+    */
+    wxGridCellEditor* GetCellEditor(int row, int col) const;
 
-    @see @ref overview_gridoverview "wxGrid overview"
-*/
-class wxGrid : public wxScrolledWindow
-{
-public:
     /**
-        Different selection modes supported by the grid.
-     */
-    enum wxGridSelectionModes
-    {
-        /**
-            The default selection mode allowing selection of the individual
-            cells as well as of the entire rows and columns.
-         */
-        wxGridSelectCells,
+        Returns a pointer to the renderer for the grid cell at the specified
+        location.
 
-        /**
-            The selection mode allowing the selection of the entire rows only.
+        See wxGridCellRenderer and the @ref overview_grid for more information
+        about cell editors and renderers.
 
-            The user won't be able to select any cells or columns in this mode.
-         */
-        wxGridSelectRows,
+        The caller must call DecRef() on the returned pointer.
+    */
+    wxGridCellRenderer* GetCellRenderer(int row, int col) const;
 
-        /**
-            The selection mode allowing the selection of the entire columns only.
+    /**
+        Returns the string contained in the cell at the specified location.
 
-            The user won't be able to select any cells or rows in this mode.
-         */
-        wxGridSelectColumns
-    };
+        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.
+    */
+    wxString GetCellValue(int row, int col) const;
     /**
-        Default constructor.
+        Returns the string contained in the cell at the specified location.
 
-        You must call Create() to really create the grid window and also call
-        CreateGrid() or SetTable() to initialize the grid contents.
-     */
-    wxGrid();
+        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.
+    */
+    wxString GetCellValue(const wxGridCellCoords& coords) const;
 
     /**
-        Constructor creating the grid window.
+        Returns a pointer to the current default grid cell editor.
 
-        You must call either CreateGrid() or SetTable() to initialize the grid
-        contents before using it.
+        See wxGridCellEditor and the @ref overview_grid for more information
+        about cell editors and renderers.
     */
-    wxGrid(wxWindow* parent,
-           wxWindowID id,
-           const wxPoint& pos = wxDefaultPosition,
-           const wxSize& size = wxDefaultSize,
-           long style = wxWANTS_CHARS,
-           const wxString& name = wxGridNameStr);
+    wxGridCellEditor* GetDefaultEditor() const;
 
     /**
-        Creates the grid window for an object initialized using the default
-        constructor.
+        Returns the default editor for the specified cell.
 
-        You must call either CreateGrid() or SetTable() to initialize the grid
-        contents before using it.
-     */
-    bool Create(wxWindow* parent,
-                wxWindowID id,
-                const wxPoint& pos = wxDefaultPosition,
-                const wxSize& size = wxDefaultSize,
-                long style = wxWANTS_CHARS,
-                const wxString& name = wxGridNameStr);
+        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.
 
-    /**
-        Destructor.
+        Notice that the same may be achieved in a usually simpler way by
+        associating a custom editor with the given cell or cells.
 
-        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).
+        The caller must call DecRef() on the returned pointer.
     */
-    virtual ~wxGrid();
-
+    virtual wxGridCellEditor* GetDefaultEditorForCell(int row, int col) const;
     /**
-        Appends one or more new columns to the right of the grid.
+        Returns the default editor for the specified cell.
 
-        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.
+        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.
 
-        @return @true on success or @false if appending columns failed.
+        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.
     */
-    bool AppendCols(int numCols = 1, bool updateLabels = true);
+    wxGridCellEditor* GetDefaultEditorForCell(const wxGridCellCoords& c) const;
 
     /**
-        Appends one or more new rows to the bottom of the grid.
+        Returns the default editor for the cells containing values of the given
+        type.
 
-        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.
+        The base class version returns the editor which was associated with the
+        specified @a typeName when it was registered RegisterDataType() but
+        this function may be overridden to return something different. This
+        allows to override an editor used for one of the standard types.
 
-        @return @true on success or @false if appending rows failed.
+        The caller must call DecRef() on the returned pointer.
     */
-    bool AppendRows(int numRows = 1, bool updateLabels = true);
+    virtual wxGridCellEditor* GetDefaultEditorForType(const wxString& typeName) const;
 
     /**
-        Automatically sets the height and width of all rows and columns to fit their
-        contents.
+        Returns a pointer to the current default grid cell renderer.
+
+        See wxGridCellRenderer and the @ref overview_grid for more information
+        about cell editors and renderers.
+
+        The caller must call DecRef() on the returned pointer.
     */
-    void AutoSize();
+    wxGridCellRenderer* GetDefaultRenderer() const;
 
     /**
-        Automatically adjusts width of the column to fit its label.
+        Returns the default renderer for the given cell.
+
+        The base class version returns the renderer appropriate for the current
+        cell type but this method may be overridden in the derived classes to
+        use custom renderers for some cells by default.
+
+        The caller must call DecRef() on the returned pointer.
     */
-    void AutoSizeColLabelSize(int col);
+    virtual wxGridCellRenderer* GetDefaultRendererForCell(int row, int col) const;
 
     /**
-        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 default renderer for the cell containing values of the
+        given type.
+
+        @see GetDefaultEditorForType()
     */
-    void AutoSizeColumn(int col, bool setAsMin = true);
+    virtual wxGridCellRenderer* GetDefaultRendererForType(const wxString& typeName) const;
 
     /**
-        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.
+        Hides the in-place cell edit control.
     */
-    void AutoSizeColumns(bool setAsMin = true);
+    void HideCellEditControl();
 
     /**
-        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 @true if the in-place edit control is currently enabled.
     */
-    void AutoSizeRow(int row, bool setAsMin = true);
+    bool IsCellEditControlEnabled() const;
 
     /**
-        Automatically adjusts height of the row to fit its label.
+        Returns @true if the current cell is read-only.
+
+        @see SetReadOnly(), IsReadOnly()
     */
-    void AutoSizeRowLabelSize(int col);
+    bool IsCurrentCellReadOnly() 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.
+        Returns @false if the whole grid has been set as read-only or @true
+        otherwise.
+
+        See EnableEditing() for more information about controlling the editing
+        status of grid cells.
     */
-    void AutoSizeRows(bool setAsMin = true);
+    bool IsEditable() 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 will cause the grid to be repainted.
+        Returns @true if the cell at the specified location can't be edited.
 
-        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.
+        @see SetReadOnly(), IsCurrentCellReadOnly()
     */
-    void BeginBatch();
+    bool IsReadOnly(int row, int col) const;
 
     /**
-        Convert grid cell coordinates to grid window pixel coordinates.
+        Register a new data type.
 
-        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.
+        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.
 
-        @see CellToRect()
-    */
-    wxRect BlockToDeviceRect(const wxGridCellCoords& topLeft,
-                             const wxGridCellCoords& bottomRight) const;
+        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.
 
-    /**
-        Returns @true if columns can be moved by dragging with the mouse.
+        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.
 
-        Columns can be moved by dragging on their labels.
+        @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.
     */
-    bool CanDragColMove() const;
+    void RegisterDataType(const wxString& typeName,
+                          wxGridCellRenderer* renderer,
+                          wxGridCellEditor* editor);
 
     /**
-        Returns @true if columns can be resized by dragging with the mouse.
+        Sets the value of the current grid cell to the current in-place edit
+        control value.
 
-        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).
+        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.
     */
-    bool CanDragColSize() const;
+    void SaveEditControlValue();
 
     /**
-        Return @true if the dragging of grid lines to resize rows and columns
-        is enabled or @false otherwise.
+        Sets the editor for the grid cell at the specified location.
+
+        The grid will take ownership of the pointer.
+
+        See wxGridCellEditor and the @ref overview_grid for more information
+        about cell editors and renderers.
     */
-    bool CanDragGridSize() const;
+    void SetCellEditor(int row, int col, wxGridCellEditor* editor);
 
     /**
-        Returns @true if rows can be resized by dragging with the mouse.
+        Sets the renderer for the grid cell at the specified location.
 
-        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).
+        The grid will take ownership of the pointer.
+
+        See wxGridCellRenderer and the @ref overview_grid for more information
+        about cell editors and renderers.
     */
-    bool CanDragRowSize() const;
+    void SetCellRenderer(int row, int col, wxGridCellRenderer* renderer);
 
     /**
-        Returns @true if the in-place edit control for the current grid cell
-        can be used and @false otherwise.
+        Sets the string value for the cell at the specified location.
 
-        This function always returns @false for the read-only cells.
+        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.
     */
-    bool CanEnableCellControl() const;
+    void SetCellValue(int row, int col, const wxString& s);
+    /**
+        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.
 
+        See wxGridTableBase::CanSetValueAs() and the @ref overview_grid for
+        more information.
+    */
+    void SetCellValue(const wxGridCellCoords& coords, const wxString& s);
     /**
-        Returns @true if this grid has support for cell attributes.
+        @deprecated Please use SetCellValue(int,int,const wxString&) or
+                    SetCellValue(const wxGridCellCoords&,const wxString&)
+                    instead.
 
-        The grid supports attributes if it has the associated table which, in
-        turn, has attributes support, i.e. wxGridTableBase::CanHaveAttributes()
-        returns @true.
+        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.
+
+        See wxGridTableBase::CanSetValueAs() and the @ref overview_grid for
+        more information.
     */
-    bool CanHaveAttributes() const;
+    void SetCellValue(const wxString& val, int row, int col);
 
-    //@{
     /**
-        Return the rectangle corresponding to the grid cell's size and position
-        in logical coordinates.
+        Sets the specified column to display boolean values.
 
-        @see BlockToDeviceRect()
+        @see SetColFormatCustom()
     */
-    wxRect CellToRect(int row, int col) const;
-    const wxRect CellToRect(const wxGridCellCoords& coords) const;
-
-    //@}
+    void SetColFormatBool(int col);
 
     /**
-        Clears all data in the underlying grid table and repaints the grid.
+        Sets the specified column to display data in a custom format.
 
-        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.
+        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 the @ref overview_grid for more information on working with custom
+        data types.
     */
-    void ClearGrid();
+    void SetColFormatCustom(int col, const wxString& typeName);
 
     /**
-        Deselects all cells that are currently selected.
+        Sets the specified column to display floating point values with the
+        given width and precision.
+
+        @see SetColFormatCustom()
     */
-    void ClearSelection();
+    void SetColFormatFloat(int col, int width = -1, int precision = -1);
 
     /**
-        Creates a grid with the specified initial number of rows and columns.
+        Sets the specified column to display integer values.
 
-        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().
+        @see SetColFormatCustom()
     */
-    bool CreateGrid(int numRows, int numCols,
-                    wxGridSelectionModes selmode = wxGridSelectCells);
+    void SetColFormatNumber(int col);
 
     /**
-        Deletes one or more columns from a grid starting at the specified
-        position.
+        Sets the default editor for grid cells.
 
-        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.
+        The grid will take ownership of the pointer.
 
-        @return @true on success or @false if deleting columns failed.
+        See wxGridCellEditor and the @ref overview_grid for more information
+        about cell editors and renderers.
     */
-    bool DeleteCols(int pos = 0, int numCols = 1, bool updateLabels = true);
+    void SetDefaultEditor(wxGridCellEditor* editor);
 
     /**
-        Deletes one or more rows from a grid starting at the specified position.
+        Sets the default renderer for grid cells.
 
-        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.
+        The grid will take ownership of the pointer.
 
-        @return @true on success or @false if appending rows failed.
+        See wxGridCellRenderer and the @ref overview_grid for more information
+        about cell editors and renderers.
     */
-    bool DeleteRows(int pos = 0, int numRows = 1, bool updateLabels = true);
+    void SetDefaultRenderer(wxGridCellRenderer* renderer);
 
     /**
-        Disables in-place editing of grid cells.
+        Makes the cell at the specified location read-only or editable.
 
-        Equivalent to calling EnableCellEditControl(@false).
+        @see IsReadOnly()
     */
-    void DisableCellEditControl();
+    void SetReadOnly(int row, int col, bool isReadOnly = true);
 
     /**
-        Disables column moving by dragging with the mouse.
-
-        Equivalent to passing @false to EnableDragColMove().
+        Displays the in-place cell edit control for the current cell.
     */
-    void DisableDragColMove();
+    void ShowCellEditControl();
 
-    /**
-        Disables column sizing by dragging with the mouse.
+    //@}
 
-        Equivalent to passing @false to EnableDragColSize().
-    */
-    void DisableDragColSize();
 
     /**
-        Disable mouse dragging of grid lines to resize rows and columns.
+        @name Column and Row Sizes
+     */
+    //@{
 
-        Equivalent to passing @false to EnableDragGridSize()
+    /**
+        Automatically sets the height and width of all rows and columns to fit
+        their contents.
     */
-    void DisableDragGridSize();
+    void AutoSize();
 
     /**
-        Disables row sizing by dragging with the mouse.
-
-        Equivalent to passing @false to EnableDragRowSize().
+        Automatically adjusts width of the column to fit its label.
     */
-    void DisableDragRowSize();
+    void AutoSizeColLabelSize(int col);
 
     /**
-        Enables or disables in-place editing of grid cell data.
+        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.
+    */
+    void AutoSizeColumn(int col, bool setAsMin = true);
 
-        The grid will issue either a wxEVT_GRID_EDITOR_SHOWN or
-        wxEVT_GRID_EDITOR_HIDDEN event.
+    /**
+        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 EnableCellEditControl(bool enable = true);
+    void AutoSizeColumns(bool setAsMin = true);
 
     /**
-        Enables or disables column moving by dragging with the mouse.
+        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.
     */
-    void EnableDragColMove(bool enable = true);
+    void AutoSizeRow(int row, bool setAsMin = true);
 
     /**
-        Enables or disables column sizing by dragging with the mouse.
+        Automatically adjusts height of the row to fit its label.
     */
-    void EnableDragColSize(bool enable = true);
+    void AutoSizeRowLabelSize(int col);
 
     /**
-        Enables or disables row and column resizing by dragging gridlines with the
-        mouse.
+        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 EnableDragGridSize(bool enable = true);
+    void AutoSizeRows(bool setAsMin = true);
 
     /**
-        Enables or disables row sizing by dragging with the mouse.
+        Returns the current height of the column labels.
     */
-    void EnableDragRowSize(bool enable = true);
+    int GetColLabelSize() const;
 
     /**
-        Makes the grid globally editable or read-only.
+        Returns the minimal width to which a column may be resized.
 
-        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().
+        Use SetColMinimalAcceptableWidth() to change this value globally or
+        SetColMinimalWidth() to do it for individual columns.
 
-        For more information about controlling grid cell attributes see the
-        wxGridCellAttr cell attribute class and the
-        @ref overview_gridoverview.
+        @see GetRowMinimalAcceptableHeight()
     */
-    void EnableEditing(bool edit);
+    int GetColMinimalAcceptableWidth() const;
 
     /**
-        Turns the drawing of grid lines on or off.
+        Returns the width of the specified column.
     */
-    void EnableGridLines(bool enable = true);
+    int GetColSize(int col) const;
 
     /**
-        Decrements the grid's batch count.
-
-        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.
+        Returns @true if the specified column is not currently hidden.
+     */
+    bool IsColShown(int col) const;
 
-        @see wxGridUpdateLocker
+    /**
+        Returns the default height for column labels.
     */
-    void EndBatch();
+    int GetDefaultColLabelSize() const;
 
     /**
-        Overridden wxWindow method.
+        Returns the current default width for grid columns.
     */
-    void Fit();
+    int GetDefaultColSize() const;
 
     /**
-        Causes immediate repainting of the grid.
-
-        Use this instead of the usual wxWindow::Refresh.
+        Returns the default width for the row labels.
     */
-    void ForceRefresh();
+    int GetDefaultRowLabelSize() const;
 
     /**
-        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 the current default height for grid rows.
     */
-    int GetBatchCount() const;
+    int GetDefaultRowSize() const;
 
     /**
-        Sets the arguments to the horizontal and vertical text alignment values
-        for the grid cell at the specified location.
+        Returns the minimal size to which rows can be resized.
 
-        Horizontal alignment will be one of @c wxALIGN_LEFT, @c wxALIGN_CENTRE
-        or @c wxALIGN_RIGHT.
+        Use SetRowMinimalAcceptableHeight() to change this value globally or
+        SetRowMinimalHeight() to do it for individual cells.
 
-        Vertical alignment will be one of @c wxALIGN_TOP, @c wxALIGN_CENTRE or
-        @c wxALIGN_BOTTOM.
+        @see GetColMinimalAcceptableWidth()
     */
-    void GetCellAlignment(int row, int col, int* horiz, int* vert) const;
+    int GetRowMinimalAcceptableHeight() const;
 
     /**
-        Returns the background colour of the cell at the specified location.
+        Returns the current width of the row labels.
     */
-    wxColour GetCellBackgroundColour(int row, int col) const;
+    int GetRowLabelSize() const;
 
     /**
-        Returns a pointer to the editor for the cell at the specified location.
+        Returns the height of the specified row.
+    */
+    int GetRowSize(int row) const;
+
+    /**
+        Returns @true if the specified row is not currently hidden.
+     */
+    bool IsRowShown(int row) const;
 
-        See wxGridCellEditor and the @ref overview_gridoverview "wxGrid
-        overview" for more information about cell editors and renderers.
+    /**
+        Sets the height of the column labels.
 
-        The caller must call DecRef() on the returned pointer.
+        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.
     */
-    wxGridCellEditor* GetCellEditor(int row, int col) const;
+    void SetColLabelSize(int height);
 
     /**
-        Returns the font for text in the grid cell at the specified location.
+        Sets the minimal @a width to which the user can resize columns.
+
+        @see GetColMinimalAcceptableWidth()
     */
-    wxFont GetCellFont(int row, int col) const;
+    void SetColMinimalAcceptableWidth(int width);
 
     /**
-        Returns a pointer to the renderer for the grid cell at the specified
-        location.
+        Sets the minimal @a width for the specified column @a col.
 
-        See wxGridCellRenderer and the @ref overview_gridoverview "wxGrid
-        overview" for more information about cell editors and renderers.
+        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.
 
-        The caller must call DecRef() on the returned pointer.
+        @a width must be greater than the minimal acceptable column width as
+        returned by GetColMinimalAcceptableWidth().
     */
-    wxGridCellRenderer* GetCellRenderer(int row, int col) const;
+    void SetColMinimalWidth(int col, int width);
 
     /**
-        Returns the text colour for the grid cell at the specified location.
+        Sets the width of the specified column.
+
+        @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.
     */
-    wxColour GetCellTextColour(int row, int col) const;
+    void SetColSize(int col, int width);
 
-    //@{
     /**
-        Returns the string contained in the cell at the specified location.
+        Hides the specified column.
 
-        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.
+        To show the column later you need to call SetColSize() with non-0
+        width or ShowCol().
 
-        See wxGridTableBase::CanGetValueAs and the @ref overview_gridoverview
-        "wxGrid overview" for more information.
-    */
-    wxString GetCellValue(int row, int col) const;
-    const wxString  GetCellValue(const wxGridCellCoords& coords) const;
-    //@}
+        @param col
+            The column index.
+     */
+    void HideCol(int col);
 
     /**
-        Returns the column ID of the specified column position.
+        Shows the previously hidden column by resizing it to non-0 size.
+
+        @see HideCol(), SetColSize()
+     */
+    void ShowCol(int col);
+
+
+    /**
+        Sets the default width for columns in the grid.
+
+        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.
     */
-    int GetColAt(int colPos) const;
+    void SetDefaultColSize(int width, bool resizeExistingCols = false);
 
     /**
-        Returns the pen used for vertical grid lines.
+        Sets the default height for rows in the grid.
 
-        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.
+        This will only affect rows subsequently added to the grid unless
+        @a resizeExistingRows is @true.
 
-        See GetRowGridLinePen() for an example.
+        If @a height is less than GetRowMinimalAcceptableHeight(), then the
+        minimal acceptable heihgt is used instead of it.
     */
-    wxPen GetColGridLinePen(int col);
+    void SetDefaultRowSize(int height, bool resizeExistingRows = false);
 
     /**
-        Sets the arguments to the current column label alignment values.
+        Sets the width of the row labels.
 
-        Horizontal alignment will be one of @c wxALIGN_LEFT, @c wxALIGN_CENTRE
-        or @c wxALIGN_RIGHT.
+        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.
+    */
+    void SetRowLabelSize(int width);
 
-        Vertical alignment will be one of @c wxALIGN_TOP, @c wxALIGN_CENTRE or
-        @c wxALIGN_BOTTOM.
+    /**
+        Sets the minimal row @a height used by default.
+
+        See SetColMinimalAcceptableWidth() for more information.
     */
-    void GetColLabelAlignment(int* horiz, int* vert) const;
+    void SetRowMinimalAcceptableHeight(int height);
 
     /**
-        Returns the current height of the column labels.
+        Sets the minimal @a height for the specified @a row.
+
+        See SetColMinimalWidth() for more information.
     */
-    int GetColLabelSize() const;
+    void SetRowMinimalHeight(int row, int height);
 
     /**
-        Returns the specified column label.
+        Sets the height of the specified row.
 
-        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.
+        See SetColSize() for more information.
     */
-    wxString GetColLabelValue(int col) const;
+    void SetRowSize(int row, int height);
+
+    /**
+        Hides the specified row.
+
+        To show the row later you need to call SetRowSize() with non-0
+        width or ShowRow().
+
+        @param col
+            The row index.
+     */
+    void HideRow(int col);
+
+    /**
+        Shows the previously hidden row by resizing it to non-0 size.
+
+        @see HideRow(), SetRowSize()
+     */
+    void ShowRow(int col);
+
+    //@}
+
 
     /**
-        Returns the coordinate of the left border specified column.
-    */
-    int GetColLeft(int col) const;
+        @name User-Resizing and Dragging
+     */
+    //@{
 
     /**
-        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.
+        Return @true if the dragging of cells is enabled or @false otherwise.
     */
-    int GetColMinimalAcceptableWidth() const;
+    bool CanDragCell() const;
 
     /**
-        Get the minimal width of the given column/row.
+        Returns @true if columns can be moved by dragging with the mouse.
 
-        The value returned by this function may be different than that returned
-        by GetColMinimalAcceptableWidth() if SetColMinimalWidth() had been
-        called for this column.
+        Columns can be moved by dragging on their labels.
     */
-    int GetColMinimalWidth(int col) const;
+    bool CanDragColMove() const;
 
     /**
-        Returns the position of the specified column.
-    */
-    int GetColPos(int colID) const;
+        Returns @true if columns can be resized by dragging with the mouse.
 
-    /**
-        Returns the coordinate of the right border specified column.
+        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 EnableDragGridSize()).
     */
-    int GetColRight(int col) const;
+    bool CanDragColSize() const;
 
     /**
-        Returns the width of the specified column.
+        Return @true if the dragging of grid lines to resize rows and columns
+        is enabled or @false otherwise.
     */
-    int GetColSize(int col) const;
+    bool CanDragGridSize() const;
 
     /**
-        Returns the default cell alignment.
+        Returns @true if rows can be resized by dragging with the mouse.
 
-        Horizontal alignment will be one of @c wxALIGN_LEFT, @c wxALIGN_CENTRE
-        or @c wxALIGN_RIGHT.
+        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 EnableDragGridSize()).
+    */
+    bool CanDragRowSize() const;
 
-        Vertical alignment will be one of @c wxALIGN_TOP, @c wxALIGN_CENTRE or
-        @c wxALIGN_BOTTOM.
+    /**
+        Disables column moving by dragging with the mouse.
 
-        @see SetDefaultCellAlignment()
+        Equivalent to passing @false to EnableDragColMove().
     */
-    void GetDefaultCellAlignment(int* horiz, int* vert) const;
+    void DisableDragColMove();
 
     /**
-        Returns the current default background colour for grid cells.
+        Disables column sizing by dragging with the mouse.
+
+        Equivalent to passing @false to EnableDragColSize().
     */
-    wxColour GetDefaultCellBackgroundColour() const;
+    void DisableDragColSize();
 
     /**
-        Returns the current default font for grid cell text.
+        Disable mouse dragging of grid lines to resize rows and columns.
+
+        Equivalent to passing @false to EnableDragGridSize()
     */
-    wxFont GetDefaultCellFont() const;
+    void DisableDragGridSize();
 
     /**
-        Returns the current default colour for grid cell text.
+        Disables row sizing by dragging with the mouse.
+
+        Equivalent to passing @false to EnableDragRowSize().
     */
-    wxColour GetDefaultCellTextColour() const;
+    void DisableDragRowSize();
 
     /**
-        Returns the default height for column labels.
+        Enables or disables cell dragging with the mouse.
     */
-    int GetDefaultColLabelSize() const;
+    void EnableDragCell(bool enable = true);
 
     /**
-        Returns the current default width for grid columns.
+        Enables or disables column moving by dragging with the mouse.
     */
-    int GetDefaultColSize() const;
+    void EnableDragColMove(bool enable = true);
 
     /**
-        Returns a pointer to the current default grid cell editor.
-
-        See wxGridCellEditor and the @ref overview_gridoverview "wxGrid
-        overview" for more information about cell editors and renderers.
+        Enables or disables column sizing by dragging with the mouse.
     */
-    wxGridCellEditor* GetDefaultEditor() const;
+    void EnableDragColSize(bool enable = true);
 
-    //@{
     /**
-        Returns the default editor for the specified cell.
-
-        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.
-
-        Notice that the same may be usually achieved in simpler way by
-        associating a custom editor with the given cell or cells.
-
-        The caller must call DecRef() on the returned pointer.
+        Enables or disables row and column resizing by dragging gridlines with
+        the mouse.
     */
-    virtual wxGridCellEditor* GetDefaultEditorForCell(int row, int col) const;
-    wxGridCellEditor*  GetDefaultEditorForCell(const wxGridCellCoords& c) const;
-    //@}
+    void EnableDragGridSize(bool enable = true);
 
     /**
-        Returns the default editor for the cells containing values of the given
-        type.
-
-        The base class version returns the editor which was associated with the
-        specified @a typeName when it was registered RegisterDataType() but
-        this function may be overridden to return something different. This
-        allows to override an editor used for one of the standard types.
-
-        The caller must call DecRef() on the returned pointer.
+        Enables or disables row sizing by dragging with the mouse.
     */
-    virtual wxGridCellEditor *
-    GetDefaultEditorForType(const wxString& typeName) const;
+    void EnableDragRowSize(bool enable = true);
 
     /**
-        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()
+        Returns the column ID of the specified column position.
     */
-    wxPen GetDefaultGridLinePen();
+    int GetColAt(int colPos) const;
 
     /**
-        Returns a pointer to the current default grid cell renderer.
-
-        See wxGridCellRenderer and the @ref overview_gridoverview "wxGrid
-        overview" for more information about cell editors and renderers.
-
-        The caller must call DecRef() on the returned pointer.
+        Returns the position of the specified column.
     */
-    wxGridCellRenderer* GetDefaultRenderer() const;
+    int GetColPos(int colID) const;
 
     /**
-        Returns the default renderer for the given cell.
-
-        The base class version returns the renderer appropriate for the current
-        cell type but this method may be overridden in the derived classes to
-        use custom renderers for some cells by default.
-
-        The caller must call DecRef() on the returned pointer.
+        Sets the position of the specified column.
     */
-    virtual wxGridCellRenderer *GetDefaultRendererForCell(int row, int col) const;
+    void SetColPos(int colID, int newPos);
 
     /**
-        Returns the default renderer for the cell containing values of the
-        given type.
+        Sets the positions of all columns at once.
 
-        @see GetDefaultEditorForType()
+        This method takes an array containing the indices of the columns in
+        their display order, i.e. uses the same convention as
+        wxHeaderCtrl::SetColumnsOrder().
     */
-    virtual wxGridCellRenderer *
-    GetDefaultRendererForType(const wxString& typeName) const;
+    void SetColumnsOrder(const wxArrayInt& order);
 
     /**
-        Returns the default width for the row labels.
+        Resets the position of the columns to the default.
     */
-    int GetDefaultRowLabelSize() const;
+    void ResetColPos();
+
+    //@}
+
 
     /**
-        Returns the current default height for grid rows.
+        @name Cursor Movement
     */
-    int GetDefaultRowSize() const;
+    //@{
 
     /**
         Returns the current grid cell column position.
@@ -1910,140 +2359,143 @@ public:
     int GetGridCursorRow() const;
 
     /**
-        Returns the colour used for grid lines.
+        Make the given cell current and ensure it is visible.
 
-        @see GetDefaultGridLinePen()
-    */
-    wxColour GetGridLineColour() const;
+        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);
 
     /**
-        Returns the colour used for the background of row and column labels.
+        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.
     */
-    wxColour GetLabelBackgroundColour() const;
+    bool MoveCursorDown(bool expandSelection);
 
     /**
-        Returns the font used for row and column labels.
+        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.
     */
-    wxFont GetLabelFont() const;
+    bool MoveCursorDownBlock(bool expandSelection);
 
     /**
-        Returns the colour used for row and column label text.
+        Moves the grid cursor left by one 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.
     */
-    wxColour GetLabelTextColour() const;
+    bool MoveCursorLeft(bool expandSelection);
 
     /**
-        Returns the total number of grid columns.
+        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.
 
-        This is the same as the number of columns in the underlying grid
-        table.
+        If a block of cells was previously selected it will expand if the
+        argument is @true or be cleared if the argument is @false.
     */
-    int GetNumberCols() const;
+    bool MoveCursorLeftBlock(bool expandSelection);
 
     /**
-        Returns the total number of grid rows.
+        Moves the grid cursor right by one column.
 
-        This is the same as the number of rows in the underlying grid table.
+        If a block of cells was previously selected it will expand if the
+        argument is @true or be cleared if the argument is @false.
     */
-    int GetNumberRows() const;
+    bool MoveCursorRight(bool expandSelection);
 
     /**
-        Returns the attribute for the given cell creating one if necessary.
-
-        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.
+        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.
 
-        This function may only be called if CanHaveAttributes() returns @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.
     */
-    wxGridCellAttr *GetOrCreateCellAttr(int row, int col) const;
+    bool MoveCursorRightBlock(bool expandSelection);
 
     /**
-        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 row @e row.
+        Moves the grid cursor up by one 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
+        If a block of cells was previously selected it will expand if the
+        argument is @true or be cleared if the argument is @false.
     */
-    wxPen GetRowGridLinePen(int row);
+    bool MoveCursorUp(bool expandSelection);
 
     /**
-        Returns the alignment used for row labels.
-
-        Horizontal alignment will be one of @c wxALIGN_LEFT, @c wxALIGN_CENTRE
-        or @c wxALIGN_RIGHT.
+        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.
 
-        Vertical alignment will be one of @c wxALIGN_TOP, @c wxALIGN_CENTRE or
-        @c wxALIGN_BOTTOM.
+        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 GetRowLabelAlignment(int* horiz, int* vert) const;
+    bool MoveCursorUpBlock(bool expandSelection);
 
     /**
-        Returns the current width of the row labels.
+        Moves the grid cursor down by some number of rows so that the previous
+        bottom visible row becomes the top visible row.
     */
-    int GetRowLabelSize() const;
+    bool MovePageDown();
 
     /**
-        Returns the specified row label.
-
-        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.
+        Moves the grid cursor up by some number of rows so that the previous
+        top visible row becomes the bottom visible row.
     */
-    wxString GetRowLabelValue(int row) const;
+    bool MovePageUp();
 
     /**
-        Returns the minimal size to which rows can be resized.
-
-        Use SetRowMinimalAcceptableHeight() to change this value globally or
-        SetRowMinimalHeight() to do it for individual cells.
+        Set the grid cursor to the specified cell.
 
-        @see GetColMinimalAcceptableWidth()
-    */
-    int GetRowMinimalAcceptableHeight() const;
+        The grid cursor indicates the current cell and can be moved by the user
+        using the arrow keys or the mouse.
 
-    /**
-        Returns the minimal size for the given column.
+        Calling this function generates a @c wxEVT_GRID_SELECT_CELL event and
+        if the event handler vetoes this event, the cursor is not moved.
 
-        The value returned by this function may be different than that returned
-        by GetRowMinimalAcceptableHeight() if SetRowMinimalHeight() had been
-        called for this row.
+        This function doesn't make the target call visible, use GoToCell() to
+        do this.
     */
-    int GetRowMinimalHeight(int col) const;
-
+    void SetGridCursor(int row, int col);
     /**
-        Returns the height of the specified row.
-    */
-    int GetRowSize(int row) const;
+        Set the grid cursor to the specified cell.
 
-    /**
-        Returns the number of pixels per horizontal scroll increment.
+        The grid cursor indicates the current cell and can be moved by the user
+        using the arrow keys or the mouse.
 
-        The default is 15.
+        Calling this function generates a @c wxEVT_GRID_SELECT_CELL event and
+        if the event handler vetoes this event, the cursor is not moved.
 
-        @see GetScrollLineY(), SetScrollLineX(), SetScrollLineY()
+        This function doesn't make the target call visible, use GoToCell() to
+        do this.
     */
-    int GetScrollLineX() const;
+    void SetGridCursor(const wxGridCellCoords& coords);
 
-    /**
-        Returns the number of pixels per vertical scroll increment.
+    //@}
 
-        The default is 15.
 
-        @see GetScrollLineX(), SetScrollLineX(), SetScrollLineY()
+    /**
+        @name User Selection
+     */
+    //@{
+
+    /**
+        Deselects all cells that are currently selected.
     */
-    int GetScrollLineY() const;
+    void ClearSelection();
 
     /**
         Returns an array of individually selected cells.
@@ -2086,7 +2538,7 @@ public:
     wxArrayInt GetSelectedRows() const;
 
     /**
-        Access or update the selection fore/back colours
+        Returns the colour used for drawing the selection background.
     */
     wxColour GetSelectionBackground() const;
 
@@ -2124,918 +2576,1126 @@ public:
     wxGridSelectionModes GetSelectionMode() const;
 
     /**
-        Returns a base pointer to the current table object.
+        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;
 
-        The returned pointer is still owned by the grid.
+    /**
+        Returns @true if there are currently any selected cells, rows, columns
+        or blocks.
     */
-    wxGridTableBase *GetTable() const;
+    bool IsSelection() const;
 
-    //@{
     /**
-        Make the given cell current and ensure it is visible.
+        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);
 
-        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);
     //@}
 
+
     /**
-        Returns @true if drawing of grid lines is turned on, @false otherwise.
+        @name Scrolling
+     */
+    //@{
+
+    /**
+        Returns the number of pixels per horizontal scroll increment.
+
+        The default is 15.
+
+        @see GetScrollLineY(), SetScrollLineX(), SetScrollLineY()
     */
-    bool GridLinesEnabled() const;
+    int GetScrollLineX() const;
 
     /**
-        Hides the in-place cell edit control.
+        Returns the number of pixels per vertical scroll increment.
+
+        The default is 15.
+
+        @see GetScrollLineX(), SetScrollLineX(), SetScrollLineY()
     */
-    void HideCellEditControl();
+    int GetScrollLineY() 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.
+        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.
     */
-    void HideColLabels();
+    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;
 
     /**
-        Hides the row labels by calling SetRowLabelSize() with a size of 0.
+        Brings the specified cell into the visible grid cell area with minimal
+        scrolling.
 
-        The labels can be shown again by calling SetRowLabelSize() with a width
-        greater than 0.
+        Does nothing if the cell is already visible.
     */
-    void HideRowLabels();
+    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);
 
     /**
-        Inserts one or more new columns into a grid with the first new column
-        at the specified position.
+        Sets the number of pixels per horizontal scroll increment.
 
-        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.
+        The default is 15.
 
-        @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 GetScrollLineX(), GetScrollLineY(), SetScrollLineY()
     */
-    bool InsertCols(int pos = 0, int numCols = 1, bool updateLabels = true);
+    void SetScrollLineX(int x);
 
     /**
-        Inserts one or more new rows into a grid with the first new row at the
-        specified position.
+        Sets the number of pixels per vertical scroll increment.
 
-        Notice that you must implement wxGridTableBase::InsertRows() if you use
-        a grid with a custom table, please see InsertCols() for more
-        information.
+        The default is 15.
 
-        @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.
+        @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
-            @true if the rows were successfully inserted, @false if an error
-            occurred (most likely the table couldn't be updated).
+            The column index or @c wxNOT_FOUND.
     */
-    bool InsertRows(int pos = 0, int numRows = 1, bool updateLabels = true);
+    int XToCol(int x, bool clipToMinMax = false) const;
 
     /**
-        Returns @true if the in-place edit control is currently enabled.
+        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.
     */
-    bool IsCellEditControlEnabled() const;
+    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;
     /**
-        Returns @true if the current cell is read-only.
+        Translates logical pixel coordinates to the grid cell coordinates.
 
-        @see SetReadOnly(), IsReadOnly()
-    */
-    bool IsCurrentCellReadOnly() const;
+        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 @false if the whole grid has been set as read-only or @true
-        otherwise.
+        Returns the row whose bottom edge is close to the given logical @a y
+        position.
 
-        See EnableEditing() for more information about controlling the editing
-        status of grid cells.
+        If no row edge is near to this position @c wxNOT_FOUND is returned.
     */
-    bool IsEditable() const;
+    int YToEdgeOfRow(int y) const;
 
-    //@{
     /**
-        Is this cell currently selected?
+        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.
     */
-    bool IsInSelection(int row, int col) const;
-    bool IsInSelection(const wxGridCellCoords& coords) const;
-    //@}
+    int YToRow(int y, bool clipToMinMax = false) const;
 
-    /**
-        Returns @true if the cell at the specified location can't be edited.
+    //@}
 
-        @see SetReadOnly(), IsCurrentCellReadOnly()
-    */
-    bool IsReadOnly(int row, int col) const;
 
     /**
-        Returns @true if there are currently any selected cells, rows, columns
-        or blocks.
-    */
-    bool IsSelection() const;
-
+        @name Miscellaneous Functions
+     */
     //@{
+
     /**
-        Returns @true if a cell is either wholly or at least partially visible
-        in the grid window.
+        Appends one or more new columns to the right of the grid.
 
-        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.
+        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 IsVisible(int row, int col, bool wholeCellVisible = true) const;
-    const bool IsVisible(const wxGridCellCoords& coords,
-                         bool wholeCellVisible = true) const;
-    //@}
+    bool AppendCols(int numCols = 1, bool updateLabels = true);
 
-    //@{
     /**
-        Brings the specified cell into the visible grid cell area with minimal
-        scrolling.
+        Appends one or more new rows to the bottom of the grid.
 
-        Does nothing if the cell is already visible.
+        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.
     */
-    void MakeCellVisible(int row, int col);
-    void MakeCellVisible(const wxGridCellCoords& coords);
-    //@}
+    bool AppendRows(int numRows = 1, bool updateLabels = true);
 
     /**
-        Moves the grid cursor down by one row.
+        Return @true if the horizontal grid lines stop at the last column
+        boundary or @false if they continue to the end of the window.
 
-        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 MoveCursorDown(bool expandSelection);
+        The default is to clip grid lines.
+
+        @see ClipHorzGridLines(), AreVertGridLinesClipped()
+     */
+    bool AreHorzGridLinesClipped() const;
 
     /**
-        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.
+        Return @true if the vertical grid lines stop at the last row
+        boundary or @false if they continue to the end of the window.
 
-        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 MoveCursorDownBlock(bool expandSelection);
+        The default is to clip grid lines.
+
+        @see ClipVertGridLines(), AreHorzGridLinesClipped()
+     */
+    bool AreVertGridLinesClipped() const;
 
     /**
-        Moves the grid cursor left by one column.
+        Increments the grid's batch count.
 
-        If a block of cells was previously selected it will expand if the
-        argument is @true or be cleared if the argument is @false.
+        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.
     */
-    bool MoveCursorLeft(bool expandSelection);
+    void BeginBatch();
 
     /**
-        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.
+        Clears all data in the underlying grid table and repaints 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.
+        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.
     */
-    bool MoveCursorLeftBlock(bool expandSelection);
+    void ClearGrid();
 
     /**
-        Moves the grid cursor right by one column.
+        Change whether the horizontal grid lines are clipped by the end of the
+        last 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 MoveCursorRight(bool expandSelection);
+        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);
 
     /**
-        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.
+        Change whether the vertical grid lines are clipped by the end of the
+        last 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.
-    */
-    bool MoveCursorRightBlock(bool expandSelection);
+        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);
 
     /**
-        Moves the grid cursor up by one row.
+        Deletes one or more columns from a grid starting at the specified
+        position.
 
-        If a block of cells was previously selected it will expand if the
-        argument is @true or be cleared if the argument is @false.
+        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.
+
+        @return @true on success or @false if deleting columns failed.
     */
-    bool MoveCursorUp(bool expandSelection);
+    bool DeleteCols(int pos = 0, int numCols = 1, bool updateLabels = true);
 
     /**
-        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.
+        Deletes one or more rows from a grid starting at the specified
+        position.
 
-        If a block of cells was previously selected it will expand if the
-        argument is @true or be cleared if the argument is @false.
+        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.
+
+        @return @true on success or @false if appending rows failed.
     */
-    bool MoveCursorUpBlock(bool expandSelection);
+    bool DeleteRows(int pos = 0, int numRows = 1, bool updateLabels = true);
 
     /**
-        Moves the grid cursor down by some number of rows so that the previous
-        bottom visible row becomes the top visible row.
+        Decrements the grid's batch count.
+
+        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.
+
+        @see wxGridUpdateLocker
     */
-    bool MovePageDown();
+    void EndBatch();
 
     /**
-        Moves the grid cursor up by some number of rows so that the previous
-        top visible row becomes the bottom visible row.
+        Overridden wxWindow method.
     */
-    bool MovePageUp();
+    virtual void Fit();
 
     /**
-        Register a new data type.
+        Causes immediate repainting of the grid.
 
-        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.
+        Use this instead of the usual wxWindow::Refresh().
+    */
+    void ForceRefresh();
 
-        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.
+    /**
+        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.
+    */
+    int GetBatchCount();
 
-        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.
+    /**
+        Returns the total number of grid columns.
 
-        @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.
+        This is the same as the number of columns in the underlying grid table.
     */
-    void RegisterDataType(const wxString& typeName,
-                          wxGridCellRenderer* renderer,
-                          wxGridCellEditor* editor);
+    int GetNumberCols() const;
 
     /**
-        Sets the value of the current grid cell to the current in-place edit
-        control value.
+        Returns the total number of grid rows.
 
-        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.
+        This is the same as the number of rows in the underlying grid table.
     */
-    void SaveEditControlValue();
+    int GetNumberRows() const;
 
     /**
-        Selects all cells in the grid.
+        Returns the attribute for the given cell creating one if necessary.
+
+        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.
+
+        This function may only be called if CanHaveAttributes() returns @true.
     */
-    void SelectAll();
+    wxGridCellAttr *GetOrCreateCellAttr(int row, int col) const;
 
-    //@{
     /**
-        Selects a rectangular block of cells.
+        Returns a base pointer to the current table object.
 
-        If @a addToSelected is @false then any existing selection will be
-        deselected; if @true the column will be added to the existing
-        selection.
+        The returned pointer is still owned by the grid.
     */
-    void SelectBlock(int topRow, int leftCol, int bottomRow, int rightCol,
-                     bool addToSelected = false);
-    void SelectBlock(const wxGridCellCoords& topLeft,
-                     const wxGridCellCoords& bottomRight,
-                     bool addToSelected = false);
-    //@}
+    wxGridTableBase *GetTable() const;
 
     /**
-        Selects the specified column.
+        Inserts one or more new columns into a grid with the first new column
+        at the specified position.
 
-        If @a addToSelected is @false then any existing selection will be
-        deselected; if @true the column will be added to the existing
-        selection.
+        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.
 
-        This method won't select anything if the current selection mode is
-        wxGridSelectRows.
+        @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 SelectCol(int col, bool addToSelected = false);
+    bool InsertCols(int pos = 0, int numCols = 1, bool updateLabels = true);
 
     /**
-        Selects the specified row.
+        Inserts one or more new rows into a grid with the first new row at the
+        specified position.
 
-        If @a addToSelected is @false then any existing selection will be
-        deselected; if @true the row will be added to the existing selection.
+        Notice that you must implement wxGridTableBase::InsertRows() if you use
+        a grid with a custom table, please see InsertCols() for more
+        information.
 
-        This method won't select anything if the current selection mode is
-        wxGridSelectColumns.
+        @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 SelectRow(int row, bool addToSelected = false);
+    bool InsertRows(int pos = 0, int numRows = 1, bool updateLabels = 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.
+        Sets the cell attributes for all cells in the specified column.
 
-        Vertical alignment should be one of @c wxALIGN_TOP, @c wxALIGN_CENTRE
-        or @c wxALIGN_BOTTOM.
+        For more information about controlling grid cell attributes see the
+        wxGridCellAttr cell attribute class and the @ref overview_grid.
     */
-    void SetCellAlignment(int row, int col, int horiz, int vert);
-    void SetCellAlignment(int align, int row, int col);
-    //@}
+    void SetColAttr(int col, wxGridCellAttr* attr);
 
-    //@{
     /**
-        Set the background colour for the given cell or all cells by default.
+        Sets the extra margins used around the grid area.
+
+        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 SetCellBackgroundColour(int row, int col, const wxColour& colour);
-    //@}
+    void SetMargins(int extraWidth, int extraHeight);
 
     /**
-        Sets the editor for the grid cell at the specified location.
+        Sets the cell attributes for all cells in the specified row.
 
-        The grid will take ownership of the pointer.
+        The grid takes ownership of the attribute pointer.
 
-        See wxGridCellEditor and the @ref overview_gridoverview "wxGrid
-        overview" for more information about cell editors and renderers.
+        See the wxGridCellAttr class for more information about controlling
+        cell attributes.
     */
-    void SetCellEditor(int row, int col, wxGridCellEditor* editor);
+    void SetRowAttr(int row, wxGridCellAttr* attr);
+
+    //@}
 
-    /**
-        Sets the font for text in the grid cell at the specified location.
-    */
-    void SetCellFont(int row, int col, const wxFont& font);
 
     /**
-        Sets the renderer for the grid cell at the specified location.
+        @name Sorting support.
 
-        The grid will take ownership of the pointer.
+        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 wxGridCellRenderer and the @ref overview_gridoverview "wxGrid
-        overview" for more information about cell editors and renderers.
-    */
-    void SetCellRenderer(int row, int col, wxGridCellRenderer* renderer);
+        To use wxGrid sorting support you need to handle wxEVT_GRID_COL_SORT
+        event (and not veto it) and resort the data displayed in the grid. The
+        grid will automatically update the sorting indicator on the column
+        which was clicked.
 
+        You can also call the functions in this section directly to update the
+        sorting indicator. Once again, they don't do anything with the grid
+        data, it remains your responsibility to actually sort it appropriately.
+     */
     //@{
-    /**
-        Sets the text colour for the given cell or all cells by default.
-    */
-    void SetCellTextColour(int row, int col, const wxColour& colour);
-    void SetCellTextColour(const wxColour& val, int row, int col);
-    void SetCellTextColour(const wxColour& colour);
-    //@}
 
-    //@{
     /**
-        Sets the string value for the cell at the specified location.
+        Return the column in which the sorting indicator is currently
+        displayed.
 
-        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.
+        Returns @c wxNOT_FOUND if sorting indicator is not currently displayed
+        at all.
 
-        See wxGridTableBase::CanSetValueAs and the @ref overview_gridoverview
-        "wxGrid overview" for more information.
-    */
-    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);
-    //@}
+        @see SetSortingColumn()
+     */
+    int GetSortingColumn() const;
 
     /**
-        Sets the cell attributes for all cells in the specified column.
+        Return @true if this column is currently used for sorting.
 
-        For more information about controlling grid cell attributes see the
-        wxGridCellAttr cell attribute class and the @ref overview_gridoverview.
-    */
-    void SetColAttr(int col, wxGridCellAttr* attr);
+        @see GetSortingColumn()
+     */
+    bool IsSortingBy(int col) const;
 
     /**
-        Sets the specified column to display boolean values.
+        Return @true if the current sorting order is ascending or @false if it
+        is descending.
 
-        @see SetColFormatCustom()
-    */
-    void SetColFormatBool(int col);
+        It only makes sense to call this function if GetSortingColumn() returns
+        a valid column index and not @c wxNOT_FOUND.
+
+        @see SetSortingColumn()
+     */
+    bool IsSortOrderAscending() const;
 
     /**
-        Sets the specified column to display data in a custom format.
+        Set the column to display the sorting indicator in and its direction.
 
-        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.
+        @param col
+            The column to display the sorting indicator in or @c wxNOT_FOUND to
+            remove any currently displayed sorting indicator.
+        @param ascending
+            If @true, display the ascending sort indicator, otherwise display
+            the descending sort indicator.
 
-        See the @ref overview_gridoverview "wxGrid overview" for more
-        information on working with custom data types.
-    */
-    void SetColFormatCustom(int col, const wxString& typeName);
+        @see GetSortingColumn(), IsSortOrderAscending()
+     */
+    void SetSortingColumn(int col, bool ascending = true);
 
     /**
-        Sets the specified column to display floating point values with the
-        given width and precision.
+        Remove any currently shown sorting indicator.
+
+        This is equivalent to calling SetSortingColumn() with @c wxNOT_FOUND
+        first argument.
+     */
+    void UnsetSortingColumn();
+    //@}
 
-        @see SetColFormatCustom()
-    */
-    void SetColFormatFloat(int col, int width = -1, int precision = -1);
 
     /**
-        Sets the specified column to display integer values.
+        @name Accessors for component windows.
 
-        @see SetColFormatCustom()
-    */
-    void SetColFormatNumber(int col);
+        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.
+     */
+    //@{
 
     /**
-        Sets the horizontal and vertical alignment of column label text.
+        Return the main grid window containing the grid cells.
 
-        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 SetColLabelAlignment(int horiz, int vert);
+        This window is always shown.
+     */
+    wxWindow *GetGridWindow() const;
 
     /**
-        Sets the height of the column labels.
+        Return the row labels window.
 
-        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.
-    */
-    void SetColLabelSize(int height);
+        This window is not shown if the row labels were hidden using
+        HideRowLabels().
+     */
+    wxWindow *GetGridRowLabelWindow() const;
 
     /**
-        Set the value for the given column label.
+        Return the column labels window.
 
-        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);
+        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;
 
     /**
-        Sets the minimal width to which the user can resize columns.
+        Return the window in the top left grid corner.
 
-        @see GetColMinimalAcceptableWidth()
-    */
-    void SetColMinimalAcceptableWidth(int width);
+        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;
 
     /**
-        Sets the minimal width for the specified column.
-
-        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.
+        Return the header control used for column labels display.
 
-        @a width must be greater than the minimal acceptable column width as
-        returned by GetColMinimalAcceptableWidth().
-    */
-    void SetColMinimalWidth(int col, int width);
+        This function can only be called if UseNativeColHeader() had been
+        called.
+     */
+    wxHeaderCtrl *GetGridColHeader() const;
 
-    /**
-        Sets the position of the specified column.
-    */
-    void SetColPos(int colID, int newPos);
+    //@}
 
+protected:
     /**
-        Sets the width of the specified column.
-
-        Notice that this function does not refresh the grid, you need to call
-        ForceRefresh() to make the changes take effect immediately.
+        Returns @true if this grid has support for cell attributes.
 
-        @param col
-            The column index.
-        @param width
-            The new column width in pixels or a negative value to fit the
-            column width to its label width.
+        The grid supports attributes if it has the associated table which, in
+        turn, has attributes support, i.e. wxGridTableBase::CanHaveAttributes()
+        returns @true.
     */
-    void SetColSize(int col, int width);
+    bool CanHaveAttributes() const;
 
     /**
-        Sets the default horizontal and vertical alignment for grid cell text.
+        Get the minimal width of the given column/row.
 
-        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 value returned by this function may be different than that returned
+        by GetColMinimalAcceptableWidth() if SetColMinimalWidth() had been
+        called for this column.
     */
-    void SetDefaultCellAlignment(int horiz, int vert);
+    int GetColMinimalWidth(int col) const;
 
     /**
-        Sets the default background colour for grid cells.
+        Returns the coordinate of the right border specified column.
     */
-    void SetDefaultCellBackgroundColour(const wxColour& colour);
+    int GetColRight(int col) const;
 
     /**
-        Sets the default font to be used for grid cell text.
+        Returns the coordinate of the left border specified column.
     */
-    void SetDefaultCellFont(const wxFont& font);
+    int GetColLeft(int col) const;
 
     /**
-        Sets the current default colour for grid cell text.
+        Returns the minimal size for the given column.
+
+        The value returned by this function may be different than that returned
+        by GetRowMinimalAcceptableHeight() if SetRowMinimalHeight() had been
+        called for this row.
     */
-    void SetDefaultCellTextColour(const wxColour& colour);
+    int GetRowMinimalHeight(int col) const;
+};
 
-    /**
-        Sets the default width for columns in the grid.
 
-        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.
-    */
-    void SetDefaultColSize(int width, bool resizeExistingCols = false);
+/**
+    @class wxGridUpdateLocker
 
-    /**
-        Sets the default editor for grid cells.
+    This small class can be used to prevent wxGrid from redrawing during its
+    lifetime by calling wxGrid::BeginBatch() in its constructor and
+    wxGrid::EndBatch() in its destructor. It is typically used in a function
+    performing several operations with a grid which would otherwise result in
+    flicker. For example:
 
-        The grid will take ownership of the pointer.
+    @code
+    void MyFrame::Foo()
+    {
+        m_grid = new wxGrid(this, ...);
 
-        See wxGridCellEditor and the @ref overview_gridoverview "wxGrid
-        overview" for more information about cell editors and renderers.
-    */
-    void SetDefaultEditor(wxGridCellEditor* editor);
+        wxGridUpdateLocker noUpdates(m_grid);
+        m_grid-AppendColumn();
+        // ... many other operations with m_grid ...
+        m_grid-AppendRow();
+
+        // destructor called, grid refreshed
+    }
+    @endcode
+
+    Using this class is easier and safer than calling wxGrid::BeginBatch() and
+    wxGrid::EndBatch() because you don't risk missing the call the latter (due
+    to an exception for example).
 
+    @library{wxadv}
+    @category{grid}
+*/
+class wxGridUpdateLocker
+{
+public:
     /**
-        Sets the default renderer for grid cells.
+        Creates an object preventing the updates of the specified @a grid. The
+        parameter could be @NULL in which case nothing is done. If @a grid is
+        non-@NULL then the grid must exist for longer than this
+        wxGridUpdateLocker object itself.
 
-        The grid will take ownership of the pointer.
+        The default constructor could be followed by a call to Create() to set
+        the grid object later.
+    */
+    wxGridUpdateLocker(wxGrid* grid = NULL);
 
-        See wxGridCellRenderer and the @ref overview_gridoverview "wxGrid
-        overview" for more information about cell editors and renderers.
+    /**
+        Destructor reenables updates for the grid this object is associated
+        with.
     */
-    void SetDefaultRenderer(wxGridCellRenderer* renderer);
+    ~wxGridUpdateLocker();
 
     /**
-        Sets the default height for rows in the grid.
+        This method can be called if the object had been constructed using the
+        default constructor. It must not be called more than once.
+    */
+    void Create(wxGrid* grid);
+};
 
-        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.
-    */
-    void SetDefaultRowSize(int height, bool resizeExistingRows = false);
 
-    //@{
-    /**
-        Set the grid cursor to the specified cell.
+/**
+    @class wxGridEvent
 
-        The grid cursor indicates the current cell and can be moved by the user
-        using the arrow keys or the mouse.
+    This event class contains information about various grid events.
 
-        Calling this function generates a wxEVT_GRID_SELECT_CELL event and if
-        the event handler vetoes this event, the cursor is not moved.
+    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_CHANGING(func)}
+        The user is about to change the data in a cell. The new cell value as
+        string is available from GetString() event object method. This event
+        can be vetoed if the change is not allowed.
+        Processes a @c wxEVT_GRID_CELL_CHANGING event type.
+    @event{EVT_GRID_CELL_CHANGED(func)}
+        The user changed the data in a cell. The old cell value as string is
+        available from GetString() event object method. Notice that vetoing
+        this event still works for backwards compatibility reasons but any new
+        code should only veto EVT_GRID_CELL_CHANGING event and not this one.
+        Processes a @c wxEVT_GRID_CELL_CHANGED event type.
+    @event{EVT_GRID_CELL_LEFT_CLICK(func)}
+        The user clicked a cell with the left mouse button. Processes a
+        @c wxEVT_GRID_CELL_LEFT_CLICK event type.
+    @event{EVT_GRID_CELL_LEFT_DCLICK(func)}
+        The user double-clicked a cell with the left mouse button. Processes a
+        @c wxEVT_GRID_CELL_LEFT_DCLICK event type.
+    @event{EVT_GRID_CELL_RIGHT_CLICK(func)}
+        The user clicked a cell with the right mouse button. Processes a
+        @c wxEVT_GRID_CELL_RIGHT_CLICK event type.
+    @event{EVT_GRID_CELL_RIGHT_DCLICK(func)}
+        The user double-clicked a cell with the right mouse button. Processes a
+        @c wxEVT_GRID_CELL_RIGHT_DCLICK event type.
+    @event{EVT_GRID_EDITOR_HIDDEN(func)}
+        The editor for a cell was hidden. Processes a
+        @c wxEVT_GRID_EDITOR_HIDDEN event type.
+    @event{EVT_GRID_EDITOR_SHOWN(func)}
+        The editor for a cell was shown. Processes a
+        @c wxEVT_GRID_EDITOR_SHOWN event type.
+    @event{EVT_GRID_LABEL_LEFT_CLICK(func)}
+        The user clicked a label with the left mouse button. Processes a
+        @c wxEVT_GRID_LABEL_LEFT_CLICK event type.
+    @event{EVT_GRID_LABEL_LEFT_DCLICK(func)}
+        The user double-clicked a label with the left mouse button. Processes a
+        @c wxEVT_GRID_LABEL_LEFT_DCLICK event type.
+    @event{EVT_GRID_LABEL_RIGHT_CLICK(func)}
+        The user clicked a label with the right mouse button. Processes a
+        @c wxEVT_GRID_LABEL_RIGHT_CLICK event type.
+    @event{EVT_GRID_LABEL_RIGHT_DCLICK(func)}
+        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
+        @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
 
-        This function doesn't make the target call visible, use GoToCell() to
-        do this.
+    @library{wxadv}
+    @category{grid,events}
+*/
+class wxGridEvent : public wxNotifyEvent
+{
+public:
+    /**
+        Default constructor.
     */
-    void SetGridCursor(int row, int col);
-    void SetGridCursor(const wxGridCellCoords& coords);
-    //@}
-
+    wxGridEvent();
     /**
-        Sets the colour used to draw grid lines.
+        Constructor for initializing all event attributes.
     */
-    void SetGridLineColour(const wxColour& colour);
+    wxGridEvent(int id, wxEventType type, wxObject* obj,
+                int row = -1, int col = -1, int x = -1, int y = -1,
+                bool sel = true, const wxKeyboardState& kbd = wxKeyboardState());
 
     /**
-        Sets the background colour for row and column labels.
+        Returns @true if the Alt key was down at the time of the event.
     */
-    void SetLabelBackgroundColour(const wxColour& colour);
+    bool AltDown() const;
 
     /**
-        Sets the font for row and column labels.
+        Returns @true if the Control key was down at the time of the event.
     */
-    void SetLabelFont(const wxFont& font);
+    bool ControlDown() const;
 
     /**
-        Sets the colour for row and column label text.
+        Column at which the event occurred.
     */
-    void SetLabelTextColour(const wxColour& colour);
+    virtual int GetCol();
 
     /**
-        Sets the extra margins used around the grid area.
+        Position in pixels at which the event occurred.
+    */
+    wxPoint GetPosition();
 
-        A grid may occupy more space than needed for its data display and
-        this function allows to set how big this extra space is
+    /**
+        Row at which the event occurred.
     */
-    void SetMargins(int extraWidth, int extraHeight);
+    virtual int GetRow();
 
     /**
-        Makes the cell at the specified location read-only or editable.
+        Returns @true if the Meta key was down at the time of the event.
+    */
+    bool MetaDown() const;
 
-        @see IsReadOnly()
+    /**
+        Returns @true if the user is selecting grid cells, or @false if
+        deselecting.
     */
-    void SetReadOnly(int row, int col, bool isReadOnly = true);
+    bool Selecting();
 
     /**
-        Sets the cell attributes for all cells in the specified row.
+        Returns @true if the Shift key was down at the time of the event.
+    */
+    bool ShiftDown() const;
+};
 
-        The grid takes ownership of the attribute pointer.
 
-        See the wxGridCellAttr class for more information about controlling
-        cell attributes.
-    */
-    void SetRowAttr(int row, wxGridCellAttr* attr);
 
-    /**
-        Sets the horizontal and vertical alignment of row label text.
+/**
+    @class wxGridSizeEvent
 
-        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 SetRowLabelAlignment(int horiz, int vert);
+    This event class contains information about a row/column resize event.
 
-    /**
-        Sets the width of the row labels.
+    @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.
+    @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.
+    @endEventTable
 
-        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.
+    @library{wxadv}
+    @category{grid,events}
+*/
+class wxGridSizeEvent : public wxNotifyEvent
+{
+public:
+    /**
+        Default constructor.
     */
-    void SetRowLabelSize(int width);
-
+    wxGridSizeEvent();
     /**
-        Sets the value for the given row label.
-
-        If you are using a derived grid table you must override
-        wxGridTableBase::SetRowLabelValue for this to have any effect.
+        Constructor for initializing all event attributes.
     */
-    void SetRowLabelValue(int row, const wxString& value);
+    wxGridSizeEvent(int id, wxEventType type, wxObject* obj,
+                    int rowOrCol = -1, int x = -1, int y = -1,
+                    const wxKeyboardState& kbd = wxKeyboardState());
 
     /**
-        Sets the minimal row height used by default.
-
-        See SetColMinimalAcceptableWidth() for more information.
+        Returns @true if the Alt key was down at the time of the event.
     */
-    void SetRowMinimalAcceptableHeight(int height);
+    bool AltDown() const;
 
     /**
-        Sets the minimal height for the specified row.
+        Returns @true if the Control key was down at the time of the event.
+    */
+    bool ControlDown() const;
 
-        See SetColMinimalWidth() for more information.
+    /**
+        Position in pixels at which the event occurred.
     */
-    void SetRowMinimalHeight(int row, int height);
+    wxPoint GetPosition();
 
     /**
-        Sets the height of the specified row.
+        Row or column at that was resized.
+    */
+    int GetRowOrCol();
 
-        See SetColSize() for more information.
+    /**
+        Returns @true if the Meta key was down at the time of the event.
     */
-    void SetRowSize(int row, int height);
+    bool MetaDown() const;
 
     /**
-        Sets the number of pixels per horizontal scroll increment.
+        Returns @true if the Shift key was down at the time of the event.
+    */
+    bool ShiftDown() const;
+};
 
-        The default is 15.
 
-        @see GetScrollLineX(), GetScrollLineY(), SetScrollLineY()
-    */
-    void SetScrollLineX(int x);
 
-    /**
-        Sets the number of pixels per vertical scroll increment.
+/**
+    @class wxGridRangeSelectEvent
 
-        The default is 15.
+    @beginEventTable{wxGridRangeSelectEvent}
+    @event{EVT_GRID_RANGE_SELECT(func)}
+        The user selected a group of contiguous cells. Processes a
+        @c wxEVT_GRID_RANGE_SELECT event type.
+    @event{EVT_GRID_CMD_RANGE_SELECT(id, func)}
+        The user selected a group of contiguous cells; variant taking a window
+        identifier. Processes a @c wxEVT_GRID_RANGE_SELECT event type.
+    @endEventTable
 
-        @see GetScrollLineX(), GetScrollLineY(), SetScrollLineX()
+    @library{wxadv}
+    @category{grid,events}
+*/
+class wxGridRangeSelectEvent : public wxNotifyEvent
+{
+public:
+    /**
+        Default constructor.
     */
-    void SetScrollLineY(int y);
-
+    wxGridRangeSelectEvent();
     /**
-        Set the colour to be used for drawing the selection background.
+        Constructor for initializing all event attributes.
     */
-    void SetSelectionBackground(const wxColour& c);
+    wxGridRangeSelectEvent(int id, wxEventType type,
+                           wxObject* obj,
+                           const wxGridCellCoords& topLeft,
+                           const wxGridCellCoords& bottomRight,
+                           bool sel = true, const wxKeyboardState& kbd = wxKeyboardState());
 
     /**
-        Set the colour to be used for drawing the selection foreground.
+        Returns @true if the Alt key was down at the time of the event.
     */
-    void SetSelectionForeground(const wxColour& c);
+    bool AltDown() const;
 
     /**
-        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).
+        Returns @true if the Control key was down at the time of the event.
     */
-    void SetSelectionMode(wxGridSelectionModes selmode);
+    bool ControlDown() const;
 
     /**
-        Passes a pointer to a custom grid table to be used by the grid.
-
-        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.
-
-        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.
+        Top left corner of the rectangular area that was (de)selected.
     */
-    bool SetTable(wxGridTableBase* table,
-                  bool takeOwnership = false,
-                  wxGridSelectionModes selmode = wxGridSelectCells);
+    wxGridCellCoords GetBottomRightCoords();
 
     /**
-        Call this in order to make the column labels use a native look by using
-        wxRenderer::DrawHeaderButton internally.
-
-        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.
+        Bottom row of the rectangular area that was (de)selected.
     */
-    void SetUseNativeColLabels(bool native = true);
+    int GetBottomRow();
 
     /**
-        Displays the in-place cell edit control for the current cell.
+        Left column of the rectangular area that was (de)selected.
     */
-    void ShowCellEditControl();
+    int GetLeftCol();
 
     /**
-        Returns the column at the given pixel position.
-
-        @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.
+        Right column of the rectangular area that was (de)selected.
     */
-    int XToCol(int x, bool clipToMinMax = false) const;
+    int GetRightCol();
 
     /**
-        Returns the column whose right hand edge is close to the given logical
-        x position.
-
-        If no column edge is near to this position @c wxNOT_FOUND is returned.
+        Top left corner of the rectangular area that was (de)selected.
     */
-    int XToEdgeOfCol(int x) const;
+    wxGridCellCoords GetTopLeftCoords();
 
-    //@{
     /**
-        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()
-     */
-
-    // XYToCell(int, int, wxGridCellCoords&) overload is intentionally
-    // undocumented, using it is ugly and non-const reference parameters are
-    // not used in wxWidgets API
-
-    wxGridCellCoords XYToCell(int x, int y) const;
-    wxGridCellCoords XYToCell(const wxPoint& pos) const;
-
-    //@}
+        Top row of the rectangular area that was (de)selected.
+    */
+    int GetTopRow();
 
     /**
-        Returns the row whose bottom edge is close to the given logical y
-        position.
-
-        If no row edge is near to this position @c wxNOT_FOUND is returned.
+        Returns @true if the Meta key was down at the time of the event.
     */
-    int YToEdgeOfRow(int y) const;
+    bool MetaDown() const;
 
     /**
-        Returns the grid row that corresponds to the logical y coordinate.
+        Returns @true if the area was selected, @false otherwise.
+    */
+    bool Selecting();
 
-        Returns @c wxNOT_FOUND if there is no row at the y position.
+    /**
+        Returns @true if the Shift key was down at the time of the event.
     */
-    int YToRow(int y) const;
+    bool ShiftDown() const;
 };
 
 
 
 /**
-    @class wxGridCellBoolEditor
+    @class wxGridEditorCreatedEvent
 
-    The editor for boolean data.
+    @beginEventTable{wxGridEditorCreatedEvent}
+    @event{EVT_GRID_EDITOR_CREATED(func)}
+        The editor for a cell was created. Processes a
+        @c wxEVT_GRID_EDITOR_CREATED event type.
+    @event{EVT_GRID_CMD_EDITOR_CREATED(id, func)}
+        The editor for a cell was created; variant taking a window identifier.
+        Processes a @c wxEVT_GRID_EDITOR_CREATED event type.
+    @endEventTable
 
     @library{wxadv}
-    @category{grid}
-
-    @see wxGridCellEditor, wxGridCellFloatEditor, wxGridCellNumberEditor,
-    wxGridCellTextEditor, wxGridCellChoiceEditor
+    @category{grid,events}
 */
-class wxGridCellBoolEditor : public wxGridCellEditor
+class wxGridEditorCreatedEvent : public wxCommandEvent
 {
 public:
     /**
         Default constructor.
     */
-    wxGridCellBoolEditor();
-
+    wxGridEditorCreatedEvent();
     /**
-        Returns @true if the given @a value is equal to the string representation of
-        the truth value we currently use (see
-        wxGridCellBoolEditor::UseStringValues).
+        Constructor for initializing all event attributes.
     */
-    static bool IsTrueValue(const wxString& value);
+    wxGridEditorCreatedEvent(int id, wxEventType type, wxObject* obj,
+                             int row, int col, wxControl* ctrl);
 
     /**
-        ,  wxString&@e valueFalse = _T(""))
-        This method allows to customize the values returned by GetValue() method for
-        the cell using this editor. By default, the default values of the arguments are
-        used, i.e. @c "1" is returned if the cell is checked and an empty string
-        otherwise, using this method allows to change this.
+        Returns the column at which the event occurred.
     */
-    static void UseStringValues() const;
-};
-
-
-
-/**
-    @class wxGridUpdateLocker
-
-    This small class can be used to prevent wxGrid from redrawing
-    during its lifetime by calling wxGrid::BeginBatch
-    in its constructor and wxGrid::EndBatch in its
-    destructor. It is typically used in a function performing several operations
-    with a grid which would otherwise result in flicker. For example:
-
-    @code
-    void MyFrame::Foo()
-        {
-            m_grid = new wxGrid(this, ...);
-
-            wxGridUpdateLocker noUpdates(m_grid);
-            m_grid-AppendColumn();
-            ... many other operations with m_grid...
-            m_grid-AppendRow();
+    int GetCol();
 
-            // destructor called, grid refreshed
-        }
-    @endcode
+    /**
+        Returns the edit control.
+    */
+    wxControl* GetControl();
 
-    Using this class is easier and safer than calling
-    wxGrid::BeginBatch and wxGrid::EndBatch
-    because you don't risk not to call the latter (due to an exception for example).
+    /**
+        Returns the row at which the event occurred.
+    */
+    int GetRow();
 
-    @library{wxadv}
-    @category{grid}
-*/
-class wxGridUpdateLocker
-{
-public:
     /**
-        Creates an object preventing the updates of the specified @e grid. The
-        parameter could be @NULL in which case nothing is done. If @a grid is
-        non-@NULL then the grid must exist for longer than wxGridUpdateLocker object
-        itself.
-        The default constructor could be followed by a call to
-        Create() to set the
-        grid object later.
+        Sets the column at which the event occurred.
     */
-    wxGridUpdateLocker(wxGrid* grid = NULL);
+    void SetCol(int col);
 
     /**
-        Destructor reenables updates for the grid this object is associated with.
+        Sets the edit control.
     */
-    ~wxGridUpdateLocker();
+    void SetControl(wxControl* ctrl);
 
     /**
-        This method can be called if the object had been constructed using the default
-        constructor. It must not be called more than once.
+        Sets the row at which the event occurred.
     */
-    void Create(wxGrid* grid);
+    void SetRow(int row);
 };