]> git.saurik.com Git - wxWidgets.git/blobdiff - wxPython/src/_treectrl.i
fixed wxString iterators linked list corruption
[wxWidgets.git] / wxPython / src / _treectrl.i
index 616322344c0d3819dd3d81dce163c761d52a0059..d992e451b68f5fabbb771a2a7483d7ce3032698c 100644 (file)
@@ -46,10 +46,13 @@ enum {
     wxTR_DEFAULT_STYLE,
 
     wxTR_TWIST_BUTTONS,
-    wxTR_MAC_BUTTONS,
-    wxTR_AQUA_BUTTONS,
 };
 
+%pythoncode {
+    %# obsolete
+    TR_MAC_BUTTONS = 0
+    wxTR_AQUA_BUTTONS = 0
+}
 
 enum wxTreeItemIcon
 {
@@ -82,7 +85,6 @@ enum {
 //---------------------------------------------------------------------------
 %newgroup
 
-typedef void *wxTreeItemIdValue;
 
 // wxTreeItemId identifies an element of the tree. In this implementation, it's
 // just a trivial wrapper around Win32 HTREEITEM or a pointer to some private
@@ -97,18 +99,11 @@ public:
     bool IsOk() const;
 
     %extend {
-        bool operator==(const wxTreeItemId* other) {
-            if (!other) return False;
-            return *self == *other;
-        }
-
-        bool operator!=(const wxTreeItemId* other) {
-            if (!other) return True;
-            return *self != *other;
-        }
+        bool __eq__(const wxTreeItemId* other) { return other ? (*self == *other) : false; }
+        bool __ne__(const wxTreeItemId* other) { return other ? (*self != *other) : true;  }
     }
 
-    wxTreeItemIdValue m_pItem;
+    void*  m_pItem;
 
 
     %pythoncode {
@@ -125,17 +120,23 @@ public:
 // Python code should rarely be neccessary.  Just use the GetItemPyData and
 // SetItemPyData tree methods instead of the GetItemData and SetItemData
 // methods.
-%name(TreeItemData) class wxPyTreeItemData {
+%rename(TreeItemData) wxPyTreeItemData;
+class wxPyTreeItemData {
 public:
     wxPyTreeItemData(PyObject* obj = NULL);
-
+    ~wxPyTreeItemData();
+    
     PyObject* GetData();
     void      SetData(PyObject* obj);
 
     const wxTreeItemId& GetId();
     void                SetId(const wxTreeItemId& id);
 
+    %pythonPrepend Destroy "args[0].this.own(False)"
     %extend { void Destroy() { delete self; } }
+
+    %property(Data, GetData, SetData, doc="See `GetData` and `SetData`");
+    %property(Id, GetId, SetId, doc="See `GetId` and `SetId`");
 };
 
 
@@ -151,7 +152,8 @@ public:
     wxTreeItemAttr(const wxColour& colText = wxNullColour,
                    const wxColour& colBack = wxNullColour,
                    const wxFont& font = wxNullFont);
-
+    ~wxTreeItemAttr();
+    
     // setters
     void SetTextColour(const wxColour& colText);
     void SetBackgroundColour(const wxColour& colBack);
@@ -166,6 +168,7 @@ public:
     wxColour GetBackgroundColour();
     wxFont GetFont();
 
+    %pythonAppend Destroy "args[0].thisown = 0"
     %extend { void Destroy() { delete self; } }
 };
 
@@ -196,10 +199,9 @@ public:
 %constant wxEventType wxEVT_COMMAND_TREE_END_DRAG;
 %constant wxEventType wxEVT_COMMAND_TREE_STATE_IMAGE_CLICK;
 %constant wxEventType wxEVT_COMMAND_TREE_ITEM_GETTOOLTIP;
-
+%constant wxEventType wxEVT_COMMAND_TREE_ITEM_MENU;
 
 %pythoncode {
-
 EVT_TREE_BEGIN_DRAG        = wx.PyEventBinder(wxEVT_COMMAND_TREE_BEGIN_DRAG       , 1)
 EVT_TREE_BEGIN_RDRAG       = wx.PyEventBinder(wxEVT_COMMAND_TREE_BEGIN_RDRAG      , 1)
 EVT_TREE_BEGIN_LABEL_EDIT  = wx.PyEventBinder(wxEVT_COMMAND_TREE_BEGIN_LABEL_EDIT , 1)
@@ -220,9 +222,15 @@ EVT_TREE_ITEM_MIDDLE_CLICK = wx.PyEventBinder(wxEVT_COMMAND_TREE_ITEM_MIDDLE_CLI
 EVT_TREE_END_DRAG          = wx.PyEventBinder(wxEVT_COMMAND_TREE_END_DRAG         , 1)
 EVT_TREE_STATE_IMAGE_CLICK = wx.PyEventBinder(wxEVT_COMMAND_TREE_STATE_IMAGE_CLICK, 1)
 EVT_TREE_ITEM_GETTOOLTIP   = wx.PyEventBinder(wxEVT_COMMAND_TREE_ITEM_GETTOOLTIP,   1)
+EVT_TREE_ITEM_MENU         = wx.PyEventBinder(wxEVT_COMMAND_TREE_ITEM_MENU,         1)
 }
 
 
+%{
+    static wxTreeItemId wxNullTreeItemId;
+%}
+wxTreeItemId wxNullTreeItemId;
+
 
 // wxTreeEvent is a special class for all events associated with tree controls
 //
@@ -230,7 +238,11 @@ EVT_TREE_ITEM_GETTOOLTIP   = wx.PyEventBinder(wxEVT_COMMAND_TREE_ITEM_GETTOOLTIP
 //     descriptions below
 class wxTreeEvent : public wxNotifyEvent {
 public:
+    %nokwargs wxTreeEvent;
     wxTreeEvent(wxEventType commandType = wxEVT_NULL, int id = 0);
+    wxTreeEvent(wxEventType   commandType,
+                wxPyTreeCtrl* tree,
+                wxTreeItemId& item = wxNullTreeItemId);
 
         // get the item on which the operation was performed or the newly
         // selected item for wxEVT_COMMAND_TREE_SEL_CHANGED/ING events
@@ -262,6 +274,16 @@ public:
 
         // Set the tooltip for the item (for EVT_TREE_ITEM_GETTOOLTIP events)
     void SetToolTip(const wxString& toolTip);
+    wxString GetToolTip();
+
+    %property(Item, GetItem, SetItem, doc="See `GetItem` and `SetItem`");
+    %property(KeyCode, GetKeyCode, doc="See `GetKeyCode`");
+    %property(KeyEvent, GetKeyEvent, SetKeyEvent, doc="See `GetKeyEvent` and `SetKeyEvent`");
+    %property(Label, GetLabel, SetLabel, doc="See `GetLabel` and `SetLabel`");
+    %property(OldItem, GetOldItem, SetOldItem, doc="See `GetOldItem` and `SetOldItem`");
+    %property(Point, GetPoint, SetPoint, doc="See `GetPoint` and `SetPoint`");
+    %property(ToolTip, GetToolTip, SetToolTip, doc="See `GetToolTip` and `SetToolTip`");
+    %property(EditCancelled, IsEditCancelled, SetEditCanceled, doc="See `IsEditCancelled` and `SetEditCanceled`");
 };
 
 //---------------------------------------------------------------------------
@@ -269,7 +291,7 @@ public:
 
 %{ // C++ version of Python aware wxTreeCtrl
 class wxPyTreeCtrl : public wxTreeCtrl {
-    DECLARE_ABSTRACT_CLASS(wxPyTreeCtrl);
+    DECLARE_ABSTRACT_CLASS(wxPyTreeCtrl)
 public:
     wxPyTreeCtrl() : wxTreeCtrl() {}
     wxPyTreeCtrl(wxWindow *parent, wxWindowID id,
@@ -294,15 +316,15 @@ public:
                        const wxTreeItemId& item2) {
         int rval = 0;
         bool found;
-        wxPyBeginBlockThreads();
+        wxPyBlock_t blocked = wxPyBeginBlockThreads();
         if ((found = wxPyCBH_findCallback(m_myInst, "OnCompareItems"))) {
-            PyObject *o1 = wxPyConstructObject((void*)&item1, wxT("wxTreeItemId"), False);
-            PyObject *o2 = wxPyConstructObject((void*)&item2, wxT("wxTreeItemId"), False);
+            PyObject *o1 = wxPyConstructObject((void*)&item1, wxT("wxTreeItemId"), false);
+            PyObject *o2 = wxPyConstructObject((void*)&item2, wxT("wxTreeItemId"), false);
             rval = wxPyCBH_callCallback(m_myInst, Py_BuildValue("(OO)",o1,o2));
             Py_DECREF(o1);
             Py_DECREF(o2);
         }
-        wxPyEndBlockThreads();
+        wxPyEndBlockThreads(blocked);
         if (! found)
             rval = wxTreeCtrl::OnCompareItems(item1, item2);
         return rval;
@@ -317,10 +339,14 @@ IMPLEMENT_ABSTRACT_CLASS(wxPyTreeCtrl, wxTreeCtrl);
 
 
  
-%name(TreeCtrl)class wxPyTreeCtrl : public wxControl {
+MustHaveApp(wxPyTreeCtrl);
+
+%rename(TreeCtrl) wxPyTreeCtrl;
+class wxPyTreeCtrl : public wxControl {
 public:
-    %addtofunc wxPyTreeCtrl         "self._setOORInfo(self);self._setCallbackInfo(self, TreeCtrl)"
-    %addtofunc wxPyTreeCtrl()       ""
+    %pythonAppend wxPyTreeCtrl         "self._setOORInfo(self);" setCallbackInfo(TreeCtrl)
+    %pythonAppend wxPyTreeCtrl()       ""
+    %typemap(out) wxPyTreeCtrl*;    // turn off this typemap
    
     wxPyTreeCtrl(wxWindow *parent, wxWindowID id = -1,
                  const wxPoint& pos = wxDefaultPosition,
@@ -328,7 +354,10 @@ public:
                  long style = wxTR_DEFAULT_STYLE,
                  const wxValidator& validator = wxDefaultValidator,
                  const wxString& name = wxPyTreeCtrlNameStr);
-    %name(PreTreeCtrl)wxPyTreeCtrl();
+    %RenameCtor(PreTreeCtrl, wxPyTreeCtrl());
+
+    // Turn it back on again
+    %typemap(out) wxPyTreeCtrl* { $result = wxPyMake_wxObject($1, $owner); }
 
     bool Create(wxWindow *parent, wxWindowID id = -1,
                 const wxPoint& pos = wxDefaultPosition,
@@ -341,7 +370,7 @@ public:
 
     
     // get the total number of items in the control
-    size_t GetCount() const;
+    unsigned int GetCount() const;
 
     // indent is the number of pixels the children are indented relative to
     // the parents position. SetIndent() also redraws the control
@@ -371,10 +400,10 @@ public:
     void SetImageList(wxImageList *imageList);
     void SetStateImageList(wxImageList *imageList);
 
-    %apply SWIGTYPE *DISOWN { wxImageList *imageList };
+    %disownarg( wxImageList *imageList );
     void AssignImageList(wxImageList *imageList);
     void AssignStateImageList(wxImageList *imageList);
-    %clear wxImageList *imageList;
+    %cleardisown( wxImageList *imageList );
     
 
     // retrieve items label
@@ -429,10 +458,12 @@ public:
 
     %extend {
         // associate a wxPyTreeItemData with the tree item
+        %disownarg( wxPyTreeItemData* data );
         void SetItemData(const wxTreeItemId& item, wxPyTreeItemData* data) {
             data->SetId(item); // set the id
             self->SetItemData(item, data);
         }
+        %cleardisown( wxPyTreeItemData* data );
 
         // associate a Python object with the tree item
         void SetItemPyData(const wxTreeItemId& item, PyObject* obj) {
@@ -452,15 +483,13 @@ public:
     // allow the user to expand the items which don't have any children now
     // - but instead add them only when needed, thus minimizing memory
     // usage and loading time.
-    void SetItemHasChildren(const wxTreeItemId& item, bool has = True);
+    void SetItemHasChildren(const wxTreeItemId& item, bool has = true);
 
     // the item will be shown in bold
-    void SetItemBold(const wxTreeItemId& item, bool bold = True);
+    void SetItemBold(const wxTreeItemId& item, bool bold = true);
 
-#ifdef __WXMSW__
     // the item will be shown with a drop highlight
-    void SetItemDropHighlight(const wxTreeItemId& item, bool highlight = True);
-#endif
+    void SetItemDropHighlight(const wxTreeItemId& item, bool highlight = true);
     
     // set the items text colour
     void SetItemTextColour(const wxTreeItemId& item, const wxColour& col);
@@ -487,11 +516,14 @@ public:
     // is item text in bold font?
     bool IsBold(const wxTreeItemId& item) const;
 
+    // is the control empty?
+    bool IsEmpty() const;
+    
 
     // if 'recursively' is False, only immediate children count, otherwise
     // the returned number is the number of all items in this branch
     size_t GetChildrenCount(const wxTreeItemId& item,
-                            bool recursively = True) /*const*/;
+                            bool recursively = true) /*const*/;
 
 
 
@@ -509,17 +541,18 @@ public:
         // NB: this operation is expensive and can take a long time for a
         //     control with a lot of items (~ O(number of items)).
         PyObject* GetSelections() {
-            wxPyBeginBlockThreads();
+            wxPyBlock_t blocked = wxPyBeginBlockThreads();
             PyObject*           rval = PyList_New(0);
             wxArrayTreeItemIds  array;
             size_t              num, x;
             num = self->GetSelections(array);
             for (x=0; x < num; x++) {
                 wxTreeItemId *tii = new wxTreeItemId(array.Item(x));
-                PyObject* item = wxPyConstructObject((void*)tii, wxT("wxTreeItemId"), True);
+                PyObject* item = wxPyConstructObject((void*)tii, wxT("wxTreeItemId"), true);
                 PyList_Append(rval, item);
+                Py_DECREF(item);
             }
-            wxPyEndBlockThreads();
+            wxPyEndBlockThreads(blocked);
             return rval;
         }
     }
@@ -529,18 +562,20 @@ public:
     wxTreeItemId GetItemParent(const wxTreeItemId& item) const;
 
 
+    // NOTE: These are a copy of the same methods in gizmos.i, be sure to
+    // update both at the same time.  (Or find a good way to refactor!)
     %extend {
         // Get the first child of this item.  Returns a wxTreeItemId and an
         // opaque "cookie" value that should be passed to GetNextChild in
         // order to continue the search.
         PyObject* GetFirstChild(const wxTreeItemId& item) {
-            wxTreeItemIdValue cookie = 0;
-            wxTreeItemId ritem = self->GetFirstChild(item, cookie);
-            wxPyBeginBlockThreads();
+            void* cookie = 0;
+            wxTreeItemId* ritem = new wxTreeItemId(self->GetFirstChild(item, cookie));
+            wxPyBlock_t blocked = wxPyBeginBlockThreads();
             PyObject* tup = PyTuple_New(2);
-            PyTuple_SET_ITEM(tup, 0, wxPyConstructObject(&ritem, wxT("wxTreeItemId"), True));
-            PyTuple_SET_ITEM(tup, 1, wxPyConstructObject(cookie, wxT("wxTreeItemIdValue"), True));
-            wxPyEndBlockThreads();
+            PyTuple_SET_ITEM(tup, 0, wxPyConstructObject(ritem, wxT("wxTreeItemId"), true));
+            PyTuple_SET_ITEM(tup, 1, wxPyMakeSwigPtr(cookie, wxT("void")));
+            wxPyEndBlockThreads(blocked);
             return tup;
         }
 
@@ -549,13 +584,13 @@ public:
         // value returned from GetFirstChild or the previous GetNextChild.
         // Returns a wxTreeItemId and an opaque "cookie" value that should be
         // passed to GetNextChild in order to continue the search.
-        PyObject* GetNextChild(const wxTreeItemId& item, wxTreeItemIdValue& cookie) {
-            wxTreeItemId ritem = self->GetNextChild(item, cookie);
-            wxPyBeginBlockThreads();
+        PyObject* GetNextChild(const wxTreeItemId& item, void* cookie) {
+            wxTreeItemId* ritem = new wxTreeItemId(self->GetNextChild(item, cookie));
+            wxPyBlock_t blocked = wxPyBeginBlockThreads();
             PyObject* tup = PyTuple_New(2);
-            PyTuple_SET_ITEM(tup, 0, wxPyConstructObject(&ritem, wxT("wxTreeItemId"), True));
-            PyTuple_SET_ITEM(tup, 1, wxPyConstructObject(cookie, wxT("wxTreeItemIdValue"), True));
-            wxPyEndBlockThreads();
+            PyTuple_SET_ITEM(tup, 0, wxPyConstructObject(ritem, wxT("wxTreeItemId"), true));
+            PyTuple_SET_ITEM(tup, 1, wxPyMakeSwigPtr(cookie, wxT("void")));
+            wxPyEndBlockThreads(blocked);
             return tup;
         }            
     }
@@ -580,6 +615,7 @@ public:
     wxTreeItemId GetPrevVisible(const wxTreeItemId& item) const;
 
     
+    %disownarg( wxPyTreeItemData* data );
     
     // add the root node to the tree
     wxTreeItemId AddRoot(const wxString& text,
@@ -600,12 +636,12 @@ public:
                             wxPyTreeItemData *data = NULL);
 
     // insert a new item before the one with the given index
-    %name(InsertItemBefore)
-    wxTreeItemId InsertItem(const wxTreeItemId& parent,
+    %Rename(InsertItemBefore, 
+    wxTreeItemId, InsertItem(const wxTreeItemId& parent,
                             size_t index,
                             const wxString& text,
                             int image = -1, int selectedImage = -1,
-                            wxPyTreeItemData *data = NULL);
+                            wxPyTreeItemData *data = NULL));
 
         // insert a new item in as the last child of the parent
     wxTreeItemId AppendItem(const wxTreeItemId& parent,
@@ -614,7 +650,8 @@ public:
                             wxPyTreeItemData *data = NULL);
 
 
-
+    %cleardisown( wxPyTreeItemData* data );
+    
     // delete this item and associated data if any
     void Delete(const wxTreeItemId& item);
 
@@ -630,9 +667,21 @@ public:
     // expand this item
     void Expand(const wxTreeItemId& item);
 
+    // expand the item and all its childs and thats childs
+    void ExpandAllChildren(const wxTreeItemId& item);
+
+    // expand all items
+    void ExpandAll();
+   
     // collapse the item without removing its children
     void Collapse(const wxTreeItemId& item);
 
+    // collapse the item and all its childs and thats childs
+    void CollapseAllChildren(const wxTreeItemId& item);
+
+    // collapse all items
+    void CollapseAll();
+    
     // collapse the item and remove all children
     void CollapseAndReset(const wxTreeItemId& item);
 
@@ -643,12 +692,19 @@ public:
     // remove the selection from currently selected item (if any)
     void Unselect();
 
+    // remove the selection from the given one (multiselect mode only)
+    void UnselectItem(const wxTreeItemId& item);
+    
     // unselect all items (only makes sense for multiple selection control)
     void UnselectAll();
 
     // select this item
-    void SelectItem(const wxTreeItemId& item);
+    void SelectItem(const wxTreeItemId& item, bool select = true);
 
+    // toggle the item selection
+    void ToggleItemSelection(const wxTreeItemId& item);
+
+    
     // make sure this item is visible (expanding the parent item and/or
     // scrolling to this item if necessary)
     void EnsureVisible(const wxTreeItemId& item);
@@ -670,7 +726,7 @@ public:
 
 #ifdef __WXMSW__
     // end editing and accept or discard the changes to item label
-    void EndEditLabel(const wxTreeItemId& item, bool discardChanges = False);
+    void EndEditLabel(const wxTreeItemId& item, bool discardChanges = false);
 #endif
 
 
@@ -686,21 +742,21 @@ public:
     DocDeclAStr(
         wxTreeItemId, HitTest(const wxPoint& point, int& OUTPUT),
         "HitTest(Point point) -> (item, where)",
-        "Determine which item (if any) belongs the given point.  The\n"
-        "coordinates specified are relative to the client area of tree ctrl\n"
-        "and the where return value is set to a bitmask of wxTREE_HITTEST_xxx\n"
-        "constants.\n");
+        "Determine which item (if any) belongs the given point.  The coordinates
+specified are relative to the client area of tree ctrl and the where return
+value is set to a bitmask of wxTREE_HITTEST_xxx constants.
+", "");
     
 
     %extend {
         // get the bounding rectangle of the item (or of its label only)
-        PyObject* GetBoundingRect(const wxTreeItemId& item,  bool textOnly = False) {
+        PyObject* GetBoundingRect(const wxTreeItemId& item,  bool textOnly = false) {
              wxRect rect;
             if (self->GetBoundingRect(item, rect, textOnly)) {
-                wxPyBeginBlockThreads();
+                wxPyBlock_t blocked = wxPyBeginBlockThreads();
                 wxRect* r = new wxRect(rect);
-                PyObject* val = wxPyConstructObject((void*)r, wxT("wxRect"), True);
-                wxPyEndBlockThreads();
+                PyObject* val = wxPyConstructObject((void*)r, wxT("wxRect"), true);
+                wxPyEndBlockThreads(blocked);
                 return val;
             }
             else
@@ -708,7 +764,29 @@ public:
         }
     }
 
+#ifdef __WXMSW__
+    // set/get the item state.image (state == -1 means cycle to the next one)
+    void SetState(const wxTreeItemId& node, int state);
+    int GetState(const wxTreeItemId& node);
+#endif
 
+    static wxVisualAttributes
+    GetClassDefaultAttributes(wxWindowVariant variant = wxWINDOW_VARIANT_NORMAL);
+
+    void SetQuickBestSize(bool q);
+    bool GetQuickBestSize() const;
+
+    %property(Count, GetCount, doc="See `GetCount`");
+    %property(EditControl, GetEditControl, doc="See `GetEditControl`");
+    %property(FirstVisibleItem, GetFirstVisibleItem, doc="See `GetFirstVisibleItem`");
+    %property(ImageList, GetImageList, SetImageList, doc="See `GetImageList` and `SetImageList`");
+    %property(Indent, GetIndent, SetIndent, doc="See `GetIndent` and `SetIndent`");
+    %property(QuickBestSize, GetQuickBestSize, SetQuickBestSize, doc="See `GetQuickBestSize` and `SetQuickBestSize`");
+    %property(RootItem, GetRootItem, doc="See `GetRootItem`");
+    %property(Selection, GetSelection, doc="See `GetSelection`");
+    %property(Selections, GetSelections, doc="See `GetSelections`");
+    %property(Spacing, GetSpacing, SetSpacing, doc="See `GetSpacing` and `SetSpacing`");
+    %property(StateImageList, GetStateImageList, SetStateImageList, doc="See `GetStateImageList` and `SetStateImageList`");
 };