1 ///////////////////////////////////////////////////////////////////////////// 
   3 // Purpose:     wxListCtrl class 
   8 // Copyright:   (c) AUTHOR 
   9 // Licence:     wxWindows licence 
  10 ///////////////////////////////////////////////////////////////////////////// 
  12 #ifndef _WX_LISTCTRL_H_ 
  13 #define _WX_LISTCTRL_H_ 
  16 #pragma interface "listctrl.h" 
  19 #include "wx/control.h" 
  21 #include "wx/imaglist.h" 
  24     The wxListCtrl can show lists of items in four different modes: 
  25     wxLC_LIST:   multicolumn list view, with optional small icons (icons could be 
  26                  optional for some platforms). Columns are computed automatically, 
  27                  i.e. you don't set columns as in wxLC_REPORT. In other words, 
  28                  the list wraps, unlike a wxListBox. 
  29     wxLC_REPORT: single or multicolumn report view (with optional header) 
  30     wxLC_ICON:   large icon view, with optional labels 
  31     wxLC_SMALL_ICON: small icon view, with optional labels 
  33     You can change the style dynamically, either with SetSingleStyle or 
  36     Further window styles: 
  38     wxLC_ALIGN_TOP          icons align to the top (default) 
  39     wxLC_ALIGN_LEFT         icons align to the left 
  40     wxLC_AUTOARRANGE        icons arrange themselves 
  41     wxLC_USER_TEXT          the app provides label text on demand, except for column headers 
  42     wxLC_EDIT_LABELS        labels are editable: app will be notified. 
  43     wxLC_NO_HEADER          no header in report mode 
  44     wxLC_NO_SORT_HEADER     can't click on header 
  45     wxLC_SINGLE_SEL         single selection 
  46     wxLC_SORT_ASCENDING     sort ascending (must still supply a comparison callback in SortItems) 
  47     wxLC_SORT_DESCENDING    sort descending (ditto) 
  49     Items are referred to by their index (position in the list starting from zero). 
  51     Label text is supplied via insertion/setting functions and is stored by the 
  52     control, unless the wxLC_USER_TEXT style has been specified, in which case 
  53     the app will be notified when text is required (see sample). 
  55     Images are dealt with by (optionally) associating 3 image lists with the control. 
  56     Zero-based indexes into these image lists indicate which image is to be used for 
  57     which item. Each image in an image list can contain a mask, and can be made out 
  58     of either a bitmap, two bitmaps or an icon. See ImagList.h for more details. 
  60     Notifications are passed via the wxWindows 2.0 event system. 
  62     See the sample wxListCtrl app for API usage. 
  66 // Mask flags to tell app/GUI what fields of wxListItem are valid 
  67 #define wxLIST_MASK_STATE           0x0001 
  68 #define wxLIST_MASK_TEXT            0x0002 
  69 #define wxLIST_MASK_IMAGE           0x0004 
  70 #define wxLIST_MASK_DATA            0x0008 
  71 #define wxLIST_SET_ITEM             0x0010 
  72 #define wxLIST_MASK_WIDTH           0x0020 
  73 #define wxLIST_MASK_FORMAT          0x0040 
  75 // State flags for indicating the state of an item 
  76 #define wxLIST_STATE_DONTCARE       0x0000 
  77 #define wxLIST_STATE_DROPHILITED    0x0001 
  78 #define wxLIST_STATE_FOCUSED        0x0002 
  79 #define wxLIST_STATE_SELECTED       0x0004 
  80 #define wxLIST_STATE_CUT            0x0008 
  82 // Hit test flags, used in HitTest 
  83 #define wxLIST_HITTEST_ABOVE            0x0001  // Above the client area. 
  84 #define wxLIST_HITTEST_BELOW            0x0002  // Below the client area. 
  85 #define wxLIST_HITTEST_NOWHERE          0x0004  // In the client area but below the last item. 
  86 #define wxLIST_HITTEST_ONITEMICON       0x0020  // On the bitmap associated with an item. 
  87 #define wxLIST_HITTEST_ONITEMLABEL      0x0080  // On the label (string) associated with an item. 
  88 #define wxLIST_HITTEST_ONITEMRIGHT      0x0100  // In the area to the right of an item. 
  89 #define wxLIST_HITTEST_ONITEMSTATEICON  0x0200  // On the state icon for a tree view item that is in a user-defined state. 
  90 #define wxLIST_HITTEST_TOLEFT           0x0400  // To the left of the client area. 
  91 #define wxLIST_HITTEST_TORIGHT          0x0800  // To the right of the client area. 
  93 #define wxLIST_HITTEST_ONITEM (wxLIST_HITTEST_ONITEMICON | wxLIST_HITTEST_ONITEMLABEL wxLIST_HITTEST_ONITEMSTATEICON) 
  95 // Flags for GetNextItem 
  97     wxLIST_NEXT_ABOVE
