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

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

commit 5512fb2e1f1ddcd26320dffa4fe6f41d88e1cc30
Author: greg-dove <[email protected]>
AuthorDate: Wed Mar 25 18:26:44 2026 +1300

    Numerous updates and tweaks
---
 .../royale/org/apache/royale/style/CheckBox.as     |  5 ++
 .../main/royale/org/apache/royale/style/Divider.as | 17 +++++-
 .../royale/org/apache/royale/style/IStyleSkin.as   |  2 +
 .../royale/org/apache/royale/style/IStyleUIBase.as |  5 +-
 .../royale/org/apache/royale/style/StyleSkin.as    |  4 ++
 .../royale/org/apache/royale/style/StyleUIBase.as  | 22 ++++++-
 .../apache/royale/style/colors/ThemeColorSet.as    |  4 +-
 .../org/apache/royale/style/skins/CheckBoxSkin.as  | 48 ++++++++++++---
 .../org/apache/royale/style/skins/DividerSkin.as   | 37 ++++++++++--
 .../royale/style/stylebeads/ILeafStyleBead.as      |  1 +
 .../apache/royale/style/stylebeads/IStyleBead.as   |  1 +
 .../royale/style/stylebeads/StyleBeadBase.as       | 11 +++-
 .../royale/style/stylebeads/states/HasState.as     | 70 +++++++++++++++++++++-
 .../royale/style/stylebeads/states/HoverState.as   |  3 +-
 .../style/stylebeads/states/LeafDecorator.as       | 33 +++++++++-
 .../royale/style/stylebeads/states/NotState.as     | 70 ++++++++++++++++++++--
 16 files changed, 301 insertions(+), 32 deletions(-)

diff --git 
a/frameworks/projects/Style/src/main/royale/org/apache/royale/style/CheckBox.as 
b/frameworks/projects/Style/src/main/royale/org/apache/royale/style/CheckBox.as
index 830c292d14..ff5656ab35 100644
--- 
a/frameworks/projects/Style/src/main/royale/org/apache/royale/style/CheckBox.as
+++ 
b/frameworks/projects/Style/src/main/royale/org/apache/royale/style/CheckBox.as
@@ -18,6 +18,7 @@
 
////////////////////////////////////////////////////////////////////////////////
 package org.apache.royale.style
 {
+       import org.apache.royale.style.stylebeads.states.HasState;
        
        COMPILE::JS{
                import org.apache.royale.core.WrappedHTMLElement;
@@ -315,6 +316,10 @@ package org.apache.royale.style
                {
                        _quiet = value;
                }
+               override public function getChildInputType():String
+               {
+                       return HasState.CHECKBOX_INPUT;
+               }
        }
 }
 
diff --git 
a/frameworks/projects/Style/src/main/royale/org/apache/royale/style/Divider.as 
b/frameworks/projects/Style/src/main/royale/org/apache/royale/style/Divider.as
index df448215eb..e8d142f458 100644
--- 
a/frameworks/projects/Style/src/main/royale/org/apache/royale/style/Divider.as
+++ 
b/frameworks/projects/Style/src/main/royale/org/apache/royale/style/Divider.as
@@ -18,6 +18,7 @@
 
////////////////////////////////////////////////////////////////////////////////
 package org.apache.royale.style
 {
+       import org.apache.royale.core.IBead;
        import org.apache.royale.core.IMXMLDocument;
        import org.apache.royale.core.ValuesManager;
        import org.apache.royale.events.Event;
@@ -29,6 +30,7 @@ package org.apache.royale.style
                public function Divider()
                {
                        super();
+                       unit = 'px';
                }
                override protected function requiresView():Boolean{
                        return false;
@@ -40,6 +42,16 @@ package org.apache.royale.style
                        return false;
                }*/
                
+               private var _edgePadding:Number = 0;
+               public function get edgePadding():uint{
+                       return _edgePadding;
+               }
+               public function set edgePadding(value:uint):void{
+                       if (_edgePadding != value) {
+                               _edgePadding = value;
+                               if (skin) skin.update();
+                       }
+               }
                
                private var _vertical:Boolean;
                
@@ -54,9 +66,10 @@ package org.apache.royale.style
                public function set vertical(value:Boolean):void
                {
                        if(value != !!_vertical){
-                               
+                               _vertical = value;
+                               if (skin) skin.update();
                        }
-                       _vertical = value;
+                       
                }
        }
 }
