]> git.saurik.com Git - wxWidgets.git/blobdiff - include/wx/msw/treectrl.h
New scrolling code.
[wxWidgets.git] / include / wx / msw / treectrl.h
index 4f5cb941d1d06259fa7062d76ec3ce3e91864513..b193782490c2faad9996d97e88ef55de63c8586e 100644 (file)
 // ----------------------------------------------------------------------------
 // headers
 // ----------------------------------------------------------------------------
+
 #ifdef __GNUG__
     #pragma interface "treectrl.h"
 #endif
 
-#include "wx/control.h"
-#include "wx/event.h"
+#include "wx/textctrl.h"
+#include "wx/dynarray.h"
 
 #ifdef __GNUWIN32__
-#  ifdef GetFirstChild
-#    undef GetFirstChild
-#  endif
-
-#  ifdef GetNextSibling
-#    undef GetNextSibling
-#  endif
-#endif
+    // Cygwin windows.h defines these identifiers
+    #undef GetFirstChild
+    #undef GetNextSibling
+#endif // Cygwin
 
 // the type for "untyped" data
 typedef long wxDataType;
@@ -43,7 +40,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
@@ -126,6 +122,8 @@ protected:
     long m_itemId;
 };
 
+WX_DEFINE_ARRAY(wxTreeItemId, wxArrayTreeItemIds);
+
 // ----------------------------------------------------------------------------
 // wxTreeItemData is some (arbitrary) user class associated with some item. The
 // main advantage of having this class (compared to old untyped interface) is
@@ -151,7 +149,7 @@ public:
 
     // accessors: set/get the item associated with this node
     void SetId(const wxTreeItemId& id) { m_itemId = id; }
-    const wxTreeItemId& GetId() const { return (wxTreeItemId&) m_itemId; }
+    const wxTreeItemId GetId() const { return *this; }
 };
 
 // ----------------------------------------------------------------------------
@@ -195,6 +193,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 WXUNUSED(spacing)) { }
+
         // 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
@@ -221,10 +224,9 @@ public:
 
         // retrieve items label
     wxString GetItemText(const wxTreeItemId& item) const;
-        // get the normal item image
-    int GetItemImage(const wxTreeItemId& item) const;
-        // get the selected item image
-    int GetItemSelectedImage(const wxTreeItemId& item) const;
+        // get one of the images associated with the item (normal by default)
+    int GetItemImage(const wxTreeItemId& item,
+                     wxTreeItemIcon which = wxTreeItemIcon_Normal) const;
         // get the data associated with the item
     wxTreeItemData *GetItemData(const wxTreeItemId& item) const;
 
@@ -233,10 +235,9 @@ public:
 
         // set items label
     void SetItemText(const wxTreeItemId& item, const wxString& text);
-        // set the normal item image
-    void SetItemImage(const wxTreeItemId& item, int image);
-        // set the selected item image
-    void SetItemSelectedImage(const wxTreeItemId& item, int image);
+        // get one of the images associated with the item (normal by default)
+    void SetItemImage(const wxTreeItemId& item, int image,
+                      wxTreeItemIcon which = wxTreeItemIcon_Normal);
         // associate some data with the item
     void SetItemData(const wxTreeItemId& item, wxTreeItemData *data);
 
@@ -249,6 +250,9 @@ public:
         // 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
     // ---------------------
 
@@ -268,7 +272,8 @@ public:
 
         // 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);
+    size_t GetChildrenCount(const wxTreeItemId& item,
+                            bool recursively = TRUE) const;
 
     // navigation
     // ----------
@@ -281,6 +286,12 @@ public:
         // get the item currently selected (may return NULL if no selection)
     wxTreeItemId GetSelection() const;
 
+        // get the items currently selected, return the number of such item
+        //
+        // NB: this operation is expensive and can take a long time for a
+        //     control with a lot of items (~ O(number of items)).
+    size_t GetSelections(wxArrayTreeItemIds& selections) const;
+
         // get the parent of this item (may return NULL if root)
     wxTreeItemId GetParent(const wxTreeItemId& item) const;
 
