#include "wx/textctrl.h"
#include "wx/pen.h"
#include "wx/dynarray.h"
+#include "wx/timer.h"
-//those defines should only be done in generic/treectrl.h,
+//those defines should only be done in generic/treectrl.h,
//because wxMSW doesn't allow mutiple selection
#ifndef wxTR_SINGLE
// forward declaration
// -----------------------------------------------------------------------------
-class wxImageList;
-class wxGenericTreeItem;
+class WXDLLEXPORT wxImageList;
+class WXDLLEXPORT wxGenericTreeItem;
-class wxTreeItemData;
+class WXDLLEXPORT wxTreeItemData;
+
+class WXDLLEXPORT wxTreeRenameTimer;
+class WXDLLEXPORT wxTreeTextCtrl;
// -----------------------------------------------------------------------------
// wxTreeItemId - unique identifier of a tree element
// 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;
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; }
-
- // 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; }
+//-----------------------------------------------------------------------------
+// wxTreeRenameTimer (internal)
+//-----------------------------------------------------------------------------
- // 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&);
+//-----------------------------------------------------------------------------
+// wxTreeTextCtrl (internal)
+//-----------------------------------------------------------------------------
-// ----------------------------------------------------------------------------
-// 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 },
+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
unsigned int GetIndent() const { return m_indent; }
void SetIndent(unsigned int indent);
- // spacing is the number of pixels between the start and the Text
+ // 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
{ 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);
+ // 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
// Draw Special Information
void DrawBorder(wxTreeItemId& item);
void DrawLine(wxTreeItemId& item, bool below);
-
+
protected:
friend class wxGenericTreeItem;
+ friend class wxTreeRenameTimer;
+ friend class wxTreeTextCtrl;
wxGenericTreeItem *m_anchor;
- wxGenericTreeItem *m_current, *m_key_current;
+ wxGenericTreeItem *m_current, *m_key_current, *m_currentEdit;
bool m_hasFocus;
bool m_dirty;
int m_xScroll,m_yScroll;
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();
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);