diff --git a/launch/org.eclipse.cdt.launchbar.core/src/org/eclipse/cdt/launchbar/core/DefaultLaunchDescriptor.java b/launch/org.eclipse.cdt.launchbar.core/src/org/eclipse/cdt/launchbar/core/DefaultLaunchDescriptor.java index 0b21fe150b0..dc1073e1947 100644 --- a/launch/org.eclipse.cdt.launchbar.core/src/org/eclipse/cdt/launchbar/core/DefaultLaunchDescriptor.java +++ b/launch/org.eclipse.cdt.launchbar.core/src/org/eclipse/cdt/launchbar/core/DefaultLaunchDescriptor.java @@ -13,7 +13,6 @@ package org.eclipse.cdt.launchbar.core; import org.eclipse.debug.core.ILaunchConfiguration; public class DefaultLaunchDescriptor implements ILaunchDescriptor { - private final ILaunchDescriptorType type; private final ILaunchConfiguration config; @@ -36,4 +35,26 @@ public class DefaultLaunchDescriptor implements ILaunchDescriptor { return config; } + public String getId() { + return config.getName() + "." + type.getId(); + } + + @Override + public int hashCode() { + return 17 + getId().hashCode(); + } + + @Override + public boolean equals(Object obj) { + if (this == obj) + return true; + if (obj == null) + return false; + if (!(obj instanceof DefaultLaunchDescriptor)) + return false; + DefaultLaunchDescriptor other = (DefaultLaunchDescriptor) obj; + if (!getId().equals(other.getId())) + return false; + return true; + } } 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 9fde3bdac57..303ca4616b3 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 @@ -23,6 +23,13 @@ public interface ILaunchDescriptor { */ String getName(); + /** + * Unique id of the descriptor (globally) + * + * @return the non null string representing id of the launch descriptor + */ + String getId(); + /** * The type of launch descriptor. * 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 b36ea138c5f..39bf4d9141c 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 @@ -139,7 +139,7 @@ public class LaunchBarManager extends PlatformObject implements ILaunchBarManage // Load up the active from the preferences before loading the descriptors IEclipsePreferences store = InstanceScope.INSTANCE.getNode(Activator.PLUGIN_ID); - String activeConfigDescName = store.get(PREF_ACTIVE_CONFIG_DESC, null); + String activeConfigDescId = store.get(PREF_ACTIVE_CONFIG_DESC, null); for (ILaunchDescriptorType descriptorType : descriptorTypes) { descriptorType.init(this); @@ -167,12 +167,12 @@ public class LaunchBarManager extends PlatformObject implements ILaunchBarManage launchManager.addLaunchConfigurationListener(this); // Now that all the descriptors are loaded, set the one - if (activeConfigDescName == null && !descriptors.isEmpty()) { - activeConfigDescName = descriptors.values().iterator().next().getName(); + if (activeConfigDescId == null && !descriptors.isEmpty()) { + activeConfigDescId = getId(descriptors.values().iterator().next()); } - if (activeConfigDescName != null) { - ILaunchDescriptor configDesc = descriptors.get(activeConfigDescName); + if (activeConfigDescId != null) { + ILaunchDescriptor configDesc = descriptors.get(activeConfigDescId); if (configDesc != null) { setActiveLaunchDescriptor(configDesc); } @@ -189,8 +189,13 @@ public class LaunchBarManager extends PlatformObject implements ILaunchBarManage try { if (descriptorType.ownsLaunchObject(element)) { desc = descriptorType.getDescriptor(element); - if (desc != null) { - descriptors.put(desc.getName(), desc); + if (desc != null) { // own the object but do not create descriptor to ignore it + String id = getId(desc); + ILaunchDescriptor old = descriptors.get(id); + if (old != null && !desc.equals(old)) + throw new IllegalStateException( + "Name of descriptor must be unique within same type (or descriptors with same name must be equal)"); + descriptors.put(id, desc); objectDescriptorMap.put(element, desc); setActiveLaunchDescriptor(desc); return desc; @@ -204,11 +209,15 @@ public class LaunchBarManager extends PlatformObject implements ILaunchBarManage return null; } + private String getId(ILaunchDescriptor desc) { + return desc.getId(); + } + @Override public void launchObjectRemoved(Object element) throws CoreException { ILaunchDescriptor desc = objectDescriptorMap.get(element); if (desc != null) { - descriptors.remove(desc.getName()); + descriptors.remove(getId(desc)); objectDescriptorMap.remove(element); if (desc.equals(activeLaunchDesc)) { // Roll back to the last one and make sure we don't come back @@ -245,7 +254,7 @@ public class LaunchBarManager extends PlatformObject implements ILaunchBarManage IEclipsePreferences store = InstanceScope.INSTANCE.getNode(Activator.PLUGIN_ID); if (activeLaunchDesc != null) { - store.put(PREF_ACTIVE_CONFIG_DESC, activeLaunchDesc.getName()); + store.put(PREF_ACTIVE_CONFIG_DESC, getId(activeLaunchDesc)); } else { store.remove(PREF_ACTIVE_CONFIG_DESC); }