X-Git-Url: https://git.saurik.com/wxWidgets.git/blobdiff_plain/cc72cde0ea8a1b8301acee96a1455926c2f9310d..1ec4e9c2b72a01a7ba7da569e0f8d04a81aaba10:/interface/wx/dataview.h diff --git a/interface/wx/dataview.h b/interface/wx/dataview.h index fef9f43452..f8bc177fab 100644 --- a/interface/wx/dataview.h +++ b/interface/wx/dataview.h @@ -183,10 +183,7 @@ public: @return @true if this item should be enabled, @false otherwise. - @note Currently disabling items is fully implemented only for the - native control implementation in wxOSX/Cocoa and wxGTK. - This feature is only partially supported in the generic - version (used by wxMSW) and not supported by the wxOSX/Carbon + @note Currently disabling items is not supported by the wxOSX/Carbon implementation. @since 2.9.2 @@ -216,7 +213,7 @@ public: /** Override this to indicate which wxDataViewItem representing the parent - of @a item or an invalid wxDataViewItem if the the root item is + of @a item or an invalid wxDataViewItem if the root item is the parent item. */ virtual wxDataViewItem GetParent(const wxDataViewItem& item) const = 0; @@ -231,7 +228,7 @@ public: /** Override this method to indicate if a container item merely acts as a headline (or for categorisation) or if it also acts a normal item with - entries for futher columns. By default returns @false. + entries for further columns. By default returns @false. */ virtual bool HasContainerColumns(const wxDataViewItem& item) const; @@ -276,7 +273,7 @@ public: /** Call this to inform the model that an item has changed. - This will eventually emit a wxEVT_DATAVIEW_ITEM_VALUE_CHANGED + This will eventually emit a @c wxEVT_DATAVIEW_ITEM_VALUE_CHANGED event (in which the column fields will not be set) to the user. */ bool ItemChanged(const wxDataViewItem& item); @@ -296,7 +293,7 @@ public: /** Call this to inform the model that several items have changed. - This will eventually emit wxEVT_DATAVIEW_ITEM_VALUE_CHANGED + This will eventually emit @c wxEVT_DATAVIEW_ITEM_VALUE_CHANGED events (in which the column fields will not be set) to the user. */ bool ItemsChanged(const wxDataViewItemArray& items); @@ -337,12 +334,16 @@ public: This is also called from wxDataViewCtrl's internal editing code, e.g. when editing a text field in the control. - This will eventually emit a wxEVT_DATAVIEW_ITEM_VALUE_CHANGED + This will eventually emit a @c wxEVT_DATAVIEW_ITEM_VALUE_CHANGED event to the user. */ virtual bool ValueChanged(const wxDataViewItem& item, unsigned int col); + + virtual bool IsListModel() const; + virtual bool IsVirtualListModel() const; + protected: /** @@ -369,14 +370,14 @@ public: /** Destructor. */ - virtual ~wxDataViewIndexListModel(); + virtual ~wxDataViewListModel(); /** Compare method that sorts the items by their index. */ int Compare(const wxDataViewItem& item1, const wxDataViewItem& item2, - unsigned int column, bool ascending); + unsigned int column, bool ascending) const; /** Override this to indicate that the row has special font attributes. @@ -421,25 +422,60 @@ public: unsigned int col) const; /** - Returns the number of items (i.e. rows) in the list. - */ - unsigned int GetCount() const; - - /** - Returns the wxDataViewItem at the given @e row. + Returns the number of items (or rows) in the list. */ - wxDataViewItem GetItem(unsigned int row) const; + unsigned int GetCount() const = 0; /** Returns the position of given @e item. */ - unsigned int GetRow(const wxDataViewItem& item) const; + unsigned int GetRow(const wxDataViewItem& item) const = 0; /** Override this to allow getting values from the model. */ virtual void GetValueByRow(wxVariant& variant, unsigned int row, - unsigned int col) const = 0; + unsigned int col) const = 0; + + /** + Called in order to set a value in the model. + */ + virtual bool SetValueByRow(const wxVariant& variant, unsigned int row, + unsigned int col) = 0; +}; + + +/** + @class wxDataViewIndexListModel + + wxDataViewIndexListModel is a specialized data model which lets you address + an item by its position (row) rather than its wxDataViewItem (which you can + obtain from this class). + This model also provides its own wxDataViewIndexListModel::Compare + method which sorts the model's data by the index. + + This model is not a virtual model since the control stores each wxDataViewItem. + Use wxDataViewVirtualListModel if you need to display millions of items or + have other reason to use a virtual control. + + @see wxDataViewListModel for the API. + + @library{wxadv} + @category{dvc} +*/ + +class wxDataViewIndexListModel : public wxDataViewListModel +{ +public: + /** + Constructor. + */ + wxDataViewIndexListModel(unsigned int initial_size = 0); + + /** + Returns the wxDataViewItem at the given @e row. + */ + wxDataViewItem GetItem(unsigned int row) const; /** Call this after if the data has to be read again from the model. @@ -485,41 +521,6 @@ public: */ void RowsDeleted(const wxArrayInt& rows); - /** - Called in order to set a value in the model. - */ - virtual bool SetValueByRow(const wxVariant& variant, unsigned int row, - unsigned int col) = 0; -}; - - -/** - @class wxDataViewIndexListModel - - wxDataViewIndexListModel is a specialized data model which lets you address - an item by its position (row) rather than its wxDataViewItem (which you can - obtain from this class). - This model also provides its own wxDataViewIndexListModel::Compare - method which sorts the model's data by the index. - - This model is not a virtual model since the control stores each wxDataViewItem. - Use wxDataViewVirtualListModel if you need to display millions of items or - have other reason to use a virtual control. - - @see wxDataViewListModel for the API. - - @library{wxadv} - @category{dvc} -*/ - -class wxDataViewIndexListModel : public wxDataViewListModel -{ -public: - /** - Constructor. - */ - wxDataViewIndexListModel(unsigned int initial_size = 0); - }; /** @@ -546,6 +547,55 @@ public: */ wxDataViewVirtualListModel(unsigned int initial_size = 0); + /** + Returns the wxDataViewItem at the given @e row. + */ + wxDataViewItem GetItem(unsigned int row) const; + + /** + Call this after if the data has to be read again from the model. + This is useful after major changes when calling the methods below + (possibly thousands of times) doesn't make sense. + */ + void Reset(unsigned int new_size); + + /** + Call this after a row has been appended to the model. + */ + void RowAppended(); + + /** + Call this after a row has been changed. + */ + void RowChanged(unsigned int row); + + /** + Call this after a row has been deleted. + */ + void RowDeleted(unsigned int row); + + /** + Call this after a row has been inserted at the given position. + */ + void RowInserted(unsigned int before); + + /** + Call this after a row has been prepended to the model. + */ + void RowPrepended(); + + /** + Call this after a value has been changed. + */ + void RowValueChanged(unsigned int row, unsigned int col); + + /** + Call this after rows have been deleted. + The array will internally get copied and sorted in descending order so + that the rows with the highest position will be deleted first. + */ + void RowsDeleted(const wxArrayInt& rows); + }; @@ -580,10 +630,66 @@ public: */ void SetColour(const wxColour& colour); + /** + Call this to set the background colour to use. + + Currently this attribute is only supported in the generic version of + wxDataViewCtrl and ignored by the native GTK+ and OS X implementations. + + @since 2.9.4 + */ + void SetBackgroundColour(const wxColour& colour); + /** Call this to indicate that the item shall be displayed in italic text. */ void SetItalic(bool set); + + + /** + Returns true if the colour property has been set. + */ + bool HasColour() const; + + /** + Returns this attribute's colour. + */ + const wxColour& GetColour() const; + + /** + Returns true if any property affecting the font has been set. + */ + bool HasFont() const; + + /** + Returns value of the bold property. + */ + bool GetBold() const; + + /** + Returns value of the italics property. + */ + bool GetItalic() const; + + /** + Returns true if the background colour property has been set. + */ + bool HasBackgroundColour() const; + + /** + Returns the colour to be used for the background. + */ + const wxColour& GetBackgroundColour() const; + + /** + Returns true if none of the properties have been set. + */ + bool IsDefault() const; + + /** + Return the font based on the given one with this attribute applied to it. + */ + wxFont GetEffectiveFont(const wxFont& font) const; }; @@ -614,8 +720,9 @@ public: /** Constructor. */ - wxDataViewItem(void* id = NULL); + wxDataViewItem(); wxDataViewItem(const wxDataViewItem& item); + explicit wxDataViewItem(void* id); //@} /** @@ -630,6 +737,61 @@ public: }; +// ---------------------------------------------------------------------------- +// wxDataViewCtrl flags +// ---------------------------------------------------------------------------- + +// size of a wxDataViewRenderer without contents: +#define wxDVC_DEFAULT_RENDERER_SIZE 20 + +// the default width of new (text) columns: +#define wxDVC_DEFAULT_WIDTH 80 + +// the default width of new toggle columns: +#define wxDVC_TOGGLE_DEFAULT_WIDTH 30 + +// the default minimal width of the columns: +#define wxDVC_DEFAULT_MINWIDTH 30 + +// The default alignment of wxDataViewRenderers is to take +// the alignment from the column it owns. +#define wxDVR_DEFAULT_ALIGNMENT -1 + +#define wxDV_SINGLE 0x0000 // for convenience +#define wxDV_MULTIPLE 0x0001 // can select multiple items + +#define wxDV_NO_HEADER 0x0002 // column titles not visible +#define wxDV_HORIZ_RULES 0x0004 // light horizontal rules between rows +#define wxDV_VERT_RULES 0x0008 // light vertical rules between columns + +#define wxDV_ROW_LINES 0x0010 // alternating colour in rows +#define wxDV_VARIABLE_LINE_HEIGHT 0x0020 // variable line height + +// events + +wxEventType wxEVT_COMMAND_DATAVIEW_SELECTION_CHANGED; + +wxEventType wxEVT_COMMAND_DATAVIEW_ITEM_ACTIVATED; +wxEventType wxEVT_COMMAND_DATAVIEW_ITEM_COLLAPSING; +wxEventType wxEVT_COMMAND_DATAVIEW_ITEM_COLLAPSED; +wxEventType wxEVT_COMMAND_DATAVIEW_ITEM_EXPANDING; +wxEventType wxEVT_COMMAND_DATAVIEW_ITEM_EXPANDED; +wxEventType wxEVT_COMMAND_DATAVIEW_ITEM_START_EDITING; +wxEventType wxEVT_COMMAND_DATAVIEW_ITEM_EDITING_STARTED; +wxEventType wxEVT_COMMAND_DATAVIEW_ITEM_EDITING_DONE; +wxEventType wxEVT_COMMAND_DATAVIEW_ITEM_VALUE_CHANGED; + +wxEventType wxEVT_COMMAND_DATAVIEW_ITEM_CONTEXT_MENU; + +wxEventType wxEVT_COMMAND_DATAVIEW_COLUMN_HEADER_CLICK; +wxEventType wxEVT_COMMAND_DATAVIEW_COLUMN_HEADER_RIGHT_CLICK; +wxEventType wxEVT_COMMAND_DATAVIEW_COLUMN_SORTED; +wxEventType wxEVT_COMMAND_DATAVIEW_COLUMN_REORDERED; +wxEventType wxEVT_COMMAND_DATAVIEW_CACHE_HINT; + +wxEventType wxEVT_COMMAND_DATAVIEW_ITEM_BEGIN_DRAG; +wxEventType wxEVT_COMMAND_DATAVIEW_ITEM_DROP_POSSIBLE; +wxEventType wxEVT_COMMAND_DATAVIEW_ITEM_DROP; /** @class wxDataViewCtrl @@ -684,11 +846,13 @@ public: @event{EVT_DATAVIEW_SELECTION_CHANGED(id, func)} Process a @c wxEVT_COMMAND_DATAVIEW_SELECTION_CHANGED event. @event{EVT_DATAVIEW_ITEM_ACTIVATED(id, func)} - Process a @c wxEVT_COMMAND_DATAVIEW_ITEM_ACTIVATED event. + Process a @c wxEVT_COMMAND_DATAVIEW_ITEM_ACTIVATED event. This event + is triggered by double clicking an item or pressing some special key + (usually "Enter") when it is focused. @event{EVT_DATAVIEW_ITEM_START_EDITING(id, func)} - Process a @c wxEVT_COMMAND_DATAVIEW_ITEM_EDITING_STARTED event. This + Process a @c wxEVT_COMMAND_DATAVIEW_ITEM_START_EDITING event. This event can be vetoed in order to prevent editing on an item by item - basis. Still experimental. + basis. @event{EVT_DATAVIEW_ITEM_EDITING_STARTED(id, func)} Process a @c wxEVT_COMMAND_DATAVIEW_ITEM_EDITING_STARTED event. @event{EVT_DATAVIEW_ITEM_EDITING_DONE(id, func)} @@ -704,9 +868,13 @@ public: @event{EVT_DATAVIEW_ITEM_VALUE_CHANGED(id, func)} Process a @c wxEVT_COMMAND_DATAVIEW_ITEM_VALUE_CHANGED event. @event{EVT_DATAVIEW_ITEM_CONTEXT_MENU(id, func)} - Process a @c wxEVT_COMMAND_DATAVIEW_ITEM_CONTEXT_MENU event. + Process a @c wxEVT_COMMAND_DATAVIEW_ITEM_CONTEXT_MENU event + generated when the user right clicks inside the control. Notice that + this menu is generated even if the click didn't occur on any valid + item, in this case wxDataViewEvent::GetItem() simply returns an + invalid item. @event{EVT_DATAVIEW_COLUMN_HEADER_CLICK(id, func)} - Process a @c wxEVT_COMMAND_DATAVIEW_COLUMN_HEADER_CLICKED event. + Process a @c wxEVT_COMMAND_DATAVIEW_COLUMN_HEADER_CLICK event. @event{EVT_DATAVIEW_COLUMN_HEADER_RIGHT_CLICK(id, func)} Process a @c wxEVT_COMMAND_DATAVIEW_COLUMN_HEADER_RIGHT_CLICKED event. @event{EVT_DATAVIEW_COLUMN_SORTED(id, func)} @@ -721,9 +889,14 @@ public: Process a @c wxEVT_COMMAND_DATAVIEW_ITEM_DROP event. @endEventTable + Notice that this control doesn't allow to process generic mouse events such + as @c wxEVT_LEFT_DOWN in all ports (notably it doesn't work in wxGTK). If + you need to handle any mouse events not covered by the ones above, consider + using a custom renderer for the cells that must handle them. + @library{wxadv} @category{ctrl,dvc} - @appearance{dataviewctrl.png} + @appearance{dataviewctrl} */ class wxDataViewCtrl : public wxControl { @@ -748,6 +921,16 @@ public: */ virtual ~wxDataViewCtrl(); + /** + Create the control. Useful for two step creation. + */ + bool Create(wxWindow* parent, wxWindowID id, + const wxPoint& pos = wxDefaultPosition, + const wxSize& size = wxDefaultSize, + long style = 0, + const wxValidator& validator = wxDefaultValidator, + const wxString& name = wxDataViewCtrlNameStr); + /** Appends a wxDataViewColumn to the control. Returns @true on success. @@ -788,6 +971,25 @@ public: int flags = wxDATAVIEW_COL_RESIZABLE); //@} + //@{ + /** + Prepends a column for rendering a bitmap. Returns the wxDataViewColumn + created in the function or @NULL on failure. + */ + wxDataViewColumn* PrependBitmapColumn(const wxString& label, + unsigned int model_column, + wxDataViewCellMode mode = wxDATAVIEW_CELL_INERT, + int width = -1, + wxAlignment align = wxALIGN_CENTER, + int flags = wxDATAVIEW_COL_RESIZABLE); + wxDataViewColumn* PrependBitmapColumn(const wxBitmap& label, + unsigned int model_column, + wxDataViewCellMode mode = wxDATAVIEW_CELL_INERT, + int width = -1, + wxAlignment align = wxALIGN_CENTER, + int flags = wxDATAVIEW_COL_RESIZABLE); + //@} + //@{ /** Appends a column for rendering a date. Returns the wxDataViewColumn @@ -810,6 +1012,28 @@ public: int flags = wxDATAVIEW_COL_RESIZABLE); //@} + //@{ + /** + Prepends a column for rendering a date. Returns the wxDataViewColumn + created in the function or @NULL on failure. + + @note The @a align parameter is applied to both the column header and + the column renderer. + */ + wxDataViewColumn* PrependDateColumn(const wxString& label, + unsigned int model_column, + wxDataViewCellMode mode = wxDATAVIEW_CELL_ACTIVATABLE, + int width = -1, + wxAlignment align = wxALIGN_NOT, + int flags = wxDATAVIEW_COL_RESIZABLE); + wxDataViewColumn* PrependDateColumn(const wxBitmap& label, + unsigned int model_column, + wxDataViewCellMode mode = wxDATAVIEW_CELL_ACTIVATABLE, + int width = -1, + wxAlignment align = wxALIGN_NOT, + int flags = wxDATAVIEW_COL_RESIZABLE); + //@} + //@{ /** Appends a column for rendering text with an icon. Returns the wxDataViewColumn @@ -833,6 +1057,29 @@ public: int flags = wxDATAVIEW_COL_RESIZABLE); //@} + //@{ + /** + Prepends a column for rendering text with an icon. Returns the wxDataViewColumn + created in the function or @NULL on failure. + This method uses the wxDataViewIconTextRenderer class. + + @note The @a align parameter is applied to both the column header and + the column renderer. + */ + wxDataViewColumn* PrependIconTextColumn(const wxString& label, + unsigned int model_column, + wxDataViewCellMode mode = wxDATAVIEW_CELL_INERT, + int width = -1, + wxAlignment align = wxALIGN_NOT, + int flags = wxDATAVIEW_COL_RESIZABLE); + wxDataViewColumn* PrependIconTextColumn(const wxBitmap& label, + unsigned int model_column, + wxDataViewCellMode mode = wxDATAVIEW_CELL_INERT, + int width = -1, + wxAlignment align = wxALIGN_NOT, + int flags = wxDATAVIEW_COL_RESIZABLE); + //@} + //@{ /** Appends a column for rendering a progress indicator. Returns the @@ -855,6 +1102,28 @@ public: int flags = wxDATAVIEW_COL_RESIZABLE); //@} + //@{ + /** + Prepends a column for rendering a progress indicator. Returns the + wxDataViewColumn created in the function or @NULL on failure. + + @note The @a align parameter is applied to both the column header and + the column renderer. + */ + wxDataViewColumn* PrependProgressColumn(const wxString& label, + unsigned int model_column, + wxDataViewCellMode mode = wxDATAVIEW_CELL_INERT, + int width = 80, + wxAlignment align = wxALIGN_CENTER, + int flags = wxDATAVIEW_COL_RESIZABLE); + wxDataViewColumn* PrependProgressColumn(const wxBitmap& label, + unsigned int model_column, + wxDataViewCellMode mode = wxDATAVIEW_CELL_INERT, + int width = 80, + wxAlignment align = wxALIGN_CENTER, + int flags = wxDATAVIEW_COL_RESIZABLE); + //@} + //@{ /** Appends a column for rendering text. Returns the wxDataViewColumn @@ -877,6 +1146,28 @@ public: int flags = wxDATAVIEW_COL_RESIZABLE); //@} + //@{ + /** + Prepends a column for rendering text. Returns the wxDataViewColumn + created in the function or @NULL on failure. + + @note The @a align parameter is applied to both the column header and + the column renderer. + */ + wxDataViewColumn* PrependTextColumn(const wxString& label, + unsigned int model_column, + wxDataViewCellMode mode = wxDATAVIEW_CELL_INERT, + int width = -1, + wxAlignment align = wxALIGN_NOT, + int flags = wxDATAVIEW_COL_RESIZABLE); + wxDataViewColumn* PrependTextColumn(const wxBitmap& label, + unsigned int model_column, + wxDataViewCellMode mode = wxDATAVIEW_CELL_INERT, + int width = -1, + wxAlignment align = wxALIGN_NOT, + int flags = wxDATAVIEW_COL_RESIZABLE); + //@} + //@{ /** Appends a column for rendering a toggle. Returns the wxDataViewColumn @@ -899,6 +1190,28 @@ public: int flags = wxDATAVIEW_COL_RESIZABLE); //@} + //@{ + /** + Prepends a column for rendering a toggle. Returns the wxDataViewColumn + created in the function or @NULL on failure. + + @note The @a align parameter is applied to both the column header and + the column renderer. + */ + wxDataViewColumn* PrependToggleColumn(const wxString& label, + unsigned int model_column, + wxDataViewCellMode mode = wxDATAVIEW_CELL_INERT, + int width = 30, + wxAlignment align = wxALIGN_CENTER, + int flags = wxDATAVIEW_COL_RESIZABLE); + wxDataViewColumn* PrependToggleColumn(const wxBitmap& label, + unsigned int model_column, + wxDataViewCellMode mode = wxDATAVIEW_CELL_INERT, + int width = 30, + wxAlignment align = wxALIGN_CENTER, + int flags = wxDATAVIEW_COL_RESIZABLE); + //@} + /** Associates a wxDataViewModel with the control. This increases the reference count of the model by 1. @@ -916,19 +1229,20 @@ public: virtual void Collapse(const wxDataViewItem& item); /** - Create the control. Useful for two step creation. + Deletes given column. */ - bool Create(wxWindow* parent, wxWindowID id, - const wxPoint& pos = wxDefaultPosition, - const wxSize& size = wxDefaultSize, - long style = 0, - const wxValidator& validator = wxDefaultValidator, - const wxString& name = wxDataViewCtrlNameStr); + virtual bool DeleteColumn(wxDataViewColumn* column); /** - Deletes given column. + Programmatically starts editing given cell of @a item. + + Doesn't do anything if the item or this column is not editable. + + @note Currently not implemented in wxOSX/Carbon. + + @since 2.9.4 */ - virtual bool DeleteColumn(wxDataViewColumn* column); + virtual void EditItem(const wxDataViewItem& item, const wxDataViewColumn *column); /** Enable drag operations using the given @a format. @@ -993,19 +1307,45 @@ public: item may be selected or not but under OS X the current item is always selected. - @see SetCurrentItem() + @see SetCurrentItem(), GetCurrentColumn() @since 2.9.2 */ wxDataViewItem GetCurrentItem() const; + /** + Returns the column that currently has focus. + + If the focus is set to individual cell within the currently focused + item (as opposed to being on the item as a whole), then this is the + column that the focus is on. + + Returns NULL if no column currently has focus. + + @see GetCurrentItem() + + @since 2.9.4 + */ + wxDataViewColumn *GetCurrentColumn() const; + /** Returns indentation. */ int GetIndent() const; /** - Returns item rect. + Returns item rectangle. + + This method is currently not implemented at all in wxGTK and only + implemented for non-@NULL @a col argument in wxOSX. It is fully + implemented in the generic version of the control. + + @param item + A valid item. + @param col + If non-@NULL, the rectangle returned corresponds to the + intersection of the item with the specified column. If @NULL, the + rectangle spans all the columns. */ virtual wxRect GetItemRect(const wxDataViewItem& item, const wxDataViewColumn* col = NULL) const; @@ -1015,13 +1355,35 @@ public: */ wxDataViewModel* GetModel(); + /** + Returns the number of currently selected items. + + This method may be called for both the controls with single and + multiple selections and returns the number of selected item, possibly + 0, in any case. + + @since 2.9.3 + */ + virtual int GetSelectedItemsCount() const; + /** Returns first selected item or an invalid item if none is selected. + + This method may be called for both the controls with single and + multiple selections but returns an invalid item if more than one item + is selected in the latter case, use HasSelection() to determine if + there are any selected items when using multiple selection. */ virtual wxDataViewItem GetSelection() const; /** Fills @a sel with currently selected items and returns their number. + + This method may be called for both the controls with single and + multiple selections. In the single selection case it returns the array + with at most one element in it. + + @see GetSelectedItemsCount() */ virtual int GetSelections(wxDataViewItemArray& sel) const; @@ -1031,6 +1393,20 @@ public: */ virtual wxDataViewColumn* GetSortingColumn() const; + /** + Returns true if any items are currently selected. + + This method may be called for both the controls with single and + multiple selections. + + Calling this method is equivalent to calling GetSelectedItemsCount() + and comparing its result with 0 but is more clear and might also be + implemented more efficiently in the future. + + @since 2.9.3 + */ + bool HasSelection() const; + /** Hittest. */ @@ -1086,7 +1462,7 @@ public: void SetCurrentItem(const wxDataViewItem& item); /** - Sets the indendation. + Sets the indentation. */ void SetIndent(int indent); @@ -1105,6 +1481,26 @@ public: This method only has effect if multiple selections are allowed. */ virtual void UnselectAll(); + + /** + Sets the row height. + + This function can only be used when all rows have the same height, i.e. + when wxDV_VARIABLE_LINE_HEIGHT flag is not used. + + Currently this is implemented in the generic and native GTK versions + only and nothing is done (and @false returned) when using OS X port. + + Also notice that this method can only be used to increase the row + height compared with the default one (as determined by the return value + of wxDataViewRenderer::GetSize()), if it is set to a too small value + then the minimum required by the renderers will be used. + + @return @true if the line height was changed or @false otherwise. + + @since 2.9.2 + */ + virtual bool SetRowHeight(int rowHeight); }; @@ -1144,34 +1540,46 @@ public: /** Called by owning model. + + @return Always return @true from this function in derived classes. */ virtual bool ItemAdded(const wxDataViewItem& parent, const wxDataViewItem& item) = 0; /** Called by owning model. + + @return Always return @true from this function in derived classes. */ virtual bool ItemChanged(const wxDataViewItem& item) = 0; /** Called by owning model. + + @return Always return @true from this function in derived classes. */ virtual bool ItemDeleted(const wxDataViewItem& parent, const wxDataViewItem& item) = 0; /** Called by owning model. + + @return Always return @true from this function in derived classes. */ virtual bool ItemsAdded(const wxDataViewItem& parent, const wxDataViewItemArray& items); /** Called by owning model. + + @return Always return @true from this function in derived classes. */ virtual bool ItemsChanged(const wxDataViewItemArray& items); /** Called by owning model. + + @return Always return @true from this function in derived classes. */ virtual bool ItemsDeleted(const wxDataViewItem& parent, const wxDataViewItemArray& items); @@ -1188,6 +1596,8 @@ public: /** Called by owning model. + + @return Always return @true from this function in derived classes. */ virtual bool ValueChanged(const wxDataViewItem& item, unsigned int col) = 0; }; @@ -1198,18 +1608,54 @@ public: */ enum wxDataViewCellMode { + /** + The cell only displays information and cannot be manipulated or + otherwise interacted with in any way. + + Note that this doesn't mean that the row being drawn can't be selected, + just that a particular element of it cannot be individually modified. + */ wxDATAVIEW_CELL_INERT, /** - Indicates that the user can double click the cell and something will - happen (e.g. a window for editing a date will pop up). + Indicates that the cell can be @em activated by clicking it or using + keyboard. + + Activating a cell is an alternative to showing inline editor when the + value can be edited in a simple way that doesn't warrant full editor + control. The most typical use of cell activation is toggling the + checkbox in wxDataViewToggleRenderer; others would be e.g. an embedded + volume slider or a five-star rating column. + + The exact means of activating a cell are platform-dependent, but they + are usually similar to those used for inline editing of values. + Typically, a cell would be activated by Space or Enter keys or by left + mouse click. + + @note Do not confuse this with item activation in wxDataViewCtrl + and the wxEVT_COMMAND_DATAVIEW_ITEM_ACTIVATED event. That one is + used for activating the item (or, to put it differently, the + entire row) similarly to analogous messages in wxTreeCtrl and + wxListCtrl, and the effect differs (play a song, open a file + etc.). Cell activation, on the other hand, is all about + interacting with the individual cell. + + @see wxDataViewCustomRenderer::ActivateCell() */ wxDATAVIEW_CELL_ACTIVATABLE, /** - Indicates that the user can edit the data in-place, i.e. an control - will show up after a slow click on the cell. This behaviour is best - known from changing the filename in most file managers etc. + Indicates that the user can edit the data in-place in an inline editor + control that will show up when the user wants to edit the cell. + + A typical example of this behaviour is changing the filename in a file + managers. + + Editing is typically triggered by slowly double-clicking the cell or by + a platform-dependent keyboard shortcut (F2 is typical on Windows, Space + and/or Enter is common elsewhere and supported on Windows too). + + @see wxDataViewCustomRenderer::CreateEditorCtrl() */ wxDATAVIEW_CELL_EDITABLE }; @@ -1241,7 +1687,7 @@ enum wxDataViewCellRenderState - wxDataViewSpinRenderer. - wxDataViewChoiceRenderer. - Additionally, the user can write own renderers by deriving from + Additionally, the user can write their own renderers by deriving from wxDataViewCustomRenderer. The ::wxDataViewCellMode and ::wxDataViewCellRenderState flags accepted @@ -1361,6 +1807,21 @@ public: editing process finished. */ virtual bool Validate(wxVariant& value); + + + virtual bool HasEditorCtrl() const; + virtual wxWindow* CreateEditorCtrl(wxWindow * parent, + wxRect labelRect, + const wxVariant& value); + virtual bool GetValueFromEditorCtrl(wxWindow * editor, + wxVariant& value); + virtual bool StartEditing( const wxDataViewItem &item, wxRect labelRect ); + virtual void CancelEditing(); + virtual bool FinishEditing(); + wxWindow *GetEditorCtrl(); + +protected: + wxDataViewCtrl* GetView() const; }; @@ -1480,12 +1941,15 @@ public: /** - @class wxDataViewChoiceRenderer + A wxDataViewCtrl renderer using wxChoice control and values of strings in + it. 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. + @see wxDataViewChoiceByIndexRenderer + @library{wxadv} @category{dvc} */ @@ -1504,7 +1968,7 @@ public: Returns the choice referred to by index. */ wxString GetChoice(size_t index) const; - + /** Returns all choices. */ @@ -1512,6 +1976,28 @@ public: }; +/** + A wxDataViewCtrl renderer using wxChoice control and indexes into it. + + Unlike its base wxDataViewChoiceRenderer class, this one stores the choice + index, i.e. an @c int, in the variant used by its SetValue() and + GetValue(). + + @library{wxadv} + @category{dvc} +*/ +class wxDataViewChoiceByIndexRenderer : public wxDataViewChoiceRenderer +{ +public: + /** + The ctor. + */ + wxDataViewChoiceByIndexRenderer( const wxArrayString &choices, + wxDataViewCellMode mode = wxDATAVIEW_CELL_EDITABLE, + int alignment = wxDVR_DEFAULT_ALIGNMENT ); +}; + + /** @class wxDataViewDateRenderer @@ -1560,7 +2046,7 @@ public: */ wxDataViewCustomRenderer(const wxString& varianttype = "string", wxDataViewCellMode mode = wxDATAVIEW_CELL_INERT, - int align = -1, bool no_init = false); + int align = wxDVR_DEFAULT_ALIGNMENT); /** Destructor. @@ -1568,20 +2054,72 @@ public: virtual ~wxDataViewCustomRenderer(); /** - Override this to react to double clicks or ENTER. - This method will only be called in wxDATAVIEW_CELL_ACTIVATABLE mode. + Override this to react to cell @em activation. Activating a cell is an + alternative to showing inline editor when the value can be edited in a + simple way that doesn't warrant full editor control. The most typical + use of cell activation is toggling the checkbox in + wxDataViewToggleRenderer; others would be e.g. an embedded volume + slider or a five-star rating column. + + The exact means of activating a cell are platform-dependent, but they + are usually similar to those used for inline editing of values. + Typically, a cell would be activated by Space or Enter keys or by left + mouse click. + + This method will only be called if the cell has the + wxDATAVIEW_CELL_ACTIVATABLE mode. + + @param cell + Coordinates of the activated cell's area. + @param model + The model to manipulate in response. + @param item + Activated item. + @param col + Activated column of @a item. + @param mouseEvent + If the activation was triggered by mouse click, contains the + corresponding event. Is @NULL otherwise (for keyboard activation). + Mouse coordinates are adjusted to be relative to the cell. + + @since 2.9.3 + + @note Do not confuse this method with item activation in wxDataViewCtrl + and the wxEVT_COMMAND_DATAVIEW_ITEM_ACTIVATED event. That one is + used for activating the item (or, to put it differently, the + entire row) similarly to analogous messages in wxTreeCtrl and + wxListCtrl, and the effect differs (play a song, open a file + etc.). Cell activation, on the other hand, is all about + interacting with the individual cell. + + @see CreateEditorCtrl() */ - virtual bool Activate( wxRect cell, - wxDataViewModel* model, - const wxDataViewItem & item, - unsigned int col ); + virtual bool ActivateCell(const wxRect& cell, + wxDataViewModel* model, + const wxDataViewItem & item, + unsigned int col, + const wxMouseEvent *mouseEvent); /** Override this to create the actual editor control once editing is about to start. - @a parent is the parent of the editor control, @a labelRect indicates the - position and size of the editor control and @a value is its initial value: + This method will only be called if the cell has the + wxDATAVIEW_CELL_EDITABLE mode. Editing is typically triggered by slowly + double-clicking the cell or by a platform-dependent keyboard shortcut + (F2 is typical on Windows, Space and/or Enter is common elsewhere and + supported on Windows too). + + @param parent + The parent of the editor control. + @param labelRect + Indicates the position and size of the editor control. The control + should be created in place of the cell and @a labelRect should be + respected as much as possible. + @param value + Initial value of the editor. + + An example: @code { long l = value; @@ -1589,10 +2127,12 @@ public: labelRect.GetTopLeft(), labelRect.GetSize(), 0, 0, 100, l ); } @endcode + + @see ActivateCell() */ - virtual wxControl* CreateEditorCtrl(wxWindow* parent, - wxRect labelRect, - const wxVariant& value); + virtual wxWindow* CreateEditorCtrl(wxWindow* parent, + wxRect labelRect, + const wxVariant& value); /** Return the attribute to be used for rendering. @@ -1627,7 +2167,7 @@ public: } @endcode */ - virtual bool GetValueFromEditorCtrl(wxControl* editor, + virtual bool GetValueFromEditorCtrl(wxWindow* editor, wxVariant& value); /** @@ -1640,8 +2180,8 @@ public: 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, - wxRect cell, + virtual bool LeftClick( const wxPoint& cursor, + const wxRect& cell, wxDataViewModel * model, const wxDataViewItem & item, unsigned int col ); @@ -1665,10 +2205,17 @@ public: /** Override this to start a drag operation. Not yet supported. */ - virtual bool StartDrag(wxPoint cursor, wxRect cell, + virtual bool StartDrag(const wxPoint& cursor, + const wxRect& cell, wxDataViewModel* model, const wxDataViewItem & item, unsigned int col); + +protected: + /** + Helper for GetSize() implementations, respects attributes. + */ + wxSize GetTextExtent(const wxString& str) const; }; @@ -1930,7 +2477,7 @@ public: Appends a column to the control and additionally appends a column to the store with the type string. */ - virtual void AppendColumn( wxDataViewColumn *column ); + virtual bool AppendColumn( wxDataViewColumn *column ); /** Appends a column to the control and additionally appends a @@ -1986,7 +2533,7 @@ public: Inserts a column to the control and additionally inserts a column to the store with the type string. */ - virtual void InsertColumn( unsigned int pos, wxDataViewColumn *column ); + virtual bool InsertColumn( unsigned int pos, wxDataViewColumn *column ); /** Inserts a column to the control and additionally inserts a @@ -1999,7 +2546,7 @@ public: Prepends a column to the control and additionally prepends a column to the store with the type string. */ - virtual void PrependColumn( wxDataViewColumn *column ); + virtual bool PrependColumn( wxDataViewColumn *column ); /** Prepends a column to the control and additionally prepends a @@ -2018,17 +2565,17 @@ public: /** Appends an item (=row) to the control and store. */ - void AppendItem( const wxVector &values, wxClientData *data = NULL ); + void AppendItem( const wxVector &values, wxUIntPtr data = NULL ); /** Prepends an item (=row) to the control and store. */ - void PrependItem( const wxVector &values, wxClientData *data = NULL ); + void PrependItem( const wxVector &values, wxUIntPtr data = NULL ); /** Inserts an item (=row) to the control and store. */ - void InsertItem( unsigned int row, const wxVector &values, wxClientData *data = NULL ); + void InsertItem( unsigned int row, const wxVector &values, wxUIntPtr data = NULL ); /** Delete the row at position @a row. @@ -2040,6 +2587,22 @@ public: */ void DeleteAllItems(); + /** + Returns the number of items (=rows) in the control + + @since 2.9.4 + */ + unsigned int GetItemCount() const; + + /** + Returns the client data associated with the item. + + @see SetItemData() + + @since 2.9.4 + */ + wxUIntPtr GetItemData(const wxDataViewItem& item) const; + /** Sets the value in the store and update the control. */ @@ -2053,7 +2616,7 @@ public: /** Sets the value in the store and update the control. - This method assumes that the a string is stored in respective + This method assumes that the string is stored in respective column. */ void SetTextValue( const wxString &value, unsigned int row, unsigned int col ); @@ -2061,7 +2624,7 @@ public: /** Returns the value from the store. - This method assumes that the a string is stored in respective + This method assumes that the string is stored in respective column. */ wxString GetTextValue( unsigned int row, unsigned int col ) const; @@ -2069,7 +2632,7 @@ public: /** Sets the value in the store and update the control. - This method assumes that the a boolean value is stored in + This method assumes that the boolean value is stored in respective column. */ void SetToggleValue( bool value, unsigned int row, unsigned int col ); @@ -2077,11 +2640,24 @@ public: /** Returns the value from the store. - This method assumes that the a boolean value is stored in + This method assumes that the boolean value is stored in respective column. */ bool GetToggleValue( unsigned int row, unsigned int col ) const; + /** + Associates a client data pointer with the given item. + + Notice that the control does @e not take ownership of the pointer for + compatibility with wxListCtrl. I.e. it will @e not delete the pointer + (if it is a pointer and not a number) itself, it is up to you to do it. + + @see GetItemData() + + @since 2.9.4 + */ + void SetItemData(const wxDataViewItem& item, wxUIntPtr data); + //@} }; @@ -2106,7 +2682,7 @@ public: @library{wxadv} @category{ctrl,dvc} - @appearance{dataviewtreectrl.png} + @appearance{dataviewtreectrl} */ class wxDataViewTreeCtrl : public wxDataViewCtrl { @@ -2361,7 +2937,7 @@ public: in number and type. No (default) values are filled in automatically. */ - void AppendItem( const wxVector &values, wxClientData *data = NULL ); + void AppendItem( const wxVector &values, wxUIntPtr data = NULL ); /** Prepends an item (=row) and fills it with @a values. @@ -2370,7 +2946,7 @@ public: in number and type. No (default) values are filled in automatically. */ - void PrependItem( const wxVector &values, wxClientData *data = NULL ); + void PrependItem( const wxVector &values, wxUIntPtr data = NULL ); /** Inserts an item (=row) and fills it with @a values. @@ -2379,7 +2955,7 @@ public: in number and type. No (default) values are filled in automatically. */ - void InsertItem( unsigned int row, const wxVector &values, wxClientData *data = NULL ); + void InsertItem( unsigned int row, const wxVector &values, wxUIntPtr data = NULL ); /** Delete the item (=row) at position @a pos. @@ -2392,23 +2968,51 @@ public: void DeleteAllItems(); /** - Overriden from wxDataViewModel + Returns the number of items (=rows) in the control + + @since 2.9.4 + */ + unsigned int GetItemCount() const; + + /** + Returns the client data associated with the item. + + @see SetItemData() + + @since 2.9.4 + */ + wxUIntPtr GetItemData(const wxDataViewItem& item) const; + + /** + Overridden from wxDataViewModel */ virtual unsigned int GetColumnCount() const; /** - Overriden from wxDataViewModel + Overridden from wxDataViewModel */ virtual wxString GetColumnType( unsigned int col ) const; /** - Overriden from wxDataViewIndexListModel + Sets the client data associated with the item. + + Notice that this class does @e not take ownership of the passed in + pointer and will not delete it. + + @see GetItemData() + + @since 2.9.4 + */ + void SetItemData(const wxDataViewItem& item, wxUIntPtr data); + + /** + Overridden from wxDataViewIndexListModel */ virtual void GetValueByRow( wxVariant &value, unsigned int row, unsigned int col ) const; /** - Overriden from wxDataViewIndexListModel + Overridden from wxDataViewIndexListModel */ virtual bool SetValueByRow( const wxVariant &value, unsigned int row, unsigned int col ); @@ -2418,7 +3022,7 @@ public: /** @class wxDataViewTreeStore - wxDataViewTreeStore is a specialised wxDataViewModel for stroing simple + wxDataViewTreeStore is a specialised wxDataViewModel for storing simple trees very much like wxTreeCtrl does and it offers a similar API. This class actually stores the entire tree and the values (therefore its name) @@ -2480,7 +3084,7 @@ public: int GetChildCount(const wxDataViewItem& parent) const; /** - Returns the client data asoociated with the item. + Returns the client data associated with the item. */ wxClientData* GetItemData(const wxDataViewItem& item) const; @@ -2630,13 +3234,15 @@ public: @event{EVT_DATAVIEW_ITEM_CONTEXT_MENU(id, func)} Process a @c wxEVT_COMMAND_DATAVIEW_ITEM_CONTEXT_MENU event. @event{EVT_DATAVIEW_COLUMN_HEADER_CLICK(id, func)} - Process a @c wxEVT_COMMAND_DATAVIEW_COLUMN_HEADER_CLICKED event. + Process a @c wxEVT_COMMAND_DATAVIEW_COLUMN_HEADER_CLICK event. @event{EVT_DATAVIEW_COLUMN_HEADER_RIGHT_CLICK(id, func)} Process a @c wxEVT_COMMAND_DATAVIEW_COLUMN_HEADER_RIGHT_CLICKED event. @event{EVT_DATAVIEW_COLUMN_SORTED(id, func)} Process a @c wxEVT_COMMAND_DATAVIEW_COLUMN_SORTED event. @event{EVT_DATAVIEW_COLUMN_REORDERED(id, func)} Process a @c wxEVT_COMMAND_DATAVIEW_COLUMN_REORDERED event. + Currently this even is only generated when using the native OSX + version. @event{EVT_DATAVIEW_ITEM_BEGIN_DRAG(id, func)} Process a @c wxEVT_COMMAND_DATAVIEW_ITEM_BEGIN_DRAG event. @event{EVT_DATAVIEW_ITEM_DROP_POSSIBLE(id, func)} @@ -2677,7 +3283,7 @@ public: wxDataViewModel* GetModel() const; /** - Returns a the position of a context menu event in screen coordinates. + Returns the position of a context menu event in screen coordinates. */ wxPoint GetPosition() const; @@ -2686,13 +3292,33 @@ public: */ const wxVariant& GetValue() const; + /** + Can be used to determine whether the new value is going to be accepted + in wxEVT_COMMAND_DATAVIEW_ITEM_EDITING_DONE handler. + + Returns @true if editing the item was cancelled or if the user tried to + enter an invalid value (refused by wxDataViewRenderer::Validate()). If + this method returns @false, it means that the value in the model is + about to be changed to the new one. + + Notice that wxEVT_COMMAND_DATAVIEW_ITEM_EDITING_DONE event handler can + call wxNotifyEvent::Veto() to prevent this from happening. + + Currently support for setting this field and for vetoing the change is + only available in the generic version of wxDataViewCtrl, i.e. under MSW + but not GTK nor OS X. + + @since 2.9.3 + */ + bool IsEditCancelled() const; + /** Sets the column index associated with this event. */ void SetColumn(int col); /** - For wxEVT_DATAVIEW_COLUMN_HEADER_CLICKED only. + For @c wxEVT_DATAVIEW_COLUMN_HEADER_CLICK only. */ void SetDataViewColumn(wxDataViewColumn* col); @@ -2711,41 +3337,55 @@ public: */ void SetDataObject( wxDataObject *obj ); - /** - Used internally. Gets associated wxDataObject for data transfer - within a drag operation. - */ - wxDataObject *GetDataObject() const; - - /** - Used internally. Sets the wxDataFormat during a drop operation. - */ - void SetDataFormat( const wxDataFormat &format ); - /** Gets the wxDataFormat during a drop operation. */ wxDataFormat GetDataFormat() const; /** - Used internally. Sets the data size for a drop data transfer. + Gets the data size for a drop data transfer. */ - void SetDataSize( size_t size ); + size_t GetDataSize() const; /** - Gets the data size for a drop data transfer. + Gets the data buffer for a drop data transfer. */ - size_t GetDataSize() const; + void *GetDataBuffer() const; /** - Used internally. Sets the data buffer for a drop data transfer. + Specify the kind of the drag operation to perform. + + This method can be used inside a wxEVT_COMMAND_DATAVIEW_ITEM_BEGIN_DRAG + handler in order to configure the drag operation. Valid values are + ::wxDrag_CopyOnly (default), ::wxDrag_AllowMove (allow the data to be + moved) and ::wxDrag_DefaultMove. + + Currently it is only honoured by the generic version of wxDataViewCtrl + (used e.g. under MSW) and not supported by the native GTK and OS X + versions. + + @see GetDropEffect() + + @since 2.9.4 */ - void SetDataBuffer( void* buf ); + void SetDragFlags(int flags); /** - Gets the data buffer for a drop data transfer. + Returns the effect the user requested to happen to the dropped data. + + This function can be used inside + wxEVT_COMMAND_DATAVIEW_ITEM_DROP_POSSIBLE and + wxEVT_COMMAND_DATAVIEW_ITEM_DROP handlers and returns whether the user + is trying to copy (the return value is ::wxDragCopy) or move (if the + return value is ::wxDragMove) the data. + + Currently this is only available when using the generic version of + wxDataViewCtrl (used e.g. under MSW) and always returns ::wxDragNone in + the GTK and OS X native versions. + + @since 2.9.4 */ - void *GetDataBuffer() const; + wxDragResult GetDropEffect() const; /** Return the first row that will be displayed. @@ -2756,5 +3396,21 @@ public: Return the last row that will be displayed. */ int GetCacheTo() const; + + + + + wxDataViewItem GetItem() const; + void SetItem( const wxDataViewItem &item ); + void SetEditCanceled(bool editCancelled); + void SetPosition( int x, int y ); + void SetCache(int from, int to); + wxDataObject *GetDataObject() const; + void SetDataFormat( const wxDataFormat &format ); + void SetDataSize( size_t size ); + void SetDataBuffer( void* buf ); + int GetDragFlags() const; + void SetDropEffect( wxDragResult effect ); + };