Try to support non-modal windows on top of a modal window
Project: http://git-wip-us.apache.org/repos/asf/flex-sdk/repo Commit: http://git-wip-us.apache.org/repos/asf/flex-sdk/commit/1a4df288 Tree: http://git-wip-us.apache.org/repos/asf/flex-sdk/tree/1a4df288 Diff: http://git-wip-us.apache.org/repos/asf/flex-sdk/diff/1a4df288 Branch: refs/heads/release4.11.0 Commit: 1a4df2886ef669bb8a1a87d38c6502bf5a798933 Parents: 9c5f91e Author: Alex Harui <[email protected]> Authored: Thu Sep 5 09:53:08 2013 -0700 Committer: Alex Harui <[email protected]> Committed: Thu Oct 10 23:18:38 2013 -0700 ---------------------------------------------------------------------- .../systemClasses/ActiveWindowManager.as | 205 +++++++++++-------- 1 file changed, 117 insertions(+), 88 deletions(-) ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/flex-sdk/blob/1a4df288/frameworks/projects/framework/src/mx/managers/systemClasses/ActiveWindowManager.as ---------------------------------------------------------------------- diff --git a/frameworks/projects/framework/src/mx/managers/systemClasses/ActiveWindowManager.as b/frameworks/projects/framework/src/mx/managers/systemClasses/ActiveWindowManager.as index 203f46a..43a083f 100644 --- a/frameworks/projects/framework/src/mx/managers/systemClasses/ActiveWindowManager.as +++ b/frameworks/projects/framework/src/mx/managers/systemClasses/ActiveWindowManager.as @@ -25,16 +25,16 @@ import flash.display.InteractiveObject; import flash.display.Sprite; import flash.events.Event; import flash.events.EventDispatcher; -import flash.events.IEventDispatcher; import flash.events.FocusEvent; +import flash.events.IEventDispatcher; import flash.events.MouseEvent; import mx.core.IChildList; import mx.core.IFlexModuleFactory; import mx.core.IRawChildrenContainer; import mx.core.IUIComponent; -import mx.core.mx_internal; import mx.core.Singleton; +import mx.core.mx_internal; import mx.events.DynamicEvent; import mx.events.Request; import mx.managers.IActiveWindowManager; @@ -428,6 +428,30 @@ public class ActiveWindowManager extends EventDispatcher implements IActiveWindo /** * @private + */ + private function findHighestModalForm():int + { + var n:int = forms.length; + var rc:IChildList = systemManager.rawChildren; + for (var i:int = n - 1; n >= 0; i--) + { + var f:Object = forms[i]; + if (f is DisplayObject) + { + var index:int = rc.getChildIndex(f as DisplayObject); + if (index > 0) + { + var under:DisplayObject = rc.getChildAt(index - 1); + if (under.name == "modalWindow") + return i; + } + } + } + return 0; + } + + /** + * @private * Track mouse clicks to see if we change top-level forms. */ private function mouseDownHandler(event:MouseEvent):void @@ -437,106 +461,111 @@ public class ActiveWindowManager extends EventDispatcher implements IActiveWindo if (!dispatchEvent(new FocusEvent(MouseEvent.MOUSE_DOWN, false, true, InteractiveObject(event.target)))) return; - if (numModalWindows == 0) // no modal windows are up + var startIndex:int = 0; + if (numModalWindows > 0) { - if (!systemManager.isTopLevelRoot() || forms.length > 1) + // if there is a modal window, only non-modal + // windows above it are in play + startIndex = findHighestModalForm() + 1; + } + + if (!systemManager.isTopLevelRoot() || forms.length > 1) + { + var n:int = forms.length; + var p:DisplayObject = DisplayObject(event.target); + var isApplication:Boolean = systemManager.document is IRawChildrenContainer ? + IRawChildrenContainer(systemManager.document).rawChildren.contains(p) : + systemManager.document.contains(p); + while (p) { - var n:int = forms.length; - var p:DisplayObject = DisplayObject(event.target); - var isApplication:Boolean = systemManager.document is IRawChildrenContainer ? - IRawChildrenContainer(systemManager.document).rawChildren.contains(p) : - systemManager.document.contains(p); - while (p) + for (var i:int = startIndex; i < n; i++) { - for (var i:int = 0; i < n; i++) + var form_i:Object = forms[i]; + if (hasEventListener("actualForm")) + { + var request:Request = new Request("actualForm", false, true); + request.value = forms[i]; + if (!dispatchEvent(request)) + form_i = forms[i].window; + } + if (form_i == p) { - var form_i:Object = forms[i]; - if (hasEventListener("actualForm")) - { - var request:Request = new Request("actualForm", false, true); - request.value = forms[i]; - if (!dispatchEvent(request)) - form_i = forms[i].window; - } - if (form_i == p) - { - var j:int = 0; - var index:int; - var newIndex:int; - var childList:IChildList; + var j:int = 0; + var index:int; + var newIndex:int; + var childList:IChildList; - if (((p != form) && p is IFocusManagerContainer) || - (!systemManager.isTopLevelRoot() && p == form)) + if (((p != form) && p is IFocusManagerContainer) || + (!systemManager.isTopLevelRoot() && p == form)) + { + if (systemManager.isTopLevelRoot()) + activate(IFocusManagerContainer(p)); + + if (p == systemManager.document) + { + if (hasEventListener("activateApplication")) + dispatchEvent(new Event("activateApplication")); + } + else if (p is DisplayObject) + { + if (hasEventListener("activateWindow")) + dispatchEvent(new FocusEvent("activateWindow", false, false, InteractiveObject(p))); + } + } + + if (systemManager.popUpChildren.contains(p)) + childList = systemManager.popUpChildren; + else + childList = systemManager; + + index = childList.getChildIndex(p); + newIndex = index; + + //we need to reset n because activating p's + //FocusManager could have caused + //forms.length to have changed. + n = forms.length; + for (j = startIndex; j < n; j++) + { + var f:DisplayObject; + isRemotePopUp = false; + if (hasEventListener("isRemote")) + { + request = new Request("isRemote", false, true); + request.value = forms[j]; + var isRemotePopUp:Boolean = false; + if (!dispatchEvent(request)) + isRemotePopUp = request.value as Boolean; + } + if (isRemotePopUp) { - if (systemManager.isTopLevelRoot()) - activate(IFocusManagerContainer(p)); - - if (p == systemManager.document) - { - if (hasEventListener("activateApplication")) - dispatchEvent(new Event("activateApplication")); - } - else if (p is DisplayObject) - { - if (hasEventListener("activateWindow")) - dispatchEvent(new FocusEvent("activateWindow", false, false, InteractiveObject(p))); - } + if (forms[j].window is String) + continue; + f = forms[j].window; } - - if (systemManager.popUpChildren.contains(p)) - childList = systemManager.popUpChildren; - else - childList = systemManager; - - index = childList.getChildIndex(p); - newIndex = index; - - //we need to reset n because activating p's - //FocusManager could have caused - //forms.length to have changed. - n = forms.length; - for (j = 0; j < n; j++) + else + f = forms[j]; + if (isRemotePopUp) { - var f:DisplayObject; - isRemotePopUp = false; - if (hasEventListener("isRemote")) - { - request = new Request("isRemote", false, true); - request.value = forms[j]; - var isRemotePopUp:Boolean = false; - if (!dispatchEvent(request)) - isRemotePopUp = request.value as Boolean; - } - if (isRemotePopUp) - { - if (forms[j].window is String) - continue; - f = forms[j].window; - } - else - f = forms[j]; - if (isRemotePopUp) - { - var fChildIndex:int = getChildListIndex(childList, f); - if (fChildIndex > index) - newIndex = Math.max(fChildIndex, newIndex); - } - else if (childList.contains(f)) - if (childList.getChildIndex(f) > index) - newIndex = Math.max(childList.getChildIndex(f), newIndex); + var fChildIndex:int = getChildListIndex(childList, f); + if (fChildIndex > index) + newIndex = Math.max(fChildIndex, newIndex); } - if (newIndex > index && !isApplication) - childList.setChildIndex(p, newIndex); - - return; + else if (childList.contains(f)) + if (childList.getChildIndex(f) > index) + newIndex = Math.max(childList.getChildIndex(f), newIndex); } + if (newIndex > index && !isApplication) + childList.setChildIndex(p, newIndex); + + return; } - p = p.parent; } + p = p.parent; } - else if (hasEventListener("activateApplication")) - dispatchEvent(new Event("activateApplication")); } + else if (hasEventListener("activateApplication")) + dispatchEvent(new Event("activateApplication")); } /**