,          // Searches for an item above the specified item 
  98     wxLIST_NEXT_ALL
,            // Searches for subsequent item by index 
  99     wxLIST_NEXT_BELOW
,          // Searches for an item below the specified item 
 100     wxLIST_NEXT_LEFT
,           // Searches for an item to the left of the specified item 
 101     wxLIST_NEXT_RIGHT
,          // Searches for an item to the right of the specified item 
 104 // Alignment flags for Arrange 
 106     wxLIST_ALIGN_DEFAULT
, 
 109     wxLIST_ALIGN_SNAP_TO_GRID
 
 116     wxLIST_FORMAT_CENTRE
, 
 117     wxLIST_FORMAT_CENTER 
= wxLIST_FORMAT_CENTRE
 
 120 // Autosize values for SetColumnWidth 
 122     wxLIST_AUTOSIZE 
= -1, 
 123     wxLIST_AUTOSIZE_USEHEADER 
= -2 
 126 // Flag values for GetItemRect 
 133 // Flag values for FindItem 
 141 // wxListItem: data representing an item, or report field. 
 142 // It also doubles up to represent entire column information 
 143 // when inserting or setting a column. 
 144 class WXDLLEXPORT wxListItem
: public wxObject
 
 146  DECLARE_DYNAMIC_CLASS(wxListItem
) 
 148     long            m_mask
;     // Indicates what fields are valid 
 149     long            m_itemId
;   // The zero-based item position 
 150     int             m_col
;      // Zero-based column, if in report mode 
 151     long            m_state
;    // The state of the item 
 152     long            m_stateMask
; // Which flags of m_state are valid (uses same flags) 
 153     wxString        m_text
;     // The label/header text 
 154     int             m_image
;    // The zero-based index into an image list 
 155     long            m_data
;     // App-defined data 
 158     int             m_format
;   // left, right, centre 
 159     int             m_width
;    // width of column 
 164 // type of compare function for wxListCtrl sort operation 
 165 typedef int (*wxListCtrlCompare
)(long item1
, long item2
, long sortData
); 
 167 class WXDLLEXPORT wxListCtrl
: public wxControl
 
 169   DECLARE_DYNAMIC_CLASS(wxListCtrl
) 
 177   inline wxListCtrl(wxWindow 
*parent
, wxWindowID id 
= -1, const wxPoint
& pos 
= wxDefaultPosition
, const wxSize
& size 
= wxDefaultSize
, 
 178             long style 
= wxLC_ICON
, const wxValidator
& validator 
= wxDefaultValidator
, 
 179             const wxString
& name 
= "listCtrl") 
 181     Create(parent
, id
, pos
, size
, style
, validator
, name
); 
 185   bool Create(wxWindow 
*parent
, wxWindowID id 
= -1, const wxPoint
& pos 
= wxDefaultPosition
, const wxSize
& size 
= wxDefaultSize
, 
 186             long style 
= wxLC_ICON
, const wxValidator
& validator 
= wxDefaultValidator
, const wxString
& name 
= "wxListCtrl"); 
 190   //////////////////////////////////////////////////////////////////////////// 
 192   // Gets information about this column 
 193   bool GetColumn(int col
, wxListItem
& item
) const; 
 195   // Sets information about this column 
 196   bool SetColumn(int col
, wxListItem
& item
) ; 
 198   // Gets the column width 
 199   int GetColumnWidth(int col
) const; 
 201   // Sets the column width 
 202   bool SetColumnWidth(int col
, int width
) ; 
 204   // Gets the number of items that can fit vertically in the 
 205   // visible area of the list control (list or report view) 
 206   // or the total number of items in the list control (icon 
 207   // or small icon view) 
 208   int GetCountPerPage() const; 
 210   // Gets the edit control for editing labels. 
 211   wxTextCtrl
