jdk/src/macosx/classes/com/apple/eawt/_AppEventLegacyHandler.java
changeset 12047 320a714614e9
child 20447 d1505296ba5c
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/jdk/src/macosx/classes/com/apple/eawt/_AppEventLegacyHandler.java	Tue Mar 06 20:34:38 2012 +0000
@@ -0,0 +1,192 @@
+/*
+ * Copyright (c) 2011, Oracle and/or its affiliates. All rights reserved.
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * This code is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License version 2 only, as
+ * published by the Free Software Foundation.  Oracle designates this
+ * particular file as subject to the "Classpath" exception as provided
+ * by Oracle in the LICENSE file that accompanied this code.
+ *
+ * This code is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+ * version 2 for more details (a copy is included in the LICENSE file that
+ * accompanied this code).
+ *
+ * You should have received a copy of the GNU General Public License version
+ * 2 along with this work; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+ *
+ * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
+ * or visit www.oracle.com if you need additional information or have any
+ * questions.
+ */
+
+package com.apple.eawt;
+
+import java.awt.Toolkit;
+import java.io.File;
+import java.util.*;
+
+import com.apple.eawt.AppEvent.*;
+
+interface _OpenAppHandler {
+    void handleOpenApp();
+}
+
+@SuppressWarnings("deprecation")
+class _AppEventLegacyHandler implements AboutHandler, PreferencesHandler, _OpenAppHandler, AppReOpenedListener, OpenFilesHandler, PrintFilesHandler, QuitHandler {
+    final _AppEventHandler parent;
+    final Vector<ApplicationListener> legacyAppListeners = new Vector<ApplicationListener>();
+    boolean blockLegacyAPI;
+    boolean initializedParentDispatchers;
+
+    _AppEventLegacyHandler(final _AppEventHandler parent) {
+        this.parent = parent;
+    }
+
+    void blockLegacyAPI() {
+        blockLegacyAPI = true;
+    }
+
+    void checkIfLegacyAPIBlocked() {
+        if (!blockLegacyAPI) return;
+        throw new IllegalStateException("Cannot add com.apple.eawt.ApplicationListener after installing an app event handler");
+    }
+
+    void addLegacyAppListener(final ApplicationListener listener) {
+        checkIfLegacyAPIBlocked();
+
+        if (!initializedParentDispatchers) {
+            final _AppMenuBarHandler menuBarHandler = Application.getApplication().menuBarHandler;
+            final boolean prefsMenuAlreadyExplicitlySet = menuBarHandler.prefsMenuItemExplicitlySet;
+
+            parent.aboutDispatcher.setHandler(this);
+            parent.preferencesDispatcher.setHandler(this);
+            if (!prefsMenuAlreadyExplicitlySet) {
+                menuBarHandler.setPreferencesMenuItemVisible(false); // default behavior is not to have a preferences item
+            }
+            parent.openAppDispatcher.setHandler(this);
+            parent.reOpenAppDispatcher.addListener(this);
+            parent.openFilesDispatcher.setHandler(this);
+            parent.printFilesDispatcher.setHandler(this);
+            parent.quitDispatcher.setHandler(this);
+
+            initializedParentDispatchers = true;
+        }
+
+        synchronized (legacyAppListeners) {
+            legacyAppListeners.addElement(listener);
+        }
+    }
+
+    public void removeLegacyAppListener(final ApplicationListener listener) {
+        checkIfLegacyAPIBlocked();
+
+        synchronized (legacyAppListeners) {
+            legacyAppListeners.removeElement(listener);
+        }
+    }
+
+    @Override
+    public void handleAbout(final AboutEvent e) {
+        final ApplicationEvent ae = new ApplicationEvent(Toolkit.getDefaultToolkit());
+        sendEventToEachListenerUntilHandled(ae, new EventDispatcher() {
+            public void dispatchEvent(final ApplicationListener listener) {
+                listener.handleAbout(ae);
+            }
+        });
+
+        if (ae.isHandled()) return;
+        parent.openCocoaAboutWindow();
+    }
+
+    @Override
+    public void handlePreferences(final PreferencesEvent e) {
+        final ApplicationEvent ae = new ApplicationEvent(Toolkit.getDefaultToolkit());
+        sendEventToEachListenerUntilHandled(ae, new EventDispatcher() {
+            public void dispatchEvent(final ApplicationListener listener) {
+                listener.handlePreferences(ae);
+            }
+        });
+    }
+
+    @Override
+    public void handleOpenApp() {
+        final ApplicationEvent ae = new ApplicationEvent(Toolkit.getDefaultToolkit());
+        sendEventToEachListenerUntilHandled(ae, new EventDispatcher() {
+            public void dispatchEvent(final ApplicationListener listener) {
+                listener.handleOpenApplication(ae);
+            }
+        });
+    }
+
+    @Override
+    public void appReOpened(final AppReOpenedEvent e) {
+        final ApplicationEvent ae = new ApplicationEvent(Toolkit.getDefaultToolkit());
+        sendEventToEachListenerUntilHandled(ae, new EventDispatcher() {
+            public void dispatchEvent(final ApplicationListener listener) {
+                listener.handleReOpenApplication(ae);
+            }
+        });
+    }
+
+    @Override
+    public void openFiles(final OpenFilesEvent e) {
+        final List<File> files = e.getFiles();
+        for (final File file : files) { // legacy ApplicationListeners only understood one file at a time
+            final ApplicationEvent ae = new ApplicationEvent(Toolkit.getDefaultToolkit(), file.getAbsolutePath());
+            sendEventToEachListenerUntilHandled(ae, new EventDispatcher() {
+                public void dispatchEvent(final ApplicationListener listener) {
+                    listener.handleOpenFile(ae);
+                }
+            });
+        }
+    }
+
+    @Override
+    public void printFiles(PrintFilesEvent e) {
+        final List<File> files = e.getFiles();
+        for (final File file : files) { // legacy ApplicationListeners only understood one file at a time
+            final ApplicationEvent ae = new ApplicationEvent(Toolkit.getDefaultToolkit(), file.getAbsolutePath());
+            sendEventToEachListenerUntilHandled(ae, new EventDispatcher() {
+                public void dispatchEvent(final ApplicationListener listener) {
+                    listener.handlePrintFile(ae);
+                }
+            });
+        }
+    }
+
+    @Override
+    public void handleQuitRequestWith(final QuitEvent e, final QuitResponse response) {
+        final ApplicationEvent ae = new ApplicationEvent(Toolkit.getDefaultToolkit());
+        sendEventToEachListenerUntilHandled(ae, new EventDispatcher() {
+            public void dispatchEvent(final ApplicationListener listener) {
+                listener.handleQuit(ae);
+            }
+        });
+
+        if (ae.isHandled()) {
+            parent.performQuit();
+        } else {
+            parent.cancelQuit();
+        }
+    }
+
+    interface EventDispatcher {
+        void dispatchEvent(final ApplicationListener listener);
+    }
+
+    // helper that cycles through the loop and aborts if the event is handled, or there are no listeners
+    void sendEventToEachListenerUntilHandled(final ApplicationEvent event, final EventDispatcher dispatcher) {
+        synchronized (legacyAppListeners) {
+            if (legacyAppListeners.size() == 0) return;
+
+            final Enumeration<ApplicationListener> e = legacyAppListeners.elements();
+            while (e.hasMoreElements() && !event.isHandled()) {
+                dispatcher.dispatchEvent(e.nextElement());
+            }
+        }
+    }
+}