Points well taken, and thanks for the enlightenment. Not particularly
proud of the code as it stands, but I just confirmed that the
following does the trick (after adding a content property to the
holder as well):

                override protected function measure():void
                {
                        super.measure();
                        minWidth = measuredWidth = 
content.getExplicitOrMeasuredWidth();
                        minHeight = measuredHeight = 
content.getExplicitOrMeasuredHeight();
                }

                override protected function 
updateDisplayList(unscaledWidth:Number,
unscaledHeight:Number):void
                {                       
                        super.updateDisplayList(unscaledWidth, unscaledHeight);
                        content.setActualSize(unscaledWidth, unscaledHeight);
                }

Any thoughts about handling the centering? Canvas might be overkill
for the ScaleOrCenterView too, otherwise I'd be thinking
horizontalCenter/verticalCenter (though I believe that's a style, not
a property).


On Sun, Jun 1, 2008 at 6:29 PM, Michael Labriola <[EMAIL PROTECTED]> wrote:
>
> Perhaps. I just wanted to clarify the why, not set any policies :)
>
> --- In [email protected], "Josh McDonald" <[EMAIL PROTECTED]>
> wrote:
>>
>> I still think Container makes more sense in this instance though ;-
> )
>>
>> On Mon, Jun 2, 2008 at 11:21 AM, Josh McDonald <[EMAIL PROTECTED]> wrote:
>>
>> > Well if you guys are using it and it works, I suppose that
> question is
>> > answered :) I've never tried to build a container out of
> anything but
>> > Container (strangely enough), so I wasn't talking from
> experience.
>> >
>> > Now that I put more thought into it, it does make sense really,
> for when
>> > you want to build a component that's comprised of a bunch of
> other
>> > components, without needing to support arbitrary children added
> by client
>> > code at run time.
>> >
>> > -J
>> >
>> >
>> > On Mon, Jun 2, 2008 at 11:06 AM, Michael Labriola <[EMAIL PROTECTED]>
>> > wrote:
>> >
>> >>
>> >> Josh,
>> >>
>> >> Unfortunately, I also don't agree with the conclusion reached by
>> >> that post. Take a look at the code for UIComponent yourself. It
>> >> ships with Flex 2 or Flex 3. You can also search for addChild
> in the
>> >> various components that directly inherit from UIComponent in the
>> >> framework, you will see it used often.
>> >>
>> >> Finally, take a look at any of the custom component I, Doug
> McCune
>> >> of Eli Greenfield have published. You will notice that the
> majority
>> >> use UIComponent directly.
>> >>
>> >>
>> >> Labriola
>> >>
>> >> --- In [email protected] <flexcomponents%
> 40yahoogroups.com>,
>> >> "Josh McDonald" <dznuts@>
>> >> wrote:
>> >> >
>> >> > Not according to this post a day or so ago:
>> >> >
>> >> > http://www.mail-
>> >> archive.com/[EMAIL PROTECTED]<archive.com%2Fflexcoders%
> 40yahoogroups.com>
>> >> /msg93835.html
>> >> >
>> >> > Can anybody from Adobe clear this up?
>> >> >
>> >> > -J
>> >> >
>> >> > On Mon, Jun 2, 2008 at 10:50 AM, Michael Labriola <labriola@>
>> >> wrote:
>> >> >
>> >> > >
>> >> > > 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]<flexcomponents%
> 40yahoogroups.com><flexcomponents%
>> >> 40yahoogroups.com>,
>> >>
>> >> > > "Josh McDonald" <dznuts@>
>> >> > > 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
> <rrodseth@>
>> >> > > 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
>> >> > > <rrodseth@<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
>> >> <aharui@<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 :: josh@
>> >> > > >
>> >> > >
>> >> > >
>> >> > >
>> >> >
>> >> >
>> >> >
>> >> > --
>> >> > "Therefore, send not to know For whom the bell tolls. It
> tolls for
>> >> thee."
>> >> >
>> >> > :: Josh 'G-Funk' McDonald
>> >> > :: 0437 221 380 :: josh@
>> >> >
>> >>
>> >>
>> >>
>> >
>> >
>> >
>> > --
>> > "Therefore, send not to know For whom the bell tolls. It tolls
> for thee."
>> >
>> > :: Josh 'G-Funk' McDonald
>> > :: 0437 221 380 :: [EMAIL PROTECTED]
>>
>>
>>
>>
>> --
>> "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