@@ -295,6 +306,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;
@@ -338,7 +351,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
@@ -352,6 +369,8 @@ public:
 
         // remove the selection from currently selected item (if any)
     void Unselect();
+        // unselect all items (only makes sense for multiple selection control)
+    void UnselectAll();
         // select this item
     void SelectItem(const wxTreeItemId& item);
         // make sure this item is visible (expanding the parent item and/or
@@ -373,13 +392,17 @@ 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
     // -------
@@ -396,8 +419,7 @@ public:
     wxTreeItemId HitTest(const wxPoint& point, int& flags);
 
         // get the bounding rectangle of the item (or of its label only)
-        // @@@ do we really need to expose this functions to the application?
-    void GetBoundingRect(const wxTreeItemId& item,
+    bool GetBoundingRect(const wxTreeItemId& item,
                          wxRect& rect,
                          bool textOnly = FALSE) const;
 
@@ -424,17 +446,28 @@ public:
     void SetImageList(wxImageList *imageList, int)
         { SetImageList(imageList); }
 
+    // use Set/GetItemImage directly
+        // get the selected item image
+    int GetItemSelectedImage(const wxTreeItemId& item) const
+        { return GetItemImage(item, wxTreeItemIcon_Selected); }
+        // set the selected item image
+    void SetItemSelectedImage(const wxTreeItemId& item, int image)
+        { SetItemImage(item, image, wxTreeItemIcon_Selected); }
+
     // implementation
     // --------------
-    void Command(wxCommandEvent& event) { ProcessCommand(event); };
     virtual bool MSWCommand(WXUINT param, WXWORD id);
-    virtual bool MSWNotify(WXWPARAM wParam, WXLPARAM lParam, WXLPARAM *result);
+    virtual bool MSWOnNotify(int idCtrl, WXLPARAM lParam, WXLPARAM *result);
+
+    // get/set the check state for the item (only for wxTR_MULTIPLE)
+    bool IsItemChecked(const wxTreeItemId& item) const;
+    void SetItemCheck(const wxTreeItemId& item, bool check = TRUE);
 
 protected:
     // SetImageList helper
     void SetAnyImageList(wxImageList *imageList, int which);
 
-    wxTextCtrl*  m_textCtrl;        // used while editing the item label
+    wxTextCtrl  *m_textCtrl;        // used while editing the item label
     wxImageList *m_imageListNormal, // images for tree elements
                 *m_imageListState;  // special images for app defined states
 
@@ -454,86 +487,25 @@ private:
                               int image, int selectedImage,
                               wxTreeItemData *data);
 
-    void DeleteTextCtrl();
-
-    DECLARE_DYNAMIC_CLASS(wxTreeCtrl)
-};
+    int DoGetItemImageFromData(const wxTreeItemId& item,
+                               wxTreeItemIcon which) const;
+    void DoSetItemImageFromData(const wxTreeItemId& item,
+                                int image,
+                                wxTreeItemIcon which) const;
+    void DoSetItemImages(const wxTreeItemId& item, int image, int imageSel);
 
