You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@royale.apache.org by ah...@apache.org on 2020/03/15 17:20:22 UTC

[royale-asjs] 04/04: optimize for fewer DG layout passes

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

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

commit 506bfe69a2b134fe757ccca77b6caef693b32c85
Author: Alex Harui <ah...@apache.org>
AuthorDate: Sun Mar 15 10:19:47 2020 -0700

    optimize for fewer DG layout passes
---
 .../org/apache/royale/html/beads/DataGridView.as   |  45 ++++++++-
 .../royale/html/beads/layouts/DataGridLayout.as    |  10 +-
 .../org/apache/royale/charts/beads/ChartView.as    |   3 +-
 .../org/apache/royale/utils/MockLayoutHost.as      |   4 +-
 .../org/apache/royale/utils/MockLayoutParent.as    |   3 +-
 .../MXRoyale/src/main/resources/defaults.css       |   7 +-
 .../MXRoyale/src/main/royale/MXRoyaleClasses.as    |   2 +
 .../beads/AdvancedDataGridHeaderLayout.as          |  18 +++-
 .../mx/containers/beads/PanelInternalContainer.as} |  52 ++++++-----
 .../containers/beads/PanelInternalContainerView.as | 101 +++++++++++++++++++++
 .../main/royale/mx/containers/beads/PanelView.as   |  34 ++++++-
 11 files changed, 241 insertions(+), 38 deletions(-)

diff --git a/frameworks/projects/Basic/src/main/royale/org/apache/royale/html/beads/DataGridView.as b/frameworks/projects/Basic/src/main/royale/org/apache/royale/html/beads/DataGridView.as
index 9ee56e7..ff5120f 100644
--- a/frameworks/projects/Basic/src/main/royale/org/apache/royale/html/beads/DataGridView.as
+++ b/frameworks/projects/Basic/src/main/royale/org/apache/royale/html/beads/DataGridView.as
@@ -28,6 +28,7 @@ package org.apache.royale.html.beads
 	import org.apache.royale.core.IDataGridModel;
 	import org.apache.royale.core.IDataGridPresentationModel;
 	import org.apache.royale.core.IParent;
+	import org.apache.royale.core.IStrand;
     import org.apache.royale.core.IUIBase;
 	import org.apache.royale.core.ValuesManager;
 	import org.apache.royale.debugging.assert;
@@ -67,6 +68,17 @@ package org.apache.royale.html.beads
 				super();
 			}
 
+		    /**
+		     * @royaleignorecoercion org.apache.royale.events.IEventDispatcher
+		     */
+		    override public function set strand(value:IStrand):void
+		    {
+		        super.strand = value;
+				host.addEventListener("widthChanged", handleSizeChanges);
+				host.addEventListener("heightChanged", handleSizeChanges);
+				host.addEventListener("sizeChanged", handleSizeChanges);
+			}
+
 			private var _header:DataGridButtonBar;
 			private var _listArea:IUIBase;
 
@@ -102,6 +114,8 @@ package org.apache.royale.html.beads
                 handleInitComplete(null);
             }
 
+			private var sawInitComplete:Boolean;
+			
 			/**
 			 * @private
 			 * @royaleignorecoercion org.apache.royale.core.IDataGridModel
@@ -115,6 +129,8 @@ package org.apache.royale.html.beads
 			 */
 			override protected function handleInitComplete(event:Event):void
 			{
+				sawInitComplete = event != null;
+				
 				var host:IDataGrid = _strand as IDataGrid;
 
 				// see if there is a presentation model already in place. if not, add one.
@@ -150,18 +166,21 @@ package org.apache.royale.html.beads
 
 				handleDataProviderChanged(event);
 
-				host.addEventListener("widthChanged", handleSizeChanges);
-				host.addEventListener("heightChanged", handleSizeChanges);
 				sendStrandEvent(_strand,"dataGridViewCreated");
 			}
 
