]> git.saurik.com Git - wxWidgets.git/blobdiff - include/wx/msw/treectrl.h
Rewrote wxNotebook, incl. PAGE_CHANGING event
[wxWidgets.git] / include / wx / msw / treectrl.h
index bb44c4e08b3c2606d03961eb107513abb54496dc..429aa6983ea5fdcb38bf9fac618b309b88cd6250 100644 (file)
 
 #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;
@@ -33,7 +44,6 @@ struct WXDLLEXPORT wxTreeViewItem;
 // 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
@@ -110,9 +120,7 @@ public:
     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;
@@ -131,27 +139,23 @@ 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 : 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
 };
 
 // ----------------------------------------------------------------------------
@@ -195,6 +199,11 @@ public:
     unsigned int GetIndent() const;
     void SetIndent(unsigned int indent);
 
+       // spacing is the number of pixels between the start and the Text
+       // not implemented under wxMSW
+    unsigned int GetSpacing() const { return 18; } // return wxGTK default
+    void SetSpacing(unsigned int ) {}
+
         // image list: these functions allow to associate an image list with
         // the control and retrieve it. Note that the control does _not_ delete
         // the associated image list when it's deleted in order to allow image
@@ -240,6 +249,18 @@ public:
         // 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);
+
+        // the item will be shown with a drop highlight
+    void SetItemDropHighlight(const wxTreeItemId& item, bool highlight = TRUE);
+
     // item status inquiries
     // ---------------------
 
@@ -251,6 +272,15 @@ public:
     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
     // ----------
@@ -277,6 +307,8 @@ public:
     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;
@@ -320,7 +352,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
@@ -355,30 +391,37 @@ 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);
 
     // 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
     // ----------
 
@@ -404,9 +447,8 @@ public:
 
     // 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 MSWOnNotify(int idCtrl, WXLPARAM lParam, WXLPARAM *result);
 
 protected:
     // SetImageList helper
@@ -443,7 +485,7 @@ private:
 // 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:
@@ -465,10 +507,6 @@ 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;
@@ -517,5 +555,8 @@ 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 },
+
 #endif
     // _WX_TREECTRL_H_