\ No newline at end of file
diff --git 
a/frameworks/projects/Style/src/main/royale/org/apache/royale/style/IStyleSkin.as
 
b/frameworks/projects/Style/src/main/royale/org/apache/royale/style/IStyleSkin.as
index 82c148b4aa..ada8fc846b 100644
--- 
a/frameworks/projects/Style/src/main/royale/org/apache/royale/style/IStyleSkin.as
+++ 
b/frameworks/projects/Style/src/main/royale/org/apache/royale/style/IStyleSkin.as
@@ -23,5 +23,7 @@ package org.apache.royale.style
        public interface IStyleSkin extends IBead
        {
                function get styles():Array;
+               
+               function update():void;
        }
 }
\ No newline at end of file
diff --git 
a/frameworks/projects/Style/src/main/royale/org/apache/royale/style/IStyleUIBase.as
 
b/frameworks/projects/Style/src/main/royale/org/apache/royale/style/IStyleUIBase.as
index 4e7350a155..ffcb2f1b67 100644
--- 
a/frameworks/projects/Style/src/main/royale/org/apache/royale/style/IStyleUIBase.as
+++ 
b/frameworks/projects/Style/src/main/royale/org/apache/royale/style/IStyleUIBase.as
@@ -40,6 +40,9 @@ package org.apache.royale.style
                function set unit(value:String):void;
                function get size():String;
                function set size(value:String):void;
-
+               /**
+                * support for component classes that wrap a native input 
element, useful in skins for creating Has states
+                */
+               function getChildInputType():String;
        }
 }
\ No newline at end of file
diff --git 
a/frameworks/projects/Style/src/main/royale/org/apache/royale/style/StyleSkin.as
 
b/frameworks/projects/Style/src/main/royale/org/apache/royale/style/StyleSkin.as
index 51d46fa2a5..ceb79ef980 100644
--- 
a/frameworks/projects/Style/src/main/royale/org/apache/royale/style/StyleSkin.as
+++ 
b/frameworks/projects/Style/src/main/royale/org/apache/royale/style/StyleSkin.as
@@ -76,5 +76,9 @@ package org.apache.royale.style
                        var pixelValue:Number = value;
                        return CSSUnit.convert(pixelValue, CSSUnit.PX, unit) + 
unit;
                }
+               
+               public function update():void{
+                       
+               }
        }
 }
\ No newline at end of file
diff --git 
a/frameworks/projects/Style/src/main/royale/org/apache/royale/style/StyleUIBase.as
 
b/frameworks/projects/Style/src/main/royale/org/apache/royale/style/StyleUIBase.as
index 4084447a8f..4f0f2f27b5 100644
--- 
a/frameworks/projects/Style/src/main/royale/org/apache/royale/style/StyleUIBase.as
+++ 
b/frameworks/projects/Style/src/main/royale/org/apache/royale/style/StyleUIBase.as
@@ -172,11 +172,19 @@ package org.apache.royale.style
                        styleBeads = null;
                        _stylesLoaded = true;
                        if(!_skin)
-                               _skin = loadBeadFromValuesManager(IStyleSkin, 
"iStyleSkin", this) as IStyleSkin;                                
+                               _skin = loadBeadFromValuesManager(IStyleSkin, 
"iStyleSkin", this) as IStyleSkin;
+                       else {
+                               COMPILE::JS{
+                                       if (!_beads || _beads.indexOf(_skin) == 
-1) addBead(_skin);
+                               }
+                               COMPILE::SWF{
+                                       //it seems that _beads is protected in 
js and private in swf.... see above
+                                       addBead(_skin);
+                               }
+                       }
                        
                        if(_skin)
                        {
-                               addBead(_skin);
                                applySkin();
                        }
                        refreshSuspended = false;
@@ -431,6 +439,16 @@ package org.apache.royale.style
                                removeAttribute("tabindex");
                        }
                }
