I see a few problems with the code. UIComponent does not have any 
default implementations for sizing, display, etc. As Josh mentions, 
Container does have these implementations, however, this is likely 
overkill for what you need. However, UIComponent.addChild does add 
things to the display list just fine....

That said, your ScaleToFitContentHolder class extends UIComponent. 
UIComponent does not have an implementation of updateDisplayList. 
updateDisplayList is where a component sizes it's children. 
Therefore anything you add to that content holder is not going to go 
through the normal flex measurement and sizing process.

You also call invalidateSize in your code quite a few times, which 
would make sense, but your measure methods just call the super 
class.... which sets it to 0 width and height unless you set 
explicit values in the UIComponent default implementation.

So, basically, UIComponent is fine, it will work well if you handle 
these issues. If you want an implementation that handles these 
things (and potentially does a lot of other stuff you don't need or 
want) you could extend Container or one of its descendants.

HTH,
Labriola

--- In [email protected], "Josh McDonald" <[EMAIL PROTECTED]> 
wrote:
>
> My Bad buddy, sorry!
> 
> UIComponent.addChild is an inherited Flash thing, not part of 
Flex, and when
> you use it if it works at all, things don't go into Flex's display 
tree
> properly, and all sorts of pain ensues. Try extending Canvas 
instead of
> UIComponent. The magic you need lives in Container.
> 
> -J
> 
> 
> On Sun, Jun 1, 2008 at 7:31 AM, Richard Rodseth <[EMAIL PROTECTED]> 
wrote:
> 
> >   I'd love to wrap up this task. Does anyone have any other 
suggestions?
> >
> >
> > On Tue, May 27, 2008 at 8:24 PM, Richard Rodseth 
<[EMAIL PROTECTED]<rrodseth%40gmail.com>>
> > wrote:
> > > I'm afraid I'm still struggling with this. The classes below 
work
> > > (more or less) if I supply a large button as "content", but if 
I try a
> > > VBox it appears to shrink to nothing. Any ideas? Hopefully the
> > > formatting survived.
> > >
> > > <view:ScaleOrCenterView width="100%" height="100%" >
> > > <mx:VBox borderStyle="solid" borderColor="red"
> > > horizontalScrollPolicy="off" verticalScrollPolicy="off">
> > > <mx:Button label="Test" width="400" height="400"/>
> > > </mx:VBox>
> > > </view:ScaleOrCenterView>
> > >
> > >
> > > [DefaultProperty("content")]
> > > public class ScaleOrCenterView extends UIComponent
> > > {
> > > private var _contentHolder:ScaleToFitContentHolder = new
> > > ScaleToFitContentHolder();;
> > > private var _content:UIComponent;
> > >
> > > public function ScaleOrCenterView()
> > > {
> > > super();
> > > }
> > >
> > > override protected function createChildren():void {
> > > super.createChildren();
> > > this.addChild(_contentHolder);
> > > }
> > >
> > > [Inspectable]
> > > public function set content(value:UIComponent):void {
> > > if (_content != null) {
> > > _contentHolder.removeChild(_content);
> > > }
> > > _content = value;
> > > if (_content != null) {
> > > _contentHolder.addChild(_content);
> > > }
> > > this.invalidateSize();
> > > }
> > >
> > > override protected function updateDisplayList
(unscaledWidth:Number,
> > > unscaledHeight:Number):void
> > > {
> > > super.updateDisplayList(unscaledWidth, unscaledHeight);
> > >
> > > var contentWidth:Number = _content.getExplicitOrMeasuredWidth
();
> > > var contentHeight:Number = _content.getExplicitOrMeasuredHeight
();
> > >
> > > var xScale:Number = (unscaledWidth / contentWidth);
> > > var yScale:Number = (unscaledHeight / contentHeight);
> > >
> > > _contentHolder.setActualSize(unscaledWidth, unscaledHeight);
> > >
> > > _contentHolder.allowInvalidateSize = false;
> > > if (xScale < 1 || yScale < 1) {
> > > _contentHolder.scaleX = xScale
> > > _contentHolder.scaleY = yScale
> > > } else {
> > > _contentHolder.scaleX = 1.0;
> > > _contentHolder.scaleY = 1.0;
> > > }
> > > _contentHolder.allowInvalidateSize = true;
> > >
> > > }
> > >
> > > }
> > >
> > > public class ScaleToFitContentHolder extends UIComponent
> > > {
> > > public var allowInvalidateSize:Boolean = true;
> > >
> > > public function ScaleToFitContentHolder()
> > > {
> > > }
> > >
> > > override protected function measure():void
> > > {
> > > super.measure();
> > > }
> > >
> > > override public function invalidateSize():void
> > > {
> > > if (allowInvalidateSize)
> > > super.invalidateSize();
> > > }
> > >
> > > }
> > > On Mon, May 26, 2008 at 9:02 PM, Alex Harui <[EMAIL PROTECTED]<aharui%
40adobe.com>>
> > wrote:
> > >> One way is to block invalidateSize when scaling the child. See
> > >> ListBaseContentHolder
> > >>
> > >>
> > >>
> > >> ________________________________
> > >>
> > >
> >  
> >
> 
> 
> 
> -- 
> "Therefore, send not to know For whom the bell tolls. It tolls for 
thee."
> 
> :: Josh 'G-Funk' McDonald
> :: 0437 221 380 :: [EMAIL PROTECTED]
>


Reply via email to