#include "wx/control.h"
#include "wx/event.h"
+#include "wx/textctrl.h"
+
+#ifdef __GNUWIN32__
+# ifdef GetFirstChild
+# undef GetFirstChild
+# endif
+
+# ifdef GetNextSibling
+# undef GetNextSibling
+# endif
+#endif
// the type for "untyped" data
typedef long wxDataType;
// first item precedes the second, +1 if the second precedes the first or 0 if
// they're equivalent
class wxTreeItemData;
-typedef int (*wxTreeItemCmpFunc)(wxTreeItemData *item1, wxTreeItemData *item2);
// ----------------------------------------------------------------------------
// constants
wxTreeItemId(WXHTREEITEM itemId) { m_itemId = (long)itemId; }
operator WXHTREEITEM() const { return (WXHTREEITEM)m_itemId; }
- void operator =(WXHTREEITEM item) { m_itemId = (long) item; }
-
-// wxTreeItemId(long itemId) { m_itemId = itemId; }
+ void operator=(WXHTREEITEM item) { m_itemId = (long) item; }
protected:
long m_itemId;
// Because the objects of this class are deleted by the tree, they should
// always be allocated on the heap!
// ----------------------------------------------------------------------------
-class WXDLLEXPORT wxTreeItemData
+class WXDLLEXPORT wxTreeItemData : private wxTreeItemId
{
-friend class wxTreeCtrl;
public:
- // creation/destruction
- // --------------------
- // default ctor
- wxTreeItemData() { }
-
- // default copy ctor/assignment operator are ok
+ // default ctor/copy ctor/assignment operator are ok
- // dtor is virtual and all the items are deleted by the tree control
- // when it's deleted, so you normally don't have to care about freeing
- // memory allocated in your wxTreeItemData-derived class
+ // dtor is virtual and all the items are deleted by the tree control when
+ // it's deleted, so you normally don't have to care about freeing memory
+ // allocated in your wxTreeItemData-derived class
virtual ~wxTreeItemData() { }
- // accessor: get the item associated with us
- const wxTreeItemId& GetItemId() const { return m_itemId; }
-
-protected:
- wxTreeItemId m_itemId;
+ // accessors: set/get the item associated with this node
+ void SetId(const wxTreeItemId& id) { m_itemId = id; }
+#ifdef __WATCOMC__
+ const wxTreeItemId GetId() const { return m_itemId; }
+#else
+ const wxTreeItemId& GetId() const { return (wxTreeItemId&) m_itemId; }
+#endif
};
// ----------------------------------------------------------------------------
// associate some data with the item
void SetItemData(const wxTreeItemId& item, wxTreeItemData *data);
+ // force appearance of [+] button near the item. This is useful to
+ // allow the user to expand the items which don't have any children now
+ // - but instead add them only when needed, thus minimizing memory
+ // usage and loading time.
+ void SetItemHasChildren(const wxTreeItemId& item, bool has = TRUE);
+
+ // the item will be shown in bold
+ void SetItemBold(const wxTreeItemId& item, bool bold = TRUE);
+
// item status inquiries
// ---------------------
bool IsExpanded(const wxTreeItemId& item) const;
// is this item currently selected (the same as has focus)?
bool IsSelected(const wxTreeItemId& item) const;
+ // is item text in bold font?
+ bool IsBold(const wxTreeItemId& item) const;
+
+ // number of children
+ // ------------------
+
+ // if 'recursively' is FALSE, only immediate children count, otherwise
+ // the returned number is the number of all items in this branch
+ size_t GetChildrenCount(const wxTreeItemId& item, bool recursively = TRUE);
// navigation
// ----------
wxTreeItemId GetFirstChild(const wxTreeItemId& item, long& _cookie) const;
// get the next child
wxTreeItemId GetNextChild(const wxTreeItemId& item, long& _cookie) const;
+ // get the last child of this item - this method doesn't use cookies
+ wxTreeItemId GetLastChild(const wxTreeItemId& item) const;
// get the next sibling of this item
wxTreeItemId GetNextSibling(const wxTreeItemId& item) const;
// delete this item and associated data if any
void Delete(const wxTreeItemId& item);
+ // delete all children (but don't delete the item itself)
+ // NB: this won't send wxEVT_COMMAND_TREE_ITEM_DELETED events
+ void DeleteChildren(const wxTreeItemId& item);
// delete all items from the tree
+ // NB: this won't send wxEVT_COMMAND_TREE_ITEM_DELETED events
void DeleteAllItems();
// expand this item
// end editing and accept or discard the changes to item label
void EndEditLabel(const wxTreeItemId& item, bool discardChanges = FALSE);
- // sort the children of this item using the specified callback function
- // (it should return -1, 0 or +1 as usual), if it's not specified
- // alphabetical comparaison is performed.
+ // sorting
+ // this function is called to compare 2 items and should return -1, 0
+ // or +1 if the first item is less than, equal to or greater than the
+ // second one. The base class version performs alphabetic comparaison
+ // of item labels (GetText)
+ virtual int OnCompareItems(const wxTreeItemId& item1,
+ const wxTreeItemId& item2);
+ // sort the children of this item using OnCompareItems
//
- // NB: this function is not reentrant!
- void SortChildren(const wxTreeItemId& item,
- wxTreeItemCmpFunc *cmpFunction = NULL);
+ // NB: this function is not reentrant and not MT-safe (FIXME)!
+ void SortChildren(const wxTreeItemId& item);
// helpers
// -------
- // @@@ do we really need to expose these functions to the application?
-
- // get the bounding rectangle of the item (or of its label only)
- void GetBoundingRect(const wxTreeItemId& item,
- wxRectangle& rect,
- bool textOnly = FALSE) const;
-
// determine to which item (if any) belongs the given point (the
// coordinates specified are relative to the client area of tree ctrl)
// and fill the flags parameter with a bitmask of wxTREE_HITTEST_xxx
- // constants
+ // constants.
+ //
+ // The first function is more portable (because easier to implement
+ // on other platforms), but the second one returns some extra info.
+ wxTreeItemId HitTest(const wxPoint& point)
+ { int dummy; return HitTest(point, dummy); }
wxTreeItemId HitTest(const wxPoint& point, int& flags);
+ // get the bounding rectangle of the item (or of its label only)
+ bool GetBoundingRect(const wxTreeItemId& item,
+ wxRect& rect,
+ bool textOnly = FALSE) const;
+
// deprecated
// ----------
// implementation
// --------------
void Command(wxCommandEvent& event) { ProcessCommand(event); };
- bool MSWCommand(WXUINT param, WXWORD id);
- bool MSWNotify(WXWPARAM wParam, WXLPARAM lParam);
+ virtual bool MSWCommand(WXUINT param, WXWORD id);
+ virtual bool MSWNotify(WXWPARAM wParam, WXLPARAM lParam, WXLPARAM *result);
protected:
// SetImageList helper
// NB: note that not all accessors make sense for all events, see the event
// descriptions below
// ----------------------------------------------------------------------------
-class WXDLLEXPORT wxTreeEvent : public wxCommandEvent
+class WXDLLEXPORT wxTreeEvent : public wxNotifyEvent
{
friend wxTreeCtrl;
public:
// keyboard code (for wxEVT_COMMAND_TREE_KEY_DOWN only)
int GetCode() const { return m_code; }
- // set return code for wxEVT_COMMAND_TREE_ITEM_{EXPAND|COLLAPS}ING events
- // call this to forbid the change in item status
- void Veto() { m_code = TRUE; }
-
private:
// @@ we could save some space by using union here
int m_code;
// be deleted just after the return of this event handler (if any)
#define EVT_TREE_DELETE_ITEM(id, fn) { wxEVT_COMMAND_TREE_DELETE_ITEM, id, -1, (wxObjectEventFunction) (wxEventFunction) (wxTreeEventFunction) & fn, (wxObject *) NULL },
+// GetItem() returns the item that was activated (double click, enter, space)
+#define EVT_TREE_ITEM_ACTIVATED(id, fn) { wxEVT_COMMAND_TREE_ITEM_ACTIVATED, id, -1, (wxObjectEventFunction) (wxEventFunction) (wxTreeEventFunction) & fn, NULL },
+
#endif
// _WX_TREECTRL_H_