+			private var sawSizeChanged:Boolean;
+			
 			/**
 			 * @private
 			 */
 			private function handleSizeChanges(event:Event):void
 			{
-				sendEvent(_header,"layoutChanged");
-				sendEvent(_listArea,"layoutChanged");
+				sawSizeChanged = true;
+				if (_header)
+					sendEvent(_header,"layoutChanged");
+				if (_listArea)
+					sendEvent(_listArea,"layoutChanged");
 			}
 
 			/**
@@ -273,6 +292,24 @@ package org.apache.royale.html.beads
 
 				sendStrandEvent(_strand,"layoutNeeded");
 			}
+			
+			/**
+			 * Provides a place for pre-layout actions.
+			 *
+			 *  @langversion 3.0
+			 *  @playerversion Flash 10.2
+			 *  @playerversion AIR 2.6
+			 *  @productversion Royale 0.8
+			 */
+			override public function beforeLayout():Boolean
+			{
+				var host:ILayoutChild = _strand as ILayoutChild;
+				if (host.isWidthSizedToContent() && host.isHeightSizedToContent())
+					return sawInitComplete;
+				return sawSizeChanged;
+			}
+
+
 		}
 }
 
diff --git a/frameworks/projects/Basic/src/main/royale/org/apache/royale/html/beads/layouts/DataGridLayout.as b/frameworks/projects/Basic/src/main/royale/org/apache/royale/html/beads/layouts/DataGridLayout.as
index be56f19..d5af909 100644
--- a/frameworks/projects/Basic/src/main/royale/org/apache/royale/html/beads/layouts/DataGridLayout.as
+++ b/frameworks/projects/Basic/src/main/royale/org/apache/royale/html/beads/layouts/DataGridLayout.as
@@ -23,6 +23,7 @@ package org.apache.royale.html.beads.layouts
     import org.apache.royale.core.IBeadView;
     import org.apache.royale.core.IBorderPaddingMarginValuesImpl;
     import org.apache.royale.core.IDataGridModel;
+    import org.apache.royale.core.ILayoutHost;
     import org.apache.royale.core.IStrand;
     import org.apache.royale.core.IUIBase;
     import org.apache.royale.core.UIBase;
@@ -91,12 +92,16 @@ package org.apache.royale.html.beads.layouts
 		
 		private function handleSizeChanges(event:Event):void
 		{
-			layout();
+			var viewBead:ILayoutHost = uiHost.view as ILayoutHost;
+			if (viewBead.beforeLayout())
+				layout();
 		}
 		
 		private function handleLayoutNeeded(event:Event):void
 		{
-			layout();
+			var viewBead:ILayoutHost = uiHost.view as ILayoutHost;
+			if (viewBead.beforeLayout())
+				layout();
 		}
 		
         protected function getColumnsForLayout():Array
@@ -123,6 +128,7 @@ package org.apache.royale.html.beads.layouts
 		 * @copy org.apache.royale.core.IBeadLayout#layout
          * @royaleignorecoercion org.apache.royale.core.IBorderPaddingMarginValuesImpl
          * @royaleignorecoercion org.apache.royale.core.IDataGridModel
+         * @royaleignorecoercion org.apache.royale.core.ILayoutHost
          * @royaleignorecoercion org.apache.royale.core.IUIBase
 		 * @royaleignorecoercion org.apache.royale.core.UIBase
 		 * @royaleignorecoercion org.apache.royale.html.beads.IDataGridView
diff --git a/frameworks/projects/Charts/src/main/royale/org/apache/royale/charts/beads/ChartView.as b/frameworks/projects/Charts/src/main/royale/org/apache/royale/charts/beads/ChartView.as
index 9ebec7c..9921d4e 100644
--- a/frameworks/projects/Charts/src/main/royale/org/apache/royale/charts/beads/ChartView.as
+++ b/frameworks/projects/Charts/src/main/royale/org/apache/royale/charts/beads/ChartView.as
@@ -172,7 +172,7 @@ package org.apache.royale.charts.beads
 		 *  @productversion Royale 0.0
          *  @royaleignorecoercion org.apache.royale.core.IBorderPaddingMarginValuesImpl
 		 */		
-		override public function beforeLayout():void
+		override public function beforeLayout():Boolean
 		{			
 			var metrics:EdgeData = (ValuesManager.valuesImpl as IBorderPaddingMarginValuesImpl).getBorderAndPaddingMetrics(_strand as IUIBase);
 			
@@ -216,6 +216,7 @@ package org.apache.royale.charts.beads
 				UIBase(horizontalAxisGroup).width = strandWidth - widthAdjustment - metrics.left - metrics.right;
 				UIBase(horizontalAxisGroup).height = heightAdjustment;
 			}
