From 3a81f6593214e6c38fb00c1d11b179e1243cb028 Mon Sep 17 00:00:00 2001 From: Doug Schaefer Date: Thu, 31 Jul 2014 15:42:24 -0400 Subject: [PATCH] Bug 437392 - Added the Launch Targets View. This view lists all launch targets that could appear in the Target selector. It allows us to add context menus to them to perform operations, such as opening a terminal view to the target. It will also gives us a cleaner UI to add and remove targets Change-Id: I538a204ce6f25fd017573c50585ac45cdeeaf554 Reviewed-on: https://git.eclipse.org/r/31856 Tested-by: Hudson CI Reviewed-by: Jonathan Williams Reviewed-by: Doug Schaefer --- codan/org.eclipse.cdt.codan.ui.cxx/plugin.xml | 5 +- .../cdt/launchbar/core/ILaunchBarManager.java | 12 +- .../core/internal/LaunchBarManager.java | 42 +++++-- .../plugin.properties | 1 + .../org.eclipse.cdt.launchbar.ui/plugin.xml | 23 ++++ .../internal/controls/LaunchBarControl.java | 20 +-- .../targetsView/LaunchTargetsViewPart.java | 119 ++++++++++++++++++ 7 files changed, 204 insertions(+), 18 deletions(-) create mode 100644 launch/org.eclipse.cdt.launchbar.ui/src/org/eclipse/cdt/launchbar/ui/internal/targetsView/LaunchTargetsViewPart.java diff --git a/codan/org.eclipse.cdt.codan.ui.cxx/plugin.xml b/codan/org.eclipse.cdt.codan.ui.cxx/plugin.xml index 995a5be27f9..0c49b543a37 100644 --- a/codan/org.eclipse.cdt.codan.ui.cxx/plugin.xml +++ b/codan/org.eclipse.cdt.codan.ui.cxx/plugin.xml @@ -21,7 +21,10 @@ - + diff --git a/launch/org.eclipse.cdt.launchbar.core/src/org/eclipse/cdt/launchbar/core/ILaunchBarManager.java b/launch/org.eclipse.cdt.launchbar.core/src/org/eclipse/cdt/launchbar/core/ILaunchBarManager.java index 371860c825e..36d30a1aee7 100644 --- a/launch/org.eclipse.cdt.launchbar.core/src/org/eclipse/cdt/launchbar/core/ILaunchBarManager.java +++ b/launch/org.eclipse.cdt.launchbar.core/src/org/eclipse/cdt/launchbar/core/ILaunchBarManager.java @@ -25,7 +25,7 @@ public interface ILaunchBarManager extends IAdaptable { ILaunchDescriptor getActiveLaunchDescriptor() throws CoreException; void setActiveLaunchDescriptor(ILaunchDescriptor configDesc) throws CoreException; - + void updateLaunchDescriptor(ILaunchDescriptor configDesc) throws CoreException; ILaunchMode[] getLaunchModes() throws CoreException; @@ -35,15 +35,19 @@ public interface ILaunchBarManager extends IAdaptable { void setActiveLaunchMode(ILaunchMode mode) throws CoreException; ILaunchTarget[] getLaunchTargets() throws CoreException; - + ILaunchTarget getLaunchTarget(String id) throws CoreException; ILaunchTarget getActiveLaunchTarget() throws CoreException; void setActiveLaunchTarget(ILaunchTarget target) throws CoreException; - + void updateLaunchTarget(ILaunchTarget target) throws CoreException; + void launchTargetAdded(ILaunchTarget target) throws CoreException; + + void launchTargetRemoved(ILaunchTarget target) throws CoreException; + ILaunchConfigurationType getLaunchConfigurationType(ILaunchDescriptor descriptor, ILaunchTarget target) throws CoreException; ILaunchConfiguration getLaunchConfiguration(ILaunchDescriptor descriptor, ILaunchTarget target) throws CoreException; @@ -66,6 +70,8 @@ public interface ILaunchBarManager extends IAdaptable { void launchDescriptorRemoved(ILaunchDescriptor descriptor); + void launchTargetsChanged(); + } void addListener(Listener listener); diff --git a/launch/org.eclipse.cdt.launchbar.core/src/org/eclipse/cdt/launchbar/core/internal/LaunchBarManager.java b/launch/org.eclipse.cdt.launchbar.core/src/org/eclipse/cdt/launchbar/core/internal/LaunchBarManager.java index 1025ac4cfbf..3f2cc68c5d4 100644 --- a/launch/org.eclipse.cdt.launchbar.core/src/org/eclipse/cdt/launchbar/core/internal/LaunchBarManager.java +++ b/launch/org.eclipse.cdt.launchbar.core/src/org/eclipse/cdt/launchbar/core/internal/LaunchBarManager.java @@ -441,8 +441,8 @@ public class LaunchBarManager extends PlatformObject implements ILaunchBarManage return; } // default target for descriptor - setActiveLaunchTarget(getDeafultLaunchTarget(activeLaunchDesc)); - } + setActiveLaunchTarget(getDefaultLaunchTarget(activeLaunchDesc)); + } protected void syncActiveMode() { if (activeLaunchDesc == null) { @@ -590,10 +590,6 @@ public class LaunchBarManager extends PlatformObject implements ILaunchBarManage @Override public void setActiveLaunchTarget(ILaunchTarget target) { - if (target == null) { - // try and select another target XXX this should not be an API - target = getDeafultLaunchTarget(activeLaunchDesc); - } if (activeLaunchTarget == target) return; activeLaunchTarget = target; @@ -621,7 +617,35 @@ public class LaunchBarManager extends PlatformObject implements ILaunchBarManage } } - protected ILaunchTarget getDeafultLaunchTarget(ILaunchDescriptor descriptor) { + @Override + public void launchTargetAdded(ILaunchTarget target) throws CoreException { + for (Listener listener : listeners) { + try { + listener.launchTargetsChanged(); + } catch (Exception e) { + Activator.log(e); + } + } + if (activeLaunchTarget == null && supportsTargetType(activeLaunchDesc, target.getType())) { + setActiveLaunchTarget(target); + } + } + + @Override + public void launchTargetRemoved(ILaunchTarget target) throws CoreException { + for (Listener listener : listeners) { + try { + listener.launchTargetsChanged(); + } catch (Exception e) { + Activator.log(e); + } + } + if (activeLaunchTarget == target) { + setActiveLaunchTarget(getDefaultLaunchTarget(activeLaunchDesc)); + } + } + + protected ILaunchTarget getDefaultLaunchTarget(ILaunchDescriptor descriptor) { ILaunchTarget[] targets = getLaunchTargets(descriptor); if (targets.length > 0) { return targets[0]; @@ -641,6 +665,10 @@ public class LaunchBarManager extends PlatformObject implements ILaunchBarManage return null; } + public ILaunchTargetType[] getAllLaunchTargetTypes() { + return targetTypes.values().toArray(new ILaunchTargetType[targetTypes.values().size()]); + } + @Override public ILaunchConfigurationType getLaunchConfigurationType(ILaunchDescriptor descriptor, ILaunchTarget target) { if (descriptor == null) diff --git a/launch/org.eclipse.cdt.launchbar.ui/plugin.properties b/launch/org.eclipse.cdt.launchbar.ui/plugin.properties index e9bd17fdcdc..1dedff12797 100644 --- a/launch/org.eclipse.cdt.launchbar.ui/plugin.properties +++ b/launch/org.eclipse.cdt.launchbar.ui/plugin.properties @@ -1 +1,2 @@ launchToolBar.label = LaunchBar +targetsView.name = Launch Targets diff --git a/launch/org.eclipse.cdt.launchbar.ui/plugin.xml b/launch/org.eclipse.cdt.launchbar.ui/plugin.xml index 1c88c6a8b97..947d211d49a 100644 --- a/launch/org.eclipse.cdt.launchbar.ui/plugin.xml +++ b/launch/org.eclipse.cdt.launchbar.ui/plugin.xml @@ -71,5 +71,28 @@ name="Local Target"> + + + + + + + + + + diff --git a/launch/org.eclipse.cdt.launchbar.ui/src/org/eclipse/cdt/launchbar/ui/internal/controls/LaunchBarControl.java b/launch/org.eclipse.cdt.launchbar.ui/src/org/eclipse/cdt/launchbar/ui/internal/controls/LaunchBarControl.java index f9e9bb2104c..1ef343a64ce 100644 --- a/launch/org.eclipse.cdt.launchbar.ui/src/org/eclipse/cdt/launchbar/ui/internal/controls/LaunchBarControl.java +++ b/launch/org.eclipse.cdt.launchbar.ui/src/org/eclipse/cdt/launchbar/ui/internal/controls/LaunchBarControl.java @@ -39,11 +39,11 @@ public class LaunchBarControl implements ILaunchBarManager.Listener { @Inject private ILaunchBarManager manager; - + private ConfigSelector configSelector; private ModeSelector modeSelector; private TargetSelector targetSelector; - + @PostConstruct public void createControl(Composite parent) { manager.addListener(this); @@ -64,7 +64,7 @@ public class LaunchBarControl implements ILaunchBarManager.Listener { createButton(container, Activator.IMG_BUTTON_BUILD, Messages.LaunchBarControl_Build, Activator.CMD_BUILD); createButton(container, Activator.IMG_BUTTON_LAUNCH, Messages.LaunchBarControl_Launch, Activator.CMD_LAUNCH); createButton(container, Activator.IMG_BUTTON_STOP, Messages.LaunchBarControl_Stop, Activator.CMD_STOP); - + modeSelector = new ModeSelector(container, SWT.NONE); modeSelector.setLayoutData(new GridData(SWT.LEFT, SWT.CENTER, false, false)); modeSelector.setInput(manager); @@ -76,7 +76,7 @@ public class LaunchBarControl implements ILaunchBarManager.Listener { Label label = new Label(container, SWT.NONE); label.setLayoutData(new GridData(SWT.LEFT, SWT.CENTER, false, false)); label.setText("on" + ":"); - + targetSelector = new TargetSelector(container, SWT.NONE); targetSelector.setLayoutData(new GridData(SWT.LEFT, SWT.CENTER, false, false)); targetSelector.setInput(manager); @@ -84,10 +84,10 @@ public class LaunchBarControl implements ILaunchBarManager.Listener { try { ILaunchDescriptor configDesc = manager.getActiveLaunchDescriptor(); configSelector.setSelection(configDesc == null ? null : configDesc); - + ILaunchMode mode = manager.getActiveLaunchMode(); modeSelector.setSelection(mode == null ? null : mode); - + ILaunchTarget target = manager.getActiveLaunchTarget(); targetSelector.setSelection(target == null ? null : target); } catch (CoreException e) { @@ -172,7 +172,13 @@ public class LaunchBarControl implements ILaunchBarManager.Listener { @Override public void launchDescriptorRemoved(ILaunchDescriptor descriptor) { // TODO Auto-generated method stub - + + } + + @Override + public void launchTargetsChanged() { + // TODO Auto-generated method stub + } } diff --git a/launch/org.eclipse.cdt.launchbar.ui/src/org/eclipse/cdt/launchbar/ui/internal/targetsView/LaunchTargetsViewPart.java b/launch/org.eclipse.cdt.launchbar.ui/src/org/eclipse/cdt/launchbar/ui/internal/targetsView/LaunchTargetsViewPart.java new file mode 100644 index 00000000000..531590aff2e --- /dev/null +++ b/launch/org.eclipse.cdt.launchbar.ui/src/org/eclipse/cdt/launchbar/ui/internal/targetsView/LaunchTargetsViewPart.java @@ -0,0 +1,119 @@ +package org.eclipse.cdt.launchbar.ui.internal.targetsView; + +import org.eclipse.cdt.launchbar.core.ILaunchBarManager; +import org.eclipse.cdt.launchbar.core.ILaunchDescriptor; +import org.eclipse.cdt.launchbar.core.ILaunchTarget; +import org.eclipse.cdt.launchbar.core.ILaunchTargetType; +import org.eclipse.cdt.launchbar.core.internal.LaunchBarManager; +import org.eclipse.cdt.launchbar.ui.internal.Activator; +import org.eclipse.jface.action.MenuManager; +import org.eclipse.jface.viewers.ITreeContentProvider; +import org.eclipse.jface.viewers.LabelProvider; +import org.eclipse.jface.viewers.TreeViewer; +import org.eclipse.jface.viewers.Viewer; +import org.eclipse.swt.SWT; +import org.eclipse.swt.widgets.Composite; +import org.eclipse.swt.widgets.Menu; +import org.eclipse.ui.part.ViewPart; + +public class LaunchTargetsViewPart extends ViewPart { + + private TreeViewer treeViewer; + + public LaunchTargetsViewPart() { + } + + @Override + public void createPartControl(Composite parent) { + treeViewer = new TreeViewer(parent, SWT.NONE); + treeViewer.setContentProvider(new ITreeContentProvider() { + + @Override + public void inputChanged(Viewer viewer, Object oldInput, Object newInput) { + } + + @Override + public void dispose() { + } + + @Override + public boolean hasChildren(Object element) { + if (element instanceof LaunchBarManager) + return true; + else if (element instanceof ILaunchTargetType) + return true; + else if (element instanceof ILaunchTarget) + return false; + return false; + } + + @Override + public Object getParent(Object element) { + if (element instanceof ILaunchTarget) + return ((ILaunchTarget) element).getType(); + return null; + } + + @Override + public Object[] getElements(Object inputElement) { + return ((LaunchBarManager) inputElement).getAllLaunchTargetTypes(); + } + + @Override + public Object[] getChildren(Object parentElement) { + if (parentElement instanceof ILaunchTargetType) + return ((ILaunchTargetType) parentElement).getTargets(); + return new Object[0]; + } + }); + + treeViewer.setLabelProvider(new LabelProvider() { + @Override + public String getText(Object element) { + if (element instanceof ILaunchTargetType) + return element.getClass().getSimpleName(); + else if (element instanceof ILaunchTarget) + return ((ILaunchTarget) element).getName(); + return super.getText(element); + } + }); + + final ILaunchBarManager launchBarManager = Activator.getService(ILaunchBarManager.class); + treeViewer.setInput(launchBarManager); + launchBarManager.addListener(new ILaunchBarManager.Listener() { + @Override + public void launchTargetsChanged() { + treeViewer.getControl().getDisplay().asyncExec(new Runnable() { + @Override + public void run() { + treeViewer.setInput(launchBarManager); + } + }); + } + @Override + public void launchDescriptorRemoved(ILaunchDescriptor descriptor) { + } + @Override + public void activeLaunchTargetChanged() { + } + @Override + public void activeLaunchModeChanged() { + } + @Override + public void activeConfigurationDescriptorChanged() { + } + }); + + MenuManager menuManager = new MenuManager(); + Menu menu = menuManager.createContextMenu(treeViewer.getControl()); + treeViewer.getControl().setMenu(menu); + getSite().registerContextMenu(menuManager, treeViewer); + getSite().setSelectionProvider(treeViewer); + } + + @Override + public void setFocus() { + treeViewer.getControl().setFocus(); + } + +}