package org.limewire.ui.swing;
import java.io.File;
import javax.swing.Action;
import javax.swing.ActionMap;
import com.apple.eawt.Application;
import com.apple.eawt.ApplicationEvent;
import com.apple.eawt.ApplicationAdapter;
import org.limewire.core.api.download.DownloadAction;
import org.limewire.core.api.download.DownloadException;
import org.limewire.core.api.file.CategoryManager;
import org.limewire.core.api.lifecycle.LifeCycleManager;
import org.limewire.ui.swing.mainframe.AboutAction;
import org.limewire.ui.swing.mainframe.OptionsAction;
import org.limewire.ui.swing.menu.ExitAction;
import org.limewire.ui.swing.util.NativeLaunchUtils;
import org.limewire.util.OSUtils;
import com.google.inject.Inject;
import com.limegroup.gnutella.ActivityCallback;
import com.limegroup.gnutella.DownloadManager;
import com.limegroup.gnutella.browser.ExternalControl;
import com.limegroup.gnutella.util.LimeWireUtils;
/**
* This class handles Macintosh specific events. The handled events include the
* selection of the "About" option in the Mac file menu, the selection of the
* "Quit" option from the Mac file menu, and the dropping of a file on LimeWire
* on the Mac, which LimeWire would be expected to handle in some way.
*/
@SuppressWarnings("restriction")
public class MacEventHandler extends ApplicationAdapter {
private static MacEventHandler INSTANCE;
public static synchronized MacEventHandler instance() {
if (INSTANCE == null) {
INSTANCE = new MacEventHandler();
}
return INSTANCE;
}
private volatile File lastFileOpened = null;
private volatile boolean enabled;
@Inject private volatile ExternalControl externalControl = null;
@Inject private volatile DownloadManager downloadManager = null;
@Inject private volatile LifeCycleManager lifecycleManager = null;
@Inject private volatile ActivityCallback activityCallback = null;
@Inject private volatile AboutAction aboutAction = null;
@Inject private volatile OptionsAction optionsAction = null;
@Inject private volatile ExitAction exitAction = null;
@Inject private volatile CategoryManager categoryManager = null;
private boolean allMenusAndActionsEnabled = false;
/** Creates a new instance of MacEventHandler */
@Inject
public MacEventHandler() {
assert ( OSUtils.isMacOSX() ) : "MacEventHandler should only be used on Mac OS-X operating systems.";
Application.getApplication().addApplicationListener(this);
Application.getApplication().setEnabledPreferencesMenu(false);
Application.getApplication().setEnabledAboutMenu(false);
}
@Inject
public void startup() {
this.enabled = true;
if (lastFileOpened != null) {
runFileOpen(lastFileOpened);
}
}
/**
* Enable preferences.
*/
public void enableAllMacMenusAndEventHandlers() {
Application.getApplication().setEnabledAboutMenu(true);
Application.getApplication().setEnabledPreferencesMenu(true);
allMenusAndActionsEnabled = true;
}
@Override
public void handlePreferences(ApplicationEvent event) {
if (allMenusAndActionsEnabled ) {
optionsAction.actionPerformed(null);
event.setHandled(true);
}
}
@Override
public void handleAbout(ApplicationEvent event) {
if (allMenusAndActionsEnabled ) {
aboutAction.actionPerformed(null);
event.setHandled(true);
}
}
@Override
public void handleQuit(ApplicationEvent event) {
if (allMenusAndActionsEnabled ) {
exitAction.actionPerformed(null);
event.setHandled(true);
}
}
/**
* Must be added after the UI is created, otherwise it'll create the application too soon!
* Since the preferences are enabled after the UI is created, let's handle these events only
* after the preferences have been enabled.
*/
@Override
public void handleReOpenApplication(ApplicationEvent event) {
if ( allMenusAndActionsEnabled ) {
ActionMap map = org.jdesktop.application.Application.getInstance().getContext().getActionManager().getActionMap();
Action action = map.get("restoreView");
if (action != null) {
action.actionPerformed(null);
}
event.setHandled(true);
}
}
@Override
public void handleOpenFile(ApplicationEvent event) {
// This handler unlike the others may receive OS events before the UI is created.
// So, don't check if allMenusAndActionsEnabled is true.
File file = new File(event.getFilename());
if (!enabled) {
lastFileOpened = file;
} else {
runFileOpen(file);
}
event.setHandled(true);
}
private void runFileOpen(final File file) {
String filename = file.getPath();
if (filename.endsWith("limestart")) {
LimeWireUtils.setAutoStartupLaunch(true);
} else if (filename.endsWith("torrent")) {
if (!lifecycleManager.isStarted()) {
externalControl.enqueueControlRequest(file.getAbsolutePath());
} else {
try {
downloadManager.downloadTorrent(file, null, false);
} catch (DownloadException e) {
activityCallback.handleDownloadException(new DownloadAction() {
@Override
public void download(File saveDirectory, boolean overwrite)
throws DownloadException {
downloadManager.downloadTorrent(file, saveDirectory, overwrite);
}
@Override
public void downloadCanceled(DownloadException ignored) {
//nothing to do
}
}, e, false);
}
}
} else {
NativeLaunchUtils.safeLaunchFile(file, categoryManager);
}
}
}