Flex3のメニューを動的に操作するクラス



ブラウザでダウンロード
動的なメニューはクラスが必要
配列を用いて固定的なメニューを作成するのであれば、
定数として初期値を入れる形でも良いのですが、
やはり、クラスとして実装したほうが便利に感じます。

( ここでは、最低限の機能しか実装していません )
MenuBlock.as
package {

// *********************************************************
// メニューのポップアップ単位を
// 1ブロックとして構築していくクラス
// *********************************************************
public class MenuBlock {
	public var block:Array = null;
	public function MenuBlock () {
		block = new Array();
	}

	// *********************************************************
	// 最初に実行して、以後この文字列で識別する
	// 名称を変更してもいいように、内部識別を作っても良い
	// *********************************************************
	public function addItem( label:String ):void {
		var obj:Object = new Object();
		obj["label"] = label;
		block.push(obj);
	}

	// *********************************************************
	// セパレータ
	// *********************************************************
	public function addSep(  ):void {
		var obj:Object = new Object();
		obj["type"] = "separator";
		block.push(obj);
	}

	// *********************************************************
	// 階層を作成
	// *********************************************************
	public function addChild( label:String, mb:MenuBlock ):void {
		for( var i:int; i < block.length; i++ ) {
			if ( block[i]["label"] == label ) {
				block[i]["children"] = mb.block;
				break;
			}
		}
	}

	// *********************************************************
	// アイコンをセット
	// *********************************************************
	public function setIcon( label:String, icon:Class ):void {
		for( var i:int; i < block.length; i++ ) {
			if ( block[i]["label"] == label ) {
				block[i]["icon"] = icon;
				break;
			}
		}
	}

	// *********************************************************
	// その他のオプションをセット
	// *********************************************************
	public function setOption( label:String, target:String, value:Object ):void {
		for( var i:int; i < block.length; i++ ) {
			if ( block[i]["label"] == label ) {
				block[i][target] = value;
				break;
			}
		}
	}
}

}
以下が使用サンプルです
import mx.controls.*;
import mx.events.*; 
import mx.formatters.*;
import flash.events.*; 

include "Parts.as"
// 画像の埋め込み
include "Icon.as"

private var myMenuData:Array;	// 配列仕立て
private	var popupMenu1:Menu;
private var save:Object;

// このウインドウ
private var me:Application = null;

// *********************************************************
// アプリケーションの初期化
// *********************************************************
public function initData():void {

	firebug("処理開始");

	me = this;

	// *****************************************************
	// 配列仕立てのポップアップメニュー
	// *****************************************************
/*
	myMenuData = 
	[
		{label: "ファイル" , icon: icon1, children:[
				{label: "開く",  enabled: false }
				,{label: "保存", userOption: "001" }
				,{type: "separator" }
				,{label: "オプション" , children:[
						{label: "お気に入り", icon: iconFavorites }
						,{label: "情報",  icon: iconInfoBox }
						,{label: "検索", icon: iconSearch }
				]}
		]}
	,
		{label: "背景処理" , icon: icon2, children:[
				{label: "背景変更", type: "check", toggled: true }
				,{type: "separator" }
				,{label: "ここを動的に変更", type: "check", toggled: true }
		]}
	,
		{label: "予備", icon: icon3 }
	];
*/

	// 一番深い階層
	var mb1:MenuBlock = new MenuBlock();
	mb1.addItem("お気に入り");
	mb1.setIcon("お気に入り",iconFavorites);
	mb1.addItem("情報");
	mb1.setIcon("情報",iconInfoBox);
	mb1.addItem("検索");
	mb1.setIcon("検索",iconSearch);

	// 2番目の階層( A )
	var mb2A:MenuBlock = new MenuBlock();
	mb2A.addItem("開く");
	mb2A.setOption("開く","enabled", false );
	mb2A.addItem("保存");
	mb2A.setOption("保存","userOption", "001" );
	mb2A.addSep();
	mb2A.addItem("オプション");
	mb2A.addChild("オプション",mb1);	// 一番深い階層をリンク

	// 2番目の階層( B )
	var mb2B:MenuBlock = new MenuBlock();
	mb2B.addItem("背景変更");
	mb2B.setOption("背景変更","type", "check");
	mb2B.setOption("背景変更","toggled", true);
	mb2B.addSep();
	mb2B.addItem("ここを動的に変更");
	mb2B.setOption("ここを動的に変更","check", true);

	// 一番上の階層
	var mb3:MenuBlock = new MenuBlock();
	mb3.addItem("ファイル");
	mb3.setIcon("ファイル",icon1);
	mb3.addChild("ファイル",mb2A);	// 下位階層をリンク
	mb3.addItem("背景処理");
	mb3.setIcon("背景処理",icon2);
	mb3.addChild("背景処理",mb2B);	// 下位階層をリンク
	mb3.addItem("予備");
	mb3.setIcon("予備",icon3);


	mb2B.addItem("あとから追加");


	popupMenu1 = Menu.createMenu( null, mb3.block, false);
	// 表示する内容を対応させる
	popupMenu1.labelField = "label";
	popupMenu1.iconField = "icon";
	// イベントを登録
	popupMenu1.addEventListener("itemClick", clickMenuHandler);
	popupMenu1.addEventListener("itemRollOver", menuItemRollOver);
	popupMenu1.addEventListener("menuShow", popupMenuCheck);

	popupMenu1.setStyle( "backgroundColor", "0x000000" );
	popupMenu1.setStyle("backgroundAlpha","0.2");
	popupMenu1.setStyle("backgroundImage", imgMenuBackSmile );
	popupMenu1.setStyle("backgroundSize","100%");

}

// *********************************************************
// creationComplete
// *********************************************************
private function initApp1():void {

}

// *********************************************************
// itemClick
// *********************************************************
private function clickMenuHandler(e:MenuEvent):void  {


}

// *********************************************************
// itemRollOver
// e.menu : マウスの下のメニュー
// *********************************************************
private function menuItemRollOver(e:mx.events.MenuEvent ):void {

}

// *********************************************************
// menuShow
// サブメニューが開かれた
// e.menu : 開かれたメニュー
// *********************************************************
private function popupMenuCheck(e:mx.events.MenuEvent ):void {

}