+			return true;
 		}
 		
 		/**
diff --git a/frameworks/projects/Effects/src/main/royale/org/apache/royale/utils/MockLayoutHost.as b/frameworks/projects/Effects/src/main/royale/org/apache/royale/utils/MockLayoutHost.as
index 8577659..2dbf228 100644
--- a/frameworks/projects/Effects/src/main/royale/org/apache/royale/utils/MockLayoutHost.as
+++ b/frameworks/projects/Effects/src/main/royale/org/apache/royale/utils/MockLayoutHost.as
@@ -34,9 +34,9 @@ package org.apache.royale.utils
 			return _contentView;
 		}
 		
-		public function beforeLayout():void
+		public function beforeLayout():Boolean
 		{
-			
+			return true;
 		}
 		
 		public function afterLayout():void
diff --git a/frameworks/projects/Effects/src/main/royale/org/apache/royale/utils/MockLayoutParent.as b/frameworks/projects/Effects/src/main/royale/org/apache/royale/utils/MockLayoutParent.as
index 8c26ed2..149190f 100644
--- a/frameworks/projects/Effects/src/main/royale/org/apache/royale/utils/MockLayoutParent.as
+++ b/frameworks/projects/Effects/src/main/royale/org/apache/royale/utils/MockLayoutParent.as
@@ -50,9 +50,10 @@ package org.apache.royale.utils
 			_source = source;
 		}
 		
-		public function beforeLayout():void
+		public function beforeLayout():Boolean
 		{
 			// TODO ??
+			return true;
 		}
 		
 		public function afterLayout():void
diff --git a/frameworks/projects/MXRoyale/src/main/resources/defaults.css b/frameworks/projects/MXRoyale/src/main/resources/defaults.css
index 3abd24c..c0c8494 100644
--- a/frameworks/projects/MXRoyale/src/main/resources/defaults.css
+++ b/frameworks/projects/MXRoyale/src/main/resources/defaults.css
@@ -262,6 +262,11 @@ containerBeads|FormItemContainer
 	IViewport: ClassReference("org.apache.royale.html.supportClasses.Viewport");
 }
 
+containerBeads|PanelInternalContainer
+{
+	IBeadView: ClassReference("mx.containers.beads.PanelInternalContainerView");
+}
+
 Image
 {
 	IBeadModel: ClassReference("org.apache.royale.html.beads.models.ImageModel");
@@ -372,7 +377,7 @@ Panel
 	IBeadModel: ClassReference("mx.containers.beads.models.PanelModel");
 	IBeadView: ClassReference("mx.containers.beads.PanelView");
 	IPanelLayout: ClassReference("mx.containers.beads.BoxLayout");
-	IPanelContentArea: ClassReference("mx.core.Container");	
+	IPanelContentArea: ClassReference("mx.containers.beads.PanelInternalContainer");	
 	background-color: #FFFFFF;
 	border-width: 1px;
 	border: 1px solid #333333;
diff --git a/frameworks/projects/MXRoyale/src/main/royale/MXRoyaleClasses.as b/frameworks/projects/MXRoyale/src/main/royale/MXRoyaleClasses.as
index 69857b8..3213775 100644
--- a/frameworks/projects/MXRoyale/src/main/royale/MXRoyaleClasses.as
+++ b/frameworks/projects/MXRoyale/src/main/royale/MXRoyaleClasses.as
@@ -57,6 +57,8 @@ internal class MXRoyaleClasses
     import mx.containers.beads.DividedBoxLayout; DividedBoxLayout;
 	import mx.containers.beads.CanvasLayout; CanvasLayout;
     import mx.containers.beads.layouts.BasicLayout; BasicLayout;
+	import mx.containers.beads.PanelInternalContainer; PanelInternalContainer;
+	import mx.containers.beads.PanelInternalContainerView; PanelInternalContainerView;
 	import mx.controls.beads.AlertView; AlertView;
     import mx.controls.beads.controllers.AlertMouseController; AlertMouseController;
     import mx.containers.errors.ConstraintError; ConstraintError;
diff --git a/frameworks/projects/MXRoyale/src/main/royale/mx/containers/beads/AdvancedDataGridHeaderLayout.as b/frameworks/projects/MXRoyale/src/main/royale/mx/containers/beads/AdvancedDataGridHeaderLayout.as
index d78955b..6349291 100644
--- a/frameworks/projects/MXRoyale/src/main/royale/mx/containers/beads/AdvancedDataGridHeaderLayout.as
+++ b/frameworks/projects/MXRoyale/src/main/royale/mx/containers/beads/AdvancedDataGridHeaderLayout.as
@@ -30,7 +30,9 @@ package mx.containers.beads
     import org.apache.royale.core.ILayoutView;
     import org.apache.royale.core.IStyleableObject;
     import org.apache.royale.core.IStrand;
+    import org.apache.royale.core.IStrandWithModel;
     import org.apache.royale.html.beads.models.ButtonBarModel;
+	import org.apache.royale.events.Event;
 
 /*
 import mx.core.mx_internal;
@@ -78,11 +80,21 @@ public class AdvancedDataGridHeaderLayout extends LayoutBase
 	
 	private var _strand:IStrand;
 	
+    /**
+     *  @royaleignorecoercion org.apache.royale.core.IStrandWithModel
+     */
 	override public function set strand(value:IStrand):void
 	{
 		_strand = value;
 		super.strand = value;
-		
+		(host as IStrandWithModel).model.addEventListener("dataProviderChanged", dataProviderChangedHandler);
+	}
+	
+	private var sawDPChanged:Boolean;
+	
+	private function dataProviderChangedHandler(event:Event):void
+	{
+		sawDPChanged = true;
 	}
 	
     private var _buttonWidths:Array = null;
