]> git.saurik.com Git - wxWidgets.git/blobdiff - interface/wx/dataview.h
Add a link to Microsoft guidelines from wxICON_QUESTION documentation.
[wxWidgets.git] / interface / wx / dataview.h
index 669de4c1d68d2b279b40549d4beaa6a4a294b933..4947ed44ede781bb71ba7add6a72f31b057def62 100644 (file)
@@ -3,7 +3,7 @@
 // Purpose:     interface of wxDataView* classes
 // Author:      wxWidgets team
 // RCS-ID:      $Id$
-// Licence:     wxWindows license
+// Licence:     wxWindows licence
 /////////////////////////////////////////////////////////////////////////////
 
 
     wxDataViewModel::GetValue in order to define the data model which acts as an
     interface between your actual data and the wxDataViewCtrl.
 
-    Since you will usually also allow the wxDataViewCtrl to change your data
-    through its graphical interface, you will also have to override
-    wxDataViewModel::SetValue which the wxDataViewCtrl will call when a change
-    to some data has been committed.
+    Note that wxDataViewModel does not define the position or index of any item
+    in the control because different controls might display the same data differently.
+    wxDataViewModel does provide a wxDataViewModel::Compare method which the
+    wxDataViewCtrl may use to sort the data either in conjunction with a column
+    header or without (see wxDataViewModel::HasDefaultCompare).
 
     wxDataViewModel (as indeed the entire wxDataViewCtrl code) is using wxVariant
     to store data and its type in a generic way. wxVariant can be extended to contain
-    almost any data without changes to the original class.
+    almost any data without changes to the original class. To a certain extent,
+    you can use (the somewhat more elegant) wxAny instead of wxVariant as there
+    is code to convert between the two, but it is unclear what impact this will
+    have on performance.
 
-    The data that is presented through this data model is expected to change at
-    run-time. You need to inform the data model when a change happened.
+    Since you will usually allow the wxDataViewCtrl to change your data
+    through its graphical interface, you will also have to override
+    wxDataViewModel::SetValue which the wxDataViewCtrl will call when a change
+    to some data has been committed.
+
+    If the data represented by the model is changed by something else than its
+    associated wxDataViewCtrl, the control has to be notified about the change.
     Depending on what happened you need to call one of the following methods:
     - wxDataViewModel::ValueChanged,
     - wxDataViewModel::ItemAdded,
     - wxDataViewModel::ItemsDeleted,
     - wxDataViewModel::ItemsChanged.
 
-    Note that wxDataViewModel does not define the position or index of any item
-    in the control because different controls might display the same data differently.
-    wxDataViewModel does provide a wxDataViewModel::Compare method which the
-    wxDataViewCtrl may use to sort the data either in conjunction with a column
-    header or without (see wxDataViewModel::HasDefaultCompare).
-
     This class maintains a list of wxDataViewModelNotifier which link this class
     to the specific implementations on the supported platforms so that e.g. calling
     wxDataViewModel::ValueChanged on this model will just call
         // add columns now
     @endcode
 
+    A potentially better way to avoid memory leaks is to use wxObjectDataPtr
+    
+    @code
+        wxObjectDataPtr<MyMusicModel> musicModel;
+        
+        wxDataViewCtrl *musicCtrl = new wxDataViewCtrl( this, wxID_ANY );
+        musicModel = new MyMusicModel;
+        m_musicCtrl->AssociateModel( musicModel.get() );
+
+        // add columns now
+    @endcode
+
+
     @library{wxadv}
     @category{dvc}
 */
@@ -100,7 +116,7 @@ public:
 
         @since 2.9.1
 
-        @param variable
+        @param variant
             The new value.
         @param item
             The item (row) to update.
@@ -135,10 +151,21 @@ public:
         Override this to indicate that the item has special font attributes.
         This only affects the wxDataViewTextRendererText renderer.
 
+        The base class version always simply returns @false.
+
         @see wxDataViewItemAttr.
