1 /////////////////////////////////////////////////////////////////////////////
3 // Purpose: Wrappers for the "gizmo" classes in wx/contrib
7 // Created: 23-Nov-2001
9 // Copyright: (c) 2001 by Total Control Software
10 // Licence: wxWindows license
11 /////////////////////////////////////////////////////////////////////////////
14 "Various *gizmo* classes: `DynamicSashWindow`, `EditableListBox`,
15 `LEDNumberCtrl`, `TreeListCtrl`, etc."
18 %module(package="wx", docstring=DOCSTRING) gizmos
22 #include "wx/wxPython/wxPython.h"
23 #include "wx/wxPython/pyclasses.h"
25 #include <wx/gizmos/dynamicsash.h>
26 #include <wx/gizmos/editlbox.h>
27 #include <wx/gizmos/splittree.h>
28 #include <wx/gizmos/ledctrl.h>
30 #include <wx/listctrl.h>
31 #include <wx/treectrl.h>
32 #include <wx/imaglist.h>
34 #include "wx/treelistctrl.h"
35 #include "wx/wxPython/pytree.h"
39 //---------------------------------------------------------------------------
43 %pythoncode { import wx }
44 %pythoncode { __docfilter__ = wx._core.__DocFilter(globals()) }
47 MAKE_CONST_WXSTRING2(DynamicSashNameStr, wxT("dynamicSashWindow"));
48 MAKE_CONST_WXSTRING2(EditableListBoxNameStr, wxT("editableListBox"));
49 MAKE_CONST_WXSTRING2(TreeListCtrlNameStr, wxT("treelistctrl"));
51 MAKE_CONST_WXSTRING_NOSWIG(EmptyString);
54 %include _gizmos_rename.i
56 //---------------------------------------------------------------------------
59 wxEVT_DYNAMIC_SASH_SPLIT,
60 wxEVT_DYNAMIC_SASH_UNIFY,
62 wxDS_MANAGE_SCROLLBARS,
68 wxDynamicSashSplitEvents are sent to your view by wxDynamicSashWindow
69 whenever your view is being split by the user. It is your
70 responsibility to handle this event by creating a new view window as
71 a child of the wxDynamicSashWindow. wxDynamicSashWindow will
72 automatically reparent it to the proper place in its window hierarchy.
74 class wxDynamicSashSplitEvent : public wxCommandEvent {
76 wxDynamicSashSplitEvent(wxObject *target);
81 wxDynamicSashUnifyEvents are sent to your view by wxDynamicSashWindow
82 whenever the sash which splits your view and its sibling is being
83 reunified such that your view is expanding to replace its sibling.
84 You needn't do anything with this event if you are allowing
85 wxDynamicSashWindow to manage your view's scrollbars, but it is useful
86 if you are managing the scrollbars yourself so that you can keep
87 the scrollbars' event handlers connected to your view's event handler
90 class wxDynamicSashUnifyEvent : public wxCommandEvent {
92 wxDynamicSashUnifyEvent(wxObject *target);
101 wxDynamicSashWindow widgets manages the way other widgets are viewed.
102 When a wxDynamicSashWindow is first shown, it will contain one child
103 view, a viewport for that child, and a pair of scrollbars to allow the
104 user to navigate the child view area. Next to each scrollbar is a small
105 tab. By clicking on either tab and dragging to the appropriate spot, a
106 user can split the view area into two smaller views separated by a
107 draggable sash. Later, when the user wishes to reunify the two subviews,
108 the user simply drags the sash to the side of the window.
109 wxDynamicSashWindow will automatically reparent the appropriate child
110 view back up the window hierarchy, and the wxDynamicSashWindow will have
111 only one child view once again.
113 As an application developer, you will simply create a wxDynamicSashWindow
114 using either the Create() function or the more complex constructor
115 provided below, and then create a view window whose parent is the
116 wxDynamicSashWindow. The child should respond to
117 wxDynamicSashSplitEvents -- perhaps with an OnSplit() event handler -- by
118 constructing a new view window whose parent is also the
119 wxDynamicSashWindow. That's it! Now your users can dynamically split
120 and reunify the view you provided.
122 If you wish to handle the scrollbar events for your view, rather than
123 allowing wxDynamicSashWindow to do it for you, things are a bit more
124 complex. (You might want to handle scrollbar events yourself, if,
125 for instance, you wish to scroll a subwindow of the view you add to
126 your wxDynamicSashWindow object, rather than scrolling the whole view.)
127 In this case, you will need to construct your wxDynamicSashWindow without
128 the wxDS_MANAGE_SCROLLBARS style and you will need to use the
129 GetHScrollBar() and GetVScrollBar() methods to retrieve the scrollbar
130 controls and call SetEventHanler() on them to redirect the scrolling
131 events whenever your window is reparented by wxDyanmicSashWindow.
132 You will need to set the scrollbars' event handler at three times:
134 * When your view is created
135 * When your view receives a wxDynamicSashSplitEvent
136 * When your view receives a wxDynamicSashUnifyEvent
138 See the dynsash_switch sample application for an example which does this.
142 MustHaveApp(wxDynamicSashWindow);
144 class wxDynamicSashWindow : public wxWindow {
146 %pythonAppend wxDynamicSashWindow "self._setOORInfo(self)"
147 %pythonAppend wxDynamicSashWindow() ""
149 wxDynamicSashWindow(wxWindow *parent, wxWindowID id=-1,
150 const wxPoint& pos = wxDefaultPosition, const wxSize& size = wxDefaultSize,
151 long style = wxCLIP_CHILDREN | wxDS_MANAGE_SCROLLBARS | wxDS_DRAG_CORNER,
152 const wxString& name = wxPyDynamicSashNameStr);
153 %RenameCtor(PreDynamicSashWindow, wxDynamicSashWindow());
155 bool Create(wxWindow *parent, wxWindowID id=-1,
156 const wxPoint& pos = wxDefaultPosition, const wxSize& size = wxDefaultSize,
157 long style = wxCLIP_CHILDREN | wxDS_MANAGE_SCROLLBARS | wxDS_DRAG_CORNER,
158 const wxString& name = wxPyDynamicSashNameStr);
160 wxScrollBar *GetHScrollBar(const wxWindow *child) const;
161 wxScrollBar *GetVScrollBar(const wxWindow *child) const;
167 EVT_DYNAMIC_SASH_SPLIT = wx.PyEventBinder( wxEVT_DYNAMIC_SASH_SPLIT, 1 )
168 EVT_DYNAMIC_SASH_UNIFY = wx.PyEventBinder( wxEVT_DYNAMIC_SASH_UNIFY, 1 )
171 //---------------------------------------------------------------------------
172 //---------------------------------------------------------------------------
180 // This class provides a composite control that lets the
181 // user easily enter list of strings
182 MustHaveApp(wxEditableListBox);
183 class wxEditableListBox : public wxPanel
186 %pythonAppend wxEditableListBox "self._setOORInfo(self)"
187 %pythonAppend wxEditableListBox() ""
189 wxEditableListBox(wxWindow *parent, wxWindowID id=-1,
190 const wxString& label = wxPyEmptyString,
191 const wxPoint& pos = wxDefaultPosition,
192 const wxSize& size = wxDefaultSize,
193 long style = wxEL_ALLOW_NEW | wxEL_ALLOW_EDIT | wxEL_ALLOW_DELETE,
194 const wxString& name = wxPyEditableListBoxNameStr);
197 void SetStrings(const wxArrayString& strings);
199 //void GetStrings(wxArrayString& strings);
201 PyObject* GetStrings() {
202 wxArrayString strings;
203 self->GetStrings(strings);
204 return wxArrayString2PyList_helper(strings);
208 wxPyListCtrl* GetListCtrl();
209 wxBitmapButton* GetDelButton();
210 wxBitmapButton* GetNewButton();
211 wxBitmapButton* GetUpButton();
212 wxBitmapButton* GetDownButton();
213 wxBitmapButton* GetEditButton();
218 //---------------------------------------------------------------------------
222 * wxRemotelyScrolledTreeCtrl
224 * This tree control disables its vertical scrollbar and catches scroll
225 * events passed by a scrolled window higher in the hierarchy.
226 * It also updates the scrolled window vertical scrollbar as appropriate.
230 typedef wxTreeCtrl wxPyTreeCtrl;
233 MustHaveApp(wxRemotelyScrolledTreeCtrl);
235 class wxRemotelyScrolledTreeCtrl: public wxPyTreeCtrl
238 %pythonAppend wxRemotelyScrolledTreeCtrl "self._setOORInfo(self)"
239 %pythonAppend wxRemotelyScrolledTreeCtrl() ""
241 wxRemotelyScrolledTreeCtrl(wxWindow* parent, wxWindowID id,
242 const wxPoint& pos = wxDefaultPosition,
243 const wxSize& size = wxDefaultSize,
244 long style = wxTR_HAS_BUTTONS);
247 void HideVScrollbar();
249 // Adjust the containing wxScrolledWindow's scrollbars appropriately
250 void AdjustRemoteScrollbars();
252 // Find the scrolled window that contains this control
253 wxScrolledWindow* GetScrolledWindow() const;
255 // Scroll to the given line (in scroll units where each unit is
256 // the height of an item)
257 void ScrollToLine(int posHoriz, int posVert);
259 // The companion window is one which will get notified when certain
260 // events happen such as node expansion
261 void SetCompanionWindow(wxWindow* companion);
262 wxWindow* GetCompanionWindow() const;
268 * wxTreeCompanionWindow
270 * A window displaying values associated with tree control items.
274 class wxPyTreeCompanionWindow: public wxTreeCompanionWindow
277 wxPyTreeCompanionWindow(wxWindow* parent, wxWindowID id = -1,
278 const wxPoint& pos = wxDefaultPosition,
279 const wxSize& size = wxDefaultSize,
281 : wxTreeCompanionWindow(parent, id, pos, size, style) {}
284 virtual void DrawItem(wxDC& dc, wxTreeItemId id, const wxRect& rect) {
286 bool blocked = wxPyBeginBlockThreads();
287 if ((found = wxPyCBH_findCallback(m_myInst, "DrawItem"))) {
288 PyObject* dcobj = wxPyMake_wxObject(&dc,false);
289 PyObject* idobj = wxPyConstructObject((void*)&id, wxT("wxTreeItemId"), false);
290 PyObject* recobj= wxPyConstructObject((void*)&rect, wxT("wxRect"), false);
291 wxPyCBH_callCallback(m_myInst, Py_BuildValue("(OOO)", dcobj, idobj, recobj));
296 wxPyEndBlockThreads(blocked);
298 wxTreeCompanionWindow::DrawItem(dc, id, rect);
306 MustHaveApp(wxPyTreeCompanionWindow);
308 %rename(TreeCompanionWindow) wxPyTreeCompanionWindow;
309 class wxPyTreeCompanionWindow: public wxWindow
312 %pythonAppend wxPyTreeCompanionWindow "self._setOORInfo(self);self._setCallbackInfo(self, TreeCompanionWindow)"
313 %pythonAppend wxPyTreeCompanionWindow() ""
315 wxPyTreeCompanionWindow(wxWindow* parent, wxWindowID id = -1,
316 const wxPoint& pos = wxDefaultPosition,
317 const wxSize& size = wxDefaultSize,
319 void _setCallbackInfo(PyObject* self, PyObject* _class);
321 wxRemotelyScrolledTreeCtrl* GetTreeCtrl() const;
322 void SetTreeCtrl(wxRemotelyScrolledTreeCtrl* treeCtrl);
328 * wxThinSplitterWindow
330 * Implements a splitter with a less obvious sash
331 * than the usual one.
334 MustHaveApp(wxThinSplitterWindow);
336 class wxThinSplitterWindow: public wxSplitterWindow
339 %pythonAppend wxThinSplitterWindow "self._setOORInfo(self)"
340 %pythonAppend wxThinSplitterWindow() ""
342 wxThinSplitterWindow(wxWindow* parent, wxWindowID id = -1,
343 const wxPoint& pos = wxDefaultPosition,
344 const wxSize& size = wxDefaultSize,
345 long style = wxSP_3D | wxCLIP_CHILDREN);
351 * wxSplitterScrolledWindow
353 * This scrolled window is aware of the fact that one of its
354 * children is a splitter window. It passes on its scroll events
355 * (after some processing) to both splitter children for them
356 * scroll appropriately.
359 MustHaveApp(wxSplitterScrolledWindow);
361 class wxSplitterScrolledWindow: public wxScrolledWindow
364 %pythonAppend wxSplitterScrolledWindow "self._setOORInfo(self)"
365 %pythonAppend wxSplitterScrolledWindow() ""
367 wxSplitterScrolledWindow(wxWindow* parent, wxWindowID id = -1,
368 const wxPoint& pos = wxDefaultPosition,
369 const wxSize& size = wxDefaultSize,
374 //---------------------------------------------------------------------------
375 //---------------------------------------------------------------------------
390 MustHaveApp(wxLEDNumberCtrl);
392 class wxLEDNumberCtrl : public wxControl
395 %pythonAppend wxLEDNumberCtrl "self._setOORInfo(self)"
396 %pythonAppend wxLEDNumberCtrl() ""
398 wxLEDNumberCtrl(wxWindow *parent, wxWindowID id = -1,
399 const wxPoint& pos = wxDefaultPosition,
400 const wxSize& size = wxDefaultSize,
401 long style = wxLED_ALIGN_LEFT | wxLED_DRAW_FADED);
402 %RenameCtor(PreLEDNumberCtrl, wxLEDNumberCtrl());
404 bool Create(wxWindow *parent, wxWindowID id = -1,
405 const wxPoint& pos = wxDefaultPosition,
406 const wxSize& size = wxDefaultSize,
407 long style = wxLED_ALIGN_LEFT | wxLED_DRAW_FADED);
409 wxLEDValueAlign GetAlignment() const;
410 bool GetDrawFaded() const;
411 const wxString &GetValue() const;
413 void SetAlignment(wxLEDValueAlign Alignment, bool Redraw = true);
414 void SetDrawFaded(bool DrawFaded, bool Redraw = true);
415 void SetValue(const wxString &Value, bool Redraw = true);
421 //----------------------------------------------------------------------------
422 // wxTreeListCtrl - the multicolumn tree control
423 //----------------------------------------------------------------------------
425 enum wxTreeListColumnAlign {
434 wxTREE_HITTEST_ONITEMCOLUMN
439 // flags for FindItem
451 %pythoncode { wx.TR_DONT_ADJUST_MAC = TR_DONT_ADJUST_MAC }
454 class wxTreeListColumnInfo: public wxObject {
456 wxTreeListColumnInfo(const wxString& text = wxPyEmptyString,
460 wxTreeListColumnAlign alignment = wxTL_ALIGN_LEFT);
462 bool GetShown() const;
463 wxTreeListColumnAlign GetAlignment() const;
464 wxString GetText() const;
465 int GetImage() const;
466 int GetSelectedImage() const;
467 size_t GetWidth() const;
469 // TODO: These all actually return wxTreeListColumnInfo&, any problem with doing it for Python too?
470 void SetShown(bool shown);
471 void SetAlignment(wxTreeListColumnAlign alignment);
472 void SetText(const wxString& text);
473 void SetImage(int image);
474 void SetSelectedImage(int image);
475 void SetWidth(size_t with);
481 %{ // C++ version of Python aware control
482 class wxPyTreeListCtrl : public wxTreeListCtrl {
483 DECLARE_ABSTRACT_CLASS(wxPyTreeListCtrl);
485 wxPyTreeListCtrl() : wxTreeListCtrl() {}
486 wxPyTreeListCtrl(wxWindow *parent, wxWindowID id,
490 const wxValidator &validator,
491 const wxString& name) :
492 wxTreeListCtrl(parent, id, pos, size, style, validator, name) {}
494 int OnCompareItems(const wxTreeItemId& item1,
495 const wxTreeItemId& item2) {
498 bool blocked = wxPyBeginBlockThreads();
499 if ((found = wxPyCBH_findCallback(m_myInst, "OnCompareItems"))) {
500 PyObject *o1 = wxPyConstructObject((void*)&item1, wxT("wxTreeItemId"), 0);
501 PyObject *o2 = wxPyConstructObject((void*)&item2, wxT("wxTreeItemId"), 0);
502 rval = wxPyCBH_callCallback(m_myInst, Py_BuildValue("(OO)",o1,o2));
506 wxPyEndBlockThreads(blocked);
508 rval = wxTreeListCtrl::OnCompareItems(item1, item2);
514 IMPLEMENT_ABSTRACT_CLASS(wxPyTreeListCtrl, wxTreeListCtrl)
523 MustHaveApp(wxPyTreeListCtrl);
525 %rename(TreeListCtrl) wxPyTreeListCtrl;
526 class wxPyTreeListCtrl : public wxControl
529 %pythonAppend wxPyTreeListCtrl "self._setOORInfo(self);self._setCallbackInfo(self, TreeListCtrl)"
530 %pythonAppend wxPyTreeListCtrl() ""
532 wxPyTreeListCtrl(wxWindow *parent, wxWindowID id = -1,
533 const wxPoint& pos = wxDefaultPosition,
534 const wxSize& size = wxDefaultSize,
535 long style = wxTR_DEFAULT_STYLE,
536 const wxValidator &validator = wxDefaultValidator,
537 const wxString& name = wxPyTreeListCtrlNameStr );
538 %RenameCtor(PreTreeListCtrl, wxPyTreeListCtrl());
540 bool Create(wxWindow *parent, wxWindowID id = -1,
541 const wxPoint& pos = wxDefaultPosition,
542 const wxSize& size = wxDefaultSize,
543 long style = wxTR_DEFAULT_STYLE,
544 const wxValidator &validator = wxDefaultValidator,
545 const wxString& name = wxPyTreeListCtrlNameStr );
547 void _setCallbackInfo(PyObject* self, PyObject* _class);
550 // get the total number of items in the control
551 size_t GetCount() const;
553 // indent is the number of pixels the children are indented relative to
554 // the parents position. SetIndent() also redraws the control
556 unsigned int GetIndent() const;
557 void SetIndent(unsigned int indent);
559 // line spacing is the space above and below the text on each line
560 unsigned int GetLineSpacing() const;
561 void SetLineSpacing(unsigned int spacing);
563 // image list: these functions allow to associate an image list with
564 // the control and retrieve it. Note that when assigned with
565 // SetImageList, the control does _not_ delete
566 // the associated image list when it's deleted in order to allow image
567 // lists to be shared between different controls. If you use
568 // AssignImageList, the control _does_ delete the image list.
570 // The normal image list is for the icons which correspond to the
571 // normal tree item state (whether it is selected or not).
572 // Additionally, the application might choose to show a state icon
573 // which corresponds to an app-defined item state (for example,
574 // checked/unchecked) which are taken from the state image list.
575 wxImageList *GetImageList() const;
576 wxImageList *GetStateImageList() const;
577 wxImageList *GetButtonsImageList() const;
579 void SetImageList(wxImageList *imageList);
580 void SetStateImageList(wxImageList *imageList);
581 void SetButtonsImageList(wxImageList *imageList);
583 %apply SWIGTYPE *DISOWN { wxImageList *imageList };
584 void AssignImageList(wxImageList *imageList);
585 void AssignStateImageList(wxImageList *imageList);
586 void AssignButtonsImageList(wxImageList *imageList);
587 %clear wxImageList *imageList;
591 void AddColumn(const wxString& text);
592 // void AddColumn(const wxString& text,
594 // wxTreeListColumnAlign alignment = wxTL_ALIGN_LEFT);
595 %Rename(AddColumnInfo, void, AddColumn(const wxTreeListColumnInfo& col));
597 // inserts a column before the given one
598 void InsertColumn(size_t before, const wxString& text);
599 %Rename(InsertColumnInfo, void, InsertColumn(size_t before, const wxTreeListColumnInfo& col));
601 // deletes the given column - does not delete the corresponding column
603 void RemoveColumn(size_t column);
605 // returns the number of columns in the ctrl
606 size_t GetColumnCount() const;
608 void SetColumnWidth(size_t column, size_t width);
609 int GetColumnWidth(size_t column) const;
611 // tells which column is the "main" one, i.e. the "threaded" one
612 void SetMainColumn(size_t column);
613 size_t GetMainColumn() const;
615 void SetColumnText(size_t column, const wxString& text);
616 wxString GetColumnText(size_t column) const;
618 void SetColumn(size_t column, const wxTreeListColumnInfo& info);
619 wxTreeListColumnInfo& GetColumn(size_t column);
621 // other column-related methods
622 void SetColumnAlignment(size_t column, wxTreeListColumnAlign align);
623 wxTreeListColumnAlign GetColumnAlignment(size_t column) const;
625 void SetColumnImage(size_t column, int image);
626 int GetColumnImage(size_t column) const;
628 void ShowColumn(size_t column, bool shown);
629 bool IsColumnShown(size_t column) const;
632 // retrieves item's label of the given column (main column by default)
633 wxString GetItemText(const wxTreeItemId& item, int column = -1) {
634 if (column < 0) column = self->GetMainColumn();
635 return self->GetItemText(item, column);
638 // get one of the images associated with the item (normal by default)
639 int GetItemImage(const wxTreeItemId& item, int column = -1,
640 wxTreeItemIcon which = wxTreeItemIcon_Normal) {
641 if (column < 0) column = self->GetMainColumn();
642 return self->GetItemImage(item, column, which);
645 // set item's label (main column by default)
646 void SetItemText(const wxTreeItemId& item, const wxString& text, int column = -1) {
647 if (column < 0) column = self->GetMainColumn();
648 self->SetItemText(item, column, text);
651 // set one of the images associated with the item (normal by default)
652 // the which parameter is ignored for all columns but the main one
653 void SetItemImage(const wxTreeItemId& item, int image, int column = -1,
654 wxTreeItemIcon which = wxTreeItemIcon_Normal) {
655 if (column < 0) column = self->GetMainColumn();
656 self->SetItemImage(item, column, image, which);
660 // [Get|Set]ItemData substitutes. Automatically create wxPyTreeItemData
662 wxPyTreeItemData* GetItemData(const wxTreeItemId& item) {
663 wxPyTreeItemData* data = (wxPyTreeItemData*)self->GetItemData(item);
665 data = new wxPyTreeItemData();
666 data->SetId(item); // set the id
667 self->SetItemData(item, data);
672 void SetItemData(const wxTreeItemId& item, wxPyTreeItemData* data) {
673 data->SetId(item); // set the id
674 self->SetItemData(item, data);
677 // [Get|Set]ItemPyData are short-cuts. Also made somewhat crash-proof by
678 // automatically creating data classes.
679 PyObject* GetItemPyData(const wxTreeItemId& item) {
680 wxPyTreeItemData* data = (wxPyTreeItemData*)self->GetItemData(item);
682 data = new wxPyTreeItemData();
683 data->SetId(item); // set the id
684 self->SetItemData(item, data);
686 return data->GetData();
689 void SetItemPyData(const wxTreeItemId& item, PyObject* obj) {
690 wxPyTreeItemData* data = (wxPyTreeItemData*)self->GetItemData(item);
692 data = new wxPyTreeItemData(obj);
693 data->SetId(item); // set the id
694 self->SetItemData(item, data);
699 %pythoncode { GetPyData = GetItemPyData }
700 %pythoncode { SetPyData = SetItemPyData }
703 // force appearance of [+] button near the item. This is useful to
704 // allow the user to expand the items which don't have any children now
705 // - but instead add them only when needed, thus minimizing memory
706 // usage and loading time.
707 void SetItemHasChildren(const wxTreeItemId& item, bool has = true);
709 // the item will be shown in bold
710 void SetItemBold(const wxTreeItemId& item, bool bold = true);
712 // set the item's text colour
713 void SetItemTextColour(const wxTreeItemId& item, const wxColour& colour);
715 // set the item's background colour
716 void SetItemBackgroundColour(const wxTreeItemId& item,
717 const wxColour& colour);
719 // set the item's font (should be of the same height for all items)
720 void SetItemFont(const wxTreeItemId& item, const wxFont& font);
723 bool GetItemBold(const wxTreeItemId& item) const;
724 wxColour GetItemTextColour(const wxTreeItemId& item) const;
725 wxColour GetItemBackgroundColour(const wxTreeItemId& item) const;
726 wxFont GetItemFont(const wxTreeItemId& item) const;
728 // is the item visible (it might be outside the view or not expanded)?
729 bool IsVisible(const wxTreeItemId& item) const;
731 // does the item has any children?
732 bool ItemHasChildren(const wxTreeItemId& item) const;
734 // is the item expanded (only makes sense if HasChildren())?
735 bool IsExpanded(const wxTreeItemId& item) const;
737 // is this item currently selected (the same as has focus)?
738 bool IsSelected(const wxTreeItemId& item) const;
740 // is item text in bold font?
741 bool IsBold(const wxTreeItemId& item) const;
743 // if 'recursively' is False, only immediate children count, otherwise
744 // the returned number is the number of all items in this branch
745 size_t GetChildrenCount(const wxTreeItemId& item, bool recursively = true);
748 // wxTreeItemId.IsOk() will return False if there is no such item
750 // get the root tree item
751 wxTreeItemId GetRootItem() const;
753 // get the item currently selected (may return NULL if no selection)
754 wxTreeItemId GetSelection() const;
756 // get the items currently selected, return the number of such item
757 //size_t GetSelections(wxArrayTreeItemIds&) const;
759 PyObject* GetSelections() {
760 bool blocked = wxPyBeginBlockThreads();
761 PyObject* rval = PyList_New(0);
762 wxArrayTreeItemIds array;
764 num = self->GetSelections(array);
765 for (x=0; x < num; x++) {
766 wxTreeItemId *tii = new wxTreeItemId(array.Item(x));
767 PyObject* item = wxPyConstructObject((void*)tii, wxT("wxTreeItemId"), true);
768 PyList_Append(rval, item);
770 wxPyEndBlockThreads(blocked);
776 // get the parent of this item (may return NULL if root)
777 wxTreeItemId GetItemParent(const wxTreeItemId& item) const;
779 // for this enumeration function you must pass in a "cookie" parameter
780 // which is opaque for the application but is necessary for the library
781 // to make these functions reentrant (i.e. allow more than one
782 // enumeration on one and the same object simultaneously). Of course,
783 // the "cookie" passed to GetFirstChild() and GetNextChild() should be
787 // NOTE: These are a copy of the same methods in _treectrl.i, be sure to
788 // update both at the same time. (Or find a good way to refactor!)
790 // Get the first child of this item. Returns a wxTreeItemId and an
791 // opaque "cookie" value that should be passed to GetNextChild in
792 // order to continue the search.
793 PyObject* GetFirstChild(const wxTreeItemId& item) {
795 wxTreeItemId* ritem = new wxTreeItemId(self->GetFirstChild(item, cookie));
796 bool blocked = wxPyBeginBlockThreads();
797 PyObject* tup = PyTuple_New(2);
798 PyTuple_SET_ITEM(tup, 0, wxPyConstructObject(ritem, wxT("wxTreeItemId"), true));
799 PyTuple_SET_ITEM(tup, 1, wxPyMakeSwigPtr(cookie, wxT("void")));
800 wxPyEndBlockThreads(blocked);
805 // Get the next child of this item. The cookie parameter is the 2nd
806 // value returned from GetFirstChild or the previous GetNextChild.
807 // Returns a wxTreeItemId and an opaque "cookie" value that should be
808 // passed to GetNextChild in order to continue the search.
809 PyObject* GetNextChild(const wxTreeItemId& item, void* cookie) {
810 wxTreeItemId* ritem = new wxTreeItemId(self->GetNextChild(item, cookie));
811 bool blocked = wxPyBeginBlockThreads();
812 PyObject* tup = PyTuple_New(2);
813 PyTuple_SET_ITEM(tup, 0, wxPyConstructObject(ritem, wxT("wxTreeItemId"), true));
814 PyTuple_SET_ITEM(tup, 1, wxPyMakeSwigPtr(cookie, wxT("void")));
815 wxPyEndBlockThreads(blocked);
820 // TODO: GetPrevChild
824 // get the last child of this item - this method doesn't use cookies
825 wxTreeItemId GetLastChild(const wxTreeItemId& item) const;
827 // get the next sibling of this item
828 wxTreeItemId GetNextSibling(const wxTreeItemId& item) const;
830 // get the previous sibling
831 wxTreeItemId GetPrevSibling(const wxTreeItemId& item) const;
833 // get first visible item
834 wxTreeItemId GetFirstVisibleItem() const;
836 // get the next visible item: item must be visible itself!
837 // see IsVisible() and wxTreeCtrl::GetFirstVisibleItem()
838 wxTreeItemId GetNextVisible(const wxTreeItemId& item) const;
840 // get the previous visible item: item must be visible itself!
841 wxTreeItemId GetPrevVisible(const wxTreeItemId& item) const;
843 // Only for internal use right now, but should probably be public
844 wxTreeItemId GetNext(const wxTreeItemId& item) const;
847 // add the root node to the tree
848 wxTreeItemId AddRoot(const wxString& text,
849 int image = -1, int selectedImage = -1,
850 wxPyTreeItemData *data = NULL);
852 // insert a new item in as the first child of the parent
853 wxTreeItemId PrependItem(const wxTreeItemId& parent,
854 const wxString& text,
855 int image = -1, int selectedImage = -1,
856 wxPyTreeItemData *data = NULL);
858 // insert a new item after a given one
859 wxTreeItemId InsertItem(const wxTreeItemId& parent,
860 const wxTreeItemId& idPrevious,
861 const wxString& text,
862 int image = -1, int selectedImage = -1,
863 wxPyTreeItemData *data = NULL);
865 // insert a new item before the one with the given index
866 %Rename(InsertItemBefore,
867 wxTreeItemId, InsertItem(const wxTreeItemId& parent,
869 const wxString& text,
870 int image = -1, int selectedImage = -1,
871 wxPyTreeItemData *data = NULL));
873 // insert a new item in as the last child of the parent
874 wxTreeItemId AppendItem(const wxTreeItemId& parent,
875 const wxString& text,
876 int image = -1, int selectedImage = -1,
877 wxPyTreeItemData *data = NULL);
879 // delete this item and associated data if any
880 void Delete(const wxTreeItemId& item);
882 // delete all children (but don't delete the item itself)
883 // NB: this won't send wxEVT_COMMAND_TREE_ITEM_DELETED events
884 void DeleteChildren(const wxTreeItemId& item);
886 // delete all items from the tree
887 // NB: this won't send wxEVT_COMMAND_TREE_ITEM_DELETED events
888 void DeleteAllItems();
891 void Expand(const wxTreeItemId& item);
893 // expand this item and all subitems recursively
894 void ExpandAll(const wxTreeItemId& item);
896 // collapse the item without removing its children
897 void Collapse(const wxTreeItemId& item);
899 // collapse the item and remove all children
900 void CollapseAndReset(const wxTreeItemId& item);
902 // toggles the current state
903 void Toggle(const wxTreeItemId& item);
905 // remove the selection from currently selected item (if any)
910 void SelectItem(const wxTreeItemId& item, bool unselect_others=true,
911 bool extended_select=false);
913 void SelectAll(bool extended_select=false);
915 // make sure this item is visible (expanding the parent item and/or
916 // scrolling to this item if necessary)
917 void EnsureVisible(const wxTreeItemId& item);
919 // scroll to this item (but don't expand its parent)
920 void ScrollTo(const wxTreeItemId& item);
922 // Returns wxTreeItemId, flags, and column
923 wxTreeItemId HitTest(const wxPoint& point, int& OUTPUT, int& OUTPUT);
926 // get the bounding rectangle of the item (or of its label only)
927 PyObject* GetBoundingRect(const wxTreeItemId& item, bool textOnly = false) {
929 if (self->GetBoundingRect(item, rect, textOnly)) {
930 bool blocked = wxPyBeginBlockThreads();
931 wxRect* r = new wxRect(rect);
932 PyObject* val = wxPyConstructObject((void*)r, wxT("wxRect"), 1);
933 wxPyEndBlockThreads(blocked);
943 // Start editing the item label: this (temporarily) replaces the item
944 // with a one line edit control. The item will be selected if it hadn't
946 void EditLabel( const wxTreeItemId& item );
947 void Edit( const wxTreeItemId& item );
949 // sort the children of this item using OnCompareItems
950 void SortChildren(const wxTreeItemId& item);
953 wxTreeItemId FindItem (const wxTreeItemId& item, const wxString& str, int flags = 0);
955 wxWindow* GetHeaderWindow() const;
956 wxScrolledWindow* GetMainWindow() const;
963 //----------------------------------------------------------------------
964 //----------------------------------------------------------------------
968 wxPyPtrTypeMap_Add("wxTreeCompanionWindow", "wxPyTreeCompanionWindow");
969 wxPyPtrTypeMap_Add("wxTreeListCtrl", "wxPyTreeListCtrl");
973 %pragma(python) include="_gizmoextras.py";
975 //----------------------------------------------------------------------
976 //----------------------------------------------------------------------