]> git.saurik.com Git - wxWidgets.git/blobdiff - include/wx/generic/treectrl.h
SCROLLWIN instead of SCROLL again
[wxWidgets.git] / include / wx / generic / treectrl.h
index 0158561753f500947457dec83cabb35983172a7a..8b9b85dff821e561a769a985b2008e490727741b 100644 (file)
 #include "wx/event.h"
 #include "wx/scrolwin.h"
 #include "wx/textctrl.h"
+#include "wx/pen.h"
+#include "wx/dynarray.h"
+#include "wx/timer.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
 // -----------------------------------------------------------------------------
 
-class wxImageList;
-class wxGenericTreeItem;
+class WXDLLEXPORT wxImageList;
+class WXDLLEXPORT wxGenericTreeItem;
+
+class WXDLLEXPORT wxTreeItemData;
 
-class wxTreeItemData;
-typedef int (*wxTreeItemCmpFunc)(wxTreeItemData *item1, wxTreeItemData *item2);
+class WXDLLEXPORT wxTreeRenameTimer;
+class WXDLLEXPORT wxTreeTextCtrl;
 
 // -----------------------------------------------------------------------------
 // wxTreeItemId - unique identifier of a tree element
@@ -78,12 +68,15 @@ public:
     wxGenericTreeItem *m_pItem;
 };
 
+WX_DECLARE_OBJARRAY(wxTreeItemId, wxArrayTreeItemIds);
+
 // ----------------------------------------------------------------------------
 // wxTreeItemData is some (arbitrary) user class associated with some item.
 //
 // Because the objects of this class are deleted by the tree, they should
 // always be allocated on the heap!
 // ----------------------------------------------------------------------------
+
 class WXDLLEXPORT wxTreeItemData: public wxClientData
 {
 friend class wxTreeCtrl;
@@ -103,88 +96,48 @@ protected:
     wxTreeItemId m_pItem;
 };
 
-// -----------------------------------------------------------------------------
-// wxTreeEvent - the event generated by the tree control
-// -----------------------------------------------------------------------------
-class WXDLLEXPORT wxTreeEvent : public wxNotifyEvent
-{
-friend class 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; }
+//-----------------------------------------------------------------------------
+// wxTreeRenameTimer (internal)
+//-----------------------------------------------------------------------------
 
-        // 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; }
-
-        // 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; }
-
-        // for implementation usage only
-    bool WasVetoed() const { return m_code; }
-
-private:
-    // @@ we could save some space by using union here
-    int           m_code;
-    wxTreeItemId  m_item,
-                  m_itemOld;
-    wxPoint       m_pointDrag;
+class WXDLLEXPORT wxTreeRenameTimer: public wxTimer
+{
+ private:
+   wxTreeCtrl   *m_owner;
 
-    DECLARE_DYNAMIC_CLASS(wxTreeEvent)
+ public:
+   wxTreeRenameTimer( wxTreeCtrl *owner );
+   void Notify();
 };
 
-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 },
+//-----------------------------------------------------------------------------
+//  wxTreeTextCtrl (internal)
+//-----------------------------------------------------------------------------
 
-// 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 },
+class WXDLLEXPORT wxTreeTextCtrl: public wxTextCtrl
+{
+  DECLARE_DYNAMIC_CLASS(wxTreeTextCtrl);
+
+  private:
+    bool               *m_accept;
+    wxString           *m_res;
+    wxTreeCtrl         *m_owner;
+    wxString            m_startValue;
+
+  public:
+    wxTreeTextCtrl(void) {};
+    wxTreeTextCtrl( wxWindow *parent, const wxWindowID id,
+                    bool *accept, wxString *res, wxTreeCtrl *owner,
+                    const wxString &value = wxEmptyString,
+                    const wxPoint &pos = wxDefaultPosition, const wxSize &size = wxDefaultSize,
+                    int style = 0,
+                    const wxValidator& validator = wxDefaultValidator,
+                    const wxString &name = wxTextCtrlNameStr );
+    void OnChar( wxKeyEvent &event );
+    void OnKillFocus( wxFocusEvent &event );
 
-// 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 },
+  DECLARE_EVENT_TABLE()
+};
 
 // -----------------------------------------------------------------------------
 // wxTreeCtrl - the tree control
@@ -201,8 +154,8 @@ public:
                const wxPoint& pos = wxDefaultPosition,
                const wxSize& size = wxDefaultSize,
                long style = wxTR_HAS_BUTTONS | wxTR_LINES_AT_ROOT,
-              const wxValidator &validator = wxDefaultValidator,
-               const wxString& name = "wxTreeCtrl")
+               const wxValidator &validator = wxDefaultValidator,
+               const wxString& name = wxTreeCtrlNameStr)
     {
         Create(parent, id, pos, size, style, validator, name);
     }
@@ -213,8 +166,8 @@ public:
                 const wxPoint& pos = wxDefaultPosition,
                 const wxSize& size = wxDefaultSize,
                 long style = wxTR_HAS_BUTTONS | wxTR_LINES_AT_ROOT,
-               const wxValidator &validator = wxDefaultValidator,
-                const wxString& name = "wxTreeCtrl");
+                const wxValidator &validator = wxDefaultValidator,
+                const wxString& name = wxTreeCtrlNameStr);
 
     // accessors
     // ---------
@@ -228,6 +181,10 @@ public:
     unsigned int GetIndent() const { return m_indent; }
     void SetIndent(unsigned int indent);
 
+        // spacing is the number of pixels between the start and the Text
+    unsigned int GetSpacing() const { return m_spacing; }
+    void SetSpacing(unsigned int 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
@@ -251,10 +208,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;
 
@@ -263,10 +219,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);
 
