mirror of
https://github.com/eclipse-cdt/cdt
synced 2025-06-06 17:26:01 +02:00
Serial Flash Target and Launch. Clean up Generic Launch.
Adds target, launch classes, and launch bar support for targets intended to upload their code to flash using a Serial Port. The port is co-ordinated with the Serial Terminal so that the terminal is paused during the upload. Also cleaned up the Generic Launch so it's not using the External Tools launch which has a number of UX issues. This simplifies the settings and gives us more control. And it's made reusable for the Serial Flash launch. Change-Id: I31e9970243fbf1cf22d027bbdb892fde104dbefe
This commit is contained in:
parent
f1f9ddf0f7
commit
15c8bad95d
46 changed files with 2052 additions and 162 deletions
17
cross/org.eclipse.cdt.launch.serial-feature/.project
Normal file
17
cross/org.eclipse.cdt.launch.serial-feature/.project
Normal file
|
@ -0,0 +1,17 @@
|
||||||
|
<?xml version="1.0" encoding="UTF-8"?>
|
||||||
|
<projectDescription>
|
||||||
|
<name>org.eclipse.cdt.launch.serial-feature</name>
|
||||||
|
<comment></comment>
|
||||||
|
<projects>
|
||||||
|
</projects>
|
||||||
|
<buildSpec>
|
||||||
|
<buildCommand>
|
||||||
|
<name>org.eclipse.pde.FeatureBuilder</name>
|
||||||
|
<arguments>
|
||||||
|
</arguments>
|
||||||
|
</buildCommand>
|
||||||
|
</buildSpec>
|
||||||
|
<natures>
|
||||||
|
<nature>org.eclipse.pde.FeatureNature</nature>
|
||||||
|
</natures>
|
||||||
|
</projectDescription>
|
|
@ -0,0 +1 @@
|
||||||
|
bin.includes = feature.xml
|
32
cross/org.eclipse.cdt.launch.serial-feature/feature.xml
Normal file
32
cross/org.eclipse.cdt.launch.serial-feature/feature.xml
Normal file
|
@ -0,0 +1,32 @@
|
||||||
|
<?xml version="1.0" encoding="UTF-8"?>
|
||||||
|
<feature
|
||||||
|
id="org.eclipse.cdt.launch.serial.feature"
|
||||||
|
label="Launch over Serial"
|
||||||
|
version="1.0.0.qualifier">
|
||||||
|
|
||||||
|
<description url="http://www.example.com/description">
|
||||||
|
[Enter Feature Description here.]
|
||||||
|
</description>
|
||||||
|
|
||||||
|
<copyright url="http://www.example.com/copyright">
|
||||||
|
[Enter Copyright Description here.]
|
||||||
|
</copyright>
|
||||||
|
|
||||||
|
<license url="http://www.example.com/license">
|
||||||
|
[Enter License Description here.]
|
||||||
|
</license>
|
||||||
|
|
||||||
|
<plugin
|
||||||
|
id="org.eclipse.cdt.launch.serial.ui"
|
||||||
|
download-size="0"
|
||||||
|
install-size="0"
|
||||||
|
version="0.0.0"
|
||||||
|
unpack="false"/>
|
||||||
|
|
||||||
|
<plugin
|
||||||
|
id="org.eclipse.cdt.launch.serial.core"
|
||||||
|
download-size="0"
|
||||||
|
install-size="0"
|
||||||
|
version="0.0.0"/>
|
||||||
|
|
||||||
|
</feature>
|
7
cross/org.eclipse.cdt.launch.serial.core/.classpath
Normal file
7
cross/org.eclipse.cdt.launch.serial.core/.classpath
Normal file
|
@ -0,0 +1,7 @@
|
||||||
|
<?xml version="1.0" encoding="UTF-8"?>
|
||||||
|
<classpath>
|
||||||
|
<classpathentry kind="con" path="org.eclipse.jdt.launching.JRE_CONTAINER/org.eclipse.jdt.internal.debug.ui.launcher.StandardVMType/JavaSE-1.8"/>
|
||||||
|
<classpathentry kind="con" path="org.eclipse.pde.core.requiredPlugins"/>
|
||||||
|
<classpathentry kind="src" path="src"/>
|
||||||
|
<classpathentry kind="output" path="bin"/>
|
||||||
|
</classpath>
|
28
cross/org.eclipse.cdt.launch.serial.core/.project
Normal file
28
cross/org.eclipse.cdt.launch.serial.core/.project
Normal file
|
@ -0,0 +1,28 @@
|
||||||
|
<?xml version="1.0" encoding="UTF-8"?>
|
||||||
|
<projectDescription>
|
||||||
|
<name>org.eclipse.cdt.launch.serial.core</name>
|
||||||
|
<comment></comment>
|
||||||
|
<projects>
|
||||||
|
</projects>
|
||||||
|
<buildSpec>
|
||||||
|
<buildCommand>
|
||||||
|
<name>org.eclipse.jdt.core.javabuilder</name>
|
||||||
|
<arguments>
|
||||||
|
</arguments>
|
||||||
|
</buildCommand>
|
||||||
|
<buildCommand>
|
||||||
|
<name>org.eclipse.pde.ManifestBuilder</name>
|
||||||
|
<arguments>
|
||||||
|
</arguments>
|
||||||
|
</buildCommand>
|
||||||
|
<buildCommand>
|
||||||
|
<name>org.eclipse.pde.SchemaBuilder</name>
|
||||||
|
<arguments>
|
||||||
|
</arguments>
|
||||||
|
</buildCommand>
|
||||||
|
</buildSpec>
|
||||||
|
<natures>
|
||||||
|
<nature>org.eclipse.pde.PluginNature</nature>
|
||||||
|
<nature>org.eclipse.jdt.core.javanature</nature>
|
||||||
|
</natures>
|
||||||
|
</projectDescription>
|
|
@ -0,0 +1,7 @@
|
||||||
|
eclipse.preferences.version=1
|
||||||
|
org.eclipse.jdt.core.compiler.codegen.inlineJsrBytecode=enabled
|
||||||
|
org.eclipse.jdt.core.compiler.codegen.targetPlatform=1.8
|
||||||
|
org.eclipse.jdt.core.compiler.compliance=1.8
|
||||||
|
org.eclipse.jdt.core.compiler.problem.assertIdentifier=error
|
||||||
|
org.eclipse.jdt.core.compiler.problem.enumIdentifier=error
|
||||||
|
org.eclipse.jdt.core.compiler.source=1.8
|
|
@ -0,0 +1,16 @@
|
||||||
|
Manifest-Version: 1.0
|
||||||
|
Bundle-ManifestVersion: 2
|
||||||
|
Bundle-Name: Launch over Serial Core Plugin
|
||||||
|
Bundle-SymbolicName: org.eclipse.cdt.launch.serial.core;singleton:=true
|
||||||
|
Bundle-Version: 1.0.0.qualifier
|
||||||
|
Bundle-Vendor: Eclipse CDT
|
||||||
|
Bundle-RequiredExecutionEnvironment: JavaSE-1.8
|
||||||
|
Require-Bundle: org.eclipse.core.runtime;bundle-version="3.13.0",
|
||||||
|
org.eclipse.debug.core;bundle-version="3.11.0",
|
||||||
|
org.eclipse.launchbar.core;bundle-version="2.2.0",
|
||||||
|
org.eclipse.cdt.core;bundle-version="6.4.0",
|
||||||
|
org.eclipse.cdt.debug.core;bundle-version="8.3.0",
|
||||||
|
org.eclipse.cdt.native.serial;bundle-version="1.1.0"
|
||||||
|
Export-Package: org.eclipse.cdt.launch.serial
|
||||||
|
Bundle-Activator: org.eclipse.cdt.launch.serial.internal.Activator
|
||||||
|
Bundle-ActivationPolicy: lazy
|
|
@ -0,0 +1,5 @@
|
||||||
|
source.. = src/
|
||||||
|
output.. = bin/
|
||||||
|
bin.includes = META-INF/,\
|
||||||
|
.,\
|
||||||
|
plugin.xml
|
29
cross/org.eclipse.cdt.launch.serial.core/plugin.xml
Normal file
29
cross/org.eclipse.cdt.launch.serial.core/plugin.xml
Normal file
|
@ -0,0 +1,29 @@
|
||||||
|
<?xml version="1.0" encoding="UTF-8"?>
|
||||||
|
<?eclipse version="3.4"?>
|
||||||
|
<plugin>
|
||||||
|
<extension
|
||||||
|
point="org.eclipse.debug.core.launchConfigurationTypes">
|
||||||
|
<launchConfigurationType
|
||||||
|
delegate="org.eclipse.cdt.launch.serial.internal.SerialFlashLaunchConfigDelegate"
|
||||||
|
id="org.eclipse.cdt.launch.serial.launchConfigurationType"
|
||||||
|
modes="run"
|
||||||
|
name="Launch over Serial">
|
||||||
|
</launchConfigurationType>
|
||||||
|
</extension>
|
||||||
|
<extension
|
||||||
|
point="org.eclipse.launchbar.core.launchTargetTypes">
|
||||||
|
<launchTargetType
|
||||||
|
id="org.eclipse.cdt.launch.serial.core.serialFlashTarget"
|
||||||
|
provider="org.eclipse.cdt.launch.serial.SerialFlashLaunchTargetProvider">
|
||||||
|
</launchTargetType>
|
||||||
|
</extension>
|
||||||
|
<extension
|
||||||
|
point="org.eclipse.launchbar.core.launchBarContributions">
|
||||||
|
<configProvider
|
||||||
|
class="org.eclipse.cdt.launch.serial.internal.SerialFlashLaunchConfigProvider"
|
||||||
|
descriptorType="org.eclipse.cdt.debug.core.coreBuildDescriptorType"
|
||||||
|
priority="10">
|
||||||
|
</configProvider>
|
||||||
|
</extension>
|
||||||
|
|
||||||
|
</plugin>
|
|
@ -0,0 +1,36 @@
|
||||||
|
/*******************************************************************************
|
||||||
|
* Copyright (c) 2017 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.cdt.launch.serial;
|
||||||
|
|
||||||
|
import org.eclipse.launchbar.core.target.ILaunchTarget;
|
||||||
|
import org.eclipse.launchbar.core.target.ILaunchTargetManager;
|
||||||
|
import org.eclipse.launchbar.core.target.ILaunchTargetProvider;
|
||||||
|
import org.eclipse.launchbar.core.target.TargetStatus;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Launch Target used to flash images to a device over a serial port, usually
|
||||||
|
* USB serial.
|
||||||
|
*/
|
||||||
|
public class SerialFlashLaunchTargetProvider implements ILaunchTargetProvider {
|
||||||
|
|
||||||
|
public static final String TYPE_ID = "org.eclipse.cdt.launch.serial.core.serialFlashTarget"; //$NON-NLS-1$
|
||||||
|
|
||||||
|
public static final String ATTR_SERIAL_PORT = "org.eclipse.cdt.launch.serial.core.serialPort"; //$NON-NLS-1$
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void init(ILaunchTargetManager targetManager) {
|
||||||
|
// Nothing to do at init time
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public TargetStatus getStatus(ILaunchTarget target) {
|
||||||
|
// Always OK
|
||||||
|
return TargetStatus.OK_STATUS;
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
|
@ -0,0 +1,30 @@
|
||||||
|
/*******************************************************************************
|
||||||
|
* Copyright (c) 2017 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.cdt.launch.serial.internal;
|
||||||
|
|
||||||
|
import org.eclipse.core.runtime.IStatus;
|
||||||
|
import org.eclipse.core.runtime.Plugin;
|
||||||
|
import org.osgi.framework.BundleContext;
|
||||||
|
|
||||||
|
public class Activator extends Plugin {
|
||||||
|
|
||||||
|
public static final String PLUGIN_ID = "org.eclipse.cdt.launch.serial.core"; //$NON-NLS-1$
|
||||||
|
|
||||||
|
private static Activator plugin;
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void start(BundleContext context) throws Exception {
|
||||||
|
super.start(context);
|
||||||
|
plugin = this;
|
||||||
|
}
|
||||||
|
|
||||||
|
public static void log(IStatus status) {
|
||||||
|
plugin.getLog().log(status);
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
|
@ -0,0 +1,23 @@
|
||||||
|
/*******************************************************************************
|
||||||
|
* Copyright (c) 2017 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.cdt.launch.serial.internal;
|
||||||
|
|
||||||
|
import org.eclipse.osgi.util.NLS;
|
||||||
|
|
||||||
|
public class Messages extends NLS {
|
||||||
|
private static final String BUNDLE_NAME = "org.eclipse.cdt.launch.serial.internal.messages"; //$NON-NLS-1$
|
||||||
|
public static String SerialFlashLaunch_Pause;
|
||||||
|
public static String SerialFlashLaunch_Resume;
|
||||||
|
static {
|
||||||
|
// initialize resource bundle
|
||||||
|
NLS.initializeMessages(BUNDLE_NAME, Messages.class);
|
||||||
|
}
|
||||||
|
|
||||||
|
private Messages() {
|
||||||
|
}
|
||||||
|
}
|
|
@ -0,0 +1,67 @@
|
||||||
|
/*******************************************************************************
|
||||||
|
* Copyright (c) 2017 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.cdt.launch.serial.internal;
|
||||||
|
|
||||||
|
import java.io.IOException;
|
||||||
|
|
||||||
|
import org.eclipse.cdt.launch.serial.SerialFlashLaunchTargetProvider;
|
||||||
|
import org.eclipse.cdt.serial.SerialPort;
|
||||||
|
import org.eclipse.core.runtime.IStatus;
|
||||||
|
import org.eclipse.core.runtime.Status;
|
||||||
|
import org.eclipse.debug.core.DebugEvent;
|
||||||
|
import org.eclipse.debug.core.DebugPlugin;
|
||||||
|
import org.eclipse.debug.core.ILaunchConfiguration;
|
||||||
|
import org.eclipse.debug.core.model.ISourceLocator;
|
||||||
|
import org.eclipse.launchbar.core.target.ILaunchTarget;
|
||||||
|
import org.eclipse.launchbar.core.target.launch.TargetedLaunch;
|
||||||
|
|
||||||
|
public class SerialFlashLaunch extends TargetedLaunch {
|
||||||
|
|
||||||
|
private SerialPort serialPort;
|
||||||
|
private boolean wasOpen;
|
||||||
|
|
||||||
|
public SerialFlashLaunch(ILaunchConfiguration launchConfiguration, String mode, ISourceLocator locator,
|
||||||
|
ILaunchTarget target) {
|
||||||
|
super(launchConfiguration, mode, target, locator);
|
||||||
|
String serialPortName = target.getAttribute(SerialFlashLaunchTargetProvider.ATTR_SERIAL_PORT, ""); //$NON-NLS-1$
|
||||||
|
if (!serialPortName.isEmpty()) {
|
||||||
|
serialPort = SerialPort.get(serialPortName);
|
||||||
|
}
|
||||||
|
|
||||||
|
DebugPlugin.getDefault().addDebugEventListener(this);
|
||||||
|
}
|
||||||
|
|
||||||
|
public void start() {
|
||||||
|
if (serialPort != null) {
|
||||||
|
wasOpen = serialPort.isOpen();
|
||||||
|
if (wasOpen) {
|
||||||
|
try {
|
||||||
|
serialPort.pause();
|
||||||
|
} catch (IOException e) {
|
||||||
|
Activator.log(new Status(IStatus.ERROR, Activator.PLUGIN_ID, Messages.SerialFlashLaunch_Pause, e));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
wasOpen = false;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void handleDebugEvents(DebugEvent[] events) {
|
||||||
|
super.handleDebugEvents(events);
|
||||||
|
if (isTerminated() && wasOpen) {
|
||||||
|
try {
|
||||||
|
serialPort.resume();
|
||||||
|
} catch (IOException e) {
|
||||||
|
Activator.log(new Status(IStatus.ERROR, Activator.PLUGIN_ID, Messages.SerialFlashLaunch_Resume, e));
|
||||||
|
}
|
||||||
|
wasOpen = false;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
|
@ -0,0 +1,37 @@
|
||||||
|
/*******************************************************************************
|
||||||
|
* Copyright (c) 2017 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.cdt.launch.serial.internal;
|
||||||
|
|
||||||
|
import org.eclipse.cdt.debug.core.launch.CoreBuildGenericLaunchConfigDelegate;
|
||||||
|
import org.eclipse.core.runtime.CoreException;
|
||||||
|
import org.eclipse.core.runtime.IProgressMonitor;
|
||||||
|
import org.eclipse.debug.core.ILaunch;
|
||||||
|
import org.eclipse.debug.core.ILaunchConfiguration;
|
||||||
|
import org.eclipse.launchbar.core.target.ILaunchTarget;
|
||||||
|
import org.eclipse.launchbar.core.target.launch.ITargetedLaunch;
|
||||||
|
|
||||||
|
public class SerialFlashLaunchConfigDelegate extends CoreBuildGenericLaunchConfigDelegate {
|
||||||
|
|
||||||
|
public static final String TYPE_ID = "org.eclipse.cdt.launch.serial.launchConfigurationType"; //$NON-NLS-1$
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public ITargetedLaunch getLaunch(ILaunchConfiguration configuration, String mode, ILaunchTarget target)
|
||||||
|
throws CoreException {
|
||||||
|
return new SerialFlashLaunch(configuration, mode, null, target);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void launch(ILaunchConfiguration configuration, String mode, ILaunch launch, IProgressMonitor monitor)
|
||||||
|
throws CoreException {
|
||||||
|
// Start the launch (pause the serial port)
|
||||||
|
((SerialFlashLaunch) launch).start();
|
||||||
|
|
||||||
|
super.launch(configuration, mode, launch, monitor);
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
|
@ -0,0 +1,32 @@
|
||||||
|
/*******************************************************************************
|
||||||
|
* Copyright (c) 2017 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.cdt.launch.serial.internal;
|
||||||
|
|
||||||
|
import org.eclipse.cdt.debug.core.launch.CoreBuildGenericLaunchConfigProvider;
|
||||||
|
import org.eclipse.cdt.launch.serial.SerialFlashLaunchTargetProvider;
|
||||||
|
import org.eclipse.core.runtime.CoreException;
|
||||||
|
import org.eclipse.debug.core.DebugPlugin;
|
||||||
|
import org.eclipse.debug.core.ILaunchConfigurationType;
|
||||||
|
import org.eclipse.launchbar.core.ILaunchDescriptor;
|
||||||
|
import org.eclipse.launchbar.core.target.ILaunchTarget;
|
||||||
|
|
||||||
|
public class SerialFlashLaunchConfigProvider extends CoreBuildGenericLaunchConfigProvider {
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public boolean supports(ILaunchDescriptor descriptor, ILaunchTarget target) throws CoreException {
|
||||||
|
return target.getTypeId().equals(SerialFlashLaunchTargetProvider.TYPE_ID);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public ILaunchConfigurationType getLaunchConfigurationType(ILaunchDescriptor descriptor, ILaunchTarget target)
|
||||||
|
throws CoreException {
|
||||||
|
return DebugPlugin.getDefault().getLaunchManager()
|
||||||
|
.getLaunchConfigurationType(SerialFlashLaunchConfigDelegate.TYPE_ID);
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
|
@ -0,0 +1,9 @@
|
||||||
|
################################################################################
|
||||||
|
# Copyright (c) 2017 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
|
||||||
|
################################################################################
|
||||||
|
SerialFlashLaunch_Pause=Pausing serial port
|
||||||
|
SerialFlashLaunch_Resume=Resuming serial port
|
7
cross/org.eclipse.cdt.launch.serial.ui/.classpath
Normal file
7
cross/org.eclipse.cdt.launch.serial.ui/.classpath
Normal file
|
@ -0,0 +1,7 @@
|
||||||
|
<?xml version="1.0" encoding="UTF-8"?>
|
||||||
|
<classpath>
|
||||||
|
<classpathentry kind="con" path="org.eclipse.jdt.launching.JRE_CONTAINER/org.eclipse.jdt.internal.debug.ui.launcher.StandardVMType/JavaSE-1.8"/>
|
||||||
|
<classpathentry kind="con" path="org.eclipse.pde.core.requiredPlugins"/>
|
||||||
|
<classpathentry kind="src" path="src"/>
|
||||||
|
<classpathentry kind="output" path="bin"/>
|
||||||
|
</classpath>
|
28
cross/org.eclipse.cdt.launch.serial.ui/.project
Normal file
28
cross/org.eclipse.cdt.launch.serial.ui/.project
Normal file
|
@ -0,0 +1,28 @@
|
||||||
|
<?xml version="1.0" encoding="UTF-8"?>
|
||||||
|
<projectDescription>
|
||||||
|
<name>org.eclipse.cdt.launch.serial.ui</name>
|
||||||
|
<comment></comment>
|
||||||
|
<projects>
|
||||||
|
</projects>
|
||||||
|
<buildSpec>
|
||||||
|
<buildCommand>
|
||||||
|
<name>org.eclipse.jdt.core.javabuilder</name>
|
||||||
|
<arguments>
|
||||||
|
</arguments>
|
||||||
|
</buildCommand>
|
||||||
|
<buildCommand>
|
||||||
|
<name>org.eclipse.pde.ManifestBuilder</name>
|
||||||
|
<arguments>
|
||||||
|
</arguments>
|
||||||
|
</buildCommand>
|
||||||
|
<buildCommand>
|
||||||
|
<name>org.eclipse.pde.SchemaBuilder</name>
|
||||||
|
<arguments>
|
||||||
|
</arguments>
|
||||||
|
</buildCommand>
|
||||||
|
</buildSpec>
|
||||||
|
<natures>
|
||||||
|
<nature>org.eclipse.pde.PluginNature</nature>
|
||||||
|
<nature>org.eclipse.jdt.core.javanature</nature>
|
||||||
|
</natures>
|
||||||
|
</projectDescription>
|
|
@ -0,0 +1,7 @@
|
||||||
|
eclipse.preferences.version=1
|
||||||
|
org.eclipse.jdt.core.compiler.codegen.inlineJsrBytecode=enabled
|
||||||
|
org.eclipse.jdt.core.compiler.codegen.targetPlatform=1.8
|
||||||
|
org.eclipse.jdt.core.compiler.compliance=1.8
|
||||||
|
org.eclipse.jdt.core.compiler.problem.assertIdentifier=error
|
||||||
|
org.eclipse.jdt.core.compiler.problem.enumIdentifier=error
|
||||||
|
org.eclipse.jdt.core.compiler.source=1.8
|
16
cross/org.eclipse.cdt.launch.serial.ui/META-INF/MANIFEST.MF
Normal file
16
cross/org.eclipse.cdt.launch.serial.ui/META-INF/MANIFEST.MF
Normal file
|
@ -0,0 +1,16 @@
|
||||||
|
Manifest-Version: 1.0
|
||||||
|
Bundle-ManifestVersion: 2
|
||||||
|
Bundle-Name: Ui
|
||||||
|
Bundle-SymbolicName: org.eclipse.cdt.launch.serial.ui;singleton:=true
|
||||||
|
Bundle-Version: 1.0.0.qualifier
|
||||||
|
Bundle-RequiredExecutionEnvironment: JavaSE-1.8
|
||||||
|
Require-Bundle: org.eclipse.core.runtime;bundle-version="3.13.0",
|
||||||
|
org.eclipse.ui;bundle-version="3.109.0",
|
||||||
|
org.eclipse.debug.ui;bundle-version="3.12.50",
|
||||||
|
org.eclipse.launchbar.core;bundle-version="2.2.0",
|
||||||
|
org.eclipse.launchbar.ui;bundle-version="2.2.0",
|
||||||
|
org.eclipse.cdt.launch.serial.core;bundle-version="1.0.0",
|
||||||
|
org.eclipse.cdt.native.serial;bundle-version="1.1.0",
|
||||||
|
org.eclipse.cdt.launch;bundle-version="9.2.0"
|
||||||
|
Bundle-Activator: org.eclipse.cdt.launch.serial.ui.internal.Activator
|
||||||
|
Bundle-ActivationPolicy: lazy
|
6
cross/org.eclipse.cdt.launch.serial.ui/build.properties
Normal file
6
cross/org.eclipse.cdt.launch.serial.ui/build.properties
Normal file
|
@ -0,0 +1,6 @@
|
||||||
|
source.. = src/
|
||||||
|
output.. = bin/
|
||||||
|
bin.includes = META-INF/,\
|
||||||
|
.,\
|
||||||
|
plugin.xml,\
|
||||||
|
icons/
|
BIN
cross/org.eclipse.cdt.launch.serial.ui/icons/cdt_logo_16.png
Normal file
BIN
cross/org.eclipse.cdt.launch.serial.ui/icons/cdt_logo_16.png
Normal file
Binary file not shown.
After Width: | Height: | Size: 896 B |
26
cross/org.eclipse.cdt.launch.serial.ui/plugin.xml
Normal file
26
cross/org.eclipse.cdt.launch.serial.ui/plugin.xml
Normal file
|
@ -0,0 +1,26 @@
|
||||||
|
<?xml version="1.0" encoding="UTF-8"?>
|
||||||
|
<?eclipse version="3.4"?>
|
||||||
|
<plugin>
|
||||||
|
<extension
|
||||||
|
point="org.eclipse.launchbar.ui.launchTargetTypeUI">
|
||||||
|
<launchTargetTypeUI
|
||||||
|
id="org.eclipse.cdt.launch.serial.core.serialFlashTarget"
|
||||||
|
labelProvider="org.eclipse.cdt.launch.serial.ui.internal.SerialFlashLaunchTargetLabelProvider">
|
||||||
|
</launchTargetTypeUI>
|
||||||
|
<wizard2
|
||||||
|
class="org.eclipse.cdt.launch.serial.ui.internal.NewSerialFlashTargetWizard"
|
||||||
|
icon="icons/cdt_logo_16.png"
|
||||||
|
id="org.eclipse.cdt.launch.serial.core.serialFlashTarget"
|
||||||
|
name="Serial Flash Target">
|
||||||
|
</wizard2>
|
||||||
|
</extension>
|
||||||
|
<extension
|
||||||
|
point="org.eclipse.debug.ui.launchConfigurationTabGroups">
|
||||||
|
<launchConfigurationTabGroup
|
||||||
|
class="org.eclipse.cdt.launch.serial.ui.internal.SerialFlashLaunchConfigTabGroup"
|
||||||
|
id="org.eclipse.cdt.launch.serial.ui.launchConfigurationTabGroup"
|
||||||
|
type="org.eclipse.cdt.launch.serial.launchConfigurationType">
|
||||||
|
</launchConfigurationTabGroup>
|
||||||
|
</extension>
|
||||||
|
|
||||||
|
</plugin>
|
|
@ -0,0 +1,52 @@
|
||||||
|
/*******************************************************************************
|
||||||
|
* Copyright (c) 2017 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.cdt.launch.serial.ui.internal;
|
||||||
|
|
||||||
|
import org.eclipse.core.runtime.IStatus;
|
||||||
|
import org.eclipse.jface.resource.ImageRegistry;
|
||||||
|
import org.eclipse.swt.graphics.Image;
|
||||||
|
import org.eclipse.ui.plugin.AbstractUIPlugin;
|
||||||
|
import org.osgi.framework.BundleContext;
|
||||||
|
import org.osgi.framework.ServiceReference;
|
||||||
|
|
||||||
|
public class Activator extends AbstractUIPlugin {
|
||||||
|
|
||||||
|
public static final String PLUGIN_ID = "org.eclipse.cdt.launch.serial.ui"; //$NON-NLS-1$
|
||||||
|
|
||||||
|
public static final String IMG_CDT_LOGO = "org.eclipse.cdt.launch.serial.ui.cdt_logo_16"; //$NON-NLS-1$
|
||||||
|
|
||||||
|
private static AbstractUIPlugin plugin;
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void start(BundleContext context) throws Exception {
|
||||||
|
super.start(context);
|
||||||
|
plugin = this;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
protected void initializeImageRegistry(ImageRegistry reg) {
|
||||||
|
super.initializeImageRegistry(reg);
|
||||||
|
|
||||||
|
reg.put(IMG_CDT_LOGO, imageDescriptorFromPlugin(PLUGIN_ID, "icons/cdt_logo_16.png")); //$NON-NLS-1$
|
||||||
|
}
|
||||||
|
|
||||||
|
public static Image getImage(String key) {
|
||||||
|
return plugin.getImageRegistry().get(key);
|
||||||
|
}
|
||||||
|
|
||||||
|
public static void log(IStatus status) {
|
||||||
|
plugin.getLog().log(status);
|
||||||
|
}
|
||||||
|
|
||||||
|
public static <T> T getService(Class<T> service) {
|
||||||
|
BundleContext context = plugin.getBundle().getBundleContext();
|
||||||
|
ServiceReference<T> ref = context.getServiceReference(service);
|
||||||
|
return ref != null ? context.getService(ref) : null;
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
|
@ -0,0 +1,29 @@
|
||||||
|
/*******************************************************************************
|
||||||
|
* Copyright (c) 2017 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.cdt.launch.serial.ui.internal;
|
||||||
|
|
||||||
|
import org.eclipse.osgi.util.NLS;
|
||||||
|
|
||||||
|
public class Messages extends NLS {
|
||||||
|
private static final String BUNDLE_NAME = "org.eclipse.cdt.launch.serial.ui.internal.messages"; //$NON-NLS-1$
|
||||||
|
public static String NewSerialFlashTargetWizard_Title;
|
||||||
|
public static String NewSerialFlashTargetWizardPage_CPUArchitecture;
|
||||||
|
public static String NewSerialFlashTargetWizardPage_Description;
|
||||||
|
public static String NewSerialFlashTargetWizardPage_Fetching;
|
||||||
|
public static String NewSerialFlashTargetWizardPage_Name;
|
||||||
|
public static String NewSerialFlashTargetWizardPage_OperatingSystem;
|
||||||
|
public static String NewSerialFlashTargetWizardPage_SerialPort;
|
||||||
|
public static String NewSerialFlashTargetWizardPage_Title;
|
||||||
|
static {
|
||||||
|
// initialize resource bundle
|
||||||
|
NLS.initializeMessages(BUNDLE_NAME, Messages.class);
|
||||||
|
}
|
||||||
|
|
||||||
|
private Messages() {
|
||||||
|
}
|
||||||
|
}
|
|
@ -0,0 +1,53 @@
|
||||||
|
/*******************************************************************************
|
||||||
|
* Copyright (c) 2017 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.cdt.launch.serial.ui.internal;
|
||||||
|
|
||||||
|
import org.eclipse.cdt.launch.serial.SerialFlashLaunchTargetProvider;
|
||||||
|
import org.eclipse.launchbar.core.target.ILaunchTarget;
|
||||||
|
import org.eclipse.launchbar.core.target.ILaunchTargetManager;
|
||||||
|
import org.eclipse.launchbar.core.target.ILaunchTargetWorkingCopy;
|
||||||
|
import org.eclipse.launchbar.ui.target.LaunchTargetWizard;
|
||||||
|
|
||||||
|
public class NewSerialFlashTargetWizard extends LaunchTargetWizard {
|
||||||
|
|
||||||
|
private NewSerialFlashTargetWizardPage page;
|
||||||
|
|
||||||
|
public NewSerialFlashTargetWizard() {
|
||||||
|
setWindowTitle(Messages.NewSerialFlashTargetWizard_Title);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void addPages() {
|
||||||
|
super.addPages();
|
||||||
|
|
||||||
|
page = new NewSerialFlashTargetWizardPage(getLaunchTarget());
|
||||||
|
addPage(page);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public boolean performFinish() {
|
||||||
|
ILaunchTargetManager manager = Activator.getService(ILaunchTargetManager.class);
|
||||||
|
String typeId = SerialFlashLaunchTargetProvider.TYPE_ID;
|
||||||
|
String id = page.getTargetName();
|
||||||
|
|
||||||
|
ILaunchTarget target = getLaunchTarget();
|
||||||
|
if (target == null) {
|
||||||
|
target = manager.addLaunchTarget(typeId, id);
|
||||||
|
}
|
||||||
|
|
||||||
|
ILaunchTargetWorkingCopy wc = target.getWorkingCopy();
|
||||||
|
wc.setId(id);
|
||||||
|
wc.setAttribute(ILaunchTarget.ATTR_OS, page.getOS());
|
||||||
|
wc.setAttribute(ILaunchTarget.ATTR_ARCH, page.getArch());
|
||||||
|
wc.setAttribute(SerialFlashLaunchTargetProvider.ATTR_SERIAL_PORT, page.getSerialPortName());
|
||||||
|
wc.save();
|
||||||
|
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
|
@ -0,0 +1,130 @@
|
||||||
|
/*******************************************************************************
|
||||||
|
* Copyright (c) 2017 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.cdt.launch.serial.ui.internal;
|
||||||
|
|
||||||
|
import java.io.IOException;
|
||||||
|
|
||||||
|
import org.eclipse.cdt.launch.serial.SerialFlashLaunchTargetProvider;
|
||||||
|
import org.eclipse.cdt.serial.SerialPort;
|
||||||
|
import org.eclipse.core.runtime.IStatus;
|
||||||
|
import org.eclipse.core.runtime.Status;
|
||||||
|
import org.eclipse.jface.wizard.WizardPage;
|
||||||
|
import org.eclipse.launchbar.core.target.ILaunchTarget;
|
||||||
|
import org.eclipse.swt.SWT;
|
||||||
|
import org.eclipse.swt.layout.GridData;
|
||||||
|
import org.eclipse.swt.layout.GridLayout;
|
||||||
|
import org.eclipse.swt.widgets.Combo;
|
||||||
|
import org.eclipse.swt.widgets.Composite;
|
||||||
|
import org.eclipse.swt.widgets.Label;
|
||||||
|
import org.eclipse.swt.widgets.Text;
|
||||||
|
|
||||||
|
public class NewSerialFlashTargetWizardPage extends WizardPage {
|
||||||
|
|
||||||
|
private ILaunchTarget launchTarget;
|
||||||
|
|
||||||
|
private Text nameText;
|
||||||
|
private Text osText;
|
||||||
|
private Text archText;
|
||||||
|
private Combo serialPortCombo;
|
||||||
|
|
||||||
|
public NewSerialFlashTargetWizardPage(ILaunchTarget launchTarget) {
|
||||||
|
super(NewSerialFlashTargetWizardPage.class.getName());
|
||||||
|
this.launchTarget = launchTarget;
|
||||||
|
setTitle(Messages.NewSerialFlashTargetWizardPage_Title);
|
||||||
|
setDescription(Messages.NewSerialFlashTargetWizardPage_Description);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void createControl(Composite parent) {
|
||||||
|
Composite comp = new Composite(parent, SWT.NONE);
|
||||||
|
comp.setLayout(new GridLayout(2, false));
|
||||||
|
setControl(comp);
|
||||||
|
|
||||||
|
Label label = new Label(comp, SWT.NONE);
|
||||||
|
label.setText(Messages.NewSerialFlashTargetWizardPage_Name);
|
||||||
|
|
||||||
|
nameText = new Text(comp, SWT.BORDER);
|
||||||
|
nameText.setLayoutData(new GridData(SWT.FILL, SWT.FILL, true, false));
|
||||||
|
if (launchTarget != null) {
|
||||||
|
nameText.setText(launchTarget.getId());
|
||||||
|
}
|
||||||
|
|
||||||
|
label = new Label(comp, SWT.NONE);
|
||||||
|
label.setText(Messages.NewSerialFlashTargetWizardPage_OperatingSystem);
|
||||||
|
|
||||||
|
osText = new Text(comp, SWT.BORDER);
|
||||||
|
osText.setLayoutData(new GridData(SWT.FILL, SWT.FILL, true, false));
|
||||||
|
if (launchTarget != null) {
|
||||||
|
String os = launchTarget.getAttribute(ILaunchTarget.ATTR_OS, null);
|
||||||
|
if (os != null) {
|
||||||
|
osText.setText(os);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
label = new Label(comp, SWT.NONE);
|
||||||
|
label.setText(Messages.NewSerialFlashTargetWizardPage_CPUArchitecture);
|
||||||
|
|
||||||
|
archText = new Text(comp, SWT.BORDER);
|
||||||
|
archText.setLayoutData(new GridData(SWT.FILL, SWT.FILL, true, false));
|
||||||
|
if (launchTarget != null) {
|
||||||
|
String arch = launchTarget.getAttribute(ILaunchTarget.ATTR_ARCH, null);
|
||||||
|
if (arch != null) {
|
||||||
|
archText.setText(arch);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
label = new Label(comp, SWT.NONE);
|
||||||
|
label.setText(Messages.NewSerialFlashTargetWizardPage_SerialPort);
|
||||||
|
|
||||||
|
serialPortCombo = new Combo(comp, SWT.NONE);
|
||||||
|
try {
|
||||||
|
String[] ports = SerialPort.list();
|
||||||
|
for (String port : ports) {
|
||||||
|
serialPortCombo.add(port);
|
||||||
|
}
|
||||||
|
if (serialPortCombo.getItemCount() > 0) {
|
||||||
|
if (launchTarget != null) {
|
||||||
|
String targetPort = launchTarget.getAttribute(SerialFlashLaunchTargetProvider.ATTR_SERIAL_PORT,
|
||||||
|
null);
|
||||||
|
if (targetPort != null) {
|
||||||
|
int i = 0;
|
||||||
|
for (String port : ports) {
|
||||||
|
if (port.equals(targetPort)) {
|
||||||
|
serialPortCombo.select(i);
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if (serialPortCombo.getSelectionIndex() < 0) {
|
||||||
|
serialPortCombo.select(0);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
} catch (IOException e) {
|
||||||
|
Activator.log(new Status(IStatus.ERROR, Activator.PLUGIN_ID, Messages.NewSerialFlashTargetWizardPage_Fetching, e));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public String getTargetName() {
|
||||||
|
return nameText.getText();
|
||||||
|
}
|
||||||
|
|
||||||
|
public String getOS() {
|
||||||
|
return osText.getText();
|
||||||
|
}
|
||||||
|
|
||||||
|
public String getArch() {
|
||||||
|
return archText.getText();
|
||||||
|
}
|
||||||
|
|
||||||
|
public String getSerialPortName() {
|
||||||
|
return serialPortCombo.getText();
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
|
@ -0,0 +1,24 @@
|
||||||
|
/*******************************************************************************
|
||||||
|
* Copyright (c) 2017 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.cdt.launch.serial.ui.internal;
|
||||||
|
|
||||||
|
import org.eclipse.cdt.launch.ui.corebuild.GenericMainTab;
|
||||||
|
import org.eclipse.debug.ui.AbstractLaunchConfigurationTabGroup;
|
||||||
|
import org.eclipse.debug.ui.CommonTab;
|
||||||
|
import org.eclipse.debug.ui.EnvironmentTab;
|
||||||
|
import org.eclipse.debug.ui.ILaunchConfigurationDialog;
|
||||||
|
import org.eclipse.debug.ui.ILaunchConfigurationTab;
|
||||||
|
|
||||||
|
public class SerialFlashLaunchConfigTabGroup extends AbstractLaunchConfigurationTabGroup {
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void createTabs(ILaunchConfigurationDialog dialog, String mode) {
|
||||||
|
setTabs(new ILaunchConfigurationTab[] { new GenericMainTab(), new EnvironmentTab(), new CommonTab() });
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
|
@ -0,0 +1,35 @@
|
||||||
|
/*******************************************************************************
|
||||||
|
* Copyright (c) 2017 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.cdt.launch.serial.ui.internal;
|
||||||
|
|
||||||
|
import org.eclipse.jface.viewers.LabelProvider;
|
||||||
|
import org.eclipse.launchbar.core.target.ILaunchTarget;
|
||||||
|
import org.eclipse.swt.graphics.Image;
|
||||||
|
|
||||||
|
public class SerialFlashLaunchTargetLabelProvider extends LabelProvider {
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public String getText(Object element) {
|
||||||
|
if (element instanceof ILaunchTarget) {
|
||||||
|
return ((ILaunchTarget) element).getId();
|
||||||
|
}
|
||||||
|
return super.getText(element);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public Image getImage(Object element) {
|
||||||
|
if (element instanceof ILaunchTarget) {
|
||||||
|
Image image = Activator.getImage(Activator.IMG_CDT_LOGO);
|
||||||
|
if (image != null) {
|
||||||
|
return image;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return super.getImage(element);
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
|
@ -0,0 +1,15 @@
|
||||||
|
################################################################################
|
||||||
|
# Copyright (c) 2017 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
|
||||||
|
################################################################################
|
||||||
|
NewSerialFlashTargetWizard_Title=New Serial Flash Target
|
||||||
|
NewSerialFlashTargetWizardPage_CPUArchitecture=CPU Architecture:
|
||||||
|
NewSerialFlashTargetWizardPage_Description=Enter name and properties for the target.
|
||||||
|
NewSerialFlashTargetWizardPage_Fetching=Fetching serial ports
|
||||||
|
NewSerialFlashTargetWizardPage_Name=Name:
|
||||||
|
NewSerialFlashTargetWizardPage_OperatingSystem=Operating System:
|
||||||
|
NewSerialFlashTargetWizardPage_SerialPort=Serial Port:
|
||||||
|
NewSerialFlashTargetWizardPage_Title=Serial Flash Target
|
|
@ -470,6 +470,13 @@
|
||||||
name="%localApplicationLaunch.name"
|
name="%localApplicationLaunch.name"
|
||||||
public="false">
|
public="false">
|
||||||
</launchConfigurationType>
|
</launchConfigurationType>
|
||||||
|
<launchConfigurationType
|
||||||
|
delegate="org.eclipse.cdt.debug.core.launch.CoreBuildGenericLaunchConfigDelegate"
|
||||||
|
id="org.eclipse.cdt.debug.core.genericLaunchConfigType"
|
||||||
|
modes="run"
|
||||||
|
name="Auto Generic Launch"
|
||||||
|
public="false">
|
||||||
|
</launchConfigurationType>
|
||||||
</extension>
|
</extension>
|
||||||
<extension
|
<extension
|
||||||
point="org.eclipse.launchbar.core.launchTargetTypes">
|
point="org.eclipse.launchbar.core.launchTargetTypes">
|
||||||
|
@ -491,7 +498,7 @@
|
||||||
priority="10">
|
priority="10">
|
||||||
</configProvider>
|
</configProvider>
|
||||||
<configProvider
|
<configProvider
|
||||||
class="org.eclipse.cdt.debug.internal.core.launch.CoreBuildGenericLaunchConfigProvider"
|
class="org.eclipse.cdt.debug.core.launch.CoreBuildGenericLaunchConfigProvider"
|
||||||
descriptorType="org.eclipse.cdt.debug.core.coreBuildDescriptorType"
|
descriptorType="org.eclipse.cdt.debug.core.coreBuildDescriptorType"
|
||||||
priority="10">
|
priority="10">
|
||||||
</configProvider>
|
</configProvider>
|
||||||
|
|
|
@ -285,6 +285,16 @@ public interface ICDTLaunchConfigurationConstants {
|
||||||
*/
|
*/
|
||||||
public static final String ATTR_DEBUGGER_POST_MORTEM_TYPE = "org.eclipse.cdt.dsf.gdb" + ".POST_MORTEM_TYPE"; //$NON-NLS-1$ //$NON-NLS-2$
|
public static final String ATTR_DEBUGGER_POST_MORTEM_TYPE = "org.eclipse.cdt.dsf.gdb" + ".POST_MORTEM_TYPE"; //$NON-NLS-1$ //$NON-NLS-2$
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @since 8.3
|
||||||
|
*/
|
||||||
|
public final static String ATTR_LOCATION = CDT_LAUNCH_ID + ".ATTR_LOCATION"; //$NON-NLS-1$
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @since 8.3
|
||||||
|
*/
|
||||||
|
public final static String ATTR_TOOL_ARGUMENTS = CDT_LAUNCH_ID + ".ATTR_TOOL_ARGUMENTS"; //$NON-NLS-1$
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Launch configuration attribute value. The key is
|
* Launch configuration attribute value. The key is
|
||||||
* ATTR_DEBUGGER_STOP_AT_MAIN.
|
* ATTR_DEBUGGER_STOP_AT_MAIN.
|
||||||
|
|
|
@ -0,0 +1,88 @@
|
||||||
|
/*******************************************************************************
|
||||||
|
* Copyright (c) 2017 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.cdt.debug.core.launch;
|
||||||
|
|
||||||
|
import java.io.File;
|
||||||
|
import java.util.ArrayList;
|
||||||
|
import java.util.Arrays;
|
||||||
|
import java.util.List;
|
||||||
|
|
||||||
|
import org.eclipse.cdt.debug.core.CDebugCorePlugin;
|
||||||
|
import org.eclipse.cdt.debug.core.ICDTLaunchConfigurationConstants;
|
||||||
|
import org.eclipse.cdt.debug.internal.core.Messages;
|
||||||
|
import org.eclipse.core.runtime.CoreException;
|
||||||
|
import org.eclipse.core.runtime.IProgressMonitor;
|
||||||
|
import org.eclipse.core.runtime.IStatus;
|
||||||
|
import org.eclipse.core.runtime.Status;
|
||||||
|
import org.eclipse.core.variables.IStringVariableManager;
|
||||||
|
import org.eclipse.core.variables.VariablesPlugin;
|
||||||
|
import org.eclipse.debug.core.DebugPlugin;
|
||||||
|
import org.eclipse.debug.core.ILaunch;
|
||||||
|
import org.eclipse.debug.core.ILaunchConfiguration;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Delegate for Generic Launches over the Generic Launch Target. Can be
|
||||||
|
* overriden to support launch customization for similar targets.
|
||||||
|
*
|
||||||
|
* @since 8.3
|
||||||
|
*/
|
||||||
|
public class CoreBuildGenericLaunchConfigDelegate extends CoreBuildLaunchConfigDelegate {
|
||||||
|
|
||||||
|
public static final String TYPE_ID = "org.eclipse.cdt.debug.core.genericLaunchConfigType"; //$NON-NLS-1$
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void launch(ILaunchConfiguration configuration, String mode, ILaunch launch, IProgressMonitor monitor)
|
||||||
|
throws CoreException {
|
||||||
|
IStringVariableManager varManager = VariablesPlugin.getDefault().getStringVariableManager();
|
||||||
|
|
||||||
|
String location = configuration.getAttribute(ICDTLaunchConfigurationConstants.ATTR_LOCATION, ""); //$NON-NLS-1$
|
||||||
|
if (location.isEmpty()) {
|
||||||
|
launch.addProcess(new NullProcess(launch, Messages.CoreBuildGenericLaunchConfigDelegate_NoAction));
|
||||||
|
return;
|
||||||
|
} else {
|
||||||
|
String substLocation = varManager.performStringSubstitution(location);
|
||||||
|
if (substLocation.isEmpty()) {
|
||||||
|
throw new CoreException(new Status(IStatus.ERROR, CDebugCorePlugin.PLUGIN_ID,
|
||||||
|
String.format(Messages.CoreBuildGenericLaunchConfigDelegate_SubstitutionFailed, location)));
|
||||||
|
}
|
||||||
|
location = substLocation;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!new File(location).canExecute()) {
|
||||||
|
throw new CoreException(new Status(IStatus.ERROR, CDebugCorePlugin.PLUGIN_ID,
|
||||||
|
String.format(Messages.CoreBuildGenericLaunchConfigDelegate_CommandNotValid, location)));
|
||||||
|
}
|
||||||
|
|
||||||
|
List<String> commands = new ArrayList<>();
|
||||||
|
commands.add(location);
|
||||||
|
|
||||||
|
String arguments = configuration.getAttribute(ICDTLaunchConfigurationConstants.ATTR_TOOL_ARGUMENTS, ""); //$NON-NLS-1$
|
||||||
|
if (!arguments.isEmpty()) {
|
||||||
|
commands.addAll(Arrays.asList(varManager.performStringSubstitution(arguments).split(" "))); //$NON-NLS-1$
|
||||||
|
}
|
||||||
|
|
||||||
|
String workingDirectory = configuration.getAttribute(ICDTLaunchConfigurationConstants.ATTR_WORKING_DIRECTORY,
|
||||||
|
""); //$NON-NLS-1$
|
||||||
|
File workingDir;
|
||||||
|
if (workingDirectory.isEmpty()) {
|
||||||
|
workingDir = new File(getProject(configuration).getLocationURI());
|
||||||
|
} else {
|
||||||
|
workingDir = new File(varManager.performStringSubstitution(workingDirectory));
|
||||||
|
if (!workingDir.isDirectory()) {
|
||||||
|
throw new CoreException(new Status(IStatus.ERROR, CDebugCorePlugin.PLUGIN_ID,
|
||||||
|
String.format(Messages.CoreBuildGenericLaunchConfigDelegate_WorkingDirNotExists, location)));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
String[] envp = DebugPlugin.getDefault().getLaunchManager().getEnvironment(configuration);
|
||||||
|
|
||||||
|
Process p = DebugPlugin.exec(commands.toArray(new String[0]), workingDir, envp);
|
||||||
|
DebugPlugin.newProcess(launch, p, String.join(" ", commands)); //$NON-NLS-1$
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
|
@ -1,150 +1,165 @@
|
||||||
package org.eclipse.cdt.debug.internal.core.launch;
|
package org.eclipse.cdt.debug.core.launch;
|
||||||
|
|
||||||
import java.util.HashMap;
|
import java.util.HashMap;
|
||||||
import java.util.Map;
|
import java.util.Map;
|
||||||
import java.util.Map.Entry;
|
import java.util.Map.Entry;
|
||||||
|
|
||||||
import org.eclipse.cdt.debug.core.CDebugCorePlugin;
|
import org.eclipse.cdt.debug.core.CDebugCorePlugin;
|
||||||
import org.eclipse.cdt.debug.core.launch.GenericTargetTypeProvider;
|
import org.eclipse.core.resources.IProject;
|
||||||
import org.eclipse.core.resources.IProject;
|
import org.eclipse.core.resources.IResource;
|
||||||
import org.eclipse.core.resources.IResource;
|
import org.eclipse.core.runtime.CoreException;
|
||||||
import org.eclipse.core.runtime.CoreException;
|
import org.eclipse.debug.core.DebugPlugin;
|
||||||
import org.eclipse.debug.core.DebugPlugin;
|
import org.eclipse.debug.core.ILaunchConfiguration;
|
||||||
import org.eclipse.debug.core.ILaunchConfiguration;
|
import org.eclipse.debug.core.ILaunchConfigurationType;
|
||||||
import org.eclipse.debug.core.ILaunchConfigurationType;
|
import org.eclipse.debug.core.ILaunchConfigurationWorkingCopy;
|
||||||
import org.eclipse.debug.core.ILaunchConfigurationWorkingCopy;
|
import org.eclipse.launchbar.core.AbstractLaunchConfigProvider;
|
||||||
import org.eclipse.launchbar.core.AbstractLaunchConfigProvider;
|
import org.eclipse.launchbar.core.ILaunchDescriptor;
|
||||||
import org.eclipse.launchbar.core.ILaunchDescriptor;
|
import org.eclipse.launchbar.core.target.ILaunchTarget;
|
||||||
import org.eclipse.launchbar.core.target.ILaunchTarget;
|
import org.eclipse.launchbar.core.target.ILaunchTargetManager;
|
||||||
import org.eclipse.launchbar.core.target.ILaunchTargetManager;
|
|
||||||
|
/**
|
||||||
public class CoreBuildGenericLaunchConfigProvider extends AbstractLaunchConfigProvider {
|
* Core launch configuration provider used by generic target types.
|
||||||
|
*
|
||||||
private static final String TYPE_ID = "org.eclipse.ui.externaltools.ProgramLaunchConfigurationType"; //$NON-NLS-1$
|
* @since 8.3
|
||||||
private static final String ATTR_OS = CDebugCorePlugin.PLUGIN_ID + ".target_os"; //$NON-NLS-1$
|
*/
|
||||||
private static final String NO_OS = ""; //$NON-NLS-1$
|
public class CoreBuildGenericLaunchConfigProvider extends AbstractLaunchConfigProvider {
|
||||||
|
|
||||||
private Map<IProject, Map<String, ILaunchConfiguration>> configs = new HashMap<>();
|
private static final String ATTR_OS = CDebugCorePlugin.PLUGIN_ID + ".target_os"; //$NON-NLS-1$
|
||||||
|
private static final String ATTR_ARCH = CDebugCorePlugin.PLUGIN_ID + ".target_arch"; //$NON-NLS-1$
|
||||||
@Override
|
private static final String EMPTY = ""; //$NON-NLS-1$
|
||||||
public boolean supports(ILaunchDescriptor descriptor, ILaunchTarget target) throws CoreException {
|
|
||||||
return target.getTypeId().equals(GenericTargetTypeProvider.TYPE_ID);
|
private Map<IProject, Map<String, ILaunchConfiguration>> configs = new HashMap<>();
|
||||||
}
|
|
||||||
|
@Override
|
||||||
@Override
|
public boolean supports(ILaunchDescriptor descriptor, ILaunchTarget target) throws CoreException {
|
||||||
public ILaunchConfigurationType getLaunchConfigurationType(ILaunchDescriptor descriptor, ILaunchTarget target)
|
return target.getTypeId().equals(GenericTargetTypeProvider.TYPE_ID);
|
||||||
throws CoreException {
|
}
|
||||||
return DebugPlugin.getDefault().getLaunchManager().getLaunchConfigurationType(TYPE_ID);
|
|
||||||
}
|
@Override
|
||||||
|
public ILaunchConfigurationType getLaunchConfigurationType(ILaunchDescriptor descriptor, ILaunchTarget target)
|
||||||
@Override
|
throws CoreException {
|
||||||
public ILaunchConfiguration getLaunchConfiguration(ILaunchDescriptor descriptor, ILaunchTarget target)
|
return DebugPlugin.getDefault().getLaunchManager()
|
||||||
throws CoreException {
|
.getLaunchConfigurationType(CoreBuildGenericLaunchConfigDelegate.TYPE_ID);
|
||||||
ILaunchConfiguration config = null;
|
}
|
||||||
IProject project = descriptor.getAdapter(IProject.class);
|
|
||||||
if (project != null) {
|
@Override
|
||||||
Map<String, ILaunchConfiguration> projectConfigs = configs.get(project);
|
public ILaunchConfiguration getLaunchConfiguration(ILaunchDescriptor descriptor, ILaunchTarget target)
|
||||||
if (projectConfigs == null) {
|
throws CoreException {
|
||||||
projectConfigs = new HashMap<>();
|
ILaunchConfiguration config = null;
|
||||||
configs.put(project, projectConfigs);
|
IProject project = descriptor.getAdapter(IProject.class);
|
||||||
}
|
if (project != null) {
|
||||||
|
Map<String, ILaunchConfiguration> projectConfigs = configs.get(project);
|
||||||
String os = target.getAttribute(ILaunchTarget.ATTR_OS, NO_OS);
|
if (projectConfigs == null) {
|
||||||
config = projectConfigs.get(os);
|
projectConfigs = new HashMap<>();
|
||||||
if (config == null) {
|
configs.put(project, projectConfigs);
|
||||||
config = createLaunchConfiguration(descriptor, target);
|
}
|
||||||
}
|
|
||||||
}
|
String os = target.getAttribute(ILaunchTarget.ATTR_OS, EMPTY);
|
||||||
return config;
|
String arch = target.getAttribute(ILaunchTarget.ATTR_ARCH, EMPTY);
|
||||||
}
|
String targetConfig = os + '.' + arch;
|
||||||
|
config = projectConfigs.get(targetConfig);
|
||||||
@Override
|
if (config == null) {
|
||||||
protected void populateLaunchConfiguration(ILaunchDescriptor descriptor, ILaunchTarget target,
|
config = createLaunchConfiguration(descriptor, target);
|
||||||
ILaunchConfigurationWorkingCopy workingCopy) throws CoreException {
|
}
|
||||||
super.populateLaunchConfiguration(descriptor, target, workingCopy);
|
}
|
||||||
|
return config;
|
||||||
// Set the project
|
}
|
||||||
IProject project = descriptor.getAdapter(IProject.class);
|
|
||||||
workingCopy.setMappedResources(new IResource[] { project });
|
@Override
|
||||||
|
protected void populateLaunchConfiguration(ILaunchDescriptor descriptor, ILaunchTarget target,
|
||||||
// set the OS
|
ILaunchConfigurationWorkingCopy workingCopy) throws CoreException {
|
||||||
String os = target.getAttribute(ILaunchTarget.ATTR_OS, NO_OS);
|
super.populateLaunchConfiguration(descriptor, target, workingCopy);
|
||||||
workingCopy.setAttribute(ATTR_OS, os);
|
|
||||||
}
|
// Set the project
|
||||||
|
IProject project = descriptor.getAdapter(IProject.class);
|
||||||
@Override
|
workingCopy.setMappedResources(new IResource[] { project });
|
||||||
public boolean launchConfigurationAdded(ILaunchConfiguration configuration) throws CoreException {
|
|
||||||
if (ownsLaunchConfiguration(configuration)) {
|
// set the OS and ARCH
|
||||||
IProject project = configuration.getMappedResources()[0].getProject();
|
String os = target.getAttribute(ILaunchTarget.ATTR_OS, EMPTY);
|
||||||
Map<String, ILaunchConfiguration> projectConfigs = configs.get(project);
|
workingCopy.setAttribute(ATTR_OS, os);
|
||||||
if (projectConfigs == null) {
|
|
||||||
projectConfigs = new HashMap<>();
|
String arch = target.getAttribute(ILaunchTarget.ATTR_ARCH, EMPTY);
|
||||||
configs.put(project, projectConfigs);
|
workingCopy.setAttribute(ATTR_ARCH, arch);
|
||||||
}
|
}
|
||||||
|
|
||||||
String os = configuration.getAttribute(ATTR_OS, NO_OS);
|
@Override
|
||||||
projectConfigs.put(os, configuration);
|
public boolean launchConfigurationAdded(ILaunchConfiguration configuration) throws CoreException {
|
||||||
return true;
|
// TODO make sure it's the correct type
|
||||||
}
|
if (ownsLaunchConfiguration(configuration)) {
|
||||||
return false;
|
IProject project = configuration.getMappedResources()[0].getProject();
|
||||||
}
|
Map<String, ILaunchConfiguration> projectConfigs = configs.get(project);
|
||||||
|
if (projectConfigs == null) {
|
||||||
@Override
|
projectConfigs = new HashMap<>();
|
||||||
public boolean launchConfigurationRemoved(ILaunchConfiguration configuration) throws CoreException {
|
configs.put(project, projectConfigs);
|
||||||
for (Entry<IProject, Map<String, ILaunchConfiguration>> projectEntry : configs.entrySet()) {
|
}
|
||||||
Map<String, ILaunchConfiguration> projectConfigs = projectEntry.getValue();
|
|
||||||
for (Entry<String, ILaunchConfiguration> entry : projectConfigs.entrySet()) {
|
String os = configuration.getAttribute(ATTR_OS, EMPTY);
|
||||||
if (configuration.equals(entry.getValue())) {
|
String arch = configuration.getAttribute(ATTR_ARCH, EMPTY);
|
||||||
projectConfigs.remove(entry.getKey());
|
String targetConfig = os + '.' + arch;
|
||||||
if (projectConfigs.isEmpty()) {
|
projectConfigs.put(targetConfig, configuration);
|
||||||
configs.remove(projectEntry.getKey());
|
return true;
|
||||||
}
|
}
|
||||||
return true;
|
return false;
|
||||||
}
|
}
|
||||||
}
|
|
||||||
}
|
@Override
|
||||||
return false;
|
public boolean launchConfigurationRemoved(ILaunchConfiguration configuration) throws CoreException {
|
||||||
}
|
for (Entry<IProject, Map<String, ILaunchConfiguration>> projectEntry : configs.entrySet()) {
|
||||||
|
Map<String, ILaunchConfiguration> projectConfigs = projectEntry.getValue();
|
||||||
@Override
|
for (Entry<String, ILaunchConfiguration> entry : projectConfigs.entrySet()) {
|
||||||
public boolean launchConfigurationChanged(ILaunchConfiguration configuration) throws CoreException {
|
if (configuration.equals(entry.getValue())) {
|
||||||
// nothing to do
|
projectConfigs.remove(entry.getKey());
|
||||||
return false;
|
if (projectConfigs.isEmpty()) {
|
||||||
}
|
configs.remove(projectEntry.getKey());
|
||||||
|
}
|
||||||
@Override
|
return true;
|
||||||
public void launchDescriptorRemoved(ILaunchDescriptor descriptor) throws CoreException {
|
}
|
||||||
IProject project = descriptor.getAdapter(IProject.class);
|
}
|
||||||
if (project != null) {
|
}
|
||||||
Map<String, ILaunchConfiguration> projectConfigs = configs.get(project);
|
return false;
|
||||||
if (projectConfigs != null) {
|
}
|
||||||
for (ILaunchConfiguration config : projectConfigs.values()) {
|
|
||||||
config.delete();
|
@Override
|
||||||
}
|
public boolean launchConfigurationChanged(ILaunchConfiguration configuration) throws CoreException {
|
||||||
}
|
// nothing to do
|
||||||
}
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void launchTargetRemoved(ILaunchTarget target) throws CoreException {
|
public void launchDescriptorRemoved(ILaunchDescriptor descriptor) throws CoreException {
|
||||||
// Any other targets have the same OS?
|
IProject project = descriptor.getAdapter(IProject.class);
|
||||||
String os = target.getAttribute(ILaunchTarget.ATTR_OS, NO_OS);
|
if (project != null) {
|
||||||
|
Map<String, ILaunchConfiguration> projectConfigs = configs.get(project);
|
||||||
ILaunchTargetManager targetManager = CDebugCorePlugin.getService(ILaunchTargetManager.class);
|
if (projectConfigs != null) {
|
||||||
for (ILaunchTarget t : targetManager.getLaunchTargets()) {
|
for (ILaunchConfiguration config : projectConfigs.values()) {
|
||||||
if (!target.equals(t) && os.equals(t.getAttribute(ILaunchTarget.ATTR_OS, NO_OS))) {
|
config.delete();
|
||||||
// Yup, nothing to do then
|
}
|
||||||
return;
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
for (Entry<IProject, Map<String, ILaunchConfiguration>> projectEntry : configs.entrySet()) {
|
@Override
|
||||||
Map<String, ILaunchConfiguration> projectConfigs = projectEntry.getValue();
|
public void launchTargetRemoved(ILaunchTarget target) throws CoreException {
|
||||||
ILaunchConfiguration config = projectConfigs.get(os);
|
// Any other targets have the same OS and ARCH?
|
||||||
if (config != null) {
|
String os = target.getAttribute(ILaunchTarget.ATTR_OS, EMPTY);
|
||||||
config.delete();
|
String arch = target.getAttribute(ILaunchTarget.ATTR_ARCH, EMPTY);
|
||||||
}
|
|
||||||
}
|
ILaunchTargetManager targetManager = CDebugCorePlugin.getService(ILaunchTargetManager.class);
|
||||||
}
|
for (ILaunchTarget t : targetManager.getLaunchTargets()) {
|
||||||
|
if (!target.equals(t) && os.equals(t.getAttribute(ILaunchTarget.ATTR_OS, EMPTY))
|
||||||
}
|
&& arch.equals(t.getAttribute(ILaunchTarget.ATTR_ARCH, EMPTY))) {
|
||||||
|
// Yup, nothing to do then
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
for (Entry<IProject, Map<String, ILaunchConfiguration>> projectEntry : configs.entrySet()) {
|
||||||
|
Map<String, ILaunchConfiguration> projectConfigs = projectEntry.getValue();
|
||||||
|
ILaunchConfiguration config = projectConfigs.get(os);
|
||||||
|
if (config != null) {
|
||||||
|
config.delete();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
|
@ -0,0 +1,107 @@
|
||||||
|
/*******************************************************************************
|
||||||
|
* Copyright (c) 2017 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.cdt.debug.core.launch;
|
||||||
|
|
||||||
|
import java.io.IOException;
|
||||||
|
|
||||||
|
import org.eclipse.core.runtime.PlatformObject;
|
||||||
|
import org.eclipse.debug.core.DebugException;
|
||||||
|
import org.eclipse.debug.core.ILaunch;
|
||||||
|
import org.eclipse.debug.core.IStreamListener;
|
||||||
|
import org.eclipse.debug.core.model.IProcess;
|
||||||
|
import org.eclipse.debug.core.model.IStreamMonitor;
|
||||||
|
import org.eclipse.debug.core.model.IStreamsProxy;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* A simple process that only spits out a message then terminates.
|
||||||
|
*
|
||||||
|
* @since 8.3
|
||||||
|
*/
|
||||||
|
public class NullProcess extends PlatformObject implements IProcess {
|
||||||
|
|
||||||
|
private final String message;
|
||||||
|
private final ILaunch launch;
|
||||||
|
|
||||||
|
public NullProcess(ILaunch launch, String message) {
|
||||||
|
this.launch = launch;
|
||||||
|
this.message = message;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public boolean canTerminate() {
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public boolean isTerminated() {
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void terminate() throws DebugException {
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public String getLabel() {
|
||||||
|
return launch.getLaunchConfiguration().getName();
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public ILaunch getLaunch() {
|
||||||
|
return launch;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public IStreamsProxy getStreamsProxy() {
|
||||||
|
return new IStreamsProxy() {
|
||||||
|
@Override
|
||||||
|
public void write(String input) throws IOException {
|
||||||
|
// TODO Auto-generated method stub
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public IStreamMonitor getOutputStreamMonitor() {
|
||||||
|
return new IStreamMonitor() {
|
||||||
|
@Override
|
||||||
|
public void removeListener(IStreamListener listener) {
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public String getContents() {
|
||||||
|
return message;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void addListener(IStreamListener listener) {
|
||||||
|
}
|
||||||
|
};
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public IStreamMonitor getErrorStreamMonitor() {
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
};
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void setAttribute(String key, String value) {
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public String getAttribute(String key) {
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public int getExitValue() throws DebugException {
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
|
@ -0,0 +1,25 @@
|
||||||
|
/*******************************************************************************
|
||||||
|
* Copyright (c) 2017 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.cdt.debug.internal.core;
|
||||||
|
|
||||||
|
import org.eclipse.osgi.util.NLS;
|
||||||
|
|
||||||
|
public class Messages extends NLS {
|
||||||
|
private static final String BUNDLE_NAME = "org.eclipse.cdt.debug.internal.core.messages"; //$NON-NLS-1$
|
||||||
|
public static String CoreBuildGenericLaunchConfigDelegate_CommandNotValid;
|
||||||
|
public static String CoreBuildGenericLaunchConfigDelegate_NoAction;
|
||||||
|
public static String CoreBuildGenericLaunchConfigDelegate_SubstitutionFailed;
|
||||||
|
public static String CoreBuildGenericLaunchConfigDelegate_WorkingDirNotExists;
|
||||||
|
static {
|
||||||
|
// initialize resource bundle
|
||||||
|
NLS.initializeMessages(BUNDLE_NAME, Messages.class);
|
||||||
|
}
|
||||||
|
|
||||||
|
private Messages() {
|
||||||
|
}
|
||||||
|
}
|
|
@ -0,0 +1,11 @@
|
||||||
|
###############################################################################
|
||||||
|
# Copyright (c) 2003, 2010 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
|
||||||
|
###############################################################################
|
||||||
|
CoreBuildGenericLaunchConfigDelegate_CommandNotValid=Not a valid command "%s"
|
||||||
|
CoreBuildGenericLaunchConfigDelegate_NoAction=No action specified. Skipping.
|
||||||
|
CoreBuildGenericLaunchConfigDelegate_SubstitutionFailed=Variable substitution failed "%s"
|
||||||
|
CoreBuildGenericLaunchConfigDelegate_WorkingDirNotExists=Working directory %s does not exist
|
|
@ -121,6 +121,9 @@ public class GDBProcesses_7_12 extends GDBProcesses_7_11 {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @since 5.4
|
||||||
|
*/
|
||||||
@Override
|
@Override
|
||||||
protected boolean targetAttachRequiresTrailingNewline() {
|
protected boolean targetAttachRequiresTrailingNewline() {
|
||||||
return true;
|
return true;
|
||||||
|
|
|
@ -66,8 +66,11 @@ public class MITargetAttach extends MICommand<MIInfo> {
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Add an extra newline to force GDB 7.11 to flush error response to the MI channel.
|
* Add an extra newline to force GDB 7.11 to flush error response to the MI
|
||||||
|
* channel.
|
||||||
|
*
|
||||||
* @see GDBProcesses_7_2#targetAttachRequiresTrailingNewline
|
* @see GDBProcesses_7_2#targetAttachRequiresTrailingNewline
|
||||||
|
* @since 5.4
|
||||||
*/
|
*/
|
||||||
@Override
|
@Override
|
||||||
public String constructCommand(String groupId, String threadId, int frameId) {
|
public String constructCommand(String groupId, String threadId, int frameId) {
|
||||||
|
|
|
@ -154,11 +154,16 @@
|
||||||
id="org.eclipse.cdt.launch.launchConfigurationTabGroup.local"
|
id="org.eclipse.cdt.launch.launchConfigurationTabGroup.local"
|
||||||
type="org.eclipse.cdt.debug.core.localCoreBuildLaunchConfigType">
|
type="org.eclipse.cdt.debug.core.localCoreBuildLaunchConfigType">
|
||||||
</launchConfigurationTabGroup>
|
</launchConfigurationTabGroup>
|
||||||
|
<launchConfigurationTabGroup
|
||||||
|
class="org.eclipse.cdt.launch.internal.corebuild.GenericLaunchConfigTabGroup"
|
||||||
|
id="org.eclipse.cdt.launch.genericLaunchConfigTabGroup"
|
||||||
|
type="org.eclipse.cdt.debug.core.genericLaunchConfigType">
|
||||||
|
</launchConfigurationTabGroup>
|
||||||
</extension>
|
</extension>
|
||||||
<extension
|
<extension
|
||||||
point="org.eclipse.launchbar.ui.launchBarUIContributions">
|
point="org.eclipse.launchbar.ui.launchBarUIContributions">
|
||||||
<buildTabGroup
|
<buildTabGroup
|
||||||
launchConfigType="org.eclipse.ui.externaltools.ProgramLaunchConfigurationType"
|
launchConfigType="org.eclipse.cdt.debug.core.genericLaunchConfigType"
|
||||||
launchDescriptorType="org.eclipse.cdt.debug.core.coreBuildDescriptorType"
|
launchDescriptorType="org.eclipse.cdt.debug.core.coreBuildDescriptorType"
|
||||||
tabGroup="org.eclipse.cdt.launch.internal.corebuild.CoreBuildTabGroup">
|
tabGroup="org.eclipse.cdt.launch.internal.corebuild.CoreBuildTabGroup">
|
||||||
</buildTabGroup>
|
</buildTabGroup>
|
||||||
|
|
|
@ -0,0 +1,28 @@
|
||||||
|
/*******************************************************************************
|
||||||
|
* Copyright (c) 2017 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.cdt.launch.internal.corebuild;
|
||||||
|
|
||||||
|
import org.eclipse.cdt.launch.ui.corebuild.GenericMainTab;
|
||||||
|
import org.eclipse.debug.ui.AbstractLaunchConfigurationTabGroup;
|
||||||
|
import org.eclipse.debug.ui.CommonTab;
|
||||||
|
import org.eclipse.debug.ui.EnvironmentTab;
|
||||||
|
import org.eclipse.debug.ui.ILaunchConfigurationDialog;
|
||||||
|
import org.eclipse.debug.ui.ILaunchConfigurationTab;
|
||||||
|
|
||||||
|
public class GenericLaunchConfigTabGroup extends AbstractLaunchConfigurationTabGroup {
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void createTabs(ILaunchConfigurationDialog dialog, String mode) {
|
||||||
|
setTabs(new ILaunchConfigurationTab[] {
|
||||||
|
new GenericMainTab(),
|
||||||
|
new EnvironmentTab(),
|
||||||
|
new CommonTab()
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
|
@ -0,0 +1,36 @@
|
||||||
|
/*******************************************************************************
|
||||||
|
* Copyright (c) 2017 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.cdt.launch.internal.ui;
|
||||||
|
|
||||||
|
import org.eclipse.osgi.util.NLS;
|
||||||
|
|
||||||
|
public class Messages extends NLS {
|
||||||
|
private static final String BUNDLE_NAME = "org.eclipse.cdt.launch.internal.ui.messages"; //$NON-NLS-1$
|
||||||
|
public static String GenericMainTab_Arguments;
|
||||||
|
public static String GenericMainTab_BrowseFileSystem;
|
||||||
|
public static String GenericMainTab_BrowseWorkspace;
|
||||||
|
public static String GenericMainTab_Location;
|
||||||
|
public static String GenericMainTab_LocationNotAFile;
|
||||||
|
public static String GenericMainTab_LocationNotExists;
|
||||||
|
public static String GenericMainTab_Main;
|
||||||
|
public static String GenericMainTab_Quotes;
|
||||||
|
public static String GenericMainTab_SelectResource;
|
||||||
|
public static String GenericMainTab_SelectWorkingDir;
|
||||||
|
public static String GenericMainTab_SpecifyLocation;
|
||||||
|
public static String GenericMainTab_Variables;
|
||||||
|
public static String GenericMainTab_WorkingDirectory;
|
||||||
|
public static String GenericMainTab_WorkingDirNotADir;
|
||||||
|
public static String GenericMainTab_WorkingDirNotExists;
|
||||||
|
static {
|
||||||
|
// initialize resource bundle
|
||||||
|
NLS.initializeMessages(BUNDLE_NAME, Messages.class);
|
||||||
|
}
|
||||||
|
|
||||||
|
private Messages() {
|
||||||
|
}
|
||||||
|
}
|
|
@ -0,0 +1,22 @@
|
||||||
|
###############################################################################
|
||||||
|
# Copyright (c) 2002, 2015 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
|
||||||
|
###############################################################################
|
||||||
|
GenericMainTab_Arguments=Arguments:
|
||||||
|
GenericMainTab_BrowseFileSystem=Browse File System...
|
||||||
|
GenericMainTab_BrowseWorkspace=Browse Workspace...
|
||||||
|
GenericMainTab_Location=Location
|
||||||
|
GenericMainTab_LocationNotAFile=External tool location specified is not a file
|
||||||
|
GenericMainTab_LocationNotExists=External tool location does not exist
|
||||||
|
GenericMainTab_Main=Main
|
||||||
|
GenericMainTab_Quotes=Note: Enclose an argument containing spaces using double-quotes (\\").
|
||||||
|
GenericMainTab_SelectResource=Select a resource:
|
||||||
|
GenericMainTab_SelectWorkingDir=Select a working directory:
|
||||||
|
GenericMainTab_SpecifyLocation=Please specify the location of the external tool you would like to configure.
|
||||||
|
GenericMainTab_Variables=Variables...
|
||||||
|
GenericMainTab_WorkingDirectory=Working Directory:
|
||||||
|
GenericMainTab_WorkingDirNotADir=The specified location is not a directory
|
||||||
|
GenericMainTab_WorkingDirNotExists=External tool working directory does not exist or is invalid
|
|
@ -0,0 +1,715 @@
|
||||||
|
/*******************************************************************************
|
||||||
|
* Copyright (c) 2000, 2017 IBM Corporation 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
|
||||||
|
*
|
||||||
|
* copied from:
|
||||||
|
* org.eclipse.ui.externaltools.internal.launchConfigurations.GenericMainTab
|
||||||
|
*******************************************************************************/
|
||||||
|
package org.eclipse.cdt.launch.ui.corebuild;
|
||||||
|
|
||||||
|
import java.io.File;
|
||||||
|
|
||||||
|
import org.eclipse.cdt.debug.core.ICDTLaunchConfigurationConstants;
|
||||||
|
import org.eclipse.cdt.launch.internal.ui.LaunchImages;
|
||||||
|
import org.eclipse.cdt.launch.internal.ui.LaunchUIPlugin;
|
||||||
|
import org.eclipse.cdt.launch.internal.ui.Messages;
|
||||||
|
import org.eclipse.core.resources.IResource;
|
||||||
|
import org.eclipse.core.resources.ResourcesPlugin;
|
||||||
|
import org.eclipse.core.runtime.CoreException;
|
||||||
|
import org.eclipse.core.runtime.IPath;
|
||||||
|
import org.eclipse.core.variables.IStringVariableManager;
|
||||||
|
import org.eclipse.core.variables.VariablesPlugin;
|
||||||
|
import org.eclipse.debug.core.ILaunchConfiguration;
|
||||||
|
import org.eclipse.debug.core.ILaunchConfigurationWorkingCopy;
|
||||||
|
import org.eclipse.debug.ui.AbstractLaunchConfigurationTab;
|
||||||
|
import org.eclipse.debug.ui.StringVariableSelectionDialog;
|
||||||
|
import org.eclipse.jface.dialogs.Dialog;
|
||||||
|
import org.eclipse.jface.dialogs.IDialogConstants;
|
||||||
|
import org.eclipse.swt.SWT;
|
||||||
|
import org.eclipse.swt.accessibility.AccessibleAdapter;
|
||||||
|
import org.eclipse.swt.accessibility.AccessibleEvent;
|
||||||
|
import org.eclipse.swt.events.ModifyEvent;
|
||||||
|
import org.eclipse.swt.events.ModifyListener;
|
||||||
|
import org.eclipse.swt.events.SelectionAdapter;
|
||||||
|
import org.eclipse.swt.events.SelectionEvent;
|
||||||
|
import org.eclipse.swt.events.TraverseEvent;
|
||||||
|
import org.eclipse.swt.events.TraverseListener;
|
||||||
|
import org.eclipse.swt.graphics.Image;
|
||||||
|
import org.eclipse.swt.layout.GridData;
|
||||||
|
import org.eclipse.swt.layout.GridLayout;
|
||||||
|
import org.eclipse.swt.widgets.Button;
|
||||||
|
import org.eclipse.swt.widgets.Composite;
|
||||||
|
import org.eclipse.swt.widgets.Control;
|
||||||
|
import org.eclipse.swt.widgets.DirectoryDialog;
|
||||||
|
import org.eclipse.swt.widgets.FileDialog;
|
||||||
|
import org.eclipse.swt.widgets.Group;
|
||||||
|
import org.eclipse.swt.widgets.Label;
|
||||||
|
import org.eclipse.swt.widgets.Text;
|
||||||
|
import org.eclipse.ui.dialogs.ContainerSelectionDialog;
|
||||||
|
import org.eclipse.ui.dialogs.ResourceSelectionDialog;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @since 9.2
|
||||||
|
*/
|
||||||
|
public class GenericMainTab extends AbstractLaunchConfigurationTab {
|
||||||
|
|
||||||
|
public final static String FIRST_EDIT = "editedByExternalToolsMainTab"; //$NON-NLS-1$
|
||||||
|
|
||||||
|
protected Text locationField;
|
||||||
|
protected Text workDirectoryField;
|
||||||
|
protected Button fileLocationButton;
|
||||||
|
protected Button workspaceLocationButton;
|
||||||
|
protected Button variablesLocationButton;
|
||||||
|
protected Button fileWorkingDirectoryButton;
|
||||||
|
protected Button workspaceWorkingDirectoryButton;
|
||||||
|
protected Button variablesWorkingDirectoryButton;
|
||||||
|
|
||||||
|
protected Text argumentField;
|
||||||
|
protected Button argumentVariablesButton;
|
||||||
|
|
||||||
|
protected SelectionAdapter selectionAdapter;
|
||||||
|
|
||||||
|
protected boolean fInitializing = false;
|
||||||
|
private boolean userEdited = false;
|
||||||
|
|
||||||
|
protected WidgetListener fListener = new WidgetListener();
|
||||||
|
|
||||||
|
/**
|
||||||
|
* A listener to update for text modification and widget selection.
|
||||||
|
*/
|
||||||
|
protected class WidgetListener extends SelectionAdapter implements ModifyListener {
|
||||||
|
@Override
|
||||||
|
public void modifyText(ModifyEvent e) {
|
||||||
|
if (!fInitializing) {
|
||||||
|
setDirty(true);
|
||||||
|
userEdited = true;
|
||||||
|
updateLaunchConfigurationDialog();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void widgetSelected(SelectionEvent e) {
|
||||||
|
setDirty(true);
|
||||||
|
Object source = e.getSource();
|
||||||
|
if (source == workspaceLocationButton) {
|
||||||
|
handleWorkspaceLocationButtonSelected();
|
||||||
|
} else if (source == fileLocationButton) {
|
||||||
|
handleFileLocationButtonSelected();
|
||||||
|
} else if (source == workspaceWorkingDirectoryButton) {
|
||||||
|
handleWorkspaceWorkingDirectoryButtonSelected();
|
||||||
|
} else if (source == fileWorkingDirectoryButton) {
|
||||||
|
handleFileWorkingDirectoryButtonSelected();
|
||||||
|
} else if (source == argumentVariablesButton) {
|
||||||
|
handleVariablesButtonSelected(argumentField);
|
||||||
|
} else if (source == variablesLocationButton) {
|
||||||
|
handleVariablesButtonSelected(locationField);
|
||||||
|
} else if (source == variablesWorkingDirectoryButton) {
|
||||||
|
handleVariablesButtonSelected(workDirectoryField);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
* (non-Javadoc)
|
||||||
|
*
|
||||||
|
* @see
|
||||||
|
* org.eclipse.debug.ui.ILaunchConfigurationTab#createControl(org.eclipse.swt.
|
||||||
|
* widgets.Composite)
|
||||||
|
*/
|
||||||
|
@Override
|
||||||
|
public void createControl(Composite parent) {
|
||||||
|
Composite mainComposite = new Composite(parent, SWT.NONE);
|
||||||
|
setControl(mainComposite);
|
||||||
|
mainComposite.setFont(parent.getFont());
|
||||||
|
GridLayout layout = new GridLayout();
|
||||||
|
layout.numColumns = 1;
|
||||||
|
GridData gridData = new GridData(GridData.FILL_HORIZONTAL);
|
||||||
|
mainComposite.setLayout(layout);
|
||||||
|
mainComposite.setLayoutData(gridData);
|
||||||
|
|
||||||
|
createLocationComponent(mainComposite);
|
||||||
|
createWorkDirectoryComponent(mainComposite);
|
||||||
|
createArgumentComponent(mainComposite);
|
||||||
|
createVerticalSpacer(mainComposite, 1);
|
||||||
|
|
||||||
|
Dialog.applyDialogFont(parent);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Creates the controls needed to edit the location attribute of an external
|
||||||
|
* tool
|
||||||
|
*
|
||||||
|
* @param parent
|
||||||
|
* the composite to create the controls in
|
||||||
|
*/
|
||||||
|
protected void createLocationComponent(Composite parent) {
|
||||||
|
Group group = new Group(parent, SWT.NONE);
|
||||||
|
String locationLabel = getLocationLabel();
|
||||||
|
group.setText(locationLabel);
|
||||||
|
GridLayout layout = new GridLayout();
|
||||||
|
layout.numColumns = 1;
|
||||||
|
GridData gridData = new GridData(GridData.FILL_HORIZONTAL);
|
||||||
|
group.setLayout(layout);
|
||||||
|
group.setLayoutData(gridData);
|
||||||
|
|
||||||
|
locationField = new Text(group, SWT.BORDER);
|
||||||
|
gridData = new GridData(GridData.FILL_HORIZONTAL);
|
||||||
|
gridData.widthHint = IDialogConstants.ENTRY_FIELD_WIDTH;
|
||||||
|
locationField.setLayoutData(gridData);
|
||||||
|
locationField.addModifyListener(fListener);
|
||||||
|
addControlAccessibleListener(locationField, group.getText());
|
||||||
|
|
||||||
|
Composite buttonComposite = new Composite(group, SWT.NONE);
|
||||||
|
layout = new GridLayout();
|
||||||
|
layout.marginHeight = 0;
|
||||||
|
layout.marginWidth = 0;
|
||||||
|
layout.numColumns = 3;
|
||||||
|
gridData = new GridData(GridData.HORIZONTAL_ALIGN_END);
|
||||||
|
buttonComposite.setLayout(layout);
|
||||||
|
buttonComposite.setLayoutData(gridData);
|
||||||
|
buttonComposite.setFont(parent.getFont());
|
||||||
|
|
||||||
|
workspaceLocationButton = createPushButton(buttonComposite, Messages.GenericMainTab_BrowseWorkspace, null);
|
||||||
|
workspaceLocationButton.addSelectionListener(fListener);
|
||||||
|
addControlAccessibleListener(workspaceLocationButton,
|
||||||
|
group.getText() + " " + workspaceLocationButton.getText()); //$NON-NLS-1$
|
||||||
|
|
||||||
|
fileLocationButton = createPushButton(buttonComposite, Messages.GenericMainTab_BrowseFileSystem, null);
|
||||||
|
fileLocationButton.addSelectionListener(fListener);
|
||||||
|
addControlAccessibleListener(fileLocationButton, group.getText() + " " + fileLocationButton.getText()); //$NON-NLS-1$
|
||||||
|
|
||||||
|
variablesLocationButton = createPushButton(buttonComposite, Messages.GenericMainTab_Variables, null);
|
||||||
|
variablesLocationButton.addSelectionListener(fListener);
|
||||||
|
addControlAccessibleListener(variablesLocationButton,
|
||||||
|
group.getText() + " " + variablesLocationButton.getText()); //$NON-NLS-1$
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Returns the label used for the location widgets. Subclasses may wish to
|
||||||
|
* override.
|
||||||
|
*/
|
||||||
|
protected String getLocationLabel() {
|
||||||
|
return Messages.GenericMainTab_Location;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Creates the controls needed to edit the working directory attribute of an
|
||||||
|
* external tool
|
||||||
|
*
|
||||||
|
* @param parent
|
||||||
|
* the composite to create the controls in
|
||||||
|
*/
|
||||||
|
protected void createWorkDirectoryComponent(Composite parent) {
|
||||||
|
Group group = new Group(parent, SWT.NONE);
|
||||||
|
String groupName = getWorkingDirectoryLabel();
|
||||||
|
group.setText(groupName);
|
||||||
|
GridLayout layout = new GridLayout();
|
||||||
|
layout.numColumns = 1;
|
||||||
|
GridData gridData = new GridData(GridData.FILL_HORIZONTAL);
|
||||||
|
group.setLayout(layout);
|
||||||
|
group.setLayoutData(gridData);
|
||||||
|
|
||||||
|
workDirectoryField = new Text(group, SWT.BORDER);
|
||||||
|
GridData data = new GridData(GridData.FILL_HORIZONTAL);
|
||||||
|
data.widthHint = IDialogConstants.ENTRY_FIELD_WIDTH;
|
||||||
|
workDirectoryField.setLayoutData(data);
|
||||||
|
workDirectoryField.addModifyListener(fListener);
|
||||||
|
addControlAccessibleListener(workDirectoryField, group.getText());
|
||||||
|
|
||||||
|
Composite buttonComposite = new Composite(group, SWT.NONE);
|
||||||
|
layout = new GridLayout();
|
||||||
|
layout.marginWidth = 0;
|
||||||
|
layout.marginHeight = 0;
|
||||||
|
layout.numColumns = 3;
|
||||||
|
gridData = new GridData(GridData.HORIZONTAL_ALIGN_END);
|
||||||
|
buttonComposite.setLayout(layout);
|
||||||
|
buttonComposite.setLayoutData(gridData);
|
||||||
|
buttonComposite.setFont(parent.getFont());
|
||||||
|
|
||||||
|
workspaceWorkingDirectoryButton = createPushButton(buttonComposite, Messages.GenericMainTab_BrowseWorkspace, null);
|
||||||
|
workspaceWorkingDirectoryButton.addSelectionListener(fListener);
|
||||||
|
addControlAccessibleListener(workspaceWorkingDirectoryButton,
|
||||||
|
group.getText() + " " + workspaceWorkingDirectoryButton.getText()); //$NON-NLS-1$
|
||||||
|
|
||||||
|
fileWorkingDirectoryButton = createPushButton(buttonComposite, Messages.GenericMainTab_BrowseFileSystem, null);
|
||||||
|
fileWorkingDirectoryButton.addSelectionListener(fListener);
|
||||||
|
addControlAccessibleListener(fileWorkingDirectoryButton, group.getText() + " " + fileLocationButton.getText()); //$NON-NLS-1$
|
||||||
|
|
||||||
|
variablesWorkingDirectoryButton = createPushButton(buttonComposite, Messages.GenericMainTab_Variables, null);
|
||||||
|
variablesWorkingDirectoryButton.addSelectionListener(fListener);
|
||||||
|
addControlAccessibleListener(variablesWorkingDirectoryButton,
|
||||||
|
group.getText() + " " + variablesWorkingDirectoryButton.getText()); //$NON-NLS-1$
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Return the String to use as the label for the working directory field.
|
||||||
|
* Subclasses may wish to override.
|
||||||
|
*/
|
||||||
|
protected String getWorkingDirectoryLabel() {
|
||||||
|
return Messages.GenericMainTab_WorkingDirectory;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Creates the controls needed to edit the argument and prompt for argument
|
||||||
|
* attributes of an external tool
|
||||||
|
*
|
||||||
|
* @param parent
|
||||||
|
* the composite to create the controls in
|
||||||
|
*/
|
||||||
|
protected void createArgumentComponent(Composite parent) {
|
||||||
|
Group group = new Group(parent, SWT.NONE);
|
||||||
|
String groupName = Messages.GenericMainTab_Arguments;
|
||||||
|
group.setText(groupName);
|
||||||
|
GridLayout layout = new GridLayout();
|
||||||
|
layout.numColumns = 1;
|
||||||
|
GridData gridData = new GridData(GridData.FILL_BOTH);
|
||||||
|
group.setLayout(layout);
|
||||||
|
group.setLayoutData(gridData);
|
||||||
|
group.setFont(parent.getFont());
|
||||||
|
|
||||||
|
argumentField = new Text(group, SWT.MULTI | SWT.WRAP | SWT.BORDER | SWT.V_SCROLL);
|
||||||
|
argumentField.addTraverseListener(new TraverseListener() {
|
||||||
|
@Override
|
||||||
|
public void keyTraversed(TraverseEvent event) {
|
||||||
|
if (event.detail == SWT.TRAVERSE_RETURN && (event.stateMask & SWT.MODIFIER_MASK) != 0) {
|
||||||
|
event.doit = true;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
|
gridData = new GridData(GridData.FILL_BOTH);
|
||||||
|
gridData.widthHint = IDialogConstants.ENTRY_FIELD_WIDTH;
|
||||||
|
gridData.heightHint = 30;
|
||||||
|
argumentField.setLayoutData(gridData);
|
||||||
|
argumentField.addModifyListener(fListener);
|
||||||
|
addControlAccessibleListener(argumentField, group.getText());
|
||||||
|
|
||||||
|
Composite composite = new Composite(group, SWT.NONE);
|
||||||
|
layout = new GridLayout();
|
||||||
|
layout.numColumns = 1;
|
||||||
|
layout.marginHeight = 0;
|
||||||
|
layout.marginWidth = 0;
|
||||||
|
gridData = new GridData(GridData.HORIZONTAL_ALIGN_END);
|
||||||
|
composite.setLayout(layout);
|
||||||
|
composite.setLayoutData(gridData);
|
||||||
|
composite.setFont(parent.getFont());
|
||||||
|
|
||||||
|
argumentVariablesButton = createPushButton(composite, Messages.GenericMainTab_Variables, null);
|
||||||
|
argumentVariablesButton.addSelectionListener(fListener);
|
||||||
|
addControlAccessibleListener(argumentVariablesButton, argumentVariablesButton.getText()); // need to strip the
|
||||||
|
// mnemonic from
|
||||||
|
// buttons
|
||||||
|
|
||||||
|
Label instruction = new Label(group, SWT.NONE);
|
||||||
|
instruction.setText(Messages.GenericMainTab_Quotes);
|
||||||
|
gridData = new GridData(GridData.HORIZONTAL_ALIGN_FILL);
|
||||||
|
gridData.horizontalSpan = 2;
|
||||||
|
instruction.setLayoutData(gridData);
|
||||||
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
* (non-Javadoc)
|
||||||
|
*
|
||||||
|
* @see
|
||||||
|
* org.eclipse.debug.ui.ILaunchConfigurationTab#setDefaults(org.eclipse.debug.
|
||||||
|
* core.ILaunchConfigurationWorkingCopy)
|
||||||
|
*/
|
||||||
|
@Override
|
||||||
|
public void setDefaults(ILaunchConfigurationWorkingCopy configuration) {
|
||||||
|
configuration.setAttribute(FIRST_EDIT, true);
|
||||||
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
* (non-Javadoc)
|
||||||
|
*
|
||||||
|
* @see
|
||||||
|
* org.eclipse.debug.ui.ILaunchConfigurationTab#initializeFrom(org.eclipse.debug
|
||||||
|
* .core.ILaunchConfiguration)
|
||||||
|
*/
|
||||||
|
@Override
|
||||||
|
public void initializeFrom(ILaunchConfiguration configuration) {
|
||||||
|
fInitializing = true;
|
||||||
|
updateLocation(configuration);
|
||||||
|
updateWorkingDirectory(configuration);
|
||||||
|
updateArgument(configuration);
|
||||||
|
fInitializing = false;
|
||||||
|
setDirty(false);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Updates the working directory widgets to match the state of the given launch
|
||||||
|
* configuration.
|
||||||
|
*/
|
||||||
|
protected void updateWorkingDirectory(ILaunchConfiguration configuration) {
|
||||||
|
String workingDir = ""; //$NON-NLS-1$
|
||||||
|
try {
|
||||||
|
workingDir = configuration.getAttribute(ICDTLaunchConfigurationConstants.ATTR_WORKING_DIRECTORY, ""); //$NON-NLS-1$
|
||||||
|
} catch (CoreException ce) {
|
||||||
|
LaunchUIPlugin.log(ce.getStatus());
|
||||||
|
}
|
||||||
|
workDirectoryField.setText(workingDir);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Updates the location widgets to match the state of the given launch
|
||||||
|
* configuration.
|
||||||
|
*/
|
||||||
|
protected void updateLocation(ILaunchConfiguration configuration) {
|
||||||
|
String location = ""; //$NON-NLS-1$
|
||||||
|
try {
|
||||||
|
location = configuration.getAttribute(ICDTLaunchConfigurationConstants.ATTR_LOCATION, ""); //$NON-NLS-1$
|
||||||
|
} catch (CoreException ce) {
|
||||||
|
LaunchUIPlugin.log(ce.getStatus());
|
||||||
|
}
|
||||||
|
locationField.setText(location);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Updates the argument widgets to match the state of the given launch
|
||||||
|
* configuration.
|
||||||
|
*/
|
||||||
|
protected void updateArgument(ILaunchConfiguration configuration) {
|
||||||
|
String arguments = ""; //$NON-NLS-1$
|
||||||
|
try {
|
||||||
|
arguments = configuration.getAttribute(ICDTLaunchConfigurationConstants.ATTR_TOOL_ARGUMENTS, ""); //$NON-NLS-1$
|
||||||
|
} catch (CoreException ce) {
|
||||||
|
LaunchUIPlugin.log(ce.getStatus());
|
||||||
|
}
|
||||||
|
argumentField.setText(arguments);
|
||||||
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
* (non-Javadoc)
|
||||||
|
*
|
||||||
|
* @see
|
||||||
|
* org.eclipse.debug.ui.ILaunchConfigurationTab#performApply(org.eclipse.debug.
|
||||||
|
* core.ILaunchConfigurationWorkingCopy)
|
||||||
|
*/
|
||||||
|
@Override
|
||||||
|
public void performApply(ILaunchConfigurationWorkingCopy configuration) {
|
||||||
|
String location = locationField.getText().trim();
|
||||||
|
if (location.length() == 0) {
|
||||||
|
configuration.setAttribute(ICDTLaunchConfigurationConstants.ATTR_LOCATION, (String) null);
|
||||||
|
} else {
|
||||||
|
configuration.setAttribute(ICDTLaunchConfigurationConstants.ATTR_LOCATION, location);
|
||||||
|
}
|
||||||
|
|
||||||
|
String workingDirectory = workDirectoryField.getText().trim();
|
||||||
|
if (workingDirectory.length() == 0) {
|
||||||
|
configuration.setAttribute(ICDTLaunchConfigurationConstants.ATTR_WORKING_DIRECTORY, (String) null);
|
||||||
|
} else {
|
||||||
|
configuration.setAttribute(ICDTLaunchConfigurationConstants.ATTR_WORKING_DIRECTORY, workingDirectory);
|
||||||
|
}
|
||||||
|
|
||||||
|
String arguments = argumentField.getText().trim();
|
||||||
|
if (arguments.length() == 0) {
|
||||||
|
configuration.setAttribute(ICDTLaunchConfigurationConstants.ATTR_TOOL_ARGUMENTS, (String) null);
|
||||||
|
} else {
|
||||||
|
configuration.setAttribute(ICDTLaunchConfigurationConstants.ATTR_TOOL_ARGUMENTS, arguments);
|
||||||
|
}
|
||||||
|
|
||||||
|
if (userEdited) {
|
||||||
|
configuration.setAttribute(FIRST_EDIT, (String) null);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
* (non-Javadoc)
|
||||||
|
*
|
||||||
|
* @see org.eclipse.debug.ui.ILaunchConfigurationTab#getName()
|
||||||
|
*/
|
||||||
|
@Override
|
||||||
|
public String getName() {
|
||||||
|
return Messages.GenericMainTab_Main;
|
||||||
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
* (non-Javadoc)
|
||||||
|
*
|
||||||
|
* @see
|
||||||
|
* org.eclipse.debug.ui.ILaunchConfigurationTab#isValid(org.eclipse.debug.core.
|
||||||
|
* ILaunchConfiguration)
|
||||||
|
*/
|
||||||
|
@Override
|
||||||
|
public boolean isValid(ILaunchConfiguration launchConfig) {
|
||||||
|
setErrorMessage(null);
|
||||||
|
setMessage(null);
|
||||||
|
boolean newConfig = false;
|
||||||
|
try {
|
||||||
|
newConfig = launchConfig.getAttribute(FIRST_EDIT, false);
|
||||||
|
} catch (CoreException e) {
|
||||||
|
// assume false is correct
|
||||||
|
}
|
||||||
|
return validateLocation(newConfig) && validateWorkDirectory();
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Validates the content of the location field.
|
||||||
|
*/
|
||||||
|
protected boolean validateLocation(boolean newConfig) {
|
||||||
|
String location = locationField.getText().trim();
|
||||||
|
if (location.length() < 1) {
|
||||||
|
setErrorMessage(null);
|
||||||
|
setMessage(Messages.GenericMainTab_SpecifyLocation);
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
String expandedLocation = null;
|
||||||
|
try {
|
||||||
|
expandedLocation = resolveValue(location);
|
||||||
|
if (expandedLocation == null) { // a variable that needs to be resolved at runtime
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
} catch (CoreException e) {
|
||||||
|
setErrorMessage(e.getStatus().getMessage());
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
File file = new File(expandedLocation);
|
||||||
|
if (!file.exists()) { // The file does not exist.
|
||||||
|
if (!newConfig) {
|
||||||
|
setErrorMessage(Messages.GenericMainTab_LocationNotExists);
|
||||||
|
}
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
if (!file.isFile()) {
|
||||||
|
if (!newConfig) {
|
||||||
|
setErrorMessage(Messages.GenericMainTab_LocationNotAFile);
|
||||||
|
}
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Validates the variables of the given string to determine if all variables are
|
||||||
|
* valid
|
||||||
|
*
|
||||||
|
* @param expression
|
||||||
|
* expression with variables
|
||||||
|
* @exception CoreException
|
||||||
|
* if a variable is specified that does not exist
|
||||||
|
*/
|
||||||
|
private void validateVaribles(String expression) throws CoreException {
|
||||||
|
IStringVariableManager manager = VariablesPlugin.getDefault().getStringVariableManager();
|
||||||
|
manager.validateStringVariables(expression);
|
||||||
|
}
|
||||||
|
|
||||||
|
private String resolveValue(String expression) throws CoreException {
|
||||||
|
String expanded = null;
|
||||||
|
try {
|
||||||
|
expanded = getValue(expression);
|
||||||
|
} catch (CoreException e) { // possibly just a variable that needs to be resolved at runtime
|
||||||
|
validateVaribles(expression);
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
return expanded;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Validates the value of the given string to determine if any/all variables are
|
||||||
|
* valid
|
||||||
|
*
|
||||||
|
* @param expression
|
||||||
|
* expression with variables
|
||||||
|
* @return whether the expression contained any variable values
|
||||||
|
* @exception CoreException
|
||||||
|
* if variable resolution fails
|
||||||
|
*/
|
||||||
|
private String getValue(String expression) throws CoreException {
|
||||||
|
IStringVariableManager manager = VariablesPlugin.getDefault().getStringVariableManager();
|
||||||
|
return manager.performStringSubstitution(expression);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Validates the content of the working directory field.
|
||||||
|
*/
|
||||||
|
protected boolean validateWorkDirectory() {
|
||||||
|
String dir = workDirectoryField.getText().trim();
|
||||||
|
if (dir.length() <= 0) {
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
String expandedDir = null;
|
||||||
|
try {
|
||||||
|
expandedDir = resolveValue(dir);
|
||||||
|
if (expandedDir == null) { // a variable that needs to be resolved at runtime
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
} catch (CoreException e) {
|
||||||
|
setErrorMessage(e.getStatus().getMessage());
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
File file = new File(expandedDir);
|
||||||
|
if (!file.exists()) { // The directory does not exist.
|
||||||
|
setErrorMessage(Messages.GenericMainTab_WorkingDirNotExists);
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
if (!file.isDirectory()) {
|
||||||
|
setErrorMessage(Messages.GenericMainTab_WorkingDirNotADir);
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Prompts the user to choose a location from the filesystem and sets the
|
||||||
|
* location as the full path of the selected file.
|
||||||
|
*/
|
||||||
|
protected void handleFileLocationButtonSelected() {
|
||||||
|
FileDialog fileDialog = new FileDialog(getShell(), SWT.NONE);
|
||||||
|
fileDialog.setFileName(locationField.getText());
|
||||||
|
String text = fileDialog.open();
|
||||||
|
if (text != null) {
|
||||||
|
locationField.setText(text);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Prompts the user for a workspace location within the workspace and sets the
|
||||||
|
* location as a String containing the workspace_loc variable or
|
||||||
|
* <code>null</code> if no location was obtained from the user.
|
||||||
|
*/
|
||||||
|
protected void handleWorkspaceLocationButtonSelected() {
|
||||||
|
ResourceSelectionDialog dialog;
|
||||||
|
dialog = new ResourceSelectionDialog(getShell(), ResourcesPlugin.getWorkspace().getRoot(),
|
||||||
|
Messages.GenericMainTab_SelectResource);
|
||||||
|
dialog.open();
|
||||||
|
Object[] results = dialog.getResult();
|
||||||
|
if (results == null || results.length < 1) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
IResource resource = (IResource) results[0];
|
||||||
|
locationField.setText(newVariableExpression("workspace_loc", resource.getFullPath().toString())); //$NON-NLS-1$
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Prompts the user for a working directory location within the workspace and
|
||||||
|
* sets the working directory as a String containing the workspace_loc variable
|
||||||
|
* or <code>null</code> if no location was obtained from the user.
|
||||||
|
*/
|
||||||
|
protected void handleWorkspaceWorkingDirectoryButtonSelected() {
|
||||||
|
ContainerSelectionDialog containerDialog;
|
||||||
|
containerDialog = new ContainerSelectionDialog(getShell(), ResourcesPlugin.getWorkspace().getRoot(), false,
|
||||||
|
Messages.GenericMainTab_SelectWorkingDir);
|
||||||
|
containerDialog.open();
|
||||||
|
Object[] resource = containerDialog.getResult();
|
||||||
|
String text = null;
|
||||||
|
if (resource != null && resource.length > 0) {
|
||||||
|
text = newVariableExpression("workspace_loc", ((IPath) resource[0]).toString()); //$NON-NLS-1$
|
||||||
|
}
|
||||||
|
if (text != null) {
|
||||||
|
workDirectoryField.setText(text);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Returns a new variable expression with the given variable and the given
|
||||||
|
* argument.
|
||||||
|
*
|
||||||
|
* @see IStringVariableManager#generateVariableExpression(String, String)
|
||||||
|
*/
|
||||||
|
protected String newVariableExpression(String varName, String arg) {
|
||||||
|
return VariablesPlugin.getDefault().getStringVariableManager().generateVariableExpression(varName, arg);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Prompts the user to choose a working directory from the filesystem.
|
||||||
|
*/
|
||||||
|
protected void handleFileWorkingDirectoryButtonSelected() {
|
||||||
|
DirectoryDialog dialog = new DirectoryDialog(getShell(), SWT.SAVE);
|
||||||
|
dialog.setMessage(Messages.GenericMainTab_SelectWorkingDir);
|
||||||
|
dialog.setFilterPath(workDirectoryField.getText());
|
||||||
|
String text = dialog.open();
|
||||||
|
if (text != null) {
|
||||||
|
workDirectoryField.setText(text);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* A variable entry button has been pressed for the given text field. Prompt the
|
||||||
|
* user for a variable and enter the result in the given field.
|
||||||
|
*/
|
||||||
|
private void handleVariablesButtonSelected(Text textField) {
|
||||||
|
String variable = getVariable();
|
||||||
|
if (variable != null) {
|
||||||
|
textField.insert(variable);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Prompts the user to choose and configure a variable and returns the resulting
|
||||||
|
* string, suitable to be used as an attribute.
|
||||||
|
*/
|
||||||
|
private String getVariable() {
|
||||||
|
StringVariableSelectionDialog dialog = new StringVariableSelectionDialog(getShell());
|
||||||
|
dialog.open();
|
||||||
|
return dialog.getVariableExpression();
|
||||||
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
* (non-Javadoc)
|
||||||
|
*
|
||||||
|
* @see org.eclipse.debug.ui.ILaunchConfigurationTab#getImage()
|
||||||
|
*/
|
||||||
|
@Override
|
||||||
|
public Image getImage() {
|
||||||
|
return LaunchImages.get(LaunchImages.IMG_VIEW_MAIN_TAB);
|
||||||
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
* (non-Javadoc)
|
||||||
|
*
|
||||||
|
* @see
|
||||||
|
* org.eclipse.debug.ui.ILaunchConfigurationTab#deactivated(org.eclipse.debug.
|
||||||
|
* core.ILaunchConfigurationWorkingCopy)
|
||||||
|
*/
|
||||||
|
@Override
|
||||||
|
public void deactivated(ILaunchConfigurationWorkingCopy workingCopy) {
|
||||||
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
* (non-Javadoc)
|
||||||
|
*
|
||||||
|
* @see
|
||||||
|
* org.eclipse.debug.ui.ILaunchConfigurationTab#activated(org.eclipse.debug.core
|
||||||
|
* .ILaunchConfigurationWorkingCopy)
|
||||||
|
*/
|
||||||
|
@Override
|
||||||
|
public void activated(ILaunchConfigurationWorkingCopy workingCopy) {
|
||||||
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Fix for Bug 60163 Accessibility: New Builder Dialog missing object info for
|
||||||
|
* textInput controls
|
||||||
|
*/
|
||||||
|
public void addControlAccessibleListener(Control control, String controlName) {
|
||||||
|
// strip mnemonic (&)
|
||||||
|
String[] strs = controlName.split("&"); //$NON-NLS-1$
|
||||||
|
StringBuffer stripped = new StringBuffer();
|
||||||
|
for (int i = 0; i < strs.length; i++) {
|
||||||
|
stripped.append(strs[i]);
|
||||||
|
}
|
||||||
|
control.getAccessible().addAccessibleListener(new ControlAccessibleListener(stripped.toString()));
|
||||||
|
}
|
||||||
|
|
||||||
|
private class ControlAccessibleListener extends AccessibleAdapter {
|
||||||
|
private String controlName;
|
||||||
|
|
||||||
|
ControlAccessibleListener(String name) {
|
||||||
|
controlName = name;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void getName(AccessibleEvent e) {
|
||||||
|
e.result = controlName;
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
|
@ -308,7 +308,7 @@ public class SerialPort {
|
||||||
return outputStream;
|
return outputStream;
|
||||||
}
|
}
|
||||||
|
|
||||||
public void open() throws IOException {
|
public synchronized void open() throws IOException {
|
||||||
handle = open0(portName, baudRate.getRate(), byteSize.getSize(), parity.ordinal(), stopBits.ordinal());
|
handle = open0(portName, baudRate.getRate(), byteSize.getSize(), parity.ordinal(), stopBits.ordinal());
|
||||||
isOpen = true;
|
isOpen = true;
|
||||||
|
|
||||||
|
@ -356,18 +356,26 @@ public class SerialPort {
|
||||||
}
|
}
|
||||||
|
|
||||||
public void pause() throws IOException {
|
public void pause() throws IOException {
|
||||||
isPaused = true;
|
if (!isOpen) {
|
||||||
close0(handle);
|
return;
|
||||||
try {
|
}
|
||||||
// Sleep for a second since some serial ports take a while to actually close
|
synchronized (pauseMutex) {
|
||||||
Thread.sleep(500);
|
isPaused = true;
|
||||||
} catch (InterruptedException e) {
|
close0(handle);
|
||||||
// nothing to do
|
try {
|
||||||
|
// Sleep for a second since some serial ports take a while to actually close
|
||||||
|
Thread.sleep(500);
|
||||||
|
} catch (InterruptedException e) {
|
||||||
|
// nothing to do
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
public void resume() throws IOException {
|
public void resume() throws IOException {
|
||||||
synchronized (pauseMutex) {
|
synchronized (pauseMutex) {
|
||||||
|
if (!isPaused) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
isPaused = false;
|
isPaused = false;
|
||||||
handle = open0(portName, baudRate.getRate(), byteSize.getSize(), parity.ordinal(), stopBits.ordinal());
|
handle = open0(portName, baudRate.getRate(), byteSize.getSize(), parity.ordinal(), stopBits.ordinal());
|
||||||
isOpen = true;
|
isOpen = true;
|
||||||
|
|
5
pom.xml
5
pom.xml
|
@ -102,7 +102,10 @@
|
||||||
<module>cross/org.eclipse.cdt.build.crossgcc-feature</module>
|
<module>cross/org.eclipse.cdt.build.crossgcc-feature</module>
|
||||||
<module>cross/org.eclipse.cdt.launch.remote</module>
|
<module>cross/org.eclipse.cdt.launch.remote</module>
|
||||||
<module>cross/org.eclipse.cdt.launch.remote-feature</module>
|
<module>cross/org.eclipse.cdt.launch.remote-feature</module>
|
||||||
|
<module>cross/org.eclipse.cdt.launch.serial.core</module>
|
||||||
|
<module>cross/org.eclipse.cdt.launch.serial.ui</module>
|
||||||
|
<module>cross/org.eclipse.cdt.launch.serial-feature</module>
|
||||||
|
|
||||||
<module>debug/org.eclipse.cdt.debug.core</module>
|
<module>debug/org.eclipse.cdt.debug.core</module>
|
||||||
<module>debug/org.eclipse.cdt.debug.ui</module>
|
<module>debug/org.eclipse.cdt.debug.ui</module>
|
||||||
|
|
||||||
|
|
Loading…
Add table
Reference in a new issue