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 2022/07/03 14:55:01 UTC

[royale-asjs] branch develop updated: TLCs using RengeModel might need defer initalization until all params are set.

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 c4d56dca20 TLCs using RengeModel might need defer initalization until all params are set.
c4d56dca20 is described below

commit c4d56dca20c8bd55727599f5636997379fe29e76
Author: Yishay Weiss <yi...@hotmail.com>
AuthorDate: Sun Jul 3 17:53:24 2022 +0300

    TLCs using RengeModel might need defer initalization until all params
    are set.
    
    This helps avoid issues in mxml where value is set before maximum.
---
 .../projects/Basic/src/main/royale/BasicClasses.as |   1 +
 .../royale/html/beads/models/DeferredRangeModel.as | 193 +++++++++++++++++++++
 .../projects/Core/src/main/royale/CoreClasses.as   |   1 +
 .../org/apache/royale/core/IDeferredModel.as       |  43 +++++
 .../MXRoyale/src/main/resources/defaults.css       |   3 +-
 .../MXRoyale/src/main/royale/MXRoyaleClasses.as    |   1 +
 .../mx/controls/beads/NumericStepperController.as  |  53 ++++++
 7 files changed, 294 insertions(+), 1 deletion(-)

diff --git a/frameworks/projects/Basic/src/main/royale/BasicClasses.as b/frameworks/projects/Basic/src/main/royale/BasicClasses.as
index e36b48353b..670ce46cdc 100644
--- a/frameworks/projects/Basic/src/main/royale/BasicClasses.as
+++ b/frameworks/projects/Basic/src/main/royale/BasicClasses.as
@@ -168,6 +168,7 @@ internal class BasicClasses
 	import org.apache.royale.html.beads.models.MultiSelectionTreeModel; MultiSelectionTreeModel;
 	import org.apache.royale.html.beads.models.MenuModel; MenuModel;
 	import org.apache.royale.html.beads.models.RangeModel; RangeModel;
+	import org.apache.royale.html.beads.models.DeferredRangeModel; DeferredRangeModel;
 	import org.apache.royale.html.beads.models.RangeModelExtended; RangeModelExtended;
 	import org.apache.royale.html.beads.models.ComboBoxModel; ComboBoxModel;
 	import org.apache.royale.html.beads.models.ViewportModel; ViewportModel;