+
+        @param item
+            The item for which the attribute is requested.
+        @param col
+            The column of the item for which the attribute is requested.
+        @param attr
+            The attribute to be filled in if the function returns @true.
+        @return
+            @true if this item has an attribute or @false otherwise.
     */
     virtual bool GetAttr(const wxDataViewItem& item, unsigned int col,
-                         wxDataViewItemAttr& attr);
+                         wxDataViewItemAttr& attr) const;
 
     /**
         Override this so the control can query the child items of an item.
@@ -216,7 +243,7 @@ public:
     /**
         Call this to inform the model that an item has been added to the data.
     */
-    virtual bool ItemAdded(const wxDataViewItem& parent,
+    bool ItemAdded(const wxDataViewItem& parent,
                            const wxDataViewItem& item);
 
     /**
@@ -225,18 +252,18 @@ public:
         This will eventually emit a wxEVT_DATAVIEW_ITEM_VALUE_CHANGED
         event (in which the column fields will not be set) to the user.
     */
-    virtual bool ItemChanged(const wxDataViewItem& item);
+    bool ItemChanged(const wxDataViewItem& item);
 
     /**
         Call this to inform the model that an item has been deleted from the data.
     */
-    virtual bool ItemDeleted(const wxDataViewItem& parent,
+    bool ItemDeleted(const wxDataViewItem& parent,
                              const wxDataViewItem& item);
 
     /**
         Call this to inform the model that several items have been added to the data.
     */
-    virtual bool ItemsAdded(const wxDataViewItem& parent,
+    bool ItemsAdded(const wxDataViewItem& parent,
                             const wxDataViewItemArray& items);
 
     /**
@@ -245,12 +272,12 @@ public:
         This will eventually emit wxEVT_DATAVIEW_ITEM_VALUE_CHANGED
         events (in which the column fields will not be set) to the user.
     */
-    virtual bool ItemsChanged(const wxDataViewItemArray& items);
+    bool ItemsChanged(const wxDataViewItemArray& items);
 
     /**
         Call this to inform the model that several items have been deleted.
     */
-    virtual bool ItemsDeleted(const wxDataViewItem& parent,
+    bool ItemsDeleted(const wxDataViewItem& parent,
                               const wxDataViewItemArray& items);
 
     /**
@@ -339,10 +366,26 @@ public:
         Override this to indicate that the row has special font attributes.
         This only affects the wxDataViewTextRendererText() renderer.
 
+        The base class version always simply returns @false.
+
         @see wxDataViewItemAttr.
+
+        @param row
+            The row for which the attribute is requested.
+        @param col
+            The column for which the attribute is requested.
+        @param attr
+            The attribute to be filled in if the function returns @true.
+        @return
+            @true if this item has an attribute or @false otherwise.
     */
     virtual bool GetAttrByRow(unsigned int row, unsigned int col,
-                         wxDataViewItemAttr& attr);
+                         wxDataViewItemAttr& attr) const;
+
+    /**
+        Returns the number of items (i.e. rows) in the list.
+    */
+    unsigned int GetCount() const;
 
     /**
         Returns the wxDataViewItem at the given @e row.
@@ -436,6 +479,11 @@ public:
         Constructor.
     */
     wxDataViewVirtualListModel(unsigned int initial_size = 0);
+
+    /**
+        Returns the number of virtual items (i.e. rows) in the list.
+    */
+    unsigned int GetCount() const;
 };
 
 
@@ -482,7 +530,7 @@ public:
     @class wxDataViewItem
 
     wxDataViewItem is a small opaque class that represents an item in a wxDataViewCtrl
-    in a persistent way, i.e. indepent of the position of the item in the control
+    in a persistent way, i.e. independent of the position of the item in the control
     or changes to its contents.
 
     It must hold a unique ID of type @e void* in its only field and can be converted
@@ -564,6 +612,8 @@ public:
     @style{wxDV_VARIABLE_LINE_HEIGHT}
            Allow variable line heights.
            This can be inefficient when displaying large number of items.
+    @style{wxDV_NO_HEADER}
+           Do not show column headers (which are shown by default).
     @endStyleTable
 
     @beginEventEmissionTable{wxDataViewEvent}
@@ -626,7 +676,8 @@ public:
                    const wxPoint& pos = wxDefaultPosition,
                    const wxSize& size = wxDefaultSize,
                    long style = 0,
-                   const wxValidator& validator = wxDefaultValidator);
+                   const wxValidator& validator = wxDefaultValidator,
+                   const wxString& name = wxDataViewCtrlNameStr);
 
     /**
         Destructor.
@@ -807,7 +858,8 @@ public:
                 const wxPoint& pos = wxDefaultPosition,
                 const wxSize& size = wxDefaultSize,
                 long style = 0,
-                const wxValidator& validator = wxDefaultValidator);
+                const wxValidator& validator = wxDefaultValidator,
+                const wxString& name = wxDataViewCtrlNameStr);
 
     /**
         Deletes given column.
@@ -863,6 +915,26 @@ public:
     */
     wxDataViewColumn* GetExpanderColumn() const;
 
