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