X-Git-Url: https://git.saurik.com/wxWidgets.git/blobdiff_plain/2e12c11a90bc45d2835d13cf323b99c9729b9096..616c0d1f3ac084bb92f0a75dc48812e8647f1b22:/include/wx/msw/listctrl.h diff --git a/include/wx/msw/listctrl.h b/include/wx/msw/listctrl.h index d9189c5eab..a873d07546 100644 --- a/include/wx/msw/listctrl.h +++ b/include/wx/msw/listctrl.h @@ -2,7 +2,7 @@ // Name: wx/msw/listctrl.h // Purpose: wxListCtrl class // Author: Julian Smart -// Modified by: +// Modified by: Agron Selimaj // Created: 01/02/97 // RCS-ID: $Id$ // Copyright: (c) Julian Smart @@ -12,16 +12,15 @@ #ifndef _WX_LISTCTRL_H_ #define _WX_LISTCTRL_H_ -#ifdef __GNUG__ -#pragma interface "listctrl.h" -#endif +#include "wx/textctrl.h" +#include "wx/dynarray.h" +#include "wx/vector.h" -#include "wx/control.h" -#include "wx/event.h" -#include "wx/hash.h" +class wxMSWListItemData; -class WXDLLEXPORT wxTextCtrl; -class WXDLLEXPORT wxImageList; +// define this symbol to indicate the availability of SetColumnsOrder() and +// related functions +#define wxHAS_LISTCTRL_COLUMN_ORDER /* The wxListCtrl can show lists of items in four different modes: @@ -60,8 +59,8 @@ class WXDLLEXPORT wxImageList; which item. Each image in an image list can contain a mask, and can be made out of either a bitmap, two bitmaps or an icon. See ImagList.h for more details. - Notifications are passed via the wxWindows 2.0 event system, or using virtual - functions in wxWindows 1.66. + Notifications are passed via the wxWidgets 2.0 event system, or using virtual + functions in wxWidgets 1.66. See the sample wxListCtrl app for API usage. @@ -77,7 +76,7 @@ class WXDLLEXPORT wxImageList; */ -class WXDLLEXPORT wxListCtrl: public wxControl +class WXDLLIMPEXP_CORE wxListCtrl: public wxListCtrlBase { public: /* @@ -87,12 +86,12 @@ public: wxListCtrl() { Init(); } wxListCtrl(wxWindow *parent, - wxWindowID id = -1, + wxWindowID id = wxID_ANY, const wxPoint& pos = wxDefaultPosition, const wxSize& size = wxDefaultSize, long style = wxLC_ICON, const wxValidator& validator = wxDefaultValidator, - const wxString& name = _T("wxListCtrl")) + const wxString& name = wxListCtrlNameStr) { Init(); @@ -102,12 +101,12 @@ public: virtual ~wxListCtrl(); bool Create(wxWindow *parent, - wxWindowID id = -1, + wxWindowID id = wxID_ANY, const wxPoint& pos = wxDefaultPosition, const wxSize& size = wxDefaultSize, long style = wxLC_ICON, const wxValidator& validator = wxDefaultValidator, - const wxString& name = _T("wxListCtrl")); + const wxString& name = wxListCtrlNameStr); // Attributes @@ -121,13 +120,25 @@ public: bool GetColumn(int col, wxListItem& item) const; // Sets information about this column - bool SetColumn(int col, wxListItem& item) ; + 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) ; + bool SetColumnWidth(int col, int width); + + + // Gets the column order from its index or index from its order + int GetColumnOrder(int col) const; + int GetColumnIndexFromOrder(int order) const; + + // Gets the column order for all columns + wxArrayInt GetColumnsOrder() const; + + // Sets the column order for all columns + bool SetColumnsOrder(const wxArrayInt& orders); + // Gets the number of items that can fit vertically in the // visible area of the list control (list or report view) @@ -135,47 +146,55 @@ public: // or small icon view) int GetCountPerPage() const; + // return the total area occupied by all the items (icon/small icon only) + wxRect GetViewRect() const; + // Gets the edit control for editing labels. wxTextCtrl* GetEditControl() const; // Gets information about the item - bool GetItem(wxListItem& info) const ; + bool GetItem(wxListItem& info) const; // Sets information about the item - bool SetItem(wxListItem& info) ; + 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 ; + int GetItemState(long item, long stateMask) const; // Sets the item state - bool SetItemState(long item, long state, long stateMask) ; + bool SetItemState(long item, long state, long stateMask); // Sets the item image - bool SetItemImage(long item, int image, int selImage) ; + 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) const ; + wxString GetItemText(long item, int col = 0) const; // Sets the item text - void SetItemText(long item, const wxString& str) ; + void SetItemText(long item, const wxString& str); // Gets the item data - long GetItemData(long item) const ; + wxUIntPtr GetItemData(long item) const; // Sets the item data - bool SetItemData(long item, long 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 ; + bool GetItemRect(long item, wxRect& rect, int code = wxLIST_RECT_BOUNDS) const; + + // Gets the subitem rectangle in report mode + 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 ; + bool GetItemPosition(long item, wxPoint& pos) const; // Sets the item position - bool SetItemPosition(long item, const wxPoint& pos) ; + bool SetItemPosition(long item, const wxPoint& pos); // Gets the number of items in the list control int GetItemCount() const; @@ -183,10 +202,20 @@ public: // Gets the number of columns in the list control int GetColumnCount() const { return m_colCount; } - // Retrieves the spacing between icons in pixels. - // If small is TRUE, gets the spacing for the small icon - // view, otherwise the large icon view. - int GetItemSpacing(bool isSmall) const; + // get the horizontal and vertical components of the item spacing + wxSize GetItemSpacing() const; + + // Foreground colour of an item. + void SetItemTextColour( long item, const wxColour& col); + wxColour GetItemTextColour( long item ) const; + + // Background colour of an item. + void SetItemBackgroundColour( long item, const wxColour &col); + wxColour GetItemBackgroundColour( long item ) const; + + // Font of an item. + void SetItemFont( long item, const wxFont &f); + wxFont GetItemFont( long item ) const; // Gets the number of selected items in the list control int GetSelectedItemCount() const; @@ -199,28 +228,22 @@ public: // Gets the index of the topmost visible item when in // list or report view - long GetTopItem() const ; + long GetTopItem() const; // Add or remove a single window style - void SetSingleStyle(long style, bool add = TRUE) ; + void SetSingleStyle(long style, bool add = true); // Set the whole window style - void SetWindowStyleFlag(long 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 ; - - // Implementation: converts wxWindows style to MSW style. - // Can be a single style flag or a bit list. - // oldStyle is 'normalised' so that it doesn't contain - // conflicting styles. - long ConvertToMSWStyle(long& oldStyle, long style) const; + 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 ; + wxImageList *GetImageList(int which) const; // Sets the image list // N.B. There's a quirk in the Win95 list view implementation. @@ -229,8 +252,12 @@ public: // haven't specified wxLIST_MASK_IMAGE when inserting. // So you have to set a NULL small-icon image list to be sure that // the wxLC_LIST mode works without icons. Of course, you may want icons... - void SetImageList(wxImageList *imageList, int which) ; - void AssignImageList(wxImageList *imageList, int which) ; + void SetImageList(wxImageList *imageList, int which); + void AssignImageList(wxImageList *imageList, int which); + + // refresh items selectively (only useful for virtual list controls) + void RefreshItem(long item); + void RefreshItems(long itemFrom, long itemTo); // Operations //////////////////////////////////////////////////////////////////////////// @@ -242,7 +269,7 @@ public: bool DeleteItem(long item); // Deletes all items - bool DeleteAllItems() ; + bool DeleteAllItems(); // Deletes a column bool DeleteColumn(int col); @@ -254,21 +281,21 @@ public: void ClearAll(); // Edit the label - wxTextCtrl* EditLabel(long item, wxClassInfo* textControlClass = CLASSINFO(wxTextCtrl)); + 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) ; + 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); + 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); + long FindItem(long start, wxUIntPtr data); // Find an item nearest this position in the specified direction, starting from // the item after 'start' or the beginning if 'start' is -1. @@ -276,11 +303,12 @@ public: // Determines which item (if any) is at the specified point, // giving details in 'flags' (see wxLIST_HITTEST_... flags above) - long HitTest(const wxPoint& point, int& flags); + // 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. - long InsertItem(wxListItem& info); + long InsertItem(const wxListItem& info); // Insert a string item long InsertItem(long index, const wxString& label); @@ -291,13 +319,8 @@ public: // Insert an image/string item long InsertItem(long index, const wxString& label, int imageIndex); - // For list view mode (only), inserts a column. - long InsertColumn(long col, wxListItem& info); - - long InsertColumn(long col, - const wxString& heading, - int format = wxLIST_FORMAT_LEFT, - int width = -1); + // set the number of items in a virtual list control + void SetItemCount(long count); // 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 @@ -317,30 +340,71 @@ public: // or zero if the two items are equivalent. // data is arbitrary data to be passed to the sort function. - bool SortItems(wxListCtrlCompare fn, long data); + bool SortItems(wxListCtrlCompare fn, wxIntPtr data); // IMPLEMENTATION virtual bool MSWCommand(WXUINT param, WXWORD id); virtual bool MSWOnNotify(int idCtrl, WXLPARAM lParam, WXLPARAM *result); + virtual bool MSWShouldPreProcessMessage(WXMSG* msg); // bring the control in sync with current m_windowStyle value void UpdateStyle(); - // Add to pool: necessary because Windows needs to have a string - // still exist across 3 callbacks. - wxChar *AddPool(const wxString& str); - // Event handlers //////////////////////////////////////////////////////////////////////////// // Necessary for drawing hrules and vrules, if specified void OnPaint(wxPaintEvent& event); + + virtual bool ShouldInheritColours() const { return false; } + + virtual wxVisualAttributes GetDefaultAttributes() const + { + return GetClassDefaultAttributes(GetWindowVariant()); + } + + static wxVisualAttributes + GetClassDefaultAttributes(wxWindowVariant variant = wxWINDOW_VARIANT_NORMAL); + + +#if WXWIN_COMPATIBILITY_2_6 + // obsolete stuff, for compatibility only -- don't use + wxDEPRECATED( int GetItemSpacing(bool isSmall) const); +#endif // WXWIN_COMPATIBILITY_2_6 + + // convert our styles to Windows + virtual WXDWORD MSWGetStyle(long style, WXDWORD *exstyle) const; + + // special Windows message handling + virtual WXLRESULT MSWWindowProc(WXUINT nMsg, + WXWPARAM wParam, + WXLPARAM lParam); + protected: // common part of all ctors void Init(); - // free memory taken by all attributes and recreate the hash table - void FreeAllAttrs(bool dontRecreate = FALSE); + // Implement constrained best size calculation. + virtual int DoGetBestClientHeight(int width) const + { return MSWGetBestViewRect(width, -1).y; } + virtual int DoGetBestClientWidth(int height) const + { return MSWGetBestViewRect(-1, height).x; } + + wxSize MSWGetBestViewRect(int x, int y) const; + + // Implement base class pure virtual methods. + long DoInsertColumn(long col, const wxListItem& info); + + // free memory taken by all internal data + void FreeAllInternalData(); + + // get the internal data object for this item (may return NULL) + wxMSWListItemData *MSWGetItemData(long item) const; + + // get the item attribute, either by quering it for virtual control, or by + // returning the one previously set using setter methods for a normal one + wxListItemAttr *DoGetItemColumnAttr(long item, long column) const; + wxTextCtrl* m_textCtrl; // The control used for editing a label wxImageList * m_imageListNormal; // The image list for normal icons @@ -350,23 +414,62 @@ protected: m_ownsImageListSmall, m_ownsImageListState; - long m_baseStyle; // Basic Windows style flags, for recreation purposes - wxStringList m_stringPool; // Pool of 3 strings to satisfy Windows callback requirements int m_colCount; // Windows doesn't have GetColumnCount so must // keep track of inserted/deleted columns + long m_count; // Keep track of item count to save calls to + // ListView_GetItemCount - // the hash table we use for storing pointers to the items attributes - wxHashTable m_attrs; + // all wxMSWListItemData objects we use + wxVector m_internalData; - // TRUE if we have any items with custom attributes + // 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 item (may return NULL if none) + virtual wxListItemAttr *OnGetItemAttr(long item) const; + + // return the attribute for the given item and column (may return NULL if none) + virtual wxListItemAttr *OnGetItemColumnAttr(long item, long WXUNUSED(column)) const + { + return OnGetItemAttr(item); + } + private: - bool DoCreateControl(int x, int y, int w, int h); + // process NM_CUSTOMDRAW notification message + WXLPARAM OnCustomDraw(WXLPARAM lParam); + + // set the extended styles for the control (used by Create() and + // UpdateStyle()), only should be called if InReportView() + void MSWSetExListStyles(); + + // initialize the (already created) m_textCtrl with the associated HWND + void InitEditControl(WXHWND hWnd); + + // destroy m_textCtrl if it's currently valid and reset it to NULL + void DeleteEditControl(); + + // Intercept Escape and Enter keys to avoid them being stolen from our + // in-place editor control. + void OnCharHook(wxKeyEvent& event); + DECLARE_DYNAMIC_CLASS(wxListCtrl) DECLARE_EVENT_TABLE() + wxDECLARE_NO_COPY_CLASS(wxListCtrl); }; -#endif - // _WX_LISTCTRL_H_ +#endif // _WX_LISTCTRL_H_