* GetEditControl() const; 
 213   // Gets information about the item 
 214   bool GetItem(wxListItem
& info
) const ; 
 216   // Sets information about the item 
 217   bool SetItem(wxListItem
& info
) ; 
 219   // Sets a string field at a particular column 
 220   long SetItem(long index
, int col
, const wxString
& label
, int imageId 
= -1); 
 222   // Gets the item state 
 223   int  GetItemState(long item
, long stateMask
) const ; 
 225   // Sets the item state 
 226   bool SetItemState(long item
, long state
, long stateMask
) ; 
 228   // Sets the item image 
 229   bool SetItemImage(long item
, int image
, int selImage
) ; 
 231   // Gets the item text 
 232   wxString 
GetItemText(long item
) const ; 
 234   // Sets the item text 
 235   void SetItemText(long item
, const wxString
& str
) ; 
 237   // Gets the item data 
 238   long GetItemData(long item
) const ; 
 240   // Sets the item data 
 241   bool SetItemData(long item
, long data
) ; 
 243   // Gets the item rectangle 
 244   bool GetItemRect(long item
, wxRect
& rect
, int code 
= wxLIST_RECT_BOUNDS
) const ; 
 246   // Gets the item position 
 247   bool GetItemPosition(long item
, wxPoint
& pos
) const ; 
 249   // Sets the item position 
 250   bool SetItemPosition(long item
, const wxPoint
& pos
) ; 
 252   // Gets the number of items in the list control 
 253   int GetItemCount() const; 
 255   // Gets the number of columns in the list control 
 256   int GetColumnCount() const; 
 258   // Retrieves the spacing between icons in pixels. 
 259   // If small is TRUE, gets the spacing for the small icon 
 260   // view, otherwise the large icon view. 
 261   int GetItemSpacing(bool isSmall
) const; 
 263   // Gets the number of selected items in the list control 
 264   int GetSelectedItemCount() const; 
 266   // Gets the text colour of the listview 
 267   wxColour 
GetTextColour() const; 
 269   // Sets the text colour of the listview 
 270   void SetTextColour(const wxColour
& col
); 
 272   // Gets the index of the topmost visible item when in 
 273   // list or report view 
 274   long GetTopItem() const ; 
 276   // Add or remove a single window style 
 277   void SetSingleStyle(long style
, bool add 
= TRUE
) ; 
 279   // Set the whole window style 
 280   void SetWindowStyleFlag(long style
) ; 
 282   // Searches for an item, starting from 'item'. 
 283   // item can be -1 to find the first item that matches the 
 285   // Returns the item or -1 if unsuccessful. 
 286   long GetNextItem(long item
, int geometry 
= wxLIST_NEXT_ALL
, int state 
= wxLIST_STATE_DONTCARE
) const ; 
 288   // Implementation: converts wxWindows style to MSW style. 
 289   // Can be a single style flag or a bit list. 
 290   // oldStyle is 'normalised' so that it doesn't contain 
 291   // conflicting styles. 
 292   long ConvertToMSWStyle(long& oldStyle
, long style
) const; 
 294   // Gets one of the three image lists 
 295   wxImageList 
