This is an automated email from the ASF dual-hosted git repository.

pent pushed a commit to branch develop
in repository https://gitbox.apache.org/repos/asf/royale-asjs.git


The following commit(s) were added to refs/heads/develop by this push:
     new 373cc37  Adding MenuBar and CascadingMenu components.
373cc37 is described below

commit 373cc37854204e9c91d6c3537a1f850e30869c4f
Author: Peter Ent <[email protected]>
AuthorDate: Mon Feb 26 16:23:58 2018 -0500

    Adding MenuBar and CascadingMenu components.
---
 .../Basic/src/main/resources/basic-manifest.xml    |   9 +-
 .../projects/Basic/src/main/resources/defaults.css |  59 +++++++++++
 .../projects/Basic/src/main/royale/BasicClasses.as |   9 ++
 .../main/royale/org/apache/royale/core/IMenu.as    |  43 ++++++++
 .../models/MenuModel.as => CascadingMenu.as}       |  28 +++---
 .../src/main/royale/org/apache/royale/html/Menu.as |  67 +++++++++++--
 .../html/{beads/models/MenuModel.as => MenuBar.as} |  62 +++++++++---
 ...as => CascadingMenuSelectionMouseController.as} |  86 ++++++----------
 .../controllers/ItemRendererMouseController.as     |   1 +
 ...ouseController.as => MenuBarMouseController.as} |  85 ++++++----------
 .../controllers/MenuSelectionMouseController.as    | 109 +++++++++++++++++----
 .../models/{MenuModel.as => CascadingMenuModel.as} |  28 ++----
 .../beads/models/{MenuModel.as => MenuBarModel.as} |  26 +----
 .../apache/royale/html/beads/models/MenuModel.as   |  66 +++++++++++--
 ...temRenderer.as => CascadingMenuItemRenderer.as} |  95 +++++++++++-------
 ...{MenuItemRenderer.as => MenuBarItemRenderer.as} |  69 ++-----------
 .../royale/html/supportClasses/MenuItemRenderer.as |  29 +-----
 frameworks/themes/Basic/basic.css                  |   6 ++
 18 files changed, 542 insertions(+), 335 deletions(-)

diff --git a/frameworks/projects/Basic/src/main/resources/basic-manifest.xml 
b/frameworks/projects/Basic/src/main/resources/basic-manifest.xml
index acc6606..fff4af8 100644
--- a/frameworks/projects/Basic/src/main/resources/basic-manifest.xml
+++ b/frameworks/projects/Basic/src/main/resources/basic-manifest.xml
@@ -112,7 +112,6 @@
     <component id="TextButtonItemRenderer" 
class="org.apache.royale.html.supportClasses.TextButtonItemRenderer"/>
     <component id="DataFieldProviderBead" 
class="org.apache.royale.html.beads.DataFieldProviderBead"/>
     <component id="ButtonBarButtonItemRenderer" 
class="org.apache.royale.html.supportClasses.ButtonBarButtonItemRenderer"/>
-    <component id="MenuItemRenderer" 
class="org.apache.royale.html.supportClasses.MenuItemRenderer"/>
     <!--
      <component id="TextFieldItemRenderer" 
class="org.apache.royale.html.supportClasses.TextFieldItemRenderer"/>
      <component id="HScrollBar" 
class="org.apache.royale.html.supportClasses.HScrollBar"/>
@@ -137,7 +136,6 @@
     <component id="Spacer" class="org.apache.royale.html.Spacer" />
     <component id="HDividedContainerDivider" 
class="org.apache.royale.html.supportClasses.HDividedContainerDivider" />
     <component id="VDividedContainerDivider" 
class="org.apache.royale.html.supportClasses.VDividedContainerDivider" />
-    <component id="Menu" class="org.apache.royale.html.Menu" />
     <!--
      <component id="ImageAndTextButtonView" 
class="org.apache.royale.html.beads.ImageAndTextButtonView" />
      -->
@@ -217,5 +215,12 @@
     <component id="HashChangeNotifierBeadWithTitle" 
class="org.apache.royale.routing.HashChangeNotifierBeadWithTitle" />
     <component id="URLParameterBead" 
class="org.apache.royale.routing.URLParameterBead" />
     <component id="EscapedFragmentBead" 
class="org.apache.royale.routing.EscapedFragmentBead" />
+    
+    <component id="MenuBar" class="org.apache.royale.html.MenuBar"/>
+    <component id="Menu" class="org.apache.royale.html.Menu" />
+    <component id="CascadingMenu" 
class="org.apache.royale.html.CascadingMenu"/>
+    <component id="MenuItemRenderer" 
class="org.apache.royale.html.supportClasses.MenuItemRenderer"/>
+    <component id="MenuBarItemRenderer" 
class="org.apache.royale.html.supportClasses.MenuBarItemRenderer"/>
+    <component id="CascadingMenuItemRenderer" 
class="org.apache.royale.html.supportClasses.CascadingMenuItemRenderer" />
 
 </componentPackage>
