diff options
author | Alena Laskavaia | 2014-08-08 20:25:11 +0000 |
---|---|---|
committer | Elena Laskavaia | 2014-08-11 15:02:11 +0000 |
commit | 1bf2aa825ff722d9ce49873b16b357b4236d8c17 (patch) | |
tree | a00dd3de75c72a25f882579f39ac16c0a827fd9f /launch | |
parent | 4d4ab6cafd922129ea2a05446095866fd672a964 (diff) | |
download | org.eclipse.cdt-1bf2aa825ff722d9ce49873b16b357b4236d8c17.tar.gz org.eclipse.cdt-1bf2aa825ff722d9ce49873b16b357b4236d8c17.tar.xz org.eclipse.cdt-1bf2aa825ff722d9ce49873b16b357b4236d8c17.zip |
LaunhBar - some API changes and cleanup
* Project provider to react on project changes (i.e. when nature
changed)
* Added concept of open descriptor - which will be visible in UI,
this will allow not to remap to null, reuse objects for other reasons,
and eventually I want to replace object map into 1:1 mapping without
nulls
* Removed throwing CoreException from getLaunchDescriptors (it does not
need to throw it)
* Project based type now checks if project is open
* Fixed copyright
* Added interface for ILaunchDescriptorProjectBased
Change-Id: I3277f5910c7df1bb4aa3e809dda3b61921dcad6e
Signed-off-by: Alena Laskavaia <elaskavaia.cdt@gmail.com>
Reviewed-on: https://git.eclipse.org/r/31321
Diffstat (limited to 'launch')
12 files changed, 242 insertions, 153 deletions
diff --git a/launch/org.eclipse.cdt.launchbar.core.tests/src/org/eclipse/cdt/launchbar/core/internal/LaunchBarManagerTest.java b/launch/org.eclipse.cdt.launchbar.core.tests/src/org/eclipse/cdt/launchbar/core/internal/LaunchBarManagerTest.java index fd3df6f9dee..b73140e253a 100644 --- a/launch/org.eclipse.cdt.launchbar.core.tests/src/org/eclipse/cdt/launchbar/core/internal/LaunchBarManagerTest.java +++ b/launch/org.eclipse.cdt.launchbar.core.tests/src/org/eclipse/cdt/launchbar/core/internal/LaunchBarManagerTest.java @@ -289,19 +289,19 @@ public class LaunchBarManagerTest extends TestCase { } @Test - public void testGetLaunchDescriptorsNull() { - ILaunchDescriptor[] launchDescriptors = manager.getLaunchDescriptors(); + public void testGetOpenLaunchDescriptorsNull() { + ILaunchDescriptor[] launchDescriptors = manager.getOpenLaunchDescriptors(); assertEquals(0, launchDescriptors.length); } - public void testGetLaunchDescriptors() { + public void testGetOpenLaunchDescriptors() { basicSetup(); manager.launchObjectAdded(lc); - ILaunchDescriptor[] launchDescriptors = manager.getLaunchDescriptors(); + ILaunchDescriptor[] launchDescriptors = manager.getOpenLaunchDescriptors(); assertEquals(1, launchDescriptors.length); } - public void testGetLaunchDescriptorsSort() { + public void testGetOpenLaunchDescriptorsSort() { final ILaunchDescriptor res[] = new ILaunchDescriptor[1]; manager.addTargetType(targetType); ConfigBasedLaunchDescriptorType descType1 = new ConfigBasedLaunchDescriptorType("id1", lctype.getIdentifier()); @@ -320,7 +320,7 @@ public class LaunchBarManagerTest extends TestCase { manager.addConfigProvider(descType3.getId(), targetType.getId(), true, provider); targetType.targets.add(mytarget); manager.launchObjectAdded(lc); - ILaunchDescriptor[] launchDescriptors = manager.getLaunchDescriptors(); + ILaunchDescriptor[] launchDescriptors = manager.getOpenLaunchDescriptors(); assertEquals(1, launchDescriptors.length); assertNotNull(launchDescriptors[0]); assertSame(res[0], launchDescriptors[0]); @@ -330,7 +330,7 @@ public class LaunchBarManagerTest extends TestCase { public void testLaunchObjectAdded() throws CoreException { basicSetup(); manager.launchObjectAdded(lc); - ILaunchDescriptor[] launchDescriptors = manager.getLaunchDescriptors(); + ILaunchDescriptor[] launchDescriptors = manager.getOpenLaunchDescriptors(); assertEquals(1, launchDescriptors.length); assertNotNull(launchDescriptors[0]); assertEquals(lc.getName(), launchDescriptors[0].getName()); @@ -342,7 +342,7 @@ public class LaunchBarManagerTest extends TestCase { manager.launchObjectAdded(lc); ILaunchConfiguration lc2 = mockLC("lc2", lctype); manager.launchObjectAdded(lc2); - assertEquals(2, manager.getLaunchDescriptors().length); + assertEquals(2, manager.getOpenLaunchDescriptors().length); } @Test @@ -350,7 +350,7 @@ public class LaunchBarManagerTest extends TestCase { basicSetup(); assertNull(manager.launchObjectChanged(lc)); manager.launchObjectAdded(lc); - assertEquals(1, manager.getLaunchDescriptors().length); + assertEquals(1, manager.getOpenLaunchDescriptors().length); assertNotNull(manager.launchObjectChanged(lc)); } @@ -362,6 +362,7 @@ public class LaunchBarManagerTest extends TestCase { IPath path = new Path(projectName); when(project.getFullPath()).thenReturn(path); when(project.getType()).thenReturn(IResource.PROJECT); + when(project.isOpen()).thenReturn(true); return project; } @@ -407,23 +408,23 @@ public class LaunchBarManagerTest extends TestCase { projectMappingSetup(); // user created a project manager.launchObjectAdded(aaa); - assertEquals(1, manager.getLaunchDescriptors().length); - assertTrue(manager.getLaunchDescriptors()[0].getName().startsWith(aaa.getName())); + assertEquals(1, manager.getOpenLaunchDescriptors().length); + assertTrue(manager.getOpenLaunchDescriptors()[0].getName().startsWith(aaa.getName())); // user clicked on descriptor geer to edit lc, new lc is created manager.launchConfigurationAdded(lc); - assertEquals(1, manager.getLaunchDescriptors().length); - assertEquals(lc.getName(), manager.getLaunchDescriptors()[0].getName()); + assertEquals(1, manager.getOpenLaunchDescriptors().length); + assertEquals(lc.getName(), manager.getOpenLaunchDescriptors()[0].getName()); // user cloned lc and changed some settings ILaunchConfiguration lc2 = mockLC("lc2", lctype); mockLCProject(lc2, aaa.getName()); manager.launchConfigurationAdded(lc2); - assertEquals(2, manager.getLaunchDescriptors().length); + assertEquals(2, manager.getOpenLaunchDescriptors().length); // user deleted lc userDeletesLC(lc2); - assertEquals(1, manager.getLaunchDescriptors().length); + assertEquals(1, manager.getOpenLaunchDescriptors().length); // user deleted last lc, now we back to project default userDeletesLC(lc); - assertEquals(1, manager.getLaunchDescriptors().length); + assertEquals(1, manager.getOpenLaunchDescriptors().length); } protected void userDeletesLC(ILaunchConfiguration lc2) { @@ -443,6 +444,11 @@ public class LaunchBarManagerTest extends TestCase { protected boolean ownsProject(IProject element) { return true; } + + @Override + public ILaunchConfigurationType getLaunchConfigurationType() { + return lctype; + } }; provider = new ProjectBasedLaunchConfigurationProvider(lctype.getIdentifier()) { protected IProject getProject(ILaunchConfiguration llc) { @@ -453,18 +459,21 @@ public class LaunchBarManagerTest extends TestCase { basicSetup(); aaa = mockProject("aaa"); mockLCProject(lc, aaa.getName()); - assertEquals(0, manager.getLaunchDescriptors().length); + assertEquals(0, manager.getOpenLaunchDescriptors().length); } public void testLaunchObjectAddedRemapping2() throws CoreException { projectMappingSetup(); // test unmapping manager.launchObjectAdded(aaa); + assertEquals(1, manager.getOpenLaunchDescriptors().length); manager.launchObjectAdded(lc); - assertEquals(2, manager.getLaunchDescriptors().length); - manager.launchObjectAdded(aaa); // that would remove aaa mapping since lc is already there - assertEquals(1, manager.getLaunchDescriptors().length); - assertEquals(lc.getName(), manager.getLaunchDescriptors()[0].getName()); + assertEquals(2, manager.getOpenLaunchDescriptors().length); // XXX should be 1 + manager.launchObjectChanged(aaa); + assertEquals(1, manager.getOpenLaunchDescriptors().length); + assertEquals(lc.getName(), manager.getOpenLaunchDescriptors()[0].getName()); + manager.launchObjectRemoved(lc); + assertEquals(0, manager.getOpenLaunchDescriptors().length); // XXX should be 1 } @Test @@ -490,9 +499,9 @@ public class LaunchBarManagerTest extends TestCase { public void testLaunchObjectRemoved() throws CoreException { basicSetup(); manager.launchObjectAdded(lc); - assertEquals(1, manager.getLaunchDescriptors().length); + assertEquals(1, manager.getOpenLaunchDescriptors().length); manager.launchObjectRemoved(lc); - assertEquals(0, manager.getLaunchDescriptors().length); + assertEquals(0, manager.getOpenLaunchDescriptors().length); } @Test @@ -825,7 +834,7 @@ public class LaunchBarManagerTest extends TestCase { ILaunchMode mode = mockLaunchModes(lctype, "foo")[0]; manager.launchConfigurationAdded(lc); verify(provider).launchConfigurationAdded(lc); - ILaunchDescriptor[] launchDescriptors = manager.getLaunchDescriptors(); + ILaunchDescriptor[] launchDescriptors = manager.getOpenLaunchDescriptors(); assertEquals(1, launchDescriptors.length); assertNotNull(launchDescriptors[0]); assertEquals(lc.getName(), launchDescriptors[0].getName()); @@ -844,7 +853,7 @@ public class LaunchBarManagerTest extends TestCase { ILaunchConfiguration lc2 = mockLC("lc2", lctype2); manager.launchConfigurationAdded(lc2); verify(provider).launchConfigurationAdded(lc2); - ILaunchDescriptor[] launchDescriptors = manager.getLaunchDescriptors(); + ILaunchDescriptor[] launchDescriptors = manager.getOpenLaunchDescriptors(); assertEquals(1, launchDescriptors.length); assertNotNull(launchDescriptors[0]); assertEquals(lc2.getName(), launchDescriptors[0].getName()); @@ -909,7 +918,7 @@ public class LaunchBarManagerTest extends TestCase { manager = new FixedLaunchBarManager(); targetType.targets.add(mytarget); manager.launchObjectAdded(lc); - ILaunchDescriptor[] launchDescriptors = manager.getLaunchDescriptors(); + ILaunchDescriptor[] launchDescriptors = manager.getOpenLaunchDescriptors(); assertEquals(1, launchDescriptors.length); assertNotNull(launchDescriptors[0]); assertEquals(lc.getName(), launchDescriptors[0].getName()); @@ -933,7 +942,7 @@ public class LaunchBarManagerTest extends TestCase { store.put("activeConfigDesc", desc.getId()); manager = new FixedLaunchBarManager(); verify(descType).getDescriptor(lc); - ILaunchDescriptor[] launchDescriptors = manager.getLaunchDescriptors(); + ILaunchDescriptor[] launchDescriptors = manager.getOpenLaunchDescriptors(); assertEquals(1, launchDescriptors.length); assertEquals(desc, launchDescriptors[0]); // assertEquals(desc, descriptor); @@ -956,7 +965,7 @@ public class LaunchBarManagerTest extends TestCase { doThrow(new CoreException(new Status(1, "a", "n"))).when(element).createExecutableExtension("class"); doReturn(new ILaunchConfiguration[] { lc }).when(lman).getLaunchConfigurations(); manager = new FixedLaunchBarManager(); - ILaunchDescriptor[] launchDescriptors = manager.getLaunchDescriptors(); + ILaunchDescriptor[] launchDescriptors = manager.getOpenLaunchDescriptors(); assertEquals(0, launchDescriptors.length); } @@ -970,7 +979,7 @@ public class LaunchBarManagerTest extends TestCase { doReturn(descType.getId() + "somestuff").when(element).getAttribute("id"); doReturn(new ILaunchConfiguration[] { lc }).when(lman).getLaunchConfigurations(); manager = new FixedLaunchBarManager(); - ILaunchDescriptor[] launchDescriptors = manager.getLaunchDescriptors(); + ILaunchDescriptor[] launchDescriptors = manager.getOpenLaunchDescriptors(); assertEquals(0, launchDescriptors.length); } @@ -986,7 +995,7 @@ public class LaunchBarManagerTest extends TestCase { doReturn(new ILaunchConfiguration[] { lc }).when(lman).getLaunchConfigurations(); manager = new FixedLaunchBarManager(); verify(descType).getDescriptor(lc); - assertEquals(desc, manager.getLaunchDescriptors()[0]); + assertEquals(desc, manager.getOpenLaunchDescriptors()[0]); } public void testExtensionDescriptorTypeNoPrio() throws CoreException { @@ -1000,7 +1009,7 @@ public class LaunchBarManagerTest extends TestCase { doReturn(new ILaunchConfiguration[] { lc }).when(lman).getLaunchConfigurations(); manager = new FixedLaunchBarManager(); verify(descType).getDescriptor(lc); - assertEquals(desc, manager.getLaunchDescriptors()[0]); + assertEquals(desc, manager.getOpenLaunchDescriptors()[0]); } public void testExtensionTargetType() throws CoreException { @@ -1044,7 +1053,7 @@ public class LaunchBarManagerTest extends TestCase { doReturn(new ILaunchConfiguration[] { lc }).when(lman).getLaunchConfigurations(); targetType.targets.add(mytarget); manager = new FixedLaunchBarManager(); - ILaunchDescriptor[] launchDescriptors = manager.getLaunchDescriptors(); + ILaunchDescriptor[] launchDescriptors = manager.getOpenLaunchDescriptors(); assertEquals(1, launchDescriptors.length); assertEquals(desc, launchDescriptors[0]); assertEquals(mytarget, manager.getActiveLaunchTarget()); diff --git a/launch/org.eclipse.cdt.launchbar.core/src/org/eclipse/cdt/launchbar/core/AbstractLaunchDescriptor.java b/launch/org.eclipse.cdt.launchbar.core/src/org/eclipse/cdt/launchbar/core/AbstractLaunchDescriptor.java index 8676ca9f719..10fee5686b1 100644 --- a/launch/org.eclipse.cdt.launchbar.core/src/org/eclipse/cdt/launchbar/core/AbstractLaunchDescriptor.java +++ b/launch/org.eclipse.cdt.launchbar.core/src/org/eclipse/cdt/launchbar/core/AbstractLaunchDescriptor.java @@ -12,11 +12,9 @@ package org.eclipse.cdt.launchbar.core; /** * Convenience implementation of ILaunchDescriptor - * - * @author elaskavaia - * */ public abstract class AbstractLaunchDescriptor implements ILaunchDescriptor { + private boolean open = true; @Override public abstract String getName(); @@ -46,4 +44,13 @@ public abstract class AbstractLaunchDescriptor implements ILaunchDescriptor { return false; return true; } + + @Override + public boolean isOpen() { + return open; + } + + public void setOpen(boolean open) { + this.open = open; + } } diff --git a/launch/org.eclipse.cdt.launchbar.core/src/org/eclipse/cdt/launchbar/core/ConfigBasedLaunchDescriptor.java b/launch/org.eclipse.cdt.launchbar.core/src/org/eclipse/cdt/launchbar/core/ConfigBasedLaunchDescriptor.java index 3c4278dd6b9..0c9c47e1825 100644 --- a/launch/org.eclipse.cdt.launchbar.core/src/org/eclipse/cdt/launchbar/core/ConfigBasedLaunchDescriptor.java +++ b/launch/org.eclipse.cdt.launchbar.core/src/org/eclipse/cdt/launchbar/core/ConfigBasedLaunchDescriptor.java @@ -6,7 +6,7 @@ * http://www.eclipse.org/legal/epl-v10.html * * Contributors: - * Doug Schaefer + * Alena Laskavaia - Initial API and implementation *******************************************************************************/ package org.eclipse.cdt.launchbar.core; 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 916d930dbc4..371860c825e 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 @@ -18,7 +18,9 @@ import org.eclipse.debug.core.ILaunchMode; public interface ILaunchBarManager extends IAdaptable { - ILaunchDescriptor[] getLaunchDescriptors() throws CoreException; + ILaunchDescriptor[] getLaunchDescriptors(); + + ILaunchDescriptor[] getOpenLaunchDescriptors(); ILaunchDescriptor getActiveLaunchDescriptor() throws CoreException; @@ -52,6 +54,8 @@ public interface ILaunchBarManager extends IAdaptable { ILaunchDescriptor launchObjectChanged(Object element) throws CoreException; + ILaunchDescriptor getLaunchDescriptor(Object element); + interface Listener { void activeConfigurationDescriptorChanged(); diff --git a/launch/org.eclipse.cdt.launchbar.core/src/org/eclipse/cdt/launchbar/core/ILaunchDescriptor.java b/launch/org.eclipse.cdt.launchbar.core/src/org/eclipse/cdt/launchbar/core/ILaunchDescriptor.java index 303ca4616b3..d0969afda04 100644 --- a/launch/org.eclipse.cdt.launchbar.core/src/org/eclipse/cdt/launchbar/core/ILaunchDescriptor.java +++ b/launch/org.eclipse.cdt.launchbar.core/src/org/eclipse/cdt/launchbar/core/ILaunchDescriptor.java @@ -37,4 +37,9 @@ public interface ILaunchDescriptor { */ ILaunchDescriptorType getType(); + /** + * Descriptor considered open when it is visible to user, and closed otherwise + */ + boolean isOpen(); + } diff --git a/launch/org.eclipse.cdt.launchbar.core/src/org/eclipse/cdt/launchbar/core/ILaunchDescriptorProjectBased.java b/launch/org.eclipse.cdt.launchbar.core/src/org/eclipse/cdt/launchbar/core/ILaunchDescriptorProjectBased.java new file mode 100644 index 00000000000..55db4eaedf8 --- /dev/null +++ b/launch/org.eclipse.cdt.launchbar.core/src/org/eclipse/cdt/launchbar/core/ILaunchDescriptorProjectBased.java @@ -0,0 +1,23 @@ +/******************************************************************************* + * Copyright (c) 2014 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 + * http://www.eclipse.org/legal/epl-v10.html + * + * Contributors: + * Alena Laskavaia - Initial API and implementation + *******************************************************************************/ +package org.eclipse.cdt.launchbar.core; + +import org.eclipse.core.resources.IProject; + +/** + * Project Based launch descriptor knows about project it is associated with + */ +public interface ILaunchDescriptorProjectBased extends ILaunchDescriptor { + /** + * Get associate project + */ + public abstract IProject getProject(); +}
\ No newline at end of file diff --git a/launch/org.eclipse.cdt.launchbar.core/src/org/eclipse/cdt/launchbar/core/ProjectBasedLaunchConfigurationProvider.java b/launch/org.eclipse.cdt.launchbar.core/src/org/eclipse/cdt/launchbar/core/ProjectBasedLaunchConfigurationProvider.java index 14280e2735b..429e2ddb545 100644 --- a/launch/org.eclipse.cdt.launchbar.core/src/org/eclipse/cdt/launchbar/core/ProjectBasedLaunchConfigurationProvider.java +++ b/launch/org.eclipse.cdt.launchbar.core/src/org/eclipse/cdt/launchbar/core/ProjectBasedLaunchConfigurationProvider.java @@ -1,16 +1,12 @@ /******************************************************************************* - * Copyright (c) 2014 QNX Software Systems. All Rights Reserved. + * Copyright (c) 2014 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 + * http://www.eclipse.org/legal/epl-v10.html * - * You must obtain a written license from and pay applicable license fees to QNX - * Software Systems before you may reproduce, modify or distribute this software, - * or any work that includes all or part of this software. Free development - * licenses are available for evaluation and non-commercial purposes. For more - * information visit [http://licensing.qnx.com] or email licensing@qnx.com. - * - * This file may contain contributions from others. Please review this entire - * file for other proprietary rights or license notices, as well as the QNX - * Development Suite License Guide at [http://licensing.qnx.com/license-guide/] - * for other information. + * Contributors: + * Alena Laskavaia - Initial API and implementationn *******************************************************************************/ package org.eclipse.cdt.launchbar.core; diff --git a/launch/org.eclipse.cdt.launchbar.core/src/org/eclipse/cdt/launchbar/core/ProjectBasedLaunchDescriptor.java b/launch/org.eclipse.cdt.launchbar.core/src/org/eclipse/cdt/launchbar/core/ProjectBasedLaunchDescriptor.java index 4a8ac81a1ca..4768b8e873b 100644 --- a/launch/org.eclipse.cdt.launchbar.core/src/org/eclipse/cdt/launchbar/core/ProjectBasedLaunchDescriptor.java +++ b/launch/org.eclipse.cdt.launchbar.core/src/org/eclipse/cdt/launchbar/core/ProjectBasedLaunchDescriptor.java @@ -1,45 +1,46 @@ /******************************************************************************* - * Copyright (c) 2014 QNX Software Systems. All Rights Reserved. + * Copyright (c) 2014 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 + * http://www.eclipse.org/legal/epl-v10.html * - * You must obtain a written license from and pay applicable license fees to QNX - * Software Systems before you may reproduce, modify or distribute this software, - * or any work that includes all or part of this software. Free development - * licenses are available for evaluation and non-commercial purposes. For more - * information visit [http://licensing.qnx.com] or email licensing@qnx.com. - * - * This file may contain contributions from others. Please review this entire - * file for other proprietary rights or license notices, as well as the QNX - * Development Suite License Guide at [http://licensing.qnx.com/license-guide/] - * for other information. + * Contributors: + * Alena Laskavaia - Initial API and implementation *******************************************************************************/ package org.eclipse.cdt.launchbar.core; import org.eclipse.core.resources.IProject; import org.eclipse.debug.core.ILaunchConfiguration; -public class ProjectBasedLaunchDescriptor extends ConfigBasedLaunchDescriptor { +public class ProjectBasedLaunchDescriptor extends ConfigBasedLaunchDescriptor implements ILaunchDescriptorProjectBased { private IProject project; public ProjectBasedLaunchDescriptor(ILaunchDescriptorType type, IProject p, ILaunchConfiguration lc) { super(type, lc); + if (p == null) + throw new NullPointerException(); this.project = p; } + @Override public String getName() { - if (getLaunchConfiguration() == null) - return project.getName(); - else - return getLaunchConfiguration().getName(); + ILaunchConfiguration lc = getLaunchConfiguration(); + if (lc != null) + return lc.getName(); + return project.getName(); } - public IProject getProject() { + @Override + public IProject getProject() { return project; } @Override public String toString() { - if (getLaunchConfiguration() == null) - return getName(); - return "LC/" + getName(); + ILaunchConfiguration lc = getLaunchConfiguration(); + if (lc != null) + return "LC/" + lc.getName(); + return "P/" + project.getName(); } }
\ No newline at end of file diff --git a/launch/org.eclipse.cdt.launchbar.core/src/org/eclipse/cdt/launchbar/core/ProjectBasedLaunchDescriptorType.java b/launch/org.eclipse.cdt.launchbar.core/src/org/eclipse/cdt/launchbar/core/ProjectBasedLaunchDescriptorType.java index f46912b2cb5..4f0e9f1a533 100644 --- a/launch/org.eclipse.cdt.launchbar.core/src/org/eclipse/cdt/launchbar/core/ProjectBasedLaunchDescriptorType.java +++ b/launch/org.eclipse.cdt.launchbar.core/src/org/eclipse/cdt/launchbar/core/ProjectBasedLaunchDescriptorType.java @@ -1,22 +1,16 @@ /******************************************************************************* - * Copyright (c) 2014 QNX Software Systems. All Rights Reserved. + * Copyright (c) 2014 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 + * http://www.eclipse.org/legal/epl-v10.html * - * You must obtain a written license from and pay applicable license fees to QNX - * Software Systems before you may reproduce, modify or distribute this software, - * or any work that includes all or part of this software. Free development - * licenses are available for evaluation and non-commercial purposes. For more - * information visit [http://licensing.qnx.com] or email licensing@qnx.com. - * - * This file may contain contributions from others. Please review this entire - * file for other proprietary rights or license notices, as well as the QNX - * Development Suite License Guide at [http://licensing.qnx.com/license-guide/] - * for other information. + * Contributors: + * Alena Laskavaia - Initial API and implementation *******************************************************************************/ package org.eclipse.cdt.launchbar.core; -import org.eclipse.cdt.launchbar.core.internal.Activator; import org.eclipse.core.resources.IProject; -import org.eclipse.core.runtime.CoreException; import org.eclipse.debug.core.ILaunchConfiguration; public abstract class ProjectBasedLaunchDescriptorType extends ConfigBasedLaunchDescriptorType { @@ -28,11 +22,18 @@ public abstract class ProjectBasedLaunchDescriptorType extends ConfigBasedLaunch public boolean ownsLaunchObject(Object element) { if (super.ownsLaunchObject(element)) return true; - if (element instanceof IProject && ownsProject((IProject) element)) + if (element instanceof IProject && ((IProject) element).isOpen() && ownsProject((IProject) element)) return true; return false; } + protected boolean ownsLaunchDescriptor(ILaunchDescriptor ld) { + if (!(ld instanceof ProjectBasedLaunchDescriptorType)) + return false; + ProjectBasedLaunchDescriptorType other = (ProjectBasedLaunchDescriptorType) ld; + return other.getLaunchConfigurationType().equals(getLaunchConfigurationType()); + } + protected abstract boolean ownsProject(IProject element); @Override @@ -40,24 +41,44 @@ public abstract class ProjectBasedLaunchDescriptorType extends ConfigBasedLaunch if (element instanceof ILaunchConfiguration) { ILaunchConfiguration llc = (ILaunchConfiguration) element; IProject project = getProject(llc); + // TODO we need disable project based descriptor here return new ProjectBasedLaunchDescriptor(this, project, llc); } else if (element instanceof IProject) { - try { - ILaunchDescriptor[] lds = getManager().getLaunchDescriptors(); - for (int i = 0; i < lds.length; i++) { - ILaunchDescriptor ld = lds[i]; - if (ld instanceof ProjectBasedLaunchDescriptor - && element.equals(((ProjectBasedLaunchDescriptor) ld).getProject())) { - return null; // somebody else has it - } + // this type creates two versions of the descriptor - launch config based + // and project based. Project based do not have a config. If at least one + // launch config created, associated with same project, we don't need descriptor with null config + // anymore so we return null in this case + IProject project = (IProject) element; + ProjectBasedLaunchDescriptor desc = new ProjectBasedLaunchDescriptor(this, project, null); + ILaunchDescriptor[] lds = getManager().getLaunchDescriptors(); + for (int i = 0; i < lds.length; i++) { + ILaunchDescriptor ld = lds[i]; + if (isBetter(ld, desc)) { + return null;// there is a better descriptor already } - } catch (CoreException e) { - Activator.log(e); } - return new ProjectBasedLaunchDescriptor(this, (IProject) element, null); + return desc; } return null; } + /** + * Return true is a is better then b (which would eliminate b) + */ + protected boolean isBetter(ILaunchDescriptor a, ILaunchDescriptor b) { + if (a instanceof ProjectBasedLaunchDescriptor && b instanceof ProjectBasedLaunchDescriptor) { + ProjectBasedLaunchDescriptor pa = (ProjectBasedLaunchDescriptor) a; + ProjectBasedLaunchDescriptor pb = (ProjectBasedLaunchDescriptor) b; + if (pb.getProject().equals(pa.getProject()) + && pa.getLaunchConfigurationType().equals(pb.getLaunchConfigurationType()) + && pa.getLaunchConfiguration() != null + && pb.getLaunchConfiguration() == null) { + // a is for same project and same type, but actually have non-null configuraton + return true; + } + } + return false; + } + protected abstract IProject getProject(ILaunchConfiguration llc); }
\ No newline at end of file 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 6695f596d65..1025ac4cfbf 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 @@ -14,6 +14,7 @@ import java.util.ArrayList; import java.util.Collections; import java.util.Comparator; import java.util.HashMap; +import java.util.Iterator; import java.util.LinkedHashMap; import java.util.LinkedList; import java.util.List; @@ -60,7 +61,6 @@ public class LaunchBarManager extends PlatformObject implements ILaunchBarManage private ILaunchDescriptor activeLaunchDesc; private ILaunchMode activeLaunchMode; private ILaunchTarget activeLaunchTarget; - private static final String PREF_ACTIVE_CONFIG_DESC = "activeConfigDesc"; private static final String PREF_ACTIVE_LAUNCH_MODE = "activeLaunchMode"; private static final String PREF_ACTIVE_LAUNCH_TARGET = "activeLaunchTarget"; @@ -71,10 +71,7 @@ public class LaunchBarManager extends PlatformObject implements ILaunchBarManage IEclipsePreferences store = getPreferenceStore(); String activeConfigDescId = store.get(PREF_ACTIVE_CONFIG_DESC, null); String configDescIds = store.get(PREF_CONFIG_DESC_ORDER, Collections.EMPTY_LIST.toString()); - - loadExtensions(); - // Hook up the existing launch configurations and listen ILaunchManager launchManager = getLaunchManager(); for (ILaunchConfiguration configuration : launchManager.getLaunchConfigurations()) { @@ -83,16 +80,19 @@ public class LaunchBarManager extends PlatformObject implements ILaunchBarManage launchManager.addLaunchConfigurationListener(this); reorderDescriptors(configDescIds); // Now that all the descriptors are loaded, set the one - ILaunchDescriptor configDesc = descriptors.get(activeConfigDescId); + ILaunchDescriptor configDesc = getDescriptorById(activeConfigDescId); if (configDesc == null) { configDesc = getLastUsedDescriptor(); } setActiveLaunchDescriptor(configDesc); } - + + private ILaunchDescriptor getDescriptorById(String activeConfigDescId) { + return descriptors.get(activeConfigDescId); + } protected void loadExtensions() { - IExtensionPoint point = getExtensionPoint(); + IExtensionPoint point = getExtensionPoint(); IExtension[] extensions = point.getExtensions(); // first pass - targets and descriptors for (IExtension extension : extensions) { @@ -156,7 +156,6 @@ public class LaunchBarManager extends PlatformObject implements ILaunchBarManage Activator.log(e); // exceptions during extension loading, log and move on } } - } // third pass - object providers for (IExtension extension : extensions) { @@ -172,9 +171,7 @@ public class LaunchBarManager extends PlatformObject implements ILaunchBarManage } } } - } - - + } private void reorderDescriptors(String configDescIds) { configDescIds = configDescIds.replaceAll("[\\]\\[]", ""); @@ -182,7 +179,7 @@ public class LaunchBarManager extends PlatformObject implements ILaunchBarManage for (int i = 0; i < split.length; i++) { String string = split[i]; String id = string.trim(); - ILaunchDescriptor desc = descriptors.get(id); + ILaunchDescriptor desc = getDescriptorById(id); if (desc != null) { descriptors.remove(id); descriptors.put(id, desc); @@ -314,9 +311,9 @@ public class LaunchBarManager extends PlatformObject implements ILaunchBarManage // new object causes re-set of active descriptor too setActiveLaunchDescriptor(desc); } - return desc; - } + + } @Override public ILaunchDescriptor launchObjectAdded(Object element) { @@ -329,6 +326,11 @@ public class LaunchBarManager extends PlatformObject implements ILaunchBarManage } @Override + public ILaunchDescriptor getLaunchDescriptor(Object element) { + return objectDescriptorMap.get(element); + } + + @Override public ILaunchDescriptor launchObjectChanged(Object element) { Activator.trace("launch object changed " + element); // only applied to object that were added via launchObjectAdded @@ -367,19 +369,26 @@ public class LaunchBarManager extends PlatformObject implements ILaunchBarManage } @Override + public ILaunchDescriptor[] getOpenLaunchDescriptors() { + ArrayList<ILaunchDescriptor> values = new ArrayList<>(descriptors.values()); + for (Iterator<ILaunchDescriptor> iterator = values.iterator(); iterator.hasNext();) { + ILaunchDescriptor d = iterator.next(); + if (!d.isOpen()) + iterator.remove(); + } + Collections.reverse(values); + return values.toArray(new ILaunchDescriptor[values.size()]); + } + + @Override public ILaunchDescriptor[] getLaunchDescriptors() { // return descriptor in usage order (most used first). UI can sort them later as it wishes - ILaunchDescriptor[] descs = descriptors.values().toArray(new ILaunchDescriptor[descriptors.size()]); - // reverse - for (int i = 0; i < descs.length / 2; i++) { - ILaunchDescriptor ld = descs[i]; - int j = descs.length - 1 - i; - descs[i] = descs[j]; - descs[j] = ld; - } - return descs; + ArrayList<ILaunchDescriptor> values = new ArrayList<>(descriptors.values()); + Collections.reverse(values); + return values.toArray(new ILaunchDescriptor[values.size()]); } + @Override public ILaunchDescriptor getActiveLaunchDescriptor() { return activeLaunchDesc; @@ -400,7 +409,6 @@ public class LaunchBarManager extends PlatformObject implements ILaunchBarManage if (configDesc == null) configDesc = getLastUsedDescriptor(); // do not set to null unless no descriptors activeLaunchDesc = configDesc; - if (configDesc != null) { // keeps most used descriptor last descriptors.remove(configDesc.getId()); descriptors.put(configDesc.getId(), configDesc); @@ -409,7 +417,6 @@ public class LaunchBarManager extends PlatformObject implements ILaunchBarManage setPreference(getPreferenceStore(), PREF_ACTIVE_CONFIG_DESC, getId(activeLaunchDesc)); Activator.trace("new active config is stored " + configDesc); setPreference(getPreferenceStore(), PREF_CONFIG_DESC_ORDER, descriptors.keySet().toString()); - // Send notifications updateLaunchDescriptor(activeLaunchDesc); // Set active target @@ -426,9 +433,8 @@ public class LaunchBarManager extends PlatformObject implements ILaunchBarManage // checking active target if (activeLaunchTarget != null && supportsTargetType(activeLaunchDesc, activeLaunchTarget.getType())) return; // not changing target - // last stored target from persistent storage - String activeTargetId = getPerDescriptorStore().get(PREF_ACTIVE_LAUNCH_TARGET, null); + String activeTargetId = getPerDescriptorStore().get(PREF_ACTIVE_LAUNCH_TARGET, null); ILaunchTarget storedTarget = getLaunchTarget(activeTargetId); if (storedTarget != null && supportsTargetType(activeLaunchDesc, storedTarget.getType())) { setActiveLaunchTarget(storedTarget); @@ -436,14 +442,14 @@ public class LaunchBarManager extends PlatformObject implements ILaunchBarManage } // default target for descriptor setActiveLaunchTarget(getDeafultLaunchTarget(activeLaunchDesc)); - } + } protected void syncActiveMode() { if (activeLaunchDesc == null) { setActiveLaunchMode(null); return; } - ILaunchMode foundMode = null; + ILaunchMode foundMode = null; String storedModeId = getPerDescriptorStore().get(PREF_ACTIVE_LAUNCH_MODE, null); // last desc mode id String lastActiveModeId = activeLaunchMode == null ? null : activeLaunchMode.getIdentifier(); ILaunchMode[] supportedModes = getLaunchModes(); // this is based on active desc and target which are already set @@ -462,7 +468,7 @@ public class LaunchBarManager extends PlatformObject implements ILaunchBarManage } } setActiveLaunchMode(foundMode); - } + } public boolean supportsMode(ILaunchMode mode) { // check that active descriptor supports the given mode @@ -497,9 +503,9 @@ public class LaunchBarManager extends PlatformObject implements ILaunchBarManage } protected IEclipsePreferences getPreferenceStore() { - return InstanceScope.INSTANCE.getNode(Activator.PLUGIN_ID); - } - + return InstanceScope.INSTANCE.getNode(Activator.PLUGIN_ID); + } + @Override public void updateLaunchDescriptor(ILaunchDescriptor configDesc) { for (Listener listener : listeners) { @@ -603,7 +609,7 @@ public class LaunchBarManager extends PlatformObject implements ILaunchBarManage setPreference(getPerDescriptorStore(), PREF_ACTIVE_LAUNCH_TARGET, target.getId()); } - + @Override public void updateLaunchTarget(ILaunchTarget target) { for (Listener listener : listeners) { @@ -744,4 +750,16 @@ public class LaunchBarManager extends PlatformObject implements ILaunchBarManage public void launchConfigurationChanged(ILaunchConfiguration configuration) { // Nothing to do on changes } + + public void dispose() { + ILaunchManager launchManager = getLaunchManager(); + launchManager.removeLaunchConfigurationListener(this); + for (ILaunchObjectProvider o : objectProviders) { + try { + o.dispose(); + } catch (Exception e) { + Activator.log(e); + } + } + } } diff --git a/launch/org.eclipse.cdt.launchbar.core/src/org/eclipse/cdt/launchbar/core/internal/ProjectLaunchObjectProvider.java b/launch/org.eclipse.cdt.launchbar.core/src/org/eclipse/cdt/launchbar/core/internal/ProjectLaunchObjectProvider.java index 8d06be2c25f..300da7028ea 100644 --- a/launch/org.eclipse.cdt.launchbar.core/src/org/eclipse/cdt/launchbar/core/internal/ProjectLaunchObjectProvider.java +++ b/launch/org.eclipse.cdt.launchbar.core/src/org/eclipse/cdt/launchbar/core/internal/ProjectLaunchObjectProvider.java @@ -1,3 +1,14 @@ +/******************************************************************************* + * Copyright (c) 2014 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 + * http://www.eclipse.org/legal/epl-v10.html + * + * Contributors: + * Doug Schaefer - Initial API and implementation + * Alena Laskavaia + *******************************************************************************/ package org.eclipse.cdt.launchbar.core.internal; import org.eclipse.cdt.launchbar.core.ILaunchBarManager; @@ -14,13 +25,11 @@ import org.eclipse.core.resources.ResourcesPlugin; import org.eclipse.core.runtime.CoreException; public class ProjectLaunchObjectProvider implements ILaunchObjectProvider, IResourceChangeListener { - private ILaunchBarManager manager; @Override public void init(ILaunchBarManager manager) { this.manager = manager; - try { for (IProject project : ResourcesPlugin.getWorkspace().getRoot().getProjects()) { manager.launchObjectAdded(project); @@ -28,7 +37,6 @@ public class ProjectLaunchObjectProvider implements ILaunchObjectProvider, IReso } catch (CoreException e) { Activator.log(e.getStatus()); } - ResourcesPlugin.getWorkspace().addResourceChangeListener(this, IResourceChangeEvent.POST_CHANGE); } @@ -45,12 +53,14 @@ public class ProjectLaunchObjectProvider implements ILaunchObjectProvider, IReso public boolean visit(IResourceDelta delta) throws CoreException { IResource res = delta.getResource(); if (res instanceof IProject) { - IProject project = (IProject) delta.getResource(); + IProject project = (IProject) res; int kind = delta.getKind(); if ((kind & IResourceDelta.ADDED) != 0) { manager.launchObjectAdded(project); } else if ((kind & IResourceDelta.REMOVED) != 0) { manager.launchObjectRemoved(project); + } else if ((kind & IResourceDelta.CHANGED) != 0) { + manager.launchObjectChanged(project); } return false; } else if (res instanceof IFile || res instanceof IFolder) { @@ -63,5 +73,4 @@ public class ProjectLaunchObjectProvider implements ILaunchObjectProvider, IReso Activator.log(e.getStatus()); } } - } diff --git a/launch/org.eclipse.cdt.launchbar.ui/src/org/eclipse/cdt/launchbar/ui/internal/controls/ConfigSelector.java b/launch/org.eclipse.cdt.launchbar.ui/src/org/eclipse/cdt/launchbar/ui/internal/controls/ConfigSelector.java index f00b02e5c33..bbb320269c2 100644 --- a/launch/org.eclipse.cdt.launchbar.ui/src/org/eclipse/cdt/launchbar/ui/internal/controls/ConfigSelector.java +++ b/launch/org.eclipse.cdt.launchbar.ui/src/org/eclipse/cdt/launchbar/ui/internal/controls/ConfigSelector.java @@ -82,28 +82,24 @@ public class ConfigSelector extends CSelector { } @Override public Object[] getElements(Object inputElement) { - try { - ILaunchDescriptor[] descs = getManager().getLaunchDescriptors(); - if (descs.length > 0) { - if (descs.length > SEPARATOR_INDEX + 1) { - ILaunchDescriptor[] descsCopy = new ILaunchDescriptor[SEPARATOR_INDEX + descs.length]; - System.arraycopy(descs, 0, descsCopy, 0, SEPARATOR_INDEX); // copy first 3 elements - System.arraycopy(descs, 0, descsCopy, SEPARATOR_INDEX, descs.length); // copy all into rest - // sort rest - Arrays.sort(descsCopy, SEPARATOR_INDEX, descsCopy.length, new Comparator<ILaunchDescriptor>() { - @Override - public int compare(ILaunchDescriptor o1, ILaunchDescriptor o2) { - return o1.getName().compareTo(o2.getName()); - } - }); - return descsCopy; - } else - return descs; - } - } catch (CoreException e) { - Activator.log(e.getStatus()); + ILaunchDescriptor[] descs = getManager().getOpenLaunchDescriptors(); + if (descs.length > 0) { + if (descs.length > SEPARATOR_INDEX + 1) { + ILaunchDescriptor[] descsCopy = new ILaunchDescriptor[SEPARATOR_INDEX + descs.length]; + System.arraycopy(descs, 0, descsCopy, 0, SEPARATOR_INDEX); // copy first 3 elements + System.arraycopy(descs, 0, descsCopy, SEPARATOR_INDEX, descs.length); // copy all into rest + // sort rest + Arrays.sort(descsCopy, SEPARATOR_INDEX, descsCopy.length, new Comparator<ILaunchDescriptor>() { + @Override + public int compare(ILaunchDescriptor o1, ILaunchDescriptor o2) { + return o1.getName().compareTo(o2.getName()); + } + }); + return descsCopy; + } else + return descs; } - return noConfigs; + return noConfigs; } }); |