@@ -279,6 +234,15 @@ public:
         // the item will be shown in bold
     void SetItemBold(const wxTreeItemId& item, bool bold = TRUE);
 
+        // set the items text colour
+    void SetItemTextColour(const wxTreeItemId& item, const wxColour& col);
+
+        // set the items background colour
+    void SetItemBackgroundColour(const wxTreeItemId& item, const wxColour& col);
+
+        // set the items font (should be of the same height for all items)
+    void SetItemFont(const wxTreeItemId& item, const wxFont& font);
+
     // item status inquiries
     // ---------------------
 
@@ -313,6 +277,9 @@ public:
         // get the item currently selected (may return NULL if no selection)
     wxTreeItemId GetSelection() const { return m_current; }
 
+        // get the items currently selected, return the number of such item
+    size_t GetSelections(wxArrayTreeItemIds&) const;
+
         // get the parent of this item (may return NULL if root)
     wxTreeItemId GetParent(const wxTreeItemId& item) const;
 
@@ -327,6 +294,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;
@@ -362,6 +331,13 @@ public:
                             int image = -1, int selectedImage = -1,
                             wxTreeItemData *data = NULL);
 
+        // insert a new item before the one with the given index
+    wxTreeItemId InsertItem(const wxTreeItemId& parent,
+                            size_t index,
+                            const wxString& text,
+                            int image = -1, int selectedImage = -1,
+                            wxTreeItemData *data = NULL);
+
         // insert a new item in as the last child of the parent
     wxTreeItemId AppendItem(const wxTreeItemId& parent,
                             const wxString& text,
@@ -370,7 +346,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
@@ -384,8 +364,9 @@ public:
 
         // remove the selection from currently selected item (if any)
     void Unselect();
+    void UnselectAll();
         // select this item
-    void SelectItem(const wxTreeItemId& item);
+    void SelectItem(const wxTreeItemId& item, bool unselect_others=TRUE, bool extended_select=FALSE);
         // make sure this item is visible (expanding the parent item and/or
         // scrolling to this item if necessary)
     void EnsureVisible(const wxTreeItemId& item);
@@ -397,28 +378,36 @@ public:
     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
+
+        // 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
-        // control of arbitrary user-defined class deriving from wxTextCtrl.
-    wxTextCtrl* EditLabel(const wxTreeItemId& item,
-                          wxClassInfo* textCtrlClass = CLASSINFO(wxTextCtrl));
-        // returns the same pointer as StartEdit() if the item is being edited,
-        // NULL otherwise (it's assumed that no more than one item may be
-        // edited simultaneously)
-    wxTextCtrl* GetEditControl() const;
-        // 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.
+        // been before.
+    void EditLabel( const wxTreeItemId& item ) { Edit( item ); }
+    void Edit( const wxTreeItemId& item );
+
+    // 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);
+
+    // deprecated functions: 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
+
+    // callbacks
     void OnPaint( wxPaintEvent &event );
     void OnSetFocus( wxFocusEvent &event );
     void OnKillFocus( wxFocusEvent &event );
@@ -426,18 +415,38 @@ public:
     void OnMouse( wxMouseEvent &event );
     void OnIdle( wxIdleEvent &event );
 
+    // implementation
+    void SendDeleteEvent(wxGenericTreeItem *itemBeingDeleted);
+
+    // Draw Special Information
+    void DrawBorder(wxTreeItemId& item);
+    void DrawLine(wxTreeItemId& item, bool below);
+
 protected:
+    friend class wxGenericTreeItem;
+    friend class wxTreeRenameTimer;
+    friend class wxTreeTextCtrl;
+
+    wxFont               m_normalFont;
+    wxFont               m_boldFont;
+
     wxGenericTreeItem   *m_anchor;
-    wxGenericTreeItem   *m_current;
+    wxGenericTreeItem   *m_current, *m_key_current, *m_currentEdit;
     bool                 m_hasFocus;
     bool                 m_dirty;
     int                  m_xScroll,m_yScroll;
     unsigned int         m_indent;
+    unsigned int         m_spacing;
     int                  m_lineHeight;
     wxPen                m_dottedPen;
     wxBrush             *m_hilightBrush;
     wxImageList         *m_imageListNormal,
                         *m_imageListState;
+    int                  m_dragCount;
+    wxPoint              m_dragStart;
+    wxTimer             *m_renameTimer;
+    bool                 m_renameAccept;
+    wxString             m_renameRes;
 
     // the common part of all ctors
     void Init();
@@ -450,15 +459,26 @@ protected:
                               wxTreeItemData *data);
 
     void AdjustMyScrollbars();
+    int  GetLineHeight(wxGenericTreeItem *item) const;
     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();
+    void CalculateSize( wxGenericTreeItem *item, wxDC &dc );
 
     void RefreshSubtree( wxGenericTreeItem *item );
     void RefreshLine( wxGenericTreeItem *item );
 
+    void OnRenameTimer();
+    void OnRenameAccept();
+
+    void FillArray(wxGenericTreeItem*, wxArrayTreeItemIds&) const;
+    void SelectItemRange( wxGenericTreeItem *item1, wxGenericTreeItem *item2 );
+    bool TagAllChildrenUntilLast(wxGenericTreeItem *crt_item, wxGenericTreeItem *last_item, bool select);
+    bool TagNextChildren(wxGenericTreeItem *crt_item, wxGenericTreeItem *last_item, bool select);
+    void UnselectAllChildren( wxGenericTreeItem *item );
+
 private:
     DECLARE_EVENT_TABLE()
     DECLARE_DYNAMIC_CLASS(wxTreeCtrl)