/* * Our focus model is synthetic and only non-simple window * may become natively focusable window. */ private boolean isNativelyFocusableWindow() { if (peer == null) { return false; } return !peer.isSimpleWindow() && target.getFocusableWindowState(); }
@Override public void setWindowState(int windowState) { if (peer == null || !peer.isVisible()) { // setVisible() applies the state return; } int prevWindowState = peer.getState(); if (prevWindowState == windowState) return; final long nsWindowPtr = getNSWindowPtr(); if ((windowState & Frame.ICONIFIED) != 0) { // Treat all state bit masks with ICONIFIED bit as ICONIFIED state. windowState = Frame.ICONIFIED; } switch (windowState) { case Frame.ICONIFIED: if (prevWindowState == Frame.MAXIMIZED_BOTH) { // let's return into the normal states first // the zoom call toggles between the normal and the max states unmaximize(); } CWrapper.NSWindow.miniaturize(nsWindowPtr); break; case Frame.MAXIMIZED_BOTH: if (prevWindowState == Frame.ICONIFIED) { // let's return into the normal states first CWrapper.NSWindow.deminiaturize(nsWindowPtr); } maximize(); break; case Frame.NORMAL: if (prevWindowState == Frame.ICONIFIED) { CWrapper.NSWindow.deminiaturize(nsWindowPtr); } else if (prevWindowState == Frame.MAXIMIZED_BOTH) { // the zoom call toggles between the normal and the max states unmaximize(); } break; default: throw new RuntimeException("Unknown window state: " + windowState); } // NOTE: the SWP.windowState field gets updated to the newWindowState // value when the native notification comes to us }
private void maximize() { if (peer == null || isMaximized()) { return; } if (!undecorated) { CWrapper.NSWindow.zoom(getNSWindowPtr()); } else { deliverZoom(true); // We need an up to date size of the peer, so we flush the native events // to be sure that there are no setBounds requests in the queue. LWCToolkit.flushNativeSelectors(); this.normalBounds = peer.getBounds(); Rectangle maximizedBounds = peer.getMaximizedBounds(); setBounds( maximizedBounds.x, maximizedBounds.y, maximizedBounds.width, maximizedBounds.height); } }
private void checkZoom() { if (peer != null) { int state = peer.getState(); if (state != Frame.MAXIMIZED_BOTH && isMaximized()) { deliverZoom(true); } else if (state == Frame.MAXIMIZED_BOTH && !isMaximized()) { deliverZoom(false); } } }
@Override public void setOpaque(boolean isOpaque) { CWrapper.NSWindow.setOpaque(getNSWindowPtr(), isOpaque); boolean isTextured = (peer == null) ? false : peer.isTextured(); if (!isTextured) { if (!isOpaque) { CWrapper.NSWindow.setBackgroundColor(getNSWindowPtr(), 0); } else if (peer != null) { Color color = peer.getBackground(); if (color != null) { int rgb = color.getRGB(); CWrapper.NSWindow.setBackgroundColor(getNSWindowPtr(), rgb); } } } // This is a temporary workaround. Looks like after 7124236 will be fixed // the correct place for invalidateShadow() is CGLayer.drawInCGLContext. SwingUtilities.invokeLater(this::invalidateShadow); }
private boolean checkBlockingAndOrder() { LWWindowPeer blocker = (peer == null) ? null : peer.getBlocker(); if (blocker == null) { return false; } if (blocker instanceof CPrinterDialogPeer) { return true; } CPlatformWindow pWindow = (CPlatformWindow) blocker.getPlatformWindow(); pWindow.orderAboveSiblings(); final long nsWindowPtr = pWindow.getNSWindowPtr(); CWrapper.NSWindow.orderFrontRegardless(nsWindowPtr); CWrapper.NSWindow.makeKeyAndOrderFront(nsWindowPtr); CWrapper.NSWindow.makeMainWindow(nsWindowPtr); return true; }
protected void deliverMoveResizeEvent(int x, int y, int width, int height, boolean byUser) { checkZoom(); final Rectangle oldB = nativeBounds; nativeBounds = new Rectangle(x, y, width, height); if (peer != null) { peer.notifyReshape(x, y, width, height); // System-dependent appearance optimization. if ((byUser && !oldB.getSize().equals(nativeBounds.getSize())) || isFullScreenAnimationOn) { flushBuffers(); } } }
/* * Delegate initialization (create native window and all the * related resources). */ @Override // PlatformWindow public void initialize(Window _target, LWWindowPeer _peer, PlatformWindow _owner) { initializeBase(_target, _peer, _owner, new CPlatformView()); final int styleBits = getInitialStyleBits(); responder = createPlatformResponder(); contentView = createContentView(); contentView.initialize(peer, responder); final long ownerPtr = owner != null ? owner.getNSWindowPtr() : 0L; Rectangle bounds; if (!IS(DECORATED, styleBits)) { // For undecorated frames the move/resize event does not come if the frame is centered on the // screen // so we need to set a stub location to force an initial move/resize. Real bounds would be set // later. bounds = new Rectangle(0, 0, 1, 1); } else { bounds = _peer.constrainBounds(_target.getBounds()); } final long nativeWindowPtr = nativeCreateNSWindow( contentView.getAWTView(), ownerPtr, styleBits, bounds.x, bounds.y, bounds.width, bounds.height); setPtr(nativeWindowPtr); if (target instanceof javax.swing.RootPaneContainer) { final javax.swing.JRootPane rootpane = ((javax.swing.RootPaneContainer) target).getRootPane(); if (rootpane != null) rootpane.addPropertyChangeListener( "ancestor", new PropertyChangeListener() { public void propertyChange(final PropertyChangeEvent evt) { CLIENT_PROPERTY_APPLICATOR.attachAndApplyClientProperties(rootpane); rootpane.removePropertyChangeListener("ancestor", this); } }); } validateSurface(); }
@Override // PlatformWindow public void setVisible(boolean visible) { final long nsWindowPtr = getNSWindowPtr(); // Configure stuff updateIconImages(); updateFocusabilityForAutoRequestFocus(false); boolean wasMaximized = isMaximized(); if (visible && target.isLocationByPlatform()) { nativeSetNSWindowLocationByPlatform(getNSWindowPtr()); } // Actually show or hide the window LWWindowPeer blocker = (peer == null) ? null : peer.getBlocker(); if (blocker == null || !visible) { // If it ain't blocked, or is being hidden, go regular way if (visible) { CWrapper.NSWindow.makeFirstResponder(nsWindowPtr, contentView.getAWTView()); boolean isPopup = (target.getType() == Window.Type.POPUP); if (isPopup) { // Popups in applets don't activate applet's process CWrapper.NSWindow.orderFrontRegardless(nsWindowPtr); } else { CWrapper.NSWindow.orderFront(nsWindowPtr); } boolean isKeyWindow = CWrapper.NSWindow.isKeyWindow(nsWindowPtr); if (!isKeyWindow) { CWrapper.NSWindow.makeKeyWindow(nsWindowPtr); } } else { // immediately hide the window CWrapper.NSWindow.orderOut(nsWindowPtr); // process the close CWrapper.NSWindow.close(nsWindowPtr); } } else { // otherwise, put it in a proper z-order CWrapper.NSWindow.orderWindow( nsWindowPtr, CWrapper.NSWindow.NSWindowBelow, ((CPlatformWindow) blocker.getPlatformWindow()).getNSWindowPtr()); } this.visible = visible; // Manage the extended state when showing if (visible) { // Apply the extended state as expected in shared code if (target instanceof Frame) { if (!wasMaximized && isMaximized()) { // setVisible could have changed the native maximized state deliverZoom(true); } else { int frameState = ((Frame) target).getExtendedState(); if ((frameState & Frame.ICONIFIED) != 0) { // Treat all state bit masks with ICONIFIED bit as ICONIFIED state. frameState = Frame.ICONIFIED; } switch (frameState) { case Frame.ICONIFIED: CWrapper.NSWindow.miniaturize(nsWindowPtr); break; case Frame.MAXIMIZED_BOTH: maximize(); break; default: // NORMAL unmaximize(); // in case it was maximized, otherwise this is a no-op break; } } } } nativeSynthesizeMouseEnteredExitedEvents(); // Configure stuff #2 updateFocusabilityForAutoRequestFocus(true); // Manage parent-child relationship when showing final ComponentAccessor acc = AWTAccessor.getComponentAccessor(); if (visible) { // Order myself above my parent if (owner != null && owner.isVisible()) { CWrapper.NSWindow.orderWindow( nsWindowPtr, CWrapper.NSWindow.NSWindowAbove, owner.getNSWindowPtr()); applyWindowLevel(target); } // Order my own children above myself for (Window w : target.getOwnedWindows()) { final Object p = acc.getPeer(w); if (p instanceof LWWindowPeer) { CPlatformWindow pw = (CPlatformWindow) ((LWWindowPeer) p).getPlatformWindow(); if (pw != null && pw.isVisible()) { CWrapper.NSWindow.orderWindow( pw.getNSWindowPtr(), CWrapper.NSWindow.NSWindowAbove, nsWindowPtr); pw.applyWindowLevel(w); } } } } // Deal with the blocker of the window being shown if (blocker != null && visible) { // Make sure the blocker is above its siblings ((CPlatformWindow) blocker.getPlatformWindow()).orderAboveSiblings(); } }
protected int getInitialStyleBits() { // defaults style bits int styleBits = DECORATED | HAS_SHADOW | CLOSEABLE | MINIMIZABLE | ZOOMABLE | RESIZABLE; if (isNativelyFocusableWindow()) { styleBits = SET(styleBits, SHOULD_BECOME_KEY, true); styleBits = SET(styleBits, SHOULD_BECOME_MAIN, true); } final boolean isFrame = (target instanceof Frame); final boolean isDialog = (target instanceof Dialog); final boolean isPopup = (target.getType() == Window.Type.POPUP); if (isDialog) { styleBits = SET(styleBits, MINIMIZABLE, false); } // Either java.awt.Frame or java.awt.Dialog can be undecorated, however java.awt.Window always // is undecorated. { this.undecorated = isFrame ? ((Frame) target).isUndecorated() : (isDialog ? ((Dialog) target).isUndecorated() : true); if (this.undecorated) styleBits = SET(styleBits, DECORATED, false); } // Either java.awt.Frame or java.awt.Dialog can be resizable, however java.awt.Window is never // resizable { final boolean resizable = isFrame ? ((Frame) target).isResizable() : (isDialog ? ((Dialog) target).isResizable() : false); styleBits = SET(styleBits, RESIZABLE, resizable); if (!resizable) { styleBits = SET(styleBits, ZOOMABLE, false); } else { setCanFullscreen(true); } } if (target.isAlwaysOnTop()) { styleBits = SET(styleBits, ALWAYS_ON_TOP, true); } if (target.getModalExclusionType() == Dialog.ModalExclusionType.APPLICATION_EXCLUDE) { styleBits = SET(styleBits, MODAL_EXCLUDED, true); } // If the target is a dialog, popup or tooltip we want it to ignore the brushed metal look. if (isPopup) { styleBits = SET(styleBits, TEXTURED, false); // Popups in applets don't activate applet's process styleBits = SET(styleBits, NONACTIVATING, true); styleBits = SET(styleBits, IS_POPUP, true); } if (Window.Type.UTILITY.equals(target.getType())) { styleBits = SET(styleBits, UTILITY, true); } if (target instanceof javax.swing.RootPaneContainer) { javax.swing.JRootPane rootpane = ((javax.swing.RootPaneContainer) target).getRootPane(); Object prop = null; prop = rootpane.getClientProperty(WINDOW_BRUSH_METAL_LOOK); if (prop != null) { styleBits = SET(styleBits, TEXTURED, Boolean.parseBoolean(prop.toString())); } if (isDialog && ((Dialog) target).getModalityType() == ModalityType.DOCUMENT_MODAL) { prop = rootpane.getClientProperty(WINDOW_DOC_MODAL_SHEET); if (prop != null) { styleBits = SET(styleBits, SHEET, Boolean.parseBoolean(prop.toString())); } } prop = rootpane.getClientProperty(WINDOW_STYLE); if (prop != null) { if ("small".equals(prop)) { styleBits = SET(styleBits, UTILITY, true); if (target.isAlwaysOnTop() && rootpane.getClientProperty(WINDOW_HIDES_ON_DEACTIVATE) == null) { styleBits = SET(styleBits, HIDES_ON_DEACTIVATE, true); } } if ("textured".equals(prop)) styleBits = SET(styleBits, TEXTURED, true); if ("unified".equals(prop)) styleBits = SET(styleBits, UNIFIED, true); if ("hud".equals(prop)) styleBits = SET(styleBits, HUD, true); } prop = rootpane.getClientProperty(WINDOW_HIDES_ON_DEACTIVATE); if (prop != null) { styleBits = SET(styleBits, HIDES_ON_DEACTIVATE, Boolean.parseBoolean(prop.toString())); } prop = rootpane.getClientProperty(WINDOW_CLOSEABLE); if (prop != null) { styleBits = SET(styleBits, CLOSEABLE, Boolean.parseBoolean(prop.toString())); } prop = rootpane.getClientProperty(WINDOW_MINIMIZABLE); if (prop != null) { styleBits = SET(styleBits, MINIMIZABLE, Boolean.parseBoolean(prop.toString())); } prop = rootpane.getClientProperty(WINDOW_ZOOMABLE); if (prop != null) { styleBits = SET(styleBits, ZOOMABLE, Boolean.parseBoolean(prop.toString())); } prop = rootpane.getClientProperty(WINDOW_FULLSCREENABLE); if (prop != null) { styleBits = SET(styleBits, FULLSCREENABLE, Boolean.parseBoolean(prop.toString())); } prop = rootpane.getClientProperty(WINDOW_SHADOW); if (prop != null) { styleBits = SET(styleBits, HAS_SHADOW, Boolean.parseBoolean(prop.toString())); } prop = rootpane.getClientProperty(WINDOW_DRAGGABLE_BACKGROUND); if (prop != null) { styleBits = SET(styleBits, DRAGGABLE_BACKGROUND, Boolean.parseBoolean(prop.toString())); } } if (isDialog) { styleBits = SET(styleBits, IS_DIALOG, true); if (((Dialog) target).isModal()) { styleBits = SET(styleBits, IS_MODAL, true); } } peer.setTextured(IS(TEXTURED, styleBits)); return styleBits; }
private void deliverNCMouseDown() { if (peer != null) { peer.notifyNCMouseDown(); } }
private void deliverZoom(final boolean isZoomed) { if (peer != null) { peer.notifyZoom(isZoomed); } }
private void deliverIconify(final boolean iconify) { if (peer != null) { peer.notifyIconify(iconify); } }
private void deliverWindowClosingEvent() { if (peer != null && peer.getBlocker() == null) { peer.postEvent(new WindowEvent(target, WindowEvent.WINDOW_CLOSING)); } }