+    /**
+        Returns the currently focused item.
+
+        This is the item that the keyboard commands apply to. It may be invalid
+        if there is no focus currently.
+
+        This method is mostly useful for the controls with @c wxDV_MULTIPLE
+        style as in the case of single selection it returns the same thing as
+        GetSelection().
+
+        Notice that under all platforms except Mac OS X the currently focused
+        item may be selected or not but under OS X the current item is always
+        selected.
+
+        @see SetCurrentItem()
+
+        @since 2.9.2
+     */
+    wxDataViewItem GetCurrentItem() const;
+
     /**
         Returns indentation.
     */
@@ -913,6 +985,10 @@ public:
 
     /**
         Select the given item.
+
+        In single selection mode this changes the (unique) currently selected
+        item. In multi selection mode, the @a item is selected and the
+        previously selected items remain selected.
     */
     virtual void Select(const wxDataViewItem& item);
 
@@ -926,6 +1002,25 @@ public:
     */
     void SetExpanderColumn(wxDataViewColumn* col);
 
+    /**
+        Changes the currently focused item.
+
+        The @a item parameter must be valid, there is no way to remove the
+        current item from the control.
+
+        In single selection mode, calling this method is the same as calling
+        Select() and is thus not very useful. In multiple selection mode this
+        method only moves the current item however without changing the
+        selection except under OS X where the current item is always selected,
+        so calling SetCurrentItem() selects @a item if it hadn't been selected
+        before.
+
+        @see GetCurrentItem()
+
+        @since 2.9.2
+     */
+    void SetCurrentItem(const wxDataViewItem& item);
+
     /**
         Sets the indendation.
     */
@@ -1080,6 +1175,7 @@ enum wxDataViewCellRenderState
     - wxDataViewBitmapRenderer,
     - wxDataViewDateRenderer,
     - wxDataViewSpinRenderer.
+    - wxDataViewChoiceRenderer.
 
     Additionally, the user can write own renderers by deriving from
     wxDataViewCustomRenderer.
@@ -1234,8 +1330,8 @@ public:
     a small icon next to it as it is typically done in a file manager.
 
     This classes uses the wxDataViewIconText helper class to store its data.
-    wxDataViewIonText can be converted to and from a wxVariant using the left shift
-    operator.
+    wxDataViewIconText can be converted to and from a wxVariant using the left
+    shift operator.
 
     @library{wxadv}
     @category{dvc}
@@ -1319,6 +1415,38 @@ public:
 };
 
 
