/*
* FindBugs - Find Bugs in Java programs
* Copyright (C) 2006, University of Maryland
*
* This library is free software; you can redistribute it and/or
* modify it under the terms of the GNU Lesser General Public
* License as published by the Free Software Foundation; either
* version 2.1 of the License, or (at your option) any later version.
*
* This library 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
* Lesser General Public License for more details.
*
* You should have received a copy of the GNU Lesser General Public
* License along with this library; if not, write to the Free Software
* Foundation, Inc., 59 Temple Place, Suite 330, Boston MA 02111-1307, USA
*/
package edu.umd.cs.findbugs.gui2;
import com.apple.eawt.ApplicationAdapter;
import com.apple.eawt.ApplicationEvent;
/*
* Based on sample code from Apple.
*
* This is the only class that uses the Apple specific EAWT classes.
* This class should only ever be referenced via reflection after
* checking that we are running on Mac OS X.
*/
public class OSXAdapter extends ApplicationAdapter {
// pseudo-singleton model; no point in making multiple instances
// of the EAWT application or our adapter
private static OSXAdapter theAdapter = new OSXAdapter();
private static final com.apple.eawt.Application theApplication = new com.apple.eawt.Application();
// reference to the app where the existing quit, about, prefs code is
private static MainFrame mainApp;
private OSXAdapter () {
}
// implemented handler methods. These are basically hooks into
// existing functionality from the main app, as if it came
// over from another platform.
@Override
public void handleAbout(ApplicationEvent ae) {
if (mainApp != null) {
ae.setHandled(true);
// We need to invoke modal About Dialog asynchronously
// otherwise the Application queue is locked for the duration
// of the about Dialog, which results in a deadlock if a URL is
// selected, and we get a ReOpenApplication event when user
// switches back to Findbugs.
javax.swing.SwingUtilities.invokeLater(new Runnable() {
public void run() {
mainApp.about();
}
});
} else {
throw new IllegalStateException("handleAbout: " +
"MyApp instance detached from listener");
}
}
@Override
public void handlePreferences(ApplicationEvent ae) {
if (mainApp != null) {
mainApp.preferences();
ae.setHandled(true);
} else {
throw new IllegalStateException("handlePreferences: MyApp instance " +
"detached from listener");
}
}
@Override
public void handleQuit(ApplicationEvent ae) {
if (mainApp != null) {
/*
* You MUST setHandled(false) if you want to
* delay or cancel the quit. This is important
* for cross-platform development -- have a
* universal quit routine that chooses whether
* or not to quit, so the functionality is
* identical on all platforms. This example
* simply cancels the AppleEvent-based quit and
* defers to that universal method.
*/
ae.setHandled(false);
mainApp.callOnClose();
} else {
throw new IllegalStateException("handleQuit: MyApp instance detached " +
"from listener");
}
}
// The main entry-point for this functionality. This is the only method
// that needs to be called at runtime, and it can easily be done using
// reflection (see MyApp.java)
public static void registerMacOSXApplication(MainFrame inApp) {
if (mainApp != null)
throw new IllegalStateException("application already set");
mainApp = inApp;
theApplication.addApplicationListener(theAdapter);
theApplication.addPreferencesMenuItem();
}
// Another static entry point for EAWT functionality. Enables the
// "Preferences..." menu item in the application menu.
public static void enablePrefs(boolean enabled) {
theApplication.setEnabledPreferencesMenu(enabled);
}
}