Java tutorial
/** * This file Copyright (c) 2005-2008 Aptana, Inc. This program is * dual-licensed under both the Aptana Public License and the GNU General * Public license. You may elect to use one or the other of these licenses. * * This program is distributed in the hope that it will be useful, but * AS-IS and WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE, TITLE, or * NONINFRINGEMENT. Redistribution, except as permitted by whichever of * the GPL or APL you select, is prohibited. * * 1. For the GPL license (GPL), you can redistribute and/or modify this * program under the terms of the GNU General Public License, * Version 3, as published by the Free Software Foundation. You should * have received a copy of the GNU General Public License, Version 3 along * with this program; if not, write to the Free Software Foundation, Inc., 51 * Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. * * Aptana provides a special exception to allow redistribution of this file * with certain other free and open source software ("FOSS") code and certain additional terms * pursuant to Section 7 of the GPL. You may view the exception and these * terms on the web at http://www.aptana.com/legal/gpl/. * * 2. For the Aptana Public License (APL), this program and the * accompanying materials are made available under the terms of the APL * v1.0 which accompanies this distribution, and is available at * http://www.aptana.com/legal/apl/. * * You may view the GPL, Aptana's exception and additional terms, and the * APL in the file titled license.html at the root of the corresponding * plugin containing this source file. * * Any modifications to this file must keep this entire header intact. */ package com.aptana.ide.debug.internal.ui; import java.util.Iterator; import java.util.Stack; import org.eclipse.core.runtime.CoreException; import org.eclipse.core.runtime.IPath; import org.eclipse.core.runtime.IProgressMonitor; import org.eclipse.core.runtime.IStatus; import org.eclipse.core.runtime.Path; import org.eclipse.core.runtime.Platform; import org.eclipse.core.runtime.Status; import org.eclipse.debug.core.DebugException; import org.eclipse.debug.core.DebugPlugin; import org.eclipse.debug.core.ILaunch; import org.eclipse.debug.core.ILaunchConfiguration; import org.eclipse.debug.core.ILaunchConfigurationType; import org.eclipse.debug.core.ILaunchConfigurationWorkingCopy; import org.eclipse.debug.core.ILaunchManager; import org.eclipse.debug.core.model.IDebugTarget; import org.eclipse.debug.core.model.IProcess; import org.eclipse.debug.core.model.ISourceLocator; import org.eclipse.debug.internal.ui.DebugUIPlugin; import org.eclipse.debug.internal.ui.launchConfigurations.LaunchConfigurationManager; import org.eclipse.debug.internal.ui.launchConfigurations.LaunchHistory; import org.eclipse.debug.ui.IDebugUIConstants; import org.eclipse.jface.dialogs.IDialogConstants; import org.eclipse.jface.dialogs.MessageDialog; import org.eclipse.jface.dialogs.MessageDialogWithToggle; import org.eclipse.jface.preference.IPreferenceStore; import org.eclipse.osgi.service.datalocation.Location; import org.eclipse.swt.SWT; import org.eclipse.swt.widgets.Display; import org.eclipse.swt.widgets.FileDialog; import org.eclipse.ui.IStartup; import org.eclipse.ui.PlatformUI; import org.eclipse.ui.progress.UIJob; import com.aptana.ide.core.CoreStrings; import com.aptana.ide.core.FileUtils; import com.aptana.ide.core.MutexJobRule; import com.aptana.ide.core.PlatformUtils; import com.aptana.ide.core.StringUtils; import com.aptana.ide.core.ui.WorkbenchHelper; import com.aptana.ide.debug.core.ILaunchConfigurationConstants; import com.aptana.ide.debug.core.JSLaunchConfigurationHelper; import com.aptana.ide.debug.core.util.FirebugUtils; import com.aptana.ide.debug.ui.DebugUiPlugin; /** * @author Max Stepanov * */ public class Startup implements IStartup { /** * @see org.eclipse.ui.IStartup#earlyStartup() */ public void earlyStartup() { registerAsFirebugEditor(); UIJob job = new UIJob("Checking default launch configuration") { //$NON-NLS-1$ @Override public IStatus runInUIThread(IProgressMonitor monitor) { checkDefaultLaunchConfiguration(); WorkbenchCloseListener.init(); return Status.OK_STATUS; } }; job.setRule(MutexJobRule.getInstance()); job.setSystem(true); job.schedule(); } private void registerAsFirebugEditor() { IPath launcher = FileUtils.getApplicationLauncher(); if (launcher != null) { FirebugUtils.registerEditor("Aptana", "Aptana Studio", launcher, StringUtils.EMPTY); //$NON-NLS-1$ //$NON-NLS-2$ } } private void checkDefaultLaunchConfiguration() { Stack defaultConfigurations = new Stack(); ILaunchConfiguration configuration; LaunchConfigurationManager manager = DebugUIPlugin.getDefault().getLaunchConfigurationManager(); ILaunchConfiguration[] history = manager.getLaunchHistory(IDebugUIConstants.ID_DEBUG_LAUNCH_GROUP) .getHistory(); /* Firefox */ configuration = getOrCreateDefaultLaunchConfiguration(JSLaunchConfigurationHelper.FIREFOX); if (configuration != null) { defaultConfigurations.push(configuration); } /* IE */ if (Platform.OS_WIN32.equals(Platform.getOS())) { configuration = getOrCreateDefaultLaunchConfiguration(JSLaunchConfigurationHelper.INTERNET_EXPLORER); if (configuration != null) { defaultConfigurations.push(configuration); } } for (int i = 0; i < history.length; ++i) { for (Iterator j = defaultConfigurations.iterator(); j.hasNext();) { if (history[i].equals(j.next())) { j.remove(); break; } } } while (!defaultConfigurations.empty()) { configuration = (ILaunchConfiguration) defaultConfigurations.pop(); setRecentLaunchHistory(IDebugUIConstants.ID_RUN_LAUNCH_GROUP, configuration); setRecentLaunchHistory(IDebugUIConstants.ID_DEBUG_LAUNCH_GROUP, configuration); } } private void setRecentLaunchHistory(String groupId, final ILaunchConfiguration configuration) { LaunchConfigurationManager manager = DebugUIPlugin.getDefault().getLaunchConfigurationManager(); LaunchHistory history = manager.getLaunchHistory(groupId); /* Launch history hack */ history.launchAdded(new ILaunch() { public ILaunchConfiguration getLaunchConfiguration() { return configuration; } /* All other methods are stubs */ public Object[] getChildren() { return null; } public IDebugTarget getDebugTarget() { return null; } public IProcess[] getProcesses() { return null; } public IDebugTarget[] getDebugTargets() { return null; } public void addDebugTarget(IDebugTarget target) { } public void removeDebugTarget(IDebugTarget target) { } public void addProcess(IProcess process) { } public void removeProcess(IProcess process) { } public ISourceLocator getSourceLocator() { return null; } public void setSourceLocator(ISourceLocator sourceLocator) { } public String getLaunchMode() { return null; } public void setAttribute(String key, String value) { } public String getAttribute(String key) { return null; } public boolean hasChildren() { return false; } public boolean canTerminate() { return false; } public boolean isTerminated() { return false; } public void terminate() throws DebugException { } public Object getAdapter(Class adapter) { return null; } }); } private ILaunchConfiguration getOrCreateDefaultLaunchConfiguration(String nature) { ILaunchConfigurationType configType = getLaunchConfigType(); ILaunchManager manager = DebugPlugin.getDefault().getLaunchManager(); try { ILaunchConfiguration[] configs = manager.getLaunchConfigurations(configType); for (int i = 0; i < configs.length; ++i) { ILaunchConfiguration config = configs[i]; if (nature.equals(config.getAttribute(ILaunchConfigurationConstants.CONFIGURATION_BROWSER_NATURE, StringUtils.EMPTY))) { return config; } } ILaunchConfigurationWorkingCopy wc = configType.newInstance(null, DebugPlugin.getDefault() .getLaunchManager().generateUniqueLaunchConfigurationNameFrom(nature + " - Internal Server")); //$NON-NLS-1$ JSLaunchConfigurationHelper.setDefaults(wc, nature); boolean showDownload = true; while (!JSLaunchConfigurationHelper.isBrowserDebugCompatible(wc.getAttribute( ILaunchConfigurationConstants.CONFIGURATION_BROWSER_EXECUTABLE, StringUtils.EMPTY))) { String browserPath = null; if (nature.equals(JSLaunchConfigurationHelper.FIREFOX)) { IPreferenceStore store = DebugUiPlugin.getDefault().getPreferenceStore(); String pref = store .getString(com.aptana.ide.debug.internal.ui.IDebugUIConstants.PREF_SKIP_FIREFOX_CHECK); if (pref == null || !pref.equals(MessageDialogWithToggle.ALWAYS)) { browserPath = showBrowserNotFoundDialog(showDownload); } } if (browserPath == null) { wc.delete(); return null; } if (browserPath.length() == 0) { JSLaunchConfigurationHelper.setBrowserDefaults(wc, nature); } else { wc.setAttribute(ILaunchConfigurationConstants.CONFIGURATION_BROWSER_EXECUTABLE, browserPath); } showDownload = false; } return wc.doSave(); } catch (CoreException e) { DebugUiPlugin.log(e); } return null; } private ILaunchConfigurationType getLaunchConfigType() { ILaunchManager manager = DebugPlugin.getDefault().getLaunchManager(); return manager.getLaunchConfigurationType(ILaunchConfigurationConstants.ID_JS_APPLICATION); } private String showBrowserNotFoundDialog(final boolean download) { final String[] path = new String[] { null }; PlatformUI.getWorkbench().getDisplay().syncExec(new Runnable() { public void run() { if (Display.getCurrent().getActiveShell() == null) { // another message box is shown return; } MessageDialogWithToggle md = new MessageDialogWithToggle( PlatformUI.getWorkbench().getActiveWorkbenchWindow().getShell(), Messages.Startup_Notification, null, Messages.Startup_AptanaRequiresFirefox, MessageDialog.INFORMATION, new String[] { IDialogConstants.PROCEED_LABEL, StringUtils.ellipsify(CoreStrings.BROWSE), download ? Messages.Startup_Download : Messages.Startup_CheckAgain }, 0, Messages.Startup_DontAskAgain, false); md.setPrefKey(com.aptana.ide.debug.internal.ui.IDebugUIConstants.PREF_SKIP_FIREFOX_CHECK); md.setPrefStore(DebugUiPlugin.getDefault().getPreferenceStore()); int returnCode = md.open(); switch (returnCode) { case IDialogConstants.INTERNAL_ID: FileDialog fileDialog = new FileDialog( PlatformUI.getWorkbench().getActiveWorkbenchWindow().getShell(), SWT.OPEN); if (Platform.OS_WIN32.equals(Platform.getOS())) { fileDialog.setFilterExtensions(new String[] { "*.exe" }); //$NON-NLS-1$ fileDialog.setFilterNames(new String[] { Messages.Startup_ExecutableFiles }); } path[0] = fileDialog.open(); break; case IDialogConstants.INTERNAL_ID + 1: if (download) { WorkbenchHelper.launchBrowser("http://www.getfirefox.com"); //$NON-NLS-1$ } path[0] = StringUtils.EMPTY; break; default: } } }); return path[0]; } }