I’m trying to create a windows type Tree Menu, but with the new level shown on side rather than below. I’m still experimenting the best way to do it, and currently my idea was to have each new level to be load into the clicked button MC, so that I can have a easier way to detects the overall height/width, and who its related to. (Not sure is it the best way to do it).
Anyway, back to the topic. The code I wrote adds in a new level into the clicked MC. And I have a ‘+’, ‘-’, ‘’ button for each link, and it works like how it would in a windows.
The problem I face is, the link I clicked, the changes of the ‘+’/’-’ button would skip a layer to change for the opening or closing of a new layer.
And the most important part is, it keeps on adding extra level (same position, overlapping) at each level I clicked.
Example:
[LIST=1]
[]1st layer clicked, add 1 new level / ‘+’/’-’ work
[]2nd layer clicked, add another 1 new level / ‘+’/’-’ don’t work
[]3rd layer clicked, add 2 new level (overlapping) / ‘+’/’-’ work
[]4th layer clicked, add 3 new level (overlapping) / ‘+’/’-’ don’t work
[*]etc.
[/LIST]
I don’t know where gone wrong that makes it add extra level. Please help!
package classes
{
import flash.display.*;
import flash.events.*;
import flash.net.*;
import flash.text.*;
import flash.geom.*;
import com.greensock.*;
import com.greensock.easing.*;
import flashx.textLayout.events.StatusChangeEvent;
public class showData extends MovieClip
{
private var testNum:Number=0;
private var myXML:XML;
private var xmlLoader:URLLoader;
private var dataT:TextField;
private var dataTF:TextFormat = new TextFormat ;
private var dataTMC:MovieClip;
private var dataMC:MovieClip;
private var _statusBox:statusBox;
private var i:uint;
private var targetData;
private var targetDataID;
private var targetDataPos:Point;
private var newDataPos:Point = new Point ;
private var parentMC;
public function showData ():void
{
loadData (this);
}
private function loadData (event:Object):void
{
xmlLoader = new URLLoader ;
xmlLoader.load (new URLRequest("data.xml"));
xmlLoader.addEventListener (Event.COMPLETE,processXML);
}
private function processXML (e:Event):void
{
myXML = new XML(e.target.data);
createTextField ();
}
//---------------------------------------
private function check_statusBoxox ():void
{
if (myXML.MEMBER*. @ STATUS == "open")
{
_statusBox.gotoAndStop ("open");
}
else if (myXML.MEMBER*. @ STATUS == "close")
{
_statusBox.gotoAndStop ("close");
}
else if (myXML.MEMBER*. @ STATUS == "null")
{
_statusBox.gotoAndStop ("null");
}
}
//---------------------------------------
private function createTextField ():void
{
dataMC = new MovieClip ;
for (i = 0; i < myXML.children().length(); i++)
{
_statusBox = new statusBox ;
dataTMC = new MovieClip ;
_statusBox.name = "statusB";
_statusBox.mouseEnabled = false;
dataTMC.addChild (_statusBox);
_statusBox.y = 15 * i;
check_statusBoxox ();
dataT = new TextField ;
dataTF.size = 11;
dataT.defaultTextFormat = dataTF;
dataT.text = myXML.MEMBER*. @ ID;
dataT.textColor = 0x000000;
dataT.width = dataT.textWidth + 5;
dataT.height = dataT.textHeight + 3;
//dataT.background = true;
//dataT.backgroundColor = 0x333333;
dataT.x = _statusBox.x + _statusBox.width + 3;
dataT.y = 15 * i;
dataT.multiline = true;
dataT.mouseEnabled = false;
dataT.selectable = false;
dataT.name = "dataT";
dataTMC.name = "dataTMC";
//dataTMC.mouseChildren = true;
dataTMC.addChild (dataT);
dataMC.addChild (dataTMC);
dataMC.buttonMode = true;
dataTMC.addEventListener (MouseEvent.MOUSE_OVER,dataOver);
dataTMC.addEventListener (MouseEvent.MOUSE_OUT,dataOut);
dataTMC.addEventListener (MouseEvent.CLICK,dataClick);
}
addDataTo ();
positionData ();
}
private function addDataTo ():void
{
if (targetDataPos == null)
{
addChild (dataMC);
}
else
{
//add dataMC under its parent
parentMC.addChild (dataMC);
}
}
private function positionData ():void
{
if (targetDataPos == null)
{
dataMC.y = (stage.stageHeight / 2) - (dataMC.height / 2);
}
else
{
dataMC.x = targetData.x + 120;
dataMC.y = targetData.y-(dataMC.height / 2);
}
}
//---------------------------------------
private function dataOver (e:MouseEvent):void
{
e.target.getChildByName("dataT").background = true;
e.target.getChildByName("dataT").backgroundColor = 0xF7E34C;
}
private function dataOut (e:MouseEvent):void
{
e.target.getChildByName("dataT").background = false;
}
private function dataClick (e:MouseEvent):void
{
parentMC = e.target.parent.getChildByName("dataTMC");
targetData = e.target.getChildByName("dataT");
var targetStatus = e.target.getChildByName("statusB");
//Object position based on stage
targetDataPos = new Point(targetData.x,targetData.y);
newDataPos = e.target.localToGlobal(targetDataPos);
if (targetStatus.currentFrameLabel == "open")
{
targetStatus.gotoAndStop ("close");
var removeTarget = e.target.parent.getChildByName("dataTMC");
/*if (removeTarget.getChildAt(2) != null)
{
removeTarget.removeChild (removeTarget.getChildAt(2));
}
else
{
removeTarget.removeChild (removeTarget.getChildAt(1));
}*/
}
else if (targetStatus.currentFrameLabel == "close")
{
testNum++
trace(e.target.numChildren, testNum)
targetStatus.gotoAndStop ("open");
loadData (e.target);
}
}
}
}