开发者

Remove by order TitleWindows in Flex

I create 3 TitleWindow:

PopUpManager.addPopUp( TitleWindow1, root, false);
PopUpManager.addPopUp( TitleWindow2, root, false);
PopUpManager.addPopUp( TitleWindow3, root, false );

And then I manage those position and depth using mouse. Now I want to delete them by depth. In my TitleWindow add 开发者_如何学Golistener:

root.addEventListener( KeyboardEvent.KEY_DOWN, onKeyDown );

private function onKeyDown(event:KeyboardEvent = null):void {
     if ( event.keyCode == Keyboard.ESCAPE && this. ) { //!!!! how to detect this window depth, that it at first plan??                 

                event.preventDefault();         
                event.stopImmediatePropagation();

                closeHandler();
            }
        }
   }

How does me solve this issue?


Now, I can offer one idea, I use state inactive:

private function onKeyDown(event:KeyboardEvent = null):void {
        if ( event.keyCode == Keyboard.ESCAPE 
                && this.getCurrentSkinState() != "inactive" ) {

            event.preventDefault();         
            event.stopImmediatePropagation();

            closeHandler();
        }
    }

override protected function stateChanged (oldState:String, newState:String, recursive:Boolean) : void {
        super.stateChanged( oldState, newState, recursive );            
        if ( oldState == "inactive" && newState == "normal" ) {
            PopUpManager.bringToFront( this );
        }
    }


You'll need to keep track of this when you add the pop ups. Here is an example class that extends the pop up manager:

package
{
import flash.display.DisplayObject;

import mx.collections.ArrayCollection;
import mx.core.IFlexDisplayObject;
import mx.core.IFlexModuleFactory;
import mx.core.UIComponent;
import mx.managers.PopUpManager;

public class PopManagerDepth extends PopUpManager
{
    public function PopManagerDepth() { super(); }
    public static var popUpsByDepth :ArrayCollection = new ArrayCollection();
    public static function addPopUpWithDepth(window:IFlexDisplayObject,
                                    parent:DisplayObject,
                                    modal:Boolean = false,
                                    childList:String = null,
                                    moduleFactory:IFlexModuleFactory = null):void
    {
        PopUpManager.addPopUp(window, parent, modal, childList, moduleFactory);
        PopManagerDepth.popUpsByDepth.addItem( window );
    }
    public static function removeLastPopUp():void{
        PopManagerDepth.removePopUpByIndex(PopManagerDepth.popUpsByDepth.length);
    }
    public static function removePopUpByIndex( idx :uint ):void{
        if( PopManagerDepth.popUpsByDepth.length > idx){
            PopUpManager.removePopUp( popUpsByDepth.getItemAt(  idx ) as IFlexDisplayObject );
        }
    }
}
}

You'd use this class to add your popups, just like popupmanager but with this method:

PopManagerDepth.addPopUpWithDepth( .... );

The difference is there is a new method you'd use to remove them :

PopManagerDepth.removeLastPopUp();

or

PopManagerDepth.removePopUpByIndex();

Should do the trick, sorry I cant test it right now, but should work or close to it. I'll help ya debug if needed :)


By Windows depth do you mean the z-index ? If so you might want to try the getChildIndex and removeChildAt methods on the DisplayObject class. However, since PopUps exists in a different heirarchy than the rest of the general components, I am unsure if this will work but it is a start ?


Here's what I would do:

  1. Create an Array to keep track of each TitleWindow instance you pop up. You can use the Array index as a z-index indicator.
  2. In your closeHandler() method, iterate through each member of the Array and close that TitleWindow instance.
0

上一篇:

下一篇:

精彩评论

暂无评论...
验证码 换一张
取 消

最新问答

问答排行榜