4632N/A/*
4632N/A * Copyright (c) 2011, Oracle and/or its affiliates. All rights reserved.
4632N/A * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
4632N/A *
4632N/A * This code is free software; you can redistribute it and/or modify it
4632N/A * under the terms of the GNU General Public License version 2 only, as
4632N/A * published by the Free Software Foundation. Oracle designates this
4632N/A * particular file as subject to the "Classpath" exception as provided
4632N/A * by Oracle in the LICENSE file that accompanied this code.
4632N/A *
4632N/A * This code is distributed in the hope that it will be useful, but WITHOUT
4632N/A * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
4632N/A * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
4632N/A * version 2 for more details (a copy is included in the LICENSE file that
4632N/A * accompanied this code).
4632N/A *
4632N/A * You should have received a copy of the GNU General Public License version
4632N/A * 2 along with this work; if not, write to the Free Software Foundation,
4632N/A * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
4632N/A *
4632N/A * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
4632N/A * or visit www.oracle.com if you need additional information or have any
4632N/A * questions.
4632N/A */
4632N/A
4632N/Apackage com.apple.eawt;
4632N/A
4632N/Aimport java.awt.*;
4632N/Aimport java.util.*;
4632N/Aimport java.util.List;
4632N/A
4632N/Aimport javax.swing.RootPaneContainer;
4632N/A
4632N/Aimport com.apple.eawt.AppEvent.FullScreenEvent;
4632N/A
4632N/Afinal class FullScreenHandler {
4632N/A private static final String CLIENT_PROPERTY = "com.apple.eawt.event.internalFullScreenHandler";
4632N/A
4632N/A static final int FULLSCREEN_WILL_ENTER = 1;
4632N/A static final int FULLSCREEN_DID_ENTER = 2;
4632N/A static final int FULLSCREEN_WILL_EXIT = 3;
4632N/A static final int FULLSCREEN_DID_EXIT = 4;
4632N/A
4632N/A // installs a private instance of the handler, if necessary
4632N/A static void addFullScreenListenerTo(final RootPaneContainer window, final FullScreenListener listener) {
4632N/A final Object value = window.getRootPane().getClientProperty(CLIENT_PROPERTY);
4632N/A if (value instanceof FullScreenHandler) {
4632N/A ((FullScreenHandler)value).addListener(listener);
4632N/A return;
4632N/A }
4632N/A
4632N/A if (value != null) return; // some other garbage is in our client property
4632N/A
4632N/A final FullScreenHandler newHandler = new FullScreenHandler();
4632N/A newHandler.addListener(listener);
4632N/A window.getRootPane().putClientProperty(CLIENT_PROPERTY, newHandler);
4632N/A }
4632N/A
4632N/A // asks the installed FullScreenHandler to remove it's listener (does not uninstall the FullScreenHandler)
4632N/A static void removeFullScreenListenerFrom(final RootPaneContainer window, final FullScreenListener listener) {
4632N/A final Object value = window.getRootPane().getClientProperty(CLIENT_PROPERTY);
4632N/A if (!(value instanceof FullScreenHandler)) return;
4632N/A ((FullScreenHandler)value).removeListener(listener);
4632N/A }
4632N/A
4632N/A static FullScreenHandler getHandlerFor(final RootPaneContainer window) {
4632N/A final Object value = window.getRootPane().getClientProperty(CLIENT_PROPERTY);
4632N/A if (value instanceof FullScreenHandler) return (FullScreenHandler)value;
4632N/A return null;
4632N/A }
4632N/A
4632N/A // called from native
4632N/A static void handleFullScreenEventFromNative(final Window window, final int type) {
4632N/A if (!(window instanceof RootPaneContainer)) return; // handles null
4632N/A
4632N/A EventQueue.invokeLater(new Runnable() {
4632N/A public void run() {
4632N/A final FullScreenHandler handler = getHandlerFor((RootPaneContainer)window);
4632N/A if (handler != null) handler.notifyListener(new FullScreenEvent(window), type);
4632N/A }
4632N/A });
4632N/A }
4632N/A
4632N/A
4632N/A final List<FullScreenListener> listeners = new LinkedList<FullScreenListener>();
4632N/A
4632N/A FullScreenHandler() { }
4632N/A
4632N/A void addListener(final FullScreenListener listener) {
4632N/A listeners.add(listener);
4632N/A }
4632N/A
4632N/A void removeListener(final FullScreenListener listener) {
4632N/A listeners.remove(listener);
4632N/A }
4632N/A
4632N/A void notifyListener(final FullScreenEvent e, final int op) {
4632N/A for (final FullScreenListener listener : listeners) {
4632N/A switch (op) {
4632N/A case FULLSCREEN_WILL_ENTER:
4632N/A listener.windowEnteringFullScreen(e);
4632N/A return;
4632N/A case FULLSCREEN_DID_ENTER:
4632N/A listener.windowEnteredFullScreen(e);
4632N/A return;
4632N/A case FULLSCREEN_WILL_EXIT:
4632N/A listener.windowExitingFullScreen(e);
4632N/A return;
4632N/A case FULLSCREEN_DID_EXIT:
4632N/A listener.windowExitedFullScreen(e);
4632N/A return;
4632N/A }
4632N/A }
4632N/A }
4632N/A}