diff --git a/Makefile.in b/Makefile.in index 5b5e83a97f..6dfa3cb782 100644 --- a/Makefile.in +++ b/Makefile.in @@ -3341,7 +3341,6 @@ COND_TOOLKIT_OSX_COCOA_GUI_HDR = \ wx/osx/frame.h \ wx/osx/gauge.h \ wx/osx/listbox.h \ - wx/osx/listctrl.h \ wx/osx/mdi.h \ wx/osx/menu.h \ wx/osx/menuitem.h \ @@ -3451,7 +3450,6 @@ COND_TOOLKIT_OSX_IPHONE_GUI_HDR = \ wx/osx/frame.h \ wx/osx/gauge.h \ wx/osx/listbox.h \ - wx/osx/listctrl.h \ wx/osx/mdi.h \ wx/osx/menu.h \ wx/osx/menuitem.h \ diff --git a/build/bakefiles/files.bkl b/build/bakefiles/files.bkl index 047134a61f..d8040db5e4 100644 --- a/build/bakefiles/files.bkl +++ b/build/bakefiles/files.bkl @@ -2541,7 +2541,6 @@ IMPORTANT: please read docs/tech/tn0016.txt before modifying this file! wx/osx/frame.h wx/osx/gauge.h wx/osx/listbox.h - wx/osx/listctrl.h wx/osx/mdi.h wx/osx/menu.h wx/osx/menuitem.h diff --git a/build/cmake/files.cmake b/build/cmake/files.cmake index 0e5f97b7f0..db51714b9e 100644 --- a/build/cmake/files.cmake +++ b/build/cmake/files.cmake @@ -2417,7 +2417,6 @@ set(OSX_SHARED_HDR wx/osx/frame.h wx/osx/gauge.h wx/osx/listbox.h - wx/osx/listctrl.h wx/osx/mdi.h wx/osx/menu.h wx/osx/menuitem.h diff --git a/build/files b/build/files index 08fcbfb6d4..9db1570b85 100644 --- a/build/files +++ b/build/files @@ -2396,7 +2396,6 @@ OSX_SHARED_HDR = wx/osx/frame.h wx/osx/gauge.h wx/osx/listbox.h - wx/osx/listctrl.h wx/osx/mdi.h wx/osx/menu.h wx/osx/menuitem.h diff --git a/include/wx/generic/listctrl.h b/include/wx/generic/listctrl.h index f1159daf9f..040035ba72 100644 --- a/include/wx/generic/listctrl.h +++ b/include/wx/generic/listctrl.h @@ -213,17 +213,6 @@ protected: virtual wxSize DoGetBestClientSize() const wxOVERRIDE; - // return the text for the given column of the given item - virtual wxString OnGetItemText(long item, long column) const; - - // return the icon for the given item. In report view, OnGetItemImage will - // only be called for the first column. See OnGetItemColumnImage for - // details. - virtual int OnGetItemImage(long item) const; - - // return the icon for the given item and column. - virtual int OnGetItemColumnImage(long item, long column) const; - // it calls our OnGetXXX() functions friend class WXDLLIMPEXP_FWD_CORE wxListMainWindow; diff --git a/include/wx/listbase.h b/include/wx/listbase.h index 02f54a47c5..4a41262e5c 100644 --- a/include/wx/listbase.h +++ b/include/wx/listbase.h @@ -393,9 +393,6 @@ public: virtual int GetColumnWidth(int col) const = 0; virtual bool SetColumnWidth(int col, int width) = 0; - // return the attribute for the item (may return NULL if none) - virtual wxItemAttr *OnGetItemAttr(long item) const; - // Other miscellaneous accessors. // ------------------------------ @@ -427,6 +424,29 @@ protected: // Overridden methods of the base class. virtual wxSize DoGetBestClientSize() const wxOVERRIDE; + // these functions are only used for virtual list view controls, i.e. the + // ones with wxLC_VIRTUAL style + + // return the attribute for the item (may return NULL if none) + virtual wxItemAttr* OnGetItemAttr(long item) const; + + // return the text for the given column of the given item + virtual wxString OnGetItemText(long item, long column) const; + + // return whether the given item is checked + virtual bool OnGetItemIsChecked(long item) const; + + // return the icon for the given item. In report view, OnGetItemImage will + // only be called for the first column. See OnGetItemColumnImage for + // details. + virtual int OnGetItemImage(long item) const; + + // return the icon for the given item and column. + virtual int OnGetItemColumnImage(long item, long column) const; + + // return the attribute for the given item and column (may return NULL if none) + virtual wxItemAttr* OnGetItemColumnAttr(long item, long column) const; + private: // user defined color to draw row lines, may be invalid wxItemAttr m_alternateRowColour; diff --git a/include/wx/msw/listctrl.h b/include/wx/msw/listctrl.h index 2c27e56b6a..78da57b6cc 100644 --- a/include/wx/msw/listctrl.h +++ b/include/wx/msw/listctrl.h @@ -421,26 +421,6 @@ protected: // true if we have any items with custom attributes bool m_hasAnyAttr; - // these functions are only used for virtual list view controls, i.e. the - // ones with wxLC_VIRTUAL style - - // return the text for the given column of the given item - virtual wxString OnGetItemText(long item, long column) const; - - // return the icon for the given item. In report view, OnGetItemImage will - // only be called for the first column. See OnGetItemColumnImage for - // details. - virtual int OnGetItemImage(long item) const; - - // return the icon for the given item and column. - virtual int OnGetItemColumnImage(long item, long column) const; - - // return the attribute for the given item and column (may return NULL if none) - virtual wxItemAttr *OnGetItemColumnAttr(long item, long WXUNUSED(column)) const - { - return OnGetItemAttr(item); - } - private: // process NM_CUSTOMDRAW notification message WXLPARAM OnCustomDraw(WXLPARAM lParam); diff --git a/include/wx/osx/listctrl.h b/include/wx/osx/listctrl.h deleted file mode 100644 index 652af605f0..0000000000 --- a/include/wx/osx/listctrl.h +++ /dev/null @@ -1,398 +0,0 @@ -///////////////////////////////////////////////////////////////////////////// -// Name: wx/osx/listctrl.h -// Purpose: wxListCtrl class -// Author: Stefan Csomor -// Modified by: -// Created: 1998-01-01 -// Copyright: (c) Stefan Csomor -// Licence: wxWindows licence -///////////////////////////////////////////////////////////////////////////// - -#ifndef _WX_LISTCTRL_H_ -#define _WX_LISTCTRL_H_ - -#include "wx/defs.h" -#include "wx/generic/listctrl.h" - -#define wxMAC_ALWAYS_USE_GENERIC_LISTCTRL wxT("mac.listctrl.always_use_generic") - -class wxMacDataBrowserListCtrlControl; -class wxListCtrlTextCtrlWrapper; -class wxListCtrlRenameTimer; - -WX_DECLARE_EXPORTED_LIST(wxListItem, wxColumnList); - -class WXDLLIMPEXP_CORE wxListCtrl: public wxListCtrlBase -{ - wxDECLARE_DYNAMIC_CLASS(wxListCtrl); -public: - /* - * Public interface - */ - - wxListCtrl() { Init(); } - - wxListCtrl(wxWindow *parent, - wxWindowID id = wxID_ANY, - const wxPoint& pos = wxDefaultPosition, - const wxSize& size = wxDefaultSize, - long style = wxLC_ICON, - const wxValidator& validator = wxDefaultValidator, - const wxString& name = wxListCtrlNameStr) - { - Init(); - - Create(parent, id, pos, size, style, validator, name); - } - - virtual ~wxListCtrl(); - - bool Create(wxWindow *parent, - wxWindowID id = wxID_ANY, - const wxPoint& pos = wxDefaultPosition, - const wxSize& size = wxDefaultSize, - long style = wxLC_ICON, - const wxValidator& validator = wxDefaultValidator, - const wxString& name = wxListCtrlNameStr); - - // Attributes - //////////////////////////////////////////////////////////////////////////// - - // Gets information about this column - bool GetColumn(int col, wxListItem& item) const; - - // Sets information about this column - bool SetColumn(int col, const wxListItem& item) ; - - // Gets the column width - int GetColumnWidth(int col) const; - - // Sets the column width - bool SetColumnWidth(int col, int width) ; - - // Gets the number of items that can fit vertically in the - // visible area of the list control (list or report view) - // or the total number of items in the list control (icon - // or small icon view) - int GetCountPerPage() const; - - // Gets the edit control for editing labels. - wxTextCtrl* GetEditControl() const; - - // Gets information about the item - bool GetItem(wxListItem& info) const ; - - // Sets information about the item - bool SetItem(wxListItem& info) ; - - // Sets a string field at a particular column - long SetItem(long index, int col, const wxString& label, int imageId = -1); - - // Gets the item state - int GetItemState(long item, long stateMask) const ; - - // Sets the item state - bool SetItemState(long item, long state, long stateMask) ; - - void AssignImageList(wxImageList *imageList, int which); - - // Sets the item image - bool SetItemImage(long item, int image, int selImage = -1) ; - bool SetItemColumnImage(long item, long column, int image); - - // Gets the item text - wxString GetItemText(long item, int col = 0) const ; - - // Sets the item text - void SetItemText(long item, const wxString& str) ; - - void SetItemTextColour(long item, const wxColour& colour) ; - wxColour GetItemTextColour(long item) const; - - void SetItemBackgroundColour(long item, const wxColour& colour) ; - wxColour GetItemBackgroundColour(long item) const; - - void SetItemFont( long item, const wxFont &f); - wxFont GetItemFont( long item ) const; - - // Gets the item data - long GetItemData(long item) const ; - - // Sets the item data - bool SetItemPtrData(long item, wxUIntPtr data); - bool SetItemData(long item, long data) { return SetItemPtrData(item, data); } - - // Gets the item rectangle - bool GetItemRect(long item, wxRect& rect, int code = wxLIST_RECT_BOUNDS) const ; - - // Gets the item rectangle of a subitem - bool GetSubItemRect( long item, long subItem, wxRect& rect, int code = wxLIST_RECT_BOUNDS ) const; - - // Gets the item position - bool GetItemPosition(long item, wxPoint& pos) const ; - - // Sets the item position - bool SetItemPosition(long item, const wxPoint& pos) ; - - // Gets the number of items in the list control - int GetItemCount() const; - - // Gets the number of columns in the list control - int GetColumnCount() const; - - void SetItemSpacing( int spacing, bool isSmall = false ); - wxSize GetItemSpacing() const; - - // Gets the number of selected items in the list control - int GetSelectedItemCount() const; - - wxRect GetViewRect() const; - - // Gets the text colour of the listview - wxColour GetTextColour() const; - - // Sets the text colour of the listview - void SetTextColour(const wxColour& col); - - // Gets the index of the topmost visible item when in - // list or report view - long GetTopItem() const ; - - // Add or remove a single window style - void SetSingleStyle(long style, bool add = true) ; - - // Set the whole window style - void SetWindowStyleFlag(long style) ; - - // Searches for an item, starting from 'item'. - // item can be -1 to find the first item that matches the - // specified flags. - // Returns the item or -1 if unsuccessful. - long GetNextItem(long item, int geometry = wxLIST_NEXT_ALL, int state = wxLIST_STATE_DONTCARE) const ; - - // Gets one of the three image lists - wxImageList *GetImageList(int which) const ; - - // Sets the image list - void SetImageList(wxImageList *imageList, int which) ; - - // Operations - //////////////////////////////////////////////////////////////////////////// - - // Arranges the items - bool Arrange(int flag = wxLIST_ALIGN_DEFAULT); - - // Deletes an item - bool DeleteItem(long item); - - // Deletes all items - bool DeleteAllItems() ; - - // Deletes a column - bool DeleteColumn(int col); - - // Deletes all columns - bool DeleteAllColumns(); - - // Clears items, and columns if there are any. - void ClearAll(); - - // Edit the label - wxTextCtrl* EditLabel(long item, wxClassInfo* textControlClass = wxCLASSINFO(wxTextCtrl)); - - // End label editing, optionally cancelling the edit - bool EndEditLabel(bool cancel); - - // Ensures this item is visible - bool EnsureVisible(long item) ; - - // Find an item whose label matches this string, starting from the item after 'start' - // or the beginning if 'start' is -1. - long FindItem(long start, const wxString& str, bool partial = false); - - // Find an item whose data matches this data, starting from the item after 'start' - // or the beginning if 'start' is -1. - long FindItem(long start, long data); - - // Find an item nearest this position in the specified direction, starting from - // the item after 'start' or the beginning if 'start' is -1. - long FindItem(long start, const wxPoint& pt, int direction); - - // Determines which item (if any) is at the specified point, - // giving details in 'flags' (see wxLIST_HITTEST_... flags above) - // Request the subitem number as well at the given coordinate. - long HitTest(const wxPoint& point, int& flags, long* ptrSubItem = NULL) const; - - // Inserts an item, returning the index of the new item if successful, - // -1 otherwise. - // TOD: Should also have some further convenience functions - // which don't require setting a wxListItem object - long InsertItem(wxListItem& info); - - // Insert a string item - long InsertItem(long index, const wxString& label); - - // Insert an image item - long InsertItem(long index, int imageIndex); - - // Insert an image/string item - long InsertItem(long index, const wxString& label, int imageIndex); - - // Scrolls the list control. If in icon, small icon or report view mode, - // x specifies the number of pixels to scroll. If in list view mode, x - // specifies the number of columns to scroll. - // If in icon, small icon or list view mode, y specifies the number of pixels - // to scroll. If in report view mode, y specifies the number of lines to scroll. - bool ScrollList(int dx, int dy); - - // Sort items. - - // fn is a function which takes 3 long arguments: item1, item2, data. - // item1 is the long data associated with a first item (NOT the index). - // item2 is the long data associated with a second item (NOT the index). - // data is the same value as passed to SortItems. - // The return value is a negative number if the first item should precede the second - // item, a positive number of the second item should precede the first, - // or zero if the two items are equivalent. - - // data is arbitrary data to be passed to the sort function. - bool SortItems(wxListCtrlCompare fn, wxIntPtr data); - - wxMacDataBrowserListCtrlControl* GetListPeer() const; - - // these functions are only used for virtual list view controls, i.e. the - // ones with wxLC_VIRTUAL style - - void SetItemCount(long count); - void RefreshItem(long item); - void RefreshItems(long itemFrom, long itemTo); - - // return the text for the given column of the given item - virtual wxString OnGetItemText(long item, long column) const; - - // return the icon for the given item. In report view, OnGetItemImage will - // only be called for the first column. See OnGetItemColumnImage for - // details. - virtual int OnGetItemImage(long item) const; - - // return the icon for the given item and column. - virtual int OnGetItemColumnImage(long item, long column) const; - -/* Why should we need this function? Leave for now. - * We might need it because item data may have changed, - * but the display needs refreshing (in string callback mode) - // Updates an item. If the list control has the wxLI_AUTO_ARRANGE style, - // the items will be rearranged. - bool Update(long item); -*/ - - void Command(wxCommandEvent& event) { ProcessCommand(event); } - - wxListCtrlCompare GetCompareFunc() { return m_compareFunc; } - wxIntPtr GetCompareFuncData() { return m_compareFuncData; } - - - // public overrides needed for pimpl approach - virtual bool SetFont(const wxFont& font); - virtual bool SetForegroundColour(const wxColour& colour); - virtual bool SetBackgroundColour(const wxColour& colour); - virtual wxColour GetBackgroundColour() const; - - virtual void Freeze (); - virtual void Thaw (); - virtual void Update (); - - // functions for editing/timer - void OnRenameTimer(); - bool OnRenameAccept(long itemEdit, const wxString& value); - void OnRenameCancelled(long itemEdit); - - void ChangeCurrent(long current); - void ResetCurrent() { ChangeCurrent((long)-1); } - bool HasCurrent() const { return m_current != (long)-1; } - - void OnLeftDown(wxMouseEvent& event); - void OnDblClick(wxMouseEvent& event); - - void FinishEditing(wxTextCtrl *text) - { - delete text; - m_textctrlWrapper = NULL; - SetFocus(); - } - - virtual int GetScrollPos(int orient) const; - - void OnRightDown(wxMouseEvent& event); - void OnMiddleDown(wxMouseEvent& event); - void OnChar(wxKeyEvent& event); - virtual void SetFocus(); - void FireMouseEvent(wxEventType eventType, wxPoint position); - - virtual void SetDropTarget( wxDropTarget *dropTarget ); - virtual wxDropTarget* GetDropTarget() const; - - // with CG, we need to get the context from an kEventControlDraw event - // unfortunately, the DataBrowser callbacks don't provide the context - // and we need it, so we need to set/remove it before and after draw - // events so we can access it in the callbacks. - void MacSetDrawingContext(void* context) { m_cgContext = context; } - void* MacGetDrawingContext() { return m_cgContext; } - - virtual wxVisualAttributes GetDefaultAttributes() const - { - return GetClassDefaultAttributes(GetWindowVariant()); - } - - static wxVisualAttributes - GetClassDefaultAttributes(wxWindowVariant variant = wxWINDOW_VARIANT_NORMAL); - -protected: - // Implement base class pure virtual methods. - long DoInsertColumn(long col, const wxListItem& info); - - // protected overrides needed for pimpl approach - virtual void DoSetSize(int x, int y, - int width, int height, - int sizeFlags = wxSIZE_AUTO); - - long m_current; - wxListCtrlTextCtrlWrapper *m_textctrlWrapper; - wxListCtrlRenameTimer *m_renameTimer; - // common part of all ctors - void Init(); - - wxGenericListCtrl* m_genericImpl; // allow use of the generic impl. - wxMacDataBrowserListCtrlControl* m_dbImpl; - void* m_macListCtrlEventHandler; - void* m_cgContext; - wxListCtrlCompare m_compareFunc; - wxIntPtr m_compareFuncData; - - wxTextCtrl* m_textCtrl; // The control used for editing a label - wxImageList * m_imageListNormal; // The image list for normal icons - wxImageList * m_imageListSmall; // The image list for small icons - wxImageList * m_imageListState; // The image list state icons (not implemented yet) - - wxColumnList m_colsInfo; // for storing info about each column - wxColour m_textColor; - wxColour m_bgColor; - - // keep track of whether or not we should delete the image list ourselves. - bool m_ownsImageListNormal, - m_ownsImageListSmall, - m_ownsImageListState; - - long m_baseStyle; // Basic Windows style flags, for recreation purposes - int m_colCount; // Windows doesn't have GetColumnCount so must - // keep track of inserted/deleted columns - - int m_count; // for virtual lists, store item count - -private: - int CalcColumnAutoWidth(int col) const; - -}; - -#endif - // _WX_LISTCTRL_H_ diff --git a/include/wx/qt/listctrl.h b/include/wx/qt/listctrl.h index 139bbc698d..e55b44ef98 100644 --- a/include/wx/qt/listctrl.h +++ b/include/wx/qt/listctrl.h @@ -265,27 +265,6 @@ public: // data is arbitrary data to be passed to the sort function. bool SortItems(wxListCtrlCompare fn, wxIntPtr data); - - // these functions are only used for virtual list view controls, i.e. the - // ones with wxLC_VIRTUAL style (not currently implemented in wxQT) - - // return the text for the given column of the given item - virtual wxString OnGetItemText(long item, long column) const; - - // return the icon for the given item. In report view, OnGetItemImage will - // only be called for the first column. See OnGetItemColumnImage for - // details. - virtual int OnGetItemImage(long item) const; - - // return the icon for the given item and column. - virtual int OnGetItemColumnImage(long item, long column) const; - - // return the attribute for the given item and column (may return NULL if none) - virtual wxItemAttr *OnGetItemColumnAttr(long item, long WXUNUSED(column)) const - { - return OnGetItemAttr(item); - } - virtual QWidget *GetHandle() const wxOVERRIDE; protected: diff --git a/interface/wx/listctrl.h b/interface/wx/listctrl.h index fac32dd53b..d90b30d19c 100644 --- a/interface/wx/listctrl.h +++ b/interface/wx/listctrl.h @@ -1271,6 +1271,13 @@ public: @param enable If @true, enable checkboxes, otherwise disable checkboxes. @return @true if checkboxes are supported, @false otherwise. + In a list control with wxLC_VIRTUAL style you have to keep track of the + checkbox state. When a checkbox is clicked (EVT_LIST_ITEM_CHECKED + or EVT_LIST_ITEM_UNCHECKED) you have to update the state and refresh + the item yourself. + + @see OnGetItemIsChecked() RefreshItem() + @since 3.1.0 */ bool EnableCheckBoxes(bool enable = true); @@ -1312,7 +1319,7 @@ protected: The base class version always returns @NULL. @see OnGetItemImage(), OnGetItemColumnImage(), OnGetItemText(), - OnGetItemColumnAttr() + OnGetItemColumnAttr(), OnGetItemIsChecked() */ virtual wxItemAttr* OnGetItemAttr(long item) const; @@ -1370,6 +1377,17 @@ protected: @see SetItemCount(), OnGetItemImage(), OnGetItemColumnImage(), OnGetItemAttr() */ virtual wxString OnGetItemText(long item, long column) const; + + /** + This function @b must be overridden in the derived class for a control with + @c wxLC_VIRTUAL style that uses checkboxes. It should return whether the + checkbox of the specified @c item is checked. + + @see EnableCheckBoxes(), OnGetItemText() + + @since 3.1.2 + */ + virtual bool OnGetItemIsChecked(long item) const; }; diff --git a/samples/listctrl/listtest.cpp b/samples/listctrl/listtest.cpp index a8d38f6520..6ce7a10cb0 100644 --- a/samples/listctrl/listtest.cpp +++ b/samples/listctrl/listtest.cpp @@ -44,6 +44,7 @@ #include "wx/sizer.h" #include "wx/sysopt.h" #include "wx/numdlg.h" +#include "wx/selstore.h" #include "listtest.h" @@ -1204,6 +1205,11 @@ void MyListCtrl::OnChecked(wxListEvent& event) { LogEvent(event, "OnChecked"); + if ( IsVirtual() ) + { + CheckItem(event.GetIndex(), true); + } + event.Skip(); } @@ -1211,6 +1217,11 @@ void MyListCtrl::OnUnChecked(wxListEvent& event) { LogEvent(event, "OnUnChecked"); + if ( IsVirtual() ) + { + CheckItem(event.GetIndex(), false); + } + event.Skip(); } @@ -1419,6 +1430,36 @@ wxString MyListCtrl::OnGetItemText(long item, long column) const } } +void MyListCtrl::CheckItem(long item, bool check) +{ + if ( IsVirtual() ) + { + m_checked.SelectItem(item, check); + RefreshItem(item); + } + else + { + wxListCtrl::CheckItem(item, check); + } +} + +bool MyListCtrl::IsItemChecked(long item) const +{ + if ( IsVirtual() ) + { + return m_checked.IsSelected(item); + } + else + { + return wxListCtrl::IsItemChecked(item); + } +} + +bool MyListCtrl::OnGetItemIsChecked(long item) const +{ + return IsItemChecked(item); +} + int MyListCtrl::OnGetItemColumnImage(long item, long column) const { if (!column) diff --git a/samples/listctrl/listtest.h b/samples/listctrl/listtest.h index e48b5292ef..dcdca2a55c 100644 --- a/samples/listctrl/listtest.h +++ b/samples/listctrl/listtest.h @@ -74,6 +74,9 @@ public: void OnRightClick(wxMouseEvent& event); + virtual void CheckItem(long item, bool check) wxOVERRIDE; + virtual bool IsItemChecked(long item) const wxOVERRIDE; + private: void ShowContextMenu(const wxPoint& pos); wxLog *m_logOld; @@ -83,11 +86,14 @@ private: void LogColEvent(const wxListEvent& event, const wxString& eventName); virtual wxString OnGetItemText(long item, long column) const wxOVERRIDE; + virtual bool OnGetItemIsChecked(long item) const wxOVERRIDE; virtual int OnGetItemColumnImage(long item, long column) const wxOVERRIDE; virtual wxItemAttr *OnGetItemAttr(long item) const wxOVERRIDE; long m_updated; + // checked boxes in virtual list + wxSelectionStore m_checked; wxDECLARE_NO_COPY_CLASS(MyListCtrl); wxDECLARE_EVENT_TABLE(); diff --git a/src/common/listctrlcmn.cpp b/src/common/listctrlcmn.cpp index 70f2bf7e48..ead815ed70 100644 --- a/src/common/listctrlcmn.cpp +++ b/src/common/listctrlcmn.cpp @@ -25,6 +25,7 @@ #if wxUSE_LISTCTRL #include "wx/listctrl.h" +#include "wx/imaglist.h" #ifndef WX_PRECOMP #include "wx/dcclient.h" @@ -251,4 +252,43 @@ wxItemAttr *wxListCtrlBase::OnGetItemAttr(long item) const : NULL; // no attributes by default } +wxString wxListCtrlBase::OnGetItemText(long WXUNUSED(item), long WXUNUSED(col)) const +{ + // this is a pure virtual function, in fact - which is not really pure + // because the controls which are not virtual don't need to implement it + wxFAIL_MSG("wxListCtrl::OnGetItemText not supposed to be called"); + + return wxEmptyString; +} + +bool wxListCtrlBase::OnGetItemIsChecked(long WXUNUSED(item)) const +{ + // this is a pure virtual function, in fact - which is not really pure + // because the controls which are not virtual don't need to implement it + wxFAIL_MSG("wxListCtrl::OnGetItemIsChecked not supposed to be called"); + + return false; +} + +int wxListCtrlBase::OnGetItemImage(long WXUNUSED(item)) const +{ + wxCHECK_MSG(!GetImageList(wxIMAGE_LIST_SMALL), + -1, + "List control has an image list, OnGetItemImage or OnGetItemColumnImage should be overridden."); + return -1; +} + +int wxListCtrlBase::OnGetItemColumnImage(long item, long column) const +{ + if ( !column ) + return OnGetItemImage(item); + + return -1; +} + +wxItemAttr* wxListCtrlBase::OnGetItemColumnAttr(long item, long WXUNUSED(column)) const +{ + return OnGetItemAttr(item); +} + #endif // wxUSE_LISTCTRL diff --git a/src/generic/listctrl.cpp b/src/generic/listctrl.cpp index 0394bfaba7..1414a9386e 100644 --- a/src/generic/listctrl.cpp +++ b/src/generic/listctrl.cpp @@ -1681,6 +1681,7 @@ void wxListMainWindow::CacheLineData(size_t line) ld->SetImage(col, listctrl->OnGetItemColumnImage(line, col)); } + ld->Check(listctrl->OnGetItemIsChecked(line)); ld->SetAttr(listctrl->OnGetItemAttr(line)); } @@ -5533,31 +5534,6 @@ wxSize wxGenericListCtrl::DoGetBestClientSize() const // virtual list control support // ---------------------------------------------------------------------------- -wxString wxGenericListCtrl::OnGetItemText(long WXUNUSED(item), long WXUNUSED(col)) const -{ - // this is a pure virtual function, in fact - which is not really pure - // because the controls which are not virtual don't need to implement it - wxFAIL_MSG( wxT("wxGenericListCtrl::OnGetItemText not supposed to be called") ); - - return wxEmptyString; -} - -int wxGenericListCtrl::OnGetItemImage(long WXUNUSED(item)) const -{ - wxCHECK_MSG(!GetImageList(wxIMAGE_LIST_SMALL), - -1, - wxT("List control has an image list, OnGetItemImage or OnGetItemColumnImage should be overridden.")); - return -1; -} - -int wxGenericListCtrl::OnGetItemColumnImage(long item, long column) const -{ - if (!column) - return OnGetItemImage(item); - - return -1; -} - void wxGenericListCtrl::SetItemCount(long count) { wxASSERT_MSG( IsVirtual(), wxT("this is for virtual controls only") ); diff --git a/src/msw/listctrl.cpp b/src/msw/listctrl.cpp index c557c559f3..7b85bf262d 100644 --- a/src/msw/listctrl.cpp +++ b/src/msw/listctrl.cpp @@ -2480,6 +2480,33 @@ bool wxListCtrl::MSWOnNotify(int idCtrl, WXLPARAM lParam, WXLPARAM *result) event.m_item.m_data = GetItemData(iItem); break; + case NM_CLICK: + processed = false; + + // In virtual mode, check if user clicks on a checkbox. + if ( IsVirtual() && HasCheckBoxes() ) + { + LV_HITTESTINFO lvhti; + wxZeroMemory(lvhti); + + wxGetCursorPosMSW(&(lvhti.pt)); + ::ScreenToClient(GetHwnd(), &lvhti.pt); + + if ( ListView_SubItemHitTest(GetHwnd(), &lvhti) != -1 ) + { + if ( (lvhti.flags & LVHT_ONITEMSTATEICON) && (lvhti.iSubItem == 0) ) + { + event.m_itemIndex = lvhti.iItem; + if ( OnGetItemIsChecked(event.m_itemIndex) ) + eventType = wxEVT_LIST_ITEM_UNCHECKED; + else + eventType = wxEVT_LIST_ITEM_CHECKED; + processed = true; + } + } + } + break; + case NM_RCLICK: // if the user processes it in wxEVT_COMMAND_RIGHT_CLICK(), // don't do anything else @@ -2669,8 +2696,14 @@ bool wxListCtrl::MSWOnNotify(int idCtrl, WXLPARAM lParam, WXLPARAM *result) // can get messages with LVIF_STATE in lvi.mask under Vista if ( lvi.mask & LVIF_STATE ) { - // we don't have anything to return from here... lvi.stateMask = 0; + + if ( HasCheckBoxes() && (lvi.iSubItem == 0) ) + { + const bool checked = OnGetItemIsChecked(item); + lvi.state = INDEXTOSTATEIMAGEMASK(checked ? 2 : 1); + lvi.stateMask = LVIS_STATEIMAGEMASK; + } } return true; @@ -3240,31 +3273,6 @@ wxListCtrl::MSWWindowProc(WXUINT nMsg, WXWPARAM wParam, WXLPARAM lParam) // virtual list controls // ---------------------------------------------------------------------------- -wxString wxListCtrl::OnGetItemText(long WXUNUSED(item), long WXUNUSED(col)) const -{ - // this is a pure virtual function, in fact - which is not really pure - // because the controls which are not virtual don't need to implement it - wxFAIL_MSG( wxT("wxListCtrl::OnGetItemText not supposed to be called") ); - - return wxEmptyString; -} - -int wxListCtrl::OnGetItemImage(long WXUNUSED(item)) const -{ - wxCHECK_MSG(!GetImageList(wxIMAGE_LIST_SMALL), - -1, - wxT("List control has an image list, OnGetItemImage or OnGetItemColumnImage should be overridden.")); - return -1; -} - -int wxListCtrl::OnGetItemColumnImage(long item, long column) const -{ - if (!column) - return OnGetItemImage(item); - - return -1; -} - wxItemAttr *wxListCtrl::DoGetItemColumnAttr(long item, long column) const { if ( IsVirtual() ) diff --git a/src/qt/listctrl.cpp b/src/qt/listctrl.cpp index 4ba6cfcefd..587961d3da 100644 --- a/src/qt/listctrl.cpp +++ b/src/qt/listctrl.cpp @@ -1010,35 +1010,6 @@ bool wxListCtrl::SortItems(wxListCtrlCompare WXUNUSED(fn), wxIntPtr WXUNUSED(dat return false; } -// ---------------------------------------------------------------------------- -// virtual list controls (not currently implemented in wxQT) -// ---------------------------------------------------------------------------- - -wxString wxListCtrl::OnGetItemText(long WXUNUSED(item), long WXUNUSED(col)) const -{ - // this is a pure virtual function, in fact - which is not really pure - // because the controls which are not virtual don't need to implement it - wxFAIL_MSG( wxT("wxListCtrl::OnGetItemText not supposed to be called") ); - - return wxEmptyString; -} - -int wxListCtrl::OnGetItemImage(long WXUNUSED(item)) const -{ - wxCHECK_MSG(!GetImageList(wxIMAGE_LIST_SMALL), - -1, - wxT("List control has an image list, OnGetItemImage or OnGetItemColumnImage should be overridden.")); - return -1; -} - -int wxListCtrl::OnGetItemColumnImage(long item, long column) const -{ - if (!column) - return OnGetItemImage(item); - - return -1; -} - QWidget *wxListCtrl::GetHandle() const { return m_qtTreeWidget;