I’ve got a dynamically generated XML Menu. Works pretty well except for a couple of slight problems.
- I need the ‘menu’ node also be clickable to goto a URL
- If the ‘menu’ only has a single child node, I don’t want the child node to display.
Code is below. If anyone can help, that would be appreciated.
// generates a list of menu items (effectively one menu)
// given the inputted parameters. This makes the main menu
// as well as any of the submenus
GenerateMenu = function(container, name, x, y, depth, node_xml,direction) {
// variable declarations
var curr_node;
var curr_item;
var curr_menu = container.createEmptyMovieClip(name, depth);
// for all items or XML nodes (items and menus)
// within this node_xml passed for this menu
for (var i=0; i<node_xml.childNodes.length; i++) {
// movieclip for each menu item
if( direction == "horizontal"){
curr_item = curr_menu.attachMovie("menuitem","item"+i+"_mc", i);
curr_item._x = x + i*curr_item._width;
curr_item._y = y;
}
//Assumre direction is vertical
else{
curr_item = curr_menu.attachMovie("submenuitem","item"+i+"_mc", i);
curr_item._x = x;
curr_item._y = y + i*curr_item._height;
}
curr_item.trackAsMenu = true;
// item properties assigned from XML
curr_node = node_xml.childNodes*;
curr_item.action = curr_node.attributes.action;
curr_item.variables = curr_node.attributes.variables;
//curr_item.name.text = curr_node.attributes.name;
curr_item.txt = curr_node.attributes.name;
// item submenu behavior for rollover event
if (node_xml.childNodes*.nodeName == "menu"){
// open a submenu
curr_item.node_xml = curr_node;
curr_item.onRollOver = curr_item.onDragOver = function(){
this.gotoAndStop("over");
if(this._parent._name == "mainmenu_mc"){
var x = this._x+1;
var y = this._y + this._height ;
}
else{
var x = this._x + this._width - 3 ;
var y = this._y;
}
GenerateMenu(curr_menu, "submenu_mc", x, y, 1000, this.node_xml);
};
}else{ // nodeName == "item"
curr_item.arrow._visible = false;
// close existing submenu
curr_item.onRollOver = curr_item.onDragOver = function(){
this.gotoAndStop("over");
curr_menu.submenu_mc.removeMovieClip();
};
}
curr_item.onRollOut = curr_item.onDragOut = function(){
this.gotoAndStop("up");
if( ( this._parent._xmouse <= this._x || this._parent._ymouse <= this._y || this._parent._xmouse > this._x+this._width || this._parent._ymouse >= this._y+this._height ) && !menu_holder.mainmenu_mc.hitTest(_root._xmouse,_root._ymouse,true)){
menu_holder.mainmenu_mc.submenu_mc.removeMovieClip();
}
};
// any item, menu opening or not can have actions
curr_item.onRelease = function(){
Actions[this.action](this.variables);
CloseSubmenus();
};
} // end for loop
};
// create the main menu, this will be constantly visible
CreateMainMenu = function(x, y, depth, menu_xml){
// generate a menu list
GenerateMenu(menu_holder, "mainmenu_mc", x, y, depth, menu_xml.firstChild,"horizontal");
// close only submenus if visible durring a mouseup
// this main menu (mainmenu_mc) will remain
mainmenu_mc.onMouseUp = function(){
if (menu_holder.mainmenu_mc.submenu_mc && !menu_holder.mainmenu_mc.hitTest(_root._xmouse, _root._ymouse, true)){
CloseSubmenus();
}
};
};
// closes all submenus by removing the submenu_mc
// in the main menu (if it exists)
CloseSubmenus = function(){
for( var i in menu_holder.mainmenu_mc){
if( i == "submenu_mc" ){
menu_holder.mainmenu_mc*.removeMovieClip();
}
}
//mainmenu_mc.submenu_mc.removeMovieClip();
};
// This actions object handles methods for actions
// defined by the XML called when a menu item is pressed
Actions = Object();
Actions.gotoURL = function(contentsLabel){
contents_holder.gotoAndStop(contentsLabel);
getURL(contentsLabel);
};
// load XML, when done, run CreateMainMenu to interpret it
menu_xml = new XML();
menu_xml.ignoreWhite = true;
menu_xml.onLoad = function(ok){
// create main menu after successful loading of XML
if (ok){
CreateMainMenu(0, 0, 0, this);
}else{
trace("error: XML not successfully loaded");
}
};
// load first XML menu
menu_xml.load("menu.asp");