001: /*
002: * FindBugs - Find Bugs in Java programs
003: * Copyright (C) 2006, University of Maryland
004: *
005: * This library is free software; you can redistribute it and/or
006: * modify it under the terms of the GNU Lesser General Public
007: * License as published by the Free Software Foundation; either
008: * version 2.1 of the License, or (at your option) any later version.
009: *
010: * This library is distributed in the hope that it will be useful,
011: * but WITHOUT ANY WARRANTY; without even the implied warranty of
012: * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
013: * Lesser General Public License for more details.
014: *
015: * You should have received a copy of the GNU Lesser General Public
016: * License along with this library; if not, write to the Free Software
017: * Foundation, Inc., 59 Temple Place, Suite 330, Boston MA 02111-1307, USA
018: */
019:
020: package edu.umd.cs.findbugs.gui2;
021:
022: import com.apple.eawt.ApplicationAdapter;
023: import com.apple.eawt.ApplicationEvent;
024:
025: /*
026: * Based on sample code from Apple.
027: *
028: * This is the only class that uses the Apple specific EAWT classes.
029: * This class should only ever be referenced via reflection after
030: * checking that we are running on Mac OS X.
031: */
032: public class OSXAdapter extends ApplicationAdapter {
033:
034: // pseudo-singleton model; no point in making multiple instances
035: // of the EAWT application or our adapter
036: private static OSXAdapter theAdapter = new OSXAdapter();
037: private static final com.apple.eawt.Application theApplication = new com.apple.eawt.Application();
038:
039: // reference to the app where the existing quit, about, prefs code is
040: private static MainFrame mainApp;
041:
042: private OSXAdapter() {
043: }
044:
045: // implemented handler methods. These are basically hooks into
046: // existing functionality from the main app, as if it came
047: // over from another platform.
048:
049: @Override
050: public void handleAbout(ApplicationEvent ae) {
051: if (mainApp != null) {
052: ae.setHandled(true);
053: // We need to invoke modal About Dialog asynchronously
054: // otherwise the Application queue is locked for the duration
055: // of the about Dialog, which results in a deadlock if a URL is
056: // selected, and we get a ReOpenApplication event when user
057: // switches back to Findbugs.
058: javax.swing.SwingUtilities.invokeLater(new Runnable() {
059: public void run() {
060: mainApp.about();
061: }
062: });
063: } else {
064: throw new IllegalStateException("handleAbout: "
065: + "MyApp instance detached from listener");
066: }
067: }
068:
069: @Override
070: public void handlePreferences(ApplicationEvent ae) {
071: if (mainApp != null) {
072: mainApp.preferences();
073: ae.setHandled(true);
074: } else {
075: throw new IllegalStateException(
076: "handlePreferences: MyApp instance "
077: + "detached from listener");
078: }
079: }
080:
081: @Override
082: public void handleQuit(ApplicationEvent ae) {
083: if (mainApp != null) {
084:
085: /*
086: * You MUST setHandled(false) if you want to
087: * delay or cancel the quit. This is important
088: * for cross-platform development -- have a
089: * universal quit routine that chooses whether
090: * or not to quit, so the functionality is
091: * identical on all platforms. This example
092: * simply cancels the AppleEvent-based quit and
093: * defers to that universal method.
094: */
095:
096: ae.setHandled(false);
097: mainApp.callOnClose();
098: } else {
099: throw new IllegalStateException(
100: "handleQuit: MyApp instance detached "
101: + "from listener");
102: }
103: }
104:
105: // The main entry-point for this functionality. This is the only method
106: // that needs to be called at runtime, and it can easily be done using
107: // reflection (see MyApp.java)
108: public static void registerMacOSXApplication(MainFrame inApp) {
109: if (mainApp != null)
110: throw new IllegalStateException("application already set");
111:
112: mainApp = inApp;
113:
114: theApplication.addApplicationListener(theAdapter);
115:
116: theApplication.addPreferencesMenuItem();
117: }
118:
119: // Another static entry point for EAWT functionality. Enables the
120: // "Preferences..." menu item in the application menu.
121: public static void enablePrefs(boolean enabled) {
122:
123: theApplication.setEnabledPreferencesMenu(enabled);
124: }
125: }
|