You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@royale.apache.org by yi...@apache.org on 2019/08/15 19:03:40 UTC

[royale-asjs] branch develop updated: Fixes #445

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

yishayw 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 ef6466d  Fixes #445
ef6466d is described below

commit ef6466d49b95a807658cc9ef3318c49c33d32fdc
Author: DESKTOP-RH4S838\Yishay <yi...@hotmail.com>
AuthorDate: Thu Aug 15 22:03:20 2019 +0300

    Fixes #445
---
 .../CascadingMenuSelectionMouseController.as       | 77 +++++++++++++++++++++-
 .../controllers/MenuSelectionMouseController.as    | 19 ++++--
 2 files changed, 87 insertions(+), 9 deletions(-)

diff --git a/frameworks/projects/Basic/src/main/royale/org/apache/royale/html/beads/controllers/CascadingMenuSelectionMouseController.as b/frameworks/projects/Basic/src/main/royale/org/apache/royale/html/beads/controllers/CascadingMenuSelectionMouseController.as
index bcb8e2d..e2bfe89 100644
--- a/frameworks/projects/Basic/src/main/royale/org/apache/royale/html/beads/controllers/CascadingMenuSelectionMouseController.as
+++ b/frameworks/projects/Basic/src/main/royale/org/apache/royale/html/beads/controllers/CascadingMenuSelectionMouseController.as
@@ -26,7 +26,11 @@ package org.apache.royale.html.beads.controllers
 	import org.apache.royale.events.ItemClickedEvent;
 	import org.apache.royale.html.CascadingMenu;
 	import org.apache.royale.html.beads.models.CascadingMenuModel;
-	
+	import org.apache.royale.html.beads.models.MenuModel;
+	import org.apache.royale.html.Menu;
+	import org.apache.royale.core.ISelectionModel;
+	import org.apache.royale.core.UIBase;
+
 	COMPILE::JS {
 		import org.apache.royale.events.BrowserEvent;
 	}
@@ -96,6 +100,21 @@ package org.apache.royale.html.beads.controllers
 				menu.dataProvider = getSubMenuDataProvider(node, model);
 				menu.labelField = model.labelField;
 				menu.parentMenuBar = (_strand as IMenu).parentMenuBar;
+				// selected item holds the currently open submenu data provider
+				// check to see if that exists and hide it if it does
+				if (model.selectedItem)
+				{
+					var dp:Object = getSubMenuDataProvider(model.selectedItem, model);
+					if (dp)
+					{
+						var nextMenu:CascadingMenu = getMenuWithDataProvider(MenuModel.menuList, dp);
+						if (nextMenu)
+						{
+							clearSubmenusOnSameLevel(nextMenu, nextMenu.model as ISelectionModel);
+						}
+					}
+				}
+				model.selectedItem = event.data;
 				menu.show(component, component.width, 0);
 			}
 			else {
@@ -103,7 +122,61 @@ package org.apache.royale.html.beads.controllers
 				hideOpenMenus();
 			}
 		}
-		
+
+		private function clearSubmenusOnSameLevel(menuToBeRemoved:UIBase, model:ISelectionModel):void
+		{
+			var selectedItem:Object = model.selectedItem;
+			if (!selectedItem)
+			{
+				return removeMenu(menuToBeRemoved);
+			}
+			var menuList:Array = MenuModel.menuList;
+			for (var i:int = 0; i < menuList.length; i++)
+			{
+				var menu:UIBase = menuList[i] as UIBase;
+				var menuModel:ISelectionModel = menu.model as ISelectionModel;
+				if (menuModel && menuModel.selectedItem == selectedItem)
+				{
+					var dp:Object = getSubMenuDataProvider(selectedItem, menuModel as CascadingMenuModel);
+					if (dp)
+					{
+						// though this is being called in a loop, performance shouldn't be a big issue as
+						// number of open nested menus is expected to be small
+						var nextMenu:CascadingMenu = getMenuWithDataProvider(menuList, dp);
+						if (nextMenu)
+						{
+							return clearSubmenusOnSameLevel(menu, nextMenu.model as ISelectionModel);
+						}
+					}
+				}
+			}
+			removeMenu(menuToBeRemoved);
+		}
+
+		/**
+		 * @private
+		 * 
+		 *  Search for an open menu strand according to the given data provider.
+		 *  
+		 *  @langversion 3.0
+		 *  @playerversion Flash 10.2
+		 *  @playerversion AIR 2.6
+		 *  @productversion Royale 0.9.6
+		 */
+		protected function getMenuWithDataProvider(menuList:Array, dp:Object):CascadingMenu
+		{
+			// go over open menus and return the one with the given data provider
+			for (var i:int = 0; i < menuList.length; i++)
+			{
+				var cascadingMenu:CascadingMenu = menuList[i] as CascadingMenu;
+				if (cascadingMenu && cascadingMenu.dataProvider == dp)
+				{
+					return cascadingMenu;
+				}
+			}
+			return null;
+		}
+
 		protected function getSubMenuDataProvider(node:Object, model:CascadingMenuModel):Object
 		{
 			return node[model.submenuField];
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 e130426..02636cf 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
@@ -158,13 +158,7 @@ package org.apache.royale.html.beads.controllers
 			
 			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);
-                    var host:IPopUpHost = UIUtils.findPopUpHost(menu as IUIBase);
-					if(host)
-						host.popUpParent.removeElement(menu);
-				}
+				removeMenu(menu);
 			}
 			MenuModel.clearMenuList();
 		}
@@ -179,6 +173,17 @@ package org.apache.royale.html.beads.controllers
 			hideOpenMenus();
 		}
 		
+		protected function removeMenu(menu:UIBase):void
+		{
+			if (menu.parent != null) {
+				var controller:MenuSelectionMouseController = menu.getBeadByType(MenuSelectionMouseController) as MenuSelectionMouseController;
+				controller.removeClickOutHandler(menu);
+				var host:IPopUpHost = UIUtils.findPopUpHost(menu as IUIBase);
+				if(host)
+					host.popUpParent.removeElement(menu);
+			}
+		}
+
 		/**
 		 * @private
 		 *