= 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"
>
{TreeName}>
{BaseIdent}>
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 + ">" + 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;
}
*/
}
]]>