1 ///////////////////////////////////////////////////////////////////////////// 2 // Name: wx/treebase.h 3 // Purpose: wxTreeCtrl base classes and types 4 // Author: Julian Smart et al 5 // Modified by: 6 // Created: 01/02/97 7 // RCS-ID: $Id: treebase.h 53135 2008-04-12 02:31:04Z VZ $ 8 // Copyright: (c) 1997,1998 Robert Roebling 9 // Licence: wxWindows licence 10 ///////////////////////////////////////////////////////////////////////////// 11 12 #ifndef _WX_TREEBASE_H_ 13 #define _WX_TREEBASE_H_ 14 15 // ---------------------------------------------------------------------------- 16 // headers 17 // ---------------------------------------------------------------------------- 18 19 #include "wx/defs.h" 20 21 #if wxUSE_TREECTRL 22 23 #include "wx/window.h" // for wxClientData 24 #include "wx/event.h" 25 #include "wx/dynarray.h" 26 27 #if WXWIN_COMPATIBILITY_2_6 28 29 // flags for deprecated `Expand(int action)', will be removed in next versions 30 enum 31 { 32 wxTREE_EXPAND_EXPAND, 33 wxTREE_EXPAND_COLLAPSE, 34 wxTREE_EXPAND_COLLAPSE_RESET, 35 wxTREE_EXPAND_TOGGLE 36 }; 37 38 #endif // WXWIN_COMPATIBILITY_2_6 39 40 // ---------------------------------------------------------------------------- 41 // wxTreeItemId identifies an element of the tree. In this implementation, it's 42 // just a trivial wrapper around Win32 HTREEITEM or a pointer to some private 43 // data structure in the generic version. It's opaque for the application and 44 // the only method which can be used by user code is IsOk(). 45 // ---------------------------------------------------------------------------- 46 47 // Using this typedef removes an ambiguity when calling Remove() 48 typedef void *wxTreeItemIdValue; 49 50 class WXDLLEXPORT wxTreeItemId 51 { 52 friend bool operator==(const wxTreeItemId&, const wxTreeItemId&); 53 public: 54 // ctors 55 // 0 is invalid value for HTREEITEM wxTreeItemId()56 wxTreeItemId() { m_pItem = 0; } 57 58 // construct wxTreeItemId from the native item id wxTreeItemId(void * pItem)59 wxTreeItemId(void *pItem) { m_pItem = pItem; } 60 61 // default copy ctor/assignment operator are ok for us 62 63 // accessors 64 // is this a valid tree item? IsOk()65 bool IsOk() const { return m_pItem != 0; } 66 // return true if this item is not valid 67 bool operator!() const { return !IsOk(); } 68 69 // operations 70 // invalidate the item Unset()71 void Unset() { m_pItem = 0; } 72 73 #if WXWIN_COMPATIBILITY_2_4 74 // deprecated: only for compatibility, don't work on 64 bit archs wxTreeItemId(long item)75 wxTreeItemId(long item) { m_pItem = wxUIntToPtr(item); } 76 operator long() const { return (long)wxPtrToUInt(m_pItem); } 77 #else // !WXWIN_COMPATIBILITY_2_4 78 operator bool() const { return IsOk(); } 79 #endif // WXWIN_COMPATIBILITY_2_4/!WXWIN_COMPATIBILITY_2_4 80 81 wxTreeItemIdValue m_pItem; 82 }; 83 84 inline bool operator==(const wxTreeItemId& i1, const wxTreeItemId& i2) 85 { 86 return i1.m_pItem == i2.m_pItem; 87 } 88 89 inline bool operator!=(const wxTreeItemId& i1, const wxTreeItemId& i2) 90 { 91 return i1.m_pItem != i2.m_pItem; 92 } 93 94 // ---------------------------------------------------------------------------- 95 // wxTreeItemData is some (arbitrary) user class associated with some item. The 96 // main advantage of having this class (compared to old untyped interface) is 97 // that wxTreeItemData's are destroyed automatically by the tree and, as this 98 // class has virtual dtor, it means that the memory will be automatically 99 // freed. OTOH, we don't just use wxObject instead of wxTreeItemData because 100 // the size of this class is critical: in any real application, each tree leaf 101 // will have wxTreeItemData associated with it and number of leaves may be 102 // quite big. 103 // 104 // Because the objects of this class are deleted by the tree, they should 105 // always be allocated on the heap! 106 // ---------------------------------------------------------------------------- 107 108 class WXDLLEXPORT wxTreeItemData: public wxClientData 109 { 110 friend class WXDLLIMPEXP_FWD_CORE wxTreeCtrl; 111 friend class WXDLLIMPEXP_FWD_CORE wxGenericTreeCtrl; 112 public: 113 // creation/destruction 114 // -------------------- 115 // default ctor wxTreeItemData()116 wxTreeItemData() { } 117 118 // default copy ctor/assignment operator are ok 119 120 // accessor: get the item associated with us GetId()121 const wxTreeItemId& GetId() const { return m_pItem; } SetId(const wxTreeItemId & id)122 void SetId(const wxTreeItemId& id) { m_pItem = id; } 123 124 protected: 125 wxTreeItemId m_pItem; 126 }; 127 128 WX_DEFINE_EXPORTED_ARRAY_PTR(wxTreeItemIdValue, wxArrayTreeItemIdsBase); 129 130 // this is a wrapper around the array class defined above which allow to wok 131 // with vaue of natural wxTreeItemId type instead of using wxTreeItemIdValue 132 // and does it without any loss of efficiency 133 class WXDLLEXPORT wxArrayTreeItemIds : public wxArrayTreeItemIdsBase 134 { 135 public: Add(const wxTreeItemId & id)136 void Add(const wxTreeItemId& id) 137 { wxArrayTreeItemIdsBase::Add(id.m_pItem); } Insert(const wxTreeItemId & id,size_t pos)138 void Insert(const wxTreeItemId& id, size_t pos) 139 { wxArrayTreeItemIdsBase::Insert(id.m_pItem, pos); } Item(size_t i)140 wxTreeItemId Item(size_t i) const 141 { return wxTreeItemId(wxArrayTreeItemIdsBase::Item(i)); } 142 wxTreeItemId operator[](size_t i) const { return Item(i); } 143 }; 144 145 // ---------------------------------------------------------------------------- 146 // constants 147 // ---------------------------------------------------------------------------- 148 149 // enum for different images associated with a treectrl item 150 enum wxTreeItemIcon 151 { 152 wxTreeItemIcon_Normal, // not selected, not expanded 153 wxTreeItemIcon_Selected, // selected, not expanded 154 wxTreeItemIcon_Expanded, // not selected, expanded 155 wxTreeItemIcon_SelectedExpanded, // selected, expanded 156 wxTreeItemIcon_Max 157 }; 158 159 // ---------------------------------------------------------------------------- 160 // wxTreeCtrl flags 161 // ---------------------------------------------------------------------------- 162 163 #define wxTR_NO_BUTTONS 0x0000 // for convenience 164 #define wxTR_HAS_BUTTONS 0x0001 // draw collapsed/expanded btns 165 #define wxTR_NO_LINES 0x0004 // don't draw lines at all 166 #define wxTR_LINES_AT_ROOT 0x0008 // connect top-level nodes 167 #define wxTR_TWIST_BUTTONS 0x0010 // still used by wxTreeListCtrl 168 169 #define wxTR_SINGLE 0x0000 // for convenience 170 #define wxTR_MULTIPLE 0x0020 // can select multiple items 171 #define wxTR_EXTENDED 0x0040 // TODO: allow extended selection 172 #define wxTR_HAS_VARIABLE_ROW_HEIGHT 0x0080 // what it says 173 174 #define wxTR_EDIT_LABELS 0x0200 // can edit item labels 175 #define wxTR_ROW_LINES 0x0400 // put border around items 176 #define wxTR_HIDE_ROOT 0x0800 // don't display root node 177 178 #define wxTR_FULL_ROW_HIGHLIGHT 0x2000 // highlight full horz space 179 180 #ifdef __WXGTK20__ 181 #define wxTR_DEFAULT_STYLE (wxTR_HAS_BUTTONS | wxTR_NO_LINES) 182 #else 183 #define wxTR_DEFAULT_STYLE (wxTR_HAS_BUTTONS | wxTR_LINES_AT_ROOT) 184 #endif 185 186 #if WXWIN_COMPATIBILITY_2_6 187 // deprecated, don't use 188 #define wxTR_MAC_BUTTONS 0 189 #define wxTR_AQUA_BUTTONS 0 190 #endif // WXWIN_COMPATIBILITY_2_6 191 192 193 // values for the `flags' parameter of wxTreeCtrl::HitTest() which determine 194 // where exactly the specified point is situated: 195 196 static const int wxTREE_HITTEST_ABOVE = 0x0001; 197 static const int wxTREE_HITTEST_BELOW = 0x0002; 198 static const int wxTREE_HITTEST_NOWHERE = 0x0004; 199 // on the button associated with an item. 200 static const int wxTREE_HITTEST_ONITEMBUTTON = 0x0008; 201 // on the bitmap associated with an item. 202 static const int wxTREE_HITTEST_ONITEMICON = 0x0010; 203 // on the indent associated with an item. 204 static const int wxTREE_HITTEST_ONITEMINDENT = 0x0020; 205 // on the label (string) associated with an item. 206 static const int wxTREE_HITTEST_ONITEMLABEL = 0x0040; 207 // on the right of the label associated with an item. 208 static const int wxTREE_HITTEST_ONITEMRIGHT = 0x0080; 209 // on the label (string) associated with an item. 210 static const int wxTREE_HITTEST_ONITEMSTATEICON = 0x0100; 211 // on the left of the wxTreeCtrl. 212 static const int wxTREE_HITTEST_TOLEFT = 0x0200; 213 // on the right of the wxTreeCtrl. 214 static const int wxTREE_HITTEST_TORIGHT = 0x0400; 215 // on the upper part (first half) of the item. 216 static const int wxTREE_HITTEST_ONITEMUPPERPART = 0x0800; 217 // on the lower part (second half) of the item. 218 static const int wxTREE_HITTEST_ONITEMLOWERPART = 0x1000; 219 220 // anywhere on the item 221 static const int wxTREE_HITTEST_ONITEM = wxTREE_HITTEST_ONITEMICON | 222 wxTREE_HITTEST_ONITEMLABEL; 223 224 // tree ctrl default name 225 extern WXDLLEXPORT_DATA(const wxChar) wxTreeCtrlNameStr[]; 226 227 // ---------------------------------------------------------------------------- 228 // wxTreeItemAttr: a structure containing the visual attributes of an item 229 // ---------------------------------------------------------------------------- 230 231 class WXDLLEXPORT wxTreeItemAttr 232 { 233 public: 234 // ctors wxTreeItemAttr()235 wxTreeItemAttr() { } wxTreeItemAttr(const wxColour & colText,const wxColour & colBack,const wxFont & font)236 wxTreeItemAttr(const wxColour& colText, 237 const wxColour& colBack, 238 const wxFont& font) 239 : m_colText(colText), m_colBack(colBack), m_font(font) { } 240 241 // setters SetTextColour(const wxColour & colText)242 void SetTextColour(const wxColour& colText) { m_colText = colText; } SetBackgroundColour(const wxColour & colBack)243 void SetBackgroundColour(const wxColour& colBack) { m_colBack = colBack; } SetFont(const wxFont & font)244 void SetFont(const wxFont& font) { m_font = font; } 245 246 // accessors HasTextColour()247 bool HasTextColour() const { return m_colText.Ok(); } HasBackgroundColour()248 bool HasBackgroundColour() const { return m_colBack.Ok(); } HasFont()249 bool HasFont() const { return m_font.Ok(); } 250 GetTextColour()251 const wxColour& GetTextColour() const { return m_colText; } GetBackgroundColour()252 const wxColour& GetBackgroundColour() const { return m_colBack; } GetFont()253 const wxFont& GetFont() const { return m_font; } 254 255 private: 256 wxColour m_colText, 257 m_colBack; 258 wxFont m_font; 259 }; 260 261 // ---------------------------------------------------------------------------- 262 // wxTreeEvent is a special class for all events associated with tree controls 263 // 264 // NB: note that not all accessors make sense for all events, see the event 265 // descriptions below 266 // ---------------------------------------------------------------------------- 267 268 class WXDLLIMPEXP_FWD_CORE wxTreeCtrlBase; 269 270 class WXDLLEXPORT wxTreeEvent : public wxNotifyEvent 271 { 272 public: 273 wxTreeEvent(wxEventType commandType, 274 wxTreeCtrlBase *tree, 275 const wxTreeItemId &item = wxTreeItemId()); 276 wxTreeEvent(wxEventType commandType = wxEVT_NULL, int id = 0); 277 wxTreeEvent(const wxTreeEvent& event); 278 Clone()279 virtual wxEvent *Clone() const { return new wxTreeEvent(*this); } 280 281 // accessors 282 // get the item on which the operation was performed or the newly 283 // selected item for wxEVT_COMMAND_TREE_SEL_CHANGED/ING events GetItem()284 wxTreeItemId GetItem() const { return m_item; } SetItem(const wxTreeItemId & item)285 void SetItem(const wxTreeItemId& item) { m_item = item; } 286 287 // for wxEVT_COMMAND_TREE_SEL_CHANGED/ING events, get the previously 288 // selected item GetOldItem()289 wxTreeItemId GetOldItem() const { return m_itemOld; } SetOldItem(const wxTreeItemId & item)290 void SetOldItem(const wxTreeItemId& item) { m_itemOld = item; } 291 292 // the point where the mouse was when the drag operation started (for 293 // wxEVT_COMMAND_TREE_BEGIN_(R)DRAG events only) or click position GetPoint()294 wxPoint GetPoint() const { return m_pointDrag; } SetPoint(const wxPoint & pt)295 void SetPoint(const wxPoint& pt) { m_pointDrag = pt; } 296 297 // keyboard data (for wxEVT_COMMAND_TREE_KEY_DOWN only) GetKeyEvent()298 const wxKeyEvent& GetKeyEvent() const { return m_evtKey; } GetKeyCode()299 int GetKeyCode() const { return m_evtKey.GetKeyCode(); } SetKeyEvent(const wxKeyEvent & evt)300 void SetKeyEvent(const wxKeyEvent& evt) { m_evtKey = evt; } 301 302 // label (for EVT_TREE_{BEGIN|END}_LABEL_EDIT only) GetLabel()303 const wxString& GetLabel() const { return m_label; } SetLabel(const wxString & label)304 void SetLabel(const wxString& label) { m_label = label; } 305 306 // edit cancel flag (for EVT_TREE_{BEGIN|END}_LABEL_EDIT only) IsEditCancelled()307 bool IsEditCancelled() const { return m_editCancelled; } SetEditCanceled(bool editCancelled)308 void SetEditCanceled(bool editCancelled) { m_editCancelled = editCancelled; } 309 310 // Set the tooltip for the item (for EVT\_TREE\_ITEM\_GETTOOLTIP events) SetToolTip(const wxString & toolTip)311 void SetToolTip(const wxString& toolTip) { m_label = toolTip; } GetToolTip()312 wxString GetToolTip() { return m_label; } 313 314 private: 315 // not all of the members are used (or initialized) for all events 316 wxKeyEvent m_evtKey; 317 wxTreeItemId m_item, 318 m_itemOld; 319 wxPoint m_pointDrag; 320 wxString m_label; 321 bool m_editCancelled; 322 323 friend class WXDLLIMPEXP_FWD_CORE wxTreeCtrl; 324 friend class WXDLLIMPEXP_FWD_CORE wxGenericTreeCtrl; 325 326 DECLARE_DYNAMIC_CLASS(wxTreeEvent) 327 }; 328 329 typedef void (wxEvtHandler::*wxTreeEventFunction)(wxTreeEvent&); 330 331 // ---------------------------------------------------------------------------- 332 // tree control events and macros for handling them 333 // ---------------------------------------------------------------------------- 334 335 BEGIN_DECLARE_EVENT_TYPES() 336 DECLARE_EVENT_TYPE(wxEVT_COMMAND_TREE_BEGIN_DRAG, 600) 337 DECLARE_EVENT_TYPE(wxEVT_COMMAND_TREE_BEGIN_RDRAG, 601) 338 DECLARE_EVENT_TYPE(wxEVT_COMMAND_TREE_BEGIN_LABEL_EDIT, 602) 339 DECLARE_EVENT_TYPE(wxEVT_COMMAND_TREE_END_LABEL_EDIT, 603) 340 DECLARE_EVENT_TYPE(wxEVT_COMMAND_TREE_DELETE_ITEM, 604) 341 DECLARE_EVENT_TYPE(wxEVT_COMMAND_TREE_GET_INFO, 605) 342 DECLARE_EVENT_TYPE(wxEVT_COMMAND_TREE_SET_INFO, 606) 343 DECLARE_EVENT_TYPE(wxEVT_COMMAND_TREE_ITEM_EXPANDED, 607) 344 DECLARE_EVENT_TYPE(wxEVT_COMMAND_TREE_ITEM_EXPANDING, 608) 345 DECLARE_EVENT_TYPE(wxEVT_COMMAND_TREE_ITEM_COLLAPSED, 609) 346 DECLARE_EVENT_TYPE(wxEVT_COMMAND_TREE_ITEM_COLLAPSING, 610) 347 DECLARE_EVENT_TYPE(wxEVT_COMMAND_TREE_SEL_CHANGED, 611) 348 DECLARE_EVENT_TYPE(wxEVT_COMMAND_TREE_SEL_CHANGING, 612) 349 DECLARE_EVENT_TYPE(wxEVT_COMMAND_TREE_KEY_DOWN, 613) 350 DECLARE_EVENT_TYPE(wxEVT_COMMAND_TREE_ITEM_ACTIVATED, 614) 351 DECLARE_EVENT_TYPE(wxEVT_COMMAND_TREE_ITEM_RIGHT_CLICK, 615) 352 DECLARE_EVENT_TYPE(wxEVT_COMMAND_TREE_ITEM_MIDDLE_CLICK, 616) 353 DECLARE_EVENT_TYPE(wxEVT_COMMAND_TREE_END_DRAG, 617) 354 DECLARE_EVENT_TYPE(wxEVT_COMMAND_TREE_STATE_IMAGE_CLICK, 618) 355 DECLARE_EVENT_TYPE(wxEVT_COMMAND_TREE_ITEM_GETTOOLTIP, 619) 356 DECLARE_EVENT_TYPE(wxEVT_COMMAND_TREE_ITEM_MENU, 620) 357 END_DECLARE_EVENT_TYPES() 358 359 #define wxTreeEventHandler(func) \ 360 (wxObjectEventFunction)(wxEventFunction)wxStaticCastEvent(wxTreeEventFunction, &func) 361 362 #define wx__DECLARE_TREEEVT(evt, id, fn) \ 363 wx__DECLARE_EVT1(wxEVT_COMMAND_TREE_ ## evt, id, wxTreeEventHandler(fn)) 364 365 // GetItem() returns the item being dragged, GetPoint() the mouse coords 366 // 367 // if you call event.Allow(), the drag operation will start and a 368 // EVT_TREE_END_DRAG event will be sent when the drag is over. 369 #define EVT_TREE_BEGIN_DRAG(id, fn) wx__DECLARE_TREEEVT(BEGIN_DRAG, id, fn) 370 #define EVT_TREE_BEGIN_RDRAG(id, fn) wx__DECLARE_TREEEVT(BEGIN_RDRAG, id, fn) 371 372 // GetItem() is the item on which the drop occurred (if any) and GetPoint() the 373 // current mouse coords 374 #define EVT_TREE_END_DRAG(id, fn) wx__DECLARE_TREEEVT(END_DRAG, id, fn) 375 376 // GetItem() returns the itme whose label is being edited, GetLabel() returns 377 // the current item label for BEGIN and the would be new one for END. 378 // 379 // Vetoing BEGIN event means that label editing won't happen at all, 380 // vetoing END means that the new value is discarded and the old one kept 381 #define EVT_TREE_BEGIN_LABEL_EDIT(id, fn) wx__DECLARE_TREEEVT(BEGIN_LABEL_EDIT, id, fn) 382 #define EVT_TREE_END_LABEL_EDIT(id, fn) wx__DECLARE_TREEEVT(END_LABEL_EDIT, id, fn) 383 384 // provide/update information about GetItem() item 385 #define EVT_TREE_GET_INFO(id, fn) wx__DECLARE_TREEEVT(GET_INFO, id, fn) 386 #define EVT_TREE_SET_INFO(id, fn) wx__DECLARE_TREEEVT(SET_INFO, id, fn) 387 388 // GetItem() is the item being expanded/collapsed, the "ING" versions can use 389 #define EVT_TREE_ITEM_EXPANDED(id, fn) wx__DECLARE_TREEEVT(ITEM_EXPANDED, id, fn) 390 #define EVT_TREE_ITEM_EXPANDING(id, fn) wx__DECLARE_TREEEVT(ITEM_EXPANDING, id, fn) 391 #define EVT_TREE_ITEM_COLLAPSED(id, fn) wx__DECLARE_TREEEVT(ITEM_COLLAPSED, id, fn) 392 #define EVT_TREE_ITEM_COLLAPSING(id, fn) wx__DECLARE_TREEEVT(ITEM_COLLAPSING, id, fn) 393 394 // GetOldItem() is the item which had the selection previously, GetItem() is 395 // the item which acquires selection 396 #define EVT_TREE_SEL_CHANGED(id, fn) wx__DECLARE_TREEEVT(SEL_CHANGED, id, fn) 397 #define EVT_TREE_SEL_CHANGING(id, fn) wx__DECLARE_TREEEVT(SEL_CHANGING, id, fn) 398 399 // GetKeyCode() returns the key code 400 // NB: this is the only message for which GetItem() is invalid (you may get the 401 // item from GetSelection()) 402 #define EVT_TREE_KEY_DOWN(id, fn) wx__DECLARE_TREEEVT(KEY_DOWN, id, fn) 403 404 // GetItem() returns the item being deleted, the associated data (if any) will 405 // be deleted just after the return of this event handler (if any) 406 #define EVT_TREE_DELETE_ITEM(id, fn) wx__DECLARE_TREEEVT(DELETE_ITEM, id, fn) 407 408 // GetItem() returns the item that was activated (double click, enter, space) 409 #define EVT_TREE_ITEM_ACTIVATED(id, fn) wx__DECLARE_TREEEVT(ITEM_ACTIVATED, id, fn) 410 411 // GetItem() returns the item for which the context menu shall be shown 412 #define EVT_TREE_ITEM_MENU(id, fn) wx__DECLARE_TREEEVT(ITEM_MENU, id, fn) 413 414 // GetItem() returns the item that was clicked on 415 #define EVT_TREE_ITEM_RIGHT_CLICK(id, fn) wx__DECLARE_TREEEVT(ITEM_RIGHT_CLICK, id, fn) 416 #define EVT_TREE_ITEM_MIDDLE_CLICK(id, fn) wx__DECLARE_TREEEVT(ITEM_MIDDLE_CLICK, id, fn) 417 418 // GetItem() returns the item whose state image was clicked on 419 #define EVT_TREE_STATE_IMAGE_CLICK(id, fn) wx__DECLARE_TREEEVT(STATE_IMAGE_CLICK, id, fn) 420 421 // GetItem() is the item for which the tooltip is being requested 422 #define EVT_TREE_ITEM_GETTOOLTIP(id, fn) wx__DECLARE_TREEEVT(ITEM_GETTOOLTIP, id, fn) 423 424 #endif // wxUSE_TREECTRL 425 426 #endif // _WX_TREEBASE_H_ 427