home *** CD-ROM | disk | FTP | other *** search
/ OS/2 Shareware BBS: 10 Tools / 10-Tools.zip / wxos2240.zip / wxWindows-2.4.0 / include / wx / treebase.h < prev    next >
C/C++ Source or Header  |  2002-09-05  |  17KB  |  346 lines

  1. /////////////////////////////////////////////////////////////////////////////
  2. // Name:        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,v 1.20 2002/09/05 19:50:40 JS Exp $
  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. #if defined(__GNUG__) && !defined(__APPLE__)
  16.     #pragma interface "treebase.h"
  17. #endif
  18.  
  19. // ----------------------------------------------------------------------------
  20. // headers
  21. // ----------------------------------------------------------------------------
  22.  
  23. #if wxUSE_TREECTRL
  24.  
  25. #include "wx/window.h"  // for wxClientData
  26. #include "wx/event.h"
  27.  
  28. // ----------------------------------------------------------------------------
  29. // wxTreeItemId identifies an element of the tree. In this implementation, it's
  30. // just a trivial wrapper around Win32 HTREEITEM or a pointer to some private
  31. // data structure in the generic version. It's opaque for the application and
  32. // the only method which can be used by user code is IsOk().
  33. // ----------------------------------------------------------------------------
  34.  
  35. // Using this typedef removes an ambiguity when calling Remove()
  36. typedef unsigned long wxTreeItemIdValue;
  37.  
  38. class WXDLLEXPORT wxTreeItemId
  39. {
  40. public:
  41.     // ctors
  42.         // 0 is invalid value for HTREEITEM
  43.     wxTreeItemId() { m_pItem = 0; }
  44.  
  45.         // this one is used in the generic version
  46.     wxTreeItemId(void *pItem) { m_pItem = (long) pItem; }
  47.  
  48.         // and this one under MSW
  49.     wxTreeItemId(long lItem) { m_pItem = lItem; }
  50.  
  51.         // default copy ctor/assignment operator are ok for us
  52.  
  53.     // accessors
  54.         // is this a valid tree item?
  55.     bool IsOk() const { return m_pItem != 0; }
  56.  
  57.     // deprecated: only for compatibility
  58.     operator wxTreeItemIdValue() const { return m_pItem; }
  59.  
  60.     wxTreeItemIdValue m_pItem;
  61. };
  62.  
  63. // ----------------------------------------------------------------------------
  64. // wxTreeItemData is some (arbitrary) user class associated with some item. The
  65. // main advantage of having this class (compared to old untyped interface) is
  66. // that wxTreeItemData's are destroyed automatically by the tree and, as this
  67. // class has virtual dtor, it means that the memory will be automatically
  68. // freed. OTOH, we don't just use wxObject instead of wxTreeItemData because
  69. // the size of this class is critical: in any real application, each tree leaf
  70. // will have wxTreeItemData associated with it and number of leaves may be
  71. // quite big.
  72. //
  73. // Because the objects of this class are deleted by the tree, they should
  74. // always be allocated on the heap!
  75. // ----------------------------------------------------------------------------
  76.  
  77. class WXDLLEXPORT wxTreeItemData: public wxClientData
  78. {
  79. friend class WXDLLEXPORT wxTreeCtrl;
  80. friend class WXDLLEXPORT wxGenericTreeCtrl;
  81. public:
  82.     // creation/destruction
  83.     // --------------------
  84.         // default ctor
  85.     wxTreeItemData() { }
  86.  
  87.         // default copy ctor/assignment operator are ok
  88.  
  89.     // accessor: get the item associated with us
  90.     const wxTreeItemId& GetId() const { return m_pItem; }
  91.     void SetId(const wxTreeItemId& id) { m_pItem = id; }
  92.  
  93. protected:
  94.     wxTreeItemId m_pItem;
  95. };
  96.  
  97. WX_DEFINE_EXPORTED_ARRAY_LONG(wxTreeItemId, wxArrayTreeItemIds);
  98.  
  99. // ----------------------------------------------------------------------------
  100. // constants
  101. // ----------------------------------------------------------------------------
  102.  
  103. // enum for different images associated with a treectrl item
  104. enum wxTreeItemIcon
  105. {
  106.     wxTreeItemIcon_Normal,              // not selected, not expanded
  107.     wxTreeItemIcon_Selected,            //     selected, not expanded
  108.     wxTreeItemIcon_Expanded,            // not selected,     expanded
  109.     wxTreeItemIcon_SelectedExpanded,    //     selected,     expanded
  110.     wxTreeItemIcon_Max
  111. };
  112.  
  113. /*
  114.  * wxTreeCtrl flags
  115.  */
  116. // TODO: maybe renumber these?
  117. #define wxTR_NO_BUTTONS              0x0000     // for convenience
  118. #define wxTR_HAS_BUTTONS             0x0001     // generates a +/- button
  119. #define wxTR_TWIST_BUTTONS           0x0002     // generates a twister button
  120. #define wxTR_NO_LINES                0x0004     // don't generate level connectors
  121. #define wxTR_LINES_AT_ROOT           0x0008     // connect top-level nodes
  122. #define wxTR_MAC_BUTTONS             wxTR_TWIST_BUTTONS // backward compatibility
  123. #define wxTR_AQUA_BUTTONS            0x0010     // used internally
  124.  
  125. #define wxTR_SINGLE                  0x0000     // for convenience
  126. #define wxTR_MULTIPLE                0x0020     // can select multiple items
  127. #define wxTR_EXTENDED                0x0040     // TODO: allow extended selection
  128. #define wxTR_FULL_ROW_HIGHLIGHT      0x2000     // highlight full horizontal space
  129.  
  130. #define wxTR_EDIT_LABELS             0x0200     // can edit item labels
  131. #define wxTR_ROW_LINES               0x0400     // put border around items
  132. #define wxTR_HIDE_ROOT               0x0800     // don't display root node
  133. #define wxTR_HAS_VARIABLE_ROW_HEIGHT 0x0080     // what it says
  134.  
  135. // TODO: different default styles for wxGTK, wxMotif, whatever?
  136. #ifdef __WXMAC__
  137.     #define wxTR_DEFAULT_STYLE (wxTR_TWIST_BUTTONS|wxTR_NO_LINES|wxTR_ROW_LINES)
  138. #else
  139.     #define wxTR_DEFAULT_STYLE (wxTR_HAS_BUTTONS|wxTR_LINES_AT_ROOT)
  140. #endif
  141.  
  142. // values for the `flags' parameter of wxTreeCtrl::HitTest() which determine
  143. // where exactly the specified point is situated:
  144.  
  145. static const int wxTREE_HITTEST_ABOVE            = 0x0001;
  146. static const int wxTREE_HITTEST_BELOW            = 0x0002;
  147. static const int wxTREE_HITTEST_NOWHERE          = 0x0004;
  148.     // on the button associated with an item.
  149. static const int wxTREE_HITTEST_ONITEMBUTTON     = 0x0008;
  150.     // on the bitmap associated with an item.
  151. static const int wxTREE_HITTEST_ONITEMICON       = 0x0010;
  152.     // on the indent associated with an item.
  153. static const int wxTREE_HITTEST_ONITEMINDENT     = 0x0020;
  154.     // on the label (string) associated with an item.
  155. static const int wxTREE_HITTEST_ONITEMLABEL      = 0x0040;
  156.     // on the right of the label associated with an item.
  157. static const int wxTREE_HITTEST_ONITEMRIGHT      = 0x0080;
  158.     // on the label (string) associated with an item.
  159. static const int wxTREE_HITTEST_ONITEMSTATEICON  = 0x0100;
  160.     // on the left of the wxTreeCtrl.
  161. static const int wxTREE_HITTEST_TOLEFT           = 0x0200;
  162.     // on the right of the wxTreeCtrl.
  163. static const int wxTREE_HITTEST_TORIGHT          = 0x0400;
  164.     // on the upper part (first half) of the item.
  165. static const int wxTREE_HITTEST_ONITEMUPPERPART  = 0x0800;
  166.     // on the lower part (second half) of the item.
  167. static const int wxTREE_HITTEST_ONITEMLOWERPART  = 0x1000;
  168.  
  169.     // anywhere on the item
  170. static const int wxTREE_HITTEST_ONITEM  = wxTREE_HITTEST_ONITEMICON |
  171.                                           wxTREE_HITTEST_ONITEMLABEL;
  172.  
  173. // tree ctrl default name
  174. WXDLLEXPORT_DATA(extern const wxChar*) wxTreeCtrlNameStr;
  175.  
  176. // ----------------------------------------------------------------------------
  177. // wxTreeItemAttr: a structure containing the visual attributes of an item
  178. // ----------------------------------------------------------------------------
  179.  
  180. class WXDLLEXPORT wxTreeItemAttr
  181. {
  182. public:
  183.     // ctors
  184.     wxTreeItemAttr() { }
  185.     wxTreeItemAttr(const wxColour& colText,
  186.                    const wxColour& colBack,
  187.                    const wxFont& font)
  188.         : m_colText(colText), m_colBack(colBack), m_font(font) { }
  189.  
  190.     // setters
  191.     void SetTextColour(const wxColour& colText) { m_colText = colText; }
  192.     void SetBackgroundColour(const wxColour& colBack) { m_colBack = colBack; }
  193.     void SetFont(const wxFont& font) { m_font = font; }
  194.  
  195.     // accessors
  196.     bool HasTextColour() const { return m_colText.Ok(); }
  197.     bool HasBackgroundColour() const { return m_colBack.Ok(); }
  198.     bool HasFont() const { return m_font.Ok(); }
  199.  
  200.     const wxColour& GetTextColour() const { return m_colText; }
  201.     const wxColour& GetBackgroundColour() const { return m_colBack; }
  202.     const wxFont& GetFont() const { return m_font; }
  203.  
  204. private:
  205.     wxColour m_colText,
  206.              m_colBack;
  207.     wxFont   m_font;
  208. };
  209.  
  210. // ----------------------------------------------------------------------------
  211. // wxTreeEvent is a special class for all events associated with tree controls
  212. //
  213. // NB: note that not all accessors make sense for all events, see the event
  214. //     descriptions below
  215. // ----------------------------------------------------------------------------
  216.  
  217. class WXDLLEXPORT wxTreeEvent : public wxNotifyEvent
  218. {
  219. public:
  220.     wxTreeEvent(wxEventType commandType = wxEVT_NULL, int id = 0);
  221.  
  222.     // accessors
  223.         // get the item on which the operation was performed or the newly
  224.         // selected item for wxEVT_COMMAND_TREE_SEL_CHANGED/ING events
  225.     wxTreeItemId GetItem() const { return m_item; }
  226.  
  227.         // for wxEVT_COMMAND_TREE_SEL_CHANGED/ING events, get the previously
  228.         // selected item
  229.     wxTreeItemId GetOldItem() const { return m_itemOld; }
  230.  
  231.         // the point where the mouse was when the drag operation started (for
  232.         // wxEVT_COMMAND_TREE_BEGIN_(R)DRAG events only) or click position
  233.     wxPoint GetPoint() const { return m_pointDrag; }
  234.  
  235.         // keyboard data (for wxEVT_COMMAND_TREE_KEY_DOWN only)
  236.     const wxKeyEvent& GetKeyEvent() const { return m_evtKey; }
  237.     int GetKeyCode() const { return m_evtKey.GetKeyCode(); }
  238.  
  239.         // label (for EVT_TREE_{BEGIN|END}_LABEL_EDIT only)
  240.     const wxString& GetLabel() const { return m_label; }
  241.  
  242.         // edit cancel flag (for EVT_TREE_{BEGIN|END}_LABEL_EDIT only)
  243.     bool IsEditCancelled() const { return m_editCancelled; }
  244.  
  245. #if WXWIN_COMPATIBILITY_2_2
  246.     // for compatibility only, don't use
  247.     int GetCode() const { return m_evtKey.GetKeyCode(); }
  248. #endif // WXWIN_COMPATIBILITY_2_2
  249.  
  250. private:
  251.     // not all of the members are used (or initialized) for all events
  252.     wxKeyEvent    m_evtKey;
  253.     wxTreeItemId  m_item,
  254.                   m_itemOld;
  255.     wxPoint       m_pointDrag;
  256.     wxString      m_label;
  257.     bool          m_editCancelled;
  258.  
  259.     friend class WXDLLEXPORT wxTreeCtrl;
  260.     friend class WXDLLEXPORT wxGenericTreeCtrl;
  261.  
  262.     DECLARE_DYNAMIC_CLASS(wxTreeEvent);
  263. };
  264.  
  265. typedef void (wxEvtHandler::*wxTreeEventFunction)(wxTreeEvent&);
  266.  
  267. // ----------------------------------------------------------------------------
  268. // tree control events and macros for handling them
  269. // ----------------------------------------------------------------------------
  270.  
  271. BEGIN_DECLARE_EVENT_TYPES()
  272.     DECLARE_EVENT_TYPE(wxEVT_COMMAND_TREE_BEGIN_DRAG, 600)
  273.     DECLARE_EVENT_TYPE(wxEVT_COMMAND_TREE_BEGIN_RDRAG, 601)
  274.     DECLARE_EVENT_TYPE(wxEVT_COMMAND_TREE_BEGIN_LABEL_EDIT, 602)
  275.     DECLARE_EVENT_TYPE(wxEVT_COMMAND_TREE_END_LABEL_EDIT, 603)
  276.     DECLARE_EVENT_TYPE(wxEVT_COMMAND_TREE_DELETE_ITEM, 604)
  277.     DECLARE_EVENT_TYPE(wxEVT_COMMAND_TREE_GET_INFO, 605)
  278.     DECLARE_EVENT_TYPE(wxEVT_COMMAND_TREE_SET_INFO, 606)
  279.     DECLARE_EVENT_TYPE(wxEVT_COMMAND_TREE_ITEM_EXPANDED, 607)
  280.     DECLARE_EVENT_TYPE(wxEVT_COMMAND_TREE_ITEM_EXPANDING, 608)
  281.     DECLARE_EVENT_TYPE(wxEVT_COMMAND_TREE_ITEM_COLLAPSED, 609)
  282.     DECLARE_EVENT_TYPE(wxEVT_COMMAND_TREE_ITEM_COLLAPSING, 610)
  283.     DECLARE_EVENT_TYPE(wxEVT_COMMAND_TREE_SEL_CHANGED, 611)
  284.     DECLARE_EVENT_TYPE(wxEVT_COMMAND_TREE_SEL_CHANGING, 612)
  285.     DECLARE_EVENT_TYPE(wxEVT_COMMAND_TREE_KEY_DOWN, 613)
  286.     DECLARE_EVENT_TYPE(wxEVT_COMMAND_TREE_ITEM_ACTIVATED, 614)
  287.     DECLARE_EVENT_TYPE(wxEVT_COMMAND_TREE_ITEM_RIGHT_CLICK, 615)
  288.     DECLARE_EVENT_TYPE(wxEVT_COMMAND_TREE_ITEM_MIDDLE_CLICK, 616)
  289.     DECLARE_EVENT_TYPE(wxEVT_COMMAND_TREE_END_DRAG, 617)
  290. END_DECLARE_EVENT_TYPES()
  291.  
  292. // GetItem() returns the item being dragged, GetPoint() the mouse coords
  293. //
  294. // if you call event.Allow(), the drag operation will start and a
  295. // EVT_TREE_END_DRAG event will be sent when the drag is over.
  296. #define EVT_TREE_BEGIN_DRAG(id, fn) DECLARE_EVENT_TABLE_ENTRY( wxEVT_COMMAND_TREE_BEGIN_DRAG, id, -1, (wxObjectEventFunction) (wxEventFunction) (wxTreeEventFunction) & fn, (wxObject *) NULL ),
  297. #define EVT_TREE_BEGIN_RDRAG(id, fn) DECLARE_EVENT_TABLE_ENTRY( wxEVT_COMMAND_TREE_BEGIN_RDRAG, id, -1, (wxObjectEventFunction) (wxEventFunction) (wxTreeEventFunction) & fn, (wxObject *) NULL ),
  298.  
  299. // GetItem() is the item on which the drop occured (if any) and GetPoint() the
  300. // current mouse coords
  301. #define EVT_TREE_END_DRAG(id, fn) DECLARE_EVENT_TABLE_ENTRY( wxEVT_COMMAND_TREE_END_DRAG, id, -1, (wxObjectEventFunction) (wxEventFunction) (wxTreeEventFunction) & fn, (wxObject *) NULL ),
  302.  
  303. // GetItem() returns the itme whose label is being edited, GetLabel() returns
  304. // the current item label for BEGIN and the would be new one for END.
  305. //
  306. // Vetoing BEGIN event means that label editing won't happen at all,
  307. // vetoing END means that the new value is discarded and the old one kept
  308. #define EVT_TREE_BEGIN_LABEL_EDIT(id, fn) DECLARE_EVENT_TABLE_ENTRY( wxEVT_COMMAND_TREE_BEGIN_LABEL_EDIT, id, -1, (wxObjectEventFunction) (wxEventFunction) (wxTreeEventFunction) & fn, (wxObject *) NULL ),
  309. #define EVT_TREE_END_LABEL_EDIT(id, fn) DECLARE_EVENT_TABLE_ENTRY( wxEVT_COMMAND_TREE_END_LABEL_EDIT, id, -1, (wxObjectEventFunction) (wxEventFunction) (wxTreeEventFunction) & fn, (wxObject *) NULL ),
  310.  
  311. // provide/update information about GetItem() item
  312. #define EVT_TREE_GET_INFO(id, fn) DECLARE_EVENT_TABLE_ENTRY( wxEVT_COMMAND_TREE_GET_INFO, id, -1, (wxObjectEventFunction) (wxEventFunction) (wxTreeEventFunction) & fn, (wxObject *) NULL ),
  313. #define EVT_TREE_SET_INFO(id, fn) DECLARE_EVENT_TABLE_ENTRY( wxEVT_COMMAND_TREE_SET_INFO, id, -1, (wxObjectEventFunction) (wxEventFunction) (wxTreeEventFunction) & fn, (wxObject *) NULL ),
  314.  
  315. // GetItem() is the item being expanded/collapsed, the "ING" versions can use
  316. #define EVT_TREE_ITEM_EXPANDED(id, fn) DECLARE_EVENT_TABLE_ENTRY( wxEVT_COMMAND_TREE_ITEM_EXPANDED, id, -1, (wxObjectEventFunction) (wxEventFunction) (wxTreeEventFunction) & fn, (wxObject *) NULL ),
  317. #define EVT_TREE_ITEM_EXPANDING(id, fn) DECLARE_EVENT_TABLE_ENTRY( wxEVT_COMMAND_TREE_ITEM_EXPANDING, id, -1, (wxObjectEventFunction) (wxEventFunction) (wxTreeEventFunction) & fn, (wxObject *) NULL ),
  318. #define EVT_TREE_ITEM_COLLAPSED(id, fn) DECLARE_EVENT_TABLE_ENTRY( wxEVT_COMMAND_TREE_ITEM_COLLAPSED, id, -1, (wxObjectEventFunction) (wxEventFunction) (wxTreeEventFunction) & fn, (wxObject *) NULL ),
  319. #define EVT_TREE_ITEM_COLLAPSING(id, fn) DECLARE_EVENT_TABLE_ENTRY( wxEVT_COMMAND_TREE_ITEM_COLLAPSING, id, -1, (wxObjectEventFunction) (wxEventFunction) (wxTreeEventFunction) & fn, NULL ),
  320.  
  321. // GetOldItem() is the item which had the selection previously, GetItem() is
  322. // the item which acquires selection
  323. #define EVT_TREE_SEL_CHANGED(id, fn) DECLARE_EVENT_TABLE_ENTRY( wxEVT_COMMAND_TREE_SEL_CHANGED, id, -1, (wxObjectEventFunction) (wxEventFunction) (wxTreeEventFunction) & fn, NULL ),
  324. #define EVT_TREE_SEL_CHANGING(id, fn) DECLARE_EVENT_TABLE_ENTRY( wxEVT_COMMAND_TREE_SEL_CHANGING, id, -1, (wxObjectEventFunction) (wxEventFunction) (wxTreeEventFunction) & fn, NULL ),
  325.  
  326. // GetKeyCode() returns the key code
  327. // NB: this is the only message for which GetItem() is invalid (you may get the
  328. //     item from GetSelection())
  329. #define EVT_TREE_KEY_DOWN(id, fn) DECLARE_EVENT_TABLE_ENTRY( wxEVT_COMMAND_TREE_KEY_DOWN, id, -1, (wxObjectEventFunction) (wxEventFunction) (wxTreeEventFunction) & fn, NULL ),
  330.  
  331. // GetItem() returns the item being deleted, the associated data (if any) will
  332. // be deleted just after the return of this event handler (if any)
  333. #define EVT_TREE_DELETE_ITEM(id, fn) DECLARE_EVENT_TABLE_ENTRY( wxEVT_COMMAND_TREE_DELETE_ITEM, id, -1, (wxObjectEventFunction) (wxEventFunction) (wxTreeEventFunction) & fn, (wxObject *) NULL ),
  334.  
  335. // GetItem() returns the item that was activated (double click, enter, space)
  336. #define EVT_TREE_ITEM_ACTIVATED(id, fn) DECLARE_EVENT_TABLE_ENTRY( wxEVT_COMMAND_TREE_ITEM_ACTIVATED, id, -1, (wxObjectEventFunction) (wxEventFunction) (wxTreeEventFunction) & fn, NULL ),
  337.  
  338. // GetItem() returns the item that was clicked on
  339. #define EVT_TREE_ITEM_RIGHT_CLICK(id, fn) DECLARE_EVENT_TABLE_ENTRY( wxEVT_COMMAND_TREE_ITEM_RIGHT_CLICK, id, -1, (wxObjectEventFunction) (wxEventFunction) (wxTreeEventFunction) & fn, NULL ),
  340. #define EVT_TREE_ITEM_MIDDLE_CLICK(id, fn) DECLARE_EVENT_TABLE_ENTRY( wxEVT_COMMAND_TREE_ITEM_MIDDLE_CLICK, id, -1, (wxObjectEventFunction) (wxEventFunction) (wxTreeEventFunction) & fn, NULL ),
  341.  
  342. #endif // wxUSE_TREECTRL
  343.  
  344. #endif // _WX_TREEBASE_H_
  345.  
  346.