< prev index next >

src/java.desktop/macosx/classes/sun/lwawt/macosx/CPlatformWindow.java

Print this page

        

*** 31,40 **** --- 31,42 ---- import java.awt.*; import java.awt.Dialog.ModalityType; import java.awt.event.*; import java.beans.*; import java.lang.reflect.InvocationTargetException; + import java.util.ArrayList; + import java.util.Arrays; import javax.swing.*; import sun.awt.*; import sun.awt.AWTAccessor.ComponentAccessor;
*** 1061,1093 **** CWrapper.NSWindow.makeMainWindow(nsWindowPtr); return true; } ! private void orderAboveSiblings() { ! if (owner == null) { ! return; } ! // NOTE: the logic will fail if we have a hierarchy like: ! // visible root owner ! // invisible owner ! // visible dialog ! // However, this is an unlikely scenario for real life apps ! if (owner.isVisible()) { ! // Recursively pop up the windows from the very bottom so that only ! // the very top-most one becomes the main window ! owner.orderAboveSiblings(); ! ! // Order the window to front of the stack of child windows ! final long nsWindowSelfPtr = getNSWindowPtr(); ! final long nsWindowOwnerPtr = owner.getNSWindowPtr(); ! CWrapper.NSWindow.orderFront(nsWindowOwnerPtr); ! CWrapper.NSWindow.orderWindow(nsWindowSelfPtr, CWrapper.NSWindow.NSWindowAbove, nsWindowOwnerPtr); } ! applyWindowLevel(target); } protected void applyWindowLevel(Window target) { if (target.isAlwaysOnTop() && target.getType() != Window.Type.POPUP) { CWrapper.NSWindow.setLevel(getNSWindowPtr(), CWrapper.NSWindow.NSFloatingWindowLevel); --- 1063,1135 ---- CWrapper.NSWindow.makeMainWindow(nsWindowPtr); return true; } ! private boolean isOneOfOwnersOrSelf(CPlatformWindow window) { ! while (window != null) { ! if (this == window) { ! return true; ! } ! window = window.owner; ! } ! return false; } ! private CPlatformWindow getRootOwner() { ! CPlatformWindow rootOwner = this; ! while (rootOwner.owner != null) { ! rootOwner = rootOwner.owner; ! } ! return rootOwner; } ! private void orderAboveSiblings() { ! // Recursively pop up the windows from the very bottom, (i.e. root owner) so that ! // the windows are ordered above their nearest owner; ancestors of the window, ! // which is going to become 'main window', are placed above their siblings. ! CPlatformWindow rootOwner = getRootOwner(); ! if (rootOwner.isVisible()) { ! CWrapper.NSWindow.orderFront(rootOwner.getNSWindowPtr()); ! } ! orderAboveSiblingsImpl(rootOwner.target.getOwnedWindows()); ! } ! ! private void orderAboveSiblingsImpl(Window[] windows) { ! ArrayList<Window> childWindows = new ArrayList<Window>(); ! ! final ComponentAccessor acc = AWTAccessor.getComponentAccessor(); ! ! // Go through the list of windows and perform ordering. ! for (Window w : windows) { ! final Object p = acc.getPeer(w); ! if (p instanceof LWWindowPeer) { ! CPlatformWindow pw = (CPlatformWindow)((LWWindowPeer)p).getPlatformWindow(); ! if (pw != null && pw.isVisible()) { ! // If the window is one of ancestors of 'main window' or is going to become main by itself, ! // the window should be ordered above its siblings; otherwise the window is just ordered ! // above its nearest parent. ! if (pw.isOneOfOwnersOrSelf(this)) { ! CWrapper.NSWindow.orderFront(pw.getNSWindowPtr()); ! } else { ! CWrapper.NSWindow.orderWindow(pw.getNSWindowPtr(), CWrapper.NSWindow.NSWindowAbove, ! pw.owner.getNSWindowPtr()); ! } ! pw.applyWindowLevel(w); ! } ! } ! // Retrieve the child windows for each window from the list and store them for future use. ! // Note: we collect data about child windows even for invisible owners, since they may have ! // visible children. ! java.util.List<Window> pwChildWindows = new ArrayList<Window>(Arrays.asList(w.getOwnedWindows())); ! childWindows.addAll(pwChildWindows); ! } ! // If some windows, which have just been ordered, have any child windows, let's start new iteration ! // and order these child windows. ! if (!childWindows.isEmpty()) { ! orderAboveSiblingsImpl(childWindows.toArray(new Window[childWindows.size()])); ! } } protected void applyWindowLevel(Window target) { if (target.isAlwaysOnTop() && target.getType() != Window.Type.POPUP) { CWrapper.NSWindow.setLevel(getNSWindowPtr(), CWrapper.NSWindow.NSFloatingWindowLevel);
< prev index next >