diff --git a/bundles/org.eclipse.launchbar.core/plugin.xml b/bundles/org.eclipse.launchbar.core/plugin.xml
index a85371f601e..13b7ef1dfd0 100644
--- a/bundles/org.eclipse.launchbar.core/plugin.xml
+++ b/bundles/org.eclipse.launchbar.core/plugin.xml
@@ -33,5 +33,15 @@
provider="org.eclipse.launchbar.core.internal.target.LocalLaunchTargetProvider">
+
+
+
+
diff --git a/bundles/org.eclipse.launchbar.core/src/org/eclipse/launchbar/core/internal/target/LaunchTargetPropertyTester.java b/bundles/org.eclipse.launchbar.core/src/org/eclipse/launchbar/core/internal/target/LaunchTargetPropertyTester.java
new file mode 100644
index 00000000000..82269f5abf5
--- /dev/null
+++ b/bundles/org.eclipse.launchbar.core/src/org/eclipse/launchbar/core/internal/target/LaunchTargetPropertyTester.java
@@ -0,0 +1,25 @@
+/*******************************************************************************
+ * Copyright (c) 2016 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
+ *******************************************************************************/
+package org.eclipse.launchbar.core.internal.target;
+
+import org.eclipse.core.expressions.PropertyTester;
+import org.eclipse.launchbar.core.target.ILaunchTarget;
+
+public class LaunchTargetPropertyTester extends PropertyTester {
+
+ @Override
+ public boolean test(Object receiver, String property, Object[] args, Object expectedValue) {
+ if (receiver instanceof ILaunchTarget) {
+ if (property.equals("launchTargetType")) { //$NON-NLS-1$
+ return ((ILaunchTarget) receiver).getTypeId().equals(expectedValue);
+ }
+ }
+ return false;
+ }
+
+}
diff --git a/bundles/org.eclipse.launchbar.core/src/org/eclipse/launchbar/core/internal/target/LaunchTargetWorkingCopy.java b/bundles/org.eclipse.launchbar.core/src/org/eclipse/launchbar/core/internal/target/LaunchTargetWorkingCopy.java
index 380b5ce2985..b256188df89 100644
--- a/bundles/org.eclipse.launchbar.core/src/org/eclipse/launchbar/core/internal/target/LaunchTargetWorkingCopy.java
+++ b/bundles/org.eclipse.launchbar.core/src/org/eclipse/launchbar/core/internal/target/LaunchTargetWorkingCopy.java
@@ -13,6 +13,7 @@ import java.util.Map;
import org.eclipse.core.runtime.PlatformObject;
import org.eclipse.launchbar.core.internal.Activator;
import org.eclipse.launchbar.core.target.ILaunchTarget;
+import org.eclipse.launchbar.core.target.ILaunchTargetManager;
import org.eclipse.launchbar.core.target.ILaunchTargetWorkingCopy;
import org.osgi.service.prefs.BackingStoreException;
@@ -20,6 +21,7 @@ public class LaunchTargetWorkingCopy extends PlatformObject implements ILaunchTa
private final LaunchTarget original;
private final Map changes = new HashMap<>();
+ private String newId;
public LaunchTargetWorkingCopy(LaunchTarget original) {
this.original = original;
@@ -37,7 +39,12 @@ public class LaunchTargetWorkingCopy extends PlatformObject implements ILaunchTa
@Override
public String getId() {
- return original.getId();
+ return newId != null ? newId : original.getId();
+ }
+
+ @Override
+ public void setId(String id) {
+ newId = id;
}
@Override
@@ -62,14 +69,29 @@ public class LaunchTargetWorkingCopy extends PlatformObject implements ILaunchTa
@Override
public ILaunchTarget save() {
try {
- for (Map.Entry entry : changes.entrySet()) {
- original.attributes.put(entry.getKey(), entry.getValue());
+ LaunchTarget target;
+ if (newId == null) {
+ target = original;
+ } else {
+ // make a new one and remove the old one
+ ILaunchTargetManager manager = Activator.getLaunchTargetManager();
+ target = (LaunchTarget) manager.addLaunchTarget(original.getTypeId(), newId);
+ for (String key : original.attributes.keys()) {
+ target.attributes.put(key, original.getAttribute(key, "")); //$NON-NLS-1$
+ }
+ manager.removeLaunchTarget(original);
}
- original.attributes.flush();
+
+ // set the changed attributes
+ for (Map.Entry entry : changes.entrySet()) {
+ target.attributes.put(entry.getKey(), entry.getValue());
+ }
+ target.attributes.flush();
+ return target;
} catch (BackingStoreException e) {
Activator.log(e);
+ return original;
}
- return original;
}
}
diff --git a/bundles/org.eclipse.launchbar.core/src/org/eclipse/launchbar/core/target/ILaunchTarget.java b/bundles/org.eclipse.launchbar.core/src/org/eclipse/launchbar/core/target/ILaunchTarget.java
index 9aee390223c..6cb14a1fb4d 100644
--- a/bundles/org.eclipse.launchbar.core/src/org/eclipse/launchbar/core/target/ILaunchTarget.java
+++ b/bundles/org.eclipse.launchbar.core/src/org/eclipse/launchbar/core/target/ILaunchTarget.java
@@ -65,8 +65,8 @@ public interface ILaunchTarget extends IAdaptable {
String getAttribute(String key, String defValue);
/**
- * Create a working copy of this launch target to allow setting of attributes. Note that when
- * saving the attributes this target is updated. A new one is not created.
+ * Create a working copy of this launch target to allow setting of attributes. It also allows
+ * changing the id, which results in a new launch target when saved.
*
* @return launch target working copy
*/
diff --git a/bundles/org.eclipse.launchbar.core/src/org/eclipse/launchbar/core/target/ILaunchTargetWorkingCopy.java b/bundles/org.eclipse.launchbar.core/src/org/eclipse/launchbar/core/target/ILaunchTargetWorkingCopy.java
index f425270a7cf..25823e2a15e 100644
--- a/bundles/org.eclipse.launchbar.core/src/org/eclipse/launchbar/core/target/ILaunchTargetWorkingCopy.java
+++ b/bundles/org.eclipse.launchbar.core/src/org/eclipse/launchbar/core/target/ILaunchTargetWorkingCopy.java
@@ -19,6 +19,14 @@ public interface ILaunchTargetWorkingCopy extends ILaunchTarget {
*/
ILaunchTarget getOriginal();
+ /**
+ * Gives the target a new ID. The save method will return a new target with the given name.e
+ *
+ * @param id
+ * new target ID
+ */
+ void setId(String id);
+
/**
* Set an attribute.
*
@@ -30,9 +38,9 @@ public interface ILaunchTargetWorkingCopy extends ILaunchTarget {
void setAttribute(String key, String value);
/**
- * Save the changed attributes to the original working copy.
+ * Save the changes to the original working copy.
*
- * @return original launch target
+ * @return original launch target unless the id was changed in which case returns a new target
*/
ILaunchTarget save();