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;
+ }
+
}
}