<?xml version="1.0"?>
<!-- accessibility\ScrollComp.mxml -->
<mx:Application xmlns:mx="http://www.adobe.com/2006/mxml";
    layout="absolute"
    creationComplete="setupFocusViewportWatcher();">

    <mx:Script>
        <![CDATA[

        import mx.core.Container;
        import mx.core.EdgeMetrics;

        [Bindable]
        public var cards: Array = [
            {label:"Visa", data:1},
            {label:"Master Card", data:2},
            {label:"American Express", data:3} ];

        [Bindable]
        public var selectedItem:Object;

        [Bindable]
        public var forListDP:Array = [
            {label:'Apple', data:10.00},
            {label:'Banana', data:15.00},
            {label:'Melon', data:3.50},
            {label:'Kiwi', data:7.65},
            {label:'123', data:12.35 },
            {label:'some', data:10.01 }];

        // Set up the event listener for the focusIn event.
        public function setupFocusViewportWatcher():void {
            addEventListener("focusIn", makeFocusedItemVisible);
        }

        public function makeFocusedItemVisible(event:FocusEvent):void {
            // Target is the actual object that has focus.
            var target:InteractiveObject = InteractiveObject(event.target);

            // OriginalTarget is the component that has focus as some
            // component actually delegate true focus to an internal object.
            var originalTarget:InteractiveObject =
        InteractiveObject(focusManager.findFocusManagerComponent(target));

            // The viewable portion of a container
            var viewport:Rectangle = new Rectangle();
            do {
                // Cycle through all parents looking for containers.
                if (target.parent is Container) {
                    var viewportChanged:Boolean = false;
                    var c:Container = target.parent as Container;

                    // Get the viewable area in the container.
                    var vm:EdgeMetrics = c.viewMetrics;
                    viewport.x = vm.left;
                    viewport.y = vm.top;
                    viewport.width =
                        c.width / c.scaleX - vm.left - vm.right;
                    viewport.height =
                        c.height / c.scaleY - vm.top - vm.bottom;

                    // Calculate the position of the target in the container.
                    var topLeft:Point = new Point(0, 0);
                    var bottomRight:Point =
                new Point(originalTarget.width, originalTarget.height);
                    topLeft = originalTarget.localToGlobal(topLeft);
                    topLeft = c.globalToLocal(topLeft);
                    bottomRight = originalTarget.localToGlobal(bottomRight);
                    bottomRight = c.globalToLocal(bottomRight);

                    // Figure out if we have to move the scroll bars.
                    // If the scroll bar moves, the position of the component
                    // moves as well. This algorithm makes sure the top
                    // left of the component is visible if the component is
                    // bigger than the viewport.
                    var delta:Number;

                    if (bottomRight.x > viewport.right) {
                        delta = bottomRight.x - viewport.right;
                        c.horizontalScrollPosition += delta;
                        topLeft.x -= delta;
                        viewportChanged = true;
                    }

                    if (topLeft.x < viewport.left) {
                        // leave it a few pixels in from the left
                        c.horizontalScrollPosition -=
                            viewport.left - topLeft.x + 2;
                        viewportChanged = true;
                    }

                    if (bottomRight.y > viewport.bottom) {
                        delta = bottomRight.y - viewport.bottom;
                        c.verticalScrollPosition += delta;
                        topLeft.y -= delta;
                        viewportChanged = true;
                    }

                    if (topLeft.y < viewport.top) {
                        // leave it a few pixels down from the top
                        c.verticalScrollPosition -=
                            viewport.top - topLeft.y + 2;
                        viewportChanged = true;
                    }

                    // You must the validateNow() method to get the
                    // container to move the component before working
                    // on the next parent.
                    // Otherwise, your calculations will be incorrect.
                    if (viewportChanged) {
                        c.validateNow();
                    }
                }

                target = target.parent;
            }

            while (target != this);
        }
        ]]>
    </mx:Script>

    <mx:Model id="statesModel" source="assets/states.xml"/>
    <mx:Panel
            x="58" y="48"
            width="442" height="201"
            layout="absolute"
            title="Tab through controls to see if focus stays in view">

        <mx:VBox x="10" y="10" verticalScrollPolicy="off">
            <mx:TextInput/>
            <mx:TextInput/>
            <mx:TextArea width="328" height="64"/>
            <mx:ComboBox dataProvider="{cards}" width="150"/>
            <mx:DataGrid dataProvider="{forListDP}" />
            <mx:DateChooser yearNavigationEnabled="true"/>
            <mx:List id="source"
                width="75"
                dataProvider="{statesModel.state}"/>
        </mx:VBox>
    </mx:Panel>
</mx:Application>

2009/4/8 Ricardo Cerqueira <rcerque...@gmail.com>
>
> Galera é o seguinte, tenho um VBOX ocupando 100% da tela, nele existe
> vários inputs para preenchimento de um cadastro, alguns inputs ficam
> mais abaixo do que pode-se visualizar na tela, gerando assim uma
> scroll, até ai tudo bem, o problema, é que se o usuário for
> pressionando tab até chegar nesses inputs "escondidos" o scroll não
> acompanha a tabulação, como acontece em um formulário HTML por
> exemplo, alguém tem uma dica de como fazer essa sincronização?
>
> Abraço
> >

--~--~---------~--~----~------------~-------~--~----~
Você recebeu esta mensagem porque está inscrito na lista "flexdev"
Para enviar uma mensagem, envie um e-mail para flexdev@googlegroups.com
Para sair da lista, envie um email em branco para 
flexdev-unsubscr...@googlegroups.com
Mais opções estão disponíveis em http://groups.google.com/group/flexdev
-~----------~----~----~----~------~----~------~--~---

Responder a