bug 165177: split the plugin into the terminal view and connection contributions
17
org.eclipse.tm.terminal-feature/.project
Normal file
|
@ -0,0 +1,17 @@
|
||||||
|
<?xml version="1.0" encoding="UTF-8"?>
|
||||||
|
<projectDescription>
|
||||||
|
<name>org.eclipse.tm.terminal-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>
|
1
org.eclipse.tm.terminal-feature/build.properties
Normal file
|
@ -0,0 +1 @@
|
||||||
|
bin.includes = feature.xml
|
32
org.eclipse.tm.terminal-feature/feature.xml
Normal file
|
@ -0,0 +1,32 @@
|
||||||
|
<?xml version="1.0" encoding="UTF-8"?>
|
||||||
|
<feature
|
||||||
|
id="org.eclipse.tm.terminal"
|
||||||
|
label="Terminal Feature"
|
||||||
|
version="0.9.0">
|
||||||
|
|
||||||
|
<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>
|
||||||
|
|
||||||
|
<requires>
|
||||||
|
<import plugin="org.eclipse.core.runtime"/>
|
||||||
|
<import plugin="org.eclipse.ui"/>
|
||||||
|
<import plugin="org.eclipse.jface.text"/>
|
||||||
|
</requires>
|
||||||
|
|
||||||
|
<plugin
|
||||||
|
id="org.eclipse.tm.terminal"
|
||||||
|
download-size="12000"
|
||||||
|
install-size="12000"
|
||||||
|
version="0.0.0"
|
||||||
|
unpack="false"/>
|
||||||
|
|
||||||
|
</feature>
|
17
org.eclipse.tm.terminal.serial-feature/.project
Normal file
|
@ -0,0 +1,17 @@
|
||||||
|
<?xml version="1.0" encoding="UTF-8"?>
|
||||||
|
<projectDescription>
|
||||||
|
<name>org.eclipse.tm.terminal.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>
|
1
org.eclipse.tm.terminal.serial-feature/build.properties
Normal file
|
@ -0,0 +1 @@
|
||||||
|
bin.includes = feature.xml
|
32
org.eclipse.tm.terminal.serial-feature/feature.xml
Normal file
|
@ -0,0 +1,32 @@
|
||||||
|
<?xml version="1.0" encoding="UTF-8"?>
|
||||||
|
<feature
|
||||||
|
id="org.eclipse.tm.terminal.serial"
|
||||||
|
label="Terminal Serial Feature"
|
||||||
|
version="0.9.0">
|
||||||
|
|
||||||
|
<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>
|
||||||
|
|
||||||
|
<requires>
|
||||||
|
<import plugin="org.eclipse.ui"/>
|
||||||
|
<import plugin="org.eclipse.core.runtime"/>
|
||||||
|
<import plugin="org.eclipse.tm.terminal"/>
|
||||||
|
</requires>
|
||||||
|
|
||||||
|
<plugin
|
||||||
|
id="org.eclipse.tm.terminal.serial"
|
||||||
|
download-size="0"
|
||||||
|
install-size="0"
|
||||||
|
version="0.0.0"
|
||||||
|
unpack="false"/>
|
||||||
|
|
||||||
|
</feature>
|
8
org.eclipse.tm.terminal.serial/.classpath
Normal file
|
@ -0,0 +1,8 @@
|
||||||
|
<?xml version="1.0" encoding="UTF-8"?>
|
||||||
|
<classpath>
|
||||||
|
<classpathentry kind="src" path="src"/>
|
||||||
|
<classpathentry exported="true" kind="lib" path="comm.jar"/>
|
||||||
|
<classpathentry kind="con" path="org.eclipse.jdt.launching.JRE_CONTAINER/org.eclipse.jdt.internal.debug.ui.launcher.StandardVMType/J2SE-1.4"/>
|
||||||
|
<classpathentry kind="con" path="org.eclipse.pde.core.requiredPlugins"/>
|
||||||
|
<classpathentry kind="output" path="bin"/>
|
||||||
|
</classpath>
|
34
org.eclipse.tm.terminal.serial/.project
Normal file
|
@ -0,0 +1,34 @@
|
||||||
|
<?xml version="1.0" encoding="UTF-8"?>
|
||||||
|
<projectDescription>
|
||||||
|
<name>org.eclipse.tm.terminal.serial</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>
|
||||||
|
<buildCommand>
|
||||||
|
<name>net.sourceforge.metrics.builder</name>
|
||||||
|
<arguments>
|
||||||
|
</arguments>
|
||||||
|
</buildCommand>
|
||||||
|
</buildSpec>
|
||||||
|
<natures>
|
||||||
|
<nature>org.eclipse.pde.PluginNature</nature>
|
||||||
|
<nature>org.eclipse.jdt.core.javanature</nature>
|
||||||
|
<nature>net.sourceforge.metrics.nature</nature>
|
||||||
|
</natures>
|
||||||
|
</projectDescription>
|
|
@ -0,0 +1,7 @@
|
||||||
|
#Wed Nov 29 05:39:06 CET 2006
|
||||||
|
eclipse.preferences.version=1
|
||||||
|
org.eclipse.jdt.core.compiler.codegen.targetPlatform=1.2
|
||||||
|
org.eclipse.jdt.core.compiler.compliance=1.4
|
||||||
|
org.eclipse.jdt.core.compiler.problem.assertIdentifier=warning
|
||||||
|
org.eclipse.jdt.core.compiler.problem.enumIdentifier=warning
|
||||||
|
org.eclipse.jdt.core.compiler.source=1.3
|
14
org.eclipse.tm.terminal.serial/META-INF/MANIFEST.MF
Normal file
|
@ -0,0 +1,14 @@
|
||||||
|
Manifest-Version: 1.0
|
||||||
|
Bundle-ManifestVersion: 2
|
||||||
|
Bundle-Name: %pluginName
|
||||||
|
Bundle-SymbolicName: org.eclipse.tm.terminal.serial;singleton:=true
|
||||||
|
Bundle-Version: 0.9.0
|
||||||
|
Bundle-Localization: plugin
|
||||||
|
Require-Bundle: org.eclipse.ui,
|
||||||
|
org.eclipse.core.runtime,
|
||||||
|
org.eclipse.tm.terminal
|
||||||
|
Eclipse-LazyStart: false
|
||||||
|
Bundle-Vendor: %providerName
|
||||||
|
Bundle-RequiredExecutionEnvironment: J2SE-1.4
|
||||||
|
Bundle-ClassPath: .,
|
||||||
|
comm.jar
|
4
org.eclipse.tm.terminal.serial/README.txt
Normal file
|
@ -0,0 +1,4 @@
|
||||||
|
Important note:
|
||||||
|
|
||||||
|
In order to compile this plugin, comm has to be installed into
|
||||||
|
the java installation...
|
16
org.eclipse.tm.terminal.serial/build.properties
Normal file
|
@ -0,0 +1,16 @@
|
||||||
|
source.. = src/
|
||||||
|
output.. = bin/
|
||||||
|
bin.includes = META-INF/,\
|
||||||
|
.,\
|
||||||
|
plugin.xml,\
|
||||||
|
comm.jar
|
||||||
|
src.includes = .classpath,\
|
||||||
|
.project,\
|
||||||
|
.settings/,\
|
||||||
|
META-INF/,\
|
||||||
|
README.txt,\
|
||||||
|
build.properties,\
|
||||||
|
plugin.properties,\
|
||||||
|
plugin.xml,\
|
||||||
|
src/,\
|
||||||
|
comm.jar
|
6
org.eclipse.tm.terminal.serial/plugin.properties
Normal file
|
@ -0,0 +1,6 @@
|
||||||
|
##########################################################################
|
||||||
|
# Copyright 2004 Wind River Systems, Inc. All rights reserved.
|
||||||
|
##########################################################################
|
||||||
|
|
||||||
|
pluginName = Serial Terminal
|
||||||
|
providerName = Eclipse.org
|
9
org.eclipse.tm.terminal.serial/plugin.xml
Normal file
|
@ -0,0 +1,9 @@
|
||||||
|
<?xml version="1.0" encoding="UTF-8"?>
|
||||||
|
<?eclipse version="3.2"?>
|
||||||
|
<plugin>
|
||||||
|
<extension
|
||||||
|
point="org.eclipse.tm.terminal.terminalConnector">
|
||||||
|
<connector class="org.eclipse.tm.terminal.internal.serial.SerialConnector"/>
|
||||||
|
</extension>
|
||||||
|
|
||||||
|
</plugin>
|
|
@ -0,0 +1,28 @@
|
||||||
|
/*******************************************************************************
|
||||||
|
* Copyright (c) 2006 Wind River Systems, Inc. and others.
|
||||||
|
* All rights reserved. This program and the accompanying materials
|
||||||
|
* are made available under the terms of the Eclipse Public License v1.0
|
||||||
|
* which accompanies this distribution, and is available at
|
||||||
|
* http://www.eclipse.org/legal/epl-v10.html
|
||||||
|
*
|
||||||
|
* Contributors:
|
||||||
|
* Wind River Systems, Inc. - initial implementation
|
||||||
|
*
|
||||||
|
*******************************************************************************/
|
||||||
|
package org.eclipse.tm.terminal.internal.serial;
|
||||||
|
|
||||||
|
import org.eclipse.tm.terminal.ISettingsStore;
|
||||||
|
|
||||||
|
public interface ISerialSettings {
|
||||||
|
|
||||||
|
String getSerialPort();
|
||||||
|
int getBaudRate();
|
||||||
|
int getDataBits();
|
||||||
|
int getStopBits();
|
||||||
|
int getParity();
|
||||||
|
int getFlowControl();
|
||||||
|
int getTimeout();
|
||||||
|
String getStatusString(String strConnected);
|
||||||
|
void load(ISettingsStore store);
|
||||||
|
void save(ISettingsStore store);
|
||||||
|
}
|
|
@ -0,0 +1,64 @@
|
||||||
|
/*******************************************************************************
|
||||||
|
* Copyright (c) 2006 Wind River Systems, Inc. and others.
|
||||||
|
* All rights reserved. This program and the accompanying materials
|
||||||
|
* are made available under the terms of the Eclipse Public License v1.0
|
||||||
|
* which accompanies this distribution, and is available at
|
||||||
|
* http://www.eclipse.org/legal/epl-v10.html
|
||||||
|
*
|
||||||
|
* Contributors:
|
||||||
|
* Wind River Systems, Inc. - initial implementation
|
||||||
|
*
|
||||||
|
*******************************************************************************/
|
||||||
|
package org.eclipse.tm.terminal.internal.serial;
|
||||||
|
|
||||||
|
import javax.comm.CommPortIdentifier;
|
||||||
|
import javax.comm.PortInUseException;
|
||||||
|
import javax.comm.SerialPort;
|
||||||
|
|
||||||
|
import org.eclipse.tm.terminal.ITerminalControl;
|
||||||
|
import org.eclipse.tm.terminal.TerminalState;
|
||||||
|
|
||||||
|
public class SerialConnectWorker extends Thread {
|
||||||
|
private final ITerminalControl fControl;
|
||||||
|
private final SerialConnector fConn;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* UNDER CONSTRUCTION
|
||||||
|
* @param conn TODO
|
||||||
|
* @param control TODO
|
||||||
|
*/
|
||||||
|
public SerialConnectWorker(SerialConnector conn, ITerminalControl control) {
|
||||||
|
super();
|
||||||
|
fControl = control;
|
||||||
|
fConn = conn;
|
||||||
|
fControl.setState(TerminalState.CONNECTING);
|
||||||
|
}
|
||||||
|
public void run() {
|
||||||
|
|
||||||
|
try {
|
||||||
|
fControl.setState(TerminalState.OPENED);
|
||||||
|
String strID = getClass().getPackage().getName();
|
||||||
|
ISerialSettings s=fConn.getSerialSettings();
|
||||||
|
|
||||||
|
fConn.setSerialPortHandler(new SerialPortHandler(fConn,fControl));
|
||||||
|
fConn.setSerialPortIdentifier(CommPortIdentifier.getPortIdentifier(s.getSerialPort()));
|
||||||
|
int timeoutInMs = s.getTimeout() * 1000;
|
||||||
|
|
||||||
|
SerialPort serialPort=(SerialPort) fConn.getSerialPortIdentifier().open(strID,timeoutInMs);
|
||||||
|
serialPort.setSerialPortParams(s.getBaudRate(), s.getDataBits(), s.getStopBits(), s.getParity());
|
||||||
|
serialPort.setFlowControlMode(s.getFlowControl());
|
||||||
|
serialPort.addEventListener(fConn.getSerialPortHandler());
|
||||||
|
serialPort.notifyOnDataAvailable(true);
|
||||||
|
fConn.getSerialPortIdentifier().addPortOwnershipListener(fConn.getSerialPortHandler());
|
||||||
|
fConn.setSerialPort(serialPort);
|
||||||
|
fControl.setState(TerminalState.CONNECTED);
|
||||||
|
} catch (PortInUseException portInUseException) {
|
||||||
|
fConn.setPortInUse(true);
|
||||||
|
fControl.setState(TerminalState.CLOSED);
|
||||||
|
fControl.setMsg("Connection Error!\n" + portInUseException.getMessage()); //$NON-NLS-1$
|
||||||
|
|
||||||
|
} catch (Exception exception) {
|
||||||
|
fControl.setState(TerminalState.CLOSED);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
|
@ -0,0 +1,197 @@
|
||||||
|
/*******************************************************************************
|
||||||
|
* Copyright (c) 2006 Wind River Systems, Inc. and others.
|
||||||
|
* All rights reserved. This program and the accompanying materials
|
||||||
|
* are made available under the terms of the Eclipse Public License v1.0
|
||||||
|
* which accompanies this distribution, and is available at
|
||||||
|
* http://www.eclipse.org/legal/epl-v10.html
|
||||||
|
*
|
||||||
|
* Contributors:
|
||||||
|
* Wind River Systems, Inc. - initial implementation
|
||||||
|
*
|
||||||
|
*******************************************************************************/
|
||||||
|
package org.eclipse.tm.terminal.internal.serial;
|
||||||
|
|
||||||
|
import java.io.IOException;
|
||||||
|
import java.io.InputStream;
|
||||||
|
import java.io.OutputStream;
|
||||||
|
|
||||||
|
import javax.comm.CommPortIdentifier;
|
||||||
|
import javax.comm.SerialPort;
|
||||||
|
|
||||||
|
import org.eclipse.tm.terminal.ISettingsPage;
|
||||||
|
import org.eclipse.tm.terminal.ISettingsStore;
|
||||||
|
import org.eclipse.tm.terminal.ITerminalConnector;
|
||||||
|
import org.eclipse.tm.terminal.ITerminalControl;
|
||||||
|
import org.eclipse.tm.terminal.Logger;
|
||||||
|
import org.eclipse.tm.terminal.TerminalState;
|
||||||
|
|
||||||
|
public class SerialConnector implements ITerminalConnector {
|
||||||
|
private OutputStream fOutputStream;
|
||||||
|
private InputStream fInputStream;
|
||||||
|
private ITerminalControl fControl;
|
||||||
|
private SerialPort fSerialPort;
|
||||||
|
private CommPortIdentifier fSerialPortIdentifier;
|
||||||
|
private SerialPortHandler fTerminalSerialPortHandler;
|
||||||
|
private boolean fIsPortInUse;
|
||||||
|
private final SerialSettings fSettings;
|
||||||
|
public SerialConnector() {
|
||||||
|
SerialSettings settins=null;
|
||||||
|
try {
|
||||||
|
settins=new SerialSettings();
|
||||||
|
} catch (NoClassDefFoundError e) {
|
||||||
|
// the comm library is not installed
|
||||||
|
e.printStackTrace();
|
||||||
|
}
|
||||||
|
fSettings=settins;
|
||||||
|
}
|
||||||
|
public String getId() {
|
||||||
|
return getClass().getName();
|
||||||
|
}
|
||||||
|
public boolean isInstalled() {
|
||||||
|
// check if serial is installed
|
||||||
|
try {
|
||||||
|
return SerialPort.class!=null;
|
||||||
|
} catch (Throwable e) {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
public SerialConnector(SerialSettings settings) {
|
||||||
|
fSettings=settings;
|
||||||
|
}
|
||||||
|
public void connect(ITerminalControl control) {
|
||||||
|
Logger.log("entered."); //$NON-NLS-1$
|
||||||
|
fControl=control;
|
||||||
|
SerialConnectWorker worker = new SerialConnectWorker(this, control);
|
||||||
|
worker.start();
|
||||||
|
}
|
||||||
|
public void disconnect() {
|
||||||
|
Logger.log("entered."); //$NON-NLS-1$
|
||||||
|
|
||||||
|
// Fix for SPR 112422. When output is being received from the serial port, the
|
||||||
|
// below call to removePortOwnershipListener() attempts to lock the serial port
|
||||||
|
// object, but that object is already locked by another Terminal view thread
|
||||||
|
// waiting for the SWT display thread to process a syncExec() call. Since this
|
||||||
|
// method is called on the display thread, the display thread is waiting to
|
||||||
|
// lock the serial port object and the thread holding the serial port object
|
||||||
|
// lock is waiting for the display thread to process a syncExec() call, so the
|
||||||
|
// two threads end up deadlocked, which hangs the Workbench GUI.
|
||||||
|
//
|
||||||
|
// The solution is to spawn a short-lived worker thread that calls
|
||||||
|
// removePortOwnershipListener(), thus preventing the display thread from
|
||||||
|
// deadlocking with the other Terminal view thread.
|
||||||
|
|
||||||
|
new Thread("Terminal View Serial Port Disconnect Worker") //$NON-NLS-1$
|
||||||
|
{
|
||||||
|
public void run() {
|
||||||
|
|
||||||
|
if (getSerialPortIdentifier() != null) {
|
||||||
|
getSerialPortIdentifier()
|
||||||
|
.removePortOwnershipListener(getSerialPortHandler());
|
||||||
|
}
|
||||||
|
|
||||||
|
if (getSerialPort() != null) {
|
||||||
|
getSerialPort().removeEventListener();
|
||||||
|
Logger.log("Calling close() on serial port ..."); //$NON-NLS-1$
|
||||||
|
getSerialPort().close();
|
||||||
|
}
|
||||||
|
|
||||||
|
if (getInputStream() != null) {
|
||||||
|
try {
|
||||||
|
getInputStream().close();
|
||||||
|
} catch (Exception exception) {
|
||||||
|
Logger.logException(exception);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if (getOutputStream() != null) {
|
||||||
|
try {
|
||||||
|
getOutputStream().close();
|
||||||
|
} catch (Exception exception) {
|
||||||
|
Logger.logException(exception);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
setSerialPortIdentifier(null);
|
||||||
|
cleanSerialPort();
|
||||||
|
setSerialPortHandler(null);
|
||||||
|
}
|
||||||
|
|
||||||
|
}.start();
|
||||||
|
fControl.setState(TerminalState.CLOSED);
|
||||||
|
}
|
||||||
|
public InputStream getInputStream() {
|
||||||
|
return fInputStream;
|
||||||
|
}
|
||||||
|
public OutputStream getOutputStream() {
|
||||||
|
return fOutputStream;
|
||||||
|
}
|
||||||
|
private void setInputStream(InputStream inputStream) {
|
||||||
|
fInputStream = inputStream;
|
||||||
|
}
|
||||||
|
private void setOutputStream(OutputStream outputStream) {
|
||||||
|
fOutputStream = outputStream;
|
||||||
|
}
|
||||||
|
public boolean isLocalEcho() {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
public void setTerminalSize(int newWidth, int newHeight) {
|
||||||
|
// TODO
|
||||||
|
}
|
||||||
|
|
||||||
|
protected SerialPort getSerialPort() {
|
||||||
|
return fSerialPort;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* sets the socket to null
|
||||||
|
*/
|
||||||
|
void cleanSerialPort() {
|
||||||
|
fSerialPort=null;
|
||||||
|
setInputStream(null);
|
||||||
|
setOutputStream(null);
|
||||||
|
}
|
||||||
|
|
||||||
|
protected void setSerialPort(SerialPort serialPort) throws IOException {
|
||||||
|
cleanSerialPort();
|
||||||
|
if(serialPort!=null) {
|
||||||
|
fSerialPort = serialPort;
|
||||||
|
setOutputStream(serialPort.getOutputStream());
|
||||||
|
setInputStream(serialPort.getInputStream());
|
||||||
|
}
|
||||||
|
}
|
||||||
|
protected CommPortIdentifier getSerialPortIdentifier() {
|
||||||
|
return fSerialPortIdentifier;
|
||||||
|
}
|
||||||
|
protected void setSerialPortIdentifier(CommPortIdentifier serialPortIdentifier) {
|
||||||
|
fSerialPortIdentifier = serialPortIdentifier;
|
||||||
|
}
|
||||||
|
void setSerialPortHandler(SerialPortHandler serialPortHandler) {
|
||||||
|
fTerminalSerialPortHandler=serialPortHandler;
|
||||||
|
}
|
||||||
|
SerialPortHandler getSerialPortHandler() {
|
||||||
|
return fTerminalSerialPortHandler;
|
||||||
|
}
|
||||||
|
public boolean isPortInUse() {
|
||||||
|
return fIsPortInUse;
|
||||||
|
}
|
||||||
|
public void setPortInUse(boolean b) {
|
||||||
|
fIsPortInUse=true;
|
||||||
|
|
||||||
|
}
|
||||||
|
public ISerialSettings getSerialSettings() {
|
||||||
|
return fSettings;
|
||||||
|
}
|
||||||
|
public ISettingsPage makeSettingsPage() {
|
||||||
|
return new SerialSettingsPage(fSettings);
|
||||||
|
}
|
||||||
|
public String getStatusString(String strConnected) {
|
||||||
|
return fSettings.getStatusString(strConnected);
|
||||||
|
}
|
||||||
|
public void load(ISettingsStore store) {
|
||||||
|
fSettings.load(store);
|
||||||
|
}
|
||||||
|
public void save(ISettingsStore store) {
|
||||||
|
fSettings.save(store);
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
|
@ -0,0 +1,30 @@
|
||||||
|
/*******************************************************************************
|
||||||
|
* Copyright (c) 2006 Wind River Systems, Inc. and others.
|
||||||
|
* All rights reserved. This program and the accompanying materials
|
||||||
|
* are made available under the terms of the Eclipse Public License v1.0
|
||||||
|
* which accompanies this distribution, and is available at
|
||||||
|
* http://www.eclipse.org/legal/epl-v10.html
|
||||||
|
*
|
||||||
|
* Contributors:
|
||||||
|
* Wind River Systems, Inc. - initial implementation
|
||||||
|
*
|
||||||
|
*******************************************************************************/
|
||||||
|
package org.eclipse.tm.terminal.internal.serial;
|
||||||
|
|
||||||
|
import org.eclipse.osgi.util.NLS;
|
||||||
|
public class SerialMessages extends NLS {
|
||||||
|
static {
|
||||||
|
NLS.initializeMessages(SerialMessages.class.getName(), SerialMessages.class);
|
||||||
|
}
|
||||||
|
public static String CONNTYPE_SERIAL;
|
||||||
|
public static String PROP_TITLE;
|
||||||
|
public static String PORT;
|
||||||
|
public static String BAUDRATE;
|
||||||
|
public static String DATABITS;
|
||||||
|
public static String STOPBITS;
|
||||||
|
public static String PARITY;
|
||||||
|
public static String FLOWCONTROL;
|
||||||
|
public static String PORT_IN_USE;
|
||||||
|
public static String TIMEOUT;
|
||||||
|
|
||||||
|
}
|
|
@ -0,0 +1,21 @@
|
||||||
|
###############################################################################
|
||||||
|
# Copyright (c) 2006 Wind River Systems, Inc. and others.
|
||||||
|
# All rights reserved. This program and the accompanying materials
|
||||||
|
# are made available under the terms of the Eclipse Public License v1.0
|
||||||
|
# which accompanies this distribution, and is available at
|
||||||
|
# http://www.eclipse.org/legal/epl-v10.html
|
||||||
|
#
|
||||||
|
# Contributors:
|
||||||
|
# Wind River Systems, Inc. - initial implementation
|
||||||
|
#
|
||||||
|
###############################################################################
|
||||||
|
PORT_IN_USE = Serial port \''{0}\'' is currently in use\!\nDo you want to close the port?
|
||||||
|
CONNTYPE_SERIAL = Serial
|
||||||
|
PROP_TITLE = Terminal
|
||||||
|
PORT = Port
|
||||||
|
BAUDRATE = Baud Rate
|
||||||
|
DATABITS = Data Bits
|
||||||
|
STOPBITS = Stop Bits
|
||||||
|
PARITY = Parity
|
||||||
|
FLOWCONTROL = Flow Control
|
||||||
|
TIMEOUT = Timeout (sec)
|
|
@ -0,0 +1,107 @@
|
||||||
|
/*******************************************************************************
|
||||||
|
* Copyright (c) 2006 Wind River Systems, Inc. and others.
|
||||||
|
* All rights reserved. This program and the accompanying materials
|
||||||
|
* are made available under the terms of the Eclipse Public License v1.0
|
||||||
|
* which accompanies this distribution, and is available at
|
||||||
|
* http://www.eclipse.org/legal/epl-v10.html
|
||||||
|
*
|
||||||
|
* Contributors:
|
||||||
|
* Wind River Systems, Inc. - initial implementation
|
||||||
|
*
|
||||||
|
*******************************************************************************/
|
||||||
|
package org.eclipse.tm.terminal.internal.serial;
|
||||||
|
|
||||||
|
import java.io.IOException;
|
||||||
|
import java.text.MessageFormat;
|
||||||
|
|
||||||
|
import javax.comm.CommPortOwnershipListener;
|
||||||
|
import javax.comm.SerialPortEvent;
|
||||||
|
import javax.comm.SerialPortEventListener;
|
||||||
|
|
||||||
|
import org.eclipse.jface.dialogs.MessageDialog;
|
||||||
|
import org.eclipse.swt.widgets.Display;
|
||||||
|
import org.eclipse.tm.terminal.ITerminalControl;
|
||||||
|
import org.eclipse.tm.terminal.Logger;
|
||||||
|
import org.eclipse.tm.terminal.TerminalState;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* UNDER CONSTRUCTION
|
||||||
|
*/
|
||||||
|
public class SerialPortHandler implements
|
||||||
|
SerialPortEventListener, CommPortOwnershipListener {
|
||||||
|
/**
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
private final ITerminalControl fControl;
|
||||||
|
private final SerialConnector fConn;
|
||||||
|
protected byte[] bytes = new byte[2048];
|
||||||
|
|
||||||
|
/**
|
||||||
|
* UNDER CONSTRUCTION
|
||||||
|
* @param control TODO
|
||||||
|
*/
|
||||||
|
public SerialPortHandler(SerialConnector conn,ITerminalControl control) {
|
||||||
|
super();
|
||||||
|
fControl = control;
|
||||||
|
fConn=conn;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Message handlers
|
||||||
|
|
||||||
|
/**
|
||||||
|
* UNDER CONSTRUCTION
|
||||||
|
*/
|
||||||
|
public void onSerialDataAvailable(Object data) {
|
||||||
|
try {
|
||||||
|
while (fConn.getInputStream() != null && fConn.getInputStream().available() > 0) {
|
||||||
|
int nBytes = fConn.getInputStream().read(bytes);
|
||||||
|
fControl.writeToTerminal(new String(bytes, 0, nBytes));
|
||||||
|
}
|
||||||
|
} catch (IOException ex) {
|
||||||
|
fControl.displayTextInTerminal(ex.getMessage());
|
||||||
|
} catch (Exception exception) {
|
||||||
|
Logger.logException(exception);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public void onSerialOwnershipRequested(Object data) {
|
||||||
|
if (fConn.isPortInUse()) {
|
||||||
|
fConn.setPortInUse(false);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
Display.getDefault().asyncExec(new Runnable() {
|
||||||
|
public void run() {
|
||||||
|
String[] args = new String[] { fConn.getSerialSettings().getSerialPort() };
|
||||||
|
String strMsg = MessageFormat.format(SerialMessages.PORT_IN_USE, args);
|
||||||
|
|
||||||
|
if (!MessageDialog.openQuestion(fControl.getShell(), SerialMessages.PROP_TITLE, strMsg))
|
||||||
|
return;
|
||||||
|
fControl.setState(TerminalState.CONNECTING);
|
||||||
|
}
|
||||||
|
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
// SerialPortEventListener interface
|
||||||
|
public void serialEvent(SerialPortEvent event) {
|
||||||
|
switch (event.getEventType()) {
|
||||||
|
case SerialPortEvent.DATA_AVAILABLE:
|
||||||
|
onSerialDataAvailable(null);
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// CommPortOwnershipListener interface
|
||||||
|
|
||||||
|
/**
|
||||||
|
* UNDER CONSTRUCTION
|
||||||
|
*/
|
||||||
|
public void ownershipChange(int nType) {
|
||||||
|
switch (nType) {
|
||||||
|
case CommPortOwnershipListener.PORT_OWNERSHIP_REQUESTED:
|
||||||
|
onSerialOwnershipRequested(null);
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
|
@ -0,0 +1,159 @@
|
||||||
|
/*******************************************************************************
|
||||||
|
* Copyright (c) 2006 Wind River Systems, Inc. and others.
|
||||||
|
* All rights reserved. This program and the accompanying materials
|
||||||
|
* are made available under the terms of the Eclipse Public License v1.0
|
||||||
|
* which accompanies this distribution, and is available at
|
||||||
|
* http://www.eclipse.org/legal/epl-v10.html
|
||||||
|
*
|
||||||
|
* Contributors:
|
||||||
|
* Wind River Systems, Inc. - initial implementation
|
||||||
|
*
|
||||||
|
*******************************************************************************/
|
||||||
|
|
||||||
|
package org.eclipse.tm.terminal.internal.serial;
|
||||||
|
|
||||||
|
import java.util.Collections;
|
||||||
|
import java.util.Enumeration;
|
||||||
|
import java.util.List;
|
||||||
|
import java.util.Vector;
|
||||||
|
|
||||||
|
import javax.comm.CommPortIdentifier;
|
||||||
|
|
||||||
|
public class SerialProperties {
|
||||||
|
protected List fSerialPortTable;
|
||||||
|
protected List fBaudRateTable;
|
||||||
|
protected List fDataBitsTable;
|
||||||
|
protected List fStopBitsTable;
|
||||||
|
protected List fParityTable;
|
||||||
|
protected List fFlowControlTable;
|
||||||
|
protected String fDefaultConnType;
|
||||||
|
protected String fDefaultSerialPort;
|
||||||
|
protected String fDefaultBaudRate;
|
||||||
|
protected String fDefaultDataBits;
|
||||||
|
protected String fDefaultStopBits;
|
||||||
|
protected String fDefaultParity;
|
||||||
|
protected String fDefaultFlowControl;
|
||||||
|
|
||||||
|
public SerialProperties() {
|
||||||
|
setupProperties();
|
||||||
|
}
|
||||||
|
public List getSerialPortTable() {
|
||||||
|
return fSerialPortTable;
|
||||||
|
}
|
||||||
|
|
||||||
|
public List getBaudRateTable() {
|
||||||
|
return fBaudRateTable;
|
||||||
|
}
|
||||||
|
|
||||||
|
public List getDataBitsTable() {
|
||||||
|
return fDataBitsTable;
|
||||||
|
}
|
||||||
|
|
||||||
|
public List getStopBitsTable() {
|
||||||
|
return fStopBitsTable;
|
||||||
|
}
|
||||||
|
|
||||||
|
public List getParityTable() {
|
||||||
|
return fParityTable;
|
||||||
|
}
|
||||||
|
|
||||||
|
public List getFlowControlTable() {
|
||||||
|
return fFlowControlTable;
|
||||||
|
}
|
||||||
|
public String getDefaultConnType() {
|
||||||
|
return fDefaultConnType;
|
||||||
|
}
|
||||||
|
|
||||||
|
public String getDefaultSerialPort() {
|
||||||
|
return fDefaultSerialPort;
|
||||||
|
}
|
||||||
|
|
||||||
|
public String getDefaultBaudRate() {
|
||||||
|
return fDefaultBaudRate;
|
||||||
|
}
|
||||||
|
|
||||||
|
public String getDefaultDataBits() {
|
||||||
|
return fDefaultDataBits;
|
||||||
|
}
|
||||||
|
|
||||||
|
public String getDefaultStopBits() {
|
||||||
|
return fDefaultStopBits;
|
||||||
|
}
|
||||||
|
|
||||||
|
public String getDefaultParity() {
|
||||||
|
return fDefaultParity;
|
||||||
|
}
|
||||||
|
|
||||||
|
public String getDefaultFlowControl() {
|
||||||
|
return fDefaultFlowControl;
|
||||||
|
}
|
||||||
|
public String getDefaultTimeout() {
|
||||||
|
return "5";
|
||||||
|
}
|
||||||
|
protected void setupProperties() {
|
||||||
|
fSerialPortTable = new Vector();
|
||||||
|
fBaudRateTable = new Vector();
|
||||||
|
fDataBitsTable = new Vector();
|
||||||
|
fStopBitsTable = new Vector();
|
||||||
|
fParityTable = new Vector();
|
||||||
|
fFlowControlTable = new Vector();
|
||||||
|
fDefaultConnType = ""; //$NON-NLS-1$
|
||||||
|
fDefaultSerialPort = ""; //$NON-NLS-1$
|
||||||
|
fDefaultBaudRate = ""; //$NON-NLS-1$
|
||||||
|
fDefaultDataBits = ""; //$NON-NLS-1$
|
||||||
|
fDefaultStopBits = ""; //$NON-NLS-1$
|
||||||
|
fDefaultParity = ""; //$NON-NLS-1$
|
||||||
|
fDefaultFlowControl = ""; //$NON-NLS-1$
|
||||||
|
|
||||||
|
fBaudRateTable.add("300"); //$NON-NLS-1$
|
||||||
|
fBaudRateTable.add("1200"); //$NON-NLS-1$
|
||||||
|
fBaudRateTable.add("2400"); //$NON-NLS-1$
|
||||||
|
fBaudRateTable.add("4800"); //$NON-NLS-1$
|
||||||
|
fBaudRateTable.add("9600"); //$NON-NLS-1$
|
||||||
|
fBaudRateTable.add("19200"); //$NON-NLS-1$
|
||||||
|
fBaudRateTable.add("38400"); //$NON-NLS-1$
|
||||||
|
fBaudRateTable.add("57600"); //$NON-NLS-1$
|
||||||
|
fBaudRateTable.add("115200"); //$NON-NLS-1$
|
||||||
|
|
||||||
|
fDataBitsTable.add("5"); //$NON-NLS-1$
|
||||||
|
fDataBitsTable.add("6"); //$NON-NLS-1$
|
||||||
|
fDataBitsTable.add("7"); //$NON-NLS-1$
|
||||||
|
fDataBitsTable.add("8"); //$NON-NLS-1$
|
||||||
|
|
||||||
|
fStopBitsTable.add("1"); //$NON-NLS-1$
|
||||||
|
fStopBitsTable.add("1_5"); //$NON-NLS-1$
|
||||||
|
fStopBitsTable.add("2"); //$NON-NLS-1$
|
||||||
|
|
||||||
|
fParityTable.add("None"); //$NON-NLS-1$
|
||||||
|
fParityTable.add("Even"); //$NON-NLS-1$
|
||||||
|
fParityTable.add("Odd"); //$NON-NLS-1$
|
||||||
|
fParityTable.add("Mark"); //$NON-NLS-1$
|
||||||
|
fParityTable.add("Space"); //$NON-NLS-1$
|
||||||
|
|
||||||
|
fFlowControlTable.add("None"); //$NON-NLS-1$
|
||||||
|
fFlowControlTable.add("RTS/CTS"); //$NON-NLS-1$
|
||||||
|
fFlowControlTable.add("Xon/Xoff"); //$NON-NLS-1$
|
||||||
|
|
||||||
|
fDefaultBaudRate = (String) fBaudRateTable.get(4);
|
||||||
|
fDefaultDataBits = (String) fDataBitsTable.get(3);
|
||||||
|
fDefaultStopBits = (String) fStopBitsTable.get(0);
|
||||||
|
fDefaultParity = (String) fParityTable.get(0);
|
||||||
|
fDefaultFlowControl = (String) fFlowControlTable.get(0);
|
||||||
|
|
||||||
|
Enumeration portIdEnum= CommPortIdentifier.getPortIdentifiers();;
|
||||||
|
while (portIdEnum.hasMoreElements()) {
|
||||||
|
CommPortIdentifier identifier = (CommPortIdentifier) portIdEnum.nextElement();
|
||||||
|
String strName = identifier.getName();
|
||||||
|
int nPortType = identifier.getPortType();
|
||||||
|
|
||||||
|
if (nPortType == CommPortIdentifier.PORT_SERIAL)
|
||||||
|
fSerialPortTable.add(strName);
|
||||||
|
}
|
||||||
|
|
||||||
|
Collections.sort(fSerialPortTable);
|
||||||
|
|
||||||
|
if (!fSerialPortTable.isEmpty()) {
|
||||||
|
fDefaultSerialPort = (String) fSerialPortTable.get(0);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
|
@ -0,0 +1,196 @@
|
||||||
|
/*******************************************************************************
|
||||||
|
* Copyright (c) 2006 Wind River Systems, Inc. and others.
|
||||||
|
* All rights reserved. This program and the accompanying materials
|
||||||
|
* are made available under the terms of the Eclipse Public License v1.0
|
||||||
|
* which accompanies this distribution, and is available at
|
||||||
|
* http://www.eclipse.org/legal/epl-v10.html
|
||||||
|
*
|
||||||
|
* Contributors:
|
||||||
|
* Wind River Systems, Inc. - initial implementation
|
||||||
|
*
|
||||||
|
*******************************************************************************/
|
||||||
|
|
||||||
|
package org.eclipse.tm.terminal.internal.serial;
|
||||||
|
|
||||||
|
import javax.comm.SerialPort;
|
||||||
|
|
||||||
|
import org.eclipse.tm.terminal.ISettingsStore;
|
||||||
|
import org.eclipse.tm.terminal.ITerminalConnector;
|
||||||
|
|
||||||
|
public class SerialSettings implements ISerialSettings {
|
||||||
|
protected String fSerialPort;
|
||||||
|
protected String fBaudRate;
|
||||||
|
protected String fDataBits;
|
||||||
|
protected String fStopBits;
|
||||||
|
protected String fParity;
|
||||||
|
protected String fFlowControl;
|
||||||
|
protected String fTimeout;
|
||||||
|
final private SerialProperties fProperties=new SerialProperties();
|
||||||
|
|
||||||
|
public String getSerialPort() {
|
||||||
|
return fSerialPort;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setSerialPort(String strSerialPort) {
|
||||||
|
fSerialPort = strSerialPort;
|
||||||
|
}
|
||||||
|
|
||||||
|
public String getBaudRateString() {
|
||||||
|
return fBaudRate;
|
||||||
|
}
|
||||||
|
|
||||||
|
public int getBaudRate() {
|
||||||
|
int nBaudRate;
|
||||||
|
|
||||||
|
try {
|
||||||
|
nBaudRate = Integer.parseInt(fBaudRate);
|
||||||
|
} catch (NumberFormatException numberFormatException) {
|
||||||
|
nBaudRate = 9600;
|
||||||
|
}
|
||||||
|
|
||||||
|
return nBaudRate;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setBaudRate(String strBaudRate) {
|
||||||
|
fBaudRate = strBaudRate;
|
||||||
|
}
|
||||||
|
|
||||||
|
public String getDataBitsString() {
|
||||||
|
return fDataBits;
|
||||||
|
}
|
||||||
|
|
||||||
|
public int getDataBits() {
|
||||||
|
if (fDataBits.equals("5")) { //$NON-NLS-1$
|
||||||
|
return SerialPort.DATABITS_5;
|
||||||
|
} else if (fDataBits.equals("6")) { //$NON-NLS-1$
|
||||||
|
return SerialPort.DATABITS_6;
|
||||||
|
} else if (fDataBits.equals("7")) { //$NON-NLS-1$
|
||||||
|
return SerialPort.DATABITS_7;
|
||||||
|
} else {
|
||||||
|
return SerialPort.DATABITS_8;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setDataBits(String strDataBits) {
|
||||||
|
fDataBits = strDataBits;
|
||||||
|
}
|
||||||
|
|
||||||
|
public String getStopBitsString() {
|
||||||
|
return fStopBits;
|
||||||
|
}
|
||||||
|
|
||||||
|
public int getStopBits() {
|
||||||
|
if (fStopBits.equals("1_5")) { //$NON-NLS-1$
|
||||||
|
return SerialPort.STOPBITS_1_5;
|
||||||
|
} else if (fStopBits.equals("2")) { //$NON-NLS-1$
|
||||||
|
return SerialPort.STOPBITS_2;
|
||||||
|
} else { // 1
|
||||||
|
return SerialPort.STOPBITS_1;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setStopBits(String strStopBits) {
|
||||||
|
fStopBits = strStopBits;
|
||||||
|
}
|
||||||
|
|
||||||
|
public String getParityString() {
|
||||||
|
return fParity;
|
||||||
|
}
|
||||||
|
|
||||||
|
public int getParity() {
|
||||||
|
if (fParity.equals("Even")) //$NON-NLS-1$
|
||||||
|
{
|
||||||
|
return SerialPort.PARITY_EVEN;
|
||||||
|
} else if (fParity.equals("Odd")) //$NON-NLS-1$
|
||||||
|
{
|
||||||
|
return SerialPort.PARITY_ODD;
|
||||||
|
} else if (fParity.equals("Mark")) //$NON-NLS-1$
|
||||||
|
{
|
||||||
|
return SerialPort.PARITY_MARK;
|
||||||
|
} else if (fParity.equals("Space")) //$NON-NLS-1$
|
||||||
|
{
|
||||||
|
return SerialPort.PARITY_SPACE;
|
||||||
|
} else // None
|
||||||
|
{
|
||||||
|
return SerialPort.PARITY_NONE;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setParity(String strParity) {
|
||||||
|
fParity = strParity;
|
||||||
|
}
|
||||||
|
|
||||||
|
public String getFlowControlString() {
|
||||||
|
return fFlowControl;
|
||||||
|
}
|
||||||
|
|
||||||
|
public int getFlowControl() {
|
||||||
|
if (fFlowControl.equals("RTS/CTS")) //$NON-NLS-1$
|
||||||
|
{
|
||||||
|
return SerialPort.FLOWCONTROL_RTSCTS_IN;
|
||||||
|
} else if (fFlowControl.equals("Xon/Xoff")) //$NON-NLS-1$
|
||||||
|
{
|
||||||
|
return SerialPort.FLOWCONTROL_XONXOFF_IN;
|
||||||
|
} else // None
|
||||||
|
{
|
||||||
|
return SerialPort.FLOWCONTROL_NONE;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setFlowControl(String strFlow) {
|
||||||
|
fFlowControl = strFlow;
|
||||||
|
}
|
||||||
|
|
||||||
|
public String getStatusString(String strConnected) {
|
||||||
|
return " (" + //$NON-NLS-1$
|
||||||
|
getSerialPort() + ", " + //$NON-NLS-1$
|
||||||
|
getBaudRateString() + ", " + //$NON-NLS-1$
|
||||||
|
getDataBitsString() + ", " + //$NON-NLS-1$
|
||||||
|
getStopBitsString() + ", " + //$NON-NLS-1$
|
||||||
|
getParityString() + ", " + //$NON-NLS-1$
|
||||||
|
getFlowControlString() + " - " + //$NON-NLS-1$
|
||||||
|
strConnected + ")"; //$NON-NLS-1$
|
||||||
|
}
|
||||||
|
|
||||||
|
public ITerminalConnector makeConnector() {
|
||||||
|
return new SerialConnector(this);
|
||||||
|
}
|
||||||
|
|
||||||
|
public void load(ISettingsStore store) {
|
||||||
|
fSerialPort = store.get("SerialPort", fProperties.getDefaultSerialPort());//$NON-NLS-1$
|
||||||
|
fBaudRate = store.get("BaudRate", fProperties.getDefaultBaudRate());//$NON-NLS-1$
|
||||||
|
fDataBits = store.get("DataBits", fProperties.getDefaultDataBits());//$NON-NLS-1$
|
||||||
|
fStopBits = store.get("StopBits", fProperties.getDefaultStopBits());//$NON-NLS-1$
|
||||||
|
fParity = store.get("Parity", fProperties.getDefaultParity());//$NON-NLS-1$
|
||||||
|
fFlowControl = store.get("FlowControl", fProperties.getDefaultFlowControl());//$NON-NLS-1$
|
||||||
|
fTimeout = store.get("Timeout",fProperties.getDefaultTimeout());
|
||||||
|
}
|
||||||
|
|
||||||
|
public void save(ISettingsStore store) {
|
||||||
|
store.put("SerialPort", fSerialPort); //$NON-NLS-1$
|
||||||
|
store.put("BaudRate", fBaudRate); //$NON-NLS-1$
|
||||||
|
store.put("DataBits", fDataBits); //$NON-NLS-1$
|
||||||
|
store.put("StopBits", fStopBits); //$NON-NLS-1$
|
||||||
|
store.put("Parity", fParity); //$NON-NLS-1$
|
||||||
|
store.put("FlowControl", fFlowControl); //$NON-NLS-1$
|
||||||
|
}
|
||||||
|
|
||||||
|
public SerialProperties getProperties() {
|
||||||
|
return fProperties;
|
||||||
|
}
|
||||||
|
|
||||||
|
public int getTimeout() {
|
||||||
|
try {
|
||||||
|
return Integer.parseInt(fTimeout);
|
||||||
|
} catch (NumberFormatException numberFormatException) {
|
||||||
|
return 10;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
public String getTimeoutString() {
|
||||||
|
return fTimeout;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setTimeout(String timeout) {
|
||||||
|
fTimeout = timeout;
|
||||||
|
}
|
||||||
|
}
|
|
@ -0,0 +1,137 @@
|
||||||
|
/*******************************************************************************
|
||||||
|
* Copyright (c) 2006 Wind River Systems, Inc. and others.
|
||||||
|
* All rights reserved. This program and the accompanying materials
|
||||||
|
* are made available under the terms of the Eclipse Public License v1.0
|
||||||
|
* which accompanies this distribution, and is available at
|
||||||
|
* http://www.eclipse.org/legal/epl-v10.html
|
||||||
|
*
|
||||||
|
* Contributors:
|
||||||
|
* Wind River Systems, Inc. - initial implementation
|
||||||
|
*
|
||||||
|
*******************************************************************************/
|
||||||
|
|
||||||
|
package org.eclipse.tm.terminal.internal.serial;
|
||||||
|
|
||||||
|
import java.util.Iterator;
|
||||||
|
import java.util.List;
|
||||||
|
|
||||||
|
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;
|
||||||
|
import org.eclipse.tm.terminal.ISettingsPage;
|
||||||
|
|
||||||
|
public class SerialSettingsPage implements ISettingsPage {
|
||||||
|
private Combo fSerialPortCombo;
|
||||||
|
private Combo fBaudRateCombo;
|
||||||
|
private Combo fDataBitsCombo;
|
||||||
|
private Combo fStopBitsCombo;
|
||||||
|
private Combo fParityCombo;
|
||||||
|
private Combo fFlowControlCombo;
|
||||||
|
private Text fTimeout;
|
||||||
|
private final SerialSettings fTerminalSettings;
|
||||||
|
|
||||||
|
public SerialSettingsPage(SerialSettings settings) {
|
||||||
|
fTerminalSettings=settings;
|
||||||
|
}
|
||||||
|
public void saveSettings() {
|
||||||
|
fTerminalSettings.setSerialPort(getComboValue(fSerialPortCombo));
|
||||||
|
fTerminalSettings.setBaudRate(getComboValue(fBaudRateCombo));
|
||||||
|
fTerminalSettings.setDataBits(getComboValue(fDataBitsCombo));
|
||||||
|
fTerminalSettings.setStopBits(getComboValue(fStopBitsCombo));
|
||||||
|
fTerminalSettings.setParity(getComboValue(fParityCombo));
|
||||||
|
fTerminalSettings.setFlowControl(getComboValue(fFlowControlCombo));
|
||||||
|
fTerminalSettings.setTimeout(fTimeout.getText());
|
||||||
|
}
|
||||||
|
public void loadSettings() {
|
||||||
|
// Load controls
|
||||||
|
SerialProperties properties = fTerminalSettings.getProperties();
|
||||||
|
List list;
|
||||||
|
|
||||||
|
list = properties.getSerialPortTable();
|
||||||
|
loadCombo(fSerialPortCombo, list);
|
||||||
|
|
||||||
|
list = properties.getBaudRateTable();
|
||||||
|
loadCombo(fBaudRateCombo, list);
|
||||||
|
|
||||||
|
list = properties.getDataBitsTable();
|
||||||
|
loadCombo(fDataBitsCombo, list);
|
||||||
|
|
||||||
|
list = properties.getStopBitsTable();
|
||||||
|
loadCombo(fStopBitsCombo, list);
|
||||||
|
|
||||||
|
list = properties.getParityTable();
|
||||||
|
loadCombo(fParityCombo, list);
|
||||||
|
|
||||||
|
list = properties.getFlowControlTable();
|
||||||
|
loadCombo(fFlowControlCombo, list);
|
||||||
|
|
||||||
|
setCombo(fSerialPortCombo,fTerminalSettings.getSerialPort());
|
||||||
|
setCombo(fBaudRateCombo,fTerminalSettings.getBaudRateString());
|
||||||
|
setCombo(fDataBitsCombo,fTerminalSettings.getDataBitsString());
|
||||||
|
setCombo(fStopBitsCombo,fTerminalSettings.getStopBitsString());
|
||||||
|
setCombo(fParityCombo,fTerminalSettings.getParityString());
|
||||||
|
setCombo(fFlowControlCombo,fTerminalSettings.getFlowControlString());
|
||||||
|
fTimeout.setText(fTerminalSettings.getTimeoutString());
|
||||||
|
}
|
||||||
|
private void setCombo(Combo combo,String value) {
|
||||||
|
if(value==null)
|
||||||
|
return;
|
||||||
|
int nIndex = combo.indexOf(value);
|
||||||
|
if (nIndex == -1)
|
||||||
|
return;
|
||||||
|
|
||||||
|
combo.select(nIndex);
|
||||||
|
|
||||||
|
}
|
||||||
|
private String getComboValue(Combo combo) {
|
||||||
|
int nIndex = combo.getSelectionIndex();
|
||||||
|
if (nIndex == -1)
|
||||||
|
return ""; //$NON-NLS-1$
|
||||||
|
|
||||||
|
return combo.getItem(nIndex);
|
||||||
|
|
||||||
|
}
|
||||||
|
public boolean validateSettings() {
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
public void createControl(Composite parent) {
|
||||||
|
Composite composite = new Composite(parent, SWT.NONE);
|
||||||
|
GridLayout gridLayout = new GridLayout(2, false);
|
||||||
|
|
||||||
|
composite.setLayout(gridLayout);
|
||||||
|
composite.setLayoutData(new GridData(GridData.FILL_HORIZONTAL));
|
||||||
|
|
||||||
|
fSerialPortCombo=addLabeledCombo(composite, SerialMessages.PORT + ":");
|
||||||
|
fBaudRateCombo=addLabeledCombo(composite, SerialMessages.BAUDRATE + ":"); //$NON-NLS-1$
|
||||||
|
fDataBitsCombo=addLabeledCombo(composite, SerialMessages.DATABITS + ":"); //$NON-NLS-1$
|
||||||
|
fStopBitsCombo=addLabeledCombo(composite, SerialMessages.STOPBITS + ":"); //$NON-NLS-1$
|
||||||
|
fParityCombo=addLabeledCombo(composite, SerialMessages.PARITY + ":"); //$NON-NLS-1$
|
||||||
|
fFlowControlCombo=addLabeledCombo(composite, SerialMessages.FLOWCONTROL + ":"); //$NON-NLS-1$
|
||||||
|
|
||||||
|
new Label(composite, SWT.RIGHT).setText(SerialMessages.TIMEOUT + ":"); //$NON-NLS-1$
|
||||||
|
fTimeout = new Text(composite, SWT.BORDER);
|
||||||
|
fTimeout.setLayoutData(new GridData(GridData.FILL_HORIZONTAL));
|
||||||
|
loadSettings();
|
||||||
|
}
|
||||||
|
|
||||||
|
private Combo addLabeledCombo(Composite composite, String label) {
|
||||||
|
new Label(composite, SWT.RIGHT).setText(label);
|
||||||
|
Combo combo = new Combo(composite, SWT.DROP_DOWN | SWT.READ_ONLY);
|
||||||
|
combo.setLayoutData(new GridData(GridData.FILL_HORIZONTAL));
|
||||||
|
return combo;
|
||||||
|
}
|
||||||
|
private void loadCombo(Combo ctlCombo, List table) {
|
||||||
|
for (Iterator iter = table.iterator(); iter.hasNext();) {
|
||||||
|
String label = (String) iter.next();
|
||||||
|
ctlCombo.add(label);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public String getName() {
|
||||||
|
return SerialMessages.CONNTYPE_SERIAL;
|
||||||
|
}
|
||||||
|
}
|
17
org.eclipse.tm.terminal.view-feature/.project
Normal file
|
@ -0,0 +1,17 @@
|
||||||
|
<?xml version="1.0" encoding="UTF-8"?>
|
||||||
|
<projectDescription>
|
||||||
|
<name>org.eclipse.tm.terminal.view-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>
|
1
org.eclipse.tm.terminal.view-feature/build.properties
Normal file
|
@ -0,0 +1 @@
|
||||||
|
bin.includes = feature.xml
|
33
org.eclipse.tm.terminal.view-feature/feature.xml
Normal file
|
@ -0,0 +1,33 @@
|
||||||
|
<?xml version="1.0" encoding="UTF-8"?>
|
||||||
|
<feature
|
||||||
|
id="org.eclipse.tm.terminal.view"
|
||||||
|
label="Terminal View Feature"
|
||||||
|
version="0.9.0"
|
||||||
|
provider-name="Eclipse.org">
|
||||||
|
|
||||||
|
<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>
|
||||||
|
|
||||||
|
<requires>
|
||||||
|
<import plugin="org.eclipse.ui"/>
|
||||||
|
<import plugin="org.eclipse.core.runtime"/>
|
||||||
|
<import plugin="org.eclipse.tm.terminal"/>
|
||||||
|
</requires>
|
||||||
|
|
||||||
|
<plugin
|
||||||
|
id="org.eclipse.tm.terminal.view"
|
||||||
|
download-size="0"
|
||||||
|
install-size="0"
|
||||||
|
version="0.0.0"
|
||||||
|
unpack="false"/>
|
||||||
|
|
||||||
|
</feature>
|
7
org.eclipse.tm.terminal.view/.classpath
Normal file
|
@ -0,0 +1,7 @@
|
||||||
|
<?xml version="1.0" encoding="UTF-8"?>
|
||||||
|
<classpath>
|
||||||
|
<classpathentry kind="src" path="src"/>
|
||||||
|
<classpathentry kind="con" path="org.eclipse.jdt.launching.JRE_CONTAINER/org.eclipse.jdt.internal.debug.ui.launcher.StandardVMType/J2SE-1.4"/>
|
||||||
|
<classpathentry kind="con" path="org.eclipse.pde.core.requiredPlugins"/>
|
||||||
|
<classpathentry kind="output" path="bin"/>
|
||||||
|
</classpath>
|
34
org.eclipse.tm.terminal.view/.project
Normal file
|
@ -0,0 +1,34 @@
|
||||||
|
<?xml version="1.0" encoding="UTF-8"?>
|
||||||
|
<projectDescription>
|
||||||
|
<name>org.eclipse.tm.terminal.view</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>
|
||||||
|
<buildCommand>
|
||||||
|
<name>net.sourceforge.metrics.builder</name>
|
||||||
|
<arguments>
|
||||||
|
</arguments>
|
||||||
|
</buildCommand>
|
||||||
|
</buildSpec>
|
||||||
|
<natures>
|
||||||
|
<nature>org.eclipse.pde.PluginNature</nature>
|
||||||
|
<nature>org.eclipse.jdt.core.javanature</nature>
|
||||||
|
<nature>net.sourceforge.metrics.nature</nature>
|
||||||
|
</natures>
|
||||||
|
</projectDescription>
|
|
@ -0,0 +1,7 @@
|
||||||
|
#Thu Nov 30 06:15:17 CET 2006
|
||||||
|
eclipse.preferences.version=1
|
||||||
|
org.eclipse.jdt.core.compiler.codegen.targetPlatform=1.2
|
||||||
|
org.eclipse.jdt.core.compiler.compliance=1.4
|
||||||
|
org.eclipse.jdt.core.compiler.problem.assertIdentifier=warning
|
||||||
|
org.eclipse.jdt.core.compiler.problem.enumIdentifier=warning
|
||||||
|
org.eclipse.jdt.core.compiler.source=1.3
|
|
@ -0,0 +1,3 @@
|
||||||
|
#Mon Jul 31 14:55:17 CEST 2006
|
||||||
|
eclipse.preferences.version=1
|
||||||
|
internal.default.compliance=user
|
13
org.eclipse.tm.terminal.view/META-INF/MANIFEST.MF
Normal file
|
@ -0,0 +1,13 @@
|
||||||
|
Manifest-Version: 1.0
|
||||||
|
Bundle-ManifestVersion: 2
|
||||||
|
Bundle-Name: %pluginName
|
||||||
|
Bundle-SymbolicName: org.eclipse.tm.terminal.view;singleton:=true
|
||||||
|
Bundle-Version: 0.9.0
|
||||||
|
Bundle-Activator: org.eclipse.tm.terminal.internal.view.TerminalViewPlugin
|
||||||
|
Bundle-Localization: plugin
|
||||||
|
Require-Bundle: org.eclipse.ui,
|
||||||
|
org.eclipse.core.runtime,
|
||||||
|
org.eclipse.tm.terminal
|
||||||
|
Eclipse-LazyStart: true
|
||||||
|
Bundle-RequiredExecutionEnvironment: J2SE-1.4
|
||||||
|
Bundle-Vendor: %providerName
|
17
org.eclipse.tm.terminal.view/build.properties
Normal file
|
@ -0,0 +1,17 @@
|
||||||
|
source.. = src/
|
||||||
|
output.. = bin/
|
||||||
|
bin.includes = META-INF/,\
|
||||||
|
.,\
|
||||||
|
plugin.xml,\
|
||||||
|
icons/,\
|
||||||
|
.settings/,\
|
||||||
|
plugin.properties
|
||||||
|
src.includes = .classpath,\
|
||||||
|
.project,\
|
||||||
|
.settings/,\
|
||||||
|
META-INF/,\
|
||||||
|
build.properties,\
|
||||||
|
icons/,\
|
||||||
|
plugin.properties,\
|
||||||
|
plugin.xml,\
|
||||||
|
src/
|
Before Width: | Height: | Size: 139 B After Width: | Height: | Size: 139 B |
Before Width: | Height: | Size: 146 B After Width: | Height: | Size: 146 B |
Before Width: | Height: | Size: 351 B After Width: | Height: | Size: 351 B |
Before Width: | Height: | Size: 118 B After Width: | Height: | Size: 118 B |
Before Width: | Height: | Size: 938 B After Width: | Height: | Size: 938 B |
Before Width: | Height: | Size: 874 B After Width: | Height: | Size: 874 B |
Before Width: | Height: | Size: 90 B After Width: | Height: | Size: 90 B |
Before Width: | Height: | Size: 351 B After Width: | Height: | Size: 351 B |
Before Width: | Height: | Size: 90 B After Width: | Height: | Size: 90 B |
Before Width: | Height: | Size: 890 B After Width: | Height: | Size: 890 B |
Before Width: | Height: | Size: 118 B After Width: | Height: | Size: 118 B |
Before Width: | Height: | Size: 351 B After Width: | Height: | Size: 351 B |
Before Width: | Height: | Size: 118 B After Width: | Height: | Size: 118 B |
Before Width: | Height: | Size: 938 B After Width: | Height: | Size: 938 B |
17
org.eclipse.tm.terminal.view/plugin.properties
Normal file
|
@ -0,0 +1,17 @@
|
||||||
|
##########################################################################
|
||||||
|
# Copyright 2004 Wind River Systems, Inc. All rights reserved.
|
||||||
|
##########################################################################
|
||||||
|
|
||||||
|
pluginName = Terminal View
|
||||||
|
providerName = Eclipse.org
|
||||||
|
terminal.views.category.name = Terminal
|
||||||
|
terminal.views.view.name = Terminal
|
||||||
|
terminal.views.view.font.description = The font for the terminal console.
|
||||||
|
terminal.views.view.font.label = Terminal Console Font
|
||||||
|
|
||||||
|
terminal.view.context.name=Terminal view context
|
||||||
|
terminal.view.context.description=control-q override
|
||||||
|
|
||||||
|
terminal.view.insertion.description=Terminal view insertion
|
||||||
|
terminal.view.insertion.name=Terminal view insert
|
||||||
|
terminal.view.insertion.category.name=Terminal view commands
|
128
org.eclipse.tm.terminal.view/plugin.xml
Normal file
|
@ -0,0 +1,128 @@
|
||||||
|
<?xml version="1.0" encoding="UTF-8"?>
|
||||||
|
<?eclipse version="3.0"?>
|
||||||
|
<plugin>
|
||||||
|
<extension
|
||||||
|
point="org.eclipse.ui.views">
|
||||||
|
<category
|
||||||
|
name="%terminal.views.category.name"
|
||||||
|
id="Terminal">
|
||||||
|
</category>
|
||||||
|
<view
|
||||||
|
allowMultiple="true"
|
||||||
|
class="org.eclipse.tm.terminal.internal.view.TerminalView"
|
||||||
|
icon="icons/cview16/terminal_view.gif"
|
||||||
|
category="Terminal"
|
||||||
|
name="%terminal.views.view.name"
|
||||||
|
id="org.eclipse.tm.terminal.view.TerminalView">
|
||||||
|
</view>
|
||||||
|
</extension>
|
||||||
|
<extension
|
||||||
|
point="org.eclipse.ui.perspectiveExtensions">
|
||||||
|
<perspectiveExtension
|
||||||
|
targetID="Terminal">
|
||||||
|
<viewShortcut id="org.eclipse.tm.terminal.view.TerminalView"/>
|
||||||
|
<view id="org.eclipse.tm.terminal.view.TerminalView"
|
||||||
|
relationship="stack">
|
||||||
|
</view>
|
||||||
|
</perspectiveExtension>
|
||||||
|
</extension>
|
||||||
|
<extension
|
||||||
|
point="org.eclipse.ui.preferencePages">
|
||||||
|
<page
|
||||||
|
name="%terminal.views.view.name"
|
||||||
|
class="org.eclipse.tm.terminal.internal.view.TerminalPreferencePage"
|
||||||
|
id="org.eclipse.tm.terminal.TerminalPreferencePage">
|
||||||
|
</page>
|
||||||
|
</extension>
|
||||||
|
|
||||||
|
<extension
|
||||||
|
point="org.eclipse.ui.fontDefinitions">
|
||||||
|
<fontDefinition
|
||||||
|
label="%terminal.views.view.font.label"
|
||||||
|
defaultsTo="org.eclipse.jface.textfont"
|
||||||
|
id="terminal.views.view.font.definition">
|
||||||
|
<description>
|
||||||
|
%terminal.views.view.font.description
|
||||||
|
</description>
|
||||||
|
</fontDefinition>
|
||||||
|
</extension>
|
||||||
|
|
||||||
|
<extension point="org.eclipse.ui.contexts">
|
||||||
|
<context
|
||||||
|
name="%terminal.view.context.name"
|
||||||
|
description="%terminal.view.context.description"
|
||||||
|
id="org.eclipse.tm.terminal.TerminalContext"
|
||||||
|
/>
|
||||||
|
</extension>
|
||||||
|
<extension
|
||||||
|
point="org.eclipse.ui.commands">
|
||||||
|
<command
|
||||||
|
categoryId="org.eclipse.tm.terminal.category1"
|
||||||
|
id="org.eclipse.tm.terminal.command1"
|
||||||
|
name="%terminal.view.insertion.name"/>
|
||||||
|
<category
|
||||||
|
description="%terminal.view.insertion.description"
|
||||||
|
id="org.eclipse.tm.terminal.category1"
|
||||||
|
name="%terminal.view.insertion.category.name"/>
|
||||||
|
</extension>
|
||||||
|
<extension
|
||||||
|
point="org.eclipse.ui.bindings">
|
||||||
|
<!--
|
||||||
|
These keybindings are needed to disable the menu-activation keys (e.g.,
|
||||||
|
Alt-F for the File menu, etc.). The code in method
|
||||||
|
TerminalControl.TerminalFocusListener.focusGained() disables the Eclipse key
|
||||||
|
binding service, but it doesn't disable the global menu-activation
|
||||||
|
keys.
|
||||||
|
-->
|
||||||
|
<key
|
||||||
|
commandId="org.eclipse.tm.terminal.command1"
|
||||||
|
contextId="org.eclipse.tm.terminal.TerminalContext"
|
||||||
|
schemeId="org.eclipse.ui.defaultAcceleratorConfiguration"
|
||||||
|
sequence="Alt+A"/>
|
||||||
|
<key
|
||||||
|
commandId="org.eclipse.tm.terminal.command1"
|
||||||
|
contextId="org.eclipse.tm.terminal.TerminalContext"
|
||||||
|
schemeId="org.eclipse.ui.defaultAcceleratorConfiguration"
|
||||||
|
sequence="Alt+E"/>
|
||||||
|
<key
|
||||||
|
commandId="org.eclipse.tm.terminal.command1"
|
||||||
|
contextId="org.eclipse.tm.terminal.TerminalContext"
|
||||||
|
schemeId="org.eclipse.ui.defaultAcceleratorConfiguration"
|
||||||
|
sequence="Alt+F"/>
|
||||||
|
<key
|
||||||
|
commandId="org.eclipse.tm.terminal.command1"
|
||||||
|
contextId="org.eclipse.tm.terminal.TerminalContext"
|
||||||
|
schemeId="org.eclipse.ui.defaultAcceleratorConfiguration"
|
||||||
|
sequence="Alt+G"/>
|
||||||
|
<key
|
||||||
|
commandId="org.eclipse.tm.terminal.command1"
|
||||||
|
contextId="org.eclipse.tm.terminal.TerminalContext"
|
||||||
|
schemeId="org.eclipse.ui.defaultAcceleratorConfiguration"
|
||||||
|
sequence="Alt+H"/>
|
||||||
|
<key
|
||||||
|
commandId="org.eclipse.tm.terminal.command1"
|
||||||
|
contextId="org.eclipse.tm.terminal.TerminalContext"
|
||||||
|
schemeId="org.eclipse.ui.defaultAcceleratorConfiguration"
|
||||||
|
sequence="Alt+N"/>
|
||||||
|
<key
|
||||||
|
commandId="org.eclipse.tm.terminal.command1"
|
||||||
|
contextId="org.eclipse.tm.terminal.TerminalContext"
|
||||||
|
schemeId="org.eclipse.ui.defaultAcceleratorConfiguration"
|
||||||
|
sequence="Alt+P"/>
|
||||||
|
<key
|
||||||
|
commandId="org.eclipse.tm.terminal.command1"
|
||||||
|
contextId="org.eclipse.tm.terminal.TerminalContext"
|
||||||
|
schemeId="org.eclipse.ui.defaultAcceleratorConfiguration"
|
||||||
|
sequence="Alt+R"/>
|
||||||
|
<key
|
||||||
|
commandId="org.eclipse.tm.terminal.command1"
|
||||||
|
contextId="org.eclipse.tm.terminal.TerminalContext"
|
||||||
|
schemeId="org.eclipse.ui.defaultAcceleratorConfiguration"
|
||||||
|
sequence="Alt+T"/>
|
||||||
|
<key
|
||||||
|
commandId="org.eclipse.tm.terminal.command1"
|
||||||
|
contextId="org.eclipse.tm.terminal.TerminalContext"
|
||||||
|
schemeId="org.eclipse.ui.defaultAcceleratorConfiguration"
|
||||||
|
sequence="Alt+W"/>
|
||||||
|
</extension>
|
||||||
|
</plugin>
|
|
@ -0,0 +1,31 @@
|
||||||
|
/*******************************************************************************
|
||||||
|
* Copyright (c) 2006 Wind River Systems, Inc. and others.
|
||||||
|
* All rights reserved. This program and the accompanying materials
|
||||||
|
* are made available under the terms of the Eclipse Public License v1.0
|
||||||
|
* which accompanies this distribution, and is available at
|
||||||
|
* http://www.eclipse.org/legal/epl-v10.html
|
||||||
|
*
|
||||||
|
* Contributors:
|
||||||
|
* Wind River Systems, Inc. - initial implementation
|
||||||
|
*
|
||||||
|
*******************************************************************************/
|
||||||
|
package org.eclipse.tm.terminal.internal.actions;
|
||||||
|
|
||||||
|
import org.eclipse.osgi.util.NLS;
|
||||||
|
|
||||||
|
public class ActionMessages extends NLS {
|
||||||
|
static {
|
||||||
|
NLS.initializeMessages(ActionMessages.class.getName(), ActionMessages.class);
|
||||||
|
}
|
||||||
|
public static String NEW_TERMINAL;
|
||||||
|
public static String CONNECT;
|
||||||
|
public static String DISCONNECT;
|
||||||
|
public static String SETTINGS_ELLIPSE;
|
||||||
|
public static String COPY;
|
||||||
|
public static String CUT;
|
||||||
|
public static String PASTE;
|
||||||
|
public static String SELECTALL;
|
||||||
|
public static String CLEARALL;
|
||||||
|
public static String SETTINGS;
|
||||||
|
|
||||||
|
}
|
|
@ -0,0 +1,21 @@
|
||||||
|
###############################################################################
|
||||||
|
# Copyright (c) 2006 Wind River Systems, Inc. and others.
|
||||||
|
# All rights reserved. This program and the accompanying materials
|
||||||
|
# are made available under the terms of the Eclipse Public License v1.0
|
||||||
|
# which accompanies this distribution, and is available at
|
||||||
|
# http://www.eclipse.org/legal/epl-v10.html
|
||||||
|
#
|
||||||
|
# Contributors:
|
||||||
|
# Wind River Systems, Inc. - initial implementation
|
||||||
|
#
|
||||||
|
###############################################################################
|
||||||
|
NEW_TERMINAL = New Terminal
|
||||||
|
CONNECT = Connect
|
||||||
|
DISCONNECT = Disconnect
|
||||||
|
SETTINGS_ELLIPSE = Settings...
|
||||||
|
COPY = Copy
|
||||||
|
CUT = Cut
|
||||||
|
PASTE = Paste
|
||||||
|
SELECTALL = Select All
|
||||||
|
CLEARALL = Clear All
|
||||||
|
SETTINGS = Settings
|
|
@ -0,0 +1,67 @@
|
||||||
|
/*******************************************************************************
|
||||||
|
* Copyright (c) 2006 Wind River Systems, Inc. and others.
|
||||||
|
* All rights reserved. This program and the accompanying materials
|
||||||
|
* are made available under the terms of the Eclipse Public License v1.0
|
||||||
|
* which accompanies this distribution, and is available at
|
||||||
|
* http://www.eclipse.org/legal/epl-v10.html
|
||||||
|
*
|
||||||
|
* Contributors:
|
||||||
|
* Wind River Systems, Inc. - initial implementation
|
||||||
|
*
|
||||||
|
*******************************************************************************/
|
||||||
|
|
||||||
|
|
||||||
|
package org.eclipse.tm.terminal.internal.actions;
|
||||||
|
|
||||||
|
import org.eclipse.jface.action.Action;
|
||||||
|
import org.eclipse.jface.resource.ImageDescriptor;
|
||||||
|
import org.eclipse.jface.resource.ImageRegistry;
|
||||||
|
import org.eclipse.tm.terminal.internal.view.ITerminalView;
|
||||||
|
import org.eclipse.tm.terminal.internal.view.TerminalViewPlugin;
|
||||||
|
|
||||||
|
abstract public class TerminalAction extends Action {
|
||||||
|
protected final ITerminalView fTarget;
|
||||||
|
public TerminalAction(ITerminalView target, String strId) {
|
||||||
|
super(""); //$NON-NLS-1$
|
||||||
|
|
||||||
|
fTarget = target;
|
||||||
|
|
||||||
|
setId(strId);
|
||||||
|
}
|
||||||
|
abstract public void run();
|
||||||
|
protected void setupAction(String strText, String strToolTip,
|
||||||
|
String strImage, String strEnabledImage, String strDisabledImage,
|
||||||
|
boolean bEnabled) {
|
||||||
|
TerminalViewPlugin plugin;
|
||||||
|
ImageRegistry imageRegistry;
|
||||||
|
|
||||||
|
plugin = TerminalViewPlugin.getDefault();
|
||||||
|
imageRegistry = plugin.getImageRegistry();
|
||||||
|
setupAction(strText, strToolTip, strImage, strEnabledImage,
|
||||||
|
strDisabledImage, bEnabled, imageRegistry);
|
||||||
|
}
|
||||||
|
protected void setupAction(String strText, String strToolTip,
|
||||||
|
String strImage, String strEnabledImage, String strDisabledImage,
|
||||||
|
boolean bEnabled, ImageRegistry imageRegistry) {
|
||||||
|
ImageDescriptor imageDescriptor;
|
||||||
|
|
||||||
|
setText(strText);
|
||||||
|
setToolTipText(strToolTip);
|
||||||
|
setEnabled(bEnabled);
|
||||||
|
|
||||||
|
imageDescriptor = imageRegistry.getDescriptor(strEnabledImage);
|
||||||
|
if (imageDescriptor != null) {
|
||||||
|
setImageDescriptor(imageDescriptor);
|
||||||
|
}
|
||||||
|
|
||||||
|
imageDescriptor = imageRegistry.getDescriptor(strDisabledImage);
|
||||||
|
if (imageDescriptor != null) {
|
||||||
|
setDisabledImageDescriptor(imageDescriptor);
|
||||||
|
}
|
||||||
|
|
||||||
|
imageDescriptor = imageRegistry.getDescriptor(strImage);
|
||||||
|
if (imageDescriptor != null) {
|
||||||
|
setHoverImageDescriptor(imageDescriptor);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
|
@ -12,23 +12,28 @@
|
||||||
*******************************************************************************/
|
*******************************************************************************/
|
||||||
|
|
||||||
|
|
||||||
package org.eclipse.tm.terminal;
|
package org.eclipse.tm.terminal.internal.actions;
|
||||||
|
|
||||||
|
import org.eclipse.tm.terminal.internal.view.ITerminalView;
|
||||||
|
|
||||||
public class TerminalActionClearAll extends TerminalAction
|
public class TerminalActionClearAll extends TerminalAction
|
||||||
{
|
{
|
||||||
protected TerminalActionClearAll(TerminalTarget target)
|
public TerminalActionClearAll(ITerminalView target)
|
||||||
{
|
{
|
||||||
super(target,
|
super(target,
|
||||||
ON_EDIT_CLEARALL,
|
|
||||||
TerminalActionClearAll.class.getName());
|
TerminalActionClearAll.class.getName());
|
||||||
|
|
||||||
setupAction(TERMINAL_TEXT_CLEARALL,
|
setupAction(ActionMessages.CLEARALL,
|
||||||
TERMINAL_TEXT_CLEARALL,
|
ActionMessages.CLEARALL,
|
||||||
null,
|
null,
|
||||||
null,
|
null,
|
||||||
null,
|
null,
|
||||||
false);
|
false);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public void run() {
|
||||||
|
fTarget.onEditClearAll();
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -11,21 +11,26 @@
|
||||||
*******************************************************************************/
|
*******************************************************************************/
|
||||||
|
|
||||||
|
|
||||||
package org.eclipse.tm.terminal;
|
package org.eclipse.tm.terminal.internal.actions;
|
||||||
|
|
||||||
|
import org.eclipse.tm.terminal.internal.view.ITerminalView;
|
||||||
|
import org.eclipse.tm.terminal.internal.view.ImageConsts;
|
||||||
|
|
||||||
public class TerminalActionConnect extends TerminalAction
|
public class TerminalActionConnect extends TerminalAction
|
||||||
{
|
{
|
||||||
protected TerminalActionConnect(TerminalTarget target)
|
public TerminalActionConnect(ITerminalView target)
|
||||||
{
|
{
|
||||||
super(target,
|
super(target,
|
||||||
ON_TERMINAL_CONNECT,
|
|
||||||
TerminalActionConnect.class.getName());
|
TerminalActionConnect.class.getName());
|
||||||
|
|
||||||
setupAction(TERMINAL_TEXT_CONNECT,
|
setupAction(ActionMessages.CONNECT,
|
||||||
TERMINAL_TEXT_CONNECT,
|
ActionMessages.CONNECT,
|
||||||
TERMINAL_IMAGE_CLCL_CONNECT,
|
ImageConsts.IMAGE_CLCL_CONNECT,
|
||||||
TERMINAL_IMAGE_ELCL_CONNECT,
|
ImageConsts.IMAGE_ELCL_CONNECT,
|
||||||
TERMINAL_IMAGE_DLCL_CONNECT,
|
ImageConsts.IMAGE_DLCL_CONNECT,
|
||||||
true);
|
true);
|
||||||
}
|
}
|
||||||
|
public void run() {
|
||||||
|
fTarget.onTerminalConnect();
|
||||||
|
}
|
||||||
}
|
}
|
|
@ -10,29 +10,32 @@
|
||||||
*
|
*
|
||||||
*******************************************************************************/
|
*******************************************************************************/
|
||||||
|
|
||||||
package org.eclipse.tm.terminal;
|
package org.eclipse.tm.terminal.internal.actions;
|
||||||
|
|
||||||
import org.eclipse.jface.resource.ImageRegistry;
|
import org.eclipse.jface.resource.ImageRegistry;
|
||||||
|
import org.eclipse.tm.terminal.internal.view.ITerminalView;
|
||||||
import org.eclipse.ui.ISharedImages;
|
import org.eclipse.ui.ISharedImages;
|
||||||
import org.eclipse.ui.internal.WorkbenchImages;
|
import org.eclipse.ui.internal.WorkbenchImages;
|
||||||
|
|
||||||
public class TerminalActionCopy extends TerminalAction
|
public class TerminalActionCopy extends TerminalAction
|
||||||
{
|
{
|
||||||
protected TerminalActionCopy(TerminalTarget target)
|
public TerminalActionCopy(ITerminalView target)
|
||||||
{
|
{
|
||||||
super(target,
|
super(target,
|
||||||
ON_EDIT_COPY,
|
|
||||||
TerminalActionCopy.class.getName());
|
TerminalActionCopy.class.getName());
|
||||||
|
|
||||||
ImageRegistry imageRegistry;
|
ImageRegistry imageRegistry;
|
||||||
|
|
||||||
imageRegistry = WorkbenchImages.getImageRegistry();
|
imageRegistry = WorkbenchImages.getImageRegistry();
|
||||||
setupAction(TERMINAL_TEXT_COPY,
|
setupAction(ActionMessages.COPY,
|
||||||
TERMINAL_TEXT_COPY,
|
ActionMessages.COPY,
|
||||||
ISharedImages.IMG_TOOL_COPY,
|
ISharedImages.IMG_TOOL_COPY,
|
||||||
ISharedImages.IMG_TOOL_COPY,
|
ISharedImages.IMG_TOOL_COPY,
|
||||||
ISharedImages.IMG_TOOL_COPY_DISABLED,
|
ISharedImages.IMG_TOOL_COPY_DISABLED,
|
||||||
true,
|
true,
|
||||||
imageRegistry);
|
imageRegistry);
|
||||||
}
|
}
|
||||||
|
public void run() {
|
||||||
|
fTarget.onEditCopy();
|
||||||
|
}
|
||||||
}
|
}
|
|
@ -10,29 +10,32 @@
|
||||||
*
|
*
|
||||||
*******************************************************************************/
|
*******************************************************************************/
|
||||||
|
|
||||||
package org.eclipse.tm.terminal;
|
package org.eclipse.tm.terminal.internal.actions;
|
||||||
|
|
||||||
import org.eclipse.jface.resource.ImageRegistry;
|
import org.eclipse.jface.resource.ImageRegistry;
|
||||||
|
import org.eclipse.tm.terminal.internal.view.ITerminalView;
|
||||||
import org.eclipse.ui.ISharedImages;
|
import org.eclipse.ui.ISharedImages;
|
||||||
import org.eclipse.ui.internal.WorkbenchImages;
|
import org.eclipse.ui.internal.WorkbenchImages;
|
||||||
|
|
||||||
public class TerminalActionCut extends TerminalAction
|
public class TerminalActionCut extends TerminalAction
|
||||||
{
|
{
|
||||||
protected TerminalActionCut(TerminalTarget target)
|
public TerminalActionCut(ITerminalView target)
|
||||||
{
|
{
|
||||||
super(target,
|
super(target,
|
||||||
ON_EDIT_CUT,
|
|
||||||
TerminalActionCut.class.getName());
|
TerminalActionCut.class.getName());
|
||||||
|
|
||||||
ImageRegistry imageRegistry;
|
ImageRegistry imageRegistry;
|
||||||
|
|
||||||
imageRegistry = WorkbenchImages.getImageRegistry();
|
imageRegistry = WorkbenchImages.getImageRegistry();
|
||||||
setupAction(TERMINAL_TEXT_CUT,
|
setupAction(ActionMessages.CUT,
|
||||||
TERMINAL_TEXT_CUT,
|
ActionMessages.CUT,
|
||||||
ISharedImages.IMG_TOOL_CUT,
|
ISharedImages.IMG_TOOL_CUT,
|
||||||
ISharedImages.IMG_TOOL_CUT,
|
ISharedImages.IMG_TOOL_CUT,
|
||||||
ISharedImages.IMG_TOOL_CUT_DISABLED,
|
ISharedImages.IMG_TOOL_CUT_DISABLED,
|
||||||
true,
|
true,
|
||||||
imageRegistry);
|
imageRegistry);
|
||||||
}
|
}
|
||||||
|
public void run() {
|
||||||
|
fTarget.onEditCut();
|
||||||
|
}
|
||||||
}
|
}
|
|
@ -10,24 +10,29 @@
|
||||||
*
|
*
|
||||||
*******************************************************************************/
|
*******************************************************************************/
|
||||||
|
|
||||||
package org.eclipse.tm.terminal;
|
package org.eclipse.tm.terminal.internal.actions;
|
||||||
|
|
||||||
|
import org.eclipse.tm.terminal.internal.view.ITerminalView;
|
||||||
|
import org.eclipse.tm.terminal.internal.view.ImageConsts;
|
||||||
|
|
||||||
public class TerminalActionDisconnect extends TerminalAction
|
public class TerminalActionDisconnect extends TerminalAction
|
||||||
{
|
{
|
||||||
/**
|
/**
|
||||||
*
|
*
|
||||||
*/
|
*/
|
||||||
protected TerminalActionDisconnect(TerminalTarget target)
|
public TerminalActionDisconnect(ITerminalView target)
|
||||||
{
|
{
|
||||||
super(target,
|
super(target,
|
||||||
ON_TERMINAL_DISCONNECT,
|
|
||||||
TerminalActionDisconnect.class.getName());
|
TerminalActionDisconnect.class.getName());
|
||||||
|
|
||||||
setupAction(TERMINAL_TEXT_DISCONNECT,
|
setupAction(ActionMessages.DISCONNECT,
|
||||||
TERMINAL_TEXT_DISCONNECT,
|
ActionMessages.DISCONNECT,
|
||||||
TERMINAL_IMAGE_CLCL_DISCONNECT,
|
ImageConsts.IMAGE_CLCL_DISCONNECT,
|
||||||
TERMINAL_IMAGE_ELCL_DISCONNECT,
|
ImageConsts.IMAGE_ELCL_DISCONNECT,
|
||||||
TERMINAL_IMAGE_DLCL_DISCONNECT,
|
ImageConsts.IMAGE_DLCL_DISCONNECT,
|
||||||
false);
|
false);
|
||||||
}
|
}
|
||||||
|
public void run() {
|
||||||
|
fTarget.onTerminalDisconnect();
|
||||||
|
}
|
||||||
}
|
}
|
|
@ -10,7 +10,10 @@
|
||||||
*
|
*
|
||||||
*******************************************************************************/
|
*******************************************************************************/
|
||||||
|
|
||||||
package org.eclipse.tm.terminal;
|
package org.eclipse.tm.terminal.internal.actions;
|
||||||
|
|
||||||
|
import org.eclipse.tm.terminal.internal.view.ITerminalView;
|
||||||
|
import org.eclipse.tm.terminal.internal.view.ImageConsts;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* UNDER CONSTRUCTION
|
* UNDER CONSTRUCTION
|
||||||
|
@ -22,15 +25,18 @@ public class TerminalActionNewTerminal extends TerminalAction
|
||||||
/**
|
/**
|
||||||
* UNDER CONSTRUCTION
|
* UNDER CONSTRUCTION
|
||||||
*/
|
*/
|
||||||
protected TerminalActionNewTerminal(TerminalTarget target)
|
public TerminalActionNewTerminal(ITerminalView target)
|
||||||
{
|
{
|
||||||
super(target, ON_TERMINAL_NEW_TERMINAL, TerminalActionNewTerminal.class.getName());
|
super(target, TerminalActionNewTerminal.class.getName());
|
||||||
|
|
||||||
setupAction(TERMINAL_TEXT_NEW_TERMINAL,
|
setupAction(ActionMessages.NEW_TERMINAL,
|
||||||
TERMINAL_TEXT_NEW_TERMINAL,
|
ActionMessages.NEW_TERMINAL,
|
||||||
TERMINAL_IMAGE_NEW_TERMINAL,
|
ImageConsts.IMAGE_NEW_TERMINAL,
|
||||||
TERMINAL_IMAGE_NEW_TERMINAL,
|
ImageConsts.IMAGE_NEW_TERMINAL,
|
||||||
TERMINAL_IMAGE_NEW_TERMINAL,
|
ImageConsts.IMAGE_NEW_TERMINAL,
|
||||||
true);
|
true);
|
||||||
}
|
}
|
||||||
|
public void run() {
|
||||||
|
fTarget.onTerminalNewTerminal();
|
||||||
|
}
|
||||||
}
|
}
|
|
@ -10,29 +10,32 @@
|
||||||
*
|
*
|
||||||
*******************************************************************************/
|
*******************************************************************************/
|
||||||
|
|
||||||
package org.eclipse.tm.terminal;
|
package org.eclipse.tm.terminal.internal.actions;
|
||||||
|
|
||||||
import org.eclipse.jface.resource.ImageRegistry;
|
import org.eclipse.jface.resource.ImageRegistry;
|
||||||
|
import org.eclipse.tm.terminal.internal.view.ITerminalView;
|
||||||
import org.eclipse.ui.ISharedImages;
|
import org.eclipse.ui.ISharedImages;
|
||||||
import org.eclipse.ui.internal.WorkbenchImages;
|
import org.eclipse.ui.internal.WorkbenchImages;
|
||||||
|
|
||||||
public class TerminalActionPaste extends TerminalAction
|
public class TerminalActionPaste extends TerminalAction
|
||||||
{
|
{
|
||||||
protected TerminalActionPaste(TerminalTarget target)
|
public TerminalActionPaste(ITerminalView target)
|
||||||
{
|
{
|
||||||
super(target,
|
super(target,
|
||||||
ON_EDIT_PASTE,
|
|
||||||
TerminalActionPaste.class.getName());
|
TerminalActionPaste.class.getName());
|
||||||
|
|
||||||
ImageRegistry imageRegistry;
|
ImageRegistry imageRegistry;
|
||||||
|
|
||||||
imageRegistry = WorkbenchImages.getImageRegistry();
|
imageRegistry = WorkbenchImages.getImageRegistry();
|
||||||
setupAction(TERMINAL_TEXT_PASTE,
|
setupAction(ActionMessages.PASTE,
|
||||||
TERMINAL_TEXT_PASTE,
|
ActionMessages.PASTE,
|
||||||
ISharedImages.IMG_TOOL_PASTE,
|
ISharedImages.IMG_TOOL_PASTE,
|
||||||
ISharedImages.IMG_TOOL_PASTE_DISABLED,
|
ISharedImages.IMG_TOOL_PASTE_DISABLED,
|
||||||
ISharedImages.IMG_TOOL_PASTE,
|
ISharedImages.IMG_TOOL_PASTE,
|
||||||
false,
|
false,
|
||||||
imageRegistry);
|
imageRegistry);
|
||||||
}
|
}
|
||||||
|
public void run() {
|
||||||
|
fTarget.onEditPaste();
|
||||||
|
}
|
||||||
}
|
}
|
|
@ -10,21 +10,25 @@
|
||||||
*
|
*
|
||||||
*******************************************************************************/
|
*******************************************************************************/
|
||||||
|
|
||||||
package org.eclipse.tm.terminal;
|
package org.eclipse.tm.terminal.internal.actions;
|
||||||
|
|
||||||
|
import org.eclipse.tm.terminal.internal.view.ITerminalView;
|
||||||
|
|
||||||
public class TerminalActionSelectAll extends TerminalAction
|
public class TerminalActionSelectAll extends TerminalAction
|
||||||
{
|
{
|
||||||
protected TerminalActionSelectAll(TerminalTarget target)
|
public TerminalActionSelectAll(ITerminalView target)
|
||||||
{
|
{
|
||||||
super(target,
|
super(target,
|
||||||
ON_EDIT_SELECTALL,
|
|
||||||
TerminalActionSelectAll.class.getName());
|
TerminalActionSelectAll.class.getName());
|
||||||
|
|
||||||
setupAction(TERMINAL_TEXT_SELECTALL,
|
setupAction(ActionMessages.SELECTALL,
|
||||||
TERMINAL_TEXT_SELECTALL,
|
ActionMessages.SELECTALL,
|
||||||
null,
|
null,
|
||||||
null,
|
null,
|
||||||
null,
|
null,
|
||||||
false);
|
false);
|
||||||
}
|
}
|
||||||
|
public void run() {
|
||||||
|
fTarget.onEditSelectAll();
|
||||||
|
}
|
||||||
}
|
}
|
|
@ -10,21 +10,26 @@
|
||||||
*
|
*
|
||||||
*******************************************************************************/
|
*******************************************************************************/
|
||||||
|
|
||||||
package org.eclipse.tm.terminal;
|
package org.eclipse.tm.terminal.internal.actions;
|
||||||
|
|
||||||
|
import org.eclipse.tm.terminal.internal.view.ITerminalView;
|
||||||
|
import org.eclipse.tm.terminal.internal.view.ImageConsts;
|
||||||
|
|
||||||
public class TerminalActionSettings extends TerminalAction
|
public class TerminalActionSettings extends TerminalAction
|
||||||
{
|
{
|
||||||
protected TerminalActionSettings(TerminalTarget target)
|
public TerminalActionSettings(ITerminalView target)
|
||||||
{
|
{
|
||||||
super(target,
|
super(target,
|
||||||
ON_TERMINAL_SETTINGS,
|
|
||||||
TerminalActionSettings.class.getName());
|
TerminalActionSettings.class.getName());
|
||||||
|
|
||||||
setupAction(TERMINAL_TEXT_SETTINGS_ELLIPSE,
|
setupAction(ActionMessages.SETTINGS_ELLIPSE,
|
||||||
TERMINAL_TEXT_SETTINGS,
|
ActionMessages.SETTINGS,
|
||||||
TERMINAL_IMAGE_CLCL_SETTINGS,
|
ImageConsts.IMAGE_CLCL_SETTINGS,
|
||||||
TERMINAL_IMAGE_ELCL_SETTINGS,
|
ImageConsts.IMAGE_ELCL_SETTINGS,
|
||||||
TERMINAL_IMAGE_DLCL_SETTINGS,
|
ImageConsts.IMAGE_DLCL_SETTINGS,
|
||||||
true);
|
true);
|
||||||
}
|
}
|
||||||
|
public void run() {
|
||||||
|
fTarget.onTerminalSettings();
|
||||||
|
}
|
||||||
}
|
}
|
|
@ -0,0 +1,31 @@
|
||||||
|
/*******************************************************************************
|
||||||
|
* Copyright (c) 2006 Wind River Systems, Inc. and others.
|
||||||
|
* All rights reserved. This program and the accompanying materials
|
||||||
|
* are made available under the terms of the Eclipse Public License v1.0
|
||||||
|
* which accompanies this distribution, and is available at
|
||||||
|
* http://www.eclipse.org/legal/epl-v10.html
|
||||||
|
*
|
||||||
|
* Contributors:
|
||||||
|
* Wind River Systems, Inc. - initial implementation
|
||||||
|
*
|
||||||
|
*******************************************************************************/
|
||||||
|
|
||||||
|
package org.eclipse.tm.terminal.internal.view;
|
||||||
|
|
||||||
|
public interface ITerminalView {
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Display a new Terminal view. This method is called when the user clicks the New
|
||||||
|
* Terminal button in any Terminal view's toolbar.
|
||||||
|
*/
|
||||||
|
public void onTerminalNewTerminal();
|
||||||
|
public void onTerminalConnect();
|
||||||
|
public void onTerminalDisconnect();
|
||||||
|
public void onTerminalSettings();
|
||||||
|
public void onTerminalFontChanged();
|
||||||
|
public void onEditCopy();
|
||||||
|
public void onEditCut();
|
||||||
|
public void onEditPaste();
|
||||||
|
public void onEditClearAll();
|
||||||
|
public void onEditSelectAll();
|
||||||
|
}
|
|
@ -0,0 +1,40 @@
|
||||||
|
/*******************************************************************************
|
||||||
|
* Copyright (c) 2006 Wind River Systems, Inc. and others.
|
||||||
|
* All rights reserved. This program and the accompanying materials
|
||||||
|
* are made available under the terms of the Eclipse Public License v1.0
|
||||||
|
* which accompanies this distribution, and is available at
|
||||||
|
* http://www.eclipse.org/legal/epl-v10.html
|
||||||
|
*
|
||||||
|
* Contributors:
|
||||||
|
* Wind River Systems, Inc. - initial implementation
|
||||||
|
*
|
||||||
|
*******************************************************************************/
|
||||||
|
|
||||||
|
package org.eclipse.tm.terminal.internal.view;
|
||||||
|
|
||||||
|
public interface ImageConsts
|
||||||
|
{
|
||||||
|
public final static String IMAGE_DIR_ROOT = "icons/"; //$NON-NLS-1$
|
||||||
|
public final static String IMAGE_DIR_CTOOL = "ctool16/"; // basic colors - size 16x16 //$NON-NLS-1$
|
||||||
|
public final static String IMAGE_DIR_LOCALTOOL = "clcl16/"; // basic colors - size 16x16 //$NON-NLS-1$
|
||||||
|
public final static String IMAGE_DIR_DLCL = "dlcl16/"; // disabled - size 16x16 //$NON-NLS-1$
|
||||||
|
public final static String IMAGE_DIR_ELCL = "elcl16/"; // enabled - size 16x16 //$NON-NLS-1$
|
||||||
|
public final static String IMAGE_DIR_OBJECT = "obj16/"; // basic colors - size 16x16 //$NON-NLS-1$
|
||||||
|
public final static String IMAGE_DIR_WIZBAN = "wizban/"; // basic colors - size 16x16 //$NON-NLS-1$
|
||||||
|
public final static String IMAGE_DIR_OVR = "ovr16/"; // basic colors - size 7x8 //$NON-NLS-1$
|
||||||
|
public final static String IMAGE_DIR_VIEW = "cview16/"; // views //$NON-NLS-1$
|
||||||
|
public final static String IMAGE_DIR_EVIEW = "eview16/"; // views //$NON-NLS-1$
|
||||||
|
|
||||||
|
public static final String IMAGE_NEW_TERMINAL = "TerminalViewNewTerminal"; //$NON-NLS-1$
|
||||||
|
public static final String IMAGE_CLCL_CONNECT = "ImageClclConnect"; //$NON-NLS-1$
|
||||||
|
public static final String IMAGE_CLCL_DISCONNECT = "ImageClclDisconnect"; //$NON-NLS-1$
|
||||||
|
public static final String IMAGE_CLCL_SETTINGS = "ImageClclSettings"; //$NON-NLS-1$
|
||||||
|
|
||||||
|
public static final String IMAGE_DLCL_CONNECT = "ImageDlclConnect"; //$NON-NLS-1$
|
||||||
|
public static final String IMAGE_DLCL_DISCONNECT = "ImageDlclDisconnect"; //$NON-NLS-1$
|
||||||
|
public static final String IMAGE_DLCL_SETTINGS = "ImageDlclSettings"; //$NON-NLS-1$
|
||||||
|
|
||||||
|
public static final String IMAGE_ELCL_CONNECT = "ImageElclConnect"; //$NON-NLS-1$
|
||||||
|
public static final String IMAGE_ELCL_DISCONNECT = "ImageElclDisconnect"; //$NON-NLS-1$
|
||||||
|
public static final String IMAGE_ELCL_SETTINGS = "ImageElclSettings"; //$NON-NLS-1$
|
||||||
|
}
|
|
@ -0,0 +1,113 @@
|
||||||
|
/*******************************************************************************
|
||||||
|
* Copyright (c) 2006 Wind River Systems, Inc. and others.
|
||||||
|
* All rights reserved. This program and the accompanying materials
|
||||||
|
* are made available under the terms of the Eclipse Public License v1.0
|
||||||
|
* which accompanies this distribution, and is available at
|
||||||
|
* http://www.eclipse.org/legal/epl-v10.html
|
||||||
|
*
|
||||||
|
* Contributors:
|
||||||
|
* Wind River Systems, Inc. - initial implementation
|
||||||
|
*
|
||||||
|
*******************************************************************************/
|
||||||
|
package org.eclipse.tm.terminal.internal.view;
|
||||||
|
|
||||||
|
import org.eclipse.swt.SWT;
|
||||||
|
import org.eclipse.swt.graphics.Point;
|
||||||
|
import org.eclipse.swt.graphics.Rectangle;
|
||||||
|
import org.eclipse.swt.widgets.Composite;
|
||||||
|
import org.eclipse.swt.widgets.Control;
|
||||||
|
import org.eclipse.swt.widgets.Layout;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* A pagebook is a composite control where only a single control is visible
|
||||||
|
* at a time. It is similar to a notebook, but without tabs.
|
||||||
|
* <p>
|
||||||
|
* This class may be instantiated; it is not intended to be subclassed.
|
||||||
|
* </p>
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
public class PageBook extends Composite {
|
||||||
|
private Point minimumPageSize = new Point(0, 0);
|
||||||
|
/**
|
||||||
|
* Layout for the page container.
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
private class PageLayout extends Layout {
|
||||||
|
public Point computeSize(Composite composite, int wHint, int hHint, boolean force) {
|
||||||
|
if (wHint != SWT.DEFAULT && hHint != SWT.DEFAULT)
|
||||||
|
return new Point(wHint, hHint);
|
||||||
|
int x = minimumPageSize.x;
|
||||||
|
int y = minimumPageSize.y;
|
||||||
|
Control[] children = composite.getChildren();
|
||||||
|
for (int i = 0; i < children.length; i++) {
|
||||||
|
Point size = children[i].computeSize(SWT.DEFAULT, SWT.DEFAULT, force);
|
||||||
|
x = Math.max(x, size.x);
|
||||||
|
y = Math.max(y, size.y);
|
||||||
|
}
|
||||||
|
|
||||||
|
if (wHint != SWT.DEFAULT)
|
||||||
|
x = wHint;
|
||||||
|
if (hHint != SWT.DEFAULT)
|
||||||
|
y = hHint;
|
||||||
|
return new Point(x, y);
|
||||||
|
}
|
||||||
|
|
||||||
|
public void layout(Composite composite, boolean force) {
|
||||||
|
Rectangle rect = composite.getClientArea();
|
||||||
|
Control[] children = composite.getChildren();
|
||||||
|
for (int i = 0; i < children.length; i++) {
|
||||||
|
children[i].setSize(rect.width, rect.height);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
/**
|
||||||
|
* Creates a new empty pagebook.
|
||||||
|
*
|
||||||
|
* @param parent the parent composite
|
||||||
|
* @param style the SWT style bits (use {@link SWT#NONE})
|
||||||
|
*/
|
||||||
|
public PageBook(Composite parent, int style) {
|
||||||
|
super(parent, style);
|
||||||
|
setLayout(new PageLayout());
|
||||||
|
}
|
||||||
|
/**
|
||||||
|
* The current control; <code>null</code> if none.
|
||||||
|
*/
|
||||||
|
private Control currentPage = null;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Shows the given page. This method has no effect if the given page is not
|
||||||
|
* contained in this pagebook.
|
||||||
|
*
|
||||||
|
* @param page the page to show
|
||||||
|
*/
|
||||||
|
public void showPage(Control page) {
|
||||||
|
|
||||||
|
if (page == currentPage)
|
||||||
|
return;
|
||||||
|
if (page.getParent() != this)
|
||||||
|
return;
|
||||||
|
|
||||||
|
currentPage = page;
|
||||||
|
|
||||||
|
// show new page
|
||||||
|
if (page != null) {
|
||||||
|
if (!page.isDisposed()) {
|
||||||
|
page.setVisible(true);
|
||||||
|
layout(true);
|
||||||
|
// if (fRequestFocusOnShowPage)
|
||||||
|
// page.setFocus();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// hide old *after* new page has been made visible in order to avoid flashing
|
||||||
|
// we have to hide all other pages, because they might be visible
|
||||||
|
// by some other means...
|
||||||
|
Control[] pages=getChildren();
|
||||||
|
for (int i = 0; i < pages.length; i++) {
|
||||||
|
if(pages[i]!=page && !pages[i].isDisposed()) {
|
||||||
|
pages[i].setVisible(false);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
|
@ -0,0 +1,35 @@
|
||||||
|
/*******************************************************************************
|
||||||
|
* Copyright (c) 2006 Wind River Systems, Inc. and others.
|
||||||
|
* All rights reserved. This program and the accompanying materials
|
||||||
|
* are made available under the terms of the Eclipse Public License v1.0
|
||||||
|
* which accompanies this distribution, and is available at
|
||||||
|
* http://www.eclipse.org/legal/epl-v10.html
|
||||||
|
*
|
||||||
|
* Contributors:
|
||||||
|
* Wind River Systems, Inc. - initial implementation
|
||||||
|
*
|
||||||
|
*******************************************************************************/
|
||||||
|
package org.eclipse.tm.terminal.internal.view;
|
||||||
|
|
||||||
|
import org.eclipse.tm.terminal.ISettingsStore;
|
||||||
|
|
||||||
|
public class SettingStorePrefixDecorator implements ISettingsStore {
|
||||||
|
private final String fPrefix;
|
||||||
|
private final ISettingsStore fStore;
|
||||||
|
SettingStorePrefixDecorator(ISettingsStore store,String prefix) {
|
||||||
|
fPrefix=prefix;
|
||||||
|
fStore=store;
|
||||||
|
}
|
||||||
|
public String get(String key) {
|
||||||
|
return fStore.get(fPrefix+key);
|
||||||
|
}
|
||||||
|
|
||||||
|
public String get(String key, String defaultValue) {
|
||||||
|
return fStore.get(fPrefix+key,defaultValue);
|
||||||
|
}
|
||||||
|
|
||||||
|
public void put(String key, String value) {
|
||||||
|
fStore.put(fPrefix+key,value);
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
|
@ -0,0 +1,46 @@
|
||||||
|
/*******************************************************************************
|
||||||
|
* Copyright (c) 2006 Wind River Systems, Inc. and others.
|
||||||
|
* All rights reserved. This program and the accompanying materials
|
||||||
|
* are made available under the terms of the Eclipse Public License v1.0
|
||||||
|
* which accompanies this distribution, and is available at
|
||||||
|
* http://www.eclipse.org/legal/epl-v10.html
|
||||||
|
*
|
||||||
|
* Contributors:
|
||||||
|
* Wind River Systems, Inc. - initial implementation
|
||||||
|
*
|
||||||
|
*******************************************************************************/
|
||||||
|
package org.eclipse.tm.terminal.internal.view;
|
||||||
|
|
||||||
|
import org.eclipse.jface.dialogs.IDialogSettings;
|
||||||
|
import org.eclipse.tm.terminal.ISettingsStore;
|
||||||
|
|
||||||
|
/**
|
||||||
|
*
|
||||||
|
* A {@link IDialogSettings} based {@link ISettingsStore}.
|
||||||
|
*
|
||||||
|
* @author Michael Scharf
|
||||||
|
*/
|
||||||
|
class SettingsStore implements ISettingsStore {
|
||||||
|
final private IDialogSettings fDialogSettings;
|
||||||
|
final private String fPrefix;
|
||||||
|
public SettingsStore(String terminalPartName) {
|
||||||
|
fDialogSettings=TerminalViewPlugin.getDefault().getDialogSettings();
|
||||||
|
fPrefix=getClass().getName() + "." + terminalPartName + "."; //$NON-NLS-1$ //$NON-NLS-2$;
|
||||||
|
}
|
||||||
|
|
||||||
|
public String get(String key) {
|
||||||
|
return get(key,null);
|
||||||
|
}
|
||||||
|
public String get(String key, String defaultValue) {
|
||||||
|
String value = fDialogSettings.get(fPrefix + key);
|
||||||
|
|
||||||
|
if ((value == null) || (value.equals(""))) //$NON-NLS-1$
|
||||||
|
return defaultValue;
|
||||||
|
|
||||||
|
return value;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void put(String key, String strValue) {
|
||||||
|
fDialogSettings.put(fPrefix + key , strValue);
|
||||||
|
}
|
||||||
|
}
|
|
@ -0,0 +1,150 @@
|
||||||
|
/*******************************************************************************
|
||||||
|
* Copyright (c) 2006 Wind River Systems, Inc. and others.
|
||||||
|
* All rights reserved. This program and the accompanying materials
|
||||||
|
* are made available under the terms of the Eclipse Public License v1.0
|
||||||
|
* which accompanies this distribution, and is available at
|
||||||
|
* http://www.eclipse.org/legal/epl-v10.html
|
||||||
|
*
|
||||||
|
* Contributors:
|
||||||
|
* Wind River Systems, Inc. - initial implementation
|
||||||
|
*
|
||||||
|
*******************************************************************************/
|
||||||
|
|
||||||
|
package org.eclipse.tm.terminal.internal.view;
|
||||||
|
|
||||||
|
import org.eclipse.jface.preference.BooleanFieldEditor;
|
||||||
|
import org.eclipse.jface.preference.FieldEditorPreferencePage;
|
||||||
|
import org.eclipse.jface.preference.IPreferenceStore;
|
||||||
|
import org.eclipse.jface.preference.IntegerFieldEditor;
|
||||||
|
import org.eclipse.swt.events.SelectionAdapter;
|
||||||
|
import org.eclipse.swt.events.SelectionEvent;
|
||||||
|
import org.eclipse.swt.widgets.Button;
|
||||||
|
import org.eclipse.swt.widgets.Composite;
|
||||||
|
import org.eclipse.swt.widgets.Label;
|
||||||
|
import org.eclipse.swt.widgets.Text;
|
||||||
|
import org.eclipse.ui.IWorkbench;
|
||||||
|
import org.eclipse.ui.IWorkbenchPreferencePage;
|
||||||
|
|
||||||
|
public class TerminalPreferencePage extends FieldEditorPreferencePage implements
|
||||||
|
IWorkbenchPreferencePage {
|
||||||
|
public static final String PREF_LIMITOUTPUT = "TerminalPrefLimitOutput"; //$NON-NLS-1$
|
||||||
|
public static final String PREF_BUFFERLINES = "TerminalPrefBufferLines"; //$NON-NLS-1$
|
||||||
|
public static final String PREF_TIMEOUT_SERIAL = "TerminalPrefTimeoutSerial"; //$NON-NLS-1$
|
||||||
|
public static final String PREF_TIMEOUT_NETWORK = "TerminalPrefTimeoutNetwork"; //$NON-NLS-1$
|
||||||
|
public static final boolean DEFAULT_LIMITOUTPUT = true;
|
||||||
|
public static final int DEFAULT_BUFFERLINES = 1000;
|
||||||
|
public static final int DEFAULT_TIMEOUT_SERIAL = 5;
|
||||||
|
public static final int DEFAULT_TIMEOUT_NETWORK = 5;
|
||||||
|
|
||||||
|
|
||||||
|
protected TerminalBooleanFieldEditor fEditorLimitOutput;
|
||||||
|
|
||||||
|
protected IntegerFieldEditor fEditorBufferSize;
|
||||||
|
|
||||||
|
protected IntegerFieldEditor fEditorSerialTimeout;
|
||||||
|
|
||||||
|
protected IntegerFieldEditor fEditorNetworkTimeout;
|
||||||
|
public TerminalPreferencePage() {
|
||||||
|
super(GRID);
|
||||||
|
}
|
||||||
|
public void onLimitOutputSelected() {
|
||||||
|
Button ctlButton;
|
||||||
|
Text ctlText;
|
||||||
|
Label ctlLabel;
|
||||||
|
boolean bEnabled;
|
||||||
|
|
||||||
|
ctlButton = fEditorLimitOutput.getChangeControl(getFieldEditorParent());
|
||||||
|
ctlText = fEditorBufferSize.getTextControl(getFieldEditorParent());
|
||||||
|
ctlLabel = fEditorBufferSize.getLabelControl(getFieldEditorParent());
|
||||||
|
bEnabled = ctlButton.getSelection();
|
||||||
|
|
||||||
|
ctlText.setEnabled(bEnabled);
|
||||||
|
ctlLabel.setEnabled(bEnabled);
|
||||||
|
}
|
||||||
|
protected void createFieldEditors() {
|
||||||
|
setupPage();
|
||||||
|
}
|
||||||
|
protected void initialize() {
|
||||||
|
super.initialize();
|
||||||
|
|
||||||
|
onLimitOutputSelected();
|
||||||
|
}
|
||||||
|
protected void performDefaults() {
|
||||||
|
super.performDefaults();
|
||||||
|
|
||||||
|
onLimitOutputSelected();
|
||||||
|
}
|
||||||
|
public void init(IWorkbench workbench) {
|
||||||
|
// do nothing
|
||||||
|
}
|
||||||
|
protected void setupPage() {
|
||||||
|
setupData();
|
||||||
|
setupEditors();
|
||||||
|
setupListeners();
|
||||||
|
}
|
||||||
|
protected void setupData() {
|
||||||
|
TerminalViewPlugin plugin;
|
||||||
|
IPreferenceStore preferenceStore;
|
||||||
|
|
||||||
|
plugin = TerminalViewPlugin.getDefault();
|
||||||
|
preferenceStore = plugin.getPreferenceStore();
|
||||||
|
setPreferenceStore(preferenceStore);
|
||||||
|
}
|
||||||
|
protected void setupEditors() {
|
||||||
|
fEditorLimitOutput = new TerminalBooleanFieldEditor(
|
||||||
|
PREF_LIMITOUTPUT, ViewMessages.LIMITOUTPUT,
|
||||||
|
getFieldEditorParent());
|
||||||
|
fEditorBufferSize = new IntegerFieldEditor(PREF_BUFFERLINES,
|
||||||
|
ViewMessages.BUFFERLINES, getFieldEditorParent());
|
||||||
|
fEditorSerialTimeout = new IntegerFieldEditor(
|
||||||
|
PREF_TIMEOUT_SERIAL, ViewMessages.SERIALTIMEOUT,
|
||||||
|
getFieldEditorParent());
|
||||||
|
fEditorNetworkTimeout = new IntegerFieldEditor(
|
||||||
|
PREF_TIMEOUT_NETWORK, ViewMessages.NETWORKTIMEOUT,
|
||||||
|
getFieldEditorParent());
|
||||||
|
|
||||||
|
fEditorBufferSize.setValidRange(0, Integer.MAX_VALUE);
|
||||||
|
fEditorSerialTimeout.setValidRange(0, Integer.MAX_VALUE);
|
||||||
|
fEditorNetworkTimeout.setValidRange(0, Integer.MAX_VALUE);
|
||||||
|
|
||||||
|
addField(fEditorLimitOutput);
|
||||||
|
addField(fEditorBufferSize);
|
||||||
|
addField(fEditorSerialTimeout);
|
||||||
|
addField(fEditorNetworkTimeout);
|
||||||
|
}
|
||||||
|
protected void setupListeners() {
|
||||||
|
TerminalSelectionHandler selectionHandler;
|
||||||
|
Button ctlButton;
|
||||||
|
|
||||||
|
selectionHandler = new TerminalSelectionHandler();
|
||||||
|
ctlButton = fEditorLimitOutput.getChangeControl(getFieldEditorParent());
|
||||||
|
ctlButton.addSelectionListener(selectionHandler);
|
||||||
|
}
|
||||||
|
public class TerminalBooleanFieldEditor extends BooleanFieldEditor {
|
||||||
|
public TerminalBooleanFieldEditor(String strName, String strLabel,
|
||||||
|
Composite ctlParent) {
|
||||||
|
super(strName, strLabel, ctlParent);
|
||||||
|
}
|
||||||
|
public Button getChangeControl(Composite parent) {
|
||||||
|
return super.getChangeControl(parent);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
protected class TerminalSelectionHandler extends SelectionAdapter {
|
||||||
|
protected TerminalSelectionHandler() {
|
||||||
|
super();
|
||||||
|
}
|
||||||
|
public void widgetSelected(SelectionEvent event) {
|
||||||
|
Object source;
|
||||||
|
Button ctlButton;
|
||||||
|
|
||||||
|
source = event.getSource();
|
||||||
|
ctlButton = fEditorLimitOutput
|
||||||
|
.getChangeControl(getFieldEditorParent());
|
||||||
|
|
||||||
|
if (source == ctlButton) {
|
||||||
|
onLimitOutputSelected();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
}
|
|
@ -0,0 +1,143 @@
|
||||||
|
/*******************************************************************************
|
||||||
|
* Copyright (c) 2006 Wind River Systems, Inc. and others.
|
||||||
|
* All rights reserved. This program and the accompanying materials
|
||||||
|
* are made available under the terms of the Eclipse Public License v1.0
|
||||||
|
* which accompanies this distribution, and is available at
|
||||||
|
* http://www.eclipse.org/legal/epl-v10.html
|
||||||
|
*
|
||||||
|
* Contributors:
|
||||||
|
* Wind River Systems, Inc. - initial implementation
|
||||||
|
*
|
||||||
|
*******************************************************************************/
|
||||||
|
|
||||||
|
package org.eclipse.tm.terminal.internal.view;
|
||||||
|
|
||||||
|
import org.eclipse.jface.dialogs.Dialog;
|
||||||
|
import org.eclipse.swt.SWT;
|
||||||
|
import org.eclipse.swt.events.SelectionAdapter;
|
||||||
|
import org.eclipse.swt.events.SelectionEvent;
|
||||||
|
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.Control;
|
||||||
|
import org.eclipse.swt.widgets.Group;
|
||||||
|
import org.eclipse.swt.widgets.Shell;
|
||||||
|
import org.eclipse.tm.terminal.ISettingsPage;
|
||||||
|
import org.eclipse.tm.terminal.ITerminalConnector;
|
||||||
|
|
||||||
|
class TerminalSettingsDlg extends Dialog {
|
||||||
|
private Combo fCtlConnTypeCombo;
|
||||||
|
private final ITerminalConnector[] fConnectors;
|
||||||
|
private final ISettingsPage[] fPages;
|
||||||
|
private int fSelectedConnector;
|
||||||
|
private PageBook fPageBook;
|
||||||
|
|
||||||
|
public TerminalSettingsDlg(Shell shell, ITerminalConnector[] connectors, ITerminalConnector connector) {
|
||||||
|
super(shell);
|
||||||
|
fConnectors=connectors;
|
||||||
|
fPages=new ISettingsPage[fConnectors.length];
|
||||||
|
for (int i = 0; i < fConnectors.length; i++) {
|
||||||
|
fPages[i]=fConnectors[i].makeSettingsPage();
|
||||||
|
if(fConnectors[i]==connector)
|
||||||
|
fSelectedConnector=i;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
protected void okPressed() {
|
||||||
|
if (!validateSettings())
|
||||||
|
return;
|
||||||
|
if(fSelectedConnector>=0) {
|
||||||
|
fPages[fSelectedConnector].saveSettings();
|
||||||
|
}
|
||||||
|
super.okPressed();
|
||||||
|
}
|
||||||
|
protected void cancelPressed() {
|
||||||
|
fSelectedConnector=-1;
|
||||||
|
super.cancelPressed();
|
||||||
|
}
|
||||||
|
public int open() {
|
||||||
|
setShellStyle(getShellStyle() | SWT.RESIZE);
|
||||||
|
return super.open();
|
||||||
|
}
|
||||||
|
protected void configureShell(Shell newShell) {
|
||||||
|
super.configureShell(newShell);
|
||||||
|
|
||||||
|
newShell.setText(ViewMessages.TERMINALSETTINGS);
|
||||||
|
}
|
||||||
|
protected Control createDialogArea(Composite parent) {
|
||||||
|
Composite ctlComposite = (Composite) super.createDialogArea(parent);
|
||||||
|
setupPanel(ctlComposite);
|
||||||
|
setupListeners();
|
||||||
|
initFields();
|
||||||
|
|
||||||
|
return ctlComposite;
|
||||||
|
}
|
||||||
|
private void initFields() {
|
||||||
|
// Load controls
|
||||||
|
for (int i = 0; i < fPages.length; i++) {
|
||||||
|
String name=fPages[i].getName();
|
||||||
|
fCtlConnTypeCombo.add(name);
|
||||||
|
if(fSelectedConnector==i) {
|
||||||
|
fCtlConnTypeCombo.select(i);
|
||||||
|
selectPage(i);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
private boolean validateSettings() {
|
||||||
|
if(fSelectedConnector<0)
|
||||||
|
return true;
|
||||||
|
return fPages[fSelectedConnector].validateSettings();
|
||||||
|
}
|
||||||
|
private void setupPanel(Composite wndParent) {
|
||||||
|
setupConnTypePanel(wndParent);
|
||||||
|
setupSettingsGroup(wndParent);
|
||||||
|
}
|
||||||
|
private void setupConnTypePanel(Composite wndParent) {
|
||||||
|
Group wndGroup;
|
||||||
|
GridLayout gridLayout;
|
||||||
|
GridData gridData;
|
||||||
|
|
||||||
|
wndGroup = new Group(wndParent, SWT.NONE);
|
||||||
|
gridLayout = new GridLayout(1, true);
|
||||||
|
gridData = new GridData(GridData.FILL_HORIZONTAL);
|
||||||
|
|
||||||
|
wndGroup.setLayout(gridLayout);
|
||||||
|
wndGroup.setLayoutData(gridData);
|
||||||
|
wndGroup.setText(ViewMessages.CONNECTIONTYPE + ":"); //$NON-NLS-1$
|
||||||
|
|
||||||
|
fCtlConnTypeCombo = new Combo(wndGroup, SWT.DROP_DOWN | SWT.READ_ONLY);
|
||||||
|
gridData = new GridData(GridData.FILL_HORIZONTAL);
|
||||||
|
gridData.widthHint = 200;
|
||||||
|
fCtlConnTypeCombo.setLayoutData(gridData);
|
||||||
|
}
|
||||||
|
private void setupSettingsGroup(Composite parent) {
|
||||||
|
Group group = new Group(parent, SWT.NONE);
|
||||||
|
GridLayout gridLayout = new GridLayout();
|
||||||
|
GridData gridData = new GridData(GridData.FILL_BOTH);
|
||||||
|
|
||||||
|
group.setText(ViewMessages.SETTINGS + ":"); //$NON-NLS-1$
|
||||||
|
group.setLayout(gridLayout);
|
||||||
|
group.setLayoutData(gridData);
|
||||||
|
fPageBook=new PageBook(group,SWT.NONE);
|
||||||
|
for (int i = 0; i < fPages.length; i++) {
|
||||||
|
fPages[i].createControl(fPageBook);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
private void setupListeners() {
|
||||||
|
fCtlConnTypeCombo.addSelectionListener(new SelectionAdapter() {
|
||||||
|
public void widgetSelected(SelectionEvent event) {
|
||||||
|
selectPage(fCtlConnTypeCombo.getSelectionIndex());
|
||||||
|
}
|
||||||
|
});
|
||||||
|
}
|
||||||
|
public ITerminalConnector getConnector() {
|
||||||
|
if(fSelectedConnector>=0)
|
||||||
|
return fConnectors[fSelectedConnector];
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
private void selectPage(int index) {
|
||||||
|
fSelectedConnector=index;
|
||||||
|
Control[] pages=fPageBook.getChildren();
|
||||||
|
fPageBook.showPage(pages[fSelectedConnector]);
|
||||||
|
}
|
||||||
|
}
|
|
@ -0,0 +1,657 @@
|
||||||
|
/*******************************************************************************
|
||||||
|
* Copyright (c) 2006 Wind River Systems, Inc. and others.
|
||||||
|
* All rights reserved. This program and the accompanying materials
|
||||||
|
* are made available under the terms of the Eclipse Public License v1.0
|
||||||
|
* which accompanies this distribution, and is available at
|
||||||
|
* http://www.eclipse.org/legal/epl-v10.html
|
||||||
|
*
|
||||||
|
* Contributors:
|
||||||
|
* Wind River Systems, Inc. - initial implementation
|
||||||
|
*
|
||||||
|
*******************************************************************************/
|
||||||
|
|
||||||
|
package org.eclipse.tm.terminal.internal.view;
|
||||||
|
|
||||||
|
import org.eclipse.core.runtime.Preferences;
|
||||||
|
import org.eclipse.jface.action.ActionContributionItem;
|
||||||
|
import org.eclipse.jface.action.IMenuListener;
|
||||||
|
import org.eclipse.jface.action.IMenuManager;
|
||||||
|
import org.eclipse.jface.action.IToolBarManager;
|
||||||
|
import org.eclipse.jface.action.MenuManager;
|
||||||
|
import org.eclipse.jface.action.Separator;
|
||||||
|
import org.eclipse.jface.resource.FontRegistry;
|
||||||
|
import org.eclipse.jface.resource.JFaceResources;
|
||||||
|
import org.eclipse.jface.util.IPropertyChangeListener;
|
||||||
|
import org.eclipse.jface.util.PropertyChangeEvent;
|
||||||
|
import org.eclipse.jface.window.Window;
|
||||||
|
import org.eclipse.swt.custom.StyledText;
|
||||||
|
import org.eclipse.swt.dnd.Clipboard;
|
||||||
|
import org.eclipse.swt.dnd.TextTransfer;
|
||||||
|
import org.eclipse.swt.events.MenuEvent;
|
||||||
|
import org.eclipse.swt.events.MenuListener;
|
||||||
|
import org.eclipse.swt.graphics.Font;
|
||||||
|
import org.eclipse.swt.widgets.Composite;
|
||||||
|
import org.eclipse.swt.widgets.Display;
|
||||||
|
import org.eclipse.swt.widgets.Menu;
|
||||||
|
import org.eclipse.tm.terminal.ISettingsStore;
|
||||||
|
import org.eclipse.tm.terminal.ITerminalConnector;
|
||||||
|
import org.eclipse.tm.terminal.Logger;
|
||||||
|
import org.eclipse.tm.terminal.TerminalConnectorExtension;
|
||||||
|
import org.eclipse.tm.terminal.TerminalState;
|
||||||
|
import org.eclipse.tm.terminal.internal.actions.TerminalAction;
|
||||||
|
import org.eclipse.tm.terminal.internal.actions.TerminalActionClearAll;
|
||||||
|
import org.eclipse.tm.terminal.internal.actions.TerminalActionConnect;
|
||||||
|
import org.eclipse.tm.terminal.internal.actions.TerminalActionCopy;
|
||||||
|
import org.eclipse.tm.terminal.internal.actions.TerminalActionCut;
|
||||||
|
import org.eclipse.tm.terminal.internal.actions.TerminalActionDisconnect;
|
||||||
|
import org.eclipse.tm.terminal.internal.actions.TerminalActionNewTerminal;
|
||||||
|
import org.eclipse.tm.terminal.internal.actions.TerminalActionPaste;
|
||||||
|
import org.eclipse.tm.terminal.internal.actions.TerminalActionSelectAll;
|
||||||
|
import org.eclipse.tm.terminal.internal.actions.TerminalActionSettings;
|
||||||
|
import org.eclipse.ui.IActionBars;
|
||||||
|
import org.eclipse.ui.IViewSite;
|
||||||
|
import org.eclipse.ui.IWorkbench;
|
||||||
|
import org.eclipse.ui.IWorkbenchActionConstants;
|
||||||
|
import org.eclipse.ui.IWorkbenchPage;
|
||||||
|
import org.eclipse.ui.PartInitException;
|
||||||
|
import org.eclipse.ui.actions.ActionFactory;
|
||||||
|
import org.eclipse.ui.actions.RetargetAction;
|
||||||
|
import org.eclipse.ui.contexts.IContextActivation;
|
||||||
|
import org.eclipse.ui.contexts.IContextService;
|
||||||
|
import org.eclipse.ui.internal.WorkbenchWindow;
|
||||||
|
import org.eclipse.ui.part.ViewPart;
|
||||||
|
import org.eclipse.tm.terminal.control.ITerminalListener;
|
||||||
|
import org.eclipse.tm.terminal.control.ITerminalViewControl;
|
||||||
|
import org.eclipse.tm.terminal.control.TerminalViewControlFactory;
|
||||||
|
|
||||||
|
public class TerminalView extends ViewPart implements ITerminalView, ITerminalListener {
|
||||||
|
public static final String FONT_DEFINITION = "terminal.views.view.font.definition"; //$NON-NLS-1$
|
||||||
|
protected static final String fSecondaryTerminalCountMutex = ""; //$NON-NLS-1$
|
||||||
|
|
||||||
|
protected static int fSecondaryTerminalCount = 0;
|
||||||
|
|
||||||
|
protected ITerminalViewControl fCtlTerminal;
|
||||||
|
|
||||||
|
protected TerminalAction fActionTerminalNewTerminal;
|
||||||
|
|
||||||
|
protected TerminalAction fActionTerminalConnect;
|
||||||
|
|
||||||
|
protected TerminalAction fActionTerminalDisconnect;
|
||||||
|
|
||||||
|
protected TerminalAction fActionTerminalSettings;
|
||||||
|
|
||||||
|
protected TerminalAction fActionEditCopy;
|
||||||
|
|
||||||
|
protected TerminalAction fActionEditCut;
|
||||||
|
|
||||||
|
protected TerminalAction fActionEditPaste;
|
||||||
|
|
||||||
|
protected TerminalAction fActionEditClearAll;
|
||||||
|
|
||||||
|
protected TerminalAction fActionEditSelectAll;
|
||||||
|
|
||||||
|
protected TerminalMenuHandlerEdit fMenuHandlerEdit;
|
||||||
|
|
||||||
|
protected TerminalPropertyChangeHandler fPropertyChangeHandler;
|
||||||
|
|
||||||
|
protected boolean fMenuAboutToShow;
|
||||||
|
|
||||||
|
private ISettingsStore fStore;
|
||||||
|
|
||||||
|
/** Remember the item with which we contributed the shortcut to unregister them again! */
|
||||||
|
private IContextActivation fRememberedContextActivation;
|
||||||
|
|
||||||
|
public TerminalView() {
|
||||||
|
Logger
|
||||||
|
.log("==============================================================="); //$NON-NLS-1$
|
||||||
|
}
|
||||||
|
|
||||||
|
private void XXXXX() {
|
||||||
|
Preferences preferences = TerminalViewPlugin.getDefault().getPluginPreferences();
|
||||||
|
boolean bLimitOutput = preferences.getBoolean(TerminalPreferencePage.PREF_LIMITOUTPUT);
|
||||||
|
int bufferLineLimit = preferences.getInt(TerminalPreferencePage.PREF_BUFFERLINES);
|
||||||
|
|
||||||
|
}
|
||||||
|
// TerminalTarget interface
|
||||||
|
public void setState(final TerminalState state) {
|
||||||
|
Runnable runnable=new Runnable() {
|
||||||
|
public void run() {
|
||||||
|
updateStatus();
|
||||||
|
onTerminalStatus();
|
||||||
|
}
|
||||||
|
};
|
||||||
|
if(Thread.currentThread()==Display.getDefault().getThread())
|
||||||
|
runnable.run();
|
||||||
|
else
|
||||||
|
Display.getDefault().syncExec(runnable);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Display a new Terminal view. This method is called when the user clicks the New
|
||||||
|
* Terminal button in any Terminal view's toolbar.
|
||||||
|
*/
|
||||||
|
public void onTerminalNewTerminal() {
|
||||||
|
Logger.log("creating new Terminal instance."); //$NON-NLS-1$
|
||||||
|
|
||||||
|
try {
|
||||||
|
// The second argument to showView() is a unique String identifying the
|
||||||
|
// secondary view instance. If it ever matches a previously used secondary
|
||||||
|
// view identifier, then this call will not create a new Terminal view,
|
||||||
|
// which is undesireable. Therefore, we append the current time in
|
||||||
|
// milliseconds to the secondary view identifier to ensure it is always
|
||||||
|
// unique. This code runs only when the user clicks the New Terminal
|
||||||
|
// button, so there is no risk that this code will run twice in a single
|
||||||
|
// millisecond.
|
||||||
|
|
||||||
|
getSite().getPage().showView(
|
||||||
|
"org.eclipse.tm.terminal.view.TerminalView",//$NON-NLS-1$
|
||||||
|
"SecondaryTerminal" + System.currentTimeMillis(), //$NON-NLS-1$
|
||||||
|
IWorkbenchPage.VIEW_ACTIVATE);
|
||||||
|
} catch (PartInitException ex) {
|
||||||
|
Logger.logException(ex);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public void onTerminalConnect() {
|
||||||
|
if (isConnected())
|
||||||
|
return;
|
||||||
|
if(fCtlTerminal.getTerminalConnection()==null)
|
||||||
|
setConnector(showSettingsDialog());
|
||||||
|
fCtlTerminal.connectTerminal();
|
||||||
|
}
|
||||||
|
|
||||||
|
public void updateStatus() {
|
||||||
|
updateTerminalConnect();
|
||||||
|
updateTerminalDisconnect();
|
||||||
|
updateTerminalSettings();
|
||||||
|
}
|
||||||
|
|
||||||
|
public void updateTerminalConnect() {
|
||||||
|
boolean bEnabled = ((!isConnecting()) && (!fCtlTerminal.isConnected()));
|
||||||
|
|
||||||
|
fActionTerminalConnect.setEnabled(bEnabled);
|
||||||
|
}
|
||||||
|
|
||||||
|
private boolean isConnecting() {
|
||||||
|
return fCtlTerminal.getState()==TerminalState.CONNECTING;
|
||||||
|
}
|
||||||
|
private boolean isConnected() {
|
||||||
|
return fCtlTerminal.getState()==TerminalState.CONNECTED;
|
||||||
|
}
|
||||||
|
public void onTerminalDisconnect() {
|
||||||
|
fCtlTerminal.disconnectTerminal();
|
||||||
|
}
|
||||||
|
|
||||||
|
public void updateTerminalDisconnect() {
|
||||||
|
boolean bEnabled = ((isConnecting()) || (fCtlTerminal.isConnected()));
|
||||||
|
fActionTerminalDisconnect.setEnabled(bEnabled);
|
||||||
|
}
|
||||||
|
|
||||||
|
public void onTerminalSettings() {
|
||||||
|
setConnector(showSettingsDialog());
|
||||||
|
|
||||||
|
onTerminalConnect();
|
||||||
|
}
|
||||||
|
|
||||||
|
private ITerminalConnector showSettingsDialog() {
|
||||||
|
// When the settings dialog is opened, load the Terminal settings from the
|
||||||
|
// persistent settings.
|
||||||
|
|
||||||
|
TerminalSettingsDlg dlgTerminalSettings = new TerminalSettingsDlg(getViewSite().getShell(),fCtlTerminal.getConnectors(),fCtlTerminal.getTerminalConnection());
|
||||||
|
|
||||||
|
Logger.log("opening Settings dialog."); //$NON-NLS-1$
|
||||||
|
|
||||||
|
if (dlgTerminalSettings.open() == Window.CANCEL) {
|
||||||
|
Logger.log("Settings dialog cancelled."); //$NON-NLS-1$
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
|
||||||
|
Logger.log("Settings dialog OK'ed."); //$NON-NLS-1$
|
||||||
|
|
||||||
|
// When the settings dialog is closed, we persist the Terminal settings.
|
||||||
|
|
||||||
|
saveSettings();
|
||||||
|
return dlgTerminalSettings.getConnector();
|
||||||
|
}
|
||||||
|
|
||||||
|
private void setConnector(ITerminalConnector connector) {
|
||||||
|
fCtlTerminal.setConnector(connector);
|
||||||
|
}
|
||||||
|
|
||||||
|
public void updateTerminalSettings() {
|
||||||
|
boolean bEnabled;
|
||||||
|
|
||||||
|
bEnabled = ((!isConnecting()) && (!fCtlTerminal
|
||||||
|
.isConnected()));
|
||||||
|
|
||||||
|
fActionTerminalSettings.setEnabled(bEnabled);
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setTerminalTitle(String strTitle) {
|
||||||
|
if (fCtlTerminal.isDisposed())
|
||||||
|
return;
|
||||||
|
|
||||||
|
if (strTitle != null) {
|
||||||
|
// When parameter 'data' is not null, it is a String containing text to
|
||||||
|
// display in the view's content description line. This is used by class
|
||||||
|
// TerminalText when it processes an ANSI OSC escape sequence that commands
|
||||||
|
// the terminal to display text in its title bar.
|
||||||
|
} else {
|
||||||
|
// When parameter 'data' is null, we construct a descriptive string to
|
||||||
|
// display in the content description line.
|
||||||
|
String strConnected = getStateDisplayName(fCtlTerminal.getState());
|
||||||
|
String status=""; //$NON-NLS-1$
|
||||||
|
status=fCtlTerminal.getStatusString(strConnected);
|
||||||
|
strTitle = ViewMessages.PROP_TITLE + status;
|
||||||
|
}
|
||||||
|
|
||||||
|
setContentDescription(strTitle);
|
||||||
|
getViewSite().getActionBars().getStatusLineManager().setMessage(
|
||||||
|
strTitle);
|
||||||
|
}
|
||||||
|
public void onTerminalStatus() {
|
||||||
|
setTerminalTitle(null);
|
||||||
|
}
|
||||||
|
|
||||||
|
private String getStateDisplayName(TerminalState state) {
|
||||||
|
if(state==TerminalState.CONNECTED) {
|
||||||
|
return ViewMessages.STATE_CONNECTED;
|
||||||
|
} else if(state==TerminalState.CONNECTING) {
|
||||||
|
return ViewMessages.STATE_CONNECTING;
|
||||||
|
} else if(state==TerminalState.OPENED) {
|
||||||
|
return ViewMessages.STATE_OPENED;
|
||||||
|
} else if(state==TerminalState.CLOSED) {
|
||||||
|
return ViewMessages.STATE_CLOSED;
|
||||||
|
} else {
|
||||||
|
throw new IllegalStateException(state.toString());
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public void onTerminalFontChanged() {
|
||||||
|
fCtlTerminal.getCtlText().setFont(JFaceResources.getFont(FONT_DEFINITION));
|
||||||
|
|
||||||
|
// Tell the TerminalControl singleton that the font has changed.
|
||||||
|
|
||||||
|
fCtlTerminal.onFontChanged();
|
||||||
|
}
|
||||||
|
|
||||||
|
public void onEditCopy() {
|
||||||
|
String selection=fCtlTerminal.getSelection();
|
||||||
|
|
||||||
|
if (!selection.equals("")) {//$NON-NLS-1$
|
||||||
|
fCtlTerminal.copy();
|
||||||
|
} else {
|
||||||
|
fCtlTerminal.sendKey('\u0003');
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public void updateEditCopy() {
|
||||||
|
boolean bEnabled=true;
|
||||||
|
|
||||||
|
if (fMenuAboutToShow) {
|
||||||
|
bEnabled = fCtlTerminal.getSelection().length()>0;
|
||||||
|
}
|
||||||
|
|
||||||
|
fActionEditCopy.setEnabled(bEnabled);
|
||||||
|
}
|
||||||
|
|
||||||
|
public void onEditCut() {
|
||||||
|
fCtlTerminal.sendKey('\u0018');
|
||||||
|
}
|
||||||
|
|
||||||
|
public void updateEditCut() {
|
||||||
|
boolean bEnabled;
|
||||||
|
|
||||||
|
bEnabled = !fMenuAboutToShow;
|
||||||
|
fActionEditCut.setEnabled(bEnabled);
|
||||||
|
}
|
||||||
|
|
||||||
|
public void onEditPaste() {
|
||||||
|
fCtlTerminal.paste();
|
||||||
|
}
|
||||||
|
|
||||||
|
public void updateEditPaste() {
|
||||||
|
String strText = (String) fCtlTerminal.getClipboard().getContents(TextTransfer.getInstance());
|
||||||
|
|
||||||
|
boolean bEnabled = ((strText != null) && (!strText.equals("")) && (isConnected()));//$NON-NLS-1$
|
||||||
|
|
||||||
|
fActionEditPaste.setEnabled(bEnabled);
|
||||||
|
}
|
||||||
|
|
||||||
|
public void onEditClearAll() {
|
||||||
|
fCtlTerminal.clearTerminal();
|
||||||
|
}
|
||||||
|
|
||||||
|
public void updateEditClearAll() {
|
||||||
|
fActionEditClearAll.setEnabled(!fCtlTerminal.isEmpty());
|
||||||
|
}
|
||||||
|
|
||||||
|
public void onEditSelectAll() {
|
||||||
|
fCtlTerminal.selectAll();
|
||||||
|
}
|
||||||
|
|
||||||
|
public void updateEditSelectAll() {
|
||||||
|
fActionEditSelectAll.setEnabled(!fCtlTerminal.isEmpty());
|
||||||
|
}
|
||||||
|
|
||||||
|
// ViewPart interface
|
||||||
|
|
||||||
|
public void createPartControl(Composite wndParent) {
|
||||||
|
// Bind plugin.xml key bindings to this plugin. Overrides global Control-W key
|
||||||
|
// sequence.
|
||||||
|
|
||||||
|
/** Activate the sy context allowing shortcuts like F3(open declaration) in the view */
|
||||||
|
IContextService ctxtService = (IContextService) getSite().getService(IContextService.class);
|
||||||
|
fRememberedContextActivation = ctxtService.activateContext("org.eclipse.tm.terminal.TerminalPreferencePage"); //$NON-NLS-1$
|
||||||
|
|
||||||
|
synchronized (fSecondaryTerminalCountMutex) {
|
||||||
|
setPartName(ViewMessages.PROP_TITLE + " " + fSecondaryTerminalCount++); //$NON-NLS-1$
|
||||||
|
}
|
||||||
|
|
||||||
|
setupControls(wndParent);
|
||||||
|
setupActions();
|
||||||
|
setupMenus();
|
||||||
|
setupLocalToolBars();
|
||||||
|
setupContextMenus();
|
||||||
|
setupListeners(wndParent);
|
||||||
|
|
||||||
|
onTerminalStatus();
|
||||||
|
}
|
||||||
|
|
||||||
|
public void dispose() {
|
||||||
|
Logger.log("entered."); //$NON-NLS-1$
|
||||||
|
|
||||||
|
setPartName("Terminal"); //$NON-NLS-1$
|
||||||
|
|
||||||
|
TerminalViewPlugin plugin;
|
||||||
|
IWorkbench workbench;
|
||||||
|
WorkbenchWindow workbenchWindow;
|
||||||
|
MenuManager menuMgr;
|
||||||
|
Menu menu;
|
||||||
|
|
||||||
|
/** The context (for short cuts) was set above, now unset it again */
|
||||||
|
if (fRememberedContextActivation != null) {
|
||||||
|
IContextService ctxService = (IContextService) getSite()
|
||||||
|
.getService(IContextService.class);
|
||||||
|
ctxService.deactivateContext(fRememberedContextActivation);
|
||||||
|
fRememberedContextActivation = null;
|
||||||
|
}
|
||||||
|
|
||||||
|
JFaceResources.getFontRegistry().removeListener(fPropertyChangeHandler);
|
||||||
|
plugin = TerminalViewPlugin.getDefault();
|
||||||
|
workbench = plugin.getWorkbench();
|
||||||
|
workbenchWindow = (WorkbenchWindow) workbench
|
||||||
|
.getActiveWorkbenchWindow();
|
||||||
|
menuMgr = workbenchWindow.getMenuManager();
|
||||||
|
menuMgr = (MenuManager) menuMgr
|
||||||
|
.findMenuUsingPath(IWorkbenchActionConstants.M_EDIT);
|
||||||
|
menu = menuMgr.getMenu();
|
||||||
|
|
||||||
|
menuMgr.removeMenuListener(fMenuHandlerEdit);
|
||||||
|
|
||||||
|
if (menu != null)
|
||||||
|
menu.removeMenuListener(fMenuHandlerEdit);
|
||||||
|
|
||||||
|
fCtlTerminal.disposeTerminal();
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Passing the focus request to the viewer's control.
|
||||||
|
*/
|
||||||
|
public void setFocus() {
|
||||||
|
fCtlTerminal.setFocus();
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* This method creates the top-level control for the Terminal view.
|
||||||
|
*/
|
||||||
|
protected void setupControls(Composite wndParent) {
|
||||||
|
ITerminalConnector[] connectors=TerminalConnectorExtension.getTerminalConnectors();
|
||||||
|
fCtlTerminal = TerminalViewControlFactory.makeControl(this, wndParent, connectors);
|
||||||
|
String connectionType=getStore().get("ConnectionType"); //$NON-NLS-1$
|
||||||
|
for (int i = 0; i < connectors.length; i++) {
|
||||||
|
connectors[i].load(getStore(connectors[i]));
|
||||||
|
if(connectors[i].getId().equals(connectionType))
|
||||||
|
fCtlTerminal.setConnector(connectors[i]);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
private void saveSettings() {
|
||||||
|
ITerminalConnector[] connectors=fCtlTerminal.getConnectors();
|
||||||
|
for (int i = 0; i < connectors.length; i++) {
|
||||||
|
connectors[i].save(getStore(connectors[i]));
|
||||||
|
}
|
||||||
|
if(fCtlTerminal.getTerminalConnection()!=null) {
|
||||||
|
getStore().put("ConnectionType",fCtlTerminal.getTerminalConnection().getId()); //$NON-NLS-1$
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private ISettingsStore getStore() {
|
||||||
|
if(fStore==null)
|
||||||
|
fStore=new SettingsStore(getPartName());
|
||||||
|
return fStore;
|
||||||
|
}
|
||||||
|
|
||||||
|
private ISettingsStore getStore(ITerminalConnector connector) {
|
||||||
|
return new SettingStorePrefixDecorator(getStore(),connector.getClass().getName()+"."); //$NON-NLS-1$
|
||||||
|
}
|
||||||
|
|
||||||
|
protected void setupActions() {
|
||||||
|
fActionTerminalNewTerminal = new TerminalActionNewTerminal(this);
|
||||||
|
fActionTerminalConnect = new TerminalActionConnect(this);
|
||||||
|
fActionTerminalDisconnect = new TerminalActionDisconnect(this);
|
||||||
|
fActionTerminalSettings = new TerminalActionSettings(this);
|
||||||
|
fActionEditCopy = new TerminalActionCopy(this);
|
||||||
|
fActionEditCut = new TerminalActionCut(this);
|
||||||
|
fActionEditPaste = new TerminalActionPaste(this);
|
||||||
|
fActionEditClearAll = new TerminalActionClearAll(this);
|
||||||
|
fActionEditSelectAll = new TerminalActionSelectAll(this);
|
||||||
|
|
||||||
|
IActionBars actionBars = getViewSite().getActionBars();
|
||||||
|
actionBars.setGlobalActionHandler(ActionFactory.COPY.getId(), fActionEditCopy);
|
||||||
|
|
||||||
|
actionBars.setGlobalActionHandler(ActionFactory.CUT.getId(), fActionEditCut);
|
||||||
|
|
||||||
|
actionBars.setGlobalActionHandler(ActionFactory.PASTE.getId(), fActionEditPaste);
|
||||||
|
|
||||||
|
actionBars.setGlobalActionHandler(ActionFactory.SELECT_ALL.getId(), fActionEditSelectAll);
|
||||||
|
}
|
||||||
|
|
||||||
|
protected void setupMenus() {
|
||||||
|
TerminalViewPlugin plugin;
|
||||||
|
IWorkbench workbench;
|
||||||
|
WorkbenchWindow workbenchWindow;
|
||||||
|
MenuManager menuMgr;
|
||||||
|
Menu menu;
|
||||||
|
|
||||||
|
fMenuHandlerEdit = new TerminalMenuHandlerEdit();
|
||||||
|
plugin = TerminalViewPlugin.getDefault();
|
||||||
|
workbench = plugin.getWorkbench();
|
||||||
|
workbenchWindow = (WorkbenchWindow) workbench
|
||||||
|
.getActiveWorkbenchWindow();
|
||||||
|
menuMgr = workbenchWindow.getMenuManager();
|
||||||
|
menuMgr = (MenuManager) menuMgr
|
||||||
|
.findMenuUsingPath(IWorkbenchActionConstants.M_EDIT);
|
||||||
|
menu = menuMgr.getMenu();
|
||||||
|
|
||||||
|
menuMgr.addMenuListener(fMenuHandlerEdit);
|
||||||
|
menu.addMenuListener(fMenuHandlerEdit);
|
||||||
|
}
|
||||||
|
|
||||||
|
protected void setupLocalToolBars() {
|
||||||
|
IToolBarManager toolBarMgr = getViewSite().getActionBars().getToolBarManager();
|
||||||
|
|
||||||
|
toolBarMgr.add(fActionTerminalNewTerminal);
|
||||||
|
toolBarMgr.add(fActionTerminalConnect);
|
||||||
|
toolBarMgr.add(fActionTerminalDisconnect);
|
||||||
|
toolBarMgr.add(fActionTerminalSettings);
|
||||||
|
}
|
||||||
|
|
||||||
|
protected void setupContextMenus() {
|
||||||
|
StyledText ctlText;
|
||||||
|
MenuManager menuMgr;
|
||||||
|
Menu menu;
|
||||||
|
TerminalContextMenuHandler contextMenuHandler;
|
||||||
|
|
||||||
|
ctlText = fCtlTerminal.getCtlText();
|
||||||
|
menuMgr = new MenuManager("#PopupMenu"); //$NON-NLS-1$
|
||||||
|
menu = menuMgr.createContextMenu(ctlText);
|
||||||
|
contextMenuHandler = new TerminalContextMenuHandler();
|
||||||
|
|
||||||
|
ctlText.setMenu(menu);
|
||||||
|
menuMgr.setRemoveAllWhenShown(true);
|
||||||
|
menuMgr.addMenuListener(contextMenuHandler);
|
||||||
|
menu.addMenuListener(contextMenuHandler);
|
||||||
|
}
|
||||||
|
|
||||||
|
protected void loadContextMenus(IMenuManager menuMgr) {
|
||||||
|
menuMgr.add(fActionEditCopy);
|
||||||
|
menuMgr.add(fActionEditPaste);
|
||||||
|
menuMgr.add(new Separator());
|
||||||
|
menuMgr.add(fActionEditClearAll);
|
||||||
|
menuMgr.add(fActionEditSelectAll);
|
||||||
|
|
||||||
|
// Other plug-ins can contribute there actions here
|
||||||
|
menuMgr.add(new Separator("Additions")); //$NON-NLS-1$
|
||||||
|
}
|
||||||
|
|
||||||
|
protected void setupListeners(Composite wndParent) {
|
||||||
|
fPropertyChangeHandler = new TerminalPropertyChangeHandler();
|
||||||
|
JFaceResources.getFontRegistry().addListener(fPropertyChangeHandler);
|
||||||
|
}
|
||||||
|
|
||||||
|
// Inner classes
|
||||||
|
|
||||||
|
protected class TerminalMenuHandlerEdit implements MenuListener, IMenuListener {
|
||||||
|
protected String fActionDefinitionIdCopy;
|
||||||
|
|
||||||
|
protected String fActionDefinitionIdPaste;
|
||||||
|
|
||||||
|
protected String fActionDefinitionIdSelectAll;
|
||||||
|
|
||||||
|
protected int fAcceleratorCopy;
|
||||||
|
|
||||||
|
protected int fAcceleratorPaste;
|
||||||
|
|
||||||
|
protected int fAcceleratorSelectAll;
|
||||||
|
|
||||||
|
protected TerminalMenuHandlerEdit() {
|
||||||
|
super();
|
||||||
|
|
||||||
|
fActionDefinitionIdCopy = ""; //$NON-NLS-1$
|
||||||
|
fActionDefinitionIdPaste = ""; //$NON-NLS-1$
|
||||||
|
fActionDefinitionIdSelectAll = ""; //$NON-NLS-1$
|
||||||
|
|
||||||
|
fAcceleratorCopy = 0;
|
||||||
|
fAcceleratorPaste = 0;
|
||||||
|
fAcceleratorSelectAll = 0;
|
||||||
|
}
|
||||||
|
public void menuAboutToShow(IMenuManager menuMgr) {
|
||||||
|
|
||||||
|
fMenuAboutToShow = true;
|
||||||
|
updateEditCopy();
|
||||||
|
updateEditCut();
|
||||||
|
updateEditPaste();
|
||||||
|
updateEditSelectAll();
|
||||||
|
|
||||||
|
ActionContributionItem item = (ActionContributionItem) menuMgr.find(ActionFactory.COPY.getId());
|
||||||
|
RetargetAction action = (RetargetAction) item.getAction();
|
||||||
|
fActionDefinitionIdCopy = action.getActionDefinitionId();
|
||||||
|
fAcceleratorCopy = action.getAccelerator();
|
||||||
|
action.setActionDefinitionId(null);
|
||||||
|
action.enableAccelerator(false);
|
||||||
|
item.update();
|
||||||
|
|
||||||
|
item = (ActionContributionItem) menuMgr.find(ActionFactory.PASTE.getId());
|
||||||
|
action = (RetargetAction) item.getAction();
|
||||||
|
fActionDefinitionIdPaste = action.getActionDefinitionId();
|
||||||
|
fAcceleratorPaste = action.getAccelerator();
|
||||||
|
action.setActionDefinitionId(null);
|
||||||
|
action.enableAccelerator(false);
|
||||||
|
item.update();
|
||||||
|
|
||||||
|
item = (ActionContributionItem) menuMgr.find(ActionFactory.SELECT_ALL.getId());
|
||||||
|
action = (RetargetAction) item.getAction();
|
||||||
|
fActionDefinitionIdSelectAll = action.getActionDefinitionId();
|
||||||
|
fAcceleratorSelectAll = action.getAccelerator();
|
||||||
|
action.setActionDefinitionId(null);
|
||||||
|
action.enableAccelerator(false);
|
||||||
|
item.update();
|
||||||
|
}
|
||||||
|
public void menuShown(MenuEvent event) {
|
||||||
|
// do nothing
|
||||||
|
}
|
||||||
|
public void menuHidden(MenuEvent event) {
|
||||||
|
TerminalViewPlugin plugin;
|
||||||
|
IWorkbench workbench;
|
||||||
|
WorkbenchWindow workbenchWindow;
|
||||||
|
MenuManager menuMgr;
|
||||||
|
ActionContributionItem item;
|
||||||
|
RetargetAction action;
|
||||||
|
|
||||||
|
fMenuAboutToShow = false;
|
||||||
|
updateEditCopy();
|
||||||
|
updateEditCut();
|
||||||
|
|
||||||
|
plugin = TerminalViewPlugin.getDefault();
|
||||||
|
workbench = plugin.getWorkbench();
|
||||||
|
workbenchWindow = (WorkbenchWindow) workbench
|
||||||
|
.getActiveWorkbenchWindow();
|
||||||
|
menuMgr = workbenchWindow.getMenuManager();
|
||||||
|
menuMgr = (MenuManager) menuMgr
|
||||||
|
.findMenuUsingPath(IWorkbenchActionConstants.M_EDIT);
|
||||||
|
|
||||||
|
item = (ActionContributionItem) menuMgr.find(ActionFactory.COPY
|
||||||
|
.getId());
|
||||||
|
action = (RetargetAction) item.getAction();
|
||||||
|
action.setActionDefinitionId(fActionDefinitionIdCopy);
|
||||||
|
action.setAccelerator(fAcceleratorCopy);
|
||||||
|
action.enableAccelerator(true);
|
||||||
|
item.update();
|
||||||
|
|
||||||
|
item = (ActionContributionItem) menuMgr.find(ActionFactory.PASTE
|
||||||
|
.getId());
|
||||||
|
action = (RetargetAction) item.getAction();
|
||||||
|
action.setActionDefinitionId(fActionDefinitionIdPaste);
|
||||||
|
action.setAccelerator(fAcceleratorPaste);
|
||||||
|
action.enableAccelerator(true);
|
||||||
|
item.update();
|
||||||
|
|
||||||
|
item = (ActionContributionItem) menuMgr
|
||||||
|
.find(ActionFactory.SELECT_ALL.getId());
|
||||||
|
action = (RetargetAction) item.getAction();
|
||||||
|
action.setActionDefinitionId(fActionDefinitionIdSelectAll);
|
||||||
|
action.setAccelerator(fAcceleratorSelectAll);
|
||||||
|
action.enableAccelerator(true);
|
||||||
|
item.update();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
protected class TerminalContextMenuHandler implements MenuListener, IMenuListener {
|
||||||
|
public void menuHidden(MenuEvent event) {
|
||||||
|
fMenuAboutToShow = false;
|
||||||
|
updateEditCopy();
|
||||||
|
}
|
||||||
|
|
||||||
|
public void menuShown(MenuEvent e) {
|
||||||
|
//
|
||||||
|
}
|
||||||
|
public void menuAboutToShow(IMenuManager menuMgr) {
|
||||||
|
fMenuAboutToShow = true;
|
||||||
|
updateEditCopy();
|
||||||
|
updateEditCut();
|
||||||
|
updateEditPaste();
|
||||||
|
updateEditClearAll();
|
||||||
|
|
||||||
|
loadContextMenus(menuMgr);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
protected class TerminalPropertyChangeHandler implements IPropertyChangeListener {
|
||||||
|
public void propertyChange(PropertyChangeEvent event) {
|
||||||
|
if (event.getProperty().equals(FONT_DEFINITION)) {
|
||||||
|
onTerminalFontChanged();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
|
@ -0,0 +1,140 @@
|
||||||
|
/*******************************************************************************
|
||||||
|
* Copyright (c) 2006 Wind River Systems, Inc. and others.
|
||||||
|
* All rights reserved. This program and the accompanying materials
|
||||||
|
* are made available under the terms of the Eclipse Public License v1.0
|
||||||
|
* which accompanies this distribution, and is available at
|
||||||
|
* http://www.eclipse.org/legal/epl-v10.html
|
||||||
|
*
|
||||||
|
* Contributors:
|
||||||
|
* Wind River Systems, Inc. - initial implementation
|
||||||
|
*
|
||||||
|
*******************************************************************************/
|
||||||
|
|
||||||
|
package org.eclipse.tm.terminal.internal.view;
|
||||||
|
|
||||||
|
import java.net.MalformedURLException;
|
||||||
|
import java.net.URL;
|
||||||
|
import java.util.HashMap;
|
||||||
|
import java.util.Iterator;
|
||||||
|
|
||||||
|
import org.eclipse.core.runtime.Platform;
|
||||||
|
import org.eclipse.jface.preference.IPreferenceStore;
|
||||||
|
import org.eclipse.jface.resource.ImageDescriptor;
|
||||||
|
import org.eclipse.jface.resource.ImageRegistry;
|
||||||
|
import org.eclipse.tm.terminal.Logger;
|
||||||
|
import org.eclipse.ui.plugin.AbstractUIPlugin;
|
||||||
|
|
||||||
|
public class TerminalViewPlugin extends AbstractUIPlugin {
|
||||||
|
protected static TerminalViewPlugin fDefault;
|
||||||
|
public static final String PLUGIN_HOME = "org.eclipse.tm.terminal"; //$NON-NLS-1$
|
||||||
|
public static final String HELP_VIEW = PLUGIN_HOME + ".terminal_view"; //$NON-NLS-1$
|
||||||
|
|
||||||
|
/**
|
||||||
|
* The constructor.
|
||||||
|
*/
|
||||||
|
public TerminalViewPlugin() {
|
||||||
|
fDefault = this;
|
||||||
|
}
|
||||||
|
protected void initializeImageRegistry(ImageRegistry imageRegistry) {
|
||||||
|
HashMap map;
|
||||||
|
|
||||||
|
map = new HashMap();
|
||||||
|
|
||||||
|
try {
|
||||||
|
// Local toolbars
|
||||||
|
map.put(ImageConsts.IMAGE_NEW_TERMINAL, "newterminal.gif"); //$NON-NLS-1$
|
||||||
|
map.put(ImageConsts.IMAGE_CLCL_CONNECT, "connect_co.gif"); //$NON-NLS-1$
|
||||||
|
map.put(ImageConsts.IMAGE_CLCL_DISCONNECT, "disconnect_co.gif"); //$NON-NLS-1$
|
||||||
|
map.put(ImageConsts.IMAGE_CLCL_SETTINGS, "properties_tsk.gif"); //$NON-NLS-1$
|
||||||
|
|
||||||
|
loadImageRegistry(imageRegistry, ImageConsts.IMAGE_DIR_LOCALTOOL, map);
|
||||||
|
|
||||||
|
map.clear();
|
||||||
|
|
||||||
|
// Enabled local toolbars
|
||||||
|
map.put(ImageConsts.IMAGE_NEW_TERMINAL, "newterminal.gif"); //$NON-NLS-1$
|
||||||
|
map.put(ImageConsts.IMAGE_ELCL_CONNECT, "connect_co.gif"); //$NON-NLS-1$
|
||||||
|
map.put(ImageConsts.IMAGE_ELCL_DISCONNECT, "disconnect_co.gif"); //$NON-NLS-1$
|
||||||
|
map.put(ImageConsts.IMAGE_ELCL_SETTINGS, "properties_tsk.gif"); //$NON-NLS-1$
|
||||||
|
|
||||||
|
loadImageRegistry(imageRegistry, ImageConsts.IMAGE_DIR_ELCL, map);
|
||||||
|
|
||||||
|
map.clear();
|
||||||
|
|
||||||
|
// Disabled local toolbars
|
||||||
|
map.put(ImageConsts.IMAGE_NEW_TERMINAL, "newterminal.gif"); //$NON-NLS-1$
|
||||||
|
map.put(ImageConsts.IMAGE_DLCL_CONNECT, "connect_co.gif"); //$NON-NLS-1$
|
||||||
|
map.put(ImageConsts.IMAGE_DLCL_DISCONNECT, "disconnect_co.gif"); //$NON-NLS-1$
|
||||||
|
map.put(ImageConsts.IMAGE_DLCL_SETTINGS, "properties_tsk.gif"); //$NON-NLS-1$
|
||||||
|
|
||||||
|
loadImageRegistry(imageRegistry, ImageConsts.IMAGE_DIR_DLCL, map);
|
||||||
|
|
||||||
|
map.clear();
|
||||||
|
} catch (MalformedURLException malformedURLException) {
|
||||||
|
malformedURLException.printStackTrace();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
protected void initializeDefaultPreferences(IPreferenceStore store) {
|
||||||
|
store.setDefault(TerminalPreferencePage.PREF_LIMITOUTPUT,
|
||||||
|
TerminalPreferencePage.DEFAULT_LIMITOUTPUT);
|
||||||
|
store.setDefault(TerminalPreferencePage.PREF_BUFFERLINES,
|
||||||
|
TerminalPreferencePage.DEFAULT_BUFFERLINES);
|
||||||
|
store.setDefault(TerminalPreferencePage.PREF_TIMEOUT_SERIAL,
|
||||||
|
TerminalPreferencePage.DEFAULT_TIMEOUT_SERIAL);
|
||||||
|
store.setDefault(TerminalPreferencePage.PREF_TIMEOUT_NETWORK,
|
||||||
|
TerminalPreferencePage.DEFAULT_TIMEOUT_NETWORK);
|
||||||
|
}
|
||||||
|
/**
|
||||||
|
* Returns the shared instance.
|
||||||
|
*/
|
||||||
|
public static TerminalViewPlugin getDefault() {
|
||||||
|
return fDefault;
|
||||||
|
}
|
||||||
|
|
||||||
|
public static boolean isLogInfoEnabled() {
|
||||||
|
return isOptionEnabled(Logger.TRACE_DEBUG_LOG_INFO);
|
||||||
|
}
|
||||||
|
public static boolean isLogErrorEnabled() {
|
||||||
|
return isOptionEnabled(Logger.TRACE_DEBUG_LOG_ERROR);
|
||||||
|
}
|
||||||
|
public static boolean isLogEnabled() {
|
||||||
|
return isOptionEnabled(Logger.TRACE_DEBUG_LOG);
|
||||||
|
}
|
||||||
|
|
||||||
|
public static boolean isOptionEnabled(String strOption) {
|
||||||
|
String strEnabled;
|
||||||
|
Boolean boolEnabled;
|
||||||
|
boolean bEnabled;
|
||||||
|
|
||||||
|
strEnabled = Platform.getDebugOption(strOption);
|
||||||
|
if (strEnabled == null)
|
||||||
|
return false;
|
||||||
|
|
||||||
|
boolEnabled = new Boolean(strEnabled);
|
||||||
|
bEnabled = boolEnabled.booleanValue();
|
||||||
|
|
||||||
|
return bEnabled;
|
||||||
|
}
|
||||||
|
protected void loadImageRegistry(ImageRegistry imageRegistry,
|
||||||
|
String strDir, HashMap map) throws MalformedURLException {
|
||||||
|
URL url;
|
||||||
|
ImageDescriptor imageDescriptor;
|
||||||
|
Iterator keys;
|
||||||
|
String strKey;
|
||||||
|
String strFile;
|
||||||
|
|
||||||
|
keys = map.keySet().iterator();
|
||||||
|
|
||||||
|
while (keys.hasNext()) {
|
||||||
|
strKey = (String) keys.next();
|
||||||
|
strFile = (String) map.get(strKey);
|
||||||
|
|
||||||
|
if (strFile != null) {
|
||||||
|
url = TerminalViewPlugin.getDefault().getBundle().getEntry(
|
||||||
|
ImageConsts.IMAGE_DIR_ROOT + strDir + strFile);
|
||||||
|
imageDescriptor = ImageDescriptor.createFromURL(url);
|
||||||
|
imageRegistry.put(strKey, imageDescriptor);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
|
@ -0,0 +1,35 @@
|
||||||
|
/*******************************************************************************
|
||||||
|
* Copyright (c) 2006 Wind River Systems, Inc. and others.
|
||||||
|
* All rights reserved. This program and the accompanying materials
|
||||||
|
* are made available under the terms of the Eclipse Public License v1.0
|
||||||
|
* which accompanies this distribution, and is available at
|
||||||
|
* http://www.eclipse.org/legal/epl-v10.html
|
||||||
|
*
|
||||||
|
* Contributors:
|
||||||
|
* Wind River Systems, Inc. - initial implementation
|
||||||
|
*
|
||||||
|
*******************************************************************************/
|
||||||
|
package org.eclipse.tm.terminal.internal.view;
|
||||||
|
|
||||||
|
import org.eclipse.osgi.util.NLS;
|
||||||
|
public class ViewMessages extends NLS {
|
||||||
|
static {
|
||||||
|
NLS.initializeMessages(ViewMessages.class.getName(), ViewMessages.class);
|
||||||
|
}
|
||||||
|
public static String PROP_TITLE;
|
||||||
|
public static String SETTINGS;
|
||||||
|
|
||||||
|
public static String TERMINALSETTINGS;
|
||||||
|
public static String CONNECTIONTYPE;
|
||||||
|
|
||||||
|
public static String LIMITOUTPUT;
|
||||||
|
public static String BUFFERLINES;
|
||||||
|
public static String SERIALTIMEOUT;
|
||||||
|
public static String NETWORKTIMEOUT;
|
||||||
|
|
||||||
|
public static String STATE_CONNECTED;
|
||||||
|
public static String STATE_CONNECTING;
|
||||||
|
public static String STATE_OPENED;
|
||||||
|
public static String STATE_CLOSED;
|
||||||
|
|
||||||
|
}
|
|
@ -0,0 +1,27 @@
|
||||||
|
###############################################################################
|
||||||
|
# Copyright (c) 2006 Wind River Systems, Inc. and others.
|
||||||
|
# All rights reserved. This program and the accompanying materials
|
||||||
|
# are made available under the terms of the Eclipse Public License v1.0
|
||||||
|
# which accompanies this distribution, and is available at
|
||||||
|
# http://www.eclipse.org/legal/epl-v10.html
|
||||||
|
#
|
||||||
|
# Contributors:
|
||||||
|
# Wind River Systems, Inc. - initial implementation
|
||||||
|
#
|
||||||
|
###############################################################################
|
||||||
|
PROP_TITLE = Terminal
|
||||||
|
SETTINGS = Settings
|
||||||
|
|
||||||
|
|
||||||
|
TERMINALSETTINGS = Terminal Settings
|
||||||
|
CONNECTIONTYPE = Connection Type
|
||||||
|
|
||||||
|
LIMITOUTPUT = Limit terminal output
|
||||||
|
BUFFERLINES = Terminal buffer lines:
|
||||||
|
SERIALTIMEOUT = Serial timeout (seconds):
|
||||||
|
NETWORKTIMEOUT = Network timeout (seconds):
|
||||||
|
|
||||||
|
STATE_CONNECTED = CONNECTED
|
||||||
|
STATE_CONNECTING = CONNECTING...
|
||||||
|
STATE_OPENED = OPENED
|
||||||
|
STATE_CLOSED = CLOSED
|
|
@ -0,0 +1,61 @@
|
||||||
|
/*******************************************************************************
|
||||||
|
* Copyright (c) 2006 Wind River Systems, Inc. and others.
|
||||||
|
* All rights reserved. This program and the accompanying materials
|
||||||
|
* are made available under the terms of the Eclipse Public License v1.0
|
||||||
|
* which accompanies this distribution, and is available at
|
||||||
|
* http://www.eclipse.org/legal/epl-v10.html
|
||||||
|
*
|
||||||
|
* Contributors:
|
||||||
|
* Wind River Systems, Inc. - initial implementation
|
||||||
|
*
|
||||||
|
*******************************************************************************/
|
||||||
|
package org.eclipse.tm.terminal.view;
|
||||||
|
|
||||||
|
import org.eclipse.ui.plugin.AbstractUIPlugin;
|
||||||
|
import org.osgi.framework.BundleContext;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* The activator class controls the plug-in life cycle
|
||||||
|
*/
|
||||||
|
public class Activator extends AbstractUIPlugin {
|
||||||
|
|
||||||
|
// The plug-in ID
|
||||||
|
public static final String PLUGIN_ID = "org.eclipse.tm.terminal.internal.view";
|
||||||
|
|
||||||
|
// The shared instance
|
||||||
|
private static Activator plugin;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* The constructor
|
||||||
|
*/
|
||||||
|
public Activator() {
|
||||||
|
plugin = this;
|
||||||
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
* (non-Javadoc)
|
||||||
|
* @see org.eclipse.ui.plugin.AbstractUIPlugin#start(org.osgi.framework.BundleContext)
|
||||||
|
*/
|
||||||
|
public void start(BundleContext context) throws Exception {
|
||||||
|
super.start(context);
|
||||||
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
* (non-Javadoc)
|
||||||
|
* @see org.eclipse.ui.plugin.AbstractUIPlugin#stop(org.osgi.framework.BundleContext)
|
||||||
|
*/
|
||||||
|
public void stop(BundleContext context) throws Exception {
|
||||||
|
plugin = null;
|
||||||
|
super.stop(context);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Returns the shared instance
|
||||||
|
*
|
||||||
|
* @return the shared instance
|
||||||
|
*/
|
||||||
|
public static Activator getDefault() {
|
||||||
|
return plugin;
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
|
@ -1,7 +1,7 @@
|
||||||
<?xml version="1.0" encoding="UTF-8"?>
|
<?xml version="1.0" encoding="UTF-8"?>
|
||||||
<classpath>
|
<classpath>
|
||||||
<classpathentry kind="src" path="src/"/>
|
<classpathentry kind="src" path="src/"/>
|
||||||
<classpathentry kind="con" path="org.eclipse.pde.core.requiredPlugins"/>
|
|
||||||
<classpathentry kind="con" path="org.eclipse.jdt.launching.JRE_CONTAINER/org.eclipse.jdt.internal.debug.ui.launcher.StandardVMType/J2SE-1.4"/>
|
<classpathentry kind="con" path="org.eclipse.jdt.launching.JRE_CONTAINER/org.eclipse.jdt.internal.debug.ui.launcher.StandardVMType/J2SE-1.4"/>
|
||||||
|
<classpathentry kind="con" path="org.eclipse.pde.core.requiredPlugins"/>
|
||||||
<classpathentry kind="output" path="bin"/>
|
<classpathentry kind="output" path="bin"/>
|
||||||
</classpath>
|
</classpath>
|
||||||
|
|
|
@ -20,9 +20,15 @@
|
||||||
<arguments>
|
<arguments>
|
||||||
</arguments>
|
</arguments>
|
||||||
</buildCommand>
|
</buildCommand>
|
||||||
|
<buildCommand>
|
||||||
|
<name>net.sourceforge.metrics.builder</name>
|
||||||
|
<arguments>
|
||||||
|
</arguments>
|
||||||
|
</buildCommand>
|
||||||
</buildSpec>
|
</buildSpec>
|
||||||
<natures>
|
<natures>
|
||||||
<nature>org.eclipse.pde.PluginNature</nature>
|
<nature>org.eclipse.pde.PluginNature</nature>
|
||||||
<nature>org.eclipse.jdt.core.javanature</nature>
|
<nature>org.eclipse.jdt.core.javanature</nature>
|
||||||
|
<nature>net.sourceforge.metrics.nature</nature>
|
||||||
</natures>
|
</natures>
|
||||||
</projectDescription>
|
</projectDescription>
|
||||||
|
|
|
@ -1,8 +1,58 @@
|
||||||
#Mon Jul 31 14:55:18 CEST 2006
|
#Thu Nov 30 18:38:38 CET 2006
|
||||||
eclipse.preferences.version=1
|
eclipse.preferences.version=1
|
||||||
org.eclipse.jdt.core.compiler.codegen.inlineJsrBytecode=disabled
|
org.eclipse.jdt.core.compiler.codegen.inlineJsrBytecode=disabled
|
||||||
org.eclipse.jdt.core.compiler.codegen.targetPlatform=1.4
|
org.eclipse.jdt.core.compiler.codegen.targetPlatform=1.4
|
||||||
org.eclipse.jdt.core.compiler.compliance=1.4
|
org.eclipse.jdt.core.compiler.compliance=1.4
|
||||||
|
org.eclipse.jdt.core.compiler.problem.annotationSuperInterface=warning
|
||||||
org.eclipse.jdt.core.compiler.problem.assertIdentifier=error
|
org.eclipse.jdt.core.compiler.problem.assertIdentifier=error
|
||||||
|
org.eclipse.jdt.core.compiler.problem.autoboxing=ignore
|
||||||
|
org.eclipse.jdt.core.compiler.problem.deprecation=warning
|
||||||
|
org.eclipse.jdt.core.compiler.problem.deprecationInDeprecatedCode=disabled
|
||||||
|
org.eclipse.jdt.core.compiler.problem.deprecationWhenOverridingDeprecatedMethod=disabled
|
||||||
|
org.eclipse.jdt.core.compiler.problem.discouragedReference=warning
|
||||||
|
org.eclipse.jdt.core.compiler.problem.emptyStatement=ignore
|
||||||
org.eclipse.jdt.core.compiler.problem.enumIdentifier=warning
|
org.eclipse.jdt.core.compiler.problem.enumIdentifier=warning
|
||||||
|
org.eclipse.jdt.core.compiler.problem.fallthroughCase=ignore
|
||||||
|
org.eclipse.jdt.core.compiler.problem.fieldHiding=ignore
|
||||||
|
org.eclipse.jdt.core.compiler.problem.finalParameterBound=warning
|
||||||
|
org.eclipse.jdt.core.compiler.problem.finallyBlockNotCompletingNormally=warning
|
||||||
|
org.eclipse.jdt.core.compiler.problem.forbiddenReference=error
|
||||||
|
org.eclipse.jdt.core.compiler.problem.hiddenCatchBlock=warning
|
||||||
|
org.eclipse.jdt.core.compiler.problem.incompatibleNonInheritedInterfaceMethod=warning
|
||||||
|
org.eclipse.jdt.core.compiler.problem.incompleteEnumSwitch=ignore
|
||||||
|
org.eclipse.jdt.core.compiler.problem.indirectStaticAccess=warning
|
||||||
|
org.eclipse.jdt.core.compiler.problem.localVariableHiding=ignore
|
||||||
|
org.eclipse.jdt.core.compiler.problem.methodWithConstructorName=warning
|
||||||
|
org.eclipse.jdt.core.compiler.problem.missingDeprecatedAnnotation=ignore
|
||||||
|
org.eclipse.jdt.core.compiler.problem.missingOverrideAnnotation=ignore
|
||||||
|
org.eclipse.jdt.core.compiler.problem.missingSerialVersion=warning
|
||||||
|
org.eclipse.jdt.core.compiler.problem.noEffectAssignment=warning
|
||||||
|
org.eclipse.jdt.core.compiler.problem.noImplicitStringConversion=warning
|
||||||
|
org.eclipse.jdt.core.compiler.problem.nonExternalizedStringLiteral=warning
|
||||||
|
org.eclipse.jdt.core.compiler.problem.nullReference=ignore
|
||||||
|
org.eclipse.jdt.core.compiler.problem.overridingPackageDefaultMethod=warning
|
||||||
|
org.eclipse.jdt.core.compiler.problem.parameterAssignment=ignore
|
||||||
|
org.eclipse.jdt.core.compiler.problem.possibleAccidentalBooleanAssignment=ignore
|
||||||
|
org.eclipse.jdt.core.compiler.problem.rawTypeReference=ignore
|
||||||
|
org.eclipse.jdt.core.compiler.problem.specialParameterHidingField=disabled
|
||||||
|
org.eclipse.jdt.core.compiler.problem.staticAccessReceiver=warning
|
||||||
|
org.eclipse.jdt.core.compiler.problem.suppressWarnings=enabled
|
||||||
|
org.eclipse.jdt.core.compiler.problem.syntheticAccessEmulation=ignore
|
||||||
|
org.eclipse.jdt.core.compiler.problem.typeParameterHiding=warning
|
||||||
|
org.eclipse.jdt.core.compiler.problem.uncheckedTypeOperation=warning
|
||||||
|
org.eclipse.jdt.core.compiler.problem.undocumentedEmptyBlock=warning
|
||||||
|
org.eclipse.jdt.core.compiler.problem.unhandledWarningToken=warning
|
||||||
|
org.eclipse.jdt.core.compiler.problem.unnecessaryElse=ignore
|
||||||
|
org.eclipse.jdt.core.compiler.problem.unnecessaryTypeCheck=ignore
|
||||||
|
org.eclipse.jdt.core.compiler.problem.unqualifiedFieldAccess=ignore
|
||||||
|
org.eclipse.jdt.core.compiler.problem.unusedDeclaredThrownException=ignore
|
||||||
|
org.eclipse.jdt.core.compiler.problem.unusedDeclaredThrownExceptionWhenOverriding=disabled
|
||||||
|
org.eclipse.jdt.core.compiler.problem.unusedImport=warning
|
||||||
|
org.eclipse.jdt.core.compiler.problem.unusedLabel=warning
|
||||||
|
org.eclipse.jdt.core.compiler.problem.unusedLocal=warning
|
||||||
|
org.eclipse.jdt.core.compiler.problem.unusedParameter=ignore
|
||||||
|
org.eclipse.jdt.core.compiler.problem.unusedParameterWhenImplementingAbstract=disabled
|
||||||
|
org.eclipse.jdt.core.compiler.problem.unusedParameterWhenOverridingConcrete=disabled
|
||||||
|
org.eclipse.jdt.core.compiler.problem.unusedPrivateMember=warning
|
||||||
|
org.eclipse.jdt.core.compiler.problem.varargsArgumentNeedCast=warning
|
||||||
org.eclipse.jdt.core.compiler.source=1.4
|
org.eclipse.jdt.core.compiler.source=1.4
|
||||||
|
|
|
@ -2,17 +2,15 @@ Manifest-Version: 1.0
|
||||||
Bundle-ManifestVersion: 2
|
Bundle-ManifestVersion: 2
|
||||||
Bundle-Name: %pluginName
|
Bundle-Name: %pluginName
|
||||||
Bundle-SymbolicName: org.eclipse.tm.terminal; singleton:=true
|
Bundle-SymbolicName: org.eclipse.tm.terminal; singleton:=true
|
||||||
Bundle-Version: 2.6.0
|
Bundle-Version: 2.7.0
|
||||||
Bundle-Activator: org.eclipse.tm.terminal.TerminalPlugin
|
Bundle-Activator: org.eclipse.tm.terminal.internal.control.TerminalPlugin
|
||||||
Bundle-Vendor: %providerName
|
Bundle-Vendor: %providerName
|
||||||
Bundle-Localization: plugin
|
Bundle-Localization: plugin
|
||||||
Require-Bundle: org.eclipse.core.runtime,
|
Require-Bundle: org.eclipse.core.runtime,
|
||||||
org.eclipse.ui.ide,
|
|
||||||
org.eclipse.ui.views,
|
|
||||||
org.eclipse.ui.workbench.texteditor,
|
|
||||||
org.eclipse.ui.editors,
|
|
||||||
org.eclipse.core.resources,
|
|
||||||
org.eclipse.ui,
|
org.eclipse.ui,
|
||||||
org.eclipse.jface.text
|
org.eclipse.jface.text
|
||||||
Eclipse-LazyStart: true
|
Eclipse-LazyStart: true
|
||||||
Bundle-RequiredExecutionEnvironment: J2SE-1.4
|
Bundle-RequiredExecutionEnvironment: J2SE-1.4
|
||||||
|
Bundle-ClassPath: .
|
||||||
|
Export-Package: org.eclipse.tm.terminal,
|
||||||
|
org.eclipse.tm.terminal.control
|
||||||
|
|
0
org.eclipse.tm.terminal/README.txt
Normal file
14
org.eclipse.tm.terminal/build.properties
Normal file
|
@ -0,0 +1,14 @@
|
||||||
|
bin.includes = .,\
|
||||||
|
src/,\
|
||||||
|
META-INF/,\
|
||||||
|
plugin.xml,\
|
||||||
|
.classpath,\
|
||||||
|
.project,\
|
||||||
|
build.properties,\
|
||||||
|
plugin.properties,\
|
||||||
|
schema/,\
|
||||||
|
.settings/
|
||||||
|
|
||||||
|
source.. = src/
|
||||||
|
output.. = bin/
|
||||||
|
|
|
@ -4,14 +4,3 @@
|
||||||
|
|
||||||
pluginName = Terminal
|
pluginName = Terminal
|
||||||
providerName = Eclipse.org
|
providerName = Eclipse.org
|
||||||
terminal.views.category.name = Device Debug
|
|
||||||
terminal.views.view.name = Terminal
|
|
||||||
terminal.views.view.font.description = The font for the terminal console.
|
|
||||||
terminal.views.view.font.label = Terminal Console Font
|
|
||||||
|
|
||||||
terminal.view.context.name=Terminal view context
|
|
||||||
terminal.view.context.description=control-q override
|
|
||||||
|
|
||||||
terminal.view.insertion.description=Terminal view insertion
|
|
||||||
terminal.view.insertion.name=Terminal view insert
|
|
||||||
terminal.view.insertion.category.name=Terminal view commands
|
|
||||||
|
|
|
@ -1,128 +1,9 @@
|
||||||
<?xml version="1.0" encoding="UTF-8"?>
|
<?xml version="1.0" encoding="UTF-8"?>
|
||||||
<?eclipse version="3.0"?>
|
<?eclipse version="3.0"?>
|
||||||
<plugin>
|
<plugin>
|
||||||
|
<extension-point id="terminalConnector" name="Terminal Connector" schema="schema/terminalConnector.exsd"/>
|
||||||
<extension
|
<extension
|
||||||
point="org.eclipse.ui.views">
|
point="org.eclipse.tm.terminal.terminalConnector">
|
||||||
<category
|
<connector class="org.eclipse.tm.terminal.internal.telnet.TelnetConnector"/>
|
||||||
name="%terminal.views.category.name"
|
|
||||||
id="Terminal">
|
|
||||||
</category>
|
|
||||||
<view
|
|
||||||
allowMultiple="true"
|
|
||||||
class="org.eclipse.tm.terminal.TerminalView"
|
|
||||||
icon="icons/cview16/terminal_view.gif"
|
|
||||||
category="Terminal"
|
|
||||||
name="%terminal.views.view.name"
|
|
||||||
id="org.eclipse.tm.terminal.TerminalView">
|
|
||||||
</view>
|
|
||||||
</extension>
|
|
||||||
<extension
|
|
||||||
point="org.eclipse.ui.perspectiveExtensions">
|
|
||||||
<perspectiveExtension
|
|
||||||
targetID="Terminal">
|
|
||||||
<viewShortcut id="org.eclipse.tm.terminal.TerminalView"/>
|
|
||||||
<view id="org.eclipse.tm.terminal.TerminalView"
|
|
||||||
relationship="stack">
|
|
||||||
</view>
|
|
||||||
</perspectiveExtension>
|
|
||||||
</extension>
|
|
||||||
<extension
|
|
||||||
point="org.eclipse.ui.preferencePages">
|
|
||||||
<page
|
|
||||||
name="%terminal.views.view.name"
|
|
||||||
class="org.eclipse.tm.terminal.TerminalPreferencePage"
|
|
||||||
id="org.eclipse.tm.terminal.TerminalPreferencePage">
|
|
||||||
</page>
|
|
||||||
</extension>
|
|
||||||
|
|
||||||
<extension
|
|
||||||
point="org.eclipse.ui.fontDefinitions">
|
|
||||||
<fontDefinition
|
|
||||||
label="%terminal.views.view.font.label"
|
|
||||||
defaultsTo="org.eclipse.jface.textfont"
|
|
||||||
id="terminal.views.view.font.definition">
|
|
||||||
<description>
|
|
||||||
%terminal.views.view.font.description
|
|
||||||
</description>
|
|
||||||
</fontDefinition>
|
|
||||||
</extension>
|
|
||||||
|
|
||||||
<extension point="org.eclipse.ui.contexts">
|
|
||||||
<context
|
|
||||||
name="%terminal.view.context.name"
|
|
||||||
description="%terminal.view.context.description"
|
|
||||||
id="org.eclipse.tm.terminal.TerminalContext"
|
|
||||||
/>
|
|
||||||
</extension>
|
|
||||||
<extension
|
|
||||||
point="org.eclipse.ui.commands">
|
|
||||||
<command
|
|
||||||
categoryId="org.eclipse.tm.terminal.category1"
|
|
||||||
id="org.eclipse.tm.terminal.command1"
|
|
||||||
name="%terminal.view.insertion.name"/>
|
|
||||||
<category
|
|
||||||
description="%terminal.view.insertion.description"
|
|
||||||
id="org.eclipse.tm.terminal.category1"
|
|
||||||
name="%terminal.view.insertion.category.name"/>
|
|
||||||
</extension>
|
|
||||||
<extension
|
|
||||||
point="org.eclipse.ui.bindings">
|
|
||||||
<!--
|
|
||||||
These keybindings are needed to disable the menu-activation keys (e.g.,
|
|
||||||
Alt-F for the File menu, etc.). The code in method
|
|
||||||
TerminalCtrl.TerminalFocusListener.focusGained() disables the Eclipse key
|
|
||||||
binding service, but it doesn't disable the global menu-activation
|
|
||||||
keys.
|
|
||||||
-->
|
|
||||||
<key
|
|
||||||
commandId="org.eclipse.tm.terminal.command1"
|
|
||||||
contextId="org.eclipse.tm.terminal.TerminalContext"
|
|
||||||
schemeId="org.eclipse.ui.defaultAcceleratorConfiguration"
|
|
||||||
sequence="Alt+A"/>
|
|
||||||
<key
|
|
||||||
commandId="org.eclipse.tm.terminal.command1"
|
|
||||||
contextId="org.eclipse.tm.terminal.TerminalContext"
|
|
||||||
schemeId="org.eclipse.ui.defaultAcceleratorConfiguration"
|
|
||||||
sequence="Alt+E"/>
|
|
||||||
<key
|
|
||||||
commandId="org.eclipse.tm.terminal.command1"
|
|
||||||
contextId="org.eclipse.tm.terminal.TerminalContext"
|
|
||||||
schemeId="org.eclipse.ui.defaultAcceleratorConfiguration"
|
|
||||||
sequence="Alt+F"/>
|
|
||||||
<key
|
|
||||||
commandId="org.eclipse.tm.terminal.command1"
|
|
||||||
contextId="org.eclipse.tm.terminal.TerminalContext"
|
|
||||||
schemeId="org.eclipse.ui.defaultAcceleratorConfiguration"
|
|
||||||
sequence="Alt+G"/>
|
|
||||||
<key
|
|
||||||
commandId="org.eclipse.tm.terminal.command1"
|
|
||||||
contextId="org.eclipse.tm.terminal.TerminalContext"
|
|
||||||
schemeId="org.eclipse.ui.defaultAcceleratorConfiguration"
|
|
||||||
sequence="Alt+H"/>
|
|
||||||
<key
|
|
||||||
commandId="org.eclipse.tm.terminal.command1"
|
|
||||||
contextId="org.eclipse.tm.terminal.TerminalContext"
|
|
||||||
schemeId="org.eclipse.ui.defaultAcceleratorConfiguration"
|
|
||||||
sequence="Alt+N"/>
|
|
||||||
<key
|
|
||||||
commandId="org.eclipse.tm.terminal.command1"
|
|
||||||
contextId="org.eclipse.tm.terminal.TerminalContext"
|
|
||||||
schemeId="org.eclipse.ui.defaultAcceleratorConfiguration"
|
|
||||||
sequence="Alt+P"/>
|
|
||||||
<key
|
|
||||||
commandId="org.eclipse.tm.terminal.command1"
|
|
||||||
contextId="org.eclipse.tm.terminal.TerminalContext"
|
|
||||||
schemeId="org.eclipse.ui.defaultAcceleratorConfiguration"
|
|
||||||
sequence="Alt+R"/>
|
|
||||||
<key
|
|
||||||
commandId="org.eclipse.tm.terminal.command1"
|
|
||||||
contextId="org.eclipse.tm.terminal.TerminalContext"
|
|
||||||
schemeId="org.eclipse.ui.defaultAcceleratorConfiguration"
|
|
||||||
sequence="Alt+T"/>
|
|
||||||
<key
|
|
||||||
commandId="org.eclipse.tm.terminal.command1"
|
|
||||||
contextId="org.eclipse.tm.terminal.TerminalContext"
|
|
||||||
schemeId="org.eclipse.ui.defaultAcceleratorConfiguration"
|
|
||||||
sequence="Alt+W"/>
|
|
||||||
</extension>
|
</extension>
|
||||||
</plugin>
|
</plugin>
|
105
org.eclipse.tm.terminal/schema/terminalConnector.exsd
Normal file
|
@ -0,0 +1,105 @@
|
||||||
|
<?xml version='1.0' encoding='UTF-8'?>
|
||||||
|
<!-- Schema file written by PDE -->
|
||||||
|
<schema targetNamespace="org.eclipse.tm.terminal">
|
||||||
|
<annotation>
|
||||||
|
<appInfo>
|
||||||
|
<meta.schema plugin="org.eclipse.tm.terminal" id="terminalConnector" name="TerminalConnector"/>
|
||||||
|
</appInfo>
|
||||||
|
<documentation>
|
||||||
|
[Enter description of this extension point.]
|
||||||
|
</documentation>
|
||||||
|
</annotation>
|
||||||
|
|
||||||
|
<element name="extension">
|
||||||
|
<complexType>
|
||||||
|
<sequence minOccurs="1" maxOccurs="unbounded">
|
||||||
|
<element ref="connector"/>
|
||||||
|
</sequence>
|
||||||
|
<attribute name="point" type="string" use="required">
|
||||||
|
<annotation>
|
||||||
|
<documentation>
|
||||||
|
|
||||||
|
</documentation>
|
||||||
|
</annotation>
|
||||||
|
</attribute>
|
||||||
|
<attribute name="id" type="string">
|
||||||
|
<annotation>
|
||||||
|
<documentation>
|
||||||
|
|
||||||
|
</documentation>
|
||||||
|
</annotation>
|
||||||
|
</attribute>
|
||||||
|
<attribute name="name" type="string">
|
||||||
|
<annotation>
|
||||||
|
<documentation>
|
||||||
|
|
||||||
|
</documentation>
|
||||||
|
<appInfo>
|
||||||
|
<meta.attribute translatable="true"/>
|
||||||
|
</appInfo>
|
||||||
|
</annotation>
|
||||||
|
</attribute>
|
||||||
|
</complexType>
|
||||||
|
</element>
|
||||||
|
|
||||||
|
<element name="connector">
|
||||||
|
<complexType>
|
||||||
|
<attribute name="class" type="string">
|
||||||
|
<annotation>
|
||||||
|
<documentation>
|
||||||
|
|
||||||
|
</documentation>
|
||||||
|
<appInfo>
|
||||||
|
<meta.attribute kind="java" basedOn="org.eclipse.tm.terminal.ITerminalConnector"/>
|
||||||
|
</appInfo>
|
||||||
|
</annotation>
|
||||||
|
</attribute>
|
||||||
|
</complexType>
|
||||||
|
</element>
|
||||||
|
|
||||||
|
<annotation>
|
||||||
|
<appInfo>
|
||||||
|
<meta.section type="since"/>
|
||||||
|
</appInfo>
|
||||||
|
<documentation>
|
||||||
|
[Enter the first release in which this extension point appears.]
|
||||||
|
</documentation>
|
||||||
|
</annotation>
|
||||||
|
|
||||||
|
<annotation>
|
||||||
|
<appInfo>
|
||||||
|
<meta.section type="examples"/>
|
||||||
|
</appInfo>
|
||||||
|
<documentation>
|
||||||
|
[Enter extension point usage example here.]
|
||||||
|
</documentation>
|
||||||
|
</annotation>
|
||||||
|
|
||||||
|
<annotation>
|
||||||
|
<appInfo>
|
||||||
|
<meta.section type="apiInfo"/>
|
||||||
|
</appInfo>
|
||||||
|
<documentation>
|
||||||
|
[Enter API information here.]
|
||||||
|
</documentation>
|
||||||
|
</annotation>
|
||||||
|
|
||||||
|
<annotation>
|
||||||
|
<appInfo>
|
||||||
|
<meta.section type="implementation"/>
|
||||||
|
</appInfo>
|
||||||
|
<documentation>
|
||||||
|
[Enter information about supplied implementation of this extension point.]
|
||||||
|
</documentation>
|
||||||
|
</annotation>
|
||||||
|
|
||||||
|
<annotation>
|
||||||
|
<appInfo>
|
||||||
|
<meta.section type="copyright"/>
|
||||||
|
</appInfo>
|
||||||
|
<documentation>
|
||||||
|
|
||||||
|
</documentation>
|
||||||
|
</annotation>
|
||||||
|
|
||||||
|
</schema>
|
|
@ -0,0 +1,47 @@
|
||||||
|
/*******************************************************************************
|
||||||
|
* Copyright (c) 2006 Wind River Systems, Inc. and others.
|
||||||
|
* All rights reserved. This program and the accompanying materials
|
||||||
|
* are made available under the terms of the Eclipse Public License v1.0
|
||||||
|
* which accompanies this distribution, and is available at
|
||||||
|
* http://www.eclipse.org/legal/epl-v10.html
|
||||||
|
*
|
||||||
|
* Contributors:
|
||||||
|
* Wind River Systems, Inc. - initial implementation
|
||||||
|
*
|
||||||
|
*******************************************************************************/
|
||||||
|
package org.eclipse.tm.terminal;
|
||||||
|
|
||||||
|
import org.eclipse.swt.widgets.Composite;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @author Michael Scharf
|
||||||
|
*
|
||||||
|
* TODO: Michael Scharf: provide a mechanism to set an error string
|
||||||
|
* TODO: Michael Scharf: provide a long description of a wizard
|
||||||
|
* TODO: Michael Scharf: allow multiple pages to be generated
|
||||||
|
*/
|
||||||
|
public interface ISettingsPage {
|
||||||
|
/**
|
||||||
|
* Create a page to be shown in a dialog or wizard to setup the connection.
|
||||||
|
* @param parent
|
||||||
|
*/
|
||||||
|
void createControl(Composite parent);
|
||||||
|
/**
|
||||||
|
* Called before the page is shown. Loads the state from the {@link ITerminalConnector}.
|
||||||
|
*/
|
||||||
|
void loadSettings();
|
||||||
|
/**
|
||||||
|
* Called when the OK button is pressed.
|
||||||
|
*/
|
||||||
|
void saveSettings();
|
||||||
|
/**
|
||||||
|
* @return true if the
|
||||||
|
*/
|
||||||
|
boolean validateSettings();
|
||||||
|
/**
|
||||||
|
* @return a name of the connection type. Used in a tab page title or drop
|
||||||
|
* down to select the connection.
|
||||||
|
*/
|
||||||
|
String getName();
|
||||||
|
|
||||||
|
}
|
|
@ -0,0 +1,40 @@
|
||||||
|
/*******************************************************************************
|
||||||
|
* Copyright (c) 2006 Wind River Systems, Inc. and others.
|
||||||
|
* All rights reserved. This program and the accompanying materials
|
||||||
|
* are made available under the terms of the Eclipse Public License v1.0
|
||||||
|
* which accompanies this distribution, and is available at
|
||||||
|
* http://www.eclipse.org/legal/epl-v10.html
|
||||||
|
*
|
||||||
|
* Contributors:
|
||||||
|
* Wind River Systems, Inc. - initial implementation
|
||||||
|
*
|
||||||
|
*******************************************************************************/
|
||||||
|
package org.eclipse.tm.terminal;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* A simple interface to a store to persist the state of a connection.
|
||||||
|
*
|
||||||
|
*
|
||||||
|
* <p>Not to be implemented.
|
||||||
|
* @author Michael Scharf
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
public interface ISettingsStore {
|
||||||
|
/**
|
||||||
|
* @param key
|
||||||
|
* @return value
|
||||||
|
*/
|
||||||
|
String get(String key);
|
||||||
|
/**
|
||||||
|
* @param key
|
||||||
|
* @param defaultValue
|
||||||
|
* @return the value or the fecaault
|
||||||
|
*/
|
||||||
|
String get(String key, String defaultValue);
|
||||||
|
/**
|
||||||
|
* Save a string value
|
||||||
|
* @param key
|
||||||
|
* @param value
|
||||||
|
*/
|
||||||
|
void put(String key, String value);
|
||||||
|
}
|
|
@ -0,0 +1,98 @@
|
||||||
|
/*******************************************************************************
|
||||||
|
* Copyright (c) 2006 Wind River Systems, Inc. and others.
|
||||||
|
* All rights reserved. This program and the accompanying materials
|
||||||
|
* are made available under the terms of the Eclipse Public License v1.0
|
||||||
|
* which accompanies this distribution, and is available at
|
||||||
|
* http://www.eclipse.org/legal/epl-v10.html
|
||||||
|
*
|
||||||
|
* Contributors:
|
||||||
|
* Wind River Systems, Inc. - initial implementation
|
||||||
|
*
|
||||||
|
*******************************************************************************/
|
||||||
|
package org.eclipse.tm.terminal;
|
||||||
|
|
||||||
|
import java.io.InputStream;
|
||||||
|
import java.io.OutputStream;
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Manage a single connection. Implementations of this class are contributed
|
||||||
|
* via <code>org.eclipse.tm.terminal.terminalConnector</code> extension point.
|
||||||
|
*
|
||||||
|
* @author Michael Scharf
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
public interface ITerminalConnector {
|
||||||
|
/**
|
||||||
|
* @return an ID of this connector. Typically <code>getClass().getName()</code>
|
||||||
|
*/
|
||||||
|
String getId();
|
||||||
|
/**
|
||||||
|
* @return true if the contribution is functioning (e.g. all external libraries are
|
||||||
|
* installed). This was added for the serial support, because it requires the java comm
|
||||||
|
* library, which is installed in the lib/ext directory of the
|
||||||
|
*/
|
||||||
|
boolean isInstalled();
|
||||||
|
/**
|
||||||
|
* Connect using the current state of the settings.
|
||||||
|
* @param control Used to inform the UI about state changes and messages from the connection.
|
||||||
|
*/
|
||||||
|
void connect(ITerminalControl control);
|
||||||
|
/**
|
||||||
|
* Disconnect if connected. Else do nothing.
|
||||||
|
*/
|
||||||
|
void disconnect();
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @return true if a local echo is needed.
|
||||||
|
* TODO:Michael Scharf: this should be handed within the connection....
|
||||||
|
*/
|
||||||
|
boolean isLocalEcho();
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Notify the remote site that the size of the terminal has changed.
|
||||||
|
* @param newWidth
|
||||||
|
* @param newHeight
|
||||||
|
*/
|
||||||
|
void setTerminalSize(int newWidth, int newHeight);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @return a stream with data coming from the remote site.
|
||||||
|
*/
|
||||||
|
OutputStream getOutputStream();
|
||||||
|
/**
|
||||||
|
* @return a stream to write to the remote site.
|
||||||
|
*/
|
||||||
|
InputStream getInputStream();
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Load the state of this connection. Is typically called before
|
||||||
|
* {@link #connect(ITerminalControl)}.
|
||||||
|
*
|
||||||
|
* @param store a string based data store. Short keys like "foo" can be used to
|
||||||
|
* store the state of the connectio.
|
||||||
|
*/
|
||||||
|
void load(ISettingsStore store);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* When the view or dialog containing the terminal is closed,
|
||||||
|
* the state of the connection is saved into the settings store <code>store</code>
|
||||||
|
* @param store
|
||||||
|
*/
|
||||||
|
void save(ISettingsStore store);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @return a new page that can be used in a dialog to setup this connection.
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
ISettingsPage makeSettingsPage();
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @param connectedLabel a String with the connected state {@link TerminalState}.
|
||||||
|
* Like "CONNECTED", "CLOSED". Can be used to build up the status string.
|
||||||
|
* @return A string that represents the state of the connection.
|
||||||
|
* TODO: Michael Scharf:
|
||||||
|
*/
|
||||||
|
String getStatusString(String connectedLabel);
|
||||||
|
|
||||||
|
}
|
|
@ -0,0 +1,65 @@
|
||||||
|
/*******************************************************************************
|
||||||
|
* Copyright (c) 2006 Wind River Systems, Inc. and others.
|
||||||
|
* All rights reserved. This program and the accompanying materials
|
||||||
|
* are made available under the terms of the Eclipse Public License v1.0
|
||||||
|
* which accompanies this distribution, and is available at
|
||||||
|
* http://www.eclipse.org/legal/epl-v10.html
|
||||||
|
*
|
||||||
|
* Contributors:
|
||||||
|
* Wind River Systems, Inc. - initial implementation
|
||||||
|
*
|
||||||
|
*******************************************************************************/
|
||||||
|
package org.eclipse.tm.terminal;
|
||||||
|
|
||||||
|
import org.eclipse.swt.widgets.Shell;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Represents the terminal view as seen by a terminal connection.
|
||||||
|
*
|
||||||
|
* <p> Not to be implemented by clients.
|
||||||
|
* @author Michael Scharf
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
public interface ITerminalControl {
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @return the current state of the connection
|
||||||
|
*/
|
||||||
|
TerminalState getState();
|
||||||
|
/**
|
||||||
|
* @param state
|
||||||
|
*/
|
||||||
|
void setState(TerminalState state);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* A shell to show dialogs.
|
||||||
|
* @return the shell in which the terminal is shown.
|
||||||
|
* TODO: Michael Scharf: it's not clear to me what the meaning of the open state is
|
||||||
|
*/
|
||||||
|
Shell getShell();
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Show a text in the terminal. If pots newlines at the beginning and the end.
|
||||||
|
* @param text
|
||||||
|
* TODO: Michael Scharf: Is this really needed? (use {@link #displayTextInTerminal(String)}
|
||||||
|
*/
|
||||||
|
void displayTextInTerminal(String text);
|
||||||
|
/**
|
||||||
|
* Write a string directly to the terminal.
|
||||||
|
* @param txt
|
||||||
|
*/
|
||||||
|
void writeToTerminal(String txt);
|
||||||
|
/**
|
||||||
|
* Set the title of the terminal view.
|
||||||
|
* @param title
|
||||||
|
*/
|
||||||
|
void setTerminalTitle(String title);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Show an error message during connect.
|
||||||
|
* @param msg
|
||||||
|
* TODO: Michael Scharf: Should be replaced by a better error notification mechansim!
|
||||||
|
*/
|
||||||
|
void setMsg(String msg);
|
||||||
|
|
||||||
|
}
|
|
@ -16,50 +16,46 @@ import java.io.File;
|
||||||
import java.io.FileOutputStream;
|
import java.io.FileOutputStream;
|
||||||
import java.io.PrintStream;
|
import java.io.PrintStream;
|
||||||
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* A simple logger class. Every method in this class is static, so they can be called
|
* A simple logger class. Every method in this class is static, so they can be
|
||||||
* from both class and instance methods. To use this class, write code like this: <p>
|
* called from both class and instance methods. To use this class, write code
|
||||||
|
* like this:
|
||||||
|
* <p>
|
||||||
*
|
*
|
||||||
* <pre>
|
* <pre>
|
||||||
* Logger.log("something has happened");
|
* Logger.log("something has happened");
|
||||||
* Logger.log("counter is " + counter);
|
* Logger.log("counter is " + counter);
|
||||||
* </pre>
|
* </pre>
|
||||||
*
|
*
|
||||||
* @author Fran Litterio <francis.litterio@windriver.com>
|
* @author Fran Litterio <francis.litterio@windriver.com>
|
||||||
*/
|
*/
|
||||||
public final class Logger
|
public final class Logger {
|
||||||
{
|
public static final String TRACE_DEBUG_LOG = "org.eclipse.tm.terminal/debug/log"; //$NON-NLS-1$
|
||||||
/**
|
public static final String TRACE_DEBUG_LOG_ERROR = "org.eclipse.tm.terminal/debug/log/error"; //$NON-NLS-1$
|
||||||
* UNDER CONSTRUCTION
|
public static final String TRACE_DEBUG_LOG_INFO = "org.eclipse.tm.terminal/debug/log/info"; //$NON-NLS-1$
|
||||||
*/
|
public static final String TRACE_DEBUG_LOG_CHAR = "org.eclipse.tm.terminal/debug/log/char"; //$NON-NLS-1$
|
||||||
|
public static final String TRACE_DEBUG_LOG_BUFFER_SIZE = "org.eclipse.tm.terminal/debug/log/buffer/size"; //$NON-NLS-1$
|
||||||
|
|
||||||
private static PrintStream logStream;
|
private static PrintStream logStream;
|
||||||
|
|
||||||
static
|
static {
|
||||||
{
|
|
||||||
String logFile = null;
|
String logFile = null;
|
||||||
File logDirWindows = new File("C:\\wblogs"); //$NON-NLS-1$
|
File logDirWindows = new File("C:\\wblogs"); //$NON-NLS-1$
|
||||||
File logDirUNIX = new File("/tmp/wblogs"); //$NON-NLS-1$
|
File logDirUNIX = new File("/tmp/wblogs"); //$NON-NLS-1$
|
||||||
|
|
||||||
if (logDirWindows.isDirectory())
|
if (logDirWindows.isDirectory()) {
|
||||||
{
|
|
||||||
logFile = logDirWindows + "\\wbterminal.log"; //$NON-NLS-1$
|
logFile = logDirWindows + "\\wbterminal.log"; //$NON-NLS-1$
|
||||||
}
|
} else if (logDirUNIX.isDirectory()) {
|
||||||
else if (logDirUNIX.isDirectory())
|
|
||||||
{
|
|
||||||
logFile = logDirUNIX + "/wbterminal.log"; //$NON-NLS-1$
|
logFile = logDirUNIX + "/wbterminal.log"; //$NON-NLS-1$
|
||||||
}
|
}
|
||||||
|
|
||||||
if (logFile != null)
|
if (logFile != null) {
|
||||||
{
|
try {
|
||||||
try
|
|
||||||
{
|
|
||||||
logStream = new PrintStream(new FileOutputStream(logFile, true));
|
logStream = new PrintStream(new FileOutputStream(logFile, true));
|
||||||
}
|
} catch (Exception ex) {
|
||||||
catch (Exception ex)
|
|
||||||
{
|
|
||||||
logStream = System.err;
|
logStream = System.err;
|
||||||
logStream.println("Exception when opening log file -- logging to stderr!"); //$NON-NLS-1$
|
logStream
|
||||||
|
.println("Exception when opening log file -- logging to stderr!"); //$NON-NLS-1$
|
||||||
ex.printStackTrace(logStream);
|
ex.printStackTrace(logStream);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -71,11 +67,10 @@ public final class Logger
|
||||||
*
|
*
|
||||||
* @param message A String containing the message to log.
|
* @param message A String containing the message to log.
|
||||||
*/
|
*/
|
||||||
public static final void log(String message)
|
public static final void log(String message) {
|
||||||
{
|
if (logStream != null) {
|
||||||
if (logStream != null)
|
// Read my own stack to get the class name, method name, and line
|
||||||
{
|
// number of
|
||||||
// Read my own stack to get the class name, method name, and line number of
|
|
||||||
// where this method was called.
|
// where this method was called.
|
||||||
|
|
||||||
StackTraceElement caller = new Throwable().getStackTrace()[1];
|
StackTraceElement caller = new Throwable().getStackTrace()[1];
|
||||||
|
@ -90,11 +85,12 @@ public final class Logger
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Writes a stack trace for an exception to both Standard Error and to the log file.
|
* Writes a stack trace for an exception to both Standard Error and to the
|
||||||
|
* log file.
|
||||||
*/
|
*/
|
||||||
public static final void logException(Exception ex)
|
public static final void logException(Exception ex) {
|
||||||
{
|
// Read my own stack to get the class name, method name, and line number
|
||||||
// Read my own stack to get the class name, method name, and line number of
|
// of
|
||||||
// where this method was called.
|
// where this method was called.
|
||||||
|
|
||||||
StackTraceElement caller = new Throwable().getStackTrace()[1];
|
StackTraceElement caller = new Throwable().getStackTrace()[1];
|
||||||
|
@ -105,12 +101,12 @@ public final class Logger
|
||||||
|
|
||||||
PrintStream tmpStream = System.err;
|
PrintStream tmpStream = System.err;
|
||||||
|
|
||||||
if (logStream != null)
|
if (logStream != null) {
|
||||||
{
|
|
||||||
tmpStream = logStream;
|
tmpStream = logStream;
|
||||||
}
|
}
|
||||||
|
|
||||||
tmpStream.println(className + "." + methodName + ":" + lineNumber + ": " + //$NON-NLS-1$//$NON-NLS-2$ //$NON-NLS-3$
|
tmpStream.println(className
|
||||||
|
+ "." + methodName + ":" + lineNumber + ": " + //$NON-NLS-1$//$NON-NLS-2$ //$NON-NLS-3$
|
||||||
"Caught exception: " + ex); //$NON-NLS-1$
|
"Caught exception: " + ex); //$NON-NLS-1$
|
||||||
ex.printStackTrace(tmpStream);
|
ex.printStackTrace(tmpStream);
|
||||||
}
|
}
|
||||||
|
|
|
@ -1,40 +0,0 @@
|
||||||
/*******************************************************************************
|
|
||||||
* Copyright (c) 2006 Wind River Systems, Inc. and others.
|
|
||||||
* All rights reserved. This program and the accompanying materials
|
|
||||||
* are made available under the terms of the Eclipse Public License v1.0
|
|
||||||
* which accompanies this distribution, and is available at
|
|
||||||
* http://www.eclipse.org/legal/epl-v10.html
|
|
||||||
*
|
|
||||||
* Contributors:
|
|
||||||
* Wind River Systems, Inc. - initial implementation
|
|
||||||
*
|
|
||||||
*******************************************************************************/
|
|
||||||
|
|
||||||
package org.eclipse.tm.terminal;
|
|
||||||
|
|
||||||
import java.util.MissingResourceException;
|
|
||||||
import java.util.ResourceBundle;
|
|
||||||
|
|
||||||
public class Messages
|
|
||||||
{
|
|
||||||
private static final String BUNDLE_NAME = "org.eclipse.tm.terminal.Messages"; //$NON-NLS-1$
|
|
||||||
|
|
||||||
private static final ResourceBundle RESOURCE_BUNDLE = ResourceBundle.getBundle(BUNDLE_NAME);
|
|
||||||
|
|
||||||
private Messages()
|
|
||||||
{
|
|
||||||
// Empty.
|
|
||||||
}
|
|
||||||
|
|
||||||
public static String getString(String key)
|
|
||||||
{
|
|
||||||
try
|
|
||||||
{
|
|
||||||
return RESOURCE_BUNDLE.getString(key);
|
|
||||||
}
|
|
||||||
catch (MissingResourceException e)
|
|
||||||
{
|
|
||||||
return '!' + key + '!';
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
|
@ -1,43 +0,0 @@
|
||||||
###############################################################################
|
|
||||||
# Copyright (c) 2006 Wind River Systems, Inc. and others.
|
|
||||||
# All rights reserved. This program and the accompanying materials
|
|
||||||
# are made available under the terms of the Eclipse Public License v1.0
|
|
||||||
# which accompanies this distribution, and is available at
|
|
||||||
# http://www.eclipse.org/legal/epl-v10.html
|
|
||||||
#
|
|
||||||
# Contributors:
|
|
||||||
# Wind River Systems, Inc. - initial implementation
|
|
||||||
###############################################################################
|
|
||||||
TerminalConsts.Terminal_7=Terminal
|
|
||||||
TerminalConsts.Limit_terminal_output_16=Limit terminal output
|
|
||||||
TerminalConsts.Terminal_buffer_lines__17=Terminal buffer lines:
|
|
||||||
TerminalConsts.Serial_timeout_(seconds)__18=Serial timeout (seconds):
|
|
||||||
TerminalConsts.Network_timeout_(seconds)__19=Network timeout (seconds):
|
|
||||||
TerminalConsts.Terminal_Settings_1=Terminal Settings
|
|
||||||
TerminalConsts.Connection_Type_2=Connection Type
|
|
||||||
TerminalConsts.Settings_3=Settings
|
|
||||||
TerminalConsts.Port_4=Port
|
|
||||||
TerminalConsts.Baud_Rate_5=Baud Rate
|
|
||||||
TerminalConsts.Data_Bits_6=Data Bits
|
|
||||||
TerminalConsts.Stop_Bits_7=Stop Bits
|
|
||||||
TerminalConsts.Parity_8=Parity
|
|
||||||
TerminalConsts.Flow_Out_10=Flow Out
|
|
||||||
TerminalConsts.Host_11=Host
|
|
||||||
TerminalConsts.Terminal_Error_12=Terminal Error
|
|
||||||
TerminalConsts.Socket_Error_13=Socket Error
|
|
||||||
TerminalConsts.IO_Error_14=IO Error
|
|
||||||
TerminalConsts.Serial_port___{0}___is_currently_in_use_!_nDo_you_want_to_close_the_port__15=Serial port \''{0}\'' is currently in use\!\nDo you want to close the port?
|
|
||||||
TerminalConsts.Error_16=Error
|
|
||||||
TerminalConsts.Emulator_is_not_supported._17=Emulator is not supported.
|
|
||||||
|
|
||||||
TerminalConsts.New_terminal=New Terminal
|
|
||||||
TerminalConsts.Connect_2=Connect
|
|
||||||
TerminalConsts.Disconnect_3=Disconnect
|
|
||||||
TerminalConsts.Settings..._4=Settings...
|
|
||||||
TerminalConsts.Copy_5=Copy
|
|
||||||
TerminalConsts.0=Cut
|
|
||||||
TerminalConsts.1=Flow Control
|
|
||||||
TerminalConsts.Paste_6=Paste
|
|
||||||
TerminalConsts.Select_All_7=Select All
|
|
||||||
TerminalConsts.Clear_All_8=Clear All
|
|
||||||
TerminalConsts.Break_9=Break
|
|
|
@ -1,796 +0,0 @@
|
||||||
/*******************************************************************************
|
|
||||||
* Copyright (c) 2006 Wind River Systems, Inc. and others.
|
|
||||||
* All rights reserved. This program and the accompanying materials
|
|
||||||
* are made available under the terms of the Eclipse Public License v1.0
|
|
||||||
* which accompanies this distribution, and is available at
|
|
||||||
* http://www.eclipse.org/legal/epl-v10.html
|
|
||||||
*
|
|
||||||
* Contributors:
|
|
||||||
* Wind River Systems, Inc. - initial implementation
|
|
||||||
*
|
|
||||||
*******************************************************************************/
|
|
||||||
|
|
||||||
|
|
||||||
package org.eclipse.tm.terminal;
|
|
||||||
|
|
||||||
import java.io.IOException;
|
|
||||||
import java.io.InputStream;
|
|
||||||
import java.io.OutputStream;
|
|
||||||
import java.net.Socket;
|
|
||||||
import java.net.SocketException;
|
|
||||||
|
|
||||||
import org.eclipse.swt.widgets.Display;
|
|
||||||
|
|
||||||
|
|
||||||
/**
|
|
||||||
* This class encapsulates a TELNET connection to a remote server. It processes
|
|
||||||
* incoming TELNET protocol data and generates outbound TELNET protocol data. It also
|
|
||||||
* manages two sets of TelnetOption objects: one for the local endpoint and one for the
|
|
||||||
* remote endpoint. <p>
|
|
||||||
*
|
|
||||||
* IMPORTANT: Understanding this code requires understanding the TELNET protocol and
|
|
||||||
* TELNET option processing, as defined in the RFCs listed below. <p>
|
|
||||||
*
|
|
||||||
* @author Fran Litterio (francis.litterio@windriver.com)
|
|
||||||
*
|
|
||||||
* @see <a href="ftp://ftp.rfc-editor.org/in-notes/rfc854.txt">RFC 854</a>
|
|
||||||
* @see <a href="ftp://ftp.rfc-editor.org/in-notes/rfc855.txt">RFC 855</a>
|
|
||||||
* @see <a href="ftp://ftp.rfc-editor.org/in-notes/rfc856.txt">RFC 856</a>
|
|
||||||
* @see <a href="ftp://ftp.rfc-editor.org/in-notes/rfc857.txt">RFC 857</a>
|
|
||||||
* @see <a href="ftp://ftp.rfc-editor.org/in-notes/rfc858.txt">RFC 858</a>
|
|
||||||
* @see <a href="ftp://ftp.rfc-editor.org/in-notes/rfc859.txt">RFC 859</a>
|
|
||||||
* @see <a href="ftp://ftp.rfc-editor.org/in-notes/rfc860.txt">RFC 860</a>
|
|
||||||
* @see <a href="ftp://ftp.rfc-editor.org/in-notes/rfc861.txt">RFC 861</a>
|
|
||||||
* @see <a href="ftp://ftp.rfc-editor.org/in-notes/rfc1091.txt">RFC 1091</a>
|
|
||||||
* @see <a href="ftp://ftp.rfc-editor.org/in-notes/rfc1096.txt">RFC 1096</a>
|
|
||||||
* @see <a href="ftp://ftp.rfc-editor.org/in-notes/rfc1073.txt">RFC 1073</a>
|
|
||||||
* @see <a href="ftp://ftp.rfc-editor.org/in-notes/rfc1079.txt">RFC 1079</a>
|
|
||||||
* @see <a href="ftp://ftp.rfc-editor.org/in-notes/rfc1143.txt">RFC 1143</a>
|
|
||||||
* @see <a href="ftp://ftp.rfc-editor.org/in-notes/rfc1572.txt">RFC 1572</a>
|
|
||||||
*/
|
|
||||||
class TelnetConnection extends Thread implements TelnetCodes, TerminalMsg
|
|
||||||
{
|
|
||||||
/**
|
|
||||||
* TELNET connection state: Initial state.
|
|
||||||
*/
|
|
||||||
protected static final int STATE_INITIAL = 0;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* TELNET connection state: Last byte processed was IAC code.
|
|
||||||
* code.
|
|
||||||
*/
|
|
||||||
protected static final int STATE_IAC_RECEIVED = 1;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* TELNET connection state: Last byte processed was WILL code.
|
|
||||||
* code.
|
|
||||||
*/
|
|
||||||
protected static final int STATE_WILL_RECEIVED = 2;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* TELNET connection state: Last byte processed was WONT code.
|
|
||||||
*/
|
|
||||||
protected static final int STATE_WONT_RECEIVED = 3;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* TELNET connection state: Last byte processed was DO code.
|
|
||||||
*/
|
|
||||||
protected static final int STATE_DO_RECEIVED = 4;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* TELNET connection state: Last byte processed was DONT code.
|
|
||||||
*/
|
|
||||||
protected static final int STATE_DONT_RECEIVED = 5;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* TELNET connection state: Last byte processed was SB.
|
|
||||||
*/
|
|
||||||
protected static final int STATE_SUBNEGOTIATION_STARTED = 6;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* TELNET connection state: Currently receiving sub-negotiation data.
|
|
||||||
*/
|
|
||||||
protected static final int STATE_RECEIVING_SUBNEGOTIATION = 7;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Size of buffer for processing data received from remote endpoint.
|
|
||||||
*/
|
|
||||||
protected static final int BUFFER_SIZE = 2048;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Holds raw bytes received from the remote endpoint, prior to any TELNET protocol
|
|
||||||
* processing.
|
|
||||||
*/
|
|
||||||
protected byte[] rawBytes = new byte[BUFFER_SIZE];
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Holds incoming network data after the TELNET protocol bytes have been
|
|
||||||
* processed and removed.
|
|
||||||
*/
|
|
||||||
protected byte[] processedBytes = new byte[BUFFER_SIZE];
|
|
||||||
|
|
||||||
/**
|
|
||||||
* This field holds a StringBuffer containing text recently received from the
|
|
||||||
* remote endpoint (after all TELNET protocol bytes have been processed and
|
|
||||||
* removed).
|
|
||||||
*/
|
|
||||||
protected StringBuffer processedStringBuffer = new StringBuffer(BUFFER_SIZE);
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Holds the current state of the TELNET protocol processor.
|
|
||||||
*/
|
|
||||||
protected int telnetState = STATE_INITIAL;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* This field is true if the remote endpoint is a TELNET server, false if not. We
|
|
||||||
* set this to true if and only if the remote endpoint sends recognizable TELNET
|
|
||||||
* protocol data. We do not assume that the remote endpoint is a TELNET server
|
|
||||||
* just because it is listening on port 23. This allows us to successfully connect
|
|
||||||
* to a TELNET server listening on a port other than 23. <p>
|
|
||||||
*
|
|
||||||
* When this field first changes from false to true, we send all WILL or DO
|
|
||||||
* commands to the remote endpoint. <p>
|
|
||||||
*
|
|
||||||
* @see #telnetServerDetected()
|
|
||||||
*/
|
|
||||||
protected boolean remoteIsTelnetServer = false;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* An array of TelnetOption objects representing the local endpoint's TELNET
|
|
||||||
* options. The array is indexed by the numeric TELNET option code.
|
|
||||||
*/
|
|
||||||
protected TelnetOption[] localOptions = new TelnetOption[256];
|
|
||||||
|
|
||||||
/**
|
|
||||||
* An array of TelnetOption objects representing the remote endpoint's TELNET
|
|
||||||
* options. The array is indexed by the numeric TELNET option code.
|
|
||||||
*/
|
|
||||||
protected TelnetOption[] remoteOptions = new TelnetOption[256];
|
|
||||||
|
|
||||||
/**
|
|
||||||
* An array of bytes that holds the TELNET subnegotiation command most recently
|
|
||||||
* received from the remote endpoint. This array does _not_ include the leading
|
|
||||||
* IAC SB bytes, nor does it include the trailing IAC SE bytes. The first byte of
|
|
||||||
* this array is always a TELNET option code.
|
|
||||||
*/
|
|
||||||
protected byte[] receivedSubnegotiation = new byte[128];
|
|
||||||
|
|
||||||
/**
|
|
||||||
* This field holds the index into array {@link receivedSubnegotiation} of the next
|
|
||||||
* unused byte. This is used by method {@link #processTelnetProtocol(int)} when
|
|
||||||
* the state machine is in states {@link #STATE_SUBNEGOTIATION_STARTED} and {@link
|
|
||||||
* STATE_RECEIVING_SUBNEGOTIATION}.
|
|
||||||
*/
|
|
||||||
protected int nextSubnegotiationByteIndex = 0;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* This field is true if an error occurs while processing a subnegotiation
|
|
||||||
* command.
|
|
||||||
*
|
|
||||||
* @see #processTelnetProtocol(int)
|
|
||||||
*/
|
|
||||||
protected boolean ignoreSubnegotiation = false;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* This field holds the width of the Terminal screen in columns.
|
|
||||||
*/
|
|
||||||
protected int width = 0;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* This field holds the height of the Terminal screen in rows.
|
|
||||||
*/
|
|
||||||
protected int height = 0;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* This field holds a reference to the {@link TerminalCtrl} singleton.
|
|
||||||
*/
|
|
||||||
protected TerminalCtrl terminalControl;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* This method holds the Socket object for the TELNET connection.
|
|
||||||
*/
|
|
||||||
protected Socket socket;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* This field holds a reference to a {@link TerminalText} object, which displays
|
|
||||||
* text to the user.
|
|
||||||
*/
|
|
||||||
protected TerminalText terminalText;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* This field holds a reference to an {@link InputStream} object used to receive
|
|
||||||
* data from the remote endpoint.
|
|
||||||
*/
|
|
||||||
protected InputStream inputStream;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* This field holds a reference to an {@link OutputStream} object used to send data
|
|
||||||
* to the remote endpoint.
|
|
||||||
*/
|
|
||||||
protected OutputStream outputStream;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* This field holds the SWT Display object for the GUI. We use this to execute a
|
|
||||||
* TerminalText method on the display thread, so that it can draw text in the view.
|
|
||||||
*/
|
|
||||||
protected Display display;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* UNDER CONSTRUCTION
|
|
||||||
*/
|
|
||||||
protected boolean localEcho = true;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* This constructor just initializes some internal object state from its
|
|
||||||
* arguments.
|
|
||||||
*/
|
|
||||||
public TelnetConnection(TerminalCtrl terminalControl, Socket socket,
|
|
||||||
TerminalText terminalText)
|
|
||||||
throws IOException
|
|
||||||
{
|
|
||||||
super();
|
|
||||||
|
|
||||||
Logger.log("entered"); //$NON-NLS-1$
|
|
||||||
|
|
||||||
this.terminalControl = terminalControl;
|
|
||||||
this.socket = socket;
|
|
||||||
this.terminalText = terminalText;
|
|
||||||
|
|
||||||
inputStream = socket.getInputStream();
|
|
||||||
outputStream = socket.getOutputStream();
|
|
||||||
display = terminalControl.getTextWidget().getDisplay();
|
|
||||||
|
|
||||||
initializeOptions();
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Returns true if the TCP connection represented by this object is connected,
|
|
||||||
* false otherwise.
|
|
||||||
*/
|
|
||||||
public boolean isConnected()
|
|
||||||
{
|
|
||||||
return socket != null && socket.isConnected();
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Returns true if the TCP connection represented by this object is connected and
|
|
||||||
* the remote endpoint is a TELNET server, false otherwise.
|
|
||||||
*/
|
|
||||||
public boolean isRemoteTelnetServer()
|
|
||||||
{
|
|
||||||
return remoteIsTelnetServer;
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* This method sets the terminal width and height to the supplied values. If
|
|
||||||
* either new value differs from the corresponding old value, we initiate a NAWS
|
|
||||||
* subnegotiation to inform the remote endpoint of the new terminal size.
|
|
||||||
*/
|
|
||||||
public void setTerminalSize(int newWidth, int newHeight)
|
|
||||||
{
|
|
||||||
Logger.log("Setting new size: width = " + newWidth + ", height = " + newHeight); //$NON-NLS-1$ //$NON-NLS-2$
|
|
||||||
|
|
||||||
boolean sizeChanged = false;
|
|
||||||
|
|
||||||
if (newWidth != width || newHeight != height)
|
|
||||||
sizeChanged = true;
|
|
||||||
|
|
||||||
width = newWidth;
|
|
||||||
height = newHeight;
|
|
||||||
|
|
||||||
if (sizeChanged && remoteIsTelnetServer && localOptions[TELNET_OPTION_NAWS].isEnabled())
|
|
||||||
{
|
|
||||||
Integer[] sizeData = { new Integer(width), new Integer(height) };
|
|
||||||
|
|
||||||
localOptions[TELNET_OPTION_NAWS].sendSubnegotiation(sizeData);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Returns true if local echoing is enabled for this TCP connection, false otherwise.
|
|
||||||
*/
|
|
||||||
public boolean localEcho()
|
|
||||||
{
|
|
||||||
return localEcho;
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* This method runs in its own thread. It reads raw bytes from the TELNET
|
|
||||||
* connection socket, processes any TELNET protocol bytes (and removes them), and
|
|
||||||
* passes the remaining bytes to a TerminalDisplay object for display.
|
|
||||||
*/
|
|
||||||
public void run()
|
|
||||||
{
|
|
||||||
Logger.log("Entered"); //$NON-NLS-1$
|
|
||||||
|
|
||||||
try
|
|
||||||
{
|
|
||||||
while (socket.isConnected())
|
|
||||||
{
|
|
||||||
int nRawBytes = inputStream.read(rawBytes);
|
|
||||||
|
|
||||||
if (nRawBytes == -1)
|
|
||||||
{
|
|
||||||
// End of input on inputStream.
|
|
||||||
Logger.log("End of input reading from socket!"); //$NON-NLS-1$
|
|
||||||
|
|
||||||
// Announce to the user that the remote endpoint has closed the
|
|
||||||
// connection.
|
|
||||||
|
|
||||||
processedStringBuffer.replace(0, processedStringBuffer.length(),
|
|
||||||
"\rConnection closed by foreign host.\r\n"); //$NON-NLS-1$
|
|
||||||
|
|
||||||
terminalText.setNewText(processedStringBuffer);
|
|
||||||
|
|
||||||
// See the large comment below for an explaination of why we must
|
|
||||||
// call Display.syncExec() instead of Display.asyncExec().
|
|
||||||
|
|
||||||
display.syncExec(terminalText);
|
|
||||||
|
|
||||||
// Tell the TerminalCtrl object that the connection is closed.
|
|
||||||
|
|
||||||
terminalControl.setOpened(false);
|
|
||||||
terminalControl.setConnected(false);
|
|
||||||
|
|
||||||
// Update the Terminal view UI to show a disconnected state. This
|
|
||||||
// ugliness involving Display.asyncExec() is forced on us by the
|
|
||||||
// bad design of class TerminalCtrl, which requires in certain
|
|
||||||
// cases (maybe all?) that TerminalCtrl.execute() is called only
|
|
||||||
// from the display thread.
|
|
||||||
|
|
||||||
Runnable disconnectNotifier = new Thread()
|
|
||||||
{
|
|
||||||
public void run()
|
|
||||||
{
|
|
||||||
terminalControl.execute(ON_TERMINAL_DISCONNECT, null);
|
|
||||||
}
|
|
||||||
};
|
|
||||||
|
|
||||||
display.asyncExec(disconnectNotifier);
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
Logger.log("Received " + nRawBytes + " bytes: '" + //$NON-NLS-1$ //$NON-NLS-2$
|
|
||||||
new String(rawBytes, 0, nRawBytes) + "'"); //$NON-NLS-1$
|
|
||||||
|
|
||||||
// Process any TELNET protocol data that we receive. Don't send
|
|
||||||
// any TELNET protocol data until we are sure the remote endpoint
|
|
||||||
// is a TELNET server.
|
|
||||||
|
|
||||||
int nProcessedBytes = processTelnetProtocol(nRawBytes);
|
|
||||||
|
|
||||||
if (nProcessedBytes > 0)
|
|
||||||
{
|
|
||||||
String strBuffer = new String(processedBytes, 0, nProcessedBytes);
|
|
||||||
|
|
||||||
// An earlier version of this code created a new StringBuffer
|
|
||||||
// object here, but that was unnecessary. Instead, we reuse an
|
|
||||||
// existing object (processedStringBuffer).
|
|
||||||
|
|
||||||
processedStringBuffer.replace(0, processedStringBuffer.length(),
|
|
||||||
strBuffer);
|
|
||||||
|
|
||||||
// Use the TerminalText object to display the text to the
|
|
||||||
// user.
|
|
||||||
|
|
||||||
terminalText.setNewText(processedStringBuffer);
|
|
||||||
|
|
||||||
// Now make the TerminalText object display the processesed
|
|
||||||
// bytes. Its code has to run in the display thread, so we
|
|
||||||
// call syncExec() to do that. We do _not_ call asyncExec()
|
|
||||||
// because asyncExec() does not wait for the Runnable
|
|
||||||
// (TerminalText) to finish. If we were to call asynchExec(),
|
|
||||||
// this loop might race around and call setNewText() on the
|
|
||||||
// terminalText object again before the Display thread gets to
|
|
||||||
// display the previous buffer held by that object. By
|
|
||||||
// blocking here, we avoid that race and also delay the next
|
|
||||||
// call to read(), which keeps the unread data in the kernel,
|
|
||||||
// where it belongs (i.e., we don't have to manage it).
|
|
||||||
//
|
|
||||||
// <soapbox>
|
|
||||||
// The original implementation of this package used asyncExec()
|
|
||||||
// and created a new TerminalText object for each trip through
|
|
||||||
// this loop. Yes, that allowed this thread to speed ahead of
|
|
||||||
// the Display thread. But that only served to make the
|
|
||||||
// Display thread queue all unexecuted TerminalText objects
|
|
||||||
// until they could be executed. That was simply buffering the
|
|
||||||
// undisplayed data in the Display thread instead of in the
|
|
||||||
// kernel, where it belongs. It also rapidly consumed JVM heap
|
|
||||||
// space with all those TerminalText objects waiting to be
|
|
||||||
// garbage collected.
|
|
||||||
// </soapbox>
|
|
||||||
|
|
||||||
display.syncExec(terminalText);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
catch (SocketException ex)
|
|
||||||
{
|
|
||||||
String message = ex.getMessage();
|
|
||||||
|
|
||||||
// A "socket closed" exception is normal here. It's caused by the user
|
|
||||||
// clicking the disconnect button on the Terminal view toolbar.
|
|
||||||
|
|
||||||
if (message != null && !message.equals("socket closed")) //$NON-NLS-1$
|
|
||||||
{
|
|
||||||
Logger.logException(ex);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
catch (Exception ex)
|
|
||||||
{
|
|
||||||
Logger.logException(ex);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* This method initializes the localOptions[] and remoteOptions[] arrays so that
|
|
||||||
* they contain references to TelnetOption objects representing our desired state
|
|
||||||
* for each option. The goal is to achieve server-side echoing, suppression of Go
|
|
||||||
* Aheads, and to send the local terminal type and size to the remote endpoint.
|
|
||||||
*/
|
|
||||||
protected void initializeOptions()
|
|
||||||
{
|
|
||||||
// First, create all the TelnetOption objects in the "undesired" state.
|
|
||||||
|
|
||||||
for (int i = 0; i < localOptions.length; ++i)
|
|
||||||
{
|
|
||||||
localOptions[i] = new TelnetOption((byte)i, false, true, outputStream);
|
|
||||||
}
|
|
||||||
|
|
||||||
for (int i = 0; i < localOptions.length; ++i)
|
|
||||||
{
|
|
||||||
remoteOptions[i] = new TelnetOption((byte)i, false, false, outputStream);
|
|
||||||
}
|
|
||||||
|
|
||||||
// Next, set some of the options to the "desired" state. The options we desire
|
|
||||||
// to be enabled are as follows:
|
|
||||||
//
|
|
||||||
// TELNET Option Desired for Desired for
|
|
||||||
// Name and Code Local Endpoint Remote Endpoint
|
|
||||||
// --------------------- -------------- ---------------
|
|
||||||
// Echo (1) No Yes
|
|
||||||
// Suppress Go Ahead (3) Yes Yes
|
|
||||||
// Terminal Type (24) Yes Yes
|
|
||||||
// NAWS (31) Yes Yes
|
|
||||||
//
|
|
||||||
// All other options remain in the "undesired" state, and thus will be disabled
|
|
||||||
// (since either endpoint can force any option to be disabled by simply
|
|
||||||
// answering WILL with DONT and DO with WONT).
|
|
||||||
|
|
||||||
localOptions[TELNET_OPTION_ECHO].setDesired(false);
|
|
||||||
remoteOptions[TELNET_OPTION_ECHO].setDesired(true);
|
|
||||||
|
|
||||||
localOptions[TELNET_OPTION_SUPPRESS_GA].setDesired(true);
|
|
||||||
remoteOptions[TELNET_OPTION_SUPPRESS_GA].setDesired(true);
|
|
||||||
|
|
||||||
localOptions[TELNET_OPTION_TERMINAL_TYPE].setDesired(true);
|
|
||||||
remoteOptions[TELNET_OPTION_TERMINAL_TYPE].setDesired(true);
|
|
||||||
|
|
||||||
localOptions[TELNET_OPTION_NAWS].setDesired(true);
|
|
||||||
remoteOptions[TELNET_OPTION_NAWS].setDesired(true);
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Process TELNET protocol data contained in the first <i>count</i> bytes of
|
|
||||||
* <i>rawBytes</i>. This function preserves its state between calls, because a
|
|
||||||
* multi-byte TELNET command might be split between two (or more) calls to this
|
|
||||||
* function. The state is preserved in field <i>telnetState</i>. This function
|
|
||||||
* implements an FSA that recognizes TELNET option codes. TELNET option state is
|
|
||||||
* stored in instances of {@link TelnetOption}. TELNET option subnegotiation is
|
|
||||||
* delegated to instances of TelnetOption.
|
|
||||||
*
|
|
||||||
* @return The number of bytes remaining in the buffer after removing all TELNET
|
|
||||||
* protocol bytes.
|
|
||||||
*/
|
|
||||||
protected int processTelnetProtocol(int count)
|
|
||||||
{
|
|
||||||
// This is too noisy to leave on all the time.
|
|
||||||
// Logger.log("Processing " + count + " bytes of data.");
|
|
||||||
|
|
||||||
int nextProcessedByte = 0;
|
|
||||||
|
|
||||||
for (int byteIndex = 0; byteIndex < count; ++byteIndex)
|
|
||||||
{
|
|
||||||
// It is possible for control to flow through the below code such that
|
|
||||||
// nothing happens. This happens when array rawBytes[] contains no TELNET
|
|
||||||
// protocol data.
|
|
||||||
|
|
||||||
byte inputByte = rawBytes[byteIndex];
|
|
||||||
|
|
||||||
switch (telnetState)
|
|
||||||
{
|
|
||||||
case STATE_INITIAL:
|
|
||||||
if (inputByte == TELNET_IAC)
|
|
||||||
{
|
|
||||||
telnetState = STATE_IAC_RECEIVED;
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
// It's not an IAC code, so just append it to processedBytes.
|
|
||||||
|
|
||||||
processedBytes[nextProcessedByte++] = rawBytes[byteIndex];
|
|
||||||
}
|
|
||||||
break;
|
|
||||||
|
|
||||||
case STATE_IAC_RECEIVED:
|
|
||||||
switch (inputByte)
|
|
||||||
{
|
|
||||||
case TELNET_IAC:
|
|
||||||
// Two IAC bytes in a row are translated into one byte with the
|
|
||||||
// value 0xff.
|
|
||||||
|
|
||||||
processedBytes[nextProcessedByte++] = (byte)0xff;
|
|
||||||
telnetState = STATE_INITIAL;
|
|
||||||
break;
|
|
||||||
|
|
||||||
case TELNET_WILL:
|
|
||||||
telnetState = STATE_WILL_RECEIVED;
|
|
||||||
break;
|
|
||||||
|
|
||||||
case TELNET_WONT:
|
|
||||||
telnetState = STATE_WONT_RECEIVED;
|
|
||||||
break;
|
|
||||||
|
|
||||||
case TELNET_DO:
|
|
||||||
telnetState = STATE_DO_RECEIVED;
|
|
||||||
break;
|
|
||||||
|
|
||||||
case TELNET_DONT:
|
|
||||||
telnetState = STATE_DONT_RECEIVED;
|
|
||||||
break;
|
|
||||||
|
|
||||||
case TELNET_SB:
|
|
||||||
telnetState = STATE_SUBNEGOTIATION_STARTED;
|
|
||||||
break;
|
|
||||||
|
|
||||||
// Commands to consume and ignore.
|
|
||||||
|
|
||||||
// Data Mark (DM). This is sent by a TELNET server following an
|
|
||||||
// IAC sent as TCP urgent data. It should cause the client to skip
|
|
||||||
// all not yet processed non-TELNET-protocol data preceding the DM
|
|
||||||
// byte. However, Java 1.4.x has no way to inform clients of class
|
|
||||||
// Socket that urgent data is available, so we simply ignore the
|
|
||||||
// "IAC DM" command. Since the IAC is sent as TCP urgent data, the
|
|
||||||
// Socket must be put into OOB-inline mode via a call to
|
|
||||||
// setOOBInline(true), otherwise the IAC is silently dropped by
|
|
||||||
// Java and only the DM arrives (leaving the user to see a spurious
|
|
||||||
// ISO Latin-1 character).
|
|
||||||
case TELNET_DM:
|
|
||||||
|
|
||||||
case TELNET_NOP: // No-op.
|
|
||||||
case TELNET_GA: // Go Ahead command. Meaningless on a full-duplex link.
|
|
||||||
case TELNET_IP: // Interupt Process command. Server should never send this.
|
|
||||||
case TELNET_AO: // Abort Output command. Server should never send this.
|
|
||||||
case TELNET_AYT: // Are You There command. Server should never send this.
|
|
||||||
case TELNET_EC: // Erase Character command. Server should never send this.
|
|
||||||
case TELNET_EL: // Erase Line command. Server should never send this.
|
|
||||||
telnetState = STATE_INITIAL;
|
|
||||||
break;
|
|
||||||
|
|
||||||
default:
|
|
||||||
// Unrecognized command! This should never happen.
|
|
||||||
Logger.log("processTelnetProtocol: UNRECOGNIZED TELNET PROTOCOL COMMAND: " + //$NON-NLS-1$
|
|
||||||
inputByte);
|
|
||||||
telnetState = STATE_INITIAL;
|
|
||||||
assert false;
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
break;
|
|
||||||
|
|
||||||
// For the next four cases, WILL and WONT commands affect the state of
|
|
||||||
// remote options, and DO and DONT commands affect the state of local
|
|
||||||
// options.
|
|
||||||
|
|
||||||
case STATE_WILL_RECEIVED:
|
|
||||||
Logger.log("Received WILL " + localOptions[inputByte].optionName() + "."); //$NON-NLS-1$ //$NON-NLS-2$
|
|
||||||
remoteOptions[inputByte].handleWill();
|
|
||||||
telnetState = STATE_INITIAL;
|
|
||||||
telnetServerDetected();
|
|
||||||
break;
|
|
||||||
|
|
||||||
case STATE_WONT_RECEIVED:
|
|
||||||
Logger.log("Received WONT " + localOptions[inputByte].optionName() + "."); //$NON-NLS-1$ //$NON-NLS-2$
|
|
||||||
remoteOptions[inputByte].handleWont();
|
|
||||||
telnetState = STATE_INITIAL;
|
|
||||||
telnetServerDetected();
|
|
||||||
break;
|
|
||||||
|
|
||||||
case STATE_DO_RECEIVED:
|
|
||||||
Logger.log("Received DO " + localOptions[inputByte].optionName() + "."); //$NON-NLS-1$ //$NON-NLS-2$
|
|
||||||
localOptions[inputByte].handleDo();
|
|
||||||
telnetState = STATE_INITIAL;
|
|
||||||
telnetServerDetected();
|
|
||||||
break;
|
|
||||||
|
|
||||||
case STATE_DONT_RECEIVED:
|
|
||||||
Logger.log("Received DONT " + localOptions[inputByte].optionName() + "."); //$NON-NLS-1$ //$NON-NLS-2$
|
|
||||||
localOptions[inputByte].handleDont();
|
|
||||||
telnetState = STATE_INITIAL;
|
|
||||||
telnetServerDetected();
|
|
||||||
break;
|
|
||||||
|
|
||||||
case STATE_SUBNEGOTIATION_STARTED:
|
|
||||||
Logger.log("Starting subnegotiation for option " + //$NON-NLS-1$
|
|
||||||
localOptions[inputByte].optionName() + "."); //$NON-NLS-1$
|
|
||||||
|
|
||||||
// First, zero out the array of received subnegotiation butes.
|
|
||||||
|
|
||||||
for (int i = 0; i < receivedSubnegotiation.length; ++i)
|
|
||||||
receivedSubnegotiation[i] = 0;
|
|
||||||
|
|
||||||
// Forget about any previous subnegotiation errors.
|
|
||||||
|
|
||||||
ignoreSubnegotiation = false;
|
|
||||||
|
|
||||||
// Then insert this input byte into the array and enter state
|
|
||||||
// STATE_RECEIVING_SUBNEGOTIATION, where we will gather the remaining
|
|
||||||
// subnegotiation bytes.
|
|
||||||
|
|
||||||
nextSubnegotiationByteIndex = 0;
|
|
||||||
receivedSubnegotiation[nextSubnegotiationByteIndex++] = inputByte;
|
|
||||||
telnetState = STATE_RECEIVING_SUBNEGOTIATION;
|
|
||||||
break;
|
|
||||||
|
|
||||||
case STATE_RECEIVING_SUBNEGOTIATION:
|
|
||||||
if (inputByte == TELNET_IAC)
|
|
||||||
{
|
|
||||||
// Handle double IAC bytes. From RFC 855: "if parameters
|
|
||||||
// in an option 'subnegotiation' include a byte with a value of
|
|
||||||
// 255, it is necessary to double this byte in accordance the
|
|
||||||
// general TELNET rules."
|
|
||||||
|
|
||||||
if (nextSubnegotiationByteIndex > 0 &&
|
|
||||||
receivedSubnegotiation[nextSubnegotiationByteIndex - 1] == TELNET_IAC)
|
|
||||||
{
|
|
||||||
// The last input byte we received in this subnegotiation was
|
|
||||||
// IAC, so this is a double IAC. Leave the previous IAC in the
|
|
||||||
// receivedSubnegotiation[] array and drop the current one
|
|
||||||
// (thus translating a double IAC into a single IAC).
|
|
||||||
|
|
||||||
Logger.log("Double IAC in subnegotiation translated into single IAC."); //$NON-NLS-1$
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
|
|
||||||
// Append the IAC byte to receivedSubnegotiation[]. If there is no
|
|
||||||
// room for the IAC byte, it overwrites the last byte, because we
|
|
||||||
// need to know when the subnegotiation ends, and that is marked by
|
|
||||||
// an "IAC SE" command.
|
|
||||||
|
|
||||||
if (nextSubnegotiationByteIndex < receivedSubnegotiation.length)
|
|
||||||
{
|
|
||||||
receivedSubnegotiation[nextSubnegotiationByteIndex++] = inputByte;
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
receivedSubnegotiation[receivedSubnegotiation.length - 1] = inputByte;
|
|
||||||
}
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
|
|
||||||
// Handle an "IAC SE" command, which marks the end of the
|
|
||||||
// subnegotiation. An SE byte by itself might be a legitimate part of
|
|
||||||
// the subnegotiation data, so don't do anything unless the SE is
|
|
||||||
// immediately preceded by an IAC.
|
|
||||||
|
|
||||||
if (inputByte == TELNET_SE &&
|
|
||||||
receivedSubnegotiation[nextSubnegotiationByteIndex - 1] == TELNET_IAC)
|
|
||||||
{
|
|
||||||
Logger.log("Found SE code marking end of subnegotiation."); //$NON-NLS-1$
|
|
||||||
|
|
||||||
// We are done receiving the subnegotiation command. Now process
|
|
||||||
// it. We always use the option object stored in array
|
|
||||||
// localOptions[] to process the received subnegotiation. This is
|
|
||||||
// an arbitrary decision, but it is sufficient for handling options
|
|
||||||
// TERMINAL-TYPE and NAWS, which are the only options that we
|
|
||||||
// subnegotiate (presently). If, in the future, subnegotiations
|
|
||||||
// need to be handled by option objects stored in both
|
|
||||||
// localOptions[] and remoteOptions[], then some mechanism to
|
|
||||||
// choose the correct option object must be implemented.
|
|
||||||
//
|
|
||||||
// Also, if ignoreSubnegotiation is true, there was an error while
|
|
||||||
// receiving the subnegotiation, so we must not process the
|
|
||||||
// command, and instead just return to the initial state.
|
|
||||||
|
|
||||||
if (!ignoreSubnegotiation)
|
|
||||||
{
|
|
||||||
// Remove the trailing IAC byte from receivedSubnegotiation[].
|
|
||||||
|
|
||||||
receivedSubnegotiation[nextSubnegotiationByteIndex - 1] = 0;
|
|
||||||
|
|
||||||
int subnegotiatedOption = receivedSubnegotiation[0];
|
|
||||||
|
|
||||||
localOptions[subnegotiatedOption].
|
|
||||||
handleSubnegotiation(receivedSubnegotiation,
|
|
||||||
nextSubnegotiationByteIndex);
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
Logger.log("NOT CALLING handleSubnegotiation() BECAUSE OF ERRORS!"); //$NON-NLS-1$
|
|
||||||
}
|
|
||||||
|
|
||||||
// Return to the initial state.
|
|
||||||
|
|
||||||
telnetState = STATE_INITIAL;
|
|
||||||
}
|
|
||||||
|
|
||||||
// Check whether the receivedSubnegotiation[] array is full.
|
|
||||||
|
|
||||||
if (nextSubnegotiationByteIndex >= receivedSubnegotiation.length)
|
|
||||||
{
|
|
||||||
// This should not happen. Array receivedSubnegotiation can hold
|
|
||||||
// 128 bytes, and no TELNET option that we perform subnegotiation
|
|
||||||
// for requires that many bytes in a subnegotiation command. In
|
|
||||||
// the interest of robustness, we handle this case by ignoring all
|
|
||||||
// remaining subnegotiation bytes until we receive the IAC SE
|
|
||||||
// command that ends the subnegotiation. Also, we set
|
|
||||||
// ignoreSubnegotiation to true to prevent a call to
|
|
||||||
// handleSubnegotiation() when the IAC SE command arrives.
|
|
||||||
|
|
||||||
Logger.log("SUBNEGOTIATION BUFFER FULL!"); //$NON-NLS-1$
|
|
||||||
ignoreSubnegotiation = true;
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
Logger.log("Recording subnegotiation byte " + (inputByte & 0xff)); //$NON-NLS-1$
|
|
||||||
|
|
||||||
receivedSubnegotiation[nextSubnegotiationByteIndex++] = inputByte;
|
|
||||||
}
|
|
||||||
break;
|
|
||||||
|
|
||||||
default:
|
|
||||||
// This should _never_ happen! If it does, it means there is a bug in
|
|
||||||
// this FSA. For robustness, we return to the initial state.
|
|
||||||
|
|
||||||
Logger.log("INVALID TELNET STATE: " + telnetState); //$NON-NLS-1$
|
|
||||||
telnetState = STATE_INITIAL;
|
|
||||||
assert false;
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
// Return the number of bytes of processed data (i.e., number of bytes of
|
|
||||||
// raw data minus TELNET control bytes). This value can be zero.
|
|
||||||
|
|
||||||
return nextProcessedByte;
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* This method is called whenever we receive a valid TELNET protocol command from
|
|
||||||
* the remote endpoint. When it is called for the first time for this connection,
|
|
||||||
* we negotiate all options that we desire to be enabled. <p>
|
|
||||||
*
|
|
||||||
* This method does not negotiate options that we do not desire to be enabled,
|
|
||||||
* because all options are initially disabled. <p>
|
|
||||||
*/
|
|
||||||
protected void telnetServerDetected()
|
|
||||||
{
|
|
||||||
if (!remoteIsTelnetServer)
|
|
||||||
{
|
|
||||||
// This block only executes once per TelnetConnection instance.
|
|
||||||
|
|
||||||
localEcho = false;
|
|
||||||
|
|
||||||
Logger.log("Detected TELNET server."); //$NON-NLS-1$
|
|
||||||
|
|
||||||
remoteIsTelnetServer = true;
|
|
||||||
|
|
||||||
for (int i = 0; i < localOptions.length; ++i)
|
|
||||||
{
|
|
||||||
if (localOptions[i].isDesired())
|
|
||||||
{
|
|
||||||
localOptions[i].negotiate();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
for (int i = 0; i < remoteOptions.length; ++i)
|
|
||||||
{
|
|
||||||
if (remoteOptions[i].isDesired())
|
|
||||||
{
|
|
||||||
remoteOptions[i].negotiate();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
|
@ -1,756 +0,0 @@
|
||||||
/*******************************************************************************
|
|
||||||
* Copyright (c) 2006 Wind River Systems, Inc. and others.
|
|
||||||
* All rights reserved. This program and the accompanying materials
|
|
||||||
* are made available under the terms of the Eclipse Public License v1.0
|
|
||||||
* which accompanies this distribution, and is available at
|
|
||||||
* http://www.eclipse.org/legal/epl-v10.html
|
|
||||||
*
|
|
||||||
* Contributors:
|
|
||||||
* Wind River Systems, Inc. - initial implementation
|
|
||||||
*
|
|
||||||
*******************************************************************************/
|
|
||||||
|
|
||||||
|
|
||||||
package org.eclipse.tm.terminal;
|
|
||||||
|
|
||||||
import java.io.IOException;
|
|
||||||
import java.io.OutputStream;
|
|
||||||
import java.util.Date;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* This class represents a single TELNET protocol option at one endpoint of a TELNET
|
|
||||||
* connection. This class encapsulates the endpoint associated with the option (local
|
|
||||||
* or remote), the current state of the option (enabled or disabled), the desired state
|
|
||||||
* of the option, the current state of the negotiation, an OutputStream that allows
|
|
||||||
* communication with the remote endpoint, and the number of negotiations that have
|
|
||||||
* started within this connection. <p>
|
|
||||||
*
|
|
||||||
* In addition to encapsulating the above state, this class performs option negotiation
|
|
||||||
* to attempt to achieve the desired option state. For some options, this class also
|
|
||||||
* performs option sub-negotiation. <p>
|
|
||||||
*
|
|
||||||
* IMPORTANT: Understanding this code requires understanding the TELNET protocol and
|
|
||||||
* TELNET option processing. <p>
|
|
||||||
*
|
|
||||||
* @author Fran Litterio (francis.litterio@windriver.com)
|
|
||||||
*/
|
|
||||||
class TelnetOption implements TelnetCodes
|
|
||||||
{
|
|
||||||
/**
|
|
||||||
* This array of Strings maps an integer TELNET option code value to the symbolic
|
|
||||||
* name of the option. Array elements of the form "?" represent unassigned option
|
|
||||||
* values.
|
|
||||||
*/
|
|
||||||
protected static final String[] optionNames =
|
|
||||||
{
|
|
||||||
"BINARY", // 0 //$NON-NLS-1$
|
|
||||||
"ECHO", // 1 //$NON-NLS-1$
|
|
||||||
"RECONNECTION", // 2 //$NON-NLS-1$
|
|
||||||
"SUPPRESS GO AHEAD", // 3 //$NON-NLS-1$
|
|
||||||
"MSG SIZE NEGOTIATION", // 4 //$NON-NLS-1$
|
|
||||||
"STATUS", // 5 //$NON-NLS-1$
|
|
||||||
"TIMING MARK", // 6 //$NON-NLS-1$
|
|
||||||
"REMOTE CTRL TRANS+ECHO", // 7 //$NON-NLS-1$
|
|
||||||
"OUTPUT LINE WIDTH", // 8 //$NON-NLS-1$
|
|
||||||
"OUTPUT PAGE SIZE", // 9 //$NON-NLS-1$
|
|
||||||
"OUTPUT CR DISPOSITION", // 10 //$NON-NLS-1$
|
|
||||||
"OUTPUT HORIZ TABSTOPS", // 11 //$NON-NLS-1$
|
|
||||||
"OUTPUT HORIZ TAB DISPOSITION", // 12 //$NON-NLS-1$
|
|
||||||
"OUTPUT FORMFEED DISPOSITION", // 13 //$NON-NLS-1$
|
|
||||||
"OUTPUT VERTICAL TABSTOPS", // 14 //$NON-NLS-1$
|
|
||||||
"OUTPUT VT DISPOSITION", // 15 //$NON-NLS-1$
|
|
||||||
"OUTPUT LF DISPOSITION", // 16 //$NON-NLS-1$
|
|
||||||
"EXTENDED ASCII", // 17 //$NON-NLS-1$
|
|
||||||
"LOGOUT", // 18 //$NON-NLS-1$
|
|
||||||
"BYTE MACRO", // 19 //$NON-NLS-1$
|
|
||||||
"DATA ENTRY TERMINAL", // 20 //$NON-NLS-1$
|
|
||||||
"SUPDUP", // 21 //$NON-NLS-1$
|
|
||||||
"SUPDUP OUTPUT", // 22 //$NON-NLS-1$
|
|
||||||
"SEND LOCATION", // 23 //$NON-NLS-1$
|
|
||||||
"TERMINAL TYPE", // 24 //$NON-NLS-1$
|
|
||||||
"END OF RECORD", // 25 //$NON-NLS-1$
|
|
||||||
"TACACS USER IDENTIFICATION", // 26 //$NON-NLS-1$
|
|
||||||
"OUTPUT MARKING", // 27 //$NON-NLS-1$
|
|
||||||
"TERMINAL LOCATION NUMBER", // 28 //$NON-NLS-1$
|
|
||||||
"3270 REGIME", // 29 //$NON-NLS-1$
|
|
||||||
"X.3 PAD", // 30 //$NON-NLS-1$
|
|
||||||
"NEGOTIATE ABOUT WINDOW SIZE", // 31 //$NON-NLS-1$
|
|
||||||
"TERMINAL SPEED", // 32 //$NON-NLS-1$
|
|
||||||
"REMOTE FLOW CONTROL", // 33 //$NON-NLS-1$
|
|
||||||
"LINEMODE", // 34 //$NON-NLS-1$
|
|
||||||
"X DISPLAY LOCATION", // 35 //$NON-NLS-1$
|
|
||||||
"ENVIRONMENT OPTION", // 36 //$NON-NLS-1$
|
|
||||||
"AUTHENTICATION OPTION", // 37 //$NON-NLS-1$
|
|
||||||
"ENCRYPTION OPTION", // 38 //$NON-NLS-1$
|
|
||||||
"NEW ENVIRONMENT OPTION", // 39 //$NON-NLS-1$
|
|
||||||
"TN3270E", // 40 //$NON-NLS-1$
|
|
||||||
"XAUTH", // 41 //$NON-NLS-1$
|
|
||||||
"CHARSET", // 42 //$NON-NLS-1$
|
|
||||||
"REMOTE SERIAL PORT", // 43 //$NON-NLS-1$
|
|
||||||
"COM PORT CONTROL OPTION", // 44 //$NON-NLS-1$
|
|
||||||
"SUPPRESS LOCAL ECHO", // 45 //$NON-NLS-1$
|
|
||||||
"START TLS", // 46 //$NON-NLS-1$
|
|
||||||
"KERMIT", // 47 //$NON-NLS-1$
|
|
||||||
"SEND URL", // 48 //$NON-NLS-1$
|
|
||||||
"FORWARD X", // 49 //$NON-NLS-1$
|
|
||||||
"?", "?", "?", "?", "?", "?", "?", "?", "?", "?", // 50 ... //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$ //$NON-NLS-4$ //$NON-NLS-5$ //$NON-NLS-6$ //$NON-NLS-7$ //$NON-NLS-8$ //$NON-NLS-9$ //$NON-NLS-10$
|
|
||||||
"?", "?", "?", "?", "?", "?", "?", "?", "?", "?", //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$ //$NON-NLS-4$ //$NON-NLS-5$ //$NON-NLS-6$ //$NON-NLS-7$ //$NON-NLS-8$ //$NON-NLS-9$ //$NON-NLS-10$
|
|
||||||
"?", "?", "?", "?", "?", "?", "?", "?", "?", "?", //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$ //$NON-NLS-4$ //$NON-NLS-5$ //$NON-NLS-6$ //$NON-NLS-7$ //$NON-NLS-8$ //$NON-NLS-9$ //$NON-NLS-10$
|
|
||||||
"?", "?", "?", "?", "?", "?", "?", "?", "?", "?", //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$ //$NON-NLS-4$ //$NON-NLS-5$ //$NON-NLS-6$ //$NON-NLS-7$ //$NON-NLS-8$ //$NON-NLS-9$ //$NON-NLS-10$
|
|
||||||
"?", "?", "?", "?", "?", "?", "?", "?", "?", "?", //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$ //$NON-NLS-4$ //$NON-NLS-5$ //$NON-NLS-6$ //$NON-NLS-7$ //$NON-NLS-8$ //$NON-NLS-9$ //$NON-NLS-10$
|
|
||||||
"?", "?", "?", "?", "?", "?", "?", "?", "?", "?", //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$ //$NON-NLS-4$ //$NON-NLS-5$ //$NON-NLS-6$ //$NON-NLS-7$ //$NON-NLS-8$ //$NON-NLS-9$ //$NON-NLS-10$
|
|
||||||
"?", "?", "?", "?", "?", "?", "?", "?", "?", "?", //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$ //$NON-NLS-4$ //$NON-NLS-5$ //$NON-NLS-6$ //$NON-NLS-7$ //$NON-NLS-8$ //$NON-NLS-9$ //$NON-NLS-10$
|
|
||||||
"?", "?", "?", "?", "?", "?", "?", "?", "?", "?", //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$ //$NON-NLS-4$ //$NON-NLS-5$ //$NON-NLS-6$ //$NON-NLS-7$ //$NON-NLS-8$ //$NON-NLS-9$ //$NON-NLS-10$
|
|
||||||
"?", "?", "?", "?", "?", "?", "?", // ... 137 //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$ //$NON-NLS-4$ //$NON-NLS-5$ //$NON-NLS-6$ //$NON-NLS-7$
|
|
||||||
"TELOPT PRAGMA LOGON", // 138 //$NON-NLS-1$
|
|
||||||
"TELOPT SSPI LOGON", // 139 //$NON-NLS-1$
|
|
||||||
"TELOPT PRAGMA HEARTBEAT", // 140 //$NON-NLS-1$
|
|
||||||
"?", "?", "?", "?", "?", "?", "?", "?", "?", "?", // 141 ... //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$ //$NON-NLS-4$ //$NON-NLS-5$ //$NON-NLS-6$ //$NON-NLS-7$ //$NON-NLS-8$ //$NON-NLS-9$ //$NON-NLS-10$
|
|
||||||
"?", "?", "?", "?", "?", "?", "?", "?", "?", "?", //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$ //$NON-NLS-4$ //$NON-NLS-5$ //$NON-NLS-6$ //$NON-NLS-7$ //$NON-NLS-8$ //$NON-NLS-9$ //$NON-NLS-10$
|
|
||||||
"?", "?", "?", "?", "?", "?", "?", "?", "?", "?", //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$ //$NON-NLS-4$ //$NON-NLS-5$ //$NON-NLS-6$ //$NON-NLS-7$ //$NON-NLS-8$ //$NON-NLS-9$ //$NON-NLS-10$
|
|
||||||
"?", "?", "?", "?", "?", "?", "?", "?", "?", "?", //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$ //$NON-NLS-4$ //$NON-NLS-5$ //$NON-NLS-6$ //$NON-NLS-7$ //$NON-NLS-8$ //$NON-NLS-9$ //$NON-NLS-10$
|
|
||||||
"?", "?", "?", "?", "?", "?", "?", "?", "?", "?", //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$ //$NON-NLS-4$ //$NON-NLS-5$ //$NON-NLS-6$ //$NON-NLS-7$ //$NON-NLS-8$ //$NON-NLS-9$ //$NON-NLS-10$
|
|
||||||
"?", "?", "?", "?", "?", "?", "?", "?", "?", "?", //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$ //$NON-NLS-4$ //$NON-NLS-5$ //$NON-NLS-6$ //$NON-NLS-7$ //$NON-NLS-8$ //$NON-NLS-9$ //$NON-NLS-10$
|
|
||||||
"?", "?", "?", "?", "?", "?", "?", "?", "?", "?", //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$ //$NON-NLS-4$ //$NON-NLS-5$ //$NON-NLS-6$ //$NON-NLS-7$ //$NON-NLS-8$ //$NON-NLS-9$ //$NON-NLS-10$
|
|
||||||
"?", "?", "?", "?", "?", "?", "?", "?", "?", "?", //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$ //$NON-NLS-4$ //$NON-NLS-5$ //$NON-NLS-6$ //$NON-NLS-7$ //$NON-NLS-8$ //$NON-NLS-9$ //$NON-NLS-10$
|
|
||||||
"?", "?", "?", "?", "?", "?", "?", "?", "?", "?", //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$ //$NON-NLS-4$ //$NON-NLS-5$ //$NON-NLS-6$ //$NON-NLS-7$ //$NON-NLS-8$ //$NON-NLS-9$ //$NON-NLS-10$
|
|
||||||
"?", "?", "?", "?", "?", "?", "?", "?", "?", "?", //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$ //$NON-NLS-4$ //$NON-NLS-5$ //$NON-NLS-6$ //$NON-NLS-7$ //$NON-NLS-8$ //$NON-NLS-9$ //$NON-NLS-10$
|
|
||||||
"?", "?", "?", "?", "?", "?", "?", "?", "?", "?", //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$ //$NON-NLS-4$ //$NON-NLS-5$ //$NON-NLS-6$ //$NON-NLS-7$ //$NON-NLS-8$ //$NON-NLS-9$ //$NON-NLS-10$
|
|
||||||
"?", "?", "?", "?", // ... 254 //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$ //$NON-NLS-4$
|
|
||||||
"EXTENDED OPTIONS LIST" // 255 //$NON-NLS-1$
|
|
||||||
};
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Negotiation state: Negotiation not yet started for this option. <p>
|
|
||||||
*
|
|
||||||
* This constant and the others having similar names represent the states of a
|
|
||||||
* finite state automaton (FSA) that tracks the negotiation state of this option.
|
|
||||||
* The initial state is NEGOTIATION_NOT_STARTED. The state machine is as follows
|
|
||||||
* (with transitions labelled with letters in parentheses): <p>
|
|
||||||
*
|
|
||||||
* <pre>
|
|
||||||
* NEGOTIATION_NOT_STARTED -----> {@link #NEGOTIATION_IN_PROGRESS}
|
|
||||||
* | (A) | ^
|
|
||||||
* (C)| (B)| |(D)
|
|
||||||
* | V |
|
|
||||||
* +--------> {@link #NEGOTIATION_DONE}
|
|
||||||
* </pre> <p>
|
|
||||||
*
|
|
||||||
* Once the FSA leaves state NEGOTIATION_NOT_STARTED, it never returns to that
|
|
||||||
* state. Transition A happens when the local endpoint sends an option command
|
|
||||||
* before receiving a command for the same option from the remote endpoint. <p>
|
|
||||||
*
|
|
||||||
* Transition B happens when the local endpoint receives a reply to an option
|
|
||||||
* command sent earlier by the local endpoint. Receipt of that reply terminates
|
|
||||||
* the negotiation. <p>
|
|
||||||
*
|
|
||||||
* Transition D happens after negotiation is done and "something changes" (see the
|
|
||||||
* RFCs for the definition of "something changes"). Either endpoint can
|
|
||||||
* re-negotiate an option after a previous negotiation, but only if some external
|
|
||||||
* influence (such as the user or the OS) causes it to do so. Re-negotiation must
|
|
||||||
* start more than {@link #NEGOTIATION_IGNORE_DURATION} milliseconds after the FSA
|
|
||||||
* enters state NEGOTIATION_DONE or it will be ignored. This is how this client
|
|
||||||
* prevents negotiation loops. <p>
|
|
||||||
*
|
|
||||||
* Transition C happens when the local endpoint receives an option command from the
|
|
||||||
* remote endpoint before sending a command for the same option. In that case, the
|
|
||||||
* local endpoint replies immediately with an option command and the negotitation
|
|
||||||
* terminates. <p>
|
|
||||||
*
|
|
||||||
* Some TELNET servers (e.g., the Solaris server), after sending WILL and receiving
|
|
||||||
* DONT, will reply with a superfluous WONT. Any such superfluous option command
|
|
||||||
* received from the remote endpoint while the option's FSA is in state
|
|
||||||
* {@link #NEGOTIATION_DONE} will be ignored by the local endpoint.
|
|
||||||
*/
|
|
||||||
protected static final int NEGOTIATION_NOT_STARTED = 0;
|
|
||||||
|
|
||||||
/** Negotiation state: Negotiation is in progress for this option. */
|
|
||||||
protected static final int NEGOTIATION_IN_PROGRESS = 1;
|
|
||||||
|
|
||||||
/** Negotiation state: Negotiation has terminated for this option. */
|
|
||||||
protected static final int NEGOTIATION_DONE = 2;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* The number of milliseconds following the end of negotiation of this option
|
|
||||||
* before which the remote endpoint can re-negotiate the option. Any option
|
|
||||||
* command received from the remote endpoint before this time passes is ignored.
|
|
||||||
* This is used to prevent option negotiation loops.
|
|
||||||
*
|
|
||||||
* @see #ignoreNegotiation()
|
|
||||||
* @see #negotiationCompletionTime
|
|
||||||
*/
|
|
||||||
protected static final int NEGOTIATION_IGNORE_DURATION = 30000;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* This field holds the current negotiation state for this option.
|
|
||||||
*/
|
|
||||||
protected int negotiationState = NEGOTIATION_NOT_STARTED;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* This field holds the time when negotiation of this option most recently
|
|
||||||
* terminated (i.e., entered state {@link #NEGOTIATION_DONE}). This is used to
|
|
||||||
* determine whether an option command received from the remote endpoint after
|
|
||||||
* negotiation has terminated for this option is to be ignored or interpreted as
|
|
||||||
* the start of a new negotiation.
|
|
||||||
*
|
|
||||||
* @see #NEGOTIATION_IGNORE_DURATION
|
|
||||||
*/
|
|
||||||
protected Date negotiationCompletionTime = new Date(0);
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Holds the total number of negotiations that have completed for this option.
|
|
||||||
*/
|
|
||||||
protected int negotiationCount = 0;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Holds the integer code representing the option.
|
|
||||||
*/
|
|
||||||
protected byte option = 0;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Holds the OutputStream object that allows data to be sent to the remote endpoint
|
|
||||||
* of the TELNET connection.
|
|
||||||
*/
|
|
||||||
protected OutputStream outputStream;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* True if this option is for the local endpoint, false for the remote endpoint.
|
|
||||||
*/
|
|
||||||
protected boolean local = true;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* This field is true if the option is enabled, false if it is disabled. All
|
|
||||||
* options are initially disabled until they are negotiated to be enabled. <p>
|
|
||||||
*/
|
|
||||||
protected boolean enabled = false;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* This field is true if the client desires the option to be enabled, false if the
|
|
||||||
* client desires the option to be disabled. This field does not represent the
|
|
||||||
* remote's endpoints desire (as expressed via WILL and WONT commands) -- it
|
|
||||||
* represnet the local endpoint's desire. <p>
|
|
||||||
*
|
|
||||||
* @see #setDesired(boolean)
|
|
||||||
*/
|
|
||||||
protected boolean desired = false;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Constructor. <p>
|
|
||||||
*
|
|
||||||
* @param option The integer code of this option.
|
|
||||||
* @param desired Whether we desire this option to be enabled.
|
|
||||||
* @param local Whether this option is for the local or remote endpoint.
|
|
||||||
* @param outputStream A stream used to negotiate with the remote endpoint.
|
|
||||||
*/
|
|
||||||
TelnetOption(byte option, boolean desired, boolean local, OutputStream outputStream)
|
|
||||||
{
|
|
||||||
this.option = option;
|
|
||||||
this.desired = desired;
|
|
||||||
this.local = local;
|
|
||||||
this.outputStream = outputStream;
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @return Returns a String containing the name of the TELNET option specified in
|
|
||||||
* parameter <i>option</i>.
|
|
||||||
*/
|
|
||||||
public String optionName()
|
|
||||||
{
|
|
||||||
return optionNames[option];
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Returns true if this option is enabled, false if it is disabled. <p>
|
|
||||||
*
|
|
||||||
* @return Returns true if this option is enabled, false if it is disabled.
|
|
||||||
*/
|
|
||||||
public boolean isEnabled()
|
|
||||||
{
|
|
||||||
return enabled;
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Enables this option if <i>newValue</i> is true, otherwise disables this
|
|
||||||
* option. <p>
|
|
||||||
*
|
|
||||||
* @param newValue True if this option is to be enabled, false otherwise.
|
|
||||||
*/
|
|
||||||
public void setEnabled(boolean newValue)
|
|
||||||
{
|
|
||||||
Logger.log("Enabling " + (local ? "local" : "remote") + " option " + //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$ //$NON-NLS-4$
|
|
||||||
optionName());
|
|
||||||
enabled = newValue;
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Returns true if the local endpoint desires this option to be enabled, false if
|
|
||||||
* not. It is not an error for the value returned by this method to differ from
|
|
||||||
* the value returned by isEnabled(). The value returned by this method can change
|
|
||||||
* over time, reflecting the local endpoint's changing desire regarding the
|
|
||||||
* option. <p>
|
|
||||||
*
|
|
||||||
* NOTE: Even if this option represents a remote endpoint option, the return value
|
|
||||||
* of this method represents the local endpint's desire regarding the remote
|
|
||||||
* option. <p>
|
|
||||||
*
|
|
||||||
* @return Returns true if the local endpoint desires this option to be enabled,
|
|
||||||
* false if not.
|
|
||||||
*/
|
|
||||||
public boolean isDesired()
|
|
||||||
{
|
|
||||||
return desired;
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Sets our desired value for this option. Note that the option can be desired
|
|
||||||
* when <i>enabled</i> is false, and the option can be undesired when
|
|
||||||
* <i>enabled</i> is true, though the latter state should not persist, since either
|
|
||||||
* endpoint can disable any option at any time. <p>
|
|
||||||
*
|
|
||||||
* @param newValue True if we desire this option to be enabled, false if
|
|
||||||
* we desire this option to be disabled.
|
|
||||||
*/
|
|
||||||
public void setDesired(boolean newValue)
|
|
||||||
{
|
|
||||||
if (newValue)
|
|
||||||
Logger.log("Setting " + (local ? "local" : "remote") + " option " + //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$ //$NON-NLS-4$
|
|
||||||
optionName() + " as desired."); //$NON-NLS-1$
|
|
||||||
|
|
||||||
desired = newValue;
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Call this method to request that negotiation begin for this option. This method
|
|
||||||
* does nothing if negotiation for this option has already started or is already
|
|
||||||
* complete. If negotiation has not yet started for this option and the local
|
|
||||||
* endpoint desires this option to be enabled, then we send a WILL or DO command to
|
|
||||||
* the remote endpoint.
|
|
||||||
*/
|
|
||||||
public void negotiate()
|
|
||||||
{
|
|
||||||
if (negotiationState == NEGOTIATION_NOT_STARTED && desired)
|
|
||||||
{
|
|
||||||
if (local)
|
|
||||||
{
|
|
||||||
Logger.log("Starting negotiation for local option " + optionName()); //$NON-NLS-1$
|
|
||||||
sendWill();
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
Logger.log("Starting negotiation for remote option " + optionName()); //$NON-NLS-1$
|
|
||||||
sendDo();
|
|
||||||
}
|
|
||||||
|
|
||||||
negotiationState = NEGOTIATION_IN_PROGRESS;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* This method is called whenever we receive a WILL command from the remote
|
|
||||||
* endpoint.
|
|
||||||
*/
|
|
||||||
public void handleWill()
|
|
||||||
{
|
|
||||||
if (negotiationState == NEGOTIATION_DONE && ignoreNegotiation())
|
|
||||||
{
|
|
||||||
Logger.log("Ignoring superfluous WILL command from remote endpoint."); //$NON-NLS-1$
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (negotiationState == NEGOTIATION_IN_PROGRESS)
|
|
||||||
{
|
|
||||||
if (desired)
|
|
||||||
{
|
|
||||||
// We sent DO and server replied with WILL. Enable the option, and end
|
|
||||||
// this negotiation.
|
|
||||||
|
|
||||||
enabled = true;
|
|
||||||
Logger.log("Enabling remote option " + optionName() + "."); //$NON-NLS-1$ //$NON-NLS-2$
|
|
||||||
endNegotiation();
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
// This should never happen! We sent DONT and the server replied with
|
|
||||||
// WILL. Bad server. No soup for you. Disable the option, and end
|
|
||||||
// this negotiation.
|
|
||||||
|
|
||||||
Logger.log("Server answered DONT with WILL!"); //$NON-NLS-1$
|
|
||||||
enabled = false;
|
|
||||||
Logger.log("Disabling remote option " + optionName() + "."); //$NON-NLS-1$ //$NON-NLS-2$
|
|
||||||
endNegotiation();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
if (desired)
|
|
||||||
{
|
|
||||||
// Server sent WILL, so we reply with DO. Enable the option, and end
|
|
||||||
// this negotiation.
|
|
||||||
|
|
||||||
sendDo();
|
|
||||||
enabled = true;
|
|
||||||
Logger.log("Enabling remote option " + optionName() + "."); //$NON-NLS-1$ //$NON-NLS-2$
|
|
||||||
endNegotiation();
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
// Server sent WILL, so we reply with DONT. Disable the option, and
|
|
||||||
// end this negotiation.
|
|
||||||
|
|
||||||
sendDont();
|
|
||||||
enabled = false;
|
|
||||||
Logger.log("Disabling remote option " + optionName() + "."); //$NON-NLS-1$ //$NON-NLS-2$
|
|
||||||
endNegotiation();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Handles a WONT command sent by the remote endpoint for this option. The value
|
|
||||||
* of <i>desired</i> doesn't matter in this method, because the remote endpoint is
|
|
||||||
* forcing the option to be disabled.
|
|
||||||
*/
|
|
||||||
public void handleWont()
|
|
||||||
{
|
|
||||||
if (negotiationState == NEGOTIATION_DONE && ignoreNegotiation())
|
|
||||||
{
|
|
||||||
Logger.log("Ignoring superfluous WONT command from remote endpoint."); //$NON-NLS-1$
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (negotiationState == NEGOTIATION_IN_PROGRESS)
|
|
||||||
{
|
|
||||||
// We sent DO or DONT and server replied with WONT. Disable the
|
|
||||||
// option, and end this negotiation.
|
|
||||||
|
|
||||||
enabled = false;
|
|
||||||
Logger.log("Disabling remote option " + optionName() + "."); //$NON-NLS-1$ //$NON-NLS-2$
|
|
||||||
endNegotiation();
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
// Server sent WONT, so we reply with DONT. Disable the option, and
|
|
||||||
// end this negotiation.
|
|
||||||
|
|
||||||
sendDont();
|
|
||||||
enabled = false;
|
|
||||||
Logger.log("Disabling remote option " + optionName() + "."); //$NON-NLS-1$ //$NON-NLS-2$
|
|
||||||
endNegotiation();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Handles a DO command sent by the remote endpoint for this option.
|
|
||||||
*/
|
|
||||||
public void handleDo()
|
|
||||||
{
|
|
||||||
if (negotiationState == NEGOTIATION_DONE && ignoreNegotiation())
|
|
||||||
{
|
|
||||||
Logger.log("Ignoring superfluous DO command from remote endpoint."); //$NON-NLS-1$
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (negotiationState == NEGOTIATION_IN_PROGRESS)
|
|
||||||
{
|
|
||||||
if (desired)
|
|
||||||
{
|
|
||||||
// We sent WILL and server replied with DO. Enable the option, and end
|
|
||||||
// this negotiation.
|
|
||||||
|
|
||||||
enabled = true;
|
|
||||||
Logger.log("Enabling local option " + optionName() + "."); //$NON-NLS-1$ //$NON-NLS-2$
|
|
||||||
endNegotiation();
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
// We sent WONT and server replied with DO. This should never happen!
|
|
||||||
// Bad server. No soup for you. Disable the option, and end this
|
|
||||||
// negotiation.
|
|
||||||
|
|
||||||
Logger.log("Server answered WONT with DO!"); //$NON-NLS-1$
|
|
||||||
enabled = false;
|
|
||||||
Logger.log("Disabling local option " + optionName() + "."); //$NON-NLS-1$ //$NON-NLS-2$
|
|
||||||
endNegotiation();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
if (desired)
|
|
||||||
{
|
|
||||||
// Server sent DO, so we reply with WILL. Enable the option, and end
|
|
||||||
// this negotiation.
|
|
||||||
|
|
||||||
sendWill();
|
|
||||||
enabled = true;
|
|
||||||
Logger.log("Enabling local option " + optionName() + "."); //$NON-NLS-1$ //$NON-NLS-2$
|
|
||||||
endNegotiation();
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
// Server sent DO, so we reply with WONT. Disable the option, and end
|
|
||||||
// this negotiation.
|
|
||||||
|
|
||||||
sendWont();
|
|
||||||
enabled = false;
|
|
||||||
Logger.log("Disabling local option " + optionName() + "."); //$NON-NLS-1$ //$NON-NLS-2$
|
|
||||||
endNegotiation();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Handles a DONT command sent by the remote endpoint for this option. The value
|
|
||||||
* of <i>desired</i> doesn't matter in this method, because the remote endpoint is
|
|
||||||
* forcing the option to be disabled.
|
|
||||||
*/
|
|
||||||
public void handleDont()
|
|
||||||
{
|
|
||||||
if (negotiationState == NEGOTIATION_DONE && ignoreNegotiation())
|
|
||||||
{
|
|
||||||
Logger.log("Ignoring superfluous DONT command from remote endpoint."); //$NON-NLS-1$
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (negotiationState == NEGOTIATION_IN_PROGRESS)
|
|
||||||
{
|
|
||||||
// We sent WILL or WONT and server replied with DONT. Disable the
|
|
||||||
// option, and end this negotiation.
|
|
||||||
|
|
||||||
enabled = false;
|
|
||||||
Logger.log("Disabling local option " + optionName() + "."); //$NON-NLS-1$ //$NON-NLS-2$
|
|
||||||
endNegotiation();
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
// Server sent DONT, so we reply with WONT. Disable the option, and end
|
|
||||||
// this negotiation.
|
|
||||||
|
|
||||||
sendWont();
|
|
||||||
enabled = false;
|
|
||||||
Logger.log("Disabling local option " + optionName() + "."); //$NON-NLS-1$ //$NON-NLS-2$
|
|
||||||
endNegotiation();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* This method handles a subnegotiation command received from the remote endpoint.
|
|
||||||
* Currently, the only subnegotiation we handle is when the remote endpoint
|
|
||||||
* commands us to send our terminal type (which is "ansi").
|
|
||||||
*
|
|
||||||
* @param subnegotiationData An array of bytes containing a TELNET
|
|
||||||
* subnegotiation command received from the
|
|
||||||
* remote endpoint.
|
|
||||||
* @param count The number of bytes in array
|
|
||||||
* subnegotiationData to examine.
|
|
||||||
*/
|
|
||||||
public void handleSubnegotiation(byte[] subnegotiationData, int count)
|
|
||||||
{
|
|
||||||
switch (option)
|
|
||||||
{
|
|
||||||
case TELNET_OPTION_TERMINAL_TYPE:
|
|
||||||
if (subnegotiationData[1] != TELNET_SEND)
|
|
||||||
{
|
|
||||||
// This should never happen!
|
|
||||||
Logger.log("Invalid TERMINAL-TYPE subnegotiation command from remote endpoint: " + //$NON-NLS-1$
|
|
||||||
(subnegotiationData[1] & 0xff));
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
|
|
||||||
// Tell the remote endpoint our terminal type is "ansi" using this sequence
|
|
||||||
// of TELNET protocol bytes:
|
|
||||||
//
|
|
||||||
// IAC SB TERMINAL-TYPE IS a n s i IAC SE
|
|
||||||
|
|
||||||
byte[] terminalTypeData = { TELNET_IAC, TELNET_SB, TELNET_OPTION_TERMINAL_TYPE,
|
|
||||||
TELNET_IS, (byte)'a', (byte)'n', (byte)'s', (byte)'i',
|
|
||||||
TELNET_IAC, TELNET_SE };
|
|
||||||
|
|
||||||
try
|
|
||||||
{
|
|
||||||
outputStream.write(terminalTypeData);
|
|
||||||
}
|
|
||||||
catch (IOException ex)
|
|
||||||
{
|
|
||||||
Logger.log("IOException sending TERMINAL-TYPE subnegotiation!"); //$NON-NLS-1$
|
|
||||||
Logger.logException(ex);
|
|
||||||
}
|
|
||||||
break;
|
|
||||||
|
|
||||||
default:
|
|
||||||
// This should never happen!
|
|
||||||
Logger.log("SHOULD NOT BE REACHED: Called for option " + optionName()); //$NON-NLS-1$
|
|
||||||
assert false;
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* This method sends a subnegotiation command to the remote endpoint.
|
|
||||||
*
|
|
||||||
* @param subnegotiationData An array of Objects holding data to be used
|
|
||||||
* when generating the outbound subnegotiation
|
|
||||||
* command.
|
|
||||||
*/
|
|
||||||
public void sendSubnegotiation(Object[] subnegotiationData)
|
|
||||||
{
|
|
||||||
switch (option)
|
|
||||||
{
|
|
||||||
case TELNET_OPTION_NAWS:
|
|
||||||
// Get the width and height of the view and send it to the remote
|
|
||||||
// endpoint using this sequence of TELNET protocol bytes:
|
|
||||||
//
|
|
||||||
// IAC SB NAWS <width-highbyte> <width-lowbyte> <height-highbyte>
|
|
||||||
// <height-lowbyte> IAC SE
|
|
||||||
|
|
||||||
byte[] NAWSData = { TELNET_IAC, TELNET_SB, TELNET_OPTION_NAWS,
|
|
||||||
0, 0, 0, 0, TELNET_IAC, TELNET_SE };
|
|
||||||
int width = ((Integer)subnegotiationData[0]).intValue();
|
|
||||||
int height = ((Integer)subnegotiationData[1]).intValue();
|
|
||||||
|
|
||||||
NAWSData[3] = (byte)((width >>> 8) & 0xff); // High order byte of width.
|
|
||||||
NAWSData[4] = (byte)(width & 0xff); // Low order byte of width.
|
|
||||||
NAWSData[5] = (byte)((height >>> 8) & 0xff); // High order byte of height.
|
|
||||||
NAWSData[6] = (byte)(height & 0xff); // Low order byte of height.
|
|
||||||
|
|
||||||
Logger.log("sending terminal size to remote endpoint: width = " + width + //$NON-NLS-1$
|
|
||||||
", height = " + height + "."); //$NON-NLS-1$ //$NON-NLS-2$
|
|
||||||
|
|
||||||
// This final local variable is a hack to get around the fact that inner
|
|
||||||
// classes cannot reference a non-final local variable in a lexically
|
|
||||||
// enclosing scope.
|
|
||||||
|
|
||||||
final byte[] NAWSDataFinal = NAWSData;
|
|
||||||
|
|
||||||
// Send the NAWS data in a new thread. The current thread is the display
|
|
||||||
// thread, and calls to write() can block, but blocking the display thread
|
|
||||||
// is _bad_ (it hangs the GUI).
|
|
||||||
|
|
||||||
new Thread()
|
|
||||||
{
|
|
||||||
public void run()
|
|
||||||
{
|
|
||||||
try
|
|
||||||
{
|
|
||||||
outputStream.write(NAWSDataFinal);
|
|
||||||
}
|
|
||||||
catch (IOException ex)
|
|
||||||
{
|
|
||||||
Logger.log("IOException sending NAWS subnegotiation!"); //$NON-NLS-1$
|
|
||||||
Logger.logException(ex);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}.start();
|
|
||||||
break;
|
|
||||||
|
|
||||||
default:
|
|
||||||
// This should never happen!
|
|
||||||
Logger.log("SHOULD NOT BE REACHED: Called for option " + optionName()); //$NON-NLS-1$
|
|
||||||
assert false;
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
/**
|
|
||||||
* This method returns true if there has not yet been any negotiation of this
|
|
||||||
* option.
|
|
||||||
*
|
|
||||||
* @return Returns true if there has not yet been any negotiation of this option.
|
|
||||||
*/
|
|
||||||
protected boolean notYetNegotiated()
|
|
||||||
{
|
|
||||||
return negotiationState == NEGOTIATION_NOT_STARTED;
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* This method terminates the current negotiation and records the time at which the
|
|
||||||
* negotiation terminated.
|
|
||||||
*/
|
|
||||||
protected void endNegotiation()
|
|
||||||
{
|
|
||||||
Logger.log("Ending negotiation #" + negotiationCount + " for " + //$NON-NLS-1$ //$NON-NLS-2$
|
|
||||||
(local ? "local" : "remote") + " option " + optionName()); //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$
|
|
||||||
negotiationState = NEGOTIATION_DONE;
|
|
||||||
negotiationCompletionTime.setTime(System.currentTimeMillis());
|
|
||||||
++negotiationCount;
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* This method determines whether or not to ignore what appears to be a new
|
|
||||||
* negotiation initiated by the remote endpoint. This is needed because some
|
|
||||||
* TELNET servers send superfluous option commands that a naive client might
|
|
||||||
* interpret as the start of a new negotiation. If the superfluous command is not
|
|
||||||
* ignored, an option negotiation loop can result (which is bad). For details
|
|
||||||
* about the superfluous commands sent by some servers, see the documentation for
|
|
||||||
* {@link #NEGOTIATION_NOT_STARTED}. <p>
|
|
||||||
*
|
|
||||||
* The current implementation of this method returns true if the new negotiation
|
|
||||||
* starts within NEGOTIATION_IGNORE_DURATION seconds of the end of the previous
|
|
||||||
* negotiation of this option. <p>
|
|
||||||
*
|
|
||||||
* @return Returns true if the new negotiation should be ignored, false if not.
|
|
||||||
*/
|
|
||||||
protected boolean ignoreNegotiation()
|
|
||||||
{
|
|
||||||
return (System.currentTimeMillis() - negotiationCompletionTime.getTime()) >
|
|
||||||
NEGOTIATION_IGNORE_DURATION;
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Sends a DO command to the remote endpoint for this option.
|
|
||||||
*/
|
|
||||||
protected void sendDo()
|
|
||||||
{
|
|
||||||
Logger.log("Sending DO " + optionName()); //$NON-NLS-1$
|
|
||||||
sendCommand(TELNET_DO);
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Sends a DONT command to the remote endpoint for this option.
|
|
||||||
*/
|
|
||||||
protected void sendDont()
|
|
||||||
{
|
|
||||||
Logger.log("Sending DONT " + optionName()); //$NON-NLS-1$
|
|
||||||
sendCommand(TELNET_DONT);
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Sends a WILL command to the remote endpoint for this option.
|
|
||||||
*/
|
|
||||||
protected void sendWill()
|
|
||||||
{
|
|
||||||
Logger.log("Sending WILL " + optionName()); //$NON-NLS-1$
|
|
||||||
sendCommand(TELNET_WILL);
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Sends a WONT command to the remote endpoint for this option.
|
|
||||||
*/
|
|
||||||
protected void sendWont()
|
|
||||||
{
|
|
||||||
Logger.log("Sending WONT " + optionName()); //$NON-NLS-1$
|
|
||||||
sendCommand(TELNET_WONT);
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* This method sends a WILL/WONT/DO/DONT command to the remote endpoint for this
|
|
||||||
* option.
|
|
||||||
*/
|
|
||||||
protected void sendCommand(byte command)
|
|
||||||
{
|
|
||||||
byte[] data = { TELNET_IAC, 0, 0 };
|
|
||||||
|
|
||||||
data[1] = command;
|
|
||||||
data[2] = option;
|
|
||||||
|
|
||||||
try
|
|
||||||
{
|
|
||||||
outputStream.write(data);
|
|
||||||
}
|
|
||||||
catch (IOException ex)
|
|
||||||
{
|
|
||||||
Logger.log("IOException sending command " + command); //$NON-NLS-1$
|
|
||||||
Logger.logException(ex);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
|
@ -1,119 +0,0 @@
|
||||||
/*******************************************************************************
|
|
||||||
* Copyright (c) 2006 Wind River Systems, Inc. and others.
|
|
||||||
* All rights reserved. This program and the accompanying materials
|
|
||||||
* are made available under the terms of the Eclipse Public License v1.0
|
|
||||||
* which accompanies this distribution, and is available at
|
|
||||||
* http://www.eclipse.org/legal/epl-v10.html
|
|
||||||
*
|
|
||||||
* Contributors:
|
|
||||||
* Wind River Systems, Inc. - initial implementation
|
|
||||||
*
|
|
||||||
*******************************************************************************/
|
|
||||||
|
|
||||||
|
|
||||||
package org.eclipse.tm.terminal;
|
|
||||||
|
|
||||||
import org.eclipse.jface.action.Action;
|
|
||||||
import org.eclipse.jface.resource.ImageDescriptor;
|
|
||||||
import org.eclipse.jface.resource.ImageRegistry;
|
|
||||||
|
|
||||||
public class TerminalAction extends Action
|
|
||||||
implements TerminalMsg, TerminalConsts
|
|
||||||
{
|
|
||||||
/**
|
|
||||||
*
|
|
||||||
*/
|
|
||||||
protected TerminalTarget m_Target;
|
|
||||||
protected String m_strMsg;
|
|
||||||
|
|
||||||
/**
|
|
||||||
*
|
|
||||||
*/
|
|
||||||
public TerminalAction(TerminalTarget target,
|
|
||||||
String strMsg,
|
|
||||||
String strId)
|
|
||||||
{
|
|
||||||
super(""); //$NON-NLS-1$
|
|
||||||
|
|
||||||
m_Target = target;
|
|
||||||
m_strMsg = strMsg;
|
|
||||||
|
|
||||||
setId(strId);
|
|
||||||
}
|
|
||||||
|
|
||||||
////////////////////////////////////////////////////////////////////////////////////////////////////////////////
|
|
||||||
// Action interface
|
|
||||||
//
|
|
||||||
|
|
||||||
/**
|
|
||||||
*
|
|
||||||
*/
|
|
||||||
public void run()
|
|
||||||
{
|
|
||||||
m_Target.execute(m_strMsg,this);
|
|
||||||
}
|
|
||||||
|
|
||||||
////////////////////////////////////////////////////////////////////////////////////////////////////////////////
|
|
||||||
// Operations
|
|
||||||
//
|
|
||||||
|
|
||||||
/**
|
|
||||||
*
|
|
||||||
*/
|
|
||||||
protected void setupAction(String strText,
|
|
||||||
String strToolTip,
|
|
||||||
String strImage,
|
|
||||||
String strEnabledImage,
|
|
||||||
String strDisabledImage,
|
|
||||||
boolean bEnabled)
|
|
||||||
{
|
|
||||||
TerminalPlugin plugin;
|
|
||||||
ImageRegistry imageRegistry;
|
|
||||||
|
|
||||||
plugin = TerminalPlugin.getDefault();
|
|
||||||
imageRegistry = plugin.getImageRegistry();
|
|
||||||
setupAction(strText,
|
|
||||||
strToolTip,
|
|
||||||
strImage,
|
|
||||||
strEnabledImage,
|
|
||||||
strDisabledImage,
|
|
||||||
bEnabled,
|
|
||||||
imageRegistry);
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
*
|
|
||||||
*/
|
|
||||||
protected void setupAction(String strText,
|
|
||||||
String strToolTip,
|
|
||||||
String strImage,
|
|
||||||
String strEnabledImage,
|
|
||||||
String strDisabledImage,
|
|
||||||
boolean bEnabled,
|
|
||||||
ImageRegistry imageRegistry)
|
|
||||||
{
|
|
||||||
ImageDescriptor imageDescriptor;
|
|
||||||
|
|
||||||
setText(strText);
|
|
||||||
setToolTipText(strToolTip);
|
|
||||||
setEnabled(bEnabled);
|
|
||||||
|
|
||||||
imageDescriptor = imageRegistry.getDescriptor(strEnabledImage);
|
|
||||||
if (imageDescriptor != null)
|
|
||||||
{
|
|
||||||
setImageDescriptor(imageDescriptor);
|
|
||||||
}
|
|
||||||
|
|
||||||
imageDescriptor = imageRegistry.getDescriptor(strDisabledImage);
|
|
||||||
if (imageDescriptor != null)
|
|
||||||
{
|
|
||||||
setDisabledImageDescriptor(imageDescriptor);
|
|
||||||
}
|
|
||||||
|
|
||||||
imageDescriptor = imageRegistry.getDescriptor(strImage);
|
|
||||||
if (imageDescriptor != null)
|
|
||||||
{
|
|
||||||
setHoverImageDescriptor(imageDescriptor);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
|
@ -0,0 +1,48 @@
|
||||||
|
/*******************************************************************************
|
||||||
|
* Copyright (c) 2006 Wind River Systems, Inc. and others.
|
||||||
|
* All rights reserved. This program and the accompanying materials
|
||||||
|
* are made available under the terms of the Eclipse Public License v1.0
|
||||||
|
* which accompanies this distribution, and is available at
|
||||||
|
* http://www.eclipse.org/legal/epl-v10.html
|
||||||
|
*
|
||||||
|
* Contributors:
|
||||||
|
* Wind River Systems, Inc. - initial implementation
|
||||||
|
*
|
||||||
|
*******************************************************************************/
|
||||||
|
package org.eclipse.tm.terminal;
|
||||||
|
|
||||||
|
import java.util.ArrayList;
|
||||||
|
import java.util.List;
|
||||||
|
|
||||||
|
import org.eclipse.core.runtime.IConfigurationElement;
|
||||||
|
import org.eclipse.core.runtime.RegistryFactory;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* A factory to get {@link ITerminalConnector} instances.
|
||||||
|
*
|
||||||
|
* @author Michael Scharf
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
public class TerminalConnectorExtension {
|
||||||
|
/**
|
||||||
|
* @return a new list of ITerminalConnectors.
|
||||||
|
*/
|
||||||
|
public static ITerminalConnector[] getTerminalConnectors() {
|
||||||
|
IConfigurationElement[] config=RegistryFactory.getRegistry().getConfigurationElementsFor("org.eclipse.tm.terminal.terminalConnector"); //$NON-NLS-1$
|
||||||
|
List result=new ArrayList();
|
||||||
|
for (int i = 0; i < config.length; i++) {
|
||||||
|
try {
|
||||||
|
Object obj=config[i].createExecutableExtension("class"); //$NON-NLS-1$
|
||||||
|
if(obj instanceof ITerminalConnector) {
|
||||||
|
ITerminalConnector conn=(ITerminalConnector) obj;
|
||||||
|
if(conn.isInstalled())
|
||||||
|
result.add(conn);
|
||||||
|
}
|
||||||
|
} catch (Exception e) {
|
||||||
|
// TODO Auto-generated catch block
|
||||||
|
e.printStackTrace();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return (ITerminalConnector[]) result.toArray(new ITerminalConnector[result.size()]);
|
||||||
|
}
|
||||||
|
}
|
|
@ -1,114 +0,0 @@
|
||||||
/*******************************************************************************
|
|
||||||
* Copyright (c) 2006 Wind River Systems, Inc. and others.
|
|
||||||
* All rights reserved. This program and the accompanying materials
|
|
||||||
* are made available under the terms of the Eclipse Public License v1.0
|
|
||||||
* which accompanies this distribution, and is available at
|
|
||||||
* http://www.eclipse.org/legal/epl-v10.html
|
|
||||||
*
|
|
||||||
* Contributors:
|
|
||||||
* Wind River Systems, Inc. - initial implementation
|
|
||||||
*
|
|
||||||
*******************************************************************************/
|
|
||||||
|
|
||||||
package org.eclipse.tm.terminal;
|
|
||||||
|
|
||||||
public interface TerminalConsts
|
|
||||||
{
|
|
||||||
public static final String TERMINAL_CONNTYPE_SERIAL = "Serial"; //$NON-NLS-1$
|
|
||||||
public static final String TERMINAL_CONNTYPE_NETWORK = "Network"; //$NON-NLS-1$
|
|
||||||
|
|
||||||
public final static String TERMINAL_IMAGE_DIR_ROOT = "icons/"; //$NON-NLS-1$
|
|
||||||
public final static String TERMINAL_IMAGE_DIR_CTOOL = "ctool16/"; // basic colors - size 16x16 //$NON-NLS-1$
|
|
||||||
public final static String TERMINAL_IMAGE_DIR_LOCALTOOL = "clcl16/"; // basic colors - size 16x16 //$NON-NLS-1$
|
|
||||||
public final static String TERMINAL_IMAGE_DIR_DLCL = "dlcl16/"; // disabled - size 16x16 //$NON-NLS-1$
|
|
||||||
public final static String TERMINAL_IMAGE_DIR_ELCL = "elcl16/"; // enabled - size 16x16 //$NON-NLS-1$
|
|
||||||
public final static String TERMINAL_IMAGE_DIR_OBJECT = "obj16/"; // basic colors - size 16x16 //$NON-NLS-1$
|
|
||||||
public final static String TERMINAL_IMAGE_DIR_WIZBAN = "wizban/"; // basic colors - size 16x16 //$NON-NLS-1$
|
|
||||||
public final static String TERMINAL_IMAGE_DIR_OVR = "ovr16/"; // basic colors - size 7x8 //$NON-NLS-1$
|
|
||||||
public final static String TERMINAL_IMAGE_DIR_VIEW = "cview16/"; // views //$NON-NLS-1$
|
|
||||||
public final static String TERMINAL_IMAGE_DIR_EVIEW = "eview16/"; // views //$NON-NLS-1$
|
|
||||||
|
|
||||||
public static final String TERMINAL_IMAGE_NEW_TERMINAL = "TerminalViewNewTerminal"; //$NON-NLS-1$
|
|
||||||
public static final String TERMINAL_IMAGE_CLCL_CONNECT = "ImageClclConnect"; //$NON-NLS-1$
|
|
||||||
public static final String TERMINAL_IMAGE_CLCL_DISCONNECT = "ImageClclDisconnect"; //$NON-NLS-1$
|
|
||||||
public static final String TERMINAL_IMAGE_CLCL_SETTINGS = "ImageClclSettings"; //$NON-NLS-1$
|
|
||||||
|
|
||||||
public static final String TERMINAL_IMAGE_DLCL_CONNECT = "ImageDlclConnect"; //$NON-NLS-1$
|
|
||||||
public static final String TERMINAL_IMAGE_DLCL_DISCONNECT = "ImageDlclDisconnect"; //$NON-NLS-1$
|
|
||||||
public static final String TERMINAL_IMAGE_DLCL_SETTINGS = "ImageDlclSettings"; //$NON-NLS-1$
|
|
||||||
|
|
||||||
public static final String TERMINAL_IMAGE_ELCL_CONNECT = "ImageElclConnect"; //$NON-NLS-1$
|
|
||||||
public static final String TERMINAL_IMAGE_ELCL_DISCONNECT = "ImageElclDisconnect"; //$NON-NLS-1$
|
|
||||||
public static final String TERMINAL_IMAGE_ELCL_SETTINGS = "ImageElclSettings"; //$NON-NLS-1$
|
|
||||||
|
|
||||||
public static final String TERMINAL_PROP_TITLE = Messages.getString("TerminalConsts.Terminal_7"); //$NON-NLS-1$
|
|
||||||
public static final String TERMINAL_PROP_NAMENET = "net"; //$NON-NLS-1$
|
|
||||||
public static final String TERMINAL_PROP_NAMETGTCONST = "tgtcons"; //$NON-NLS-1$
|
|
||||||
public static final String TERMINAL_PROP_NAMETELNET = "telnet"; //$NON-NLS-1$
|
|
||||||
public static final String TERMINAL_PROP_VALUENET = "1233"; //$NON-NLS-1$
|
|
||||||
public static final String TERMINAL_PROP_VALUETGTCONST = "1232"; //$NON-NLS-1$
|
|
||||||
public static final String TERMINAL_PROP_VALUETELNET = "23"; //$NON-NLS-1$
|
|
||||||
|
|
||||||
public static final String TERMINAL_PREF_LIMITOUTPUT = "TerminalPrefLimitOutput"; //$NON-NLS-1$
|
|
||||||
public static final String TERMINAL_PREF_BUFFERLINES = "TerminalPrefBufferLines"; //$NON-NLS-1$
|
|
||||||
public static final String TERMINAL_PREF_TIMEOUT_SERIAL = "TerminalPrefTimeoutSerial"; //$NON-NLS-1$
|
|
||||||
public static final String TERMINAL_PREF_TIMEOUT_NETWORK = "TerminalPrefTimeoutNetwork"; //$NON-NLS-1$
|
|
||||||
|
|
||||||
public static final String PLUGIN_HOME = "org.eclipse.tm.terminal"; //$NON-NLS-1$
|
|
||||||
public static final String HELP_VIEW = PLUGIN_HOME + ".terminal_view"; //$NON-NLS-1$
|
|
||||||
|
|
||||||
public static final String TERMINAL_TEXT_NEW_TERMINAL = Messages.getString("TerminalConsts.New_terminal"); //$NON-NLS-1$
|
|
||||||
public static final String TERMINAL_TEXT_CONNECT = Messages.getString("TerminalConsts.Connect_2"); //$NON-NLS-1$
|
|
||||||
public static final String TERMINAL_TEXT_DISCONNECT = Messages.getString("TerminalConsts.Disconnect_3"); //$NON-NLS-1$
|
|
||||||
public static final String TERMINAL_TEXT_SETTINGS_ELLIPSE = Messages.getString("TerminalConsts.Settings..._4"); //$NON-NLS-1$
|
|
||||||
public static final String TERMINAL_TEXT_COPY = Messages.getString("TerminalConsts.Copy_5"); //$NON-NLS-1$
|
|
||||||
public static final String TERMINAL_TEXT_CUT = Messages.getString("TerminalConsts.0"); //$NON-NLS-1$
|
|
||||||
public static final String TERMINAL_TEXT_PASTE = Messages.getString("TerminalConsts.Paste_6"); //$NON-NLS-1$
|
|
||||||
public static final String TERMINAL_TEXT_SELECTALL = Messages.getString("TerminalConsts.Select_All_7"); //$NON-NLS-1$
|
|
||||||
public static final String TERMINAL_TEXT_CLEARALL = Messages.getString("TerminalConsts.Clear_All_8"); //$NON-NLS-1$
|
|
||||||
public static final String TERMINAL_TEXT_TERMINALSETTINGS = Messages.getString("TerminalConsts.Terminal_Settings_1"); //$NON-NLS-1$
|
|
||||||
public static final String TERMINAL_TEXT_CONNECTIONTYPE = Messages.getString("TerminalConsts.Connection_Type_2"); //$NON-NLS-1$
|
|
||||||
public static final String TERMINAL_TEXT_SETTINGS = Messages.getString("TerminalConsts.Settings_3"); //$NON-NLS-1$
|
|
||||||
public static final String TERMINAL_TEXT_PORT = Messages.getString("TerminalConsts.Port_4"); //$NON-NLS-1$
|
|
||||||
public static final String TERMINAL_TEXT_BAUDRATE = Messages.getString("TerminalConsts.Baud_Rate_5"); //$NON-NLS-1$
|
|
||||||
public static final String TERMINAL_TEXT_DATABITS = Messages.getString("TerminalConsts.Data_Bits_6"); //$NON-NLS-1$
|
|
||||||
public static final String TERMINAL_TEXT_STOPBITS = Messages.getString("TerminalConsts.Stop_Bits_7"); //$NON-NLS-1$
|
|
||||||
public static final String TERMINAL_TEXT_PARITY = Messages.getString("TerminalConsts.Parity_8"); //$NON-NLS-1$
|
|
||||||
public static final String TERMINAL_TEXT_FLOWCONTROL = Messages.getString("TerminalConsts.1"); //$NON-NLS-1$
|
|
||||||
public static final String TERMINAL_TEXT_HOST = Messages.getString("TerminalConsts.Host_11"); //$NON-NLS-1$
|
|
||||||
public static final String TERMINAL_TEXT_LIMITOUTPUT = Messages.getString("TerminalConsts.Limit_terminal_output_16"); //$NON-NLS-1$
|
|
||||||
public static final String TERMINAL_TEXT_BUFFERLINES = Messages.getString("TerminalConsts.Terminal_buffer_lines__17"); //$NON-NLS-1$
|
|
||||||
public static final String TERMINAL_TEXT_SERIALTIMEOUT = Messages.getString("TerminalConsts.Serial_timeout_(seconds)__18"); //$NON-NLS-1$
|
|
||||||
public static final String TERMINAL_TEXT_NETWORKTIMEOUT = Messages.getString("TerminalConsts.Network_timeout_(seconds)__19"); //$NON-NLS-1$
|
|
||||||
|
|
||||||
public static final String TERMINAL_MSG_ERROR_1 = Messages.getString("TerminalConsts.Terminal_Error_12"); //$NON-NLS-1$
|
|
||||||
public static final String TERMINAL_MSG_ERROR_2 = Messages.getString("TerminalConsts.Socket_Error_13"); //$NON-NLS-1$
|
|
||||||
public static final String TERMINAL_MSG_ERROR_3 = Messages.getString("TerminalConsts.IO_Error_14"); //$NON-NLS-1$
|
|
||||||
public static final String TERMINAL_MSG_ERROR_4 = Messages.getString("TerminalConsts.Serial_port___{0}___is_currently_in_use_!_nDo_you_want_to_close_the_port__15"); //$NON-NLS-1$
|
|
||||||
public static final String TERMINAL_MSG_ERROR_5 = Messages.getString("TerminalConsts.Error_16"); //$NON-NLS-1$
|
|
||||||
public static final String TERMINAL_MSG_ERROR_6 = Messages.getString("TerminalConsts.Emulator_is_not_supported._17"); //$NON-NLS-1$
|
|
||||||
|
|
||||||
public static final String TERMINAL_FONT_DEFINITION = "terminal.views.view.font.definition"; //$NON-NLS-1$
|
|
||||||
|
|
||||||
public static final String TERMINAL_TRACE_DEBUG_LOG = "org.eclipse.tm.terminal/debug/log"; //$NON-NLS-1$
|
|
||||||
public static final String TERMINAL_TRACE_DEBUG_LOG_ERROR = "org.eclipse.tm.terminal/debug/log/error"; //$NON-NLS-1$
|
|
||||||
public static final String TERMINAL_TRACE_DEBUG_LOG_INFO = "org.eclipse.tm.terminal/debug/log/info"; //$NON-NLS-1$
|
|
||||||
public static final String TERMINAL_TRACE_DEBUG_LOG_CHAR = "org.eclipse.tm.terminal/debug/log/char"; //$NON-NLS-1$
|
|
||||||
public static final String TERMINAL_TRACE_DEBUG_LOG_BUFFER_SIZE = "org.eclipse.tm.terminal/debug/log/buffer/size"; //$NON-NLS-1$
|
|
||||||
|
|
||||||
public static final boolean TERMINAL_DEFAULT_LIMITOUTPUT = true;
|
|
||||||
public static final int TERMINAL_DEFAULT_BUFFERLINES = 1000;
|
|
||||||
public static final int TERMINAL_DEFAULT_TIMEOUT_SERIAL = 5;
|
|
||||||
public static final int TERMINAL_DEFAULT_TIMEOUT_NETWORK = 5;
|
|
||||||
|
|
||||||
public static final int TERMINAL_ID_OK = 0;
|
|
||||||
public static final int TERMINAL_ID_CANCEL = 1;
|
|
||||||
public static final int TERMINAL_ID_CONNECT = 2;
|
|
||||||
|
|
||||||
public static final int TERMINAL_KEY_ESCAPE = 27;
|
|
||||||
public static final int TERMINAL_KEY_H = 104;
|
|
||||||
public static final int TERMINAL_KEY_J = 106;
|
|
||||||
public static final int TERMINAL_KEY_K = 107;
|
|
||||||
public static final int TERMINAL_KEY_L = 108;
|
|
||||||
public static final int TERMINAL_KEY_CR = 13;
|
|
||||||
}
|
|
|
@ -1,44 +0,0 @@
|
||||||
/*******************************************************************************
|
|
||||||
* Copyright (c) 2006 Wind River Systems, Inc. and others.
|
|
||||||
* All rights reserved. This program and the accompanying materials
|
|
||||||
* are made available under the terms of the Eclipse Public License v1.0
|
|
||||||
* which accompanies this distribution, and is available at
|
|
||||||
* http://www.eclipse.org/legal/epl-v10.html
|
|
||||||
*
|
|
||||||
* Contributors:
|
|
||||||
* Wind River Systems, Inc. - initial implementation
|
|
||||||
*
|
|
||||||
*******************************************************************************/
|
|
||||||
|
|
||||||
package org.eclipse.tm.terminal;
|
|
||||||
|
|
||||||
public interface TerminalMsg
|
|
||||||
{
|
|
||||||
public static final String ON_TERMINAL_FOCUS = "OnTerminalFocus"; //$NON-NLS-1$
|
|
||||||
public static final String ON_TERMINAL_NEW_TERMINAL = "OnTerminalNew"; //$NON-NLS-1$
|
|
||||||
public static final String ON_TERMINAL_CONNECT = "OnTerminalConnect"; //$NON-NLS-1$
|
|
||||||
public static final String ON_TERMINAL_CONNECTING = "OnTerminalConnecting"; //$NON-NLS-1$
|
|
||||||
public static final String ON_TERMINAL_DISCONNECT = "OnTerminalDisconnect"; //$NON-NLS-1$
|
|
||||||
public static final String ON_TERMINAL_SETTINGS = "OnTerminalSettings"; //$NON-NLS-1$
|
|
||||||
public static final String ON_TERMINAL_STATUS = "OnTerminalStatus"; //$NON-NLS-1$
|
|
||||||
public static final String ON_TERMINAL_DATAAVAILABLE = "OnTerminalDataAvailable"; //$NON-NLS-1$
|
|
||||||
public static final String ON_TERMINAL_FONTCHANGED = "OnTerminalFontChanged"; //$NON-NLS-1$
|
|
||||||
public static final String ON_EDIT_COPY = "OnEditCopy"; //$NON-NLS-1$
|
|
||||||
public static final String ON_EDIT_CUT = "OnEditCut"; //$NON-NLS-1$
|
|
||||||
public static final String ON_EDIT_PASTE = "OnEditPaste"; //$NON-NLS-1$
|
|
||||||
public static final String ON_EDIT_CLEARALL = "OnEditClearAll"; //$NON-NLS-1$
|
|
||||||
public static final String ON_EDIT_SELECTALL = "OnEditSelectAll"; //$NON-NLS-1$
|
|
||||||
public static final String ON_UPDATE_TERMINAL_CONNECT = "OnUpdateTerminalConnect"; //$NON-NLS-1$
|
|
||||||
public static final String ON_UPDATE_TERMINAL_DISCONNECT = "OnUpdateTerminalDisconnect"; //$NON-NLS-1$
|
|
||||||
public static final String ON_UPDATE_TERMINAL_SETTINGS = "OnUpdateTerminalSettings"; //$NON-NLS-1$
|
|
||||||
public static final String ON_UPDATE_EDIT_COPY = "OnUpdateEditCopy"; //$NON-NLS-1$
|
|
||||||
public static final String ON_UPDATE_EDIT_CUT = "OnUpdateEditCut"; //$NON-NLS-1$
|
|
||||||
public static final String ON_UPDATE_EDIT_PASTE = "OnUpdateEditPaste"; //$NON-NLS-1$
|
|
||||||
public static final String ON_UPDATE_EDIT_CLEARALL = "OnUpdateEditClearAll"; //$NON-NLS-1$
|
|
||||||
public static final String ON_UPDATE_EDIT_SELECTALL = "OnUpdateEditSelectAll"; //$NON-NLS-1$
|
|
||||||
public static final String ON_CONNTYPE_SELECTED = "OnConnTypeSelected"; //$NON-NLS-1$
|
|
||||||
public static final String ON_LIMITOUTPUT_SELECTED = "OnLimitOutputSelected"; //$NON-NLS-1$
|
|
||||||
public static final String ON_OK = "OnOK"; //$NON-NLS-1$
|
|
||||||
public static final String ON_CANCEL = "OnCancel"; //$NON-NLS-1$
|
|
||||||
public static final String ON_HELP = "OnHelp"; //$NON-NLS-1$
|
|
||||||
}
|
|
|
@ -1,104 +0,0 @@
|
||||||
/*******************************************************************************
|
|
||||||
* Copyright (c) 2006 Wind River Systems, Inc. and others.
|
|
||||||
* All rights reserved. This program and the accompanying materials
|
|
||||||
* are made available under the terms of the Eclipse Public License v1.0
|
|
||||||
* which accompanies this distribution, and is available at
|
|
||||||
* http://www.eclipse.org/legal/epl-v10.html
|
|
||||||
*
|
|
||||||
* Contributors:
|
|
||||||
* Wind River Systems, Inc. - initial implementation
|
|
||||||
*
|
|
||||||
*******************************************************************************/
|
|
||||||
|
|
||||||
package org.eclipse.tm.terminal;
|
|
||||||
|
|
||||||
import java.util.Collection;
|
|
||||||
import java.util.HashMap;
|
|
||||||
import java.util.Set;
|
|
||||||
import java.util.Vector;
|
|
||||||
|
|
||||||
|
|
||||||
public class TerminalNetworkPortMap extends HashMap
|
|
||||||
implements TerminalConsts
|
|
||||||
{
|
|
||||||
static final long serialVersionUID = 0;
|
|
||||||
|
|
||||||
public TerminalNetworkPortMap()
|
|
||||||
{
|
|
||||||
super();
|
|
||||||
|
|
||||||
setupMap();
|
|
||||||
}
|
|
||||||
|
|
||||||
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
|
|
||||||
// Operations
|
|
||||||
//
|
|
||||||
|
|
||||||
/**
|
|
||||||
*
|
|
||||||
*/
|
|
||||||
public String getDefaultNetworkPort()
|
|
||||||
{
|
|
||||||
return (String) get(TERMINAL_PROP_NAMETELNET);
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
*
|
|
||||||
*/
|
|
||||||
public String findPortName(String strPort)
|
|
||||||
{
|
|
||||||
Collection values;
|
|
||||||
Vector portTable;
|
|
||||||
Vector nameTable;
|
|
||||||
String strPortName;
|
|
||||||
int nIndex;
|
|
||||||
|
|
||||||
values = values();
|
|
||||||
portTable = new Vector(values);
|
|
||||||
nIndex = portTable.indexOf(strPort);
|
|
||||||
nameTable = getNameTable();
|
|
||||||
|
|
||||||
if (nIndex == -1)
|
|
||||||
return strPort;
|
|
||||||
|
|
||||||
strPortName = (String) nameTable.get(nIndex);
|
|
||||||
return strPortName;
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
*
|
|
||||||
*/
|
|
||||||
public String findPort(String strPortName)
|
|
||||||
{
|
|
||||||
String strPort;
|
|
||||||
|
|
||||||
strPort = (String) get(strPortName);
|
|
||||||
if (strPort == null)
|
|
||||||
return strPortName;
|
|
||||||
|
|
||||||
return strPort;
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
*
|
|
||||||
*/
|
|
||||||
public Vector getNameTable()
|
|
||||||
{
|
|
||||||
Set keySet;
|
|
||||||
Vector nameTable;
|
|
||||||
|
|
||||||
keySet = keySet();
|
|
||||||
nameTable = new Vector(keySet);
|
|
||||||
|
|
||||||
return nameTable;
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
*
|
|
||||||
*/
|
|
||||||
protected void setupMap()
|
|
||||||
{
|
|
||||||
put(TERMINAL_PROP_NAMETGTCONST, TERMINAL_PROP_VALUETGTCONST);
|
|
||||||
put(TERMINAL_PROP_NAMETELNET, TERMINAL_PROP_VALUETELNET);
|
|
||||||
}
|
|
||||||
}
|
|
|
@ -1,294 +0,0 @@
|
||||||
/*******************************************************************************
|
|
||||||
* Copyright (c) 2006 Wind River Systems, Inc. and others.
|
|
||||||
* All rights reserved. This program and the accompanying materials
|
|
||||||
* are made available under the terms of the Eclipse Public License v1.0
|
|
||||||
* which accompanies this distribution, and is available at
|
|
||||||
* http://www.eclipse.org/legal/epl-v10.html
|
|
||||||
*
|
|
||||||
* Contributors:
|
|
||||||
* Wind River Systems, Inc. - initial implementation
|
|
||||||
*
|
|
||||||
*******************************************************************************/
|
|
||||||
|
|
||||||
package org.eclipse.tm.terminal;
|
|
||||||
|
|
||||||
import java.net.MalformedURLException;
|
|
||||||
import java.net.URL;
|
|
||||||
import java.util.HashMap;
|
|
||||||
import java.util.Iterator;
|
|
||||||
import java.util.MissingResourceException;
|
|
||||||
import java.util.ResourceBundle;
|
|
||||||
|
|
||||||
import org.eclipse.core.resources.IWorkspace;
|
|
||||||
import org.eclipse.core.resources.ResourcesPlugin;
|
|
||||||
import org.eclipse.core.runtime.Platform;
|
|
||||||
import org.eclipse.jface.preference.IPreferenceStore;
|
|
||||||
import org.eclipse.jface.resource.ImageDescriptor;
|
|
||||||
import org.eclipse.jface.resource.ImageRegistry;
|
|
||||||
import org.eclipse.ui.plugin.AbstractUIPlugin;
|
|
||||||
import org.osgi.framework.BundleContext;
|
|
||||||
|
|
||||||
public class TerminalPlugin extends AbstractUIPlugin
|
|
||||||
implements TerminalConsts
|
|
||||||
{
|
|
||||||
protected static TerminalPlugin m_Default;
|
|
||||||
|
|
||||||
protected TerminalProperties m_Properties;
|
|
||||||
protected ResourceBundle m_ResourceBundle;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* The constructor.
|
|
||||||
*/
|
|
||||||
public TerminalPlugin()
|
|
||||||
{
|
|
||||||
super();
|
|
||||||
|
|
||||||
m_Default = this;
|
|
||||||
|
|
||||||
setupPlugin();
|
|
||||||
}
|
|
||||||
|
|
||||||
public void start(BundleContext context) throws Exception
|
|
||||||
{
|
|
||||||
super.start(context);
|
|
||||||
}
|
|
||||||
|
|
||||||
public void stop(BundleContext context) throws Exception
|
|
||||||
{
|
|
||||||
super.stop(context);
|
|
||||||
}
|
|
||||||
|
|
||||||
// AbstractUIPlugin interface
|
|
||||||
|
|
||||||
/**
|
|
||||||
*
|
|
||||||
*/
|
|
||||||
protected void initializeImageRegistry(ImageRegistry imageRegistry)
|
|
||||||
{
|
|
||||||
HashMap map;
|
|
||||||
|
|
||||||
map = new HashMap();
|
|
||||||
|
|
||||||
try
|
|
||||||
{
|
|
||||||
// Local toolbars
|
|
||||||
map.put(TERMINAL_IMAGE_NEW_TERMINAL, "newterminal.gif"); //$NON-NLS-1$
|
|
||||||
map.put(TERMINAL_IMAGE_CLCL_CONNECT, "connect_co.gif"); //$NON-NLS-1$
|
|
||||||
map.put(TERMINAL_IMAGE_CLCL_DISCONNECT, "disconnect_co.gif"); //$NON-NLS-1$
|
|
||||||
map.put(TERMINAL_IMAGE_CLCL_SETTINGS, "properties_tsk.gif"); //$NON-NLS-1$
|
|
||||||
|
|
||||||
loadImageRegistry(imageRegistry, TERMINAL_IMAGE_DIR_LOCALTOOL, map);
|
|
||||||
|
|
||||||
map.clear();
|
|
||||||
|
|
||||||
// Enabled local toolbars
|
|
||||||
map.put(TERMINAL_IMAGE_NEW_TERMINAL, "newterminal.gif"); //$NON-NLS-1$
|
|
||||||
map.put(TERMINAL_IMAGE_ELCL_CONNECT, "connect_co.gif"); //$NON-NLS-1$
|
|
||||||
map.put(TERMINAL_IMAGE_ELCL_DISCONNECT, "disconnect_co.gif"); //$NON-NLS-1$
|
|
||||||
map.put(TERMINAL_IMAGE_ELCL_SETTINGS, "properties_tsk.gif"); //$NON-NLS-1$
|
|
||||||
|
|
||||||
loadImageRegistry(imageRegistry, TERMINAL_IMAGE_DIR_ELCL, map);
|
|
||||||
|
|
||||||
map.clear();
|
|
||||||
|
|
||||||
// Disabled local toolbars
|
|
||||||
map.put(TERMINAL_IMAGE_NEW_TERMINAL, "newterminal.gif"); //$NON-NLS-1$
|
|
||||||
map.put(TERMINAL_IMAGE_DLCL_CONNECT, "connect_co.gif"); //$NON-NLS-1$
|
|
||||||
map.put(TERMINAL_IMAGE_DLCL_DISCONNECT, "disconnect_co.gif"); //$NON-NLS-1$
|
|
||||||
map.put(TERMINAL_IMAGE_DLCL_SETTINGS, "properties_tsk.gif"); //$NON-NLS-1$
|
|
||||||
|
|
||||||
loadImageRegistry(imageRegistry, TERMINAL_IMAGE_DIR_DLCL, map);
|
|
||||||
|
|
||||||
map.clear();
|
|
||||||
}
|
|
||||||
catch(MalformedURLException malformedURLException)
|
|
||||||
{
|
|
||||||
malformedURLException.printStackTrace();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
*
|
|
||||||
*/
|
|
||||||
protected void initializeDefaultPreferences(IPreferenceStore store)
|
|
||||||
{
|
|
||||||
store.setDefault(TERMINAL_PREF_LIMITOUTPUT, TERMINAL_DEFAULT_LIMITOUTPUT);
|
|
||||||
store.setDefault(TERMINAL_PREF_BUFFERLINES, TERMINAL_DEFAULT_BUFFERLINES);
|
|
||||||
store.setDefault(TERMINAL_PREF_TIMEOUT_SERIAL, TERMINAL_DEFAULT_TIMEOUT_SERIAL);
|
|
||||||
store.setDefault(TERMINAL_PREF_TIMEOUT_NETWORK, TERMINAL_DEFAULT_TIMEOUT_NETWORK);
|
|
||||||
}
|
|
||||||
|
|
||||||
// Operations
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Returns the shared instance.
|
|
||||||
*/
|
|
||||||
public static TerminalPlugin getDefault()
|
|
||||||
{
|
|
||||||
return m_Default;
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Returns the workspace instance.
|
|
||||||
*/
|
|
||||||
public static IWorkspace getWorkspace()
|
|
||||||
{
|
|
||||||
return ResourcesPlugin.getWorkspace();
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Returns the string from the plugin's resource bundle, or 'key' if not found.
|
|
||||||
*/
|
|
||||||
public static String getResourceString(String strKey)
|
|
||||||
{
|
|
||||||
ResourceBundle resourceBundle;
|
|
||||||
|
|
||||||
resourceBundle = m_Default.getResourceBundle();
|
|
||||||
|
|
||||||
try
|
|
||||||
{
|
|
||||||
return resourceBundle.getString(strKey);
|
|
||||||
}
|
|
||||||
catch(MissingResourceException missingResourceException)
|
|
||||||
{
|
|
||||||
return strKey;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
*
|
|
||||||
*/
|
|
||||||
public static boolean isLogInfoEnabled()
|
|
||||||
{
|
|
||||||
return isOptionEnabled(TERMINAL_TRACE_DEBUG_LOG_INFO);
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
*
|
|
||||||
*/
|
|
||||||
public static boolean isLogErrorEnabled()
|
|
||||||
{
|
|
||||||
return isOptionEnabled(TERMINAL_TRACE_DEBUG_LOG_ERROR);
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
*
|
|
||||||
*/
|
|
||||||
public static boolean isLogEnabled()
|
|
||||||
{
|
|
||||||
return isOptionEnabled(TERMINAL_TRACE_DEBUG_LOG);
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
*
|
|
||||||
*/
|
|
||||||
public static boolean isOptionEnabled(String strOption)
|
|
||||||
{
|
|
||||||
String strEnabled;
|
|
||||||
Boolean boolEnabled;
|
|
||||||
boolean bEnabled;
|
|
||||||
|
|
||||||
strEnabled = Platform.getDebugOption(strOption);
|
|
||||||
if (strEnabled == null)
|
|
||||||
return false;
|
|
||||||
|
|
||||||
boolEnabled = new Boolean(strEnabled);
|
|
||||||
bEnabled = boolEnabled.booleanValue();
|
|
||||||
|
|
||||||
return bEnabled;
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
*
|
|
||||||
*/
|
|
||||||
public TerminalProperties getTerminalProperties()
|
|
||||||
{
|
|
||||||
return m_Properties;
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Returns the plugin's resource bundle,
|
|
||||||
*/
|
|
||||||
public ResourceBundle getResourceBundle()
|
|
||||||
{
|
|
||||||
return m_ResourceBundle;
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
*
|
|
||||||
*/
|
|
||||||
protected void loadImageRegistry(ImageRegistry imageRegistry,
|
|
||||||
String strDir,
|
|
||||||
HashMap map)
|
|
||||||
throws MalformedURLException
|
|
||||||
{
|
|
||||||
URL url;
|
|
||||||
ImageDescriptor imageDescriptor;
|
|
||||||
Iterator keys;
|
|
||||||
String strKey;
|
|
||||||
String strFile;
|
|
||||||
|
|
||||||
keys = map.keySet().iterator();
|
|
||||||
|
|
||||||
while(keys.hasNext())
|
|
||||||
{
|
|
||||||
strKey = (String) keys.next();
|
|
||||||
strFile = (String) map.get(strKey);
|
|
||||||
|
|
||||||
if (strFile != null)
|
|
||||||
{
|
|
||||||
url = TerminalPlugin.getDefault().getBundle().getEntry(TERMINAL_IMAGE_DIR_ROOT + strDir + strFile);
|
|
||||||
imageDescriptor = ImageDescriptor.createFromURL(url);
|
|
||||||
imageRegistry.put(strKey,imageDescriptor);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
*
|
|
||||||
*/
|
|
||||||
protected void setupPlugin()
|
|
||||||
{
|
|
||||||
setupData();
|
|
||||||
setupLog();
|
|
||||||
setupResources();
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
*
|
|
||||||
*/
|
|
||||||
protected void setupData()
|
|
||||||
{
|
|
||||||
m_Properties = new TerminalProperties();
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
*
|
|
||||||
*/
|
|
||||||
protected void setupLog()
|
|
||||||
{
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
*
|
|
||||||
*/
|
|
||||||
protected void setupResources()
|
|
||||||
{
|
|
||||||
Package pkg;
|
|
||||||
String strPkg;
|
|
||||||
String strBundle;
|
|
||||||
|
|
||||||
pkg = TerminalPlugin.class.getPackage();
|
|
||||||
strPkg = pkg.getName();
|
|
||||||
strBundle = strPkg + ".PluginResources"; //$NON-NLS-1$
|
|
||||||
|
|
||||||
try
|
|
||||||
{
|
|
||||||
m_ResourceBundle = ResourceBundle.getBundle(strBundle);
|
|
||||||
}
|
|
||||||
catch(MissingResourceException missingResourceException)
|
|
||||||
{
|
|
||||||
m_ResourceBundle = null;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
|
@ -1,265 +0,0 @@
|
||||||
/*******************************************************************************
|
|
||||||
* Copyright (c) 2006 Wind River Systems, Inc. and others.
|
|
||||||
* All rights reserved. This program and the accompanying materials
|
|
||||||
* are made available under the terms of the Eclipse Public License v1.0
|
|
||||||
* which accompanies this distribution, and is available at
|
|
||||||
* http://www.eclipse.org/legal/epl-v10.html
|
|
||||||
*
|
|
||||||
* Contributors:
|
|
||||||
* Wind River Systems, Inc. - initial implementation
|
|
||||||
*
|
|
||||||
*******************************************************************************/
|
|
||||||
|
|
||||||
package org.eclipse.tm.terminal;
|
|
||||||
|
|
||||||
import org.eclipse.jface.preference.BooleanFieldEditor;
|
|
||||||
import org.eclipse.jface.preference.FieldEditorPreferencePage;
|
|
||||||
import org.eclipse.jface.preference.IPreferenceStore;
|
|
||||||
import org.eclipse.jface.preference.IntegerFieldEditor;
|
|
||||||
import org.eclipse.swt.events.SelectionAdapter;
|
|
||||||
import org.eclipse.swt.events.SelectionEvent;
|
|
||||||
import org.eclipse.swt.widgets.Button;
|
|
||||||
import org.eclipse.swt.widgets.Composite;
|
|
||||||
import org.eclipse.swt.widgets.Label;
|
|
||||||
import org.eclipse.swt.widgets.Text;
|
|
||||||
import org.eclipse.ui.IWorkbench;
|
|
||||||
import org.eclipse.ui.IWorkbenchPreferencePage;
|
|
||||||
|
|
||||||
public class TerminalPreferencePage extends FieldEditorPreferencePage
|
|
||||||
implements IWorkbenchPreferencePage,
|
|
||||||
TerminalTarget,
|
|
||||||
TerminalConsts
|
|
||||||
{
|
|
||||||
/**
|
|
||||||
*
|
|
||||||
*/
|
|
||||||
protected TerminalBooleanFieldEditor m_editorLimitOutput;
|
|
||||||
protected IntegerFieldEditor m_editorBufferSize;
|
|
||||||
protected IntegerFieldEditor m_editorSerialTimeout;
|
|
||||||
protected IntegerFieldEditor m_editorNetworkTimeout;
|
|
||||||
|
|
||||||
/**
|
|
||||||
*
|
|
||||||
*/
|
|
||||||
public TerminalPreferencePage()
|
|
||||||
{
|
|
||||||
super(GRID);
|
|
||||||
}
|
|
||||||
|
|
||||||
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
|
|
||||||
// TerminalTarget interface
|
|
||||||
//
|
|
||||||
|
|
||||||
/**
|
|
||||||
*
|
|
||||||
*/
|
|
||||||
public void execute(String strMsg,Object data)
|
|
||||||
{
|
|
||||||
if (strMsg.equals(ON_LIMITOUTPUT_SELECTED))
|
|
||||||
{
|
|
||||||
onLimitOutputSelected(data);
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
|
|
||||||
// Message handlers
|
|
||||||
//
|
|
||||||
|
|
||||||
/**
|
|
||||||
*
|
|
||||||
*/
|
|
||||||
protected void onLimitOutputSelected(Object data)
|
|
||||||
{
|
|
||||||
Button ctlButton;
|
|
||||||
Text ctlText;
|
|
||||||
Label ctlLabel;
|
|
||||||
boolean bEnabled;
|
|
||||||
|
|
||||||
ctlButton = m_editorLimitOutput.getChangeControl(getFieldEditorParent());
|
|
||||||
ctlText = m_editorBufferSize.getTextControl(getFieldEditorParent());
|
|
||||||
ctlLabel = m_editorBufferSize.getLabelControl(getFieldEditorParent());
|
|
||||||
bEnabled = ctlButton.getSelection();
|
|
||||||
|
|
||||||
ctlText.setEnabled(bEnabled);
|
|
||||||
ctlLabel.setEnabled(bEnabled);
|
|
||||||
}
|
|
||||||
|
|
||||||
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
|
|
||||||
// FieldEditorPreferencePage interface
|
|
||||||
//
|
|
||||||
|
|
||||||
/**
|
|
||||||
*
|
|
||||||
*/
|
|
||||||
protected void createFieldEditors()
|
|
||||||
{
|
|
||||||
setupPage();
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
*
|
|
||||||
*/
|
|
||||||
protected void initialize()
|
|
||||||
{
|
|
||||||
super.initialize();
|
|
||||||
|
|
||||||
execute(ON_LIMITOUTPUT_SELECTED,null);
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
*
|
|
||||||
*/
|
|
||||||
protected void performDefaults()
|
|
||||||
{
|
|
||||||
super.performDefaults();
|
|
||||||
|
|
||||||
execute(ON_LIMITOUTPUT_SELECTED,null);
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
*
|
|
||||||
*/
|
|
||||||
public void init(IWorkbench workbench)
|
|
||||||
{
|
|
||||||
}
|
|
||||||
|
|
||||||
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
|
|
||||||
// Operations
|
|
||||||
//
|
|
||||||
|
|
||||||
/**
|
|
||||||
*
|
|
||||||
*/
|
|
||||||
protected void setupPage()
|
|
||||||
{
|
|
||||||
setupData();
|
|
||||||
setupEditors();
|
|
||||||
setupListeners();
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
*
|
|
||||||
*/
|
|
||||||
protected void setupData()
|
|
||||||
{
|
|
||||||
TerminalPlugin plugin;
|
|
||||||
IPreferenceStore preferenceStore;
|
|
||||||
|
|
||||||
plugin = TerminalPlugin.getDefault();
|
|
||||||
preferenceStore = plugin.getPreferenceStore();
|
|
||||||
setPreferenceStore(preferenceStore);
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
*
|
|
||||||
*/
|
|
||||||
protected void setupEditors()
|
|
||||||
{
|
|
||||||
m_editorLimitOutput = new TerminalBooleanFieldEditor(TERMINAL_PREF_LIMITOUTPUT,
|
|
||||||
TERMINAL_TEXT_LIMITOUTPUT,
|
|
||||||
getFieldEditorParent());
|
|
||||||
m_editorBufferSize = new IntegerFieldEditor(TERMINAL_PREF_BUFFERLINES,
|
|
||||||
TERMINAL_TEXT_BUFFERLINES,
|
|
||||||
getFieldEditorParent());
|
|
||||||
m_editorSerialTimeout = new IntegerFieldEditor(TERMINAL_PREF_TIMEOUT_SERIAL,
|
|
||||||
TERMINAL_TEXT_SERIALTIMEOUT,
|
|
||||||
getFieldEditorParent());
|
|
||||||
m_editorNetworkTimeout = new IntegerFieldEditor(TERMINAL_PREF_TIMEOUT_NETWORK,
|
|
||||||
TERMINAL_TEXT_NETWORKTIMEOUT,
|
|
||||||
getFieldEditorParent());
|
|
||||||
|
|
||||||
m_editorBufferSize.setValidRange(0,Integer.MAX_VALUE);
|
|
||||||
m_editorSerialTimeout.setValidRange(0,Integer.MAX_VALUE);
|
|
||||||
m_editorNetworkTimeout.setValidRange(0,Integer.MAX_VALUE);
|
|
||||||
|
|
||||||
addField(m_editorLimitOutput);
|
|
||||||
addField(m_editorBufferSize);
|
|
||||||
addField(m_editorSerialTimeout);
|
|
||||||
addField(m_editorNetworkTimeout);
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
*
|
|
||||||
*/
|
|
||||||
protected void setupListeners()
|
|
||||||
{
|
|
||||||
TerminalSelectionHandler selectionHandler;
|
|
||||||
Button ctlButton;
|
|
||||||
|
|
||||||
selectionHandler = new TerminalSelectionHandler();
|
|
||||||
ctlButton = m_editorLimitOutput.getChangeControl(getFieldEditorParent());
|
|
||||||
ctlButton.addSelectionListener(selectionHandler);
|
|
||||||
}
|
|
||||||
|
|
||||||
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
|
|
||||||
// Inner classes
|
|
||||||
//
|
|
||||||
|
|
||||||
/**
|
|
||||||
*
|
|
||||||
*/
|
|
||||||
public class TerminalBooleanFieldEditor extends BooleanFieldEditor
|
|
||||||
{
|
|
||||||
/**
|
|
||||||
*
|
|
||||||
*/
|
|
||||||
public TerminalBooleanFieldEditor(String strName,
|
|
||||||
String strLabel,
|
|
||||||
Composite ctlParent)
|
|
||||||
{
|
|
||||||
super(strName,strLabel,ctlParent);
|
|
||||||
}
|
|
||||||
|
|
||||||
////////////////////////////////////////////////////////////////////////////////////////////////////////////////
|
|
||||||
// BooleanFieldEditor interface
|
|
||||||
//
|
|
||||||
|
|
||||||
/**
|
|
||||||
*
|
|
||||||
*/
|
|
||||||
public Button getChangeControl(Composite parent)
|
|
||||||
{
|
|
||||||
return super.getChangeControl(parent);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
/**
|
|
||||||
*
|
|
||||||
*/
|
|
||||||
protected class TerminalSelectionHandler extends SelectionAdapter
|
|
||||||
{
|
|
||||||
/**
|
|
||||||
*
|
|
||||||
*/
|
|
||||||
protected TerminalSelectionHandler()
|
|
||||||
{
|
|
||||||
super();
|
|
||||||
}
|
|
||||||
|
|
||||||
////////////////////////////////////////////////////////////////////////////////////////////////////////////////
|
|
||||||
// SelectionAdapter interface
|
|
||||||
//
|
|
||||||
|
|
||||||
/**
|
|
||||||
*
|
|
||||||
*/
|
|
||||||
public void widgetSelected(SelectionEvent event)
|
|
||||||
{
|
|
||||||
Object source;
|
|
||||||
Button ctlButton;
|
|
||||||
|
|
||||||
source = event.getSource();
|
|
||||||
ctlButton = m_editorLimitOutput.getChangeControl(getFieldEditorParent());
|
|
||||||
|
|
||||||
if (source == ctlButton)
|
|
||||||
{
|
|
||||||
execute(ON_LIMITOUTPUT_SELECTED,null);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
|
||||||
}
|
|
|
@ -1,278 +0,0 @@
|
||||||
/*******************************************************************************
|
|
||||||
* Copyright (c) 2006 Wind River Systems, Inc. and others.
|
|
||||||
* All rights reserved. This program and the accompanying materials
|
|
||||||
* are made available under the terms of the Eclipse Public License v1.0
|
|
||||||
* which accompanies this distribution, and is available at
|
|
||||||
* http://www.eclipse.org/legal/epl-v10.html
|
|
||||||
*
|
|
||||||
* Contributors:
|
|
||||||
* Wind River Systems, Inc. - initial implementation
|
|
||||||
*
|
|
||||||
*******************************************************************************/
|
|
||||||
|
|
||||||
package org.eclipse.tm.terminal;
|
|
||||||
|
|
||||||
import java.util.Collections;
|
|
||||||
import java.util.Enumeration;
|
|
||||||
import java.util.Vector;
|
|
||||||
|
|
||||||
import javax.comm.CommPortIdentifier;
|
|
||||||
|
|
||||||
public class TerminalProperties implements TerminalConsts
|
|
||||||
{
|
|
||||||
protected TerminalNetworkPortMap m_NetworkPortMap;
|
|
||||||
protected Vector m_ConnTypeTable;
|
|
||||||
protected Vector m_SerialPortTable;
|
|
||||||
protected Vector m_BaudRateTable;
|
|
||||||
protected Vector m_DataBitsTable;
|
|
||||||
protected Vector m_StopBitsTable;
|
|
||||||
protected Vector m_ParityTable;
|
|
||||||
protected Vector m_FlowControlTable;
|
|
||||||
protected String m_strDefaultConnType;
|
|
||||||
protected String m_strDefaultSerialPort;
|
|
||||||
protected String m_strDefaultBaudRate;
|
|
||||||
protected String m_strDefaultDataBits;
|
|
||||||
protected String m_strDefaultStopBits;
|
|
||||||
protected String m_strDefaultParity;
|
|
||||||
protected String m_strDefaultFlowControl;
|
|
||||||
protected String m_strDefaultHost;
|
|
||||||
protected String m_strDefaultNetworkPort;
|
|
||||||
|
|
||||||
/**
|
|
||||||
*
|
|
||||||
*/
|
|
||||||
public TerminalProperties()
|
|
||||||
{
|
|
||||||
super();
|
|
||||||
|
|
||||||
setupProperties();
|
|
||||||
}
|
|
||||||
|
|
||||||
////////////////////////////////////////////////////////////////////////////
|
|
||||||
// Operations
|
|
||||||
//
|
|
||||||
|
|
||||||
/**
|
|
||||||
*
|
|
||||||
*/
|
|
||||||
public Vector getConnTypeTable()
|
|
||||||
{
|
|
||||||
return m_ConnTypeTable;
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
*
|
|
||||||
*/
|
|
||||||
public Vector getSerialPortTable()
|
|
||||||
{
|
|
||||||
return m_SerialPortTable;
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
*
|
|
||||||
*/
|
|
||||||
public Vector getBaudRateTable()
|
|
||||||
{
|
|
||||||
return m_BaudRateTable;
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
*
|
|
||||||
*/
|
|
||||||
public Vector getDataBitsTable()
|
|
||||||
{
|
|
||||||
return m_DataBitsTable;
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
*
|
|
||||||
*/
|
|
||||||
public Vector getStopBitsTable()
|
|
||||||
{
|
|
||||||
return m_StopBitsTable;
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
*
|
|
||||||
*/
|
|
||||||
public Vector getParityTable()
|
|
||||||
{
|
|
||||||
return m_ParityTable;
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
*
|
|
||||||
*/
|
|
||||||
public Vector getFlowControlTable()
|
|
||||||
{
|
|
||||||
return m_FlowControlTable;
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
*
|
|
||||||
*/
|
|
||||||
public TerminalNetworkPortMap getNetworkPortMap()
|
|
||||||
{
|
|
||||||
return m_NetworkPortMap;
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
*
|
|
||||||
*/
|
|
||||||
public String getDefaultConnType()
|
|
||||||
{
|
|
||||||
return m_strDefaultConnType;
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
*
|
|
||||||
*/
|
|
||||||
public String getDefaultSerialPort()
|
|
||||||
{
|
|
||||||
return m_strDefaultSerialPort;
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
*
|
|
||||||
*/
|
|
||||||
public String getDefaultBaudRate()
|
|
||||||
{
|
|
||||||
return m_strDefaultBaudRate;
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
*
|
|
||||||
*/
|
|
||||||
public String getDefaultDataBits()
|
|
||||||
{
|
|
||||||
return m_strDefaultDataBits;
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
*
|
|
||||||
*/
|
|
||||||
public String getDefaultStopBits()
|
|
||||||
{
|
|
||||||
return m_strDefaultStopBits;
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
*
|
|
||||||
*/
|
|
||||||
public String getDefaultParity()
|
|
||||||
{
|
|
||||||
return m_strDefaultParity;
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
*
|
|
||||||
*/
|
|
||||||
public String getDefaultFlowControl()
|
|
||||||
{
|
|
||||||
return m_strDefaultFlowControl;
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
*
|
|
||||||
*/
|
|
||||||
public String getDefaultHost()
|
|
||||||
{
|
|
||||||
return m_strDefaultHost;
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
*
|
|
||||||
*/
|
|
||||||
public String getDefaultNetworkPort()
|
|
||||||
{
|
|
||||||
return m_strDefaultNetworkPort;
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
*
|
|
||||||
*/
|
|
||||||
protected void setupProperties()
|
|
||||||
{
|
|
||||||
Enumeration portIdEnum;
|
|
||||||
CommPortIdentifier identifier;
|
|
||||||
String strName;
|
|
||||||
int nPortType;
|
|
||||||
|
|
||||||
portIdEnum = CommPortIdentifier.getPortIdentifiers();
|
|
||||||
m_NetworkPortMap = new TerminalNetworkPortMap();
|
|
||||||
m_ConnTypeTable = new Vector();
|
|
||||||
m_SerialPortTable = new Vector();
|
|
||||||
m_BaudRateTable = new Vector();
|
|
||||||
m_DataBitsTable = new Vector();
|
|
||||||
m_StopBitsTable = new Vector();
|
|
||||||
m_ParityTable = new Vector();
|
|
||||||
m_FlowControlTable = new Vector();
|
|
||||||
m_strDefaultConnType = ""; //$NON-NLS-1$
|
|
||||||
m_strDefaultSerialPort = ""; //$NON-NLS-1$
|
|
||||||
m_strDefaultBaudRate = ""; //$NON-NLS-1$
|
|
||||||
m_strDefaultDataBits = ""; //$NON-NLS-1$
|
|
||||||
m_strDefaultStopBits = ""; //$NON-NLS-1$
|
|
||||||
m_strDefaultParity = ""; //$NON-NLS-1$
|
|
||||||
m_strDefaultFlowControl = ""; //$NON-NLS-1$
|
|
||||||
m_strDefaultHost = ""; //$NON-NLS-1$
|
|
||||||
m_strDefaultNetworkPort = ""; //$NON-NLS-1$
|
|
||||||
|
|
||||||
m_ConnTypeTable.add(TERMINAL_CONNTYPE_SERIAL);
|
|
||||||
m_ConnTypeTable.add(TERMINAL_CONNTYPE_NETWORK);
|
|
||||||
|
|
||||||
m_BaudRateTable.add("300"); //$NON-NLS-1$
|
|
||||||
m_BaudRateTable.add("1200"); //$NON-NLS-1$
|
|
||||||
m_BaudRateTable.add("2400"); //$NON-NLS-1$
|
|
||||||
m_BaudRateTable.add("4800"); //$NON-NLS-1$
|
|
||||||
m_BaudRateTable.add("9600"); //$NON-NLS-1$
|
|
||||||
m_BaudRateTable.add("19200"); //$NON-NLS-1$
|
|
||||||
m_BaudRateTable.add("38400"); //$NON-NLS-1$
|
|
||||||
m_BaudRateTable.add("57600"); //$NON-NLS-1$
|
|
||||||
m_BaudRateTable.add("115200"); //$NON-NLS-1$
|
|
||||||
|
|
||||||
m_DataBitsTable.add("5"); //$NON-NLS-1$
|
|
||||||
m_DataBitsTable.add("6"); //$NON-NLS-1$
|
|
||||||
m_DataBitsTable.add("7"); //$NON-NLS-1$
|
|
||||||
m_DataBitsTable.add("8"); //$NON-NLS-1$
|
|
||||||
|
|
||||||
m_StopBitsTable.add("1"); //$NON-NLS-1$
|
|
||||||
m_StopBitsTable.add("1_5"); //$NON-NLS-1$
|
|
||||||
m_StopBitsTable.add("2"); //$NON-NLS-1$
|
|
||||||
|
|
||||||
m_ParityTable.add("None"); //$NON-NLS-1$
|
|
||||||
m_ParityTable.add("Even"); //$NON-NLS-1$
|
|
||||||
m_ParityTable.add("Odd"); //$NON-NLS-1$
|
|
||||||
m_ParityTable.add("Mark"); //$NON-NLS-1$
|
|
||||||
m_ParityTable.add("Space"); //$NON-NLS-1$
|
|
||||||
|
|
||||||
m_FlowControlTable.add("None"); //$NON-NLS-1$
|
|
||||||
m_FlowControlTable.add("RTS/CTS"); //$NON-NLS-1$
|
|
||||||
m_FlowControlTable.add("Xon/Xoff"); //$NON-NLS-1$
|
|
||||||
|
|
||||||
m_strDefaultNetworkPort = m_NetworkPortMap.getDefaultNetworkPort();
|
|
||||||
m_strDefaultConnType = (String) m_ConnTypeTable.get(0);
|
|
||||||
m_strDefaultBaudRate = (String) m_BaudRateTable.get(4);
|
|
||||||
m_strDefaultDataBits = (String) m_DataBitsTable.get(3);
|
|
||||||
m_strDefaultStopBits = (String) m_StopBitsTable.get(0);
|
|
||||||
m_strDefaultParity = (String) m_ParityTable.get(0);
|
|
||||||
m_strDefaultFlowControl = (String) m_FlowControlTable.get(0);
|
|
||||||
m_strDefaultHost = ""; //$NON-NLS-1$
|
|
||||||
|
|
||||||
while(portIdEnum.hasMoreElements())
|
|
||||||
{
|
|
||||||
identifier = (CommPortIdentifier)portIdEnum.nextElement();
|
|
||||||
strName = identifier.getName();
|
|
||||||
nPortType = identifier.getPortType();
|
|
||||||
|
|
||||||
if (nPortType == CommPortIdentifier.PORT_SERIAL)
|
|
||||||
m_SerialPortTable.addElement(strName);
|
|
||||||
}
|
|
||||||
|
|
||||||
Collections.sort(m_SerialPortTable);
|
|
||||||
|
|
||||||
if (!m_SerialPortTable.isEmpty())
|
|
||||||
{
|
|
||||||
m_strDefaultSerialPort = (String) m_SerialPortTable.get(0);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
|
@ -1,425 +0,0 @@
|
||||||
/*******************************************************************************
|
|
||||||
* Copyright (c) 2006 Wind River Systems, Inc. and others.
|
|
||||||
* All rights reserved. This program and the accompanying materials
|
|
||||||
* are made available under the terms of the Eclipse Public License v1.0
|
|
||||||
* which accompanies this distribution, and is available at
|
|
||||||
* http://www.eclipse.org/legal/epl-v10.html
|
|
||||||
*
|
|
||||||
* Contributors:
|
|
||||||
* Wind River Systems, Inc. - initial implementation
|
|
||||||
*
|
|
||||||
*******************************************************************************/
|
|
||||||
|
|
||||||
package org.eclipse.tm.terminal;
|
|
||||||
|
|
||||||
import javax.comm.SerialPort;
|
|
||||||
|
|
||||||
import org.eclipse.jface.dialogs.IDialogSettings;
|
|
||||||
|
|
||||||
public class TerminalSettings
|
|
||||||
implements TerminalConsts
|
|
||||||
{
|
|
||||||
protected String m_strConnType;
|
|
||||||
protected String m_strSerialPort;
|
|
||||||
protected String m_strBaudRate;
|
|
||||||
protected String m_strDataBits;
|
|
||||||
protected String m_strStopBits;
|
|
||||||
protected String m_strParity;
|
|
||||||
protected String m_strFlowControl;
|
|
||||||
protected String m_strHost;
|
|
||||||
protected String m_strNetworkPort;
|
|
||||||
|
|
||||||
/**
|
|
||||||
*
|
|
||||||
*/
|
|
||||||
public TerminalSettings(String terminalPartName)
|
|
||||||
{
|
|
||||||
importSettings(terminalPartName);
|
|
||||||
}
|
|
||||||
|
|
||||||
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
|
|
||||||
// Operations
|
|
||||||
//
|
|
||||||
|
|
||||||
/**
|
|
||||||
*
|
|
||||||
*/
|
|
||||||
public String getConnType()
|
|
||||||
{
|
|
||||||
return m_strConnType;
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
*
|
|
||||||
*/
|
|
||||||
public void setConnType(String strConnType)
|
|
||||||
{
|
|
||||||
m_strConnType = strConnType;
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
*
|
|
||||||
*/
|
|
||||||
public String getSerialPort()
|
|
||||||
{
|
|
||||||
return m_strSerialPort;
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
*
|
|
||||||
*/
|
|
||||||
public void setSerialPort(String strSerialPort)
|
|
||||||
{
|
|
||||||
m_strSerialPort = strSerialPort;
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
*
|
|
||||||
*/
|
|
||||||
public String getBaudRate()
|
|
||||||
{
|
|
||||||
return m_strBaudRate;
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
*
|
|
||||||
*/
|
|
||||||
public int getBaudRateValue()
|
|
||||||
{
|
|
||||||
int nBaudRate;
|
|
||||||
|
|
||||||
try
|
|
||||||
{
|
|
||||||
nBaudRate = Integer.parseInt(m_strBaudRate);
|
|
||||||
}
|
|
||||||
catch(NumberFormatException numberFormatException)
|
|
||||||
{
|
|
||||||
nBaudRate = 9600;
|
|
||||||
}
|
|
||||||
|
|
||||||
return nBaudRate;
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
*
|
|
||||||
*/
|
|
||||||
public void setBaudRate(String strBaudRate)
|
|
||||||
{
|
|
||||||
m_strBaudRate = strBaudRate;
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
*
|
|
||||||
*/
|
|
||||||
public String getDataBits()
|
|
||||||
{
|
|
||||||
return m_strDataBits;
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
*
|
|
||||||
*/
|
|
||||||
public int getDataBitsValue()
|
|
||||||
{
|
|
||||||
if (m_strDataBits.equals("5")) //$NON-NLS-1$
|
|
||||||
{
|
|
||||||
return SerialPort.DATABITS_5;
|
|
||||||
}
|
|
||||||
else if (m_strDataBits.equals("6")) //$NON-NLS-1$
|
|
||||||
{
|
|
||||||
return SerialPort.DATABITS_6;
|
|
||||||
}
|
|
||||||
else if (m_strDataBits.equals("7")) //$NON-NLS-1$
|
|
||||||
{
|
|
||||||
return SerialPort.DATABITS_7;
|
|
||||||
}
|
|
||||||
else // 8
|
|
||||||
{
|
|
||||||
return SerialPort.DATABITS_8;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
*
|
|
||||||
*/
|
|
||||||
public void setDataBits(String strDataBits)
|
|
||||||
{
|
|
||||||
m_strDataBits = strDataBits;
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
*
|
|
||||||
*/
|
|
||||||
public String getStopBits()
|
|
||||||
{
|
|
||||||
return m_strStopBits;
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
*
|
|
||||||
*/
|
|
||||||
public int getStopBitsValue()
|
|
||||||
{
|
|
||||||
if (m_strStopBits.equals("1_5")) //$NON-NLS-1$
|
|
||||||
{
|
|
||||||
return SerialPort.STOPBITS_1_5;
|
|
||||||
}
|
|
||||||
else if (m_strStopBits.equals("2")) //$NON-NLS-1$
|
|
||||||
{
|
|
||||||
return SerialPort.STOPBITS_2;
|
|
||||||
}
|
|
||||||
else // 1
|
|
||||||
{
|
|
||||||
return SerialPort.STOPBITS_1;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
*
|
|
||||||
*/
|
|
||||||
public void setStopBits(String strStopBits)
|
|
||||||
{
|
|
||||||
m_strStopBits = strStopBits;
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
*
|
|
||||||
*/
|
|
||||||
public String getParity()
|
|
||||||
{
|
|
||||||
return m_strParity;
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
*
|
|
||||||
*/
|
|
||||||
public int getParityValue()
|
|
||||||
{
|
|
||||||
if (m_strParity.equals("Even")) //$NON-NLS-1$
|
|
||||||
{
|
|
||||||
return SerialPort.PARITY_EVEN;
|
|
||||||
}
|
|
||||||
else if (m_strParity.equals("Odd")) //$NON-NLS-1$
|
|
||||||
{
|
|
||||||
return SerialPort.PARITY_ODD;
|
|
||||||
}
|
|
||||||
else if (m_strParity.equals("Mark")) //$NON-NLS-1$
|
|
||||||
{
|
|
||||||
return SerialPort.PARITY_MARK;
|
|
||||||
}
|
|
||||||
else if (m_strParity.equals("Space")) //$NON-NLS-1$
|
|
||||||
{
|
|
||||||
return SerialPort.PARITY_SPACE;
|
|
||||||
}
|
|
||||||
else // None
|
|
||||||
{
|
|
||||||
return SerialPort.PARITY_NONE;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
*
|
|
||||||
*/
|
|
||||||
public void setParity(String strParity)
|
|
||||||
{
|
|
||||||
m_strParity = strParity;
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
*
|
|
||||||
*/
|
|
||||||
public String getFlowControl()
|
|
||||||
{
|
|
||||||
return m_strFlowControl;
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
*
|
|
||||||
*/
|
|
||||||
public int getFlowControlValue()
|
|
||||||
{
|
|
||||||
if (m_strFlowControl.equals("RTS/CTS")) //$NON-NLS-1$
|
|
||||||
{
|
|
||||||
return SerialPort.FLOWCONTROL_RTSCTS_IN;
|
|
||||||
}
|
|
||||||
else if (m_strFlowControl.equals("Xon/Xoff")) //$NON-NLS-1$
|
|
||||||
{
|
|
||||||
return SerialPort.FLOWCONTROL_XONXOFF_IN;
|
|
||||||
}
|
|
||||||
else // None
|
|
||||||
{
|
|
||||||
return SerialPort.FLOWCONTROL_NONE;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
*
|
|
||||||
*/
|
|
||||||
public void setFlowControl(String strFlow)
|
|
||||||
{
|
|
||||||
m_strFlowControl = strFlow;
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
*
|
|
||||||
*/
|
|
||||||
public String getHost()
|
|
||||||
{
|
|
||||||
return m_strHost;
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
*
|
|
||||||
*/
|
|
||||||
public void setHost(String strHost)
|
|
||||||
{
|
|
||||||
m_strHost = strHost;
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
*
|
|
||||||
*/
|
|
||||||
public String getNetworkPort()
|
|
||||||
{
|
|
||||||
return m_strNetworkPort;
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
*
|
|
||||||
*/
|
|
||||||
public int getNetworkPortValue()
|
|
||||||
{
|
|
||||||
int nNetworkPort;
|
|
||||||
|
|
||||||
try
|
|
||||||
{
|
|
||||||
nNetworkPort = Integer.parseInt(m_strNetworkPort);
|
|
||||||
}
|
|
||||||
catch(NumberFormatException numberFormatException)
|
|
||||||
{
|
|
||||||
nNetworkPort = 1313;
|
|
||||||
}
|
|
||||||
|
|
||||||
return nNetworkPort;
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
*
|
|
||||||
*/
|
|
||||||
public void setNetworkPort(String strNetworkPort)
|
|
||||||
{
|
|
||||||
m_strNetworkPort = strNetworkPort;
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
*
|
|
||||||
*/
|
|
||||||
public void importSettings(String terminalPartName)
|
|
||||||
{
|
|
||||||
TerminalPlugin plugin;
|
|
||||||
TerminalProperties properties;
|
|
||||||
|
|
||||||
plugin = TerminalPlugin.getDefault();
|
|
||||||
properties = plugin.getTerminalProperties();
|
|
||||||
m_strConnType = importSetting(terminalPartName, "ConnType", //$NON-NLS-1$
|
|
||||||
properties.getDefaultConnType());
|
|
||||||
m_strSerialPort = importSetting(terminalPartName, "SerialPort", //$NON-NLS-1$
|
|
||||||
properties.getDefaultSerialPort());
|
|
||||||
m_strBaudRate = importSetting(terminalPartName, "BaudRate", //$NON-NLS-1$
|
|
||||||
properties.getDefaultBaudRate());
|
|
||||||
m_strDataBits = importSetting(terminalPartName, "DataBits", //$NON-NLS-1$
|
|
||||||
properties.getDefaultDataBits());
|
|
||||||
m_strStopBits = importSetting(terminalPartName, "StopBits", //$NON-NLS-1$
|
|
||||||
properties.getDefaultStopBits());
|
|
||||||
m_strParity = importSetting(terminalPartName, "Parity", //$NON-NLS-1$
|
|
||||||
properties.getDefaultParity());
|
|
||||||
m_strFlowControl = importSetting(terminalPartName, "FlowControl", //$NON-NLS-1$
|
|
||||||
properties.getDefaultFlowControl());
|
|
||||||
m_strHost = importSetting(terminalPartName, "Host", //$NON-NLS-1$
|
|
||||||
properties.getDefaultHost());
|
|
||||||
m_strNetworkPort = importSetting(terminalPartName, "NetworkPort", //$NON-NLS-1$
|
|
||||||
properties.getDefaultNetworkPort());
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
*
|
|
||||||
*/
|
|
||||||
public void exportSettings(String terminalPartName)
|
|
||||||
{
|
|
||||||
TerminalPlugin plugin;
|
|
||||||
TerminalProperties properties;
|
|
||||||
|
|
||||||
plugin = TerminalPlugin.getDefault();
|
|
||||||
properties = plugin.getTerminalProperties();
|
|
||||||
|
|
||||||
exportSetting(terminalPartName, "ConnType", m_strConnType, //$NON-NLS-1$
|
|
||||||
properties.getDefaultConnType());
|
|
||||||
exportSetting(terminalPartName, "SerialPort", m_strSerialPort, //$NON-NLS-1$
|
|
||||||
properties.getDefaultSerialPort());
|
|
||||||
exportSetting(terminalPartName, "BaudRate", m_strBaudRate, //$NON-NLS-1$
|
|
||||||
properties.getDefaultBaudRate());
|
|
||||||
exportSetting(terminalPartName, "DataBits", m_strDataBits, //$NON-NLS-1$
|
|
||||||
properties.getDefaultDataBits());
|
|
||||||
exportSetting(terminalPartName, "StopBits", m_strStopBits, //$NON-NLS-1$
|
|
||||||
properties.getDefaultStopBits());
|
|
||||||
exportSetting(terminalPartName, "Parity", m_strParity, //$NON-NLS-1$
|
|
||||||
properties.getDefaultParity());
|
|
||||||
exportSetting(terminalPartName, "FlowControl", m_strFlowControl, //$NON-NLS-1$
|
|
||||||
properties.getDefaultFlowControl());
|
|
||||||
exportSetting(terminalPartName, "Host", m_strHost, //$NON-NLS-1$
|
|
||||||
properties.getDefaultHost());
|
|
||||||
exportSetting(terminalPartName, "NetworkPort", m_strNetworkPort, //$NON-NLS-1$
|
|
||||||
properties.getDefaultNetworkPort());
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
*
|
|
||||||
*/
|
|
||||||
protected String importSetting(String terminalPartName, String strName, String strDefault)
|
|
||||||
{
|
|
||||||
TerminalPlugin plugin;
|
|
||||||
IDialogSettings settings;
|
|
||||||
String strPrefix;
|
|
||||||
String strKey;
|
|
||||||
String strValue;
|
|
||||||
|
|
||||||
plugin = TerminalPlugin.getDefault();
|
|
||||||
settings = plugin.getDialogSettings();
|
|
||||||
strPrefix = TerminalSettings.class.getName() + "."; //$NON-NLS-1$
|
|
||||||
strKey = strPrefix + terminalPartName + "." + strName; //$NON-NLS-1$
|
|
||||||
strValue = settings.get(strKey);
|
|
||||||
|
|
||||||
if ((strValue == null) ||
|
|
||||||
(strValue.equals(""))) //$NON-NLS-1$
|
|
||||||
return strDefault;
|
|
||||||
|
|
||||||
return strValue;
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
*
|
|
||||||
*/
|
|
||||||
protected void exportSetting(String terminalPartName, String strName, String strValue,
|
|
||||||
String strDefault)
|
|
||||||
{
|
|
||||||
TerminalPlugin plugin;
|
|
||||||
IDialogSettings settings;
|
|
||||||
String strPrefix;
|
|
||||||
String strKey;
|
|
||||||
|
|
||||||
plugin = TerminalPlugin.getDefault();
|
|
||||||
settings = plugin.getDialogSettings();
|
|
||||||
strPrefix = TerminalSettings.class.getName() + "."; //$NON-NLS-1$
|
|
||||||
strKey = strPrefix + terminalPartName + "." + strName; //$NON-NLS-1$
|
|
||||||
|
|
||||||
if ((strValue == null) ||
|
|
||||||
(strValue.equals(""))) //$NON-NLS-1$
|
|
||||||
{
|
|
||||||
settings.put(strKey,strDefault);
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
settings.put(strKey,strValue);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|