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     %name(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 %name(TreeCompanionWindow) class wxPyTreeCompanionWindow: public wxWindow
 
 311     %pythonAppend wxPyTreeCompanionWindow         "self._setOORInfo(self);self._setCallbackInfo(self, TreeCompanionWindow)"
 
 312     %pythonAppend wxPyTreeCompanionWindow()       ""
 
 314     wxPyTreeCompanionWindow(wxWindow* parent, wxWindowID id = -1,
 
 315                             const wxPoint& pos = wxDefaultPosition,
 
 316                             const wxSize& size = wxDefaultSize,
 
 318     void _setCallbackInfo(PyObject* self, PyObject* _class);
 
 320     wxRemotelyScrolledTreeCtrl* GetTreeCtrl() const;
 
 321     void SetTreeCtrl(wxRemotelyScrolledTreeCtrl* treeCtrl);
 
 327  * wxThinSplitterWindow
 
 329  * Implements a splitter with a less obvious sash
 
 330  * than the usual one.
 
 333 MustHaveApp(wxThinSplitterWindow);
 
 335 class wxThinSplitterWindow: public wxSplitterWindow
 
 338     %pythonAppend wxThinSplitterWindow         "self._setOORInfo(self)"
 
 339     %pythonAppend wxThinSplitterWindow()       ""
 
 341     wxThinSplitterWindow(wxWindow* parent, wxWindowID id = -1,
 
 342                          const wxPoint& pos = wxDefaultPosition,
 
 343                          const wxSize& size = wxDefaultSize,
 
 344                          long style = wxSP_3D | wxCLIP_CHILDREN);
 
 350  * wxSplitterScrolledWindow
 
 352  * This scrolled window is aware of the fact that one of its
 
 353  * children is a splitter window. It passes on its scroll events
 
 354  * (after some processing) to both splitter children for them
 
 355  * scroll appropriately.
 
 358 MustHaveApp(wxSplitterScrolledWindow);
 
 360 class wxSplitterScrolledWindow: public wxScrolledWindow
 
 363     %pythonAppend wxSplitterScrolledWindow         "self._setOORInfo(self)"
 
 364     %pythonAppend wxSplitterScrolledWindow()       ""
 
 366     wxSplitterScrolledWindow(wxWindow* parent, wxWindowID id = -1,
 
 367                              const wxPoint& pos = wxDefaultPosition,
 
 368                              const wxSize& size = wxDefaultSize,
 
 373 //---------------------------------------------------------------------------
 
 374 //---------------------------------------------------------------------------
 
 389 MustHaveApp(wxLEDNumberCtrl);
 
 391 class wxLEDNumberCtrl : public wxControl
 
 394     %pythonAppend wxLEDNumberCtrl         "self._setOORInfo(self)"
 
 395     %pythonAppend wxLEDNumberCtrl()       ""
 
 397     wxLEDNumberCtrl(wxWindow *parent, wxWindowID id = -1,
 
 398                     const wxPoint& pos = wxDefaultPosition,
 
 399                     const wxSize& size = wxDefaultSize,
 
 400                     long style =  wxLED_ALIGN_LEFT | wxLED_DRAW_FADED);
 
 401     %name(PreLEDNumberCtrl) wxLEDNumberCtrl();
 
 403     bool Create(wxWindow *parent, wxWindowID id = -1,
 
 404                     const wxPoint& pos = wxDefaultPosition,
 
 405                     const wxSize& size = wxDefaultSize,
 
 406                     long style = wxLED_ALIGN_LEFT | wxLED_DRAW_FADED);
 
 408     wxLEDValueAlign GetAlignment() const;
 
 409     bool GetDrawFaded() const;
 
 410     const wxString &GetValue() const;
 
 412     void SetAlignment(wxLEDValueAlign Alignment, bool Redraw = true);
 
 413     void SetDrawFaded(bool DrawFaded, bool Redraw = true);
 
 414     void SetValue(const wxString &Value, bool Redraw = true);
 
 420 //----------------------------------------------------------------------------
 
 421 // wxTreeListCtrl - the multicolumn tree control
 
 422 //----------------------------------------------------------------------------
 
 424 enum wxTreeListColumnAlign {
 
 433     wxTREE_HITTEST_ONITEMCOLUMN
 
 438     // flags for FindItem
 
 450 %pythoncode { wx.TR_DONT_ADJUST_MAC = TR_DONT_ADJUST_MAC }
 
 453 class wxTreeListColumnInfo: public wxObject {
 
 455     wxTreeListColumnInfo(const wxString& text = wxPyEmptyString,
 
 459                          wxTreeListColumnAlign alignment = wxTL_ALIGN_LEFT);
 
 461     bool GetShown() const;
 
 462     wxTreeListColumnAlign GetAlignment() const;
 
 463     wxString GetText() const;
 
 464     int GetImage() const;
 
 465     int GetSelectedImage() const;
 
 466     size_t GetWidth() const;
 
 468     // TODO:  These all actually return wxTreeListColumnInfo&, any problem with doing it for Python too?
 
 469     void SetShown(bool shown);
 
 470     void SetAlignment(wxTreeListColumnAlign alignment);
 
 471     void SetText(const wxString& text);
 
 472     void SetImage(int image);
 
 473     void SetSelectedImage(int image);
 
 474     void SetWidth(size_t with);
 
 480 %{ // C++ version of Python aware control
 
 481 class wxPyTreeListCtrl : public wxTreeListCtrl {
 
 482     DECLARE_ABSTRACT_CLASS(wxPyTreeListCtrl);
 
 484     wxPyTreeListCtrl() : wxTreeListCtrl() {}
 
 485     wxPyTreeListCtrl(wxWindow *parent, wxWindowID id,
 
 489                      const wxValidator &validator,
 
 490                      const wxString& name) :
 
 491         wxTreeListCtrl(parent, id, pos, size, style, validator, name) {}
 
 493     int OnCompareItems(const wxTreeItemId& item1,
 
 494                        const wxTreeItemId& item2) {
 
 497         bool blocked = wxPyBeginBlockThreads();
 
 498         if ((found = wxPyCBH_findCallback(m_myInst, "OnCompareItems"))) {
 
 499             PyObject *o1 = wxPyConstructObject((void*)&item1, wxT("wxTreeItemId"), 0);
 
 500             PyObject *o2 = wxPyConstructObject((void*)&item2, wxT("wxTreeItemId"), 0);
 
 501             rval = wxPyCBH_callCallback(m_myInst, Py_BuildValue("(OO)",o1,o2));
 
 505         wxPyEndBlockThreads(blocked);
 
 507             rval = wxTreeListCtrl::OnCompareItems(item1, item2);
 
 513 IMPLEMENT_ABSTRACT_CLASS(wxPyTreeListCtrl, wxTreeListCtrl)
 
 522 MustHaveApp(wxPyTreeListCtrl);
 
 524 %name(TreeListCtrl) class wxPyTreeListCtrl : public wxControl
 
 527     %pythonAppend wxPyTreeListCtrl         "self._setOORInfo(self);self._setCallbackInfo(self, TreeListCtrl)"
 
 528     %pythonAppend wxPyTreeListCtrl()       ""
 
 530     wxPyTreeListCtrl(wxWindow *parent, wxWindowID id = -1,
 
 531                    const wxPoint& pos = wxDefaultPosition,
 
 532                    const wxSize& size = wxDefaultSize,
 
 533                    long style = wxTR_DEFAULT_STYLE,
 
 534                    const wxValidator &validator = wxDefaultValidator,
 
 535                    const wxString& name = wxPyTreeListCtrlNameStr );
 
 536     %name(PreTreeListCtrl)wxPyTreeListCtrl();
 
 538     bool Create(wxWindow *parent, wxWindowID id = -1,
 
 539                 const wxPoint& pos = wxDefaultPosition,
 
 540                 const wxSize& size = wxDefaultSize,
 
 541                 long style = wxTR_DEFAULT_STYLE,
 
 542                 const wxValidator &validator = wxDefaultValidator,
 
 543                 const wxString& name = wxPyTreeListCtrlNameStr );
 
 545     void _setCallbackInfo(PyObject* self, PyObject* _class);
 
 548     // get the total number of items in the control
 
 549     size_t GetCount() const;
 
 551     // indent is the number of pixels the children are indented relative to
 
 552     // the parents position. SetIndent() also redraws the control
 
 554     unsigned int GetIndent() const;
 
 555     void SetIndent(unsigned int indent);
 
 557     // line spacing is the space above and below the text on each line
 
 558     unsigned int GetLineSpacing() const;
 
 559     void SetLineSpacing(unsigned int spacing);
 
 561     // image list: these functions allow to associate an image list with
 
 562     // the control and retrieve it. Note that when assigned with
 
 563     // SetImageList, the control does _not_ delete
 
 564     // the associated image list when it's deleted in order to allow image
 
 565     // lists to be shared between different controls. If you use
 
 566     // AssignImageList, the control _does_ delete the image list.
 
 568     // The normal image list is for the icons which correspond to the
 
 569     // normal tree item state (whether it is selected or not).
 
 570     // Additionally, the application might choose to show a state icon
 
 571     // which corresponds to an app-defined item state (for example,
 
 572     // checked/unchecked) which are taken from the state image list.
 
 573     wxImageList *GetImageList() const;
 
 574     wxImageList *GetStateImageList() const;
 
 575     wxImageList *GetButtonsImageList() const;
 
 577     void SetImageList(wxImageList *imageList);
 
 578     void SetStateImageList(wxImageList *imageList);
 
 579     void SetButtonsImageList(wxImageList *imageList);
 
 581     %apply SWIGTYPE *DISOWN { wxImageList *imageList };
 
 582     void AssignImageList(wxImageList *imageList);
 
 583     void AssignStateImageList(wxImageList *imageList);
 
 584     void AssignButtonsImageList(wxImageList *imageList);
 
 585     %clear wxImageList *imageList;
 
 589     void AddColumn(const wxString& text);
 
 590 //     void AddColumn(const wxString& text,
 
 592 //                    wxTreeListColumnAlign alignment = wxTL_ALIGN_LEFT);
 
 593     %name(AddColumnInfo) void AddColumn(const wxTreeListColumnInfo& col);
 
 595     // inserts a column before the given one
 
 596     void InsertColumn(size_t before, const wxString& text);
 
 597     %name(InsertColumnInfo) void InsertColumn(size_t before, const wxTreeListColumnInfo& col);
 
 599     // deletes the given column - does not delete the corresponding column
 
 601     void RemoveColumn(size_t column);
 
 603     // returns the number of columns in the ctrl
 
 604     size_t GetColumnCount() const;
 
 606     void SetColumnWidth(size_t column, size_t width);
 
 607     int GetColumnWidth(size_t column) const;
 
 609     // tells which column is the "main" one, i.e. the "threaded" one
 
 610     void SetMainColumn(size_t column);
 
 611     size_t GetMainColumn() const;
 
 613     void SetColumnText(size_t column, const wxString& text);
 
 614     wxString GetColumnText(size_t column) const;
 
 616     void SetColumn(size_t column, const wxTreeListColumnInfo& info);
 
 617     wxTreeListColumnInfo& GetColumn(size_t column);
 
 619     // other column-related methods
 
 620     void SetColumnAlignment(size_t column, wxTreeListColumnAlign align);
 
 621     wxTreeListColumnAlign GetColumnAlignment(size_t column) const;
 
 623     void SetColumnImage(size_t column, int image);
 
 624     int GetColumnImage(size_t column) const;
 
 626     void ShowColumn(size_t column, bool shown);
 
 627     bool IsColumnShown(size_t column) const;
 
 630         // retrieves item's label of the given column (main column by default)
 
 631         wxString GetItemText(const wxTreeItemId& item, int column = -1) {
 
 632             if (column < 0) column = self->GetMainColumn();
 
 633             return self->GetItemText(item, column);
 
 636         // get one of the images associated with the item (normal by default)
 
 637         int GetItemImage(const wxTreeItemId& item, int column = -1,
 
 638                          wxTreeItemIcon which = wxTreeItemIcon_Normal) {
 
 639             if (column < 0) column = self->GetMainColumn();
 
 640             return self->GetItemImage(item, column, which);
 
 643         // set item's label (main column by default)
 
 644         void SetItemText(const wxTreeItemId& item, const wxString& text, int column = -1) {
 
 645             if (column < 0) column = self->GetMainColumn();
 
 646             self->SetItemText(item, column, text);
 
 649         // set one of the images associated with the item (normal by default)
 
 650         // the which parameter is ignored for all columns but the main one
 
 651         void SetItemImage(const wxTreeItemId& item, int image, int column = -1,
 
 652                           wxTreeItemIcon which = wxTreeItemIcon_Normal) {
 
 653             if (column < 0) column = self->GetMainColumn();
 
 654             self->SetItemImage(item, column, image, which);
 
 658         // [Get|Set]ItemData substitutes.  Automatically create wxPyTreeItemData
 
 660         wxPyTreeItemData* GetItemData(const wxTreeItemId& item) {
 
 661             wxPyTreeItemData* data = (wxPyTreeItemData*)self->GetItemData(item);
 
 663                 data = new wxPyTreeItemData();
 
 664                 data->SetId(item); // set the id
 
 665                 self->SetItemData(item, data);
 
 670         void SetItemData(const wxTreeItemId& item, wxPyTreeItemData* data) {
 
 671             data->SetId(item); // set the id
 
 672             self->SetItemData(item, data);
 
 675         // [Get|Set]ItemPyData are short-cuts.  Also made somewhat crash-proof by
 
 676         // automatically creating data classes.
 
 677         PyObject* GetItemPyData(const wxTreeItemId& item) {
 
 678             wxPyTreeItemData* data = (wxPyTreeItemData*)self->GetItemData(item);
 
 680                 data = new wxPyTreeItemData();
 
 681                 data->SetId(item); // set the id
 
 682                 self->SetItemData(item, data);
 
 684             return data->GetData();
 
 687         void SetItemPyData(const wxTreeItemId& item, PyObject* obj) {
 
 688             wxPyTreeItemData* data = (wxPyTreeItemData*)self->GetItemData(item);
 
 690                 data = new wxPyTreeItemData(obj);
 
 691                 data->SetId(item); // set the id
 
 692                 self->SetItemData(item, data);
 
 697     %pythoncode { GetPyData = GetItemPyData }
 
 698     %pythoncode { SetPyData = SetItemPyData }
 
 701     // force appearance of [+] button near the item. This is useful to
 
 702     // allow the user to expand the items which don't have any children now
 
 703     // - but instead add them only when needed, thus minimizing memory
 
 704     // usage and loading time.
 
 705     void SetItemHasChildren(const wxTreeItemId& item, bool has = true);
 
 707     // the item will be shown in bold
 
 708     void SetItemBold(const wxTreeItemId& item, bool bold = true);
 
 710     // set the item's text colour
 
 711     void SetItemTextColour(const wxTreeItemId& item, const wxColour& colour);
 
 713     // set the item's background colour
 
 714     void SetItemBackgroundColour(const wxTreeItemId& item,
 
 715                                  const wxColour& colour);
 
 717     // set the item's font (should be of the same height for all items)
 
 718     void SetItemFont(const wxTreeItemId& item, const wxFont& font);
 
 721     bool GetItemBold(const wxTreeItemId& item) const;
 
 722     wxColour GetItemTextColour(const wxTreeItemId& item) const;
 
 723     wxColour GetItemBackgroundColour(const wxTreeItemId& item) const;
 
 724     wxFont GetItemFont(const wxTreeItemId& item) const;
 
 726     // is the item visible (it might be outside the view or not expanded)?
 
 727     bool IsVisible(const wxTreeItemId& item) const;
 
 729     // does the item has any children?
 
 730     bool ItemHasChildren(const wxTreeItemId& item) const;
 
 732     // is the item expanded (only makes sense if HasChildren())?
 
 733     bool IsExpanded(const wxTreeItemId& item) const;
 
 735     // is this item currently selected (the same as has focus)?
 
 736     bool IsSelected(const wxTreeItemId& item) const;
 
 738     // is item text in bold font?
 
 739     bool IsBold(const wxTreeItemId& item) const;
 
 741     // if 'recursively' is False, only immediate children count, otherwise
 
 742     // the returned number is the number of all items in this branch
 
 743     size_t GetChildrenCount(const wxTreeItemId& item, bool recursively = true);
 
 746     // wxTreeItemId.IsOk() will return False if there is no such item
 
 748     // get the root tree item
 
 749     wxTreeItemId GetRootItem() const;
 
 751     // get the item currently selected (may return NULL if no selection)
 
 752     wxTreeItemId GetSelection() const;
 
 754     // get the items currently selected, return the number of such item
 
 755     //size_t GetSelections(wxArrayTreeItemIds&) const;
 
 757         PyObject* GetSelections() {
 
 758             bool blocked = wxPyBeginBlockThreads();
 
 759             PyObject*           rval = PyList_New(0);
 
 760             wxArrayTreeItemIds  array;
 
 762             num = self->GetSelections(array);
 
 763             for (x=0; x < num; x++) {
 
 764                 wxTreeItemId *tii = new wxTreeItemId(array.Item(x));
 
 765                 PyObject* item = wxPyConstructObject((void*)tii, wxT("wxTreeItemId"), true);
 
 766                 PyList_Append(rval, item);
 
 768             wxPyEndBlockThreads(blocked);
 
 774     // get the parent of this item (may return NULL if root)
 
 775     wxTreeItemId GetItemParent(const wxTreeItemId& item) const;
 
 777     // for this enumeration function you must pass in a "cookie" parameter
 
 778     // which is opaque for the application but is necessary for the library
 
 779     // to make these functions reentrant (i.e. allow more than one
 
 780     // enumeration on one and the same object simultaneously). Of course,
 
 781     // the "cookie" passed to GetFirstChild() and GetNextChild() should be
 
 785     // NOTE: These are a copy of the same methods in _treectrl.i, be sure to
 
 786     // update both at the same time.  (Or find a good way to refactor!)
 
 788         // Get the first child of this item.  Returns a wxTreeItemId and an
 
 789         // opaque "cookie" value that should be passed to GetNextChild in
 
 790         // order to continue the search.
 
 791         PyObject* GetFirstChild(const wxTreeItemId& item) {
 
 793             wxTreeItemId* ritem = new wxTreeItemId(self->GetFirstChild(item, cookie));
 
 794             bool blocked = wxPyBeginBlockThreads();
 
 795             PyObject* tup = PyTuple_New(2);
 
 796             PyTuple_SET_ITEM(tup, 0, wxPyConstructObject(ritem, wxT("wxTreeItemId"), true));
 
 797             PyTuple_SET_ITEM(tup, 1, wxPyMakeSwigPtr(cookie, wxT("void")));
 
 798             wxPyEndBlockThreads(blocked);
 
 803         // Get the next child of this item.  The cookie parameter is the 2nd
 
 804         // value returned from GetFirstChild or the previous GetNextChild.
 
 805         // Returns a wxTreeItemId and an opaque "cookie" value that should be
 
 806         // passed to GetNextChild in order to continue the search.
 
 807         PyObject* GetNextChild(const wxTreeItemId& item, void* cookie) {
 
 808             wxTreeItemId* ritem = new wxTreeItemId(self->GetNextChild(item, cookie));
 
 809             bool blocked = wxPyBeginBlockThreads();
 
 810             PyObject* tup = PyTuple_New(2);
 
 811             PyTuple_SET_ITEM(tup, 0, wxPyConstructObject(ritem, wxT("wxTreeItemId"), true));
 
 812             PyTuple_SET_ITEM(tup, 1, wxPyMakeSwigPtr(cookie, wxT("void")));
 
 813             wxPyEndBlockThreads(blocked);
 
 818         // TODO:  GetPrevChild
 
 822     // get the last child of this item - this method doesn't use cookies
 
 823     wxTreeItemId GetLastChild(const wxTreeItemId& item) const;
 
 825     // get the next sibling of this item
 
 826     wxTreeItemId GetNextSibling(const wxTreeItemId& item) const;
 
 828     // get the previous sibling
 
 829     wxTreeItemId GetPrevSibling(const wxTreeItemId& item) const;
 
 831     // get first visible item
 
 832     wxTreeItemId GetFirstVisibleItem() const;
 
 834     // get the next visible item: item must be visible itself!
 
 835     // see IsVisible() and wxTreeCtrl::GetFirstVisibleItem()
 
 836     wxTreeItemId GetNextVisible(const wxTreeItemId& item) const;
 
 838     // get the previous visible item: item must be visible itself!
 
 839     wxTreeItemId GetPrevVisible(const wxTreeItemId& item) const;
 
 841     // Only for internal use right now, but should probably be public
 
 842     wxTreeItemId GetNext(const wxTreeItemId& item) const;
 
 845     // add the root node to the tree
 
 846     wxTreeItemId AddRoot(const wxString& text,
 
 847                          int image = -1, int selectedImage = -1,
 
 848                          wxPyTreeItemData *data = NULL);
 
 850     // insert a new item in as the first child of the parent
 
 851     wxTreeItemId PrependItem(const wxTreeItemId& parent,
 
 852                              const wxString& text,
 
 853                              int image = -1, int selectedImage = -1,
 
 854                              wxPyTreeItemData *data = NULL);
 
 856     // insert a new item after a given one
 
 857     wxTreeItemId InsertItem(const wxTreeItemId& parent,
 
 858                             const wxTreeItemId& idPrevious,
 
 859                             const wxString& text,
 
 860                             int image = -1, int selectedImage = -1,
 
 861                             wxPyTreeItemData *data = NULL);
 
 863     // insert a new item before the one with the given index
 
 864     %name(InsertItemBefore)
 
 865         wxTreeItemId InsertItem(const wxTreeItemId& parent,
 
 867                                 const wxString& text,
 
 868                                 int image = -1, int selectedImage = -1,
 
 869                                 wxPyTreeItemData *data = NULL);
 
 871     // insert a new item in as the last child of the parent
 
 872     wxTreeItemId AppendItem(const wxTreeItemId& parent,
 
 873                             const wxString& text,
 
 874                             int image = -1, int selectedImage = -1,
 
 875                             wxPyTreeItemData *data = NULL);
 
 877     // delete this item and associated data if any
 
 878     void Delete(const wxTreeItemId& item);
 
 880     // delete all children (but don't delete the item itself)
 
 881     // NB: this won't send wxEVT_COMMAND_TREE_ITEM_DELETED events
 
 882     void DeleteChildren(const wxTreeItemId& item);
 
 884     // delete all items from the tree
 
 885     // NB: this won't send wxEVT_COMMAND_TREE_ITEM_DELETED events
 
 886     void DeleteAllItems();
 
 889     void Expand(const wxTreeItemId& item);
 
 891     // expand this item and all subitems recursively
 
 892     void ExpandAll(const wxTreeItemId& item);
 
 894     // collapse the item without removing its children
 
 895     void Collapse(const wxTreeItemId& item);
 
 897     // collapse the item and remove all children
 
 898     void CollapseAndReset(const wxTreeItemId& item);
 
 900     // toggles the current state
 
 901     void Toggle(const wxTreeItemId& item);
 
 903     // remove the selection from currently selected item (if any)
 
 908     void SelectItem(const wxTreeItemId& item, bool unselect_others=true,
 
 909                     bool extended_select=false);
 
 911     void SelectAll(bool extended_select=false);
 
 913     // make sure this item is visible (expanding the parent item and/or
 
 914     // scrolling to this item if necessary)
 
 915     void EnsureVisible(const wxTreeItemId& item);
 
 917     // scroll to this item (but don't expand its parent)
 
 918     void ScrollTo(const wxTreeItemId& item);
 
 920     // Returns wxTreeItemId, flags, and column
 
 921     wxTreeItemId HitTest(const wxPoint& point, int& OUTPUT, int& OUTPUT);
 
 924         // get the bounding rectangle of the item (or of its label only)
 
 925         PyObject* GetBoundingRect(const wxTreeItemId& item, bool textOnly = false) {
 
 927             if (self->GetBoundingRect(item, rect, textOnly)) {
 
 928                 bool blocked = wxPyBeginBlockThreads();
 
 929                 wxRect* r = new wxRect(rect);
 
 930                 PyObject* val = wxPyConstructObject((void*)r, wxT("wxRect"), 1);
 
 931                 wxPyEndBlockThreads(blocked);
 
 941     // Start editing the item label: this (temporarily) replaces the item
 
 942     // with a one line edit control. The item will be selected if it hadn't
 
 944     void EditLabel( const wxTreeItemId& item );
 
 945     void Edit( const wxTreeItemId& item );
 
 947     // sort the children of this item using OnCompareItems
 
 948     void SortChildren(const wxTreeItemId& item);
 
 951     wxTreeItemId FindItem (const wxTreeItemId& item, const wxString& str, int flags = 0);
 
 953     wxWindow* GetHeaderWindow() const;
 
 954     wxScrolledWindow* GetMainWindow() const;
 
 961 //----------------------------------------------------------------------
 
 962 //----------------------------------------------------------------------
 
 966     wxPyPtrTypeMap_Add("wxTreeCompanionWindow", "wxPyTreeCompanionWindow");
 
 967     wxPyPtrTypeMap_Add("wxTreeListCtrl", "wxPyTreeListCtrl");
 
 971 %pragma(python) include="_gizmoextras.py";
 
 973 //----------------------------------------------------------------------
 
 974 //----------------------------------------------------------------------