*GetImageList(int which
) const ; 
 297   // Sets the image list 
 298   // N.B. There's a quirk in the Win95 list view implementation. 
 299   // If in wxLC_LIST mode, it'll *still* display images by the labels if 
 300   // there's a small-icon image list set for the control - even though you 
 301   // haven't specified wxLIST_MASK_IMAGE when inserting. 
 302   // So you have to set a NULL small-icon image list to be sure that 
 303   // the wxLC_LIST mode works without icons. Of course, you may want icons... 
 304   void SetImageList(wxImageList 
*imageList
, int which
) ; 
 307   //////////////////////////////////////////////////////////////////////////// 
 309   // Arranges the items 
 310   bool Arrange(int flag 
= wxLIST_ALIGN_DEFAULT
); 
 313   bool DeleteItem(long item
); 
 316   bool DeleteAllItems() ; 
 319   bool DeleteColumn(int col
); 
 321   // Deletes all columns 
 322   bool DeleteAllColumns(); 
 324   // Clears items, and columns if there are any. 
 328   wxTextCtrl
* EditLabel(long item
, wxClassInfo
* textControlClass 
= CLASSINFO(wxTextCtrl
)); 
 330   // End label editing, optionally cancelling the edit 
 331   bool EndEditLabel(bool cancel
); 
 333   // Ensures this item is visible 
 334   bool EnsureVisible(long item
) ; 
 336   // Find an item whose label matches this string, starting from the item after 'start' 
 337   // or the beginning if 'start' is -1. 
 338   long FindItem(long start
, const wxString
& str
, bool partial 
= FALSE
); 
 340   // Find an item whose data matches this data, starting from the item after 'start' 
 341   // or the beginning if 'start' is -1. 
 342   long FindItem(long start
, long data
); 
 344   // Find an item nearest this position in the specified direction, starting from 
 345   // the item after 'start' or the beginning if 'start' is -1. 
 346   long FindItem(long start
, const wxPoint
& pt
, int direction
); 
 348   // Determines which item (if any) is at the specified point, 
 349   // giving details in 'flags' (see wxLIST_HITTEST_... flags above) 
 350   long HitTest(const wxPoint
& point
, int& flags
); 
 352   // Inserts an item, returning the index of the new item if successful, 
 354   // TOD: Should also have some further convenience functions 
 355   // which don't require setting a wxListItem object 
 356   long InsertItem(wxListItem
& info
); 
 358   // Insert a string item 
 359   long InsertItem(long index
, const wxString
& label
); 
 361   // Insert an image item 
 362   long InsertItem(long index
, int imageIndex
); 
 364   // Insert an image/string item 
 365   long InsertItem(long index
, const wxString
& label
, int imageIndex
); 
 367   // For list view mode (only), inserts a column. 
 368   long InsertColumn(long col
, wxListItem
& info
); 
 370   long InsertColumn(long col
, const wxString
& heading
, int format 
= wxLIST_FORMAT_LEFT
, 
 373   // Scrolls the list control. If in icon, small icon or report view mode, 
 374   // x specifies the number of pixels to scroll. If in list view mode, x 
 375   // specifies the number of columns to scroll. 
 376   // If in icon, small icon or list view mode, y specifies the number of pixels 
 377   // to scroll. If in report view mode, y specifies the number of lines to scroll. 
 378   bool ScrollList(int dx
, int dy
); 
 382   // fn is a function which takes 3 long arguments: item1, item2, data. 
 383   // item1 is the long data associated with a first item (NOT the index). 
 384   // item2 is the long data associated with a second item (NOT the index). 
 385   // data is the same value as passed to SortItems. 
 386   // The return value is a negative number if the first item should precede the second 
 387   // item, a positive number of the second item should precede the first, 
 388   // or zero if the two items are equivalent. 
 390   // data is arbitrary data to be passed to the sort function. 
 391   bool SortItems(wxListCtrlCompare fn
, long data
); 
 393 /* Why should we need this function? Leave for now. 
 394  * We might need it because item data may have changed, 
 395  * but the display needs refreshing (in string callback mode) 
 396   // Updates an item. If the list control has the wxLI_AUTO_ARRANGE style, 
 397   // the items will be rearranged. 
 398   bool Update(long item); 
 401   void Command(wxCommandEvent
& event
) { ProcessCommand(event
); }; 
 404   wxTextCtrl
*       m_textCtrl
;        // The control used for editing a label 
 405   wxImageList 
*     m_imageListNormal
; // The image list for normal icons 
 406   wxImageList 
*     m_imageListSmall
;  // The image list for small icons 
 407   wxImageList 
*     m_imageListState
;  // The image list state icons (not implemented yet) 
 409   long              m_baseStyle
;  // Basic Windows style flags, for recreation purposes 
 410   wxStringList      m_stringPool
; // Pool of 3 strings to satisfy Windows callback 
 412   int               m_colCount
;   // Windows doesn't have GetColumnCount so must 
 413                                   // keep track of inserted/deleted columns 
 417 class WXDLLEXPORT wxListEvent
: public wxCommandEvent
 
 419   DECLARE_DYNAMIC_CLASS(wxListEvent
) 
 422   wxListEvent(wxEventType commandType 
= wxEVT_NULL
, int id 
= 0); 
 434 typedef void (wxEvtHandler::*wxListEventFunction
)(wxListEvent
&); 
 436 #define EVT_LIST_BEGIN_DRAG(id, fn) { wxEVT_COMMAND_LIST_BEGIN_DRAG, id, -1, (wxObjectEventFunction) (wxEventFunction) (wxListEventFunction) & fn, NULL }, 
 437 #define EVT_LIST_BEGIN_RDRAG(id, fn) { wxEVT_COMMAND_LIST_BEGIN_RDRAG, id, -1, (wxObjectEventFunction) (wxEventFunction) (wxListEventFunction) & fn, NULL }, 
 438 #define EVT_LIST_BEGIN_LABEL_EDIT(id, fn) { wxEVT_COMMAND_LIST_BEGIN_LABEL_EDIT, id, -1, (wxObjectEventFunction) (wxEventFunction) (wxListEventFunction) & fn, NULL }, 
 439 #define EVT_LIST_END_LABEL_EDIT(id, fn) { wxEVT_COMMAND_LIST_END_LABEL_EDIT, id, -1, (wxObjectEventFunction) (wxEventFunction) (wxListEventFunction) & fn, NULL }, 
 440 #define EVT_LIST_DELETE_ITEM(id, fn) { wxEVT_COMMAND_LIST_DELETE_ITEM, id, -1, (wxObjectEventFunction) (wxEventFunction) (wxListEventFunction) & fn, NULL }, 
 441 #define EVT_LIST_DELETE_ALL_ITEMS(id, fn) { wxEVT_COMMAND_LIST_DELETE_ALL_ITEMS, id, -1, (wxObjectEventFunction) (wxEventFunction) (wxListEventFunction) & fn, NULL }, 
 442 #define EVT_LIST_GET_INFO(id, fn) { wxEVT_COMMAND_LIST_GET_INFO, id, -1, (wxObjectEventFunction) (wxEventFunction) (wxListEventFunction) & fn, NULL }, 
 443 #define EVT_LIST_SET_INFO(id, fn) { wxEVT_COMMAND_LIST_SET_INFO, id, -1, (wxObjectEventFunction) (wxEventFunction) (wxListEventFunction) & fn, NULL }, 
 444 #define EVT_LIST_ITEM_SELECTED(id, fn) { wxEVT_COMMAND_LIST_ITEM_SELECTED, id, -1, (wxObjectEventFunction) (wxEventFunction) (wxListEventFunction) & fn, NULL }, 
 445 #define EVT_LIST_ITEM_DESELECTED(id, fn) { wxEVT_COMMAND_LIST_ITEM_DESELECTED, id, -1, (wxObjectEventFunction) (wxEventFunction) (wxListEventFunction) & fn, NULL }, 
 446 #define EVT_LIST_KEY_DOWN(id, fn) { wxEVT_COMMAND_LIST_KEY_DOWN, id, -1, (wxObjectEventFunction) (wxEventFunction) (wxListEventFunction) & fn, NULL }, 
 447 #define EVT_LIST_INSERT_ITEM(id, fn) { wxEVT_COMMAND_LIST_INSERT_ITEM, id, -1, (wxObjectEventFunction) (wxEventFunction) (wxListEventFunction) & fn, NULL }, 
 448 #define EVT_LIST_COL_CLICK(id, fn) { wxEVT_COMMAND_LIST_COL_CLICK, id, -1, (wxObjectEventFunction) (wxEventFunction) (wxListEventFunction) & fn, NULL },