-// ----------------------------------------------------------------------------
-// wxTreeEvent is a special class for all events associated with tree controls
-//
-// NB: note that not all accessors make sense for all events, see the event
-//     descriptions below
-// ----------------------------------------------------------------------------
-class WXDLLEXPORT wxTreeEvent : public wxNotifyEvent
-{
-friend wxTreeCtrl;
-public:
-    wxTreeEvent(wxEventType commandType = wxEVT_NULL, int id = 0);
-
-    // accessors
-        // get the item on which the operation was performed or the newly
-        // selected item for wxEVT_COMMAND_TREE_SEL_CHANGED/ING events
-    wxTreeItemId GetItem() const { return m_item; }
-
-        // for wxEVT_COMMAND_TREE_SEL_CHANGED/ING events, get the previously
-        // selected item
-    wxTreeItemId GetOldItem() const { return m_itemOld; }
-
-        // the point where the mouse was when the drag operation started (for
-        // wxEVT_COMMAND_TREE_BEGIN_(R)DRAG events only)
-    wxPoint GetPoint() const { return m_pointDrag; }
+    void DeleteTextCtrl();
 
-        // keyboard code (for wxEVT_COMMAND_TREE_KEY_DOWN only)
-    int GetCode() const { return m_code; }
+    // support for additional item images
+    friend class wxTreeItemIndirectData;
+    void SetIndirectItemData(const wxTreeItemId& item,
+                             wxTreeItemIndirectData *data);
+    bool HasIndirectData(const wxTreeItemId& item) const;
 
-private:
-    // @@ we could save some space by using union here
-    int           m_code;
-    wxTreeItemId  m_item,
-                  m_itemOld;
-    wxPoint       m_pointDrag;
+    wxArrayTreeItemIds m_itemsWithIndirectData;
 
-    DECLARE_DYNAMIC_CLASS(wxTreeEvent)
+    DECLARE_DYNAMIC_CLASS(wxTreeCtrl)
 };
 
-typedef void (wxEvtHandler::*wxTreeEventFunction)(wxTreeEvent&);
-
-// ----------------------------------------------------------------------------
-// macros for handling tree control events
-// ----------------------------------------------------------------------------
-
-// GetItem() returns the item being dragged, GetPoint() the mouse coords
-#define EVT_TREE_BEGIN_DRAG(id, fn) { wxEVT_COMMAND_TREE_BEGIN_DRAG, id, -1, (wxObjectEventFunction) (wxEventFunction) (wxTreeEventFunction) & fn, (wxObject *) NULL },
-#define EVT_TREE_BEGIN_RDRAG(id, fn) { wxEVT_COMMAND_TREE_BEGIN_RDRAG, id, -1, (wxObjectEventFunction) (wxEventFunction) (wxTreeEventFunction) & fn, (wxObject *) NULL },
-
-// GetItem() returns the itme whose label is being edited
-#define EVT_TREE_BEGIN_LABEL_EDIT(id, fn) { wxEVT_COMMAND_TREE_BEGIN_LABEL_EDIT, id, -1, (wxObjectEventFunction) (wxEventFunction) (wxTreeEventFunction) & fn, (wxObject *) NULL },
-#define EVT_TREE_END_LABEL_EDIT(id, fn) { wxEVT_COMMAND_TREE_END_LABEL_EDIT, id, -1, (wxObjectEventFunction) (wxEventFunction) (wxTreeEventFunction) & fn, (wxObject *) NULL },
-
-// provide/update information about GetItem() item
-#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 
-#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 },
-#define EVT_TREE_ITEM_COLLAPSING(id, fn) { wxEVT_COMMAND_TREE_ITEM_COLLAPSING, id, -1, (wxObjectEventFunction) (wxEventFunction) (wxTreeEventFunction) & fn, NULL },
-
-// GetOldItem() is the item which had the selection previously, GetItem() is
-// the item which acquires selection
-#define EVT_TREE_SEL_CHANGED(id, fn) { wxEVT_COMMAND_TREE_SEL_CHANGED, id, -1, (wxObjectEventFunction) (wxEventFunction) (wxTreeEventFunction) & fn, NULL },
-#define EVT_TREE_SEL_CHANGING(id, fn) { wxEVT_COMMAND_TREE_SEL_CHANGING, id, -1, (wxObjectEventFunction) (wxEventFunction) (wxTreeEventFunction) & fn, NULL },
-
-// GetCode() returns the key code
-// NB: this is the only message for which GetItem() is invalid (you may get the
-//     item from GetSelection())
-#define EVT_TREE_KEY_DOWN(id, fn) { wxEVT_COMMAND_TREE_KEY_DOWN, id, -1, (wxObjectEventFunction) (wxEventFunction) (wxTreeEventFunction) & fn, NULL },
-
-// GetItem() returns the item being deleted, the associated data (if any) will
-// 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 },
-
 #endif
     // _WX_TREECTRL_H_