Hi Oleg,

I actually have a complete library that does this, extending work by the great Nahuel Faronda. write me directly and I can send it to you. I want to open-source it but I haven't had time to make the sample app yet.

In fact, maybe I'll just open up the existing GitHub entry to the public.

Hang on, I need to put in the license stuff first.


- Sanford



On 4/11/2012 8:57 AM, Left Right wrote:
Hi.

I've been trying to create a light-weight application class substitute for
use in AS only. I could extend SystemManager and (seemingly) implement all
needed functions (that would be generated otherwise). I also created a
class with a mixin function to initiate styles (basically copied from a
working example).
My "application" class extends SpriteVisualElement. I want it to be that
way because my goal is to decouple all sorts of managers globals and such
from this class (and create more specific application classes for different
kinds of projects). All runs fine until I need to add a framework visual
component to the display list. The problem occurs in commitProperties - the
component can't find it's skin.
I tried to chime into what StyleManager does and by doing something like:

button.moduleFactory = this;
button.setStyle("skinClass", ButtonSkin);
button.setStyle("justificationStyle", "prioritizeLeastAdjustment");
button.styleChanged("skinClass");
button.regenerateStyleCache(true);

I could get the button's skin resolved, for this button... but not for it's
label. I can't reach to the label's styles from Application class or any
other class in my disposal unless I modify Button class (I don't want to do
that at the moment - the idea is to get something basic working with what
already exists).
Notice that I've added justificationStyle - this would be technically a bug
in framework, where it tries to assign null to a property that can't accept
nulls, but it's a very minor thing in comparison to the rest of the code,
so just don't focus on it. This is only to show you the extent I could
advance trying to solve the issue.

My style initiating code looks like this:

// Application
UIComponentGlobals.layoutManager = LayoutManager.getInstance();
UIComponentGlobals.layoutManager.usePhasedInstantiation = true;

// _Application_Style
     public static function init(fbs:IFlexModuleFactory):void
     {
         var styleManager:IStyleManager2 =
fbs.getImplementation("mx.styles::IStyleManager2") as IStyleManager2;

         var conditions:Array = null;
         var condition:CSSCondition = null;
         var selector:CSSSelector = null;
         var style:CSSStyleDeclaration;
         var effects:Array;

         var mergedStyle:CSSStyleDeclaration;

         //
         // spark.components.Button
         //
         selector = null;
         conditions = null;
         conditions = null;
         selector = new CSSSelector("spark.components.Button", conditions,
selector);
         mergedStyle =
styleManager.getMergedStyleDeclaration("spark.components.Button");
         style = new CSSStyleDeclaration(selector, styleManager, mergedStyle
== null);

         if (style.defaultFactory == null)
         {
             style.defaultFactory = function():void
             {
                 this.skinClass = spark.skins.spark.ButtonSkin;
             };
         }

         if (mergedStyle != null&&
             (mergedStyle.defaultFactory == null ||
             ObjectUtil.compare(new style.defaultFactory(), new
mergedStyle.defaultFactory())))
         {

styleManager.setStyleDeclaration(style.mx_internal::selectorString, style,
false);
         }
<<<<  the above piece of code is repeated many-many times for each component
var styleNames:Array = ["lineHeight", ...
<<<<  usually generated in FlexInit>>>>  "typographicCase"];
  for (var i:int = 0; i<  styleNames.length; i++)
styleManager.registerInheritingStyle(styleNames[i]);
<<<<  originally from Application class>>>>
styleManager.initProtoChainRoots();
     }

Can, anyone, please, enlighten me, I seem to be missing some key
requirement for the style manager to initiate. Is there some manual switch
I could start the manager myself, rather than from generated code? I've
been searching for it for two days, and I don't want to talk about poor
quality of code because it only offends people :) but I couldn't help
mentioning it. But I do mention it all the time, so, that wouldn't be new
to you :)

Anyways, all help welcome.

Oleg

Reply via email to