diff --git a/frameworks/projects/Basic/src/main/royale/org/apache/royale/html/beads/models/DeferredRangeModel.as b/frameworks/projects/Basic/src/main/royale/org/apache/royale/html/beads/models/DeferredRangeModel.as
new file mode 100644
index 0000000000..7d147016da
--- /dev/null
+++ b/frameworks/projects/Basic/src/main/royale/org/apache/royale/html/beads/models/DeferredRangeModel.as
@@ -0,0 +1,193 @@
+////////////////////////////////////////////////////////////////////////////////
+//
+//  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.html.beads.models
+{
+	import org.apache.royale.core.IDeferredModel;
+			
+	/**
+	 *  The DeferredRangeModel class bead defines a set of for a numeric range of values
+	 *  which includes a minimum, maximum, and current value.
+	 *
+	 *  @langversion 3.0
+	 *  @playerversion Flash 10.2
+	 *  @playerversion AIR 2.6
+	 *  @productversion Royale 0.9.10
+	 */
+	public class DeferredRangeModel extends RangeModel implements IDeferredModel
+	{
+		
+		private var _deferredMaximum:Number = 100;
+		
+		/**
+		 *  Whether or not model population is deferred
+		 * 
+		 *  @copy org.apache.royale.core.IDeferredModel#deferred
+		 *
+		 *  @langversion 3.0
+		 *  @playerversion Flash 10.2
+		 *  @playerversion AIR 2.6
+		 *  @productversion Royale 0.9.10
+		 */
+		override public function get maximum():Number
+		{
+			return _deferred ? _deferredMaximum : super.maximum;
+		}
+		
+		override public function set maximum(value:Number):void
+		{
+			if (_deferred)
+			{
+				_deferredMaximum = value;
+			} else
+			{
+				super.maximum = value;
+			}
+		}
+		
+		private var _deferredMinimum:Number = 0;
+		
+		/**
+		 *  The minimum value for the range (defaults to 0).
+		 * 
+		 *  @copy org.apache.royale.core.IRangeModel#minimum
+		 *
+		 *  @langversion 3.0
+		 *  @playerversion Flash 10.2
+		 *  @playerversion AIR 2.6
+		 *  @productversion Royale 0.9.10
+		 */
+		override public function get minimum():Number
+		{
+			return _deferred ? _deferredMinimum : super.minimum;
+		}
+		
+		override public function set minimum(value:Number):void
+		{
+			if (_deferred)
+			{
+				_deferredMinimum = value;
+			} else
+			{
+				super.minimum = value;
+			}
+		}
+
+		private var _deferredSnapInterval:Number = 1;
+		
+		/**
+		 *  The modulus value for the range. 
+		 * 
+		 *  @copy org.apache.royale.core.IRangeModel#snapInterval
+		 *
+		 *  @langversion 3.0
+		 *  @playerversion Flash 10.2
+		 *  @playerversion AIR 2.6
+		 *  @productversion Royale 0.9.10
+		 */
+		override public function get snapInterval():Number
+		{
+			return _deferred ? _deferredSnapInterval : super.snapInterval;
+		}
+		
+		override public function set snapInterval(value:Number):void
+		{
+			if (_deferred)
+			{
+				_deferredSnapInterval = value;
+			} else
+			{
+				super.snapInterval = value;
+			}
+		}
+		private var _decimals:int;
+		
+		private var _deferredStepSize:Number = 1;
+		
+		/**
+		 *  The amount to adjust the value either up or down toward the edge of the range.
+		 * 
+		 *  @copy org.apache.royale.core.IRangeModel#stepSize
+		 *
+		 *  @langversion 3.0
+		 *  @playerversion Flash 10.2
+		 *  @playerversion AIR 2.6
+		 *  @productversion Royale 0.9.10
+		 */
+		override public function get stepSize():Number
+		{
+			return _deferred ? _deferredStepSize : super.stepSize;
+		}
+		
+		override public function set stepSize(value:Number):void
+		{
+			if (_deferred)
+			{
+				_deferredStepSize = value;
+			} else
+			{
+				super.stepSize = value;
+			}
+		}
+		
+		private var _deferredValue:Number = 0;
+		
+		/**
+		 *  The current value of the range, between the minimum and maximum values. Attempting
+		 *  to set the value outside of the minimum-maximum range changes the value to still be
+		 *  within the range. Note that the value is adjusted by the stepSize.
+		 * 
+		 *  @copy org.apache.royale.core.IRangeModel#value
+		 *
+		 *  @langversion 3.0
+		 *  @playerversion Flash 10.2
+		 *  @playerversion AIR 2.6
+		 *  @productversion Royale 0.9.10
+		 */
+		override public function get value():Number
+		{
+			return _deferred ? _deferredValue : super.value;
+		}
+		
+		override public function set value(newValue:Number):void
+		{
+			if (_deferred)
+			{
+				_deferredValue = newValue;
+			} else
+			{
+				super.value = newValue;
+			}
+		}
+
+		private var _deferred:Boolean = true;
+		public function set deferred(value:Boolean):void
+		{
+			_deferred = value;
+			if (!value)
+			{
+				// It's important to maintain the right order, specifically value should be populated last
+				super.snapInterval = _deferredSnapInterval;
+				super.stepSize = _deferredStepSize;
+				super.minimum = _deferredMinimum;
+				super.maximum = _deferredMaximum;
+				super.value = _deferredValue;
+			}
+		}
+	}
+}
diff --git a/frameworks/projects/Core/src/main/royale/CoreClasses.as b/frameworks/projects/Core/src/main/royale/CoreClasses.as
index 69847ef491..3e53c27281 100644
--- a/frameworks/projects/Core/src/main/royale/CoreClasses.as
+++ b/frameworks/projects/Core/src/main/royale/CoreClasses.as
@@ -144,6 +144,7 @@ internal class CoreClasses
 	import org.apache.royale.core.IParentIUIBase; IParentIUIBase;
 	import org.apache.royale.core.IPopUp; IPopUp;
 	import org.apache.royale.core.IRangeModel; IRangeModel;
+	import org.apache.royale.core.IDeferredModel; IDeferredModel;
 	import org.apache.royale.core.IState; IState;
 	import org.apache.royale.core.ISWFApplication; ISWFApplication;
 	import org.apache.royale.core.ITransformModel; ITransformModel;