+/**
+    @class wxDataViewChoiceRenderer
+
+    This class is used by wxDataViewCtrl to render choice controls.
+    It stores a string so that SetValue() and GetValue() operate
+    on a variant holding a string.
+
+    @library{wxadv}
+    @category{dvc}
+*/
+
+class wxDataViewChoiceRenderer: public wxDataViewRenderer
+{
+public:
+    /**
+        The ctor.
+    */
+    wxDataViewChoiceRenderer( const wxArrayString &choices,
+                              wxDataViewCellMode mode = wxDATAVIEW_CELL_EDITABLE,
+                              int alignment = wxDVR_DEFAULT_ALIGNMENT );
+
+    /**
+        Returns the choice referred to by index.
+    */
+    wxString GetChoice(size_t index) const;
+    
+    /**
+        Returns all choices.
+    */
+    const wxArrayString& GetChoices() const;
+};
+
 
 /**
     @class wxDataViewDateRenderer
@@ -1403,9 +1531,20 @@ public:
                                         const wxVariant& value);
 
     /**
-        Create DC on request. Internal.
-    */
-    virtual wxDC* GetDC();
+        Return the attribute to be used for rendering.
+
+        This function may be called from Render() implementation to use the
+        attributes defined for the item if the renderer supports them.
+
+        Notice that when Render() is called, the wxDC object passed to it is
+        already set up to use the correct attributes (e.g. its font is set to
+        bold or italic version if wxDataViewItemAttr::GetBold() or GetItalic()
+        returns true) so it may not be necessary to call it explicitly if you
+        only want to render text using the items attributes.
+
+        @since 2.9.1
+     */
+    const wxDataViewItemAttr& GetAttr() const;
 
     /**
         Return size required to show content.
@@ -1413,7 +1552,7 @@ public:
     virtual wxSize GetSize() const = 0;
 
     /**
-        Overrride this so that the renderer can get the value from the editor
+        Override this so that the renderer can get the value from the editor
         control (pointed to by @a editor):
         @code
         {
@@ -1434,7 +1573,7 @@ public:
     virtual bool HasEditorCtrl() const;
 
     /**
-        Overrride this to react to a left click.
+        Override this to react to a left click.
         This method will only be called in @c wxDATAVIEW_CELL_ACTIVATABLE mode.
     */
     virtual bool LeftClick( wxPoint cursor,
@@ -1460,7 +1599,7 @@ public:
                     wxDC* dc, int state);
 
     /**
-        Overrride this to start a drag operation. Not yet supported.
+        Override this to start a drag operation. Not yet supported.
     */
     virtual bool StartDrag(wxPoint cursor, wxRect cell,
                            wxDataViewModel* model,
@@ -1660,6 +1799,64 @@ public:
     const wxDataViewListStore *GetStore() const;
     //@}
 
+    /**
+        Returns the position of given @e item or wxNOT_FOUND if it's
+        not a valid item.
+
+        @since 2.9.2
+     */
+    int ItemToRow(const wxDataViewItem &item) const;
+
+    /**
+        Returns the wxDataViewItem at the given @e row.
+
+        @since 2.9.2
+     */
+    wxDataViewItem RowToItem(int row) const;
+
+    //@{
+    /**
+        @name Selection handling functions
+     */
+
+    /**
+        Returns index of the selected row or wxNOT_FOUND.
+
+        @see wxDataViewCtrl::GetSelection()
+
+        @since 2.9.2
+     */
+    int GetSelectedRow() const;
+
+    /**
+        Selects given row.
+
+        @see wxDataViewCtrl::Select()
+
+        @since 2.9.2
+     */
+    void SelectRow(unsigned row);
+
+    /**
+        Unselects given row.
+
+        @see wxDataViewCtrl::Unselect()
+
+        @since 2.9.2
+     */
+    void UnselectRow(unsigned row);
+
+    /**
+        Returns true if @a row is selected.
+
+        @see wxDataViewCtrl::IsSelected()
+
+        @since 2.9.2
+     */
+    bool IsRowSelected(unsigned row) const;
+
+    //@}
+
     /**
         @name Column management functions
     */
@@ -1980,6 +2177,11 @@ public:
                               int icon = -1,
                               wxClientData* data = NULL);
 
+    /**
+        Returns true if item is a container.
+    */
+    bool IsContainer( const wxDataViewItem& item );
+    
     /**
         Calls the same method from wxDataViewTreeStore but uses
         an index position in the image list instead of a wxIcon.