+               
+               /**
+                * for components that wrap a native input element, this should 
return the type of the element.
+                * this can be useful in skinning.
+                * Null if not applicable
+                * @return
+                */
+               public function getChildInputType():String{
+                       return null;
+               }
 
                /**
                 * Returns the tag name to use for this component.
diff --git 
a/frameworks/projects/Style/src/main/royale/org/apache/royale/style/colors/ThemeColorSet.as
 
b/frameworks/projects/Style/src/main/royale/org/apache/royale/style/colors/ThemeColorSet.as
index 467bda9287..76480f9496 100644
--- 
a/frameworks/projects/Style/src/main/royale/org/apache/royale/style/colors/ThemeColorSet.as
+++ 
b/frameworks/projects/Style/src/main/royale/org/apache/royale/style/colors/ThemeColorSet.as
@@ -104,7 +104,7 @@ package org.apache.royale.style.colors
                        const lookupVal:String = getThemeBaseColor(key);
                        assert(!ColorSwatch.isExceptionValue(lookupVal), 'no 
swatch or variation for '+key+":"+lookupVal);
                        var specifier:String = lookupVal + "-" + shade + '/' + 
opacity;
-                       trace(key,specifier);
+                       //trace(key,specifier);
                        var lookupKey:String = key +':'+ specifier;
                        var swatch:ColorSwatch;
                        var swatchStoreMap:Object;
@@ -131,7 +131,7 @@ package org.apache.royale.style.colors
                                        swatchStoreMap.light = swatch;
                                }
                        }
-                       trace(swatch);
+                       //trace(swatch);
                        return swatch;
                }
                
diff --git 
a/frameworks/projects/Style/src/main/royale/org/apache/royale/style/skins/CheckBoxSkin.as
 
b/frameworks/projects/Style/src/main/royale/org/apache/royale/style/skins/CheckBoxSkin.as
index eb0faa8eaa..f5d04f16d3 100644
--- 
a/frameworks/projects/Style/src/main/royale/org/apache/royale/style/skins/CheckBoxSkin.as
+++ 
b/frameworks/projects/Style/src/main/royale/org/apache/royale/style/skins/CheckBoxSkin.as
@@ -33,12 +33,16 @@ package org.apache.royale.style.skins
        import org.apache.royale.style.stylebeads.flexgrid.RowGap;
        import org.apache.royale.style.stylebeads.interact.UserSelect;
        import org.apache.royale.style.stylebeads.states.DisabledState;
+       import org.apache.royale.style.stylebeads.states.HasState;
        import org.apache.royale.style.stylebeads.flexgrid.GridColumn;
        import org.apache.royale.style.stylebeads.flexgrid.GridColumnStart;
        import org.apache.royale.style.stylebeads.flexgrid.GridRowStart;
        import org.apache.royale.style.stylebeads.sizing.HeightStyle;
        import org.apache.royale.style.stylebeads.sizing.WidthStyle;
        import org.apache.royale.style.stylebeads.border.BorderRadius;
+       import org.apache.royale.style.stylebeads.states.LeafDecorator;
+       import org.apache.royale.style.stylebeads.states.NotState;
+       import org.apache.royale.style.stylebeads.states.HoverState;
        import org.apache.royale.style.util.ThemeManager;
        import org.apache.royale.style.stylebeads.border.BorderWidth;
        import org.apache.royale.style.stylebeads.border.BorderColor;
@@ -85,21 +89,49 @@ package org.apache.royale.style.skins
                        var size:Number = 16 * getMultiplier();
                        var box:String = computeSize(size * 1.25, host.unit);
                        var gap:String = computeSize(size * 0.75, host.unit);
-                       var disabledStyle:DisabledState = new DisabledState();
-                       disabledStyle.styles = [
-                               //@todo: observed that this disabled style 
seems not to be working ('pointer' stays active):
-                               new Cursor("auto")
-                       ];
+                       
+                       
+                       var nativeInput:String = host.getChildInputType();
+                       
+                       //active cursor options, both currently working at time 
of testing:
+                       //1. using NotState - 
+                       // :not(:has(input[type="checkbox"]:disabled):hover 
{cursor:pointer} 
+                       /*var disabledCondition:LeafDecorator = new 
HasState(nativeInput, [new DisabledState()]);
+                       var activeCursor:LeafDecorator = new 
NotState(disabledCondition, [
+                               new HoverState([
+                                       new Cursor("pointer")
+                               ])
+                       ]);
+                       _styles = [
+                               new Display("inline-grid"),
+                               new GridTemplateColumns(box + " auto"),
+                               new AlignItems("center"),
+                               new ColumnGap(gap),
+                               new UserSelect("none"),
+                               new Cursor("auto"),
+                               activeCursor
+                       ];*/
+                       
+                       //using has - 
+                       // :has(input[type="checkbox"]:disabled) {
+                       //    cursor: auto;
+                       //}
+                       var disabledState:LeafDecorator = new 
HasState(nativeInput, [
+                               new DisabledState([
+                                       new Cursor("auto")
+                               ])
+                       ]);
                        _styles = [
                                new Display("inline-grid"),
-                               new Cursor("pointer"),
                                new GridTemplateColumns(box + " auto"),
                                new AlignItems("center"),
                                new ColumnGap(gap),
                                new UserSelect("none"),
-                               disabledStyle
+                               new Cursor("pointer"),
+                               disabledState
                        ];
