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

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

commit 00eedc92aa5e5d1ed639b69dafea887ea823c9f4
Author: greg-dove <[email protected]>
AuthorDate: Fri May 6 15:56:26 2022 +1200

    For mx MenuBar, don't use an Array-like dataProvider model - use an 
ICollectionView for dataProvider
---
 .../src/main/royale/mx/controls/MenuBar.as         | 36 +--------
 .../mx/controls/beads/models/MenuBarModel.as       | 90 +++++++++++++++++-----
 2 files changed, 75 insertions(+), 51 deletions(-)

diff --git 
a/frameworks/projects/MXRoyale/src/main/royale/mx/controls/MenuBar.as 
b/frameworks/projects/MXRoyale/src/main/royale/mx/controls/MenuBar.as
index ac32d24ba6..b1f9f602f4 100644
--- a/frameworks/projects/MXRoyale/src/main/royale/mx/controls/MenuBar.as
+++ b/frameworks/projects/MXRoyale/src/main/royale/mx/controls/MenuBar.as
@@ -699,36 +699,6 @@ public class MenuBar extends UIComponent implements 
IFocusManagerComponent, ICon
      */
     public function set dataProvider(value:Object):void
     {
-       if (value is Array)
-            {
-                value = new ArrayCollection(value as Array);
-            }
-            else if (value is ICollectionView)
-            {
-                value = ICollectionView(value);
-            }
-            else if (value is IList)
-            {
-                value = new ListCollectionView(IList(value));
-            }
-            else if (value is XMLList)
-            {
-                value = new XMLListCollection(value as XMLList);
-            }
-            else if (value is XML)
-            {
-                var xl:XMLList = new XMLList();
-                xl += value;
-                value = new XMLListCollection(xl);
-            }
-            else
-            {
-                // convert it to an array containing this one item
-                var tmp:Array = [];
-                if (value != null)
-                    tmp.push(value);
-                value = new ArrayCollection(tmp);
-            }
             (model as ISelectionModel).dataProvider = value;
             
             commitProperties();
@@ -755,10 +725,10 @@ public class MenuBar extends UIComponent implements 
IFocusManagerComponent, ICon
      *  @playerversion AIR 1.1
      *  @productversion Royale 0.9.3
      */
-    /* public function get hasRoot():Boolean
+     public function get hasRoot():Boolean
     {
-        return _hasRoot;
-    } */
+        return (model as MenuBarModel).hasRoot;
+    }
 
     //----------------------------------
     //  iconField
diff --git 
a/frameworks/projects/MXRoyale/src/main/royale/mx/controls/beads/models/MenuBarModel.as
 
b/frameworks/projects/MXRoyale/src/main/royale/mx/controls/beads/models/MenuBarModel.as
index 6dd57a6bff..b18834e963 100644
--- 
a/frameworks/projects/MXRoyale/src/main/royale/mx/controls/beads/models/MenuBarModel.as
+++ 
b/frameworks/projects/MXRoyale/src/main/royale/mx/controls/beads/models/MenuBarModel.as
@@ -18,13 +18,15 @@
 
////////////////////////////////////////////////////////////////////////////////
 package mx.controls.beads.models
 {
-    import mx.controls.MenuBar;
-    
-    import org.apache.royale.core.IMenu;
+    import mx.collections.ArrayCollection;
+    import mx.collections.ICollectionView;
+    import mx.collections.XMLListCollection;
+    import mx.events.CollectionEvent;
+    import mx.events.CollectionEventKind;
+
     import org.apache.royale.core.IMenuBarModel;
-    import org.apache.royale.core.IUIBase;
     import org.apache.royale.events.Event;
-    import org.apache.royale.html.beads.models.ArraySelectionModel;
+    import org.apache.royale.events.IEventDispatcher;
        
     /**
      *  MenuBar Mouse Controller
@@ -34,7 +36,7 @@ package mx.controls.beads.models
      *  @playerversion AIR 2.6
      *  @productversion Royale 0.0
      */
-       public class MenuBarModel extends ArraySelectionModel implements 
IMenuBarModel
+       public class MenuBarModel extends SingleSelectionICollectionViewModel 
implements IMenuBarModel
        {
         /**
          *  Constructor.
@@ -46,11 +48,9 @@ package mx.controls.beads.models
          */
                public function MenuBarModel()
                {
-            labelField = "label";
-            submenuField = "children";
                }
                
-        private var _submenuField:String = "menu";
+        private var _submenuField:String = "children";
         
         /**
          * The field in the data object that identifies sub-menus. The default 
is "menu". This
@@ -89,17 +89,71 @@ package mx.controls.beads.models
         {
             _showRoot = value;
         }
-        
-        override public function get dataProvider():Object
-        {
-            var dp:Object = super.dataProvider;
-            
-            if (!showRoot && dp != null)
+
+
+        protected var _hasRoot:Boolean;
+        public function get hasRoot():Boolean{
+            return _hasRoot;
+        }
+
+
+        protected var _rootModel:ICollectionView;
+
+
+        override public function set dataProvider(value:Object):void{
+            if (_rootModel)
+            {
+                
_rootModel.removeEventListener(CollectionEvent.COLLECTION_CHANGE,
+                        collectionChangeHandler);
+            }
+            _hasRoot = false;
+            // handle strings and xml
+            if (typeof(value)=="string")
+                value = new XML(value);
+            /*else if (value is XMLNode)
+                value = new XML(XMLNode(value).toString());*/
+            else if (value is XMLList)
+                value = new XMLListCollection(value as XMLList);
+
+            if (value is XML)
+            {
+                _hasRoot = true;
+                var xl:XMLList = new XMLList();
+                xl += value;
+                _rootModel = new XMLListCollection(xl);
+            }
+            //if already a collection dont make new one
+            else if (value is ICollectionView)
+            {
+                _rootModel = ICollectionView(value);
+                if (_rootModel.length == 1)
+                    _hasRoot = true;
+            }
+            else if (value is Array)
             {
-                return dp.getItemAt(0).children; // TODO: needs to use 
descriptor
+                _rootModel = new ArrayCollection(value as Array);
             }
-            
-            return dp;
+            //all other types get wrapped in an ArrayCollection
+            else if (value is Object)
+            {
+                _hasRoot = true;
+                // convert to an array containing this one item
+                var tmp:Array = [];
+                tmp.push(value);
+                _rootModel = new ArrayCollection(tmp);
+            }
+            else
+            {
+                _rootModel = new ArrayCollection();
+            }
+
+            _rootModel.addEventListener(CollectionEvent.COLLECTION_CHANGE,
+                    collectionChangeHandler, false/*, 0, true*/);
+            super.dataProvider = _rootModel;
+            var event:CollectionEvent = new 
CollectionEvent(CollectionEvent.COLLECTION_CHANGE);
+            event.kind = CollectionEventKind.RESET;
+            collectionChangeHandler(event);
+            /*IEventDispatcher(_strand).*/dispatchEvent(event);
         }
        }
 }

Reply via email to