diff --git a/frameworks/projects/Core/src/main/royale/org/apache/royale/core/IDeferredModel.as b/frameworks/projects/Core/src/main/royale/org/apache/royale/core/IDeferredModel.as
new file mode 100644
index 0000000000..3ebeaf278f
--- /dev/null
+++ b/frameworks/projects/Core/src/main/royale/org/apache/royale/core/IDeferredModel.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
+{
+    /**
+     *  The IDeferredModel interface describes the minimum set of properties
+     *  available for models that cache their values until TLC's content
+     *  creation is being deferred.
+     * 
+     *  @langversion 3.0
+     *  @playerversion Flash 10.2
+     *  @playerversion AIR 2.6
+     *  @productversion Royale 0.9.10
+     */
+	public interface IDeferredModel extends IBeadModel
+	{
+        /**
+         *  Whether or not model population is deferred
+         * 
+         *  @langversion 3.0
+         *  @playerversion Flash 10.2
+         *  @playerversion AIR 2.6
+         *  @productversion Royale 0.9.10
+         */
+		function set deferred(value:Boolean):void;
+    }
+}
diff --git a/frameworks/projects/MXRoyale/src/main/resources/defaults.css b/frameworks/projects/MXRoyale/src/main/resources/defaults.css
index 2d3797ada1..68236d5501 100644
--- a/frameworks/projects/MXRoyale/src/main/resources/defaults.css
+++ b/frameworks/projects/MXRoyale/src/main/resources/defaults.css
@@ -463,8 +463,9 @@ MenuBarItemRenderer
 
 NumericStepper
 {
-	IBeadModel: ClassReference("org.apache.royale.html.beads.models.RangeModel");
+	IBeadModel: ClassReference("org.apache.royale.html.beads.models.DeferredRangeModel");
 	IBeadView: ClassReference("mx.controls.beads.NumericStepperView");
+	IBeadController: ClassReference("mx.controls.beads.NumericStepperController");
 }
 
 Panel
diff --git a/frameworks/projects/MXRoyale/src/main/royale/MXRoyaleClasses.as b/frameworks/projects/MXRoyale/src/main/royale/MXRoyaleClasses.as
index 10b8564c0a..87a302643b 100644
--- a/frameworks/projects/MXRoyale/src/main/royale/MXRoyaleClasses.as
+++ b/frameworks/projects/MXRoyale/src/main/royale/MXRoyaleClasses.as
@@ -283,6 +283,7 @@ internal class MXRoyaleClasses
     import mx.controls.beads.ComboBoxView; ComboBoxView;
 	import mx.controls.beads.controllers.RadioButtonMouseController; RadioButtonMouseController;
     import mx.controls.beads.NumericStepperView; NumericStepperView;
+    import mx.controls.beads.NumericStepperController; NumericStepperController;
     import mx.controls.beads.DateFieldView; DateFieldView;
     import mx.controls.dateFieldClasses.DateFieldDateChooser; DateFieldDateChooser;
     import mx.controls.beads.controllers.MenuBarMouseController; MenuBarMouseController;
diff --git a/frameworks/projects/MXRoyale/src/main/royale/mx/controls/beads/NumericStepperController.as b/frameworks/projects/MXRoyale/src/main/royale/mx/controls/beads/NumericStepperController.as
new file mode 100644
index 0000000000..a8abf271d1
--- /dev/null
+++ b/frameworks/projects/MXRoyale/src/main/royale/mx/controls/beads/NumericStepperController.as
@@ -0,0 +1,53 @@
+////////////////////////////////////////////////////////////////////////////////
+//
+//  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.controls.beads
+{	
+    import org.apache.royale.core.IStrand;
+    import org.apache.royale.core.IDeferredModel;
+    import org.apache.royale.core.IBeadController;
+    import org.apache.royale.events.IEventDispatcher;
+    import mx.events.FlexEvent;
+	
+    /**
+     *  The NumericStepperController class takes control of some lifecycle issues.
+     * 	Specifically, it makes sure the model is notified when content is ready so values
+     *  can be initialized in the right order.
+     * 
+     *  @langversion 3.0
+     *  @playerversion Flash 10.2
+     *  @playerversion AIR 2.6
+     *  @productversion Royale 0.9.10
+     * 
+     *  @royaleignorecoercion mx.core.UIComponent
+     */
+	public class NumericStepperController implements IBeadController
+	{
+		public function set strand(value:IStrand):void
+		{
+			(value as IEventDispatcher).addEventListener(FlexEvent.INITIALIZE, strandInitialized)
+		}
+
+		protected function strandInitialized(event:FlexEvent):void
+		{
+			var model:IDeferredModel = (event.target as IStrand).getBeadByType(IDeferredModel) as IDeferredModel;
+			model.deferred = false;
+		}
+	}
+}
+