nobody at rubyforge.org
2006-Dec-05 19:07 UTC
[Wxruby-development] [779] trunk/wxruby2: Added TreeCtrl#traverse method and documentation
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.1//EN" "http://www.w3.org/TR/xhtml11/DTD/xhtml11.dtd"> <html xmlns="http://www.w3.org/1999/xhtml"> <head><meta http-equiv="content-type" content="text/html; charset=utf-8" /><style type="text/css"><!-- #msg dl { border: 1px #006 solid; background: #369; padding: 6px; color: #fff; } #msg dt { float: left; width: 6em; font-weight: bold; } #msg dt:after { content:'':'';} #msg dl, #msg dt, #msg ul, #msg li, #header, #footer { font-family: verdana,arial,helvetica,sans-serif; font-size: 10pt; } #msg dl a { font-weight: bold} #msg dl a:link { color:#fc3; } #msg dl a:active { color:#ff0; } #msg dl a:visited { color:#cc6; } h3 { font-family: verdana,arial,helvetica,sans-serif; font-size: 10pt; font-weight: bold; } #msg pre { overflow: auto; background: #ffc; border: 1px #fc0 solid; padding: 6px; } #msg ul, pre { overflow: auto; } #header, #footer { color: #fff; background: #636; border: 1px #300 solid; padding: 6px; } #patch { width: 100%; } #patch h4 {font-family: verdana,arial,helvetica,sans-serif;font-size:10pt;padding:8px;background:#369;color:#fff;margin:0;} #patch .propset h4, #patch .binary h4 {margin:0;} #patch pre {padding:0;line-height:1.2em;margin:0;} #patch .diff {width:100%;background:#eee;padding: 0 0 10px 0;overflow:auto;} #patch .propset .diff, #patch .binary .diff {padding:10px 0;} #patch span {display:block;padding:0 10px;} #patch .modfile, #patch .addfile, #patch .delfile, #patch .propset, #patch .binary, #patch .copfile {border:1px solid #ccc;margin:10px 0;} #patch ins {background:#dfd;text-decoration:none;display:block;padding:0 10px;} #patch del {background:#fdd;text-decoration:none;display:block;padding:0 10px;} #patch .lines, .info {color:#888;background:#fff;} --></style> <title>[779] trunk/wxruby2: Added TreeCtrl#traverse method and documentation</title> </head> <body> <div id="msg"> <dl> <dt>Revision</dt> <dd>779</dd> <dt>Author</dt> <dd>brokentoy</dd> <dt>Date</dt> <dd>2006-12-05 14:07:34 -0500 (Tue, 05 Dec 2006)</dd> </dl> <h3>Log Message</h3> <pre>Added TreeCtrl#traverse method and documentation</pre> <h3>Modified Paths</h3> <ul> <li><a href="#trunkwxruby2doctextiletreectrltxtl">trunk/wxruby2/doc/textile/treectrl.txtl</a></li> <li><a href="#trunkwxruby2swigclassesTreeCtrli">trunk/wxruby2/swig/classes/TreeCtrl.i</a></li> </ul> </div> <div id="patch"> <h3>Diff</h3> <a id="trunkwxruby2doctextiletreectrltxtl"></a> <div class="modfile"><h4>Modified: trunk/wxruby2/doc/textile/treectrl.txtl (778 => 779)</h4> <pre class="diff"><span> <span class="info">--- trunk/wxruby2/doc/textile/treectrl.txtl        2006-12-03 17:30:10 UTC (rev 778) +++ trunk/wxruby2/doc/textile/treectrl.txtl        2006-12-05 19:07:34 UTC (rev 779) </span><span class="lines">@@ -182,6 +182,7 @@ </span><span class="cx"> * "TreeCtrl#sort_children":#TreeCtrl_sortchildren </span><span class="cx"> * "TreeCtrl#toggle":#TreeCtrl_toggle </span><span class="cx"> * "TreeCtrl#toggle_item_selection":#TreeCtrl_toggleitemselection </span><ins>+* "TreeCtrl#traverse":#TreeCtrl_traverse </ins><span class="cx"> * "TreeCtrl#unselect":#TreeCtrl_unselect </span><span class="cx"> * "TreeCtrl#unselect_all":#TreeCtrl_unselectall </span><span class="cx"> * "TreeCtrl#unselect_item":#TreeCtrl_unselectitem </span><span class="lines">@@ -981,7 +982,18 @@ </span><span class="cx"> Toggles the given item between selected and unselected states. For </span><span class="cx"> multiselection controls only. </span><span class="cx"> </span><ins>+h3(#TreeCtrl_traverse). TreeCtrl#traverse </ins><span class="cx"> </span><ins>+ *toggle_item_selection*(%(arg-type)TreeItemId% start_item = root_id) { | item_id | ... } + +Recurses over the treectrl''s items, passing each TreeItemId successively +into the passed block. This TreeItemId can be used as an argument to +many other methods in this class. + +The @start_item@ argument will be the first item_id passed into the +block, followed by its children and descendants, depth first. If +@start_item@ is not specified, it defaults to the root item of the tree. + </ins><span class="cx"> h3(#TreeCtrl_unselect). TreeCtrl#unselect </span><span class="cx"> </span><span class="cx"> *unselect*() </span></span></pre></div> <a id="trunkwxruby2swigclassesTreeCtrli"></a> <div class="modfile"><h4>Modified: trunk/wxruby2/swig/classes/TreeCtrl.i (778 => 779)</h4> <pre class="diff"><span> <span class="info">--- trunk/wxruby2/swig/classes/TreeCtrl.i        2006-12-03 17:30:10 UTC (rev 778) +++ trunk/wxruby2/swig/classes/TreeCtrl.i        2006-12-05 19:07:34 UTC (rev 779) </span><span class="lines">@@ -15,18 +15,10 @@ </span><span class="cx"> %{ </span><span class="cx"> class wxRbTreeItemData : public wxTreeItemData { </span><span class="cx"> public: </span><del>- wxRbTreeItemData(VALUE obj = Qnil) { - m_obj = obj; - } - - VALUE GetRubyObject() { -         return m_obj; - } - - void SetRubyObject(VALUE obj) { -         m_obj = obj; - } - </del><ins>+ wxRbTreeItemData(VALUE obj = Qnil) { m_obj = obj; } + VALUE GetRubyObject() { return m_obj; } + void SetRubyObject(VALUE obj) { m_obj = obj; } +protected: </ins><span class="cx"> VALUE m_obj; </span><span class="cx"> }; </span><span class="cx"> %} </span><span class="lines">@@ -51,20 +43,17 @@ </span><span class="cx">          $result = ruby_item_data->GetRubyObject(); </span><span class="cx">         } </span><span class="cx"> } </span><ins>+// End item data fixes </ins><span class="cx"> </span><ins>+ </ins><span class="cx"> // GC handling for item data objects </span><span class="cx"> %{ </span><del>- static void RecursivelyGCMarkFrom(wxTreeCtrl *tree_ctrl, wxTreeItemId base_id ) </del><ins>+ // general recursion over a treectrl, starting from a base_id + // the function rec_func will be called in turn for each tree item, + // rec_func should be a funtion that receives a treectrl pointer and an ItemId + static void RecurseOverTreeIds(wxTreeCtrl *tree_ctrl, const wxTreeItemId& base_id, void(*rec_func)(void *, const wxTreeItemId&) ) </ins><span class="cx"> { </span><del>-         -        // check if there''s item data, and mark it -        wxRbTreeItemData* ruby_item_data = (wxRbTreeItemData *)tree_ctrl->GetItemData(base_id); -        if ( ruby_item_data != NULL ) -         { -                VALUE ruby_obj = ruby_item_data->GetRubyObject(); -                rb_gc_mark(ruby_obj); -         } - </del><ins>+        rec_func(tree_ctrl, base_id); </ins><span class="cx">         // recurse through children </span><span class="cx">         if ( tree_ctrl->ItemHasChildren(base_id) ) </span><span class="cx">          { </span><span class="lines">@@ -72,12 +61,25 @@ </span><span class="cx">                 wxTreeItemId child = tree_ctrl->GetFirstChild(base_id, cookie); </span><span class="cx">                 while ( child.IsOk() ) </span><span class="cx">                  { </span><del>-                        RecursivelyGCMarkFrom(tree_ctrl, child); -                        child = tree_ctrl->GetNextSibling(child); </del><ins>+                        RecurseOverTreeIds(tree_ctrl, child, *rec_func); +                        child = tree_ctrl->GetNextChild(base_id, cookie); </ins><span class="cx">                  } </span><span class="cx">          } </span><span class="cx"> } </span><span class="cx"> </span><ins>+ static void DoGCMarkItemData(void *ptr, const wxTreeItemId& item_id) + { +        wxTreeCtrl* tree_ctrl = (wxTreeCtrl*) ptr; +        // check if there''s item data, and mark it +        wxRbTreeItemData* ruby_item_data = (wxRbTreeItemData *)tree_ctrl->GetItemData(item_id); +        if ( ruby_item_data != NULL ) +         { +                VALUE ruby_obj = ruby_item_data->GetRubyObject(); +                rb_gc_mark(ruby_obj); +         } + } + + // SWIG''s entry point function for GC mark </ins><span class="cx"> static void mark_wxTreeCtrl(void *ptr) </span><span class="cx"> { </span><span class="cx">         VALUE rb_obj = SWIG_RubyInstanceFor(ptr); </span><span class="lines">@@ -86,8 +88,17 @@ </span><span class="cx"> </span><span class="cx">         wxTreeCtrl* tree_ctrl = (wxTreeCtrl*) ptr; </span><span class="cx">         wxTreeItemId root_id = tree_ctrl->GetRootItem(); </span><del>-        RecursivelyGCMarkFrom(tree_ctrl, root_id); </del><ins>+        RecurseOverTreeIds(tree_ctrl, root_id, &DoGCMarkItemData); </ins><span class="cx"> } </span><ins>+ + // function for internal implementation of TreeCtrl#traverse + static void DoTreeCtrlYielding(void *ptr, const wxTreeItemId& item_id) + { +        // create a copy to wrap and give to ruby +        wxTreeItemId *copy_id = new wxTreeItemId(item_id.m_pItem); +        VALUE rb_item_id = SWIG_NewPointerObj(copy_id, SWIGTYPE_p_wxTreeItemId, SWIG_POINTER_OWN); +        rb_yield(rb_item_id); + } </ins><span class="cx"> %} </span><span class="cx"> %markfunc wxTreeCtrl "mark_wxTreeCtrl"; </span><span class="cx"> </span><span class="lines">@@ -105,7 +116,24 @@ </span><span class="cx"> </span><span class="cx"> </span><span class="cx"> %extend wxTreeCtrl { </span><del>-         </del><ins>+ + VALUE traverse(const wxTreeItemId& item_id = wxTreeItemId() ) + { +        wxTreeItemId base_id; + +        if ( item_id.IsOk() ) +         { +                base_id = item_id; +         } +        else +         { +                base_id = self->GetRootItem(); +         } + +        RecurseOverTreeIds(self, base_id, &DoTreeCtrlYielding); +        return Qnil; + } + </ins><span class="cx">         //Change signature so it returns an array of the TreeItemId and the Cookie. </span><span class="cx">         //This behavior matches that used by wxPython and wxPerl. </span><span class="cx">         VALUE get_first_child(const wxTreeItemId& item) </span></span></pre> </div> </div> </body> </html>
Maybe Matching Threads
- [741] trunk/wxruby2: Fix get_item_data, hiding TreeItemData messiness, fix GC-ing (Alex Fenton)
- [797] trunk/wxruby2/swig/classes/TreeCtrl.i: Traverse method moved to wxSugar
- [1046] trunk/wxruby2/swig/classes/TreeCtrl.i: Prevent crashes in TreeCtrl from premature deletion of associated ImageList
- TreeCtrl update
- [831] trunk/wxruby2: Use simple ruby Integers to represent TreeItemIds