= new Vector.(0); private var FromIdx:Number; // -1 is continue from last search private var ToIdx:Number; // -1 is through last node of target private var Optns:Number; // private var BypassOpen:Boolean = false; [Bindable] public var xhierTree:XMLListHierarchicalCollection; [Bindable] public var scrollMode:String = ScrollBarDisplayMode.FLOAT; [Bindable] public var vertScroll:String = ScrollPolicy.AUTO; [Bindable] public var horzScroll:String = ScrollPolicy.AUTO; [Bindable] public var scrollInteract:String = ScrollInteractionMode.MOUSE; // font, sizing, and texture framework include "../../../Apart/FileTys.as" private var TreeIdx:Number; private var TreeXml:XML; private var CopyBuf:XML; private var resevnt:ResizeEvent; private var Rends:Array = new Array(); private var TreeRend:Number = -1; private var Chnged:Boolean = false; private var TreeFile:String = ""; // Invoker sets the preset Tree name in Chron Face [Bindable] public var TreeName:String = Dhron.Face.Tree; [Bindable] public var TreeCmd:String = ""; public var RunA:XML = <{BaseIdent}> <{TreeName} d1="((( Tree -- feathers and starling" status="initial" > public function StartUI():void { BasisUI(RunA); // this stub allows any individual panel to post-customize Starting(); } public function Starting():void { FontInit(1.0); xhierTree = xhierStart; Tre.dataProvider = xhierTree; arTree(); /* var rnx:NodeC = Dhron.Run; Dhron.Run.MergeX(RunA); var rbx:XML = rnx.Runner("." + Dhron.Basis.AppIdent, rnx.Apex) var rax:XML = rnx.Runner("." + TreeName, rbx); Owning = Dhron.Paneled(TreeName, this); Dhron.ViewRove[Owning] = rax; */ Substrate(); } public function ThisXml():XML { return Tre.dataProvider[0]; } public function Substrate():void { _allWidth = Starling.current.stage.stageWidth - 50; _allHeight = Starling.current.stage.stageHeight - 150; } public function Dist(cmdr:String, argr:String):Boolean { return Connector(cmdr, argr); } public function DimWin(txtr:String):String { var cofs:Array; cofs = txtr.split(" ", 4); Tre.x = parseInt(cofs[0], 10); Tre.y = parseInt(cofs[1], 10); Tre.width = parseInt(cofs[2], 10); Tre.height = parseInt(cofs[3], 10); return "-"; } public function Window(txtr:String):String { var winlog:Number = parseInt(txtr, 10); Tre.visible = (winlog != 0); return "-"; } public function PostRet(retr:String, extr:Boolean):void { do { var mvrot:String = Dhron.Basis.AppIdent + "_"; if (extr) { mvrot += TreeName + "_"; } mvrot += "ret"; if (Dhron.Basis.RetOwner > 0) { // must wait for another ret claimant } else { // now we can claim ret Dhron.Basis.RetOwner = Owning; var retf:File = Dhron.Basis.AppConn.resolvePath(mvrot + ".txt"); if (retf.exists) { // can't take over yet, our own named ret file exists } else { // all clear to finish ret output Dhron.Basis.YallSafeD( Dhron.Basis.AppIdent + "_" + TreeName + "_ret", ".txt", Utils.asc2hex(Dhron.Face.Ret)); // give back ret Dhron.Basis.RetOwner = 0; } } } while (Dhron.Basis.RetOwner > 0); } public function Ret(txtr:String):String { do { var mvrot:String = Dhron.Basis.AppIdent + "_"; mvrot += TreeName + "_"; mvrot += "ret"; if (Dhron.Basis.RetOwner > 0) { // must wait for another ret claimant } else { // now we can claim ret Dhron.Basis.RetOwner = Owning; var retf:File = Dhron.Basis.AppConn.resolvePath(mvrot + ".txt"); if (retf.exists) { // can't take over yet, our own named ret file exists } else { // all clear to finish ret output Dhron.Basis.YallSafeE( Dhron.Basis.AppIdent + "_" + TreeName + "_ret", ".txt", Utils.asc2hex(Dhron.Face.Ret)); // give back ret Dhron.Basis.RetOwner = 0; } } } while (Dhron.Basis.RetOwner > 0); return "-"; } public function TreeFocus():void { Dhron.Face.Tell(TreeName + "_TreeReady", AppIdent + "|-1|Name|" + TreeName + "|" + "Empty"); } public function innerRun(appg:String, rovxml:XML):Boolean { var proced:Boolean = true; var numer:Number; var str:String; switch (appg) { case "Config" : // page stabilized, app configuration point Branchor("engaged"); break; case "Continue" : // page stabilized, app configuration point Branchor("engaged"); break; case "Focus" : Branchor("ready"); TreeFocus(); break; case "Signal" : Dhron.Face.Tell("TreeQueued", AppIdent + "|-1|Name|" + "Empty"); break; default : proced = false; } return proced; } // use the current addressed Run tree node as the Tree contents public function runTree(addr:String):String { var xhtr:XML = Dhron.Run.Runner(addr, null); if (xhtr) { xhierTree.xmlListData[0] = Dhron.Run.Runner(addr, null); } else { xhierTree.xmlListData[0] = Dhron.ViewRove[1]; } arTree(); return "-"; } public function Changed(str:String):String { // Chnged = (parseInt(str, 10) != 0); var chgfl:String = saveTree(""); return doTree(""); } private var seeker:String; private var parmer:String; public function allback(oper:String, funcer:Function):Boolean { if (oper == seeker) { Dhron.Face.Ret = funcer(parmer); return true; } return false; } public function Networker(cmder:String, parm:String):String { var resnet:String = ""; try { resnet = this[cmder].call(this, parm); } catch(e) { resnet = "$%$Networker " + cmder + " with " + parm + " --> " + e.toString(); } return resnet; } public function Connector(testr:String, parm:String):Boolean { parmer = parm; seeker = testr; // dimensioning/window if (allback("DimWin", DimWin)) return true; if (allback("Window", Window)) return true; if (allback("Ret", Ret)) return true; // queue operations if (allback("Enq", tEnq)) return true; if (allback("Sque", tSque)) return true; // change detect operations if (allback("Changed", Changed)) return true; // if (allback("ChangedQ",qChanged)) return true; // bypass operations // if (allback("BypOpen",tBypOpen)) return true; // if (allback("BypClose",tBypClose)) return true; // attributes if (allback("NoAttrs", NoAttrs)) return true; if (allback("ClearAttr", zClearAttr)) return true; // branch operations if (allback("Open", openTree)) return true; if (allback("Expanded", tExpanded)) return true; if (allback("Expand", zExpand)) return true; if (allback("Express", zExpress)) return true; if (allback("ExpTo", zExpandTo)) return true; // controls op if (allback("Touch", tTouch)) return true; if (allback("ScrollH", tScrollH)) return true; if (allback("ScrollV", tScrollV)) return true; // tree siblings if (allback("Next", tNextNode)) return true; if (allback("Prev", tPrevNode)) return true; if (allback("First", tFirstNode)) return true; if (allback("Last", tLastNode)) return true; // tree descendents if (allback("Children", tChildren)) return true; if (allback("Child", tChild)) return true; if (allback("Adding", tAdding)) return true; if (allback("AddChild", tAddChild)) return true; if (allback("AddChFirst", tPreChild)) return true; if (allback("AddFirst", tFirstSib)) return true; if (allback("AddLast", tLastSib)) return true; if (allback("AddBefore", tPreSib)) return true; if (allback("AddAfter", tPostSib)) return true; if (allback("Imging", tImging)) return true; // node access if (allback("Anchor", tSetAnchor)) return true; if (allback("Anchored", tGetAnchor)) return true; if (allback("From", tFrom)) return true; if (allback("To", tTo)) return true; if (allback("Options", tOptions)) return true; if (allback("GetName", tGetName)) return true; if (allback("SetName", tSetName)) return true; // search if (allback("Find", tFind)) return true; // values/attrs if (allback("AtValue", tAtValue)) return true; if (allback("SetValue", tSetValue)) return true; if (allback("GetValue", tGetValue)) return true; if (allback("GetValues", zGetValues)) return true; if (allback("GetValRev", zGetValuesRev)) return true; if (allback("Values", zAttrs)) return true; if (allback("Valued", zAttred)) return true; if (allback("Valuing", zAttring)) return true; // icon markers if (allback("Mark", tSetMark)) return true; if (allback("Unmark", tUnmark)) return true; // hierarchy if (allback("Listed", tListed)) return true; if (allback("GetHier", tGetHier)) return true; if (allback("Parent", tParent)) return true; if (allback("Below", zChiOf)) return true; if (allback("Belows", zBelow)) return true; if (allback("Del", zDel)) return true; if (allback("Move", zMove)) return true; if (allback("Unchild", zUnchild)) return true; // selection if (allback("Selected", tSelected)) return true; if (allback("Unselect", tNoSelect)) return true; if (allback("Select", tSelect)) return true; // sorting if (allback("Sort", tSort)) return true; // if (allback("Clear",zClear)) return true; if (allback("Reset", zReset)) return true; // copy/insert if (allback("Copy", zCopy)) return true; if (allback("CopyNode", zCopyNode)) return true; if (allback("Insert", zInsert)) return true; if (allback("InsertAt", zInsertAt)) return true; if (allback("After", zAfter)) return true; if (allback("AfterAt", zAfterAt)) return true; if (allback("CopyBelow", zCopyBelow)) return true; // tree global ops if (allback("saveTree", saveTree)) return true; if (allback("doTree", doTree)) return true; if (allback("reRoot", tReroot)) return true; // xml and run tree ops if (allback("runTree", runTree)) return true; if (allback("rowXml", Dhron.rowXml)) return true; if (allback("attrXml", Dhron.attrXml)) return true; if (allback("MergeAbs", Dhron.MergeAbs)) return true; if (allback("MergeRel", Dhron.MergeRel)) return true; if (allback("Add", Dhron.AddXml)) return true; if (allback("Tack", Dhron.TackXml)) return true; if (allback("Say", Dhron.Say)) return true; if (allback("Gone", Dhron.Dgone)) return true; if (allback("Chop", Dhron.Dchop)) return true; if (allback("Trim", Dhron.Dtrim)) return true; if (allback("Spot", Dhron.Spot)) return true; if (allback("Beam", Dhron.Beam)) return true; if (allback("Shine", Dhron.Shine)) return true; if (allback("DanceRun", Dhron.DanceRun)) return true; if (allback("XmlDance", Dhron.XmlDanceUn)) return true; if (allback("RevDance", Dhron.RevDanceUn)) return true; if (allback("SetRun", Dhron.SetRun)) return true; if (allback("JoinXml", Dhron.JoinXml)) return true; if (allback("MergeXml", Dhron.MergeXml)) return true; if (allback("SetXml", Dhron.SetXml)) return true; // if (allback("NextSeq", Dhron.NextSeq)) return true; return false; } public function tSque(str:String):String { Dhron.Texu.NextOnQ = str; Dhron.Texu.StartQueue(); return ""; } public function tEnq(str:String):String { Dhron.Texu.Enqueue(Valuer, str); return ""; } private function Treed(testx:XML, stan:Number):Number { var tridx:Number; for (tridx = stan; tridx < TreeAr.length; tridx++) { if (testx == TreeAr[tridx]) break; } return tridx; } private function xNext(nod:XML):XML { var par:XMLList = nod.parent().children(); var plen:Number = par.length(); var chidx:Number = nod.childIndex(); var ridx:Number = -1; var resn:XML = null; if (chidx < (plen - 1)) { resn = par[chidx + 1]; } return resn; } // sort child nodes public function tSort(str:String):String { var nidx:Number = parseInt(str, 10); var nod:XML = TreeAr[nidx]; ChildAr = nod.children(); var idx:Number; var newar:Array = new Array(); for (idx = 0; idx < ChildAr.length(); idx++) { newar.push(ChildAr[idx]); } newar.sort( function (a:XML, b:XML):Number { if (a.localName() > b.localName()) { return -1; } return 1; } ); for (idx = 0; idx < ChildAr.length(); idx++) { ChildAr[idx] = newar[idx]; } nod.setChildren(ChildAr); arTree(); return ""; } /* public function tBypOpen(str:String):String { if (parseInt(str, 10) == 0) { BypassOpen = false; }else{ BypassOpen = true; } return ""; } public function tBypClose(str:String):String { if (parseInt(str, 10) == 0) { BypassClose = false; }else{ BypassClose = true; } return ""; } */ // selected node public function tSelected(str:String):String { var sel:XML = (Tre.selectedItem as XML); var ridx:Number = -1; if (sel) { ridx = Treed(sel, 0); } else { } return ridx.toString(); } public function tNoSelect(str:String):String { Tre.selectedItem = null; return ""; } // select node public function tSelect(str:String):String { Tre.selectedItem = TreeAr[TreeAnchor]; var tank:Object = Tre.dataProvider.getItemAt(TreeAnchor); Tre.dataProvider.updateAll(); return ""; } // parent of node public function tParent(str:String):String { var nidx:Number = parseInt(str, 10); var nod:XML = TreeAr[nidx]; var par:XML = nod.parent(); var ridx:Number = -1; if (par) { ridx = Treed(par, 0); } return ridx.toString(); } // list of attributes of node public function zAttrs(str:String):String { var nidx:Number = parseInt(str, 10); var nod:XML = TreeAr[nidx]; AttrAr = nod.attributes(); var alen:Number = AttrAr.length(); return alen.toString(); } // open branches of tree to depth public function zExpandTo(str:String):String { var lidx:Number; var midx:Number; var deep:Number = parseInt(str, 10); var ldep:Number = 0; for (lidx = 0; lidx < TreeAr.length; lidx++) { if (Tre.dataProvider.isBranch(TreeAr[lidx])) { midx = lidx; while (midx = TreeAr[midx].parent()) { ldep++; } if (ldep <= deep) { Tre.toggleBranch(TreeAr[lidx], true); } } } return ""; } // open branches of tree back to first level public function zExpress(str:String):String { var nidx:Number = parseInt(str, 10); var parn:XML = TreeAr[nidx].parent(); while (parn) { if (Tre.isBranchOpen(parn)) { } else { Tre.toggleBranch(parn, true); } parn = parn.parent(); } return ""; } // find nodes or values public function tFind(str:String):String { var lidx:Number; var rslt:Number = -1; var cmpr:String = Utils.FromYml(str); var namr:String = Utils.FromYml(Valuer).toLowerCase(); // str is what to find, empty means no content search // determine find type var caser:Boolean = Boolean(Optns & 0x10); // true for case insensitive var rever:Boolean = Boolean(Optns & 0x20); // true for find in reverse direction // if no flag below, requires exact match var starter:Boolean = Boolean(Optns & 0x40); // true for match at start of string var ender:Boolean = Boolean(Optns & 0x80); // true for match at end of string var withn:Boolean = Boolean(Optns & 0x100); // true for match within var rexpr:Boolean = Boolean(Optns & 0x200); // true for match reg expr // var inchild:Boolean = Boolean(Optns & 0x400); // true for match within children var indesc:Boolean = Boolean(Optns & 0x800); // true for match within descendants var inleaf:Boolean = Boolean(Optns & 0x1000); // true for match within leaf nodes var inbran:Boolean = Boolean(Optns & 0x2000); // true for match within branch nodes // var deepr:Boolean = Boolean(Optns & 0x4000); // true means To index is depth of search var sumr:Boolean = Boolean(Optns & 0x8000); // true means put results in ChildAr if (caser) { cmpr = cmpr.toLowerCase(); } switch (Optns & 0x0F) { case 0 : // find name of node break; case 1 : // find name of value if (ToIdx < 0) { ToIdx = TreeAr.length; } for (lidx = FromIdx; lidx <= ToIdx; lidx++) { if (str.length > 0) { if (caser) { if (TreeAr[lidx].hasOwnProperty("@" + Valuer)) { if (cmpr == Utils.FromYml(TreeAr[lidx].@[namr]).toLowerCase()) { rslt = lidx; break; } } else { } if (TreeAr[lidx].hasOwnProperty("@" + Utils.FromYml(Valuer))) { if (cmpr == Utils.FromYml(TreeAr[lidx].@[Utils.FromYml(Valuer)])) { rslt = lidx; break; } } } else { if (cmpr == Utils.FromYml(TreeAr[lidx].@[namr])) { rslt = lidx; break; } } } else { if (TreeAr[lidx].hasOwnProperty("@" + Valuer) || TreeAr[lidx].hasOwnProperty("@" + Utils.FromYml(Valuer)) ) { rslt = lidx; break; } } } break; case 2 : // find name of node that has value name break; case 3 : // find name of node with simple content break; case 4 : // find name of node, value name and with simple content break; case 5 : // break; case 6 : // break; } return rslt.toString(); } // open or close branch of tree public function zExpand(str:String):String { var nod:XML = TreeAr[TreeAnchor]; var lgc:Boolean = (parseInt(str, 10) != 0); var rslt:String = "0"; if (Tre.dataProvider.isBranch(nod)) { var exp:Boolean = Tre.isBranchOpen(nod); Tre.toggleBranch(nod, lgc); if (exp) { rslt = "1"; } } return rslt; } // force specific attribute of node exist/not public function zAttring(str:String):String { var nod:XML = TreeAr[TreeAnchor]; var lgc:Boolean = (parseInt(str, 10) != 0); // start with non-yml attribute AttrAr = nod.attribute(Utils.FromYml(Valuer)); if (lgc) { // must make this value, check for non-yml exists if (AttrAr.length() > 0) { // the non-yml version exists } else { // check for the yml version exists AttrAr = nod.attribute(Valuer); if (AttrAr.length() > 0) { // the yml version exists } else { // the yml version does not yet exist, make sure it does nod.@[Valuer] = ""; } } } else { // must remove this value from node if (AttrAr.length() > 0) { // the non-yml version exists delete AttrAr[0]; } else { // check for the yml version AttrAr = nod.attribute(Valuer); if (AttrAr.length() > 0) { // the yml version exists, delete it delete AttrAr[0]; } else { // the yml version does not exist } } } return ""; } public function NoAttrs(str:String):String { var nidx:Number = parseInt(str, 10); var nod:XML = TreeAr[nidx]; var ridx:Number; delete nod.@*; /* AttrAr = nod.attributes(); for (ridx = AttrAr.length() - 1; ridx >= 0; ridx--) { delete AttrAr[ridx]; } */ return ""; } // does specific attribute of node exist public function zAttred(str:String):String { var nod:XML = TreeAr[TreeAnchor]; AttrAr = nod.attribute(str); var alen:Number = AttrAr.length(); if (alen == 0) { AttrAr = nod.attribute(Utils.FromYml(str)); alen = AttrAr.length(); } return alen.toString(); } // remove child nodes public function zUnchild(str:String):String { var nidx:Number = parseInt(str, 10); var nod:XML = TreeAr[nidx]; nod.setChildren(new XMLList()); arTree(); return ""; } // remove all tree attributes public function zClearAttr(str:String):String { var nidx:Number = parseInt(str, 10); var attr:XML; var ridx:Number; delete TreeAr[nidx].@*; return ""; } // reset Copy buffer public function zReset(focs:String):String { CopyBuf = new XML(Utils.hex2asc(focs)); return ""; } // move node to another parent public function zMove(str:String):String { var nidx:Number = parseInt(str, 10); var nod:XML = TreeAr[nidx]; var par:XML = TreeAr[TreeAnchor]; var ridx:Number = nidx; if (nod.parent() != par) { var rmv:XML = nod.copy(); rmv.setChildren(new XMLList()); var delr:XMLList = new XMLList(); delr[0] = nod; delete delr[0]; rmv = par.appendChild(rmv); arTree(); ridx = Treed(rmv, 0); } return ridx.toString(); } // copy children to tree buffer public function zCopyBelow(str:String):String { var nidx:Number = parseInt(str, 10); var nod:XML = TreeAr[nidx]; var copyx:XMLList = nod.children(); var copyr:XML; for each(copyr in copyx) { CopyBuf.appendChild(copyr.copy()); } return ""; } // copy node to tree buffer public function zCopy(str:String):String { var nidx:Number = parseInt(str, 10); var nod:XML = TreeAr[nidx]; CopyBuf.appendChild(nod.copy()); return nod.toXMLString(); } // copy only top node to tree buffer public function zCopyNode(str:String):String { var nidx:Number = parseInt(str, 10); var nod:XML = TreeAr[nidx]; var ncop:XML = nod.copy(); ncop.setChildren(new XMLList()); CopyBuf.appendChild(ncop); return ncop.toXMLString(); } // delete node public function zDel(str:String):String { var nidx:Number = parseInt(str, 10); var nod:XML = TreeAr[nidx]; var delr:XMLList = new XMLList(); delr[0] = nod; delete delr[0]; arTree(); return ""; } // list of values of node public function zGetValues(str:String):String { var nidx:Number = parseInt(str, 10); var nod:XML = TreeAr[nidx]; ChildAr = nod.attributes(); var clen:Number = ChildAr.length(); var lidx:Number; var rslt:String = ""; // tree attributes are already escaped for (lidx = 0; lidx < clen; lidx++) { rslt += "\"" + Utils.FromYml(ChildAr[lidx].toString()).replace(/"/gi, "\"\"") + "\" "; rslt += "\"" + Utils.FromYml(ChildAr[lidx].name()).replace(/"/gi, "\"\"") + "\" "; } return rslt + clen.toString(); } // list of values of node public function zGetValuesRev(str:String):String { var nidx:Number = parseInt(str, 10); var nod:XML = TreeAr[nidx]; ChildAr = nod.attributes(); var clen:Number = ChildAr.length(); var lidx:Number; var rslt:String = ""; // tree attributes are already escaped for (lidx = 0; lidx < clen; lidx++) { rslt += "\"" + Utils.FromYml(ChildAr[clen - lidx - 1].toString()).replace(/"/gi, "\"\"") + "\" "; rslt += "\"" + Utils.FromYml(ChildAr[clen - lidx - 1].name()).replace(/"/gi, "\"\"") + "\" "; } return rslt + clen.toString(); } // list of children indices of node public function zBelow(str:String):String { var nidx:Number = parseInt(str, 10); var nod:XML = TreeAr[nidx]; ChildAr = nod.children(); var clen:Number = ChildAr.length(); var lidx:Number; var rslt:String = ""; for (lidx = 0; lidx < clen; lidx++) { rslt += Treed(ChildAr[lidx], nidx).toString() + " "; } return rslt + clen.toString(); } // list of children locations of node public function zChiOf(str:String):String { var nidx:Number = parseInt(str, 10); var nod:XML = TreeAr[nidx]; var clen:Number = nod.children().length(); var rslt:String = "0 0"; if (clen > 0) { rslt = Treed(nod.children()[clen - 1], nidx + 1) + " " + clen.toString(); } return rslt; } // is node expanded public function tExpanded(str:String):String { var nidx:Number = parseInt(str, 10); var nod:XML = TreeAr[nidx]; var rslt:String = "0"; if (Tre.isBranchOpen(nod)) { rslt = "1"; } return rslt; } // children of node public function tChildren(str:String):String { var nidx:Number = parseInt(str, 10); var nod:XML = TreeAr[nidx]; ChildAr = nod.children(); return ChildAr.length(); } public function tTouch(str:String):String { var nidx:Number = parseInt(str, 10); Tre.touchable = (nidx != 0); return ""; } // last child node public function tLastNode(str:String):String { var nidx:Number = parseInt(str, 10); var nod:XML = TreeAr[nidx]; ChildAr = nod.children(); var clen:Number = ChildAr.length(); var ridx:Number = -1; if (clen > 0) { ridx = Treed(ChildAr[clen - 1], nidx); } return ridx.toString(); } // first sibling node public function tFirstNode(str:String):String { var nidx:Number = parseInt(str, 10); var ridx:Number = 0; if (nidx > 0) { var nod:XML = TreeAr[nidx]; var parn:XML = nod.parent(); ChildAr = parn.children(); var clen:Number = ChildAr.length(); if (clen > 0) { ridx = Treed(ChildAr[0], 0); } } return ridx.toString(); } // - of Seek public function tPrevNode(str:String):String { var nidx:Number = parseInt(str, 10); var nod:XML = TreeAr[nidx]; var par:XMLList = nod.parent().children(); var plen:Number = par.length(); var chidx:Number = nod.childIndex(); var ridx:Number = -1; if (chidx > 0) { ridx = Treed(par[chidx - 1], 0); } return ridx.toString(); } public function tAdding(str:String):String { var nod:XML; var newch:XML = new XML("<" + str + "/>"); // if anchor is -1 it means add to very end of tree // if there are no nodes in tree, becomes root node // if there are tree nodes, becomes child of last tree node if (TreeAnchor > (TreeAr.length - 1)) { TreeAnchor = -1; } if (TreeAnchor < 0) { if (TreeAr.length > 0) { // add as child to last node in TreeAr nod = TreeAr[TreeAr.length - 1]; nod.appendChild(newch); } else { // becomes first (root) node in tree nod = xhierTree.xmlListData[0] = newch; } } else { // append the child to anchor node nod = TreeAr[TreeAnchor]; nod.appendChild(newch); } arTree(); TreeAnchor = Treed(newch, 0); return TreeAnchor.toString(); } public function tImging(str:String):String { var nod:XML; var newch:XML = new XML("<" + str + " Img=\"" + NodeC.Xscape(Valuer) + "\" />"); // if anchor is -1 it means add to very end of tree // if there are no nodes in tree, becomes root node // if there are tree nodes, becomes child of last tree node if (TreeAnchor > (TreeAr.length - 1)) { TreeAnchor = -1; } if (TreeAnchor < 0) { if (TreeAr.length > 0) { // add as child to last node in TreeAr nod = TreeAr[TreeAr.length - 1]; nod.appendChild(newch); } else { // becomes first (root) node in tree nod = xhierTree.xmlListData[0] = newch; } } else { // append the child to anchor node nod = TreeAr[TreeAnchor]; nod.appendChild(newch); } arTree(); TreeAnchor = Treed(newch, 0); return TreeAnchor.toString(); } // for adds, empty node name means add ChildAr contents // instead of single node // add child last public function tAddChild(str:String):String { var nod:XML = TreeAr[TreeAnchor]; var newch:XML = new XML("<" + str + "/>"); nod.appendChild(newch); arTree(); TreeAnchor = Treed(newch, TreeAnchor); return TreeAnchor.toString(); } // add sib as first public function tFirstSib(str:String):String { var nod:XML = TreeAr[TreeAnchor]; var par:XML = nod.parent(); var newch:XML = new XML("<" + str + "/>"); par.prependChild(newch); arTree(); TreeAnchor = Treed(newch, 0); return TreeAnchor.toString(); } // add tree buffer before children of node public function zInsert(str:String):String { var nxlst:XMLList = CopyBuf.children(); if (nxlst.length() > 0) { var nidx:Number = parseInt(str, 10); var nod:XML = TreeAr[nidx]; var ridx:Number; for (ridx = nxlst.length() - 1; ridx >= 0; ridx--) { nod.prependChild(nxlst[ridx]); } arTree(); TreeAnchor = Treed(nxlst[0], nidx); } return TreeAnchor.toString(); } // add tree buffer after children of node public function zAfter(str:String):String { var nxlst:XMLList = CopyBuf.children(); if (nxlst.length() > 0) { var nidx:Number = parseInt(str, 10); var nod:XML = TreeAr[nidx]; var ridx:Number; for (ridx = 0; ridx < nxlst.length(); ridx++) { nod.appendChild(nxlst[ridx]); } arTree(); TreeAnchor = Treed(nxlst[0], nidx); } return TreeAnchor.toString(); } // insert tree buffer at specified node public function zInsertAt(str:String):String { var nxlst:XMLList = CopyBuf.children(); if (nxlst.length() > 0) { var nidx:Number = parseInt(str, 10); var nod:XML = TreeAr[nidx]; var par:XML = nod.parent(); var ridx:Number; for (ridx = nxlst.length() - 1; ridx >= 0; ridx--) { par.insertChildBefore(nod, nxlst[ridx]); } nxlst = null; arTree(); TreeAnchor = nidx; } return TreeAnchor.toString(); } // insert tree buffer after specified node public function zAfterAt(str:String):String { var nxlst:XMLList = CopyBuf.children(); if (nxlst.length() > 0) { var nidx:Number = parseInt(str, 10); var nod:XML = TreeAr[nidx]; var par:XML = nod.parent(); var ridx:Number; for (ridx = nxlst.length() - 1; ridx >= 0; ridx--) { par.insertChildAfter(nod, nxlst[ridx]); } nxlst = null; arTree(); TreeAnchor = nidx + 1; } return TreeAnchor.toString(); } // add sib before public function tPreSib(str:String):String { var nod:XML = TreeAr[TreeAnchor]; var par:XML = nod.parent(); var newch:XML = new XML("<" + str + "/>"); par.insertChildBefore(nod, newch); arTree(); TreeAnchor = Treed(newch, 0); return TreeAnchor.toString(); } // add sib after public function tPostSib(str:String):String { var nod:XML = TreeAr[TreeAnchor]; var par:XML = nod.parent(); var newch:XML = new XML("<" + str + "/>"); par.insertChildAfter(nod, newch); arTree(); TreeAnchor = Treed(newch, TreeAnchor); return TreeAnchor.toString(); } // add sib as last public function tLastSib(str:String):String { var nod:XML = TreeAr[TreeAnchor]; var par:XML = nod.parent(); var newch:XML = new XML("<" + str + "/>"); par.appendChild(newch); arTree(); TreeAnchor = Treed(newch, TreeAnchor); return TreeAnchor.toString(); } // add child first public function tPreChild(str:String):String { var nod:XML = TreeAr[TreeAnchor]; var newch:XML = new XML("<" + str + "/>"); nod.prependChild(newch); arTree(); TreeAnchor = Treed(newch, TreeAnchor); return TreeAnchor.toString(); } // named child Seek public function tChild(str:String):String { var ridx:Number = -1; var nod:XML; var chidx:Number; for (chidx = 0; chidx < ChildAr.length(); chidx++) { nod = ChildAr[chidx]; if (nod.localName() == str) { ridx = Treed(nod, 0); break; } } return ridx.toString(); } // + of Seek public function tNextNode(str:String):String { var nidx:Number = parseInt(str, 10); var nod:XML = TreeAr[nidx]; var par:XMLList = nod.parent().children(); var plen:Number = par.length(); var chidx:Number = nod.childIndex(); var ridx:Number = -1; if (chidx < (plen - 1)) { ridx = Treed(par[chidx + 1], nidx); } return ridx.toString(); } public function tScrollH(str:String):String { var nidx:Number = parseInt(str, 10); var nscr:Number = Tre.horizontalScrollPosition + nidx; if (nscr < 0) { nscr = 0; } else { if (nscr > Tre.maxHorizontalScrollPosition) { nscr = Tre.maxHorizontalScrollPosition; } } Tre.scrollToPosition(nscr, NaN, NaN); return nscr.toString(); } public function tScrollV(str:String):String { var nidx:Number = parseInt(str, 10); var nscr:Number = Tre.verticalScrollPosition + nidx; if (nscr < 0) { nscr = 0; } else { if (nscr > Tre.maxVerticalScrollPosition) { nscr = Tre.maxVerticalScrollPosition; } } Tre.scrollToPosition(NaN, nscr, NaN); return nscr.toString(); } public function uNextNode(str:String):String { var nidx:Number = parseInt(str, 10); var nod:XML = TreeAr[nidx]; var ridx:Number; var resu:String = ""; var rxml:XML = xNext(nod); if (rxml) { ridx = Treed(rxml, nidx); resu = ridx.toString(); } return resu; } // second part of \! public function tAtValue(str:String):String { Valuer = str; return ""; } // from index public function tFrom(str:String):String { FromIdx = parseInt(str, 10); return ""; } // to index, -1 is to end of target public function tTo(str:String):String { ToIdx = parseInt(str, 10); return ""; } // options for find public function tOptions(str:String):String { Optns = parseInt(str, 10); return ""; } // second part of \_ public function tGetValue(str:String):String { var strx:String = TreeAr[TreeAnchor].@[str]; if (strx.length > 0) { } else { strx = TreeAr[TreeAnchor].@[Utils.FromYml(str)]; } return strx; } // third part of \! public function tSetValue(str:String):String { var nod:XML = TreeAr[TreeAnchor]; AttrAr = nod.attribute(Utils.FromYml(Valuer)); // must remove this value from node if (AttrAr.length() > 0) { // the non-yml version exists nod.@[Utils.FromYml(Valuer)] = str; } else { // the yml version should be set nod.@[Valuer] = str; } return ""; } // new mark for node public function tSetMark(str:String):String { var nod:XML = TreeAr[TreeAnchor]; var nmrk:String = "_Mark"; var xmrk:String = nod.@[nmrk]; if (xmrk.length > 0) { } else { nmrk = Utils.ToYml(nmrk); xmrk = nod.@[nmrk]; } nod.@[nmrk] = str; return xmrk; } // new mark for node public function tUnmark(str:String):String { // record the open branches within the tree var lidx:Number; var nmrk:String = "_Mark"; var omrk:String = Utils.ToYml(nmrk); var xmrk:String = ""; var nod:XML; for (lidx = 0; lidx < TreeAr.length; lidx++) { nod = TreeAr[lidx]; xmrk = nod.@[omrk]; if (xmrk.length > 0) { if (xmrk == "Changed") { nod.@[omrk] = ""; } } xmrk = nod.@[nmrk]; if (xmrk.length > 0) { if (xmrk == "Changed") { nod.@[nmrk] = ""; } } } return "-"; } // get newly added index public function tGetAnchor(str:String):String { return TreeAnchor.toString(); } // get number of tree nodes public function tListed(str:String):String { var lstd:Number = TreeAr.length; return lstd.toString(); } // first part of \! public function tSetAnchor(str:String):String { var tond:Number = parseInt(str, 10); TreeAnchor = tond; return ""; } // _\\ public function tGetName(str:String):String { var tond:Number = parseInt(str, 10); var tonx:XML = TreeAr[tond]; return tonx.localName(); } // \\ public function tGetHier(str:String):String { var tond:Number = parseInt(str, 10); var hier:String; var tonx:XML = TreeAr[tond]; hier = Dhron.Run.Lineage(tonx); hier = hier.substr(0, hier.length - 1); hier = "\\" + hier.replace(/\./g, "\\"); return hier; } public function tReroot(str:String):String { var xnam:String; if (str.length > 0) { xnam = Utils.hex2asc(str); } else { xnam = TreeAr[0].localName(); } var tmpr:XML = new XML("<" + xnam + ">"); Tre.dataProvider = null; try { xhierTree.xmlListData[0] = tmpr; } catch (e:Error) { xhierTree.xmlListData[0] = new XML(); } arTree(); Tre.dataProvider = xhierTree; return TreeAr.length.toString(); } // !\\ public function tSetName(str:String):String { var tonx:XML = TreeAr[TreeAnchor]; tonx.setLocalName(str); return ""; } // generate the array of descendants recursively public function zxTree(xmlr:XML):Boolean { var rslt:Boolean = true; if (xmlr != TreeXml) { rslt = false; var ndr:XML; var brxl:XMLList = xmlr.children(); for each(ndr in brxl) { TreeIdx++; if (rslt = zxTree(ndr)) break; } } return rslt; } // create the tree array from current tree xml public function zrTree(xmlr:XML):Boolean { TreeIdx = 0; TreeXml = xmlr; // create the tree array based on the root node return zxTree(xhierTree.xmlListData[0]); } // generate the array of descendants recursively public function yxTree():void { if (TreeIdx > 0) { var ndr:XML; var brxl:XMLList = TreeXml.children(); for each(ndr in brxl) { TreeXml = ndr; TreeIdx--; yxTree(); if (TreeIdx == 0) break; } } } // create the tree array from current tree xml public function yrTree(idx:Number):void { TreeIdx = idx; TreeXml = xhierTree.xmlListData[0]; // create the tree array based on the root node yxTree(); } // generate the array of descendants recursively public function axTree(bran:XML):void { var ndr:XML; var brxl:XMLList = bran.children(); for each(ndr in brxl) { TreeAr.push(ndr); axTree(ndr); } } // create the tree array from current tree xml public function arTree():void { // clear the tree array TreeAr = new Array(); // first element of array is the root (0 index) TreeAr.push(xhierTree.xmlListData[0]); // create the tree array based on the root node axTree(TreeAr[0]); } // save tree contents xml string public function saveTree(focs:String):String { // record the open branches within the tree if (focs.length > 0) { TreeFile = Utils.hex2asc(focs); } var lidx:Number; for (lidx = 0; lidx < TreeAr.length; lidx++) { if (Tre.dataProvider.isBranch(TreeAr[lidx])) { if (Tre.isBranchOpen(TreeAr[lidx])) { TreeAr[lidx].@[Utils.ToYml("_open")] = Utils.ToYml("true"); } else { TreeAr[lidx].@[Utils.ToYml("_open")] = ""; } } else { TreeAr[lidx].@[Utils.ToYml("_open")] = ""; } } if (TreeAr.length > 0) { // var focy:String = Dhron.Basis.RallFile(new File(TreeFile)); Dhron.Basis.YallText(TreeFile, TreeAr[0].toXMLString()); } return TreeAr.length.toString(); } // open all branches of tree public function openTree(str:String):String { // record the open branches within the tree var lidx:Number; for (lidx = 0; lidx < TreeAr.length; lidx++) { if (Tre.dataProvider.isBranch(TreeAr[lidx])) { if (TreeAr[lidx].@[Utils.ToYml("_open")].toString() == "true") { Tre.toggleBranch(TreeAr[lidx], true); } } } return ""; } // set new tree contents from xml string public function doTree(focs:String):String { var focx:String; if (focs.length == 0) { focx = TreeFile; } else { focx = Utils.hex2asc(focs); } Tre.dataProvider = null; try { var focy:String = Dhron.Basis.RallFile(new File(focx)); TreeFile = focx; xhierTree.xmlListData[0] = new XML(focy); } catch (e:Error) { xhierTree.xmlListData[0] = new XML(); } arTree(); Tre.dataProvider = xhierTree; return TreeAr.length.toString(); } include "../../../Apart/Anchs.as" protected function trigTree(evt:Event):void { if (evt["data"] is XML) { // tree branch triggered var evxml:XML = (evt["data"] as XML); TreeAnchor = Treed(evxml, 0); Dhron.Face.Tell(TreeName + "_TreeSel", AppIdent + "|" + TreeAnchor.toString() + "|Name|" + TreeName + "|" + Utils.Yscape(evxml.localName()) + "|" + Utils.Yscape(NodeC.Valer(evxml)) + "|" + Utils.Yscape(evxml.toXMLString()) ); } } protected function chgTree(evt:Event):void { if (evt["data"] is XML) { // tree branch changed var evxml:XML = (evt["data"] as XML); Dhron.Face.Tell(TreeName + "_TreeChg", AppIdent + "|0|Name|" + TreeName + "|" + Utils.Yscape(evxml.localName()) + "|" + Utils.Yscape(evxml.toXMLString()) ); } } protected function clsTree(evt:Event):void { if (evt["data"] is XML) { // tree branch closed var evxml:XML = (evt["data"] as XML); Dhron.Face.Tell(TreeName + "_TreeCls", AppIdent + "|0|Name|" + TreeName + "|" + Utils.Yscape(evxml.localName()) + "|" + Utils.Yscape(evxml.toXMLString()) ); } } protected function opnTree(evt:Event):void { if (evt["data"] is XML) { // tree branch open var evxml:XML = (evt["data"] as XML); Dhron.Face.Tell(TreeName + "_TreeOpn", AppIdent + "|0|Name|" + TreeName + "|" + Utils.Yscape(evxml.localName()) + "|" + Utils.Yscape(evxml.toXMLString()) ); } } protected function kUpTree(evt:starling.events.KeyboardEvent):void { Dhron.Warn(TreeName + "_TreeKey" + "," + evt.keyCode.toString()); switch (evt.keyCode) { case Keyboard.KEYNAME_PAGEDOWN: var kdisp:Number = 300; // trace("Control? " + evt.ctrlKey); // trace("Shift? " + evt.shiftKey); // trace("Alt? " + evt.altKey); tScrollV(kdisp.toString()); break; } } protected function kDownTree(evt:Event):void { /* switch (evt.type) { case Keyboard.KEYNAME_PAGEDOWN: break; } */ } ]]>