-                       host.setStyles(_styles);
+                       
+                       host.setStyles(_styles, true);
                }
                private function getMultiplier():Number
                {
diff --git 
a/frameworks/projects/Style/src/main/royale/org/apache/royale/style/skins/DividerSkin.as
 
b/frameworks/projects/Style/src/main/royale/org/apache/royale/style/skins/DividerSkin.as
index 38b072db63..ad9a5e1543 100644
--- 
a/frameworks/projects/Style/src/main/royale/org/apache/royale/style/skins/DividerSkin.as
+++ 
b/frameworks/projects/Style/src/main/royale/org/apache/royale/style/skins/DividerSkin.as
@@ -20,6 +20,8 @@ package org.apache.royale.style.skins
 {
        import org.apache.royale.style.StyleSkin;
        import org.apache.royale.core.IStrand;
+       import org.apache.royale.style.stylebeads.background.BackgroundClip;
+       import org.apache.royale.style.stylebeads.border.Border;
        import org.apache.royale.style.stylebeads.sizing.HeightStyle;
        import org.apache.royale.style.stylebeads.sizing.WidthStyle;
        import org.apache.royale.style.stylebeads.border.BorderRadius;
@@ -50,26 +52,53 @@ package org.apache.royale.style.skins
                        processStyles();
                }
                
+               override public function update():void{
+                       processStyles()
+               }
+               
                private function processStyles():void{
                        var host:Divider = getHost();
                        var hostSize:String = getHost().size;
                        var size:Number =  getAppliedSize(hostSize);
                        var colorAdjust:Number = getShading(hostSize);
-                       var appliedSize:String = computeSize(size , host.unit);
+                       var edgePadding:Number = host.edgePadding;
+                       var appliedSize:String = computeSize(size + edgePadding 
* 2 , host.unit);
+                       //edgePadding will be applied with transparent borders;
+                       var borderPadding:Border
+                       if (edgePadding) {
+                               var appliedEdgePadding:String = 
computeSize(edgePadding,host.unit);
+                               borderPadding = new Border();
+                               borderPadding.color = 'transparent';
+                       }
+                       
                        var styles:Array = [
                                        new 
BackgroundColor("slate-"+colorAdjust),
-                                   new 
BorderRadius(ThemeManager.instance.activeTheme.radiusSM)
+                                   new 
BorderRadius(ThemeManager.instance.activeTheme.radiusSM),
                        ]
+                       if (borderPadding) {
+                               styles.push(borderPadding);
+                               styles.push(new BackgroundClip('padding-box'));
+                       }
                        if (getHost().vertical) {
                                styles.push(new HeightStyle('100%'));
-                               styles.push(new WidthStyle())
+                               styles.push(new WidthStyle(appliedSize));
+                               if (borderPadding) {
+                                       //there seems to be no way to configure 
top and bottom border...tbd
+                                       borderPadding.width = 
appliedEdgePadding;
+                               }
+                               
                        } else {
+                               
+                               if (borderPadding) {
+                                       //there seems to be no way to configure 
left and right border...tbd
+                                       borderPadding.width = 
appliedEdgePadding;
+                               }
                                styles.push(new WidthStyle('100%'));
                                styles.push(new HeightStyle(appliedSize));
                        }
                        _styles = styles;
                        
-                       host.setStyles(_styles);
+                       host.setStyles(_styles, true);
                }
                
                private function getShading(size:String):Number{
diff --git 
a/frameworks/projects/Style/src/main/royale/org/apache/royale/style/stylebeads/ILeafStyleBead.as
 
b/frameworks/projects/Style/src/main/royale/org/apache/royale/style/stylebeads/ILeafStyleBead.as
index 581846f53c..e0ef3e3434 100644
--- 
a/frameworks/projects/Style/src/main/royale/org/apache/royale/style/stylebeads/ILeafStyleBead.as
+++ 
b/frameworks/projects/Style/src/main/royale/org/apache/royale/style/stylebeads/ILeafStyleBead.as
@@ -35,6 +35,7 @@ package org.apache.royale.style.stylebeads
                function get ruleSuffix():String;
                function set ruleSuffix(value:String):void;
                function isDecorated():Boolean;
+               function get ruleBase():String;
 
 
        }
diff --git 
a/frameworks/projects/Style/src/main/royale/org/apache/royale/style/stylebeads/IStyleBead.as
 
b/frameworks/projects/Style/src/main/royale/org/apache/royale/style/stylebeads/IStyleBead.as
index 917a077294..23610021c7 100644
--- 
a/frameworks/projects/Style/src/main/royale/org/apache/royale/style/stylebeads/IStyleBead.as
+++ 
b/frameworks/projects/Style/src/main/royale/org/apache/royale/style/stylebeads/IStyleBead.as
@@ -37,5 +37,6 @@ package org.apache.royale.style.stylebeads
                function get parentStyle():IStyleBead;
                function set parentStyle(value:IStyleBead):void;
                function 
decorateChildStyle(style:ILeafStyleBead,decorations:Array):void;
+               function get ruleDecorator():String;
        }
 }
