Revision: 2323 http://vexi.svn.sourceforge.net/vexi/?rev=2323&view=rev Author: clrg Date: 2007-09-24 15:34:07 -0700 (Mon, 24 Sep 2007)
Log Message: ----------- A different way of traversing trees other than using selectable Added Paths: ----------- branches/tree_nexttree Copied: branches/tree_nexttree (from rev 2295, trunk/widgets/org.vexi.widgets/src/org/vexi/lib/widget/tree.t) =================================================================== --- branches/tree_nexttree (rev 0) +++ branches/tree_nexttree 2007-09-24 22:34:07 UTC (rev 2323) @@ -0,0 +1,196 @@ +<!-- Copyright 2007 - see COPYING for details [LGPL] --> + +<vexi xmlns="org.vexi.lib.role" xmlns:ui="vexi://ui" xmlns:meta="vexi://meta"> + <meta:doc> + <author>Charles Goodwin</author> + </meta:doc> + + <selectable /> + <ui:box> + + thisbox.th_content = null; + thisbox.th_expand = null; + thisbox.th_handle = null; + thisbox.th_node = null; + thisbox.th_title = null; + + thisbox.v_isroot = true; + thisbox.v_self ++= function() { return thisbox; } + + thisbox.expanded = true; + + var icontemplate = null; + + /** used for closing / expanding the tree */ + thisbox.flipDisplay = function(v) { expanded = !th_expand.display; cascade = v; } + + /** select when we mouse press on the node */ + thisbox.nodePress = function(v) { selected = true; cascade = v; } + + /** used for fancier icon implementations */ + thisbox.setIconTemplate = function(i) { icontemplate = i; } + + thisbox.childrenWrite = function(c) { + if (c and c.v_istree) { + var cself = c.v_self; + cself.v_node = c; + cself.nexttree ++= nexttreeChildRead; + cself.prevtree ++= prevtreeChildRead; + // we have no group + if (!groupref) { + // add to child group + if (cself.groupref) { + groupref = cself.groupref; + groupref.members.unshift(thisbox); + // start a new group + } else c.group = group; + // we have a group - insert or merge into this + } else { + var insafter = null; + // no children, insert after thisbox + if (!th_content.numchildren) insafter = thisbox; + // try the box under the current placement + if (!insafter) insafter = th_content[trapname]; + // double-check before attempting insertion + if (insafter) insafter = groupref.members.before(insafter); + // need to find last node (nodes may be trees) + else { + var node = thisbox; + insafter = thisbox; + for (var i=thisbox.numchildren-1; i>=0; i--) { + if (node[i].v_istree) { + insafter = node[i].v_self; + if (node[i].numchildren) { + node = node[i]; + // reset i, no -1 due to for loop i-- + i = node.numchildren; + } else break; + } + } + } + // now position [insafter] is known + + // merge groups + if (c.v_self.groupref) + groupref.merge(c.v_self.groupref, insafter); + // c has no group - insert it + else { + c.v_self.groupref = groupref; + groupref.members.insert(c.v_self, insafter); + } + } + } + var _c = trapee[trapname]; + if (c == null and _c != null) { + // remove from this tree + if (_c.v_istree) { + // FIXME: split groups + _c.v_self.groupref = null; + _c.v_self.nexttree --= nexttreeChildRead; + _c.v_self.prevtree --= prevtreeChildRead; + } + } + cascade = c; + th_handle.display = (th_content.numchildren > 0); + } + + thisbox.nexttree ++= function() { + vexi.log.info("???"); + if (expanded) { + var n = th_content.numchildren; + for (var i=0; n>i; i++) + if (th_content[i].v_istree and th_content[i].visible) + return th_content[i]; + } + return thisbox; + } + + thisbox.nexttreeChildRead = function() { + vexi.log.info("!!!"); + var t = trapee; + var c = cascade; + if (!c.selected) return c; + var n = th_content.numchildren; + for (var i = th_content.indexof(t.v_node)+1; n>i; i++) + if (th_content[i].v_istree and th_content[i].visible) + return th_content[i]; + return nexttree; + } + + //thisbox.prevtree ++= function() { return thisbox; } + thisbox.prevtreeChildRead = function() { + var t = trapee; + for (var i = th_content.indexof(t.v_node)-1; i>=0; i--) + if (th_content[i].v_istree and th_content[i].visible) + return th_content[i]; + return thisbox; + } + + thisbox.expanded ++= static.expandRead; + thisbox.expanded ++= static.expandWrite; + thisbox.nextselect ++= static.nextselectRead; + thisbox.th_content ++= static.contentWrite; + thisbox.th_handle ++= static.handleWrite; + thisbox.th_node ++= static.nodeWrite; + thisbox.th_title ++= static.titleWrite; + thisbox.KeyPressed ++= static.keypressWrite; + + </ui:box> + + static.expandRead = function() { return trapee.th_expand.display; } + static.expandWrite = function(v) { + var t = trapee; + t.th_expand.display = v; + if (!v) { + var g = t.groupref; + if (g and g.selected and !g.selected.visible) + t.selected = true; + } + return; + } + + static.nextselectRead = function() { + var c = cascade; + if (c and c.visible) return c; + return null; + return trapee.nexttree; + } + + static.contentWrite = function(v) { + cascade = v; + v.Children ++= trapee.childrenWrite; + } + + static.handleWrite = function(v) { + cascade = v; + v.Press1 ++= trapee.flipDisplay; + } + + /** override action write trap in selectable */ + static.nodeWrite = function(n) { + cascade = n; + n.Press1 ++= trapee.nodePress; + } + + static.titleWrite = function(v) { + cascade = v; + v.DoubleClick1 ++= trapee.flipDisplay; + } + + static.keypressWrite = function(v) { + vexi.log.info("? "+v); + var t = trapee; + if (v == "left") t.th_expand.display = false; + else if (v == "right") { + if (t.th_content.numchildren) + t.th_expand.display = true; + } else if (v == "up") { + var pt = t.prevtree; + if (pt) pt.selected = true; + } else if (v == "down") { + var nt = t.nexttree; + if (nt) nt.selected = true; + } else cascade = v; + } + +</vexi> This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. ------------------------------------------------------------------------- This SF.net email is sponsored by: Microsoft Defy all challenges. Microsoft(R) Visual Studio 2005. http://clk.atdmt.com/MRT/go/vse0120000070mrt/direct/01/ _______________________________________________ Vexi-svn mailing list Vexi-svn@lists.sourceforge.net https://lists.sourceforge.net/lists/listinfo/vexi-svn