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].