X-Git-Url: https://git.saurik.com/wxWidgets.git/blobdiff_plain/f135ff73b4b0b7c76a1fa3396f768c44f8dc204f..2d120f8391920145647ec10e84629bc21fa9f1bb:/include/wx/generic/treectrl.h diff --git a/include/wx/generic/treectrl.h b/include/wx/generic/treectrl.h index 31afdb3d16..cd3c90b8b6 100644 --- a/include/wx/generic/treectrl.h +++ b/include/wx/generic/treectrl.h @@ -16,12 +16,34 @@ #pragma interface "treectrl.h" #endif +#ifdef __WXMSW__ +WXDLLEXPORT_DATA(extern const char*) wxTreeCtrlNameStr; +#else +#define wxTreeCtrlNameStr "wxTreeCtrl" +#endif + #include "wx/defs.h" #include "wx/string.h" #include "wx/object.h" #include "wx/event.h" #include "wx/scrolwin.h" #include "wx/textctrl.h" +#include "wx/pen.h" + +// ----------------------------------------------------------------------------- +// constants +// ----------------------------------------------------------------------------- + +// values for the `flags' parameter of wxTreeCtrl::HitTest() which determine +// where exactly the specified point is situated: +static const int wxTREE_HITTEST_NOWHERE = 0x0004; + // on the bitmap associated with an item. +static const int wxTREE_HITTEST_ONITEMICON = 0x0020; + // on the label (string) associated with an item. +static const int wxTREE_HITTEST_ONITEMLABEL = 0x0080; + // anywhere on the item +static const int wxTREE_HITTEST_ONITEM = wxTREE_HITTEST_ONITEMICON | + wxTREE_HITTEST_ONITEMLABEL; // ----------------------------------------------------------------------------- // forward declaration @@ -31,7 +53,6 @@ class wxImageList; class wxGenericTreeItem; class wxTreeItemData; -typedef int (*wxTreeItemCmpFunc)(wxTreeItemData *item1, wxTreeItemData *item2); // ----------------------------------------------------------------------------- // wxTreeItemId - unique identifier of a tree element @@ -56,10 +77,10 @@ public: wxTreeItemId(long itemId) { m_pItem = (wxGenericTreeItem *)itemId; } operator long() const { return (long)m_pItem; } -protected: +//protected: // not for gcc // for wxTreeCtrl usage only wxTreeItemId(wxGenericTreeItem *pItem) { m_pItem = pItem; } - + wxGenericTreeItem *m_pItem; }; @@ -69,7 +90,7 @@ protected: // 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: public wxClientData { friend class wxTreeCtrl; public: @@ -80,11 +101,6 @@ public: // default 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 - virtual ~wxTreeItemData() { } - // accessor: get the item associated with us const wxTreeItemId& GetId() const { return m_pItem; } void SetId(const wxTreeItemId& id) { m_pItem = id; } @@ -96,7 +112,7 @@ protected: // ----------------------------------------------------------------------------- // wxTreeEvent - the event generated by the tree control // ----------------------------------------------------------------------------- -class WXDLLEXPORT wxTreeEvent : public wxCommandEvent +class WXDLLEXPORT wxTreeEvent : public wxNotifyEvent { friend class wxTreeCtrl; public: @@ -153,7 +169,7 @@ typedef void (wxEvtHandler::*wxTreeEventFunction)(wxTreeEvent&); #define EVT_TREE_GET_INFO(id, fn) { wxEVT_COMMAND_TREE_GET_INFO, id, -1, (wxObjectEventFunction) (wxEventFunction) (wxTreeEventFunction) & fn, (wxObject *) NULL }, #define EVT_TREE_SET_INFO(id, fn) { wxEVT_COMMAND_TREE_SET_INFO, id, -1, (wxObjectEventFunction) (wxEventFunction) (wxTreeEventFunction) & fn, (wxObject *) NULL }, -// GetItem() is the item being expanded/collapsed, the "ING" versions can use +// GetItem() is the item being expanded/collapsed, the "ING" versions can use #define EVT_TREE_ITEM_EXPANDED(id, fn) { wxEVT_COMMAND_TREE_ITEM_EXPANDED, id, -1, (wxObjectEventFunction) (wxEventFunction) (wxTreeEventFunction) & fn, (wxObject *) NULL }, #define EVT_TREE_ITEM_EXPANDING(id, fn) { wxEVT_COMMAND_TREE_ITEM_EXPANDING, id, -1, (wxObjectEventFunction) (wxEventFunction) (wxTreeEventFunction) & fn, (wxObject *) NULL }, #define EVT_TREE_ITEM_COLLAPSED(id, fn) { wxEVT_COMMAND_TREE_ITEM_COLLAPSED, id, -1, (wxObjectEventFunction) (wxEventFunction) (wxTreeEventFunction) & fn, (wxObject *) NULL }, @@ -173,6 +189,9 @@ typedef void (wxEvtHandler::*wxTreeEventFunction)(wxTreeEvent&); // 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 }, + // ----------------------------------------------------------------------------- // wxTreeCtrl - the tree control // ----------------------------------------------------------------------------- @@ -188,9 +207,10 @@ public: const wxPoint& pos = wxDefaultPosition, const wxSize& size = wxDefaultSize, long style = wxTR_HAS_BUTTONS | wxTR_LINES_AT_ROOT, - const wxString& name = "wxTreeCtrl") + const wxValidator &validator = wxDefaultValidator, + const wxString& name = wxTreeCtrlNameStr) { - Create(parent, id, pos, size, style, name); + Create(parent, id, pos, size, style, validator, name); } virtual ~wxTreeCtrl(); @@ -199,7 +219,8 @@ public: const wxPoint& pos = wxDefaultPosition, const wxSize& size = wxDefaultSize, long style = wxTR_HAS_BUTTONS | wxTR_LINES_AT_ROOT, - const wxString& name = "wxTreeCtrl"); + const wxValidator &validator = wxDefaultValidator, + const wxString& name = wxTreeCtrlNameStr); // accessors // --------- @@ -261,17 +282,31 @@ public: // 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 // --------------------- // is the item visible (it might be outside the view or not expanded)? bool IsVisible(const wxTreeItemId& item) const; // does the item has any children? + bool HasChildren(const wxTreeItemId& item) const + { return ItemHasChildren(item); } bool ItemHasChildren(const wxTreeItemId& item) const; // is the item expanded (only makes sense if HasChildren())? 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 // ---------- @@ -341,7 +376,11 @@ public: // 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 @@ -363,6 +402,12 @@ public: // scroll to this item (but don't expand its parent) void ScrollTo(const wxTreeItemId& item); + // 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); + // start editing the item label: this (temporarily) replaces the item // with a one line edit control. The item will be selected if it hadn't // been before. textCtrlClass parameter allows you to create an edit @@ -376,27 +421,34 @@ public: // 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); - // implementation - // -------------- - // wxWindows callbacks - void OnPaint( const wxPaintEvent &event ); - void OnSetFocus( const wxFocusEvent &event ); - void OnKillFocus( const wxFocusEvent &event ); + // callbacks + void OnPaint( wxPaintEvent &event ); + void OnSetFocus( wxFocusEvent &event ); + void OnKillFocus( wxFocusEvent &event ); void OnChar( wxKeyEvent &event ); - void OnMouse( const wxMouseEvent &event ); + void OnMouse( wxMouseEvent &event ); + void OnIdle( wxIdleEvent &event ); + + // implementation + void SendDeleteEvent(wxGenericTreeItem *itemBeingDeleted); protected: wxGenericTreeItem *m_anchor; wxGenericTreeItem *m_current; bool m_hasFocus; + bool m_dirty; int m_xScroll,m_yScroll; unsigned int m_indent; int m_lineHeight; @@ -404,6 +456,7 @@ protected: wxBrush *m_hilightBrush; wxImageList *m_imageListNormal, *m_imageListState; + int m_dragCount; // the common part of all ctors void Init(); @@ -416,7 +469,8 @@ protected: wxTreeItemData *data); void AdjustMyScrollbars(); - void PaintLevel( wxGenericTreeItem *item, wxDC &dc, int level, int &y ); + void PaintLevel( wxGenericTreeItem *item, wxDC& dc, int level, int &y ); + void PaintItem( wxGenericTreeItem *item, wxDC& dc); void CalculateLevel( wxGenericTreeItem *item, wxDC &dc, int level, int &y ); void CalculatePositions();