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 <[email protected]>
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;
+               }
+       }
+}
+

Reply via email to