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



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

( ここでは、最低限の機能しか実装していません )
MenuBlock.as
01.package {
02. 
03.// *********************************************************
04.// メニューのポップアップ単位を
05.// 1ブロックとして構築していくクラス
06.// *********************************************************
07.public class MenuBlock {
08.    public var block:Array = null;
09.    public function MenuBlock () {
10.        block = new Array();
11.    }
12. 
13.    // *********************************************************
14.    // 最初に実行して、以後この文字列で識別する
15.    // 名称を変更してもいいように、内部識別を作っても良い
16.    // *********************************************************
17.    public function addItem( label:String ):void {
18.        var obj:Object = new Object();
19.        obj["label"] = label;
20.        block.push(obj);
21.    }
22. 
23.    // *********************************************************
24.    // セパレータ
25.    // *********************************************************
26.    public function addSep(  ):void {
27.        var obj:Object = new Object();
28.        obj["type"] = "separator";
29.        block.push(obj);
30.    }
31. 
32.    // *********************************************************
33.    // 階層を作成
34.    // *********************************************************
35.    public function addChild( label:String, mb:MenuBlock ):void {
36.        for( var i:int; i < block.length; i++ ) {
37.            if ( block[i]["label"] == label ) {
38.                block[i]["children"] = mb.block;
39.                break;
40.            }
41.        }
42.    }
43. 
44.    // *********************************************************
45.    // アイコンをセット
46.    // *********************************************************
47.    public function setIcon( label:String, icon:Class ):void {
48.        for( var i:int; i < block.length; i++ ) {
49.            if ( block[i]["label"] == label ) {
50.                block[i]["icon"] = icon;
51.                break;
52.            }
53.        }
54.    }
55. 
56.    // *********************************************************
57.    // その他のオプションをセット
58.    // *********************************************************
59.    public function setOption( label:String, target:String, value:Object ):void {
60.        for( var i:int; i < block.length; i++ ) {
61.            if ( block[i]["label"] == label ) {
62.                block[i][target] = value;
63.                break;
64.            }
65.        }
66.    }
67.}
68. 
69.}
以下が使用サンプルです
001.import mx.controls.*;
002.import mx.events.*;
003.import mx.formatters.*;
004.import flash.events.*;
005. 
006.include "Parts.as"
007.// 画像の埋め込み
008.include "Icon.as"
009. 
010.private var myMenuData:Array;   // 配列仕立て
011.private var popupMenu1:Menu;
012.private var save:Object;
013. 
014.// このウインドウ
015.private var me:Application = null;
016. 
017.// *********************************************************
018.// アプリケーションの初期化
019.// *********************************************************
020.public function initData():void {
021. 
022.    firebug("処理開始");
023. 
024.    me = this;
025. 
026.    // *****************************************************
027.    // 配列仕立てのポップアップメニュー
028.    // *****************************************************
029./*
030.    myMenuData =
031.    [
032.        {label: "ファイル" , icon: icon1, children:[
033.                {label: "開く",  enabled: false }
034.                ,{label: "保存", userOption: "001" }
035.                ,{type: "separator" }
036.                ,{label: "オプション" , children:[
037.                        {label: "お気に入り", icon: iconFavorites }
038.                        ,{label: "情報",  icon: iconInfoBox }
039.                        ,{label: "検索", icon: iconSearch }
040.                ]}
041.        ]}
042.    ,
043.        {label: "背景処理" , icon: icon2, children:[
044.                {label: "背景変更", type: "check", toggled: true }
045.                ,{type: "separator" }
046.                ,{label: "ここを動的に変更", type: "check", toggled: true }
047.        ]}
048.    ,
049.        {label: "予備", icon: icon3 }
050.    ];
051.*/
052. 
053.    // 一番深い階層
054.    var mb1:MenuBlock = new MenuBlock();
055.    mb1.addItem("お気に入り");
056.    mb1.setIcon("お気に入り",iconFavorites);
057.    mb1.addItem("情報");
058.    mb1.setIcon("情報",iconInfoBox);
059.    mb1.addItem("検索");
060.    mb1.setIcon("検索",iconSearch);
061. 
062.    // 2番目の階層( A )
063.    var mb2A:MenuBlock = new MenuBlock();
064.    mb2A.addItem("開く");
065.    mb2A.setOption("開く","enabled", false );
066.    mb2A.addItem("保存");
067.    mb2A.setOption("保存","userOption", "001" );
068.    mb2A.addSep();
069.    mb2A.addItem("オプション");
070.    mb2A.addChild("オプション",mb1); // 一番深い階層をリンク
071. 
072.    // 2番目の階層( B )
073.    var mb2B:MenuBlock = new MenuBlock();
074.    mb2B.addItem("背景変更");
075.    mb2B.setOption("背景変更","type", "check");
076.    mb2B.setOption("背景変更","toggled", true);
077.    mb2B.addSep();
078.    mb2B.addItem("ここを動的に変更");
079.    mb2B.setOption("ここを動的に変更","check", true);
080. 
081.    // 一番上の階層
082.    var mb3:MenuBlock = new MenuBlock();
083.    mb3.addItem("ファイル");
084.    mb3.setIcon("ファイル",icon1);
085.    mb3.addChild("ファイル",mb2A);  // 下位階層をリンク
086.    mb3.addItem("背景処理");
087.    mb3.setIcon("背景処理",icon2);
088.    mb3.addChild("背景処理",mb2B);  // 下位階層をリンク
089.    mb3.addItem("予備");
090.    mb3.setIcon("予備",icon3);
091. 
092. 
093.    mb2B.addItem("あとから追加");
094. 
095. 
096.    popupMenu1 = Menu.createMenu( null, mb3.block, false);
097.    // 表示する内容を対応させる
098.    popupMenu1.labelField = "label";
099.    popupMenu1.iconField = "icon";
100.    // イベントを登録
101.    popupMenu1.addEventListener("itemClick", clickMenuHandler);
102.    popupMenu1.addEventListener("itemRollOver", menuItemRollOver);
103.    popupMenu1.addEventListener("menuShow", popupMenuCheck);
104. 
105.    popupMenu1.setStyle( "backgroundColor", "0x000000" );
106.    popupMenu1.setStyle("backgroundAlpha","0.2");
107.    popupMenu1.setStyle("backgroundImage", imgMenuBackSmile );
108.    popupMenu1.setStyle("backgroundSize","100%");
109. 
110.}
111. 
112.// *********************************************************
113.// creationComplete
114.// *********************************************************
115.private function initApp1():void {
116. 
117.}
118. 
119.// *********************************************************
120.// itemClick
121.// *********************************************************
122.private function clickMenuHandler(e:MenuEvent):void  {
123. 
124. 
125.}
126. 
127.// *********************************************************
128.// itemRollOver
129.// e.menu : マウスの下のメニュー
130.// *********************************************************
131.private function menuItemRollOver(e:mx.events.MenuEvent ):void {
132. 
133.}
134. 
135.// *********************************************************
136.// menuShow
137.// サブメニューが開かれた
138.// e.menu : 開かれたメニュー
139.// *********************************************************
140.private function popupMenuCheck(e:mx.events.MenuEvent ):void {
141. 
142.}