Skip to main content
summaryrefslogtreecommitdiffstats
path: root/debug
diff options
context:
space:
mode:
authorKen Ryall2009-04-08 17:30:45 -0400
committerKen Ryall2009-04-08 17:30:45 -0400
commit915afcd931293ce60effcbabc738aa8dbe0376ad (patch)
tree7634cf3473a3e368b2ea83ce7cb2c148c9a9fa38 /debug
parent9b327ec4dfa9b21fba9cbfae3a81c3b733ca1802 (diff)
downloadorg.eclipse.cdt-915afcd931293ce60effcbabc738aa8dbe0376ad.tar.gz
org.eclipse.cdt-915afcd931293ce60effcbabc738aa8dbe0376ad.tar.xz
org.eclipse.cdt-915afcd931293ce60effcbabc738aa8dbe0376ad.zip
Bug 246201.
Diffstat (limited to 'debug')
-rw-r--r--debug/org.eclipse.cdt.debug.ui/src/org/eclipse/cdt/debug/internal/ui/launch/CApplicationLaunchShortcut.java134
1 files changed, 130 insertions, 4 deletions
diff --git a/debug/org.eclipse.cdt.debug.ui/src/org/eclipse/cdt/debug/internal/ui/launch/CApplicationLaunchShortcut.java b/debug/org.eclipse.cdt.debug.ui/src/org/eclipse/cdt/debug/internal/ui/launch/CApplicationLaunchShortcut.java
index 58d45023f8..bd7b1bb7ba 100644
--- a/debug/org.eclipse.cdt.debug.ui/src/org/eclipse/cdt/debug/internal/ui/launch/CApplicationLaunchShortcut.java
+++ b/debug/org.eclipse.cdt.debug.ui/src/org/eclipse/cdt/debug/internal/ui/launch/CApplicationLaunchShortcut.java
@@ -1,5 +1,5 @@
/*******************************************************************************
- * Copyright (c) 2005, 2007 QNX Software Systems and others.
+ * Copyright (c) 2005, 2009 QNX Software Systems and others.
* All rights reserved. This program and the accompanying materials
* are made available under the terms of the Eclipse Public License v1.0
* which accompanies this distribution, and is available at
@@ -8,18 +8,21 @@
* Contributors:
* QNX Software Systems - Initial API and implementation
* Ken Ryall (Nokia) - bug 178731
+ * Ken Ryall (Nokia) - bug 246201
*******************************************************************************/
package org.eclipse.cdt.debug.internal.ui.launch;
import java.lang.reflect.InvocationTargetException;
import java.util.ArrayList;
import java.util.Collections;
+import java.util.Iterator;
import java.util.List;
import org.eclipse.cdt.core.CCorePlugin;
import org.eclipse.cdt.core.model.CModelException;
import org.eclipse.cdt.core.model.CoreModel;
import org.eclipse.cdt.core.model.IBinary;
+import org.eclipse.cdt.core.model.ICElement;
import org.eclipse.cdt.core.model.ICProject;
import org.eclipse.cdt.core.settings.model.ICConfigurationDescription;
import org.eclipse.cdt.core.settings.model.ICProjectDescription;
@@ -27,9 +30,11 @@ import org.eclipse.cdt.debug.core.CDebugCorePlugin;
import org.eclipse.cdt.debug.core.CDebugUtils;
import org.eclipse.cdt.debug.core.ICDTLaunchConfigurationConstants;
import org.eclipse.cdt.debug.core.ICDebugConfiguration;
+import org.eclipse.cdt.debug.core.executables.Executable;
import org.eclipse.cdt.debug.ui.CDebugUIPlugin;
import org.eclipse.cdt.debug.ui.ICDebuggerPage;
import org.eclipse.cdt.ui.CElementLabelProvider;
+import org.eclipse.core.resources.IFile;
import org.eclipse.core.resources.IProject;
import org.eclipse.core.resources.IResource;
import org.eclipse.core.runtime.CoreException;
@@ -45,22 +50,26 @@ import org.eclipse.debug.core.ILaunchConfigurationWorkingCopy;
import org.eclipse.debug.core.ILaunchManager;
import org.eclipse.debug.ui.DebugUITools;
import org.eclipse.debug.ui.IDebugModelPresentation;
-import org.eclipse.debug.ui.ILaunchShortcut;
+import org.eclipse.debug.ui.ILaunchShortcut2;
import org.eclipse.jface.dialogs.MessageDialog;
import org.eclipse.jface.dialogs.ProgressMonitorDialog;
import org.eclipse.jface.operation.IRunnableWithProgress;
+import org.eclipse.jface.text.ITextSelection;
import org.eclipse.jface.viewers.ILabelProvider;
import org.eclipse.jface.viewers.ISelection;
import org.eclipse.jface.viewers.IStructuredSelection;
import org.eclipse.jface.viewers.LabelProvider;
import org.eclipse.jface.window.Window;
import org.eclipse.swt.widgets.Shell;
+import org.eclipse.ui.IEditorInput;
import org.eclipse.ui.IEditorPart;
+import org.eclipse.ui.IFileEditorInput;
+import org.eclipse.ui.IWorkbenchPage;
import org.eclipse.ui.IWorkbenchWindow;
import org.eclipse.ui.dialogs.ElementListSelectionDialog;
import org.eclipse.ui.dialogs.TwoPaneElementSelector;
-public class CApplicationLaunchShortcut implements ILaunchShortcut {
+public class CApplicationLaunchShortcut implements ILaunchShortcut2 {
public void launch(IEditorPart editor, String mode) {
searchAndLaunch(new Object[] { editor.getEditorInput()}, mode);
@@ -184,7 +193,7 @@ public class CApplicationLaunchShortcut implements ILaunchShortcut {
configType.newInstance(null, getLaunchManager().generateUniqueLaunchConfigurationNameFrom(bin.getElementName()));
wc.setAttribute(ICDTLaunchConfigurationConstants.ATTR_PROGRAM_NAME, projectName);
wc.setAttribute(ICDTLaunchConfigurationConstants.ATTR_PROJECT_NAME, bin.getCProject().getElementName());
- wc.setMappedResources(new IResource[] {bin.getResource(), bin.getResource().getProject()});
+ wc.setMappedResources(new IResource[] {bin.getResource().getProject()});
wc.setAttribute(ICDTLaunchConfigurationConstants.ATTR_WORKING_DIRECTORY, (String) null);
wc.setAttribute(ICDTLaunchConfigurationConstants.ATTR_DEBUGGER_STOP_AT_MAIN, true);
wc.setAttribute(
@@ -448,4 +457,121 @@ public class CApplicationLaunchShortcut implements ILaunchShortcut {
}
}
+ public ILaunchConfiguration[] getLaunchConfigurations(ISelection selection) {
+ // This returns null so the platform will use the ILaunchShortcut behavior
+ // and get the configurations based on the project resource association.
+ return null;
+ }
+
+ public ILaunchConfiguration[] getLaunchConfigurations(IEditorPart editorpart) {
+ // This returns null so the platform will use the ILaunchShortcut behavior
+ // and get the configurations based on the project resource association.
+ return null;
+ }
+
+ public IResource getLaunchableResource(ISelection selection) {
+ // Take the selection and determine which project is intended to
+ // be used for the launch.
+ if (selection instanceof IStructuredSelection) {
+ Object firstElement = ((IStructuredSelection) selection).getFirstElement();
+ if (firstElement != null)
+ {
+ if (firstElement instanceof IFile)
+ {
+ IFile file = (IFile) firstElement;
+ return file.getProject();
+ }
+ if (firstElement instanceof Executable)
+ {
+ return ((Executable)firstElement).getProject();
+ }
+ if (firstElement instanceof IBinary)
+ {
+ return ((IBinary)firstElement).getResource().getProject();
+ }
+ }
+ }
+ List<IProject> projects = getProjectsFromSelection(selection);
+ if (projects.size() > 0) {
+ return projects.get(0);
+ }
+ return null;
+ }
+
+ /**
+ * Gets the owning project(s) of the selected object(s) if any
+ * @param selection the current selection
+ * @return a list of projects - may be empty
+ */
+ public static List<IProject> getProjectsFromSelection(ISelection selection) {
+ List<IProject> projects = new ArrayList<IProject>();
+
+ if (selection != null && !selection.isEmpty()) {
+ if (selection instanceof ITextSelection) {
+
+ IWorkbenchWindow activeWindow = CDebugUIPlugin.getActiveWorkbenchWindow();
+ IWorkbenchPage wpage = activeWindow.getActivePage();
+ if (wpage != null) {
+ IEditorPart ep = wpage.getActiveEditor();
+ if (ep != null) {
+ IEditorInput editorInput = ep.getEditorInput();
+ if (editorInput instanceof IFileEditorInput) {
+ IFile file = ((IFileEditorInput)editorInput).getFile();
+ if (file != null) {
+ projects.add(file.getProject());
+ }
+ }
+ }
+ }
+ } else if (selection instanceof IStructuredSelection) {
+ IStructuredSelection structuredSelection = (IStructuredSelection) selection;
+
+ for (Iterator<?> iter = structuredSelection.iterator(); iter.hasNext();) {
+ Object element = (Object) iter.next();
+ if (element != null) {
+
+ if (element instanceof ICProject) {
+ projects.add(((ICProject)element).getProject());
+ } else if (element instanceof IResource) {
+ projects.add(((IResource)element).getProject());
+ } else if (element instanceof ICElement) {
+ ICElement unit = (ICElement) element;
+
+ // Get parent of the Element until we reach the owner project.
+ while (unit != null && ! (unit instanceof ICProject))
+ unit = unit.getParent();
+
+ if (unit != null) {
+ projects.add(((ICProject)unit).getProject());
+ }
+ } else if (element instanceof IAdaptable) {
+ Object adapter = ((IAdaptable)element).getAdapter(IResource.class);
+ if (adapter != null && adapter instanceof IResource) {
+ projects.add(((IResource)adapter).getProject());
+ } else {
+ adapter = ((IAdaptable)element).getAdapter(ICProject.class);
+ if (adapter != null && adapter instanceof ICProject) {
+ projects.add(((ICProject)adapter).getProject());
+ }
+ }
+ }
+ }
+ }
+ }
+ }
+ return projects;
+ }
+
+ public IResource getLaunchableResource(IEditorPart editorpart) {
+ // This handles the case where the selection is text in an editor.
+ IEditorInput editorInput = editorpart.getEditorInput();
+ if (editorInput instanceof IFileEditorInput) {
+ IFile file = ((IFileEditorInput)editorInput).getFile();
+ if (file != null) {
+ return file.getProject();
+ }
+ }
+ return null;
+ }
+
}

Back to the top