\ No newline at end of file
diff --git 
a/frameworks/projects/Style/src/main/royale/org/apache/royale/style/stylebeads/StyleBeadBase.as
 
b/frameworks/projects/Style/src/main/royale/org/apache/royale/style/stylebeads/StyleBeadBase.as
index 75286da4c4..4fff129691 100644
--- 
a/frameworks/projects/Style/src/main/royale/org/apache/royale/style/stylebeads/StyleBeadBase.as
+++ 
b/frameworks/projects/Style/src/main/royale/org/apache/royale/style/stylebeads/StyleBeadBase.as
@@ -53,7 +53,12 @@ package org.apache.royale.style.stylebeads
                 */
                public function getLeaves():Array
                {
-                       assert(styles && styles.length > 0, "Non-leaf style 
beads must have child styles");
+                       if (!isLeaf && (!styles || styles.length == 0))
+                       {
+                               // If we don't have children, we can't gather 
leaves.
+                               // This can happen if a LeafDecorator is used 
as a selector source for HasState/NotState.
+                               return [];
+                       }
                        preprocessStyle();
                        return gatherLeaves(this);
                }
@@ -105,6 +110,10 @@ package org.apache.royale.style.stylebeads
                {
                        _parentStyle = value;
                }
+               public function get ruleDecorator():String
+               {
+                       return null;
+               }
                abstract public function 
decorateChildStyle(style:ILeafStyleBead, decorations:Array):void;
                public function get isLeaf():Boolean
                {
diff --git 
a/frameworks/projects/Style/src/main/royale/org/apache/royale/style/stylebeads/states/HasState.as
 
b/frameworks/projects/Style/src/main/royale/org/apache/royale/style/stylebeads/states/HasState.as
index 53efce7772..9db7f59700 100644
--- 
a/frameworks/projects/Style/src/main/royale/org/apache/royale/style/stylebeads/states/HasState.as
+++ 
b/frameworks/projects/Style/src/main/royale/org/apache/royale/style/stylebeads/states/HasState.as
@@ -18,14 +18,78 @@
 
////////////////////////////////////////////////////////////////////////////////
 package org.apache.royale.style.stylebeads.states
 {
-       public class HasState extends StyleStateBase
+       import org.apache.royale.style.stylebeads.ILeafStyleBead;
+       import org.apache.royale.style.util.StyleDecoration;
+       import org.apache.royale.style.stylebeads.LeafStyleBase;
+
+       public class HasState extends LeafDecorator
        {
+
+               public static const CHECKBOX_INPUT:String = 
'input[type=checkbox]';
+
                /**
-                * TODO Figure :has out.
+                * HasState is a decorator that adds a :has() pseudo-class to 
the rule.
+                * It can be used to style a parent based on the state of a 
child.
                 */
-               public function HasState()
+               public function HasState(selector:* = null, styles:Array = null)
                {
                        super();
+                       selectorDecorator = "has-";
+                       if (selector is LeafDecorator)
+                       {
+                               _nestedDecorator = selector as LeafDecorator;
+                       }
+                       else
+                       {
+                               ruleDecorator = selector as String;
+                       }
+                       this.styles = styles;
+
+                       decoratorType = COMBINER;
+               }
+
+               private var _nestedDecorator:LeafDecorator;
+
+               /**
+                * @royaleignorecoercion 
org.apache.royale.style.stylebeads.LeafStyleBase
+                */
+               override public function 
decorateChildStyle(style:ILeafStyleBead, decorations:Array):void
+               {
+                       style.selectorPrefix = selectorDecorator + 
style.selectorPrefix;
+
+                       var leafStyle:LeafStyleBase = style as LeafStyleBase;
+
+                       //TODO figure out more complex combinations. For now, 
just handle limited nesting.
+                       var decorationStr:String = ""
+                       var len:int = decorations.length;
+                       for(var i:int = 0; i < len; i++)
+                       {
+                               decorationStr += decorations[i].decoration;
+                       }
+
+                       var rule:String = ruleDecorator || "";
+                       if (_nestedDecorator)
+                       {
+                               rule = _nestedDecorator.getFullRule();
+                               if (_nestedDecorator is HasState)
+                               {
+                                       rule = ":has(" + rule + ")";
+                               }
+                               else if (_nestedDecorator is NotState)
+                               {
+                                       rule = ":not(" + rule + ")";
+                               }
+                       }
+
+                       decorations.push(new StyleDecoration(decoratorType, 
rule + decorationStr));
+
+                       if(!parentStyle || parentStyle.isGroup)
+                       {
+                               leafStyle.ruleSuffix = leafStyle.ruleSuffix + 
":has(" + rule + decorationStr + ")";
+                       }
+
+                       if(parentStyle)
+                               parentStyle.decorateChildStyle(style, 
decorations);
                }
        }
 }
\ No newline at end of file
diff --git 
a/frameworks/projects/Style/src/main/royale/org/apache/royale/style/stylebeads/states/HoverState.as
 
b/frameworks/projects/Style/src/main/royale/org/apache/royale/style/stylebeads/states/HoverState.as
index ab4a23af12..74cdf953ea 100644
--- 
a/frameworks/projects/Style/src/main/royale/org/apache/royale/style/stylebeads/states/HoverState.as
+++ 
b/frameworks/projects/Style/src/main/royale/org/apache/royale/style/stylebeads/states/HoverState.as
@@ -20,11 +20,12 @@ package org.apache.royale.style.stylebeads.states
 {
        public class HoverState extends LeafDecorator
        {
-               public function HoverState()
+               public function HoverState(styles:Array = null)
                {
                        super();
                        selectorDecorator = "hover:";
                        ruleDecorator = ":hover";
+                       this.styles = styles;
                }
        }
 }
\ No newline at end of file
diff --git 
a/frameworks/projects/Style/src/main/royale/org/apache/royale/style/stylebeads/states/LeafDecorator.as
 
b/frameworks/projects/Style/src/main/royale/org/apache/royale/style/stylebeads/states/LeafDecorator.as
index 9162db0958..37bca49b3d 100644
--- 
a/frameworks/projects/Style/src/main/royale/org/apache/royale/style/stylebeads/states/LeafDecorator.as
+++ 
b/frameworks/projects/Style/src/main/royale/org/apache/royale/style/stylebeads/states/LeafDecorator.as
@@ -37,7 +37,15 @@ package org.apache.royale.style.stylebeads.states
                }
                protected var decoratorType:String = STATE;
                protected var selectorDecorator:String;
-               protected var ruleDecorator:String;
+               protected var _ruleDecorator:String;
+               override public function get ruleDecorator():String
+               {
+                       return _ruleDecorator;
+               }
+               public function set ruleDecorator(value:String):void
+               {
+                       _ruleDecorator = value;
+               }
                override public function get styleType():String
                {
                        return selectorDecorator;
@@ -51,18 +59,37 @@ package org.apache.royale.style.stylebeads.states
                        var leafStyle:LeafStyleBase = style as LeafStyleBase;
                        leafStyle.selectorPrefix = selectorDecorator + 
leafStyle.selectorPrefix;
 
-                       decorations.push(new StyleDecoration(decoratorType, 
ruleDecorator));
+                       decorations.push(new StyleDecoration(decoratorType, 
_ruleDecorator));
                        /**
                         * Default behavior is for state decorators. In that 
case, the decoration is added as a suffix.
                         * Otherwise, the decoration is passed to the parent 
which handles the decoration based on the type.
                         */
                        if(!parentStyle || parentStyle.isGroup)
                        {
-                               leafStyle.ruleSuffix = leafStyle.ruleSuffix + 
ruleDecorator;
+                               leafStyle.ruleSuffix = leafStyle.ruleSuffix + 
_ruleDecorator;
                        }
                        if(parentStyle)
                                parentStyle.decorateChildStyle(style, 
decorations);
 
                }
+               public function getFullRule():String
+               {
+                       var rule:String = ruleDecorator || "";
+                       if (styles && styles.length > 0)
+                       {
+                               for each (var style:IStyleBead in styles)
+                               {
+                                       if (style is LeafDecorator)
+                                       {
+                                               rule += (style as 
LeafDecorator).getFullRule();
+                                       }
+                                       else if (style is ILeafStyleBead)
+                                       {
+                                               rule += (style as 
ILeafStyleBead).ruleSuffix;
+                                       }
+                               }
+                       }
+                       return rule;
+               }
        }
 }
