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
|
||||
{
|
||||
protected TerminalActionClearAll(TerminalTarget target)
|
||||
public TerminalActionClearAll(ITerminalView target)
|
||||
{
|
||||
super(target,
|
||||
ON_EDIT_CLEARALL,
|
||||
TerminalActionClearAll.class.getName());
|
||||
|
||||
setupAction(TERMINAL_TEXT_CLEARALL,
|
||||
TERMINAL_TEXT_CLEARALL,
|
||||
setupAction(ActionMessages.CLEARALL,
|
||||
ActionMessages.CLEARALL,
|
||||
null,
|
||||
null,
|
||||
null,
|
||||
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
|
||||
{
|
||||
protected TerminalActionConnect(TerminalTarget target)
|
||||
public TerminalActionConnect(ITerminalView target)
|
||||
{
|
||||
super(target,
|
||||
ON_TERMINAL_CONNECT,
|
||||
TerminalActionConnect.class.getName());
|
||||
|
||||
setupAction(TERMINAL_TEXT_CONNECT,
|
||||
TERMINAL_TEXT_CONNECT,
|
||||
TERMINAL_IMAGE_CLCL_CONNECT,
|
||||
TERMINAL_IMAGE_ELCL_CONNECT,
|
||||
TERMINAL_IMAGE_DLCL_CONNECT,
|
||||
setupAction(ActionMessages.CONNECT,
|
||||
ActionMessages.CONNECT,
|
||||
ImageConsts.IMAGE_CLCL_CONNECT,
|
||||
ImageConsts.IMAGE_ELCL_CONNECT,
|
||||
ImageConsts.IMAGE_DLCL_CONNECT,
|
||||
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.tm.terminal.internal.view.ITerminalView;
|
||||
import org.eclipse.ui.ISharedImages;
|
||||
import org.eclipse.ui.internal.WorkbenchImages;
|
||||
|
||||
public class TerminalActionCopy extends TerminalAction
|
||||
{
|
||||
protected TerminalActionCopy(TerminalTarget target)
|
||||
public TerminalActionCopy(ITerminalView target)
|
||||
{
|
||||
super(target,
|
||||
ON_EDIT_COPY,
|
||||
TerminalActionCopy.class.getName());
|
||||
|
||||
ImageRegistry imageRegistry;
|
||||
|
||||
imageRegistry = WorkbenchImages.getImageRegistry();
|
||||
setupAction(TERMINAL_TEXT_COPY,
|
||||
TERMINAL_TEXT_COPY,
|
||||
setupAction(ActionMessages.COPY,
|
||||
ActionMessages.COPY,
|
||||
ISharedImages.IMG_TOOL_COPY,
|
||||
ISharedImages.IMG_TOOL_COPY,
|
||||
ISharedImages.IMG_TOOL_COPY_DISABLED,
|
||||
true,
|
||||
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.tm.terminal.internal.view.ITerminalView;
|
||||
import org.eclipse.ui.ISharedImages;
|
||||
import org.eclipse.ui.internal.WorkbenchImages;
|
||||
|
||||
public class TerminalActionCut extends TerminalAction
|
||||
{
|
||||
protected TerminalActionCut(TerminalTarget target)
|
||||
public TerminalActionCut(ITerminalView target)
|
||||
{
|
||||
super(target,
|
||||
ON_EDIT_CUT,
|
||||
TerminalActionCut.class.getName());
|
||||
|
||||
ImageRegistry imageRegistry;
|
||||
|
||||
imageRegistry = WorkbenchImages.getImageRegistry();
|
||||
setupAction(TERMINAL_TEXT_CUT,
|
||||
TERMINAL_TEXT_CUT,
|
||||
setupAction(ActionMessages.CUT,
|
||||
ActionMessages.CUT,
|
||||
ISharedImages.IMG_TOOL_CUT,
|
||||
ISharedImages.IMG_TOOL_CUT,
|
||||
ISharedImages.IMG_TOOL_CUT_DISABLED,
|
||||
true,
|
||||
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
|
||||
{
|
||||
/**
|
||||
*
|
||||
*/
|
||||
protected TerminalActionDisconnect(TerminalTarget target)
|
||||
public TerminalActionDisconnect(ITerminalView target)
|
||||
{
|
||||
super(target,
|
||||
ON_TERMINAL_DISCONNECT,
|
||||
TerminalActionDisconnect.class.getName());
|
||||
|
||||
setupAction(TERMINAL_TEXT_DISCONNECT,
|
||||
TERMINAL_TEXT_DISCONNECT,
|
||||
TERMINAL_IMAGE_CLCL_DISCONNECT,
|
||||
TERMINAL_IMAGE_ELCL_DISCONNECT,
|
||||
TERMINAL_IMAGE_DLCL_DISCONNECT,
|
||||
setupAction(ActionMessages.DISCONNECT,
|
||||
ActionMessages.DISCONNECT,
|
||||
ImageConsts.IMAGE_CLCL_DISCONNECT,
|
||||
ImageConsts.IMAGE_ELCL_DISCONNECT,
|
||||
ImageConsts.IMAGE_DLCL_DISCONNECT,
|
||||
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
|
||||
|
@ -22,15 +25,18 @@ public class TerminalActionNewTerminal extends TerminalAction
|
|||
/**
|
||||
* 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,
|
||||
TERMINAL_TEXT_NEW_TERMINAL,
|
||||
TERMINAL_IMAGE_NEW_TERMINAL,
|
||||
TERMINAL_IMAGE_NEW_TERMINAL,
|
||||
TERMINAL_IMAGE_NEW_TERMINAL,
|
||||
setupAction(ActionMessages.NEW_TERMINAL,
|
||||
ActionMessages.NEW_TERMINAL,
|
||||
ImageConsts.IMAGE_NEW_TERMINAL,
|
||||
ImageConsts.IMAGE_NEW_TERMINAL,
|
||||
ImageConsts.IMAGE_NEW_TERMINAL,
|
||||
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.tm.terminal.internal.view.ITerminalView;
|
||||
import org.eclipse.ui.ISharedImages;
|
||||
import org.eclipse.ui.internal.WorkbenchImages;
|
||||
|
||||
public class TerminalActionPaste extends TerminalAction
|
||||
{
|
||||
protected TerminalActionPaste(TerminalTarget target)
|
||||
public TerminalActionPaste(ITerminalView target)
|
||||
{
|
||||
super(target,
|
||||
ON_EDIT_PASTE,
|
||||
TerminalActionPaste.class.getName());
|
||||
|
||||
ImageRegistry imageRegistry;
|
||||
|
||||
imageRegistry = WorkbenchImages.getImageRegistry();
|
||||
setupAction(TERMINAL_TEXT_PASTE,
|
||||
TERMINAL_TEXT_PASTE,
|
||||
setupAction(ActionMessages.PASTE,
|
||||
ActionMessages.PASTE,
|
||||
ISharedImages.IMG_TOOL_PASTE,
|
||||
ISharedImages.IMG_TOOL_PASTE_DISABLED,
|
||||
ISharedImages.IMG_TOOL_PASTE,
|
||||
false,
|
||||
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
|
||||
{
|
||||
protected TerminalActionSelectAll(TerminalTarget target)
|
||||
public TerminalActionSelectAll(ITerminalView target)
|
||||
{
|
||||
super(target,
|
||||
ON_EDIT_SELECTALL,
|
||||
TerminalActionSelectAll.class.getName());
|
||||
|
||||
setupAction(TERMINAL_TEXT_SELECTALL,
|
||||
TERMINAL_TEXT_SELECTALL,
|
||||
setupAction(ActionMessages.SELECTALL,
|
||||
ActionMessages.SELECTALL,
|
||||
null,
|
||||
null,
|
||||
null,
|
||||
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
|
||||
{
|
||||
protected TerminalActionSettings(TerminalTarget target)
|
||||
public TerminalActionSettings(ITerminalView target)
|
||||
{
|
||||
super(target,
|
||||
ON_TERMINAL_SETTINGS,
|
||||
TerminalActionSettings.class.getName());
|
||||
|
||||
setupAction(TERMINAL_TEXT_SETTINGS_ELLIPSE,
|
||||
TERMINAL_TEXT_SETTINGS,
|
||||
TERMINAL_IMAGE_CLCL_SETTINGS,
|
||||
TERMINAL_IMAGE_ELCL_SETTINGS,
|
||||
TERMINAL_IMAGE_DLCL_SETTINGS,
|
||||
setupAction(ActionMessages.SETTINGS_ELLIPSE,
|
||||
ActionMessages.SETTINGS,
|
||||
ImageConsts.IMAGE_CLCL_SETTINGS,
|
||||
ImageConsts.IMAGE_ELCL_SETTINGS,
|
||||
ImageConsts.IMAGE_DLCL_SETTINGS,
|
||||
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"?>
|
||||
<classpath>
|
||||
<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.pde.core.requiredPlugins"/>
|
||||
<classpathentry kind="output" path="bin"/>
|
||||
</classpath>
|
||||
|
|
|
@ -20,9 +20,15 @@
|
|||
<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>
|
||||
|
|
|
@ -1,8 +1,58 @@
|
|||
#Mon Jul 31 14:55:18 CEST 2006
|
||||
#Thu Nov 30 18:38:38 CET 2006
|
||||
eclipse.preferences.version=1
|
||||
org.eclipse.jdt.core.compiler.codegen.inlineJsrBytecode=disabled
|
||||
org.eclipse.jdt.core.compiler.codegen.targetPlatform=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.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.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
|
||||
|
|
|
@ -2,17 +2,15 @@ Manifest-Version: 1.0
|
|||
Bundle-ManifestVersion: 2
|
||||
Bundle-Name: %pluginName
|
||||
Bundle-SymbolicName: org.eclipse.tm.terminal; singleton:=true
|
||||
Bundle-Version: 2.6.0
|
||||
Bundle-Activator: org.eclipse.tm.terminal.TerminalPlugin
|
||||
Bundle-Version: 2.7.0
|
||||
Bundle-Activator: org.eclipse.tm.terminal.internal.control.TerminalPlugin
|
||||
Bundle-Vendor: %providerName
|
||||
Bundle-Localization: plugin
|
||||
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.jface.text
|
||||
Eclipse-LazyStart: true
|
||||
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
|
||||
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"?>
|
||||
<?eclipse version="3.0"?>
|
||||
<plugin>
|
||||
<extension-point id="terminalConnector" name="Terminal Connector" schema="schema/terminalConnector.exsd"/>
|
||||
<extension
|
||||
point="org.eclipse.ui.views">
|
||||
<category
|
||||
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"/>
|
||||
point="org.eclipse.tm.terminal.terminalConnector">
|
||||
<connector class="org.eclipse.tm.terminal.internal.telnet.TelnetConnector"/>
|
||||
</extension>
|
||||
</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,102 +16,98 @@ import java.io.File;
|
|||
import java.io.FileOutputStream;
|
||||
import java.io.PrintStream;
|
||||
|
||||
|
||||
/**
|
||||
* A simple logger class. Every method in this class is static, so they can be called
|
||||
* from both class and instance methods. To use this class, write code like this: <p>
|
||||
* A simple logger class. Every method in this class is static, so they can be
|
||||
* called from both class and instance methods. To use this class, write code
|
||||
* like this:
|
||||
* <p>
|
||||
*
|
||||
* <pre>
|
||||
* Logger.log("something has happened");
|
||||
* Logger.log("counter is " + counter);
|
||||
* Logger.log("something has happened");
|
||||
* Logger.log("counter is " + counter);
|
||||
* </pre>
|
||||
*
|
||||
* @author Fran Litterio <francis.litterio@windriver.com>
|
||||
*/
|
||||
public final class Logger
|
||||
{
|
||||
/**
|
||||
* UNDER CONSTRUCTION
|
||||
*/
|
||||
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$
|
||||
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;
|
||||
|
||||
static
|
||||
{
|
||||
String logFile = null;
|
||||
File logDirWindows = new File("C:\\wblogs"); //$NON-NLS-1$
|
||||
File logDirUNIX = new File("/tmp/wblogs"); //$NON-NLS-1$
|
||||
static {
|
||||
String logFile = null;
|
||||
File logDirWindows = new File("C:\\wblogs"); //$NON-NLS-1$
|
||||
File logDirUNIX = new File("/tmp/wblogs"); //$NON-NLS-1$
|
||||
|
||||
if (logDirWindows.isDirectory())
|
||||
{
|
||||
logFile = logDirWindows + "\\wbterminal.log"; //$NON-NLS-1$
|
||||
}
|
||||
else if (logDirUNIX.isDirectory())
|
||||
{
|
||||
logFile = logDirUNIX + "/wbterminal.log"; //$NON-NLS-1$
|
||||
}
|
||||
if (logDirWindows.isDirectory()) {
|
||||
logFile = logDirWindows + "\\wbterminal.log"; //$NON-NLS-1$
|
||||
} else if (logDirUNIX.isDirectory()) {
|
||||
logFile = logDirUNIX + "/wbterminal.log"; //$NON-NLS-1$
|
||||
}
|
||||
|
||||
if (logFile != null)
|
||||
{
|
||||
try
|
||||
{
|
||||
logStream = new PrintStream(new FileOutputStream(logFile, true));
|
||||
}
|
||||
catch (Exception ex)
|
||||
{
|
||||
logStream = System.err;
|
||||
logStream.println("Exception when opening log file -- logging to stderr!"); //$NON-NLS-1$
|
||||
ex.printStackTrace(logStream);
|
||||
}
|
||||
}
|
||||
}
|
||||
if (logFile != null) {
|
||||
try {
|
||||
logStream = new PrintStream(new FileOutputStream(logFile, true));
|
||||
} catch (Exception ex) {
|
||||
logStream = System.err;
|
||||
logStream
|
||||
.println("Exception when opening log file -- logging to stderr!"); //$NON-NLS-1$
|
||||
ex.printStackTrace(logStream);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Logs the specified message. Do not append a newline to parameter
|
||||
* <i>message</i>. This method does that for you.
|
||||
*
|
||||
/**
|
||||
* Logs the specified message. Do not append a newline to parameter
|
||||
* <i>message</i>. This method does that for you.
|
||||
*
|
||||
* @param message A String containing the message to log.
|
||||
*/
|
||||
public static final void log(String message)
|
||||
{
|
||||
if (logStream != null)
|
||||
{
|
||||
// Read my own stack to get the class name, method name, and line number of
|
||||
// where this method was called.
|
||||
*/
|
||||
public static final void log(String message) {
|
||||
if (logStream != null) {
|
||||
// Read my own stack to get the class name, method name, and line
|
||||
// number of
|
||||
// where this method was called.
|
||||
|
||||
StackTraceElement caller = new Throwable().getStackTrace()[1];
|
||||
int lineNumber = caller.getLineNumber();
|
||||
String className = caller.getClassName();
|
||||
String methodName = caller.getMethodName();
|
||||
className = className.substring(className.lastIndexOf('.') + 1);
|
||||
StackTraceElement caller = new Throwable().getStackTrace()[1];
|
||||
int lineNumber = caller.getLineNumber();
|
||||
String className = caller.getClassName();
|
||||
String methodName = caller.getMethodName();
|
||||
className = className.substring(className.lastIndexOf('.') + 1);
|
||||
|
||||
logStream.println(className + "." + methodName + ":" + lineNumber + ": " + message); //$NON-NLS-1$//$NON-NLS-2$//$NON-NLS-3$
|
||||
logStream.flush();
|
||||
}
|
||||
}
|
||||
logStream.flush();
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Writes a stack trace for an exception to both Standard Error and to the log file.
|
||||
*/
|
||||
public static final void logException(Exception ex)
|
||||
{
|
||||
// Read my own stack to get the class name, method name, and line number of
|
||||
// where this method was called.
|
||||
/**
|
||||
* Writes a stack trace for an exception to both Standard Error and to the
|
||||
* log file.
|
||||
*/
|
||||
public static final void logException(Exception ex) {
|
||||
// Read my own stack to get the class name, method name, and line number
|
||||
// of
|
||||
// where this method was called.
|
||||
|
||||
StackTraceElement caller = new Throwable().getStackTrace()[1];
|
||||
int lineNumber = caller.getLineNumber();
|
||||
String className = caller.getClassName();
|
||||
String methodName = caller.getMethodName();
|
||||
className = className.substring(className.lastIndexOf('.') + 1);
|
||||
StackTraceElement caller = new Throwable().getStackTrace()[1];
|
||||
int lineNumber = caller.getLineNumber();
|
||||
String className = caller.getClassName();
|
||||
String methodName = caller.getMethodName();
|
||||
className = className.substring(className.lastIndexOf('.') + 1);
|
||||
|
||||
PrintStream tmpStream = System.err;
|
||||
PrintStream tmpStream = System.err;
|
||||
|
||||
if (logStream != null)
|
||||
{
|
||||
tmpStream = logStream;
|
||||
}
|
||||
if (logStream != null) {
|
||||
tmpStream = logStream;
|
||||
}
|
||||
|
||||
tmpStream.println(className + "." + methodName + ":" + lineNumber + ": " + //$NON-NLS-1$//$NON-NLS-2$ //$NON-NLS-3$
|
||||
"Caught exception: " + ex); //$NON-NLS-1$
|
||||
ex.printStackTrace(tmpStream);
|
||||
}
|
||||
tmpStream.println(className
|
||||
+ "." + methodName + ":" + lineNumber + ": " + //$NON-NLS-1$//$NON-NLS-2$ //$NON-NLS-3$
|
||||
"Caught exception: " + ex); //$NON-NLS-1$
|
||||
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);
|
||||
}
|
||||
}
|
||||
}
|