diff --git a/frameworks/projects/Basic/src/main/resources/defaults.css 
b/frameworks/projects/Basic/src/main/resources/defaults.css
index 886252b..2fe7fbb 100644
--- a/frameworks/projects/Basic/src/main/resources/defaults.css
+++ b/frameworks/projects/Basic/src/main/resources/defaults.css
@@ -438,6 +438,10 @@ Menu {
        IItemRenderer: 
ClassReference("org.apache.royale.html.supportClasses.MenuItemRenderer");       
 
        background-color: white;
        box-shadow: 2px 2px 5px gray;
+       position: absolute;
+       border-width: 1px;
+       border-style: solid;
+       border-color: #222222;
 }
 
 MenuItemRenderer {
@@ -448,6 +452,45 @@ MenuItemRenderer {
        cursor: pointer;
 }
 
+MenuBar {
+       IBeadModel: 
ClassReference("org.apache.royale.html.beads.models.MenuBarModel");
+       IBeadLayout: 
ClassReference("org.apache.royale.html.beads.layouts.HorizontalLayout");
+       IItemRenderer: 
ClassReference("org.apache.royale.html.supportClasses.MenuBarItemRenderer");    
                 
+       IBeadController: 
ClassReference("org.apache.royale.html.beads.controllers.MenuBarMouseController");
+       IMenuClassFactory: ClassReference("org.apache.royale.html.Menu");
+       height: 30px;
+       line-height: 30px;
+       vertical-align: middle;
+       border-bottom: 1px solid #222222;
+}
+
+MenuBarItemRenderer {
+       margin-left: 5px;
+       margin-right: 15px;
+       cursor: pointer;
+}
+
+CascadingMenu {
+       IBeadModel: 
ClassReference("org.apache.royale.html.beads.models.CascadingMenuModel");
+       IBeadController: 
ClassReference("org.apache.royale.html.beads.controllers.CascadingMenuSelectionMouseController");
+       IItemRenderer: 
ClassReference("org.apache.royale.html.supportClasses.CascadingMenuItemRenderer");
+       position: absolute;
+       background-color: white;
+       border-width: 1px;
+       border-style: solid;
+       border-color: #222222;
+       box-shadow: 2px 2px 5px gray;
+}
+
+CascadingMenuItemRenderer {
+       margin-top: 4px;
+       margin-left: 2px;
+       margin-bottom: 2px;
+       margin-right: 8px;
+       cursor: pointer;
+}
+
+
 Accordion
 {
        IBeadModel: 
ClassReference("org.apache.royale.html.beads.models.ArraySelectionModel");
@@ -646,6 +689,22 @@ MenuItemRenderer
        flex-grow: 1;
 }
 
+MenuBarItemRenderer
+{
+       IBeadController: 
ClassReference("org.apache.royale.html.beads.controllers.ItemRendererMouseController");
+       height: 24;
+       flex-shrink: 0;
+       flex-grow: 1;
+}
+
+CascadingMenuItemRenderer
+{
+       IBeadController: 
ClassReference("org.apache.royale.html.beads.controllers.ItemRendererMouseController");
+       height: 24;
+       flex-shrink: 0;
+       flex-grow: 1;
+}
+
 TextInput
 {
        border: 1px solid #808080;
diff --git a/frameworks/projects/Basic/src/main/royale/BasicClasses.as 
b/frameworks/projects/Basic/src/main/royale/BasicClasses.as
index dc9de07..4087fb0 100644
--- a/frameworks/projects/Basic/src/main/royale/BasicClasses.as
+++ b/frameworks/projects/Basic/src/main/royale/BasicClasses.as
@@ -52,9 +52,18 @@ internal class BasicClasses
        import 
org.apache.royale.html.beads.controllers.HDividedContainerMouseController; 
HDividedContainerMouseController;
        import 
org.apache.royale.html.beads.controllers.VDividedContainerMouseController; 
VDividedContainerMouseController;
        
+       import org.apache.royale.html.MenuBar; MenuBar;
+       import org.apache.royale.html.beads.models.MenuBarModel; MenuBarModel;
+       import org.apache.royale.html.supportClasses.MenuBarItemRenderer; 
MenuBarItemRenderer;
+       import org.apache.royale.html.beads.controllers.MenuBarMouseController; 
MenuBarMouseController;
        import org.apache.royale.html.Menu; Menu;
        import org.apache.royale.html.beads.MenuView; MenuView;
+       import 
org.apache.royale.html.beads.controllers.MenuSelectionMouseController; 
MenuSelectionMouseController;
        import org.apache.royale.html.supportClasses.MenuItemRenderer; 
MenuItemRenderer;
+       import org.apache.royale.html.CascadingMenu; CascadingMenu;
+       import org.apache.royale.html.beads.models.CascadingMenuModel; 
CascadingMenuModel;
+       import 
org.apache.royale.html.beads.controllers.CascadingMenuSelectionMouseController; 
CascadingMenuSelectionMouseController;
+       import org.apache.royale.html.supportClasses.CascadingMenuItemRenderer; 
CascadingMenuItemRenderer;
        
        
        COMPILE::SWF
diff --git 
a/frameworks/projects/Basic/src/main/royale/org/apache/royale/core/IMenu.as 
b/frameworks/projects/Basic/src/main/royale/org/apache/royale/core/IMenu.as
new file mode 100644
index 0000000..e4beb5f
--- /dev/null
+++ b/frameworks/projects/Basic/src/main/royale/org/apache/royale/core/IMenu.as
@@ -0,0 +1,43 @@
+////////////////////////////////////////////////////////////////////////////////
+//
+//  Licensed to the Apache Software Foundation (ASF) under one or more
+//  contributor license agreements.  See the NOTICE file distributed with
+//  this work for additional information regarding copyright ownership.
+//  The ASF licenses this file to You under the Apache License, Version 2.0
+//  (the "License"); you may not use this file except in compliance with
+//  the License.  You may obtain a copy of the License at
+//
+//      http://www.apache.org/licenses/LICENSE-2.0
+//
+//  Unless required by applicable law or agreed to in writing, software
+//  distributed under the License is distributed on an "AS IS" BASIS,
+//  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+//  See the License for the specific language governing permissions and
+//  limitations under the License.
+//
+////////////////////////////////////////////////////////////////////////////////
+package org.apache.royale.core
+{
+       import org.apache.royale.events.IEventDispatcher;
+
+       public interface IMenu extends IEventDispatcher
+       {
+               function get labelField():String;
+               function set labelField(value:String):void;
+               
+               function get submenuField():String;
+               function set submenuField(value:String):void;
+               
+               function get dataProvider():Object;
+               function set dataProvider(value:Object):void;
+               
+               function get selectedItem():Object;
+               function set selectedItem(value:Object):void;
+               
+               function show(component:IUIBase, xoffset:Number=0, 
yoffset:Number=0):void;
+               function hide():void;
+               
+               function get parentMenuBar():IEventDispatcher;
+               function set parentMenuBar(value:IEventDispatcher):void;
+       }
+}
\ No newline at end of file
diff --git 
a/frameworks/projects/Basic/src/main/royale/org/apache/royale/html/beads/models/MenuModel.as
 
b/frameworks/projects/Basic/src/main/royale/org/apache/royale/html/CascadingMenu.as
similarity index 67%
copy from 
frameworks/projects/Basic/src/main/royale/org/apache/royale/html/beads/models/MenuModel.as
copy to 
frameworks/projects/Basic/src/main/royale/org/apache/royale/html/CascadingMenu.as
index 0ea55af..89194d8 100644
--- 
a/frameworks/projects/Basic/src/main/royale/org/apache/royale/html/beads/models/MenuModel.as
+++ 
b/frameworks/projects/Basic/src/main/royale/org/apache/royale/html/CascadingMenu.as
@@ -16,19 +16,21 @@
 //  limitations under the License.
 //
 
////////////////////////////////////////////////////////////////////////////////
-package org.apache.royale.html.beads.models
+package org.apache.royale.html
 {
-       import org.apache.royale.events.Event;
+       import org.apache.royale.html.beads.models.CascadingMenuModel;
 
        /**
-        * The model used to support menus, it indicates which field in the 
data identifies sub-menus.
+        * The CascadingMenu class displays a list of selections with a 
potential
+        * for displaying a sub-list and a sub-sub-list etc. depending on how
+        * the data is organized.
         *
         *  @langversion 3.0
         *  @playerversion Flash 10.2
         *  @playerversion AIR 2.6
         *  @productversion Royale 0.9
         */
-       public class MenuModel extends ArraySelectionModel
+       public class CascadingMenu extends Menu
        {
                /**
                 * Constructor.
@@ -38,29 +40,29 @@ package org.apache.royale.html.beads.models
                 *  @playerversion AIR 2.6
                 *  @productversion Royale 0.9
                 */
-               public function MenuModel()
+               public function CascadingMenu()
                {
                        super();
+                       typeNames = "CascadingMenu";
                }
                
-               private var _submenuField:String = "menu";
-               
                /**
-                * The field in the data object that identifies sub-menus. The 
default is "menu".
+                * The name of the field to use in the data that indicates a 
sub-menu. The
+                * default value is "menu".
                 *
                 *  @langversion 3.0
                 *  @playerversion Flash 10.2
                 *  @playerversion AIR 2.6
                 *  @productversion Royale 0.9
                 */
-               public function get submenuField():String
+               override public function get submenuField():String
                {
-                       return _submenuField;
+                       return (model as CascadingMenuModel).submenuField;
                }
-               public function set submenuField(value:String):void
+               
+               override public function set submenuField(value:String):void
                {
-                       _submenuField = value;
-                       dispatchEvent(new Event("submenuFieldChanged"));
+                       (model as CascadingMenuModel).submenuField = value;
                }
        }
 }
\ No newline at end of file
diff --git 
a/frameworks/projects/Basic/src/main/royale/org/apache/royale/html/Menu.as 
b/frameworks/projects/Basic/src/main/royale/org/apache/royale/html/Menu.as
index a0f5a36..7681737 100644
--- a/frameworks/projects/Basic/src/main/royale/org/apache/royale/html/Menu.as
+++ b/frameworks/projects/Basic/src/main/royale/org/apache/royale/html/Menu.as
@@ -18,6 +18,7 @@
 
////////////////////////////////////////////////////////////////////////////////
 package org.apache.royale.html
 {
+       import org.apache.royale.core.IMenu;
        import org.apache.royale.core.IUIBase;
        import org.apache.royale.core.UIBase;
        import org.apache.royale.events.Event;
@@ -26,6 +27,7 @@ package org.apache.royale.html
        import org.apache.royale.html.beads.models.MenuModel;
        import org.apache.royale.utils.PointUtils;
        import org.apache.royale.utils.UIUtils;
+       
 
        /**
         * The Menu class builds pop-up menus that are presented as a list, 
displayed
@@ -37,7 +39,7 @@ package org.apache.royale.html
         * a menu item is selected.
         * 
         * var menu:Menu = Menu.createMenu(dataProvider);
-        * menu.addEventListener("itemSelected", handleSelection);
+        * menu.addEventListener("change", handleSelection);
         * 
         * Present the menu using the show function:
         * menu.show(component, xoffset, yoffset);
@@ -46,6 +48,8 @@ package org.apache.royale.html
         * Set an offset from the component's upper-left corner. If an item is 
selected
         * the event listener will be called.
         * 
+        * Remove the menu using menu.hide();
+        * 
         * Note: submenus are not supported.
         *
         *  @langversion 3.0
@@ -53,7 +57,7 @@ package org.apache.royale.html
         *  @playerversion AIR 2.6
         *  @productversion Royale 0.9
         */
-       public class Menu extends List
+       public class Menu extends List implements IMenu
        {
                /**
                 * Constructor.
@@ -65,13 +69,57 @@ package org.apache.royale.html
                 */
                public function Menu()
                {
-                       typeNames = "Menu";
                        super();
+                       typeNames = "Menu";
+               }
+               
+               /**
+                * The submenuField is not used by Menu (see CascadingMenu).
+                *
+                *  @langversion 3.0
+                *  @playerversion Flash 10.2
+                *  @playerversion AIR 2.6
+                *  @productversion Royale 0.9
+                */
+               public function get submenuField():String
+               {
+                       return null;
+               }
+               public function set submenuField(value:String):void
+               {
+                       // not implemented
+               }
+               
+               private var _parentMenuBar:IEventDispatcher;
+               
+               /**
+                * @private
+                * 
+                * If this menu is used as part of a menu bar system, this 
property should reference
+                * that menu bar. If this property is set, the "change" event 
is dispatched against this
+                * object rather than the Menu itself.
+                *
+                *  @langversion 3.0
+                *  @playerversion Flash 10.2
+                *  @playerversion AIR 2.6
+                *  @productversion Royale 0.9
+                */
+               public function get parentMenuBar():IEventDispatcher
+               {
+                       return _parentMenuBar;
+               }
+               public function set parentMenuBar(value:IEventDispatcher):void
+               {
+                       _parentMenuBar = value;
                }
                
                /**
                 * Creates a new instance of the menu, attaching the data given 
as the dataProvider
                 * to the menu.
+                * 
+                * @param dataProvider Object Either an Array of Strings or an 
Array of Objects.
+                * 
+                * @return Menu The Menu created.
                 *
                 *  @langversion 3.0
                 *  @playerversion Flash 10.2
@@ -88,6 +136,10 @@ package org.apache.royale.html
                /**
                 * Displays the menu at the given location which is an offset 
from the origin
                 * of the component supplied.
+                * 
+                * @param component IUIBase A reference position used to place 
the Menu.
+                * @param xoffset Number The horizontal offset from the 
component's position.
+                * @param yoffset Number The vertical offset from the 
component's position.
                 *
                 *  @langversion 3.0
                 *  @playerversion Flash 10.2
@@ -113,11 +165,10 @@ package org.apache.royale.html
                 *  @productversion Royale 0.9
                 */
                public function hide():void
-               {                       
-                       if (this.parent != null) {
-                               this.dispatchEvent(new Event("menuWillHide"));
-                               this.parent.removeElement(this);
-                       }
+               {               
+                       // dispatch the "hideMenus" event to trigger any 
exposed menu to be hidden.
+                       var host:UIBase = UIUtils.findPopUpHost(this) as UIBase;
+                       host.dispatchEvent(new Event("hideMenus"));
                }
        }
 }
\ No newline at end of file
diff --git 
a/frameworks/projects/Basic/src/main/royale/org/apache/royale/html/beads/models/MenuModel.as
 b/frameworks/projects/Basic/src/main/royale/org/apache/royale/html/MenuBar.as
similarity index 51%
copy from 
frameworks/projects/Basic/src/main/royale/org/apache/royale/html/beads/models/MenuModel.as
copy to 
frameworks/projects/Basic/src/main/royale/org/apache/royale/html/MenuBar.as
index 0ea55af..2b3ff4c 100644
--- 
a/frameworks/projects/Basic/src/main/royale/org/apache/royale/html/beads/models/MenuModel.as
+++ 
b/frameworks/projects/Basic/src/main/royale/org/apache/royale/html/MenuBar.as
@@ -16,37 +16,40 @@
 //  limitations under the License.
 //
 
////////////////////////////////////////////////////////////////////////////////
-package org.apache.royale.html.beads.models
+package org.apache.royale.html
 {
-       import org.apache.royale.events.Event;
+       import org.apache.royale.core.ClassFactory;
+       import org.apache.royale.core.IFactory;
+       import org.apache.royale.core.IMenu;
+       import org.apache.royale.core.ValuesManager;
+       import org.apache.royale.html.beads.models.MenuBarModel;
 
        /**
-        * The model used to support menus, it indicates which field in the 
data identifies sub-menus.
+        * The MenuBar class is a list that, when an item is tapped, displays a 
menu of selections.
         *
         *  @langversion 3.0
         *  @playerversion Flash 10.2
         *  @playerversion AIR 2.6
         *  @productversion Royale 0.9
         */
-       public class MenuModel extends ArraySelectionModel
+       public class MenuBar extends List
        {
                /**
-                * Constructor.
+                * Constructor
                 *
                 *  @langversion 3.0
                 *  @playerversion Flash 10.2
                 *  @playerversion AIR 2.6
                 *  @productversion Royale 0.9
                 */
-               public function MenuModel()
+               public function MenuBar()
                {
                        super();
+                       typeNames = "MenuBar";
                }
                
-               private var _submenuField:String = "menu";
-               
                /**
-                * The field in the data object that identifies sub-menus. The 
default is "menu".
+                * The field in the data that holds the sub-menus. The default 
is "menu".
                 *
                 *  @langversion 3.0
                 *  @playerversion Flash 10.2
@@ -55,12 +58,47 @@ package org.apache.royale.html.beads.models
                 */
                public function get submenuField():String
                {
-                       return _submenuField;
+                       return (model as MenuBarModel).submenuField;
                }
+               
                public function set submenuField(value:String):void
                {
-                       _submenuField = value;
-                       dispatchEvent(new Event("submenuFieldChanged"));
+                       (model as MenuBarModel).submenuField = value;
+               }
+               
+               private var _menuClass:IFactory;
+               
+               /**
+                * The class to use that can manufacture an IMenu. This can be 
set either in a style
+                * using "IMenuClassFactory" or directory from ActionScript or 
MXML.
+                *
+                *  @langversion 3.0
+                *  @playerversion Flash 10.2
+                *  @playerversion AIR 2.6
+                *  @productversion Royale 0.9
+                */
+               public function get menuClass():IFactory
+               {
+                       return _menuClass;
+               }
+               public function set menuClass(value:IFactory):void
+               {
+                       _menuClass = value;
+               }
+               
+               /**
+                * @private
+                */
+               override public function addedToParent():void
+               {
+                       super.addedToParent();
+                       
+                       if (menuClass == null) {
+                               var mclass:Class = 
ValuesManager.valuesImpl.getValue(this, "iMenuClassFactory") as Class;
+                               if (mclass) {
+                                       menuClass = new ClassFactory(mclass);
+                               }
+                       }
                }
        }
 }
\ No newline at end of file
diff --git 
a/frameworks/projects/Basic/src/main/royale/org/apache/royale/html/beads/controllers/MenuSelectionMouseController.as
 
b/frameworks/projects/Basic/src/main/royale/org/apache/royale/html/beads/controllers/CascadingMenuSelectionMouseController.as
similarity index 53%
copy from 
frameworks/projects/Basic/src/main/royale/org/apache/royale/html/beads/controllers/MenuSelectionMouseController.as
copy to 
frameworks/projects/Basic/src/main/royale/org/apache/royale/html/beads/controllers/CascadingMenuSelectionMouseController.as
index 46f6d4e..77c8514 100644
--- 
a/frameworks/projects/Basic/src/main/royale/org/apache/royale/html/beads/controllers/MenuSelectionMouseController.as
+++ 
b/frameworks/projects/Basic/src/main/royale/org/apache/royale/html/beads/controllers/CascadingMenuSelectionMouseController.as
@@ -18,44 +18,44 @@
 
////////////////////////////////////////////////////////////////////////////////
 package org.apache.royale.html.beads.controllers
 {
+       import org.apache.royale.core.IBeadModel;
+       import org.apache.royale.core.IMenu;
        import org.apache.royale.core.IStrand;
        import org.apache.royale.core.IUIBase;
        import org.apache.royale.events.Event;
-       import org.apache.royale.events.IEventDispatcher;
        import org.apache.royale.events.ItemClickedEvent;
-       import org.apache.royale.events.MouseEvent;
-       import org.apache.royale.html.Menu;
-       import org.apache.royale.html.beads.models.MenuModel;
-       import org.apache.royale.utils.UIUtils;
+       import org.apache.royale.html.CascadingMenu;
+       import org.apache.royale.html.beads.models.CascadingMenuModel;
        
        COMPILE::JS {
                import org.apache.royale.events.BrowserEvent;
        }
 
        /**
-        * Listens for item selections on the component and translates them to 
external events. Also
-        * listens for events on the background and uses them to dismiss the 
menu.
+        * The CascadingMenuSelectionMouseController does the same job as the 
MenuSelectionMouseController
+        * except if the item in the menu that has been selected has children, 
in which case a new
+        * CascadingMenu is presented.
         *  
         *  @langversion 3.0
         *  @playerversion Flash 10.2
         *  @playerversion AIR 2.6
         *  @productversion Royale 0.9
         */
-       public class MenuSelectionMouseController extends 
ListSingleSelectionMouseController
+       public class CascadingMenuSelectionMouseController extends 
MenuSelectionMouseController
        {
                /**
                 * Constructor.
-                *
+                *  
                 *  @langversion 3.0
                 *  @playerversion Flash 10.2
                 *  @playerversion AIR 2.6
                 *  @productversion Royale 0.9
                 */
-               public function MenuSelectionMouseController()
+               public function CascadingMenuSelectionMouseController()
                {
                        super();
                }
-               
+                               
                private var _strand:IStrand;
                
                /**
@@ -70,21 +70,14 @@ package org.apache.royale.html.beads.controllers
                {
                        _strand = value;
                        super.strand = value;
-                       
-                       (_strand as 
IEventDispatcher).addEventListener("menuWillHide", handleMenuWillHide);
-                       
-                       // detect an up event on the background as a way to 
dismiss this menu
-                       COMPILE::SWF {
-                               var host:IEventDispatcher = 
UIUtils.findPopUpHost(_strand as IUIBase) as IEventDispatcher;
-                               host.addEventListener(MouseEvent.MOUSE_UP, 
hideMenu_internal);
-                       }
-                       COMPILE::JS {
-                               window.addEventListener('mouseup', 
hideMenu_internal, false);
-                       }
                }
                
                /**
-                * Listen for selections made on the component and translate 
them into change events.
+                * @private
+                * 
+                * Replaces the selectedHandler from the super class to handle 
the presentation of
+                * submenus. If an element has the submenu indicator, a new 
CascadingMenu is presented.
+                * If the element is a regular element, then the super class's 
handler is called.
                 *  
                 *  @langversion 3.0
                 *  @playerversion Flash 10.2
@@ -92,40 +85,23 @@ package org.apache.royale.html.beads.controllers
                 *  @productversion Royale 0.9
                 */
                override protected function 
selectedHandler(event:ItemClickedEvent):void
-               {                                               
-                       var menuModel:MenuModel = listModel as MenuModel;
+               {
                        var node:Object = event.data;
                        
-                       listModel.selectedItem = node;
-                       IEventDispatcher(_strand).dispatchEvent(new 
Event("change"));
-               }
-               
-               // Internal Event Handling
-               
-               COMPILE::SWF
-               private function handleMenuWillHide(event:Event):void
-               {
-                       var host:IEventDispatcher = 
UIUtils.findPopUpHost(_strand as IUIBase) as IEventDispatcher;
-                       host.removeEventListener(MouseEvent.MOUSE_UP, 
hideMenu_internal);
-               }
-               
-               COMPILE::JS
-               private function handleMenuWillHide(event:Event):void
-               {
-                       window.removeEventListener('mouseup', 
hideMenu_internal, false);
-               }
-               
-               COMPILE::SWF
-               private function hideMenu_internal(event:MouseEvent):void
-               {
-                       (_strand as Menu).hide();
-               }
-
-               COMPILE::JS
-               private function hideMenu_internal(event:BrowserEvent):void
-               {                       
-                       event.stopImmediatePropagation();
-                       (_strand as Menu).hide();
+                       var model:CascadingMenuModel = 
_strand.getBeadByType(IBeadModel) as CascadingMenuModel;
+                       
+                       if (node.hasOwnProperty(model.submenuField)) {
+                               var component:IUIBase = event.target as IUIBase;
+                               var menu:IMenu = new CascadingMenu();
+                               menu.dataProvider = node[model.submenuField];
+                               menu.labelField = model.labelField;
+                               menu.parentMenuBar = (_strand as 
IMenu).parentMenuBar;
+                               menu.show(component, component.width, 0);
+                       }
+                       else {
+                               super.selectedHandler(event);
+                               hideOpenMenus();
+                       }
                }
        }
 }
\ No newline at end of file
diff --git 
a/frameworks/projects/Basic/src/main/royale/org/apache/royale/html/beads/controllers/ItemRendererMouseController.as
 
b/frameworks/projects/Basic/src/main/royale/org/apache/royale/html/beads/controllers/ItemRendererMouseController.as
index d17bd08..5f637ca 100644
--- 
a/frameworks/projects/Basic/src/main/royale/org/apache/royale/html/beads/controllers/ItemRendererMouseController.as
+++ 
b/frameworks/projects/Basic/src/main/royale/org/apache/royale/html/beads/controllers/ItemRendererMouseController.as
@@ -172,6 +172,7 @@ COMPILE::JS {
                COMPILE::SWF
                protected function mouseUpHandler(event:MouseEvent):void
                {
+                       event.stopImmediatePropagation();
                        var target:ISelectableItemRenderer = 
event.currentTarget as ISelectableItemRenderer;
                        if (target)
                        {                               
diff --git 
a/frameworks/projects/Basic/src/main/royale/org/apache/royale/html/beads/controllers/MenuSelectionMouseController.as
 
b/frameworks/projects/Basic/src/main/royale/org/apache/royale/html/beads/controllers/MenuBarMouseController.as
similarity index 52%
copy from 
frameworks/projects/Basic/src/main/royale/org/apache/royale/html/beads/controllers/MenuSelectionMouseController.as
copy to 
frameworks/projects/Basic/src/main/royale/org/apache/royale/html/beads/controllers/MenuBarMouseController.as
index 46f6d4e..0507b7e 100644
--- 
a/frameworks/projects/Basic/src/main/royale/org/apache/royale/html/beads/controllers/MenuSelectionMouseController.as
+++ 
b/frameworks/projects/Basic/src/main/royale/org/apache/royale/html/beads/controllers/MenuBarMouseController.as
@@ -18,40 +18,39 @@
 
////////////////////////////////////////////////////////////////////////////////
 package org.apache.royale.html.beads.controllers
 {
+       import org.apache.royale.core.IBeadModel;
+       import org.apache.royale.core.IMenu;
        import org.apache.royale.core.IStrand;
        import org.apache.royale.core.IUIBase;
+       import org.apache.royale.core.UIBase;
        import org.apache.royale.events.Event;
        import org.apache.royale.events.IEventDispatcher;
        import org.apache.royale.events.ItemClickedEvent;
-       import org.apache.royale.events.MouseEvent;
        import org.apache.royale.html.Menu;
-       import org.apache.royale.html.beads.models.MenuModel;
+       import org.apache.royale.html.MenuBar;
+       import org.apache.royale.html.beads.models.MenuBarModel;
        import org.apache.royale.utils.UIUtils;
-       
-       COMPILE::JS {
-               import org.apache.royale.events.BrowserEvent;
-       }
 
        /**
-        * Listens for item selections on the component and translates them to 
external events. Also
-        * listens for events on the background and uses them to dismiss the 
menu.
+        * The MenuBarMouseController handles mouse events for the MenuBar. 
While the menu bar is
+        * a list, selecting an item causes a Menu (or one of its subclasses) 
to appear.
         *  
         *  @langversion 3.0
         *  @playerversion Flash 10.2
         *  @playerversion AIR 2.6
         *  @productversion Royale 0.9
         */
-       public class MenuSelectionMouseController extends 
ListSingleSelectionMouseController
+       public class MenuBarMouseController extends 
ListSingleSelectionMouseController
        {
                /**
                 * Constructor.
-                *
+                *  
                 *  @langversion 3.0
                 *  @playerversion Flash 10.2
                 *  @playerversion AIR 2.6
                 *  @productversion Royale 0.9
                 */
-               public function MenuSelectionMouseController()
+               public function MenuBarMouseController()
                {
                        super();
                }
@@ -59,7 +58,7 @@ package org.apache.royale.html.beads.controllers
                private var _strand:IStrand;
                
                /**
-                *  @copy org.apache.royale.core.IBead#strand
+                * @copy org.apache.royale.core.IBead#strand
                 *  
                 *  @langversion 3.0
                 *  @playerversion Flash 10.2
@@ -70,21 +69,11 @@ package org.apache.royale.html.beads.controllers
                {
                        _strand = value;
                        super.strand = value;
-                       
-                       (_strand as 
IEventDispatcher).addEventListener("menuWillHide", handleMenuWillHide);
-                       
-                       // detect an up event on the background as a way to 
dismiss this menu
-                       COMPILE::SWF {
-                               var host:IEventDispatcher = 
UIUtils.findPopUpHost(_strand as IUIBase) as IEventDispatcher;
-                               host.addEventListener(MouseEvent.MOUSE_UP, 
hideMenu_internal);
-                       }
-                       COMPILE::JS {
-                               window.addEventListener('mouseup', 
hideMenu_internal, false);
-                       }
                }
                
                /**
-                * Listen for selections made on the component and translate 
them into change events.
+                * Called when an item in the MenuBar is selected; it produces 
an IMenu below
+                * the item selected.
                 *  
                 *  @langversion 3.0
                 *  @playerversion Flash 10.2
@@ -92,40 +81,22 @@ package org.apache.royale.html.beads.controllers
                 *  @productversion Royale 0.9
                 */
                override protected function 
selectedHandler(event:ItemClickedEvent):void
-               {                                               
-                       var menuModel:MenuModel = listModel as MenuModel;
-                       var node:Object = event.data;
-                       
-                       listModel.selectedItem = node;
-                       IEventDispatcher(_strand).dispatchEvent(new 
Event("change"));
-               }
-               
-               // Internal Event Handling
-               
-               COMPILE::SWF
-               private function handleMenuWillHide(event:Event):void
                {
-                       var host:IEventDispatcher = 
UIUtils.findPopUpHost(_strand as IUIBase) as IEventDispatcher;
-                       host.removeEventListener(MouseEvent.MOUSE_UP, 
hideMenu_internal);
-               }
-               
-               COMPILE::JS
-               private function handleMenuWillHide(event:Event):void
-               {
-                       window.removeEventListener('mouseup', 
hideMenu_internal, false);
-               }
-               
-               COMPILE::SWF
-               private function hideMenu_internal(event:MouseEvent):void
-               {
-                       (_strand as Menu).hide();
-               }
-
-               COMPILE::JS
-               private function hideMenu_internal(event:BrowserEvent):void
-               {                       
-                       event.stopImmediatePropagation();
-                       (_strand as Menu).hide();
+                       // close any previously open menus
+                       var host:UIBase = UIUtils.findPopUpHost(_strand as 
IUIBase) as UIBase;
+                       host.dispatchEvent(new Event("hideMenus"));
+                       
+                       var component:IUIBase = event.target as IUIBase;
+                       var mbar:MenuBar = _strand as MenuBar;
+                       var menu:IMenu = mbar.menuClass.newInstance() as IMenu;
+                       
+                       var model:MenuBarModel = 
_strand.getBeadByType(IBeadModel) as MenuBarModel;
+                       
+                       menu.dataProvider = event.data[model.submenuField];
+                       menu.labelField = model.labelField;
+                       menu.submenuField = model.submenuField;
+                       menu.parentMenuBar = _strand as IEventDispatcher;
+                       menu.show(component, 0, component.height);
                }
        }
 }
\ No newline at end of file
diff --git 
a/frameworks/projects/Basic/src/main/royale/org/apache/royale/html/beads/controllers/MenuSelectionMouseController.as
 
b/frameworks/projects/Basic/src/main/royale/org/apache/royale/html/beads/controllers/MenuSelectionMouseController.as
index 46f6d4e..280ac0b 100644
--- 
a/frameworks/projects/Basic/src/main/royale/org/apache/royale/html/beads/controllers/MenuSelectionMouseController.as
+++ 
b/frameworks/projects/Basic/src/main/royale/org/apache/royale/html/beads/controllers/MenuSelectionMouseController.as
@@ -18,13 +18,14 @@
 
////////////////////////////////////////////////////////////////////////////////
 package org.apache.royale.html.beads.controllers
 {
+       import org.apache.royale.core.IMenu;
        import org.apache.royale.core.IStrand;
        import org.apache.royale.core.IUIBase;
+       import org.apache.royale.core.UIBase;
        import org.apache.royale.events.Event;
        import org.apache.royale.events.IEventDispatcher;
        import org.apache.royale.events.ItemClickedEvent;
        import org.apache.royale.events.MouseEvent;
-       import org.apache.royale.html.Menu;
        import org.apache.royale.html.beads.models.MenuModel;
        import org.apache.royale.utils.UIUtils;
        
@@ -55,7 +56,7 @@ package org.apache.royale.html.beads.controllers
                {
                        super();
                }
-               
+                               
                private var _strand:IStrand;
                
                /**
@@ -70,12 +71,12 @@ package org.apache.royale.html.beads.controllers
                {
                        _strand = value;
                        super.strand = value;
-                       
-                       (_strand as 
IEventDispatcher).addEventListener("menuWillHide", handleMenuWillHide);
-                       
+                                               
                        // detect an up event on the background as a way to 
dismiss this menu
+                       var host:IEventDispatcher = 
UIUtils.findPopUpHost(_strand as IUIBase) as IEventDispatcher;
+                       host.addEventListener("hideMenus", handleHideMenus);
+                       
                        COMPILE::SWF {
-                               var host:IEventDispatcher = 
UIUtils.findPopUpHost(_strand as IUIBase) as IEventDispatcher;
                                host.addEventListener(MouseEvent.MOUSE_UP, 
hideMenu_internal);
                        }
                        COMPILE::JS {
@@ -93,39 +94,107 @@ package org.apache.royale.html.beads.controllers
                 */
                override protected function 
selectedHandler(event:ItemClickedEvent):void
                {                                               
-                       var menuModel:MenuModel = listModel as MenuModel;
+                       var menuDispatcher:IEventDispatcher = 
findMenuDispatcher();
+                       var list:UIBase = menuDispatcher as UIBase;
                        var node:Object = event.data;
                        
-                       listModel.selectedItem = node;
-                       IEventDispatcher(_strand).dispatchEvent(new 
Event("change"));
+                       list.model.selectedItem = node;
+                       menuDispatcher.dispatchEvent(new Event("change"));
+               }
+               
+               /**
+                * Finds and returns the object from which events should be 
dispatched. This
+                * may be the Menu itself of the menu's parent menu bar.
+                *  
+                *  @langversion 3.0
+                *  @playerversion Flash 10.2
+                *  @playerversion AIR 2.6
+                *  @productversion Royale 0.9
+                */
+               protected function findMenuDispatcher():IEventDispatcher
+               {
+                       var menu:IMenu = _strand as IMenu;
+                       if (menu.parentMenuBar) return menu.parentMenuBar;
+                       else return menu as IEventDispatcher;
+               }
+               
+               /**
+                * Hides any menus that are open. This means only one pop-up 
menu (or set of cascading menus)
+                * may be open at one time.
+                *  
+                *  @langversion 3.0
+                *  @playerversion Flash 10.2
+                *  @playerversion AIR 2.6
+                *  @productversion Royale 0.9
+                */
+               protected function hideOpenMenus():void
+               {
+                       var copy:Array = MenuModel.menuList.concat();
+                       
+                       for(var i:int=0; i < copy.length; i++) {
+                               var menu:UIBase = copy[i] as UIBase;
+                               if (menu.parent != null) {
+                                       var 
controller:MenuSelectionMouseController = 
menu.getBeadByType(MenuSelectionMouseController) as 
MenuSelectionMouseController;
+                                       controller.removeClickOutHandler(menu);
+                                       menu.parent.removeElement(menu);
+                               }
+                       }
+                       MenuModel.clearMenuList();
                }
                
                // Internal Event Handling
                
-               COMPILE::SWF
-               private function handleMenuWillHide(event:Event):void
+               /**
+                * @private
+                */
+               private function handleHideMenus(event:Event):void
                {
-                       var host:IEventDispatcher = 
UIUtils.findPopUpHost(_strand as IUIBase) as IEventDispatcher;
-                       host.removeEventListener(MouseEvent.MOUSE_UP, 
hideMenu_internal);
+                       hideOpenMenus();
                }
                
-               COMPILE::JS
-               private function handleMenuWillHide(event:Event):void
+               /**
+                * @private
+                * 
+                * Removes the event handler that detects clicks outside of the 
menu.
+                *  
+                *  @langversion 3.0
+                *  @playerversion Flash 10.2
+                *  @playerversion AIR 2.6
+                *  @productversion Royale 0.9
+                */
+               public function removeClickOutHandler(menu:Object):void
                {
-                       window.removeEventListener('mouseup', 
hideMenu_internal, false);
+                       MenuModel.removeMenu(menu);
+                       
+                       var host:IEventDispatcher = UIUtils.findPopUpHost(menu 
as IUIBase) as IEventDispatcher;
+                       host.removeEventListener("hideMenus", handleHideMenus);
+                       
+                       COMPILE::SWF {
+                               host.removeEventListener(MouseEvent.MOUSE_UP, 
hideMenu_internal);
+                       }
+                       COMPILE::JS {
+                               window.removeEventListener('mouseup', 
hideMenu_internal, false);
+                       }                       
                }
                
+               /**
+                * @private
+                */
                COMPILE::SWF
-               private function hideMenu_internal(event:MouseEvent):void
+               protected function hideMenu_internal(event:MouseEvent):void
                {
-                       (_strand as Menu).hide();
+                       event.stopImmediatePropagation();
+                       hideOpenMenus();
                }
 
+               /**
+                * @private
+                */
                COMPILE::JS
-               private function hideMenu_internal(event:BrowserEvent):void
+               protected function hideMenu_internal(event:BrowserEvent):void
                {                       
                        event.stopImmediatePropagation();
-                       (_strand as Menu).hide();
+                       hideOpenMenus();
                }
        }
 }
\ No newline at end of file
diff --git 
a/frameworks/projects/Basic/src/main/royale/org/apache/royale/html/beads/models/MenuModel.as
 
b/frameworks/projects/Basic/src/main/royale/org/apache/royale/html/beads/models/CascadingMenuModel.as
similarity index 77%
copy from 
frameworks/projects/Basic/src/main/royale/org/apache/royale/html/beads/models/MenuModel.as
copy to 
frameworks/projects/Basic/src/main/royale/org/apache/royale/html/beads/models/CascadingMenuModel.as
index 0ea55af..a89ea04 100644
--- 
a/frameworks/projects/Basic/src/main/royale/org/apache/royale/html/beads/models/MenuModel.as
+++ 
b/frameworks/projects/Basic/src/main/royale/org/apache/royale/html/beads/models/CascadingMenuModel.as
@@ -18,31 +18,23 @@
 
////////////////////////////////////////////////////////////////////////////////
 package org.apache.royale.html.beads.models
 {
+       import org.apache.royale.core.IStrand;
        import org.apache.royale.events.Event;
 
-       /**
-        * The model used to support menus, it indicates which field in the 
data identifies sub-menus.
-        *
-        *  @langversion 3.0
-        *  @playerversion Flash 10.2
-        *  @playerversion AIR 2.6
-        *  @productversion Royale 0.9
-        */
-       public class MenuModel extends ArraySelectionModel
+       public class CascadingMenuModel extends MenuModel
        {
-               /**
-                * Constructor.
-                *
-                *  @langversion 3.0
-                *  @playerversion Flash 10.2
-                *  @playerversion AIR 2.6
-                *  @productversion Royale 0.9
-                */
-               public function MenuModel()
+               public function CascadingMenuModel()
                {
                        super();
                }
                
+               private var _strand:IStrand;
+               override public function set strand(value:IStrand):void
+               {
+                       _strand = value;
+                       super.strand = value;
+               }
+               
                private var _submenuField:String = "menu";
                
                /**
diff --git 
a/frameworks/projects/Basic/src/main/royale/org/apache/royale/html/beads/models/MenuModel.as
 
b/frameworks/projects/Basic/src/main/royale/org/apache/royale/html/beads/models/MenuBarModel.as
similarity index 65%
copy from 
frameworks/projects/Basic/src/main/royale/org/apache/royale/html/beads/models/MenuModel.as
copy to 
frameworks/projects/Basic/src/main/royale/org/apache/royale/html/beads/models/MenuBarModel.as
index 0ea55af..cc58610 100644
--- 
a/frameworks/projects/Basic/src/main/royale/org/apache/royale/html/beads/models/MenuModel.as
+++ 
b/frameworks/projects/Basic/src/main/royale/org/apache/royale/html/beads/models/MenuBarModel.as
@@ -1,7 +1,3 @@
-////////////////////////////////////////////////////////////////////////////////
-//
-//  Licensed to the Apache Software Foundation (ASF) under one or more
-//  contributor license agreements.  See the NOTICE file distributed with
 //  this work for additional information regarding copyright ownership.
 //  The ASF licenses this file to You under the Apache License, Version 2.0
 //  (the "License"); you may not use this file except in compliance with
@@ -21,24 +17,11 @@ package org.apache.royale.html.beads.models
        import org.apache.royale.events.Event;
 
        /**
-        * The model used to support menus, it indicates which field in the 
data identifies sub-menus.
-        *
-        *  @langversion 3.0
-        *  @playerversion Flash 10.2
-        *  @playerversion AIR 2.6
-        *  @productversion Royale 0.9
+        * The model used by the MenuBar.
         */
-       public class MenuModel extends ArraySelectionModel
+       public class MenuBarModel extends ArraySelectionModel
        {
-               /**
-                * Constructor.
-                *
-                *  @langversion 3.0
-                *  @playerversion Flash 10.2
-                *  @playerversion AIR 2.6
-                *  @productversion Royale 0.9
-                */
-               public function MenuModel()
+               public function MenuBarModel()
                {
                        super();
                }
@@ -46,7 +29,8 @@ package org.apache.royale.html.beads.models
                private var _submenuField:String = "menu";
                
                /**
-                * The field in the data object that identifies sub-menus. The 
default is "menu".
+                * The field in the data object that identifies sub-menus. The 
default is "menu". This
+                * value is transferred to the CascadingMenu opened for each 
menu item.
                 *
                 *  @langversion 3.0
                 *  @playerversion Flash 10.2
diff --git 
a/frameworks/projects/Basic/src/main/royale/org/apache/royale/html/beads/models/MenuModel.as
 
b/frameworks/projects/Basic/src/main/royale/org/apache/royale/html/beads/models/MenuModel.as
index 0ea55af..e5f7b59 100644
--- 
a/frameworks/projects/Basic/src/main/royale/org/apache/royale/html/beads/models/MenuModel.as
+++ 
b/frameworks/projects/Basic/src/main/royale/org/apache/royale/html/beads/models/MenuModel.as
@@ -18,10 +18,10 @@
 
////////////////////////////////////////////////////////////////////////////////
 package org.apache.royale.html.beads.models
 {
-       import org.apache.royale.events.Event;
+       import org.apache.royale.core.IStrand;
 
        /**
-        * The model used to support menus, it indicates which field in the 
data identifies sub-menus.
+        * The model used to support menus.
         *
         *  @langversion 3.0
         *  @playerversion Flash 10.2
@@ -43,24 +43,70 @@ package org.apache.royale.html.beads.models
                        super();
                }
                
-               private var _submenuField:String = "menu";
+               private var _strand:IStrand;
                
                /**
-                * The field in the data object that identifies sub-menus. The 
default is "menu".
-                *
+                * @copy org.apache.royale.core.IBead#strand
+                *  
+                *  @langversion 3.0
+                *  @playerversion Flash 10.2
+                *  @playerversion AIR 2.6
+                *  @productversion Royale 0.9
+                */
+               override public function set strand(value:IStrand):void
+               {
+                       _strand = value;
+                       super.strand = value;
+                       
+                       MenuModel.menuList.push(_strand);
+               }
+               
+               private static var _menuList:Array = [];
+               
+               /**
+                * The array of active IMenu instances. This list is maintained 
so that any of the
+                * instances can close all of them. Imagine several cascading 
menus open the user
+                * selects one of the items. That menu uses this array to close 
itself and the others.
+                *  
                 *  @langversion 3.0
                 *  @playerversion Flash 10.2
                 *  @playerversion AIR 2.6
                 *  @productversion Royale 0.9
                 */
-               public function get submenuField():String
+               public static function get menuList():Array
                {
-                       return _submenuField;
+                       return _menuList;
                }
-               public function set submenuField(value:String):void
+               
+               /**
+                * Empties the menuList.
+                *  
+                *  @langversion 3.0
+                *  @playerversion Flash 10.2
+                *  @playerversion AIR 2.6
+                *  @productversion Royale 0.9
+                */
+               public static function clearMenuList():void
+               {
+                       _menuList = [];
+               }
+               
+               /**
+                * Removes a specific menu from the menuList.
+                *  
+                *  @langversion 3.0
+                *  @playerversion Flash 10.2
+                *  @playerversion AIR 2.6
+                *  @productversion Royale 0.9
+                */
+               public static function removeMenu(menu:Object):void
                {
-                       _submenuField = value;
-                       dispatchEvent(new Event("submenuFieldChanged"));
+                       for(var i:int=0; i < menuList.length; i++) {
+                               if (menuList[i] == menu) {
+                                       menuList.splice(i,1);
+                                       break;
+                               }
+                       }
                }
        }
 }
\ No newline at end of file
diff --git 
a/frameworks/projects/Basic/src/main/royale/org/apache/royale/html/supportClasses/MenuItemRenderer.as
 
b/frameworks/projects/Basic/src/main/royale/org/apache/royale/html/supportClasses/CascadingMenuItemRenderer.as
similarity index 57%
copy from 
frameworks/projects/Basic/src/main/royale/org/apache/royale/html/supportClasses/MenuItemRenderer.as
copy to 
frameworks/projects/Basic/src/main/royale/org/apache/royale/html/supportClasses/CascadingMenuItemRenderer.as
index 3ab1c91..50f6e39 100644
--- 
a/frameworks/projects/Basic/src/main/royale/org/apache/royale/html/supportClasses/MenuItemRenderer.as
+++ 
b/frameworks/projects/Basic/src/main/royale/org/apache/royale/html/supportClasses/CascadingMenuItemRenderer.as
@@ -18,19 +18,23 @@
 
////////////////////////////////////////////////////////////////////////////////
 package org.apache.royale.html.supportClasses
 {
-       import org.apache.royale.core.ISelectableItemRenderer;
+       import org.apache.royale.graphics.SolidColor;
        import org.apache.royale.html.Label;
        import org.apache.royale.html.beads.ITextItemRenderer;
+       import org.apache.royale.svg.Rect;
 
        /**
-        * The MenuItemRenderer class is the default itemRenderer for Menus.
+        * The CascadingMenuItemRenderer is the itemRenderer class for the 
elements of a CascadingMenu.
+        * Each item can either be a label or a separator (indicated by 
type:"separator" in the data for
+        * the item). If there is a sub-menu (indicated by menu:[array of 
items] in the data for
+        * the item), a sub-menu indicator is displayed next to the label.
         *
         *  @langversion 3.0
         *  @playerversion Flash 10.2
         *  @playerversion AIR 2.6
         *  @productversion Royale 0.9
         */
-       public class MenuItemRenderer extends DataItemRenderer implements 
ITextItemRenderer
+       public class CascadingMenuItemRenderer extends DataItemRenderer 
implements ITextItemRenderer
        {
                /**
                 * Constructor.
@@ -40,10 +44,10 @@ package org.apache.royale.html.supportClasses
                 *  @playerversion AIR 2.6
                 *  @productversion Royale 0.9
                 */
-               public function MenuItemRenderer()
+               public function CascadingMenuItemRenderer()
                {
-                       typeNames = "MenuItemRenderer";
                        super();
+                       typeNames = "CascadingMenuItemRenderer";
                }
                
                /**
@@ -57,18 +61,10 @@ package org.apache.royale.html.supportClasses
                private var submenuIndicator:Label;
                private var showingIndicator:Boolean = false;
                
-               override public function addedToParent():void
-               {
-                       super.addedToParent();
-                       
-                       label = new Label();
-                       label.typeNames = "MenuItemLabel";
-                       addElement(label);
-                       
-                       submenuIndicator = new Label();
-                       submenuIndicator.typeNames = "MenuItemSubmenuIndicator";
-                       submenuIndicator.text = "▶";
-               }
+               /**
+                * The separator if that's what this itemRenderer instance is 
supposed to show
+                */
+               private var separator:Rect;
                
                /**
                 *  Sets the data value and uses the String version of the data 
for display.
@@ -83,22 +79,44 @@ package org.apache.royale.html.supportClasses
                override public function set data(value:Object):void
                {
                        super.data = value;
-                       var text:String;
-                       if (value is String) text = value as String;
-                       else if (labelField) text = String(value[labelField]);
-                       else if (dataField) text = String(value[dataField]);
-                       else text = String(value);
                        
-                       label.text = text;
+                       var isSeparator:Boolean = false;
                        
-                       if (labelField || dataField) {
-                               if (value.hasOwnProperty("children")) {
-                                       if (!showingIndicator) 
addElement(submenuIndicator);
-                                       showingIndicator = true;
-                               } else {
-                                       if (showingIndicator) 
removeElement(submenuIndicator);
-                                       showingIndicator = false;
+                       if (data.hasOwnProperty("type")) {
+                               if (data["type"] == "separator") isSeparator = 
true;
+                       }
+                       
+                       if (isSeparator) {
+                               if (separator == null) {
+                                       separator = new Rect();
+                                       separator.fill = new 
SolidColor(0x000000);
+                                       addElement(separator);
+                               }
+                       }
+                       else {
+                               var text:String;
+                               if (value is String) text = value as String;
+                               else if (labelField) text = 
String(value[labelField]);
+                               else if (dataField) text = 
String(value[dataField]);
+                               else text = String(value);
+                               
+                               if (label == null) {
+                                       label = new Label();
+                                       addElement(label);
                                }
+                               
+                               label.text = text;
+                               
+                               if (value.hasOwnProperty("menu")) {
+                                       if (submenuIndicator == null) {
+                                               submenuIndicator = new Label();
+                                               submenuIndicator.text = "▶";
+                                               addElement(submenuIndicator);
+                                       }
+                                       COMPILE::SWF {
+                                               this.width = this.width + 2 + 
submenuIndicator.width;
+                                       }
+                               } 
                        }
                }
                
@@ -126,14 +144,25 @@ package org.apache.royale.html.supportClasses
                {
                        var cy:Number = height/2;
                        
-                       label.x = 0;
-                       label.y = cy - label.height/2;
+                       if (label) {
+                               label.x = 0;
+                               label.y = cy - label.height/2;
+                       }
                        
-                       if (showingIndicator) {
+                       if (submenuIndicator) {
                                submenuIndicator.x = width - 
submenuIndicator.width;
                                submenuIndicator.y = cy - 
submenuIndicator.height/2;
                        }
                        
+                       if (separator) {
+                               this.setHeight(3,true);
+                               separator.x = 0;
+                               separator.y = 1;
+                               separator.width = width;
+                               separator.height = 1;
+                               separator.draw();
+                       }
+                       
                        updateRenderer();
                }
        }
diff --git 
a/frameworks/projects/Basic/src/main/royale/org/apache/royale/html/supportClasses/MenuItemRenderer.as
 
b/frameworks/projects/Basic/src/main/royale/org/apache/royale/html/supportClasses/MenuBarItemRenderer.as
similarity index 56%
copy from 
frameworks/projects/Basic/src/main/royale/org/apache/royale/html/supportClasses/MenuItemRenderer.as
copy to 
frameworks/projects/Basic/src/main/royale/org/apache/royale/html/supportClasses/MenuBarItemRenderer.as
index 3ab1c91..9e0c53b 100644
--- 
a/frameworks/projects/Basic/src/main/royale/org/apache/royale/html/supportClasses/MenuItemRenderer.as
+++ 
b/frameworks/projects/Basic/src/main/royale/org/apache/royale/html/supportClasses/MenuBarItemRenderer.as
@@ -18,68 +18,28 @@
 
////////////////////////////////////////////////////////////////////////////////
 package org.apache.royale.html.supportClasses
 {
-       import org.apache.royale.core.ISelectableItemRenderer;
        import org.apache.royale.html.Label;
        import org.apache.royale.html.beads.ITextItemRenderer;
-
-       /**
-        * The MenuItemRenderer class is the default itemRenderer for Menus.
-        *
-        *  @langversion 3.0
-        *  @playerversion Flash 10.2
-        *  @playerversion AIR 2.6
-        *  @productversion Royale 0.9
-        */
-       public class MenuItemRenderer extends DataItemRenderer implements 
ITextItemRenderer
+       
+       public class MenuBarItemRenderer extends DataItemRenderer implements 
ITextItemRenderer
        {
-               /**
-                * Constructor.
-                *
-                *  @langversion 3.0
-                *  @playerversion Flash 10.2
-                *  @playerversion AIR 2.6
-                *  @productversion Royale 0.9
-                */
-               public function MenuItemRenderer()
+               public function MenuBarItemRenderer()
                {
-                       typeNames = "MenuItemRenderer";
                        super();
+                       typeNames = "MenuBarItemRenderer";
+                       
+                       label = new Label();
                }
                
-               /**
-                * A place to show the label
-                */
                private var label:Label;
                
-               /**
-                * A place to show the sub-menu indicator
-                */
-               private var submenuIndicator:Label;
-               private var showingIndicator:Boolean = false;
-               
                override public function addedToParent():void
                {
                        super.addedToParent();
                        
-                       label = new Label();
-                       label.typeNames = "MenuItemLabel";
                        addElement(label);
-                       
-                       submenuIndicator = new Label();
-                       submenuIndicator.typeNames = "MenuItemSubmenuIndicator";
-                       submenuIndicator.text = "▶";
                }
                
-               /**
-                *  Sets the data value and uses the String version of the data 
for display.
-                *
-                *  @param Object data The object being displayed by the 
itemRenderer instance.
-                *
-                *  @langversion 3.0
-                *  @playerversion Flash 10.2
-                *  @playerversion AIR 2.6
-                *  @productversion Royale 0.9
-                */
                override public function set data(value:Object):void
                {
                        super.data = value;
@@ -91,15 +51,7 @@ package org.apache.royale.html.supportClasses
                        
                        label.text = text;
                        
-                       if (labelField || dataField) {
-                               if (value.hasOwnProperty("children")) {
-                                       if (!showingIndicator) 
addElement(submenuIndicator);
-                                       showingIndicator = true;
-                               } else {
-                                       if (showingIndicator) 
removeElement(submenuIndicator);
-                                       showingIndicator = false;
-                               }
-                       }
+                       adjustSize();
                }
                
                /**
@@ -128,11 +80,10 @@ package org.apache.royale.html.supportClasses
                        
                        label.x = 0;
                        label.y = cy - label.height/2;
+                       label.width = width;
                        
-                       if (showingIndicator) {
-                               submenuIndicator.x = width - 
submenuIndicator.width;
-                               submenuIndicator.y = cy - 
submenuIndicator.height/2;
-                       }
+                       var h:Number = height;
+                       var w:Number = width;
                        
                        updateRenderer();
                }
diff --git 
a/frameworks/projects/Basic/src/main/royale/org/apache/royale/html/supportClasses/MenuItemRenderer.as
 
b/frameworks/projects/Basic/src/main/royale/org/apache/royale/html/supportClasses/MenuItemRenderer.as
index 3ab1c91..c53cb7c 100644
--- 
a/frameworks/projects/Basic/src/main/royale/org/apache/royale/html/supportClasses/MenuItemRenderer.as
+++ 
b/frameworks/projects/Basic/src/main/royale/org/apache/royale/html/supportClasses/MenuItemRenderer.as
@@ -42,8 +42,8 @@ package org.apache.royale.html.supportClasses
                 */
                public function MenuItemRenderer()
                {
-                       typeNames = "MenuItemRenderer";
                        super();
+                       typeNames = "MenuItemRenderer";
                }
                
                /**
@@ -51,12 +51,6 @@ package org.apache.royale.html.supportClasses
                 */
                private var label:Label;
                
-               /**
-                * A place to show the sub-menu indicator
-                */
-               private var submenuIndicator:Label;
-               private var showingIndicator:Boolean = false;
-               
                override public function addedToParent():void
                {
                        super.addedToParent();
@@ -64,10 +58,6 @@ package org.apache.royale.html.supportClasses
                        label = new Label();
                        label.typeNames = "MenuItemLabel";
                        addElement(label);
-                       
-                       submenuIndicator = new Label();
-                       submenuIndicator.typeNames = "MenuItemSubmenuIndicator";
-                       submenuIndicator.text = "▶";
                }
                
                /**
@@ -90,16 +80,6 @@ package org.apache.royale.html.supportClasses
                        else text = String(value);
                        
                        label.text = text;
-                       
-                       if (labelField || dataField) {
-                               if (value.hasOwnProperty("children")) {
-                                       if (!showingIndicator) 
addElement(submenuIndicator);
-                                       showingIndicator = true;
-                               } else {
-                                       if (showingIndicator) 
removeElement(submenuIndicator);
-                                       showingIndicator = false;
-                               }
-                       }
                }
                
                /**
@@ -128,12 +108,7 @@ package org.apache.royale.html.supportClasses
                        
                        label.x = 0;
                        label.y = cy - label.height/2;
-                       
-                       if (showingIndicator) {
-                               submenuIndicator.x = width - 
submenuIndicator.width;
-                               submenuIndicator.y = cy - 
submenuIndicator.height/2;
-                       }
-                       
+
                        updateRenderer();
                }
        }
diff --git a/frameworks/themes/Basic/basic.css 
b/frameworks/themes/Basic/basic.css
index b54edfa..a82fe85 100644
--- a/frameworks/themes/Basic/basic.css
+++ b/frameworks/themes/Basic/basic.css
@@ -64,4 +64,10 @@ MXMLItemRenderer
 {
        font-size: 12px;
        font-family: sans-serif;
+}
+
+Menu
+{
+       font-size: 12px;
+       font-family: sans-serif;
 }
\ No newline at end of file

-- 
To stop receiving notification emails like this one, please contact
[email protected].

Reply via email to