\ No newline at end of file
diff --git 
a/frameworks/projects/Style/src/main/royale/org/apache/royale/style/stylebeads/states/NotState.as
 
b/frameworks/projects/Style/src/main/royale/org/apache/royale/style/stylebeads/states/NotState.as
index 39d86cfef2..2df530c36c 100644
--- 
a/frameworks/projects/Style/src/main/royale/org/apache/royale/style/stylebeads/states/NotState.as
+++ 
b/frameworks/projects/Style/src/main/royale/org/apache/royale/style/stylebeads/states/NotState.as
@@ -18,14 +18,74 @@
 
////////////////////////////////////////////////////////////////////////////////
 package org.apache.royale.style.stylebeads.states
 {
-       public class NotState extends StyleStateBase
+       import org.apache.royale.style.stylebeads.ILeafStyleBead;
+       import org.apache.royale.style.util.StyleDecoration;
+       import org.apache.royale.style.stylebeads.LeafStyleBase;
+
+       public class NotState extends LeafDecorator
        {
-               public function NotState()
+               /**
+                * NotState is a decorator that adds a :not() pseudo-class to 
the rule.
+                */
+               public function NotState(selector:* = null, styles:Array = null)
                {
                        super();
+                       selectorDecorator = "not-";
+                       if (selector is LeafDecorator)
+                       {
+                               _nestedDecorator = selector as LeafDecorator;
+                       }
+                       else
+                       {
+                               ruleDecorator = selector as String;
+                       }
+                       this.styles = styles;
+
+                       decoratorType = COMBINER;
+               }
+
+               private var _nestedDecorator:LeafDecorator;
+
+               /**
+                * @royaleignorecoercion 
org.apache.royale.style.stylebeads.LeafStyleBase
+                */
+               override public function 
decorateChildStyle(style:ILeafStyleBead, decorations:Array):void
+               {
+                       style.selectorPrefix = selectorDecorator + 
style.selectorPrefix;
+
+                       var leafStyle:LeafStyleBase = style as LeafStyleBase;
+
+                       //TODO figure out more complex combinations. For now, 
just handle limited nesting.
+                       var decorationStr:String = ""
+                       var len:int = decorations.length;
+                       for(var i:int = 0; i < len; i++)
+                       {
+                               decorationStr += decorations[i].decoration;
+                       }
+
+                       var rule:String = ruleDecorator || "";
+                       if (_nestedDecorator)
+                       {
+                               rule = _nestedDecorator.getFullRule();
+                               if (_nestedDecorator is HasState)
+                               {
+                                       rule = ":has(" + rule + ")";
+                               }
+                               else if (_nestedDecorator is NotState)
+                               {
+                                       rule = ":not(" + rule + ")";
+                               }
+                       }
+
+                       decorations.push(new StyleDecoration(decoratorType, 
rule + decorationStr));
+
+                       if(!parentStyle || parentStyle.isGroup)
+                       {
+                               leafStyle.ruleSuffix = leafStyle.ruleSuffix + 
":not(" + rule + decorationStr + ")";
+                       }
+
+                       if(parentStyle)
+                               parentStyle.decorateChildStyle(style, 
decorations);
                }
-               //TODO Figure this out.
-               // ":not"
-               //".lg\\:not-first\\:border-l:not(:first-child)"
        }
 }
\ No newline at end of file

Reply via email to