@@ -114,6 +126,10 @@ public class AdvancedDataGridHeaderLayout extends LayoutBase
 
 	override public function layout():Boolean
 	{
+		// ignore other lifecycle layouts until the DP is set
+		if (!sawDPChanged) 
+			return true;
+		
         var contentView:ILayoutView = layoutView;
         
         var model:ButtonBarModel = (host as IStrand).getBeadByType(ButtonBarModel) as ButtonBarModel;
diff --git a/frameworks/projects/Effects/src/main/royale/org/apache/royale/utils/MockLayoutHost.as b/frameworks/projects/MXRoyale/src/main/royale/mx/containers/beads/PanelInternalContainer.as
similarity index 62%
copy from frameworks/projects/Effects/src/main/royale/org/apache/royale/utils/MockLayoutHost.as
copy to frameworks/projects/MXRoyale/src/main/royale/mx/containers/beads/PanelInternalContainer.as
index 8577659..6b30ab8 100644
--- a/frameworks/projects/Effects/src/main/royale/org/apache/royale/utils/MockLayoutHost.as
+++ b/frameworks/projects/MXRoyale/src/main/royale/mx/containers/beads/PanelInternalContainer.as
@@ -16,32 +16,36 @@
 //  limitations under the License.
 //
 ////////////////////////////////////////////////////////////////////////////////
-package org.apache.royale.utils
+
+package mx.containers.beads
 {
-	import org.apache.royale.core.ILayoutHost;
-	import org.apache.royale.core.ILayoutView;
 
-	public class MockLayoutHost implements ILayoutHost
-	{
-		private var _contentView:ILayoutView;
-		public function MockLayoutHost(source:ILayoutHost)
-		{
-			_contentView = new MockContentView(source.contentView);
-		}
+import mx.core.Container;
+
+/**
+ *  @private
+ *  The PanelInternalContainer is used to apply a custom view to Panel's internal container.
+ */
+public class PanelInternalContainer extends Container
+{
+	//--------------------------------------------------------------------------
+	//
+	//  Constructor
+	//
+	//--------------------------------------------------------------------------
 
-		public function get contentView():ILayoutView
-		{
-			return _contentView;
-		}
-		
-		public function beforeLayout():void
-		{
-			
-		}
-		
-		public function afterLayout():void
-		{
-			
-		}
+	/**
+	 *  Constructor.
+	 *  
+	 *  @langversion 3.0
+	 *  @playerversion Flash 9
+	 *  @playerversion AIR 1.1
+	 *  @productversion Flex 3
+	 */
+	public function PanelInternalContainer()
+	{
+		super();
 	}
 }
+
+}
diff --git a/frameworks/projects/MXRoyale/src/main/royale/mx/containers/beads/PanelInternalContainerView.as b/frameworks/projects/MXRoyale/src/main/royale/mx/containers/beads/PanelInternalContainerView.as
new file mode 100644
index 0000000..955c5d6
--- /dev/null
+++ b/frameworks/projects/MXRoyale/src/main/royale/mx/containers/beads/PanelInternalContainerView.as
@@ -0,0 +1,101 @@
+////////////////////////////////////////////////////////////////////////////////
+//
+//  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 mx.containers.beads
+{
+
+import mx.core.Container;
+
+import org.apache.royale.core.IBead;
+import org.apache.royale.core.ILayoutChild;
+import org.apache.royale.core.IStrand;
+import org.apache.royale.core.UIBase;
+import org.apache.royale.html.beads.ContainerView;
+import org.apache.royale.events.Event;
+
+/**
+ *  @private
+ *  The PanelView for emulation.
+ */
+public class PanelInternalContainerView extends org.apache.royale.html.beads.ContainerView
+{
+	//--------------------------------------------------------------------------
+	//
+	//  Constructor
+	//
+	//--------------------------------------------------------------------------
+
+	/**
+	 *  Constructor.
+	 *  
+	 *  @langversion 3.0
+	 *  @playerversion Flash 9
+	 *  @playerversion AIR 1.1
+	 *  @productversion Flex 3
+	 */
+	public function PanelInternalContainerView()
+	{
+		super();
+	}
+    
+	/**
+	 * Strand setter.
+	 *
+	 *  @langversion 3.0
+	 *  @playerversion Flash 10.2
+	 *  @playerversion AIR 2.6
+	 *  @productversion Royale 0.8
+	 */
+	override public function set strand(value:IStrand):void
+	{
+		super.strand = value;
+
+		var container:Container = host as Container;
+		var panel:Container = container.parent as Container;
+		panel.addEventListener("widthChanged", handleSizeChanged);
+		panel.addEventListener("heightChanged", handleSizeChanged);
+		panel.addEventListener("sizeChanged", handleSizeChanged);
+	}
+	
+	private var sawSizeChanged:Boolean;
+	
+	private function handleSizeChanged(event:Event):void
+	{
+		sawSizeChanged = true;
+	}
+	
+	/**
+     * @royaleignorecoercion mx.core.UIComponent 
+     * @royaleignorecoercion org.apache.royale.core.UIBase
+     * @royaleignorecoercion mx.containers.beads.models.PanelModel 
+     */
+    override public function beforeLayout():Boolean
+    {
+		var container:Container = host as Container;
+		var panel:Container = container.parent as Container;
+		if (!panel.isWidthSizedToContent() || !panel.isHeightSizedToContent())
+		{
+			return sawSizeChanged;
+		}
+        return true;
+    }
+    
+}
+
+}
diff --git a/frameworks/projects/MXRoyale/src/main/royale/mx/containers/beads/PanelView.as b/frameworks/projects/MXRoyale/src/main/royale/mx/containers/beads/PanelView.as
index 447cc14..c364279 100644
--- a/frameworks/projects/MXRoyale/src/main/royale/mx/containers/beads/PanelView.as
+++ b/frameworks/projects/MXRoyale/src/main/royale/mx/containers/beads/PanelView.as
@@ -36,6 +36,8 @@ import org.apache.royale.core.IStrand;
 import org.apache.royale.core.UIBase;
 import org.apache.royale.html.beads.PanelView;
 import org.apache.royale.html.beads.layouts.VerticalFlexLayout;
+import org.apache.royale.events.Event;
+import org.apache.royale.events.IEventDispatcher;
 
 /**
  *  @private
@@ -63,13 +65,25 @@ public class PanelView extends org.apache.royale.html.beads.PanelView
 	}
 
     /**
+     * @royaleignorecoercion org.apache.royale.events.IEventDispatcher
      */
     override public function set strand(value:IStrand):void
     {
         titleBar = new PanelTitleBar();
+		var panel:IEventDispatcher = value as IEventDispatcher;
+		panel.addEventListener("widthChanged", handleSizeChanged);
+		panel.addEventListener("heightChanged", handleSizeChanged);
+		panel.addEventListener("sizeChanged", handleSizeChanged);
         super.strand = value;
-    }
-    
+	}
+	
+	private var sawSizeChanged:Boolean;
+	
+	private function handleSizeChanged(event:Event):void
+	{
+		sawSizeChanged = true;
+	}
+	    
     /**
      * @royaleignorecoercion mx.core.UIComponent 
      * @royaleignorecoercion org.apache.royale.core.UIBase
@@ -131,6 +145,22 @@ public class PanelView extends org.apache.royale.html.beads.PanelView
         boxLayout.direction = "vertical";
         _strand.addBead(boxLayout);
     }
+
+	/**
+     * @royaleignorecoercion mx.core.UIComponent 
+     * @royaleignorecoercion org.apache.royale.core.UIBase
+     * @royaleignorecoercion mx.containers.beads.models.PanelModel 
+     */
+    override public function beforeLayout():Boolean
+    {
+		var panel:Container = host as Container;
+		if (!panel.isWidthSizedToContent() || !panel.isHeightSizedToContent())
+		{
+			return sawSizeChanged;
+		}
+        return true;
+    }
+
 }
 
 }