1
0
Fork 0
mirror of https://github.com/eclipse-cdt/cdt synced 2025-04-23 22:52:11 +02:00

bug 165177: split the plugin into the terminal view and connection contributions

This commit is contained in:
Michael Scharf 2006-12-01 03:08:19 +00:00
parent 9c21c6da68
commit 9eb580a8f2
125 changed files with 8780 additions and 9239 deletions

View 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>

View file

@ -0,0 +1 @@
bin.includes = feature.xml

View 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>

View 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>

View file

@ -0,0 +1 @@
bin.includes = feature.xml

View 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>

View 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>

View 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>

View file

@ -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

View 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

View file

@ -0,0 +1,4 @@
Important note:
In order to compile this plugin, comm has to be installed into
the java installation...

View 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

View file

@ -0,0 +1,6 @@
##########################################################################
# Copyright 2004 Wind River Systems, Inc. All rights reserved.
##########################################################################
pluginName = Serial Terminal
providerName = Eclipse.org

View 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>

View file

@ -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);
}

View file

@ -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);
}
}
}

View file

@ -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);
}
}

View file

@ -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;
}

View file

@ -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)

View file

@ -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;
}
}
}

View file

@ -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);
}
}
}

View file

@ -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;
}
}

View file

@ -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;
}
}

View 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>

View file

@ -0,0 +1 @@
bin.includes = feature.xml

View 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>

View 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>

View 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>

View file

@ -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

View file

@ -0,0 +1,3 @@
#Mon Jul 31 14:55:17 CEST 2006
eclipse.preferences.version=1
internal.default.compliance=user

View 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

View 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/

View file

Before

Width:  |  Height:  |  Size: 139 B

After

Width:  |  Height:  |  Size: 139 B

View file

Before

Width:  |  Height:  |  Size: 146 B

After

Width:  |  Height:  |  Size: 146 B

View file

Before

Width:  |  Height:  |  Size: 351 B

After

Width:  |  Height:  |  Size: 351 B

View file

Before

Width:  |  Height:  |  Size: 118 B

After

Width:  |  Height:  |  Size: 118 B

View file

Before

Width:  |  Height:  |  Size: 938 B

After

Width:  |  Height:  |  Size: 938 B

View file

Before

Width:  |  Height:  |  Size: 874 B

After

Width:  |  Height:  |  Size: 874 B

View file

Before

Width:  |  Height:  |  Size: 90 B

After

Width:  |  Height:  |  Size: 90 B

View file

Before

Width:  |  Height:  |  Size: 351 B

After

Width:  |  Height:  |  Size: 351 B

View file

Before

Width:  |  Height:  |  Size: 90 B

After

Width:  |  Height:  |  Size: 90 B

View file

Before

Width:  |  Height:  |  Size: 890 B

After

Width:  |  Height:  |  Size: 890 B

View file

Before

Width:  |  Height:  |  Size: 118 B

After

Width:  |  Height:  |  Size: 118 B

View file

Before

Width:  |  Height:  |  Size: 351 B

After

Width:  |  Height:  |  Size: 351 B

View file

Before

Width:  |  Height:  |  Size: 118 B

After

Width:  |  Height:  |  Size: 118 B

View file

Before

Width:  |  Height:  |  Size: 938 B

After

Width:  |  Height:  |  Size: 938 B

View 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

View 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>

View file

@ -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;
}

View file

@ -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

View file

@ -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);
}
}
}

View file

@ -12,23 +12,28 @@
*******************************************************************************/ *******************************************************************************/
package org.eclipse.tm.terminal; package org.eclipse.tm.terminal.internal.actions;
import org.eclipse.tm.terminal.internal.view.ITerminalView;
public class TerminalActionClearAll extends TerminalAction public class TerminalActionClearAll extends TerminalAction
{ {
protected TerminalActionClearAll(TerminalTarget target) public TerminalActionClearAll(ITerminalView target)
{ {
super(target, super(target,
ON_EDIT_CLEARALL,
TerminalActionClearAll.class.getName()); TerminalActionClearAll.class.getName());
setupAction(TERMINAL_TEXT_CLEARALL, setupAction(ActionMessages.CLEARALL,
TERMINAL_TEXT_CLEARALL, ActionMessages.CLEARALL,
null, null,
null, null,
null, null,
false); false);
} }
public void run() {
fTarget.onEditClearAll();
}
} }

View file

@ -11,21 +11,26 @@
*******************************************************************************/ *******************************************************************************/
package org.eclipse.tm.terminal; package org.eclipse.tm.terminal.internal.actions;
import org.eclipse.tm.terminal.internal.view.ITerminalView;
import org.eclipse.tm.terminal.internal.view.ImageConsts;
public class TerminalActionConnect extends TerminalAction public class TerminalActionConnect extends TerminalAction
{ {
protected TerminalActionConnect(TerminalTarget target) public TerminalActionConnect(ITerminalView target)
{ {
super(target, super(target,
ON_TERMINAL_CONNECT,
TerminalActionConnect.class.getName()); TerminalActionConnect.class.getName());
setupAction(TERMINAL_TEXT_CONNECT, setupAction(ActionMessages.CONNECT,
TERMINAL_TEXT_CONNECT, ActionMessages.CONNECT,
TERMINAL_IMAGE_CLCL_CONNECT, ImageConsts.IMAGE_CLCL_CONNECT,
TERMINAL_IMAGE_ELCL_CONNECT, ImageConsts.IMAGE_ELCL_CONNECT,
TERMINAL_IMAGE_DLCL_CONNECT, ImageConsts.IMAGE_DLCL_CONNECT,
true); true);
} }
public void run() {
fTarget.onTerminalConnect();
}
} }

View file

@ -10,29 +10,32 @@
* *
*******************************************************************************/ *******************************************************************************/
package org.eclipse.tm.terminal; package org.eclipse.tm.terminal.internal.actions;
import org.eclipse.jface.resource.ImageRegistry; import org.eclipse.jface.resource.ImageRegistry;
import org.eclipse.tm.terminal.internal.view.ITerminalView;
import org.eclipse.ui.ISharedImages; import org.eclipse.ui.ISharedImages;
import org.eclipse.ui.internal.WorkbenchImages; import org.eclipse.ui.internal.WorkbenchImages;
public class TerminalActionCopy extends TerminalAction public class TerminalActionCopy extends TerminalAction
{ {
protected TerminalActionCopy(TerminalTarget target) public TerminalActionCopy(ITerminalView target)
{ {
super(target, super(target,
ON_EDIT_COPY,
TerminalActionCopy.class.getName()); TerminalActionCopy.class.getName());
ImageRegistry imageRegistry; ImageRegistry imageRegistry;
imageRegistry = WorkbenchImages.getImageRegistry(); imageRegistry = WorkbenchImages.getImageRegistry();
setupAction(TERMINAL_TEXT_COPY, setupAction(ActionMessages.COPY,
TERMINAL_TEXT_COPY, ActionMessages.COPY,
ISharedImages.IMG_TOOL_COPY, ISharedImages.IMG_TOOL_COPY,
ISharedImages.IMG_TOOL_COPY, ISharedImages.IMG_TOOL_COPY,
ISharedImages.IMG_TOOL_COPY_DISABLED, ISharedImages.IMG_TOOL_COPY_DISABLED,
true, true,
imageRegistry); imageRegistry);
} }
public void run() {
fTarget.onEditCopy();
}
} }

View file

@ -10,29 +10,32 @@
* *
*******************************************************************************/ *******************************************************************************/
package org.eclipse.tm.terminal; package org.eclipse.tm.terminal.internal.actions;
import org.eclipse.jface.resource.ImageRegistry; import org.eclipse.jface.resource.ImageRegistry;
import org.eclipse.tm.terminal.internal.view.ITerminalView;
import org.eclipse.ui.ISharedImages; import org.eclipse.ui.ISharedImages;
import org.eclipse.ui.internal.WorkbenchImages; import org.eclipse.ui.internal.WorkbenchImages;
public class TerminalActionCut extends TerminalAction public class TerminalActionCut extends TerminalAction
{ {
protected TerminalActionCut(TerminalTarget target) public TerminalActionCut(ITerminalView target)
{ {
super(target, super(target,
ON_EDIT_CUT,
TerminalActionCut.class.getName()); TerminalActionCut.class.getName());
ImageRegistry imageRegistry; ImageRegistry imageRegistry;
imageRegistry = WorkbenchImages.getImageRegistry(); imageRegistry = WorkbenchImages.getImageRegistry();
setupAction(TERMINAL_TEXT_CUT, setupAction(ActionMessages.CUT,
TERMINAL_TEXT_CUT, ActionMessages.CUT,
ISharedImages.IMG_TOOL_CUT, ISharedImages.IMG_TOOL_CUT,
ISharedImages.IMG_TOOL_CUT, ISharedImages.IMG_TOOL_CUT,
ISharedImages.IMG_TOOL_CUT_DISABLED, ISharedImages.IMG_TOOL_CUT_DISABLED,
true, true,
imageRegistry); imageRegistry);
} }
public void run() {
fTarget.onEditCut();
}
} }

View file

@ -10,24 +10,29 @@
* *
*******************************************************************************/ *******************************************************************************/
package org.eclipse.tm.terminal; package org.eclipse.tm.terminal.internal.actions;
import org.eclipse.tm.terminal.internal.view.ITerminalView;
import org.eclipse.tm.terminal.internal.view.ImageConsts;
public class TerminalActionDisconnect extends TerminalAction public class TerminalActionDisconnect extends TerminalAction
{ {
/** /**
* *
*/ */
protected TerminalActionDisconnect(TerminalTarget target) public TerminalActionDisconnect(ITerminalView target)
{ {
super(target, super(target,
ON_TERMINAL_DISCONNECT,
TerminalActionDisconnect.class.getName()); TerminalActionDisconnect.class.getName());
setupAction(TERMINAL_TEXT_DISCONNECT, setupAction(ActionMessages.DISCONNECT,
TERMINAL_TEXT_DISCONNECT, ActionMessages.DISCONNECT,
TERMINAL_IMAGE_CLCL_DISCONNECT, ImageConsts.IMAGE_CLCL_DISCONNECT,
TERMINAL_IMAGE_ELCL_DISCONNECT, ImageConsts.IMAGE_ELCL_DISCONNECT,
TERMINAL_IMAGE_DLCL_DISCONNECT, ImageConsts.IMAGE_DLCL_DISCONNECT,
false); false);
} }
public void run() {
fTarget.onTerminalDisconnect();
}
} }

View file

@ -10,7 +10,10 @@
* *
*******************************************************************************/ *******************************************************************************/
package org.eclipse.tm.terminal; package org.eclipse.tm.terminal.internal.actions;
import org.eclipse.tm.terminal.internal.view.ITerminalView;
import org.eclipse.tm.terminal.internal.view.ImageConsts;
/** /**
* UNDER CONSTRUCTION * UNDER CONSTRUCTION
@ -22,15 +25,18 @@ public class TerminalActionNewTerminal extends TerminalAction
/** /**
* UNDER CONSTRUCTION * UNDER CONSTRUCTION
*/ */
protected TerminalActionNewTerminal(TerminalTarget target) public TerminalActionNewTerminal(ITerminalView target)
{ {
super(target, ON_TERMINAL_NEW_TERMINAL, TerminalActionNewTerminal.class.getName()); super(target, TerminalActionNewTerminal.class.getName());
setupAction(TERMINAL_TEXT_NEW_TERMINAL, setupAction(ActionMessages.NEW_TERMINAL,
TERMINAL_TEXT_NEW_TERMINAL, ActionMessages.NEW_TERMINAL,
TERMINAL_IMAGE_NEW_TERMINAL, ImageConsts.IMAGE_NEW_TERMINAL,
TERMINAL_IMAGE_NEW_TERMINAL, ImageConsts.IMAGE_NEW_TERMINAL,
TERMINAL_IMAGE_NEW_TERMINAL, ImageConsts.IMAGE_NEW_TERMINAL,
true); true);
} }
public void run() {
fTarget.onTerminalNewTerminal();
}
} }

View file

@ -10,29 +10,32 @@
* *
*******************************************************************************/ *******************************************************************************/
package org.eclipse.tm.terminal; package org.eclipse.tm.terminal.internal.actions;
import org.eclipse.jface.resource.ImageRegistry; import org.eclipse.jface.resource.ImageRegistry;
import org.eclipse.tm.terminal.internal.view.ITerminalView;
import org.eclipse.ui.ISharedImages; import org.eclipse.ui.ISharedImages;
import org.eclipse.ui.internal.WorkbenchImages; import org.eclipse.ui.internal.WorkbenchImages;
public class TerminalActionPaste extends TerminalAction public class TerminalActionPaste extends TerminalAction
{ {
protected TerminalActionPaste(TerminalTarget target) public TerminalActionPaste(ITerminalView target)
{ {
super(target, super(target,
ON_EDIT_PASTE,
TerminalActionPaste.class.getName()); TerminalActionPaste.class.getName());
ImageRegistry imageRegistry; ImageRegistry imageRegistry;
imageRegistry = WorkbenchImages.getImageRegistry(); imageRegistry = WorkbenchImages.getImageRegistry();
setupAction(TERMINAL_TEXT_PASTE, setupAction(ActionMessages.PASTE,
TERMINAL_TEXT_PASTE, ActionMessages.PASTE,
ISharedImages.IMG_TOOL_PASTE, ISharedImages.IMG_TOOL_PASTE,
ISharedImages.IMG_TOOL_PASTE_DISABLED, ISharedImages.IMG_TOOL_PASTE_DISABLED,
ISharedImages.IMG_TOOL_PASTE, ISharedImages.IMG_TOOL_PASTE,
false, false,
imageRegistry); imageRegistry);
} }
public void run() {
fTarget.onEditPaste();
}
} }

View file

@ -10,21 +10,25 @@
* *
*******************************************************************************/ *******************************************************************************/
package org.eclipse.tm.terminal; package org.eclipse.tm.terminal.internal.actions;
import org.eclipse.tm.terminal.internal.view.ITerminalView;
public class TerminalActionSelectAll extends TerminalAction public class TerminalActionSelectAll extends TerminalAction
{ {
protected TerminalActionSelectAll(TerminalTarget target) public TerminalActionSelectAll(ITerminalView target)
{ {
super(target, super(target,
ON_EDIT_SELECTALL,
TerminalActionSelectAll.class.getName()); TerminalActionSelectAll.class.getName());
setupAction(TERMINAL_TEXT_SELECTALL, setupAction(ActionMessages.SELECTALL,
TERMINAL_TEXT_SELECTALL, ActionMessages.SELECTALL,
null, null,
null, null,
null, null,
false); false);
} }
public void run() {
fTarget.onEditSelectAll();
}
} }

View file

@ -10,21 +10,26 @@
* *
*******************************************************************************/ *******************************************************************************/
package org.eclipse.tm.terminal; package org.eclipse.tm.terminal.internal.actions;
import org.eclipse.tm.terminal.internal.view.ITerminalView;
import org.eclipse.tm.terminal.internal.view.ImageConsts;
public class TerminalActionSettings extends TerminalAction public class TerminalActionSettings extends TerminalAction
{ {
protected TerminalActionSettings(TerminalTarget target) public TerminalActionSettings(ITerminalView target)
{ {
super(target, super(target,
ON_TERMINAL_SETTINGS,
TerminalActionSettings.class.getName()); TerminalActionSettings.class.getName());
setupAction(TERMINAL_TEXT_SETTINGS_ELLIPSE, setupAction(ActionMessages.SETTINGS_ELLIPSE,
TERMINAL_TEXT_SETTINGS, ActionMessages.SETTINGS,
TERMINAL_IMAGE_CLCL_SETTINGS, ImageConsts.IMAGE_CLCL_SETTINGS,
TERMINAL_IMAGE_ELCL_SETTINGS, ImageConsts.IMAGE_ELCL_SETTINGS,
TERMINAL_IMAGE_DLCL_SETTINGS, ImageConsts.IMAGE_DLCL_SETTINGS,
true); true);
} }
public void run() {
fTarget.onTerminalSettings();
}
} }

View file

@ -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();
}

View file

@ -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$
}

View file

@ -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);
}
}
}
}

View file

@ -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);
}
}

View file

@ -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);
}
}

View file

@ -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();
}
}
}
}

View file

@ -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]);
}
}

View file

@ -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();
}
}
}
}

View file

@ -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);
}
}
}
}

View file

@ -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;
}

View file

@ -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

View file

@ -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;
}
}

View file

@ -1,7 +1,7 @@
<?xml version="1.0" encoding="UTF-8"?> <?xml version="1.0" encoding="UTF-8"?>
<classpath> <classpath>
<classpathentry kind="src" path="src/"/> <classpathentry kind="src" path="src/"/>
<classpathentry kind="con" path="org.eclipse.pde.core.requiredPlugins"/>
<classpathentry kind="con" path="org.eclipse.jdt.launching.JRE_CONTAINER/org.eclipse.jdt.internal.debug.ui.launcher.StandardVMType/J2SE-1.4"/> <classpathentry kind="con" path="org.eclipse.jdt.launching.JRE_CONTAINER/org.eclipse.jdt.internal.debug.ui.launcher.StandardVMType/J2SE-1.4"/>
<classpathentry kind="con" path="org.eclipse.pde.core.requiredPlugins"/>
<classpathentry kind="output" path="bin"/> <classpathentry kind="output" path="bin"/>
</classpath> </classpath>

View file

@ -20,9 +20,15 @@
<arguments> <arguments>
</arguments> </arguments>
</buildCommand> </buildCommand>
<buildCommand>
<name>net.sourceforge.metrics.builder</name>
<arguments>
</arguments>
</buildCommand>
</buildSpec> </buildSpec>
<natures> <natures>
<nature>org.eclipse.pde.PluginNature</nature> <nature>org.eclipse.pde.PluginNature</nature>
<nature>org.eclipse.jdt.core.javanature</nature> <nature>org.eclipse.jdt.core.javanature</nature>
<nature>net.sourceforge.metrics.nature</nature>
</natures> </natures>
</projectDescription> </projectDescription>

View file

@ -1,8 +1,58 @@
#Mon Jul 31 14:55:18 CEST 2006 #Thu Nov 30 18:38:38 CET 2006
eclipse.preferences.version=1 eclipse.preferences.version=1
org.eclipse.jdt.core.compiler.codegen.inlineJsrBytecode=disabled org.eclipse.jdt.core.compiler.codegen.inlineJsrBytecode=disabled
org.eclipse.jdt.core.compiler.codegen.targetPlatform=1.4 org.eclipse.jdt.core.compiler.codegen.targetPlatform=1.4
org.eclipse.jdt.core.compiler.compliance=1.4 org.eclipse.jdt.core.compiler.compliance=1.4
org.eclipse.jdt.core.compiler.problem.annotationSuperInterface=warning
org.eclipse.jdt.core.compiler.problem.assertIdentifier=error org.eclipse.jdt.core.compiler.problem.assertIdentifier=error
org.eclipse.jdt.core.compiler.problem.autoboxing=ignore
org.eclipse.jdt.core.compiler.problem.deprecation=warning
org.eclipse.jdt.core.compiler.problem.deprecationInDeprecatedCode=disabled
org.eclipse.jdt.core.compiler.problem.deprecationWhenOverridingDeprecatedMethod=disabled
org.eclipse.jdt.core.compiler.problem.discouragedReference=warning
org.eclipse.jdt.core.compiler.problem.emptyStatement=ignore
org.eclipse.jdt.core.compiler.problem.enumIdentifier=warning org.eclipse.jdt.core.compiler.problem.enumIdentifier=warning
org.eclipse.jdt.core.compiler.problem.fallthroughCase=ignore
org.eclipse.jdt.core.compiler.problem.fieldHiding=ignore
org.eclipse.jdt.core.compiler.problem.finalParameterBound=warning
org.eclipse.jdt.core.compiler.problem.finallyBlockNotCompletingNormally=warning
org.eclipse.jdt.core.compiler.problem.forbiddenReference=error
org.eclipse.jdt.core.compiler.problem.hiddenCatchBlock=warning
org.eclipse.jdt.core.compiler.problem.incompatibleNonInheritedInterfaceMethod=warning
org.eclipse.jdt.core.compiler.problem.incompleteEnumSwitch=ignore
org.eclipse.jdt.core.compiler.problem.indirectStaticAccess=warning
org.eclipse.jdt.core.compiler.problem.localVariableHiding=ignore
org.eclipse.jdt.core.compiler.problem.methodWithConstructorName=warning
org.eclipse.jdt.core.compiler.problem.missingDeprecatedAnnotation=ignore
org.eclipse.jdt.core.compiler.problem.missingOverrideAnnotation=ignore
org.eclipse.jdt.core.compiler.problem.missingSerialVersion=warning
org.eclipse.jdt.core.compiler.problem.noEffectAssignment=warning
org.eclipse.jdt.core.compiler.problem.noImplicitStringConversion=warning
org.eclipse.jdt.core.compiler.problem.nonExternalizedStringLiteral=warning
org.eclipse.jdt.core.compiler.problem.nullReference=ignore
org.eclipse.jdt.core.compiler.problem.overridingPackageDefaultMethod=warning
org.eclipse.jdt.core.compiler.problem.parameterAssignment=ignore
org.eclipse.jdt.core.compiler.problem.possibleAccidentalBooleanAssignment=ignore
org.eclipse.jdt.core.compiler.problem.rawTypeReference=ignore
org.eclipse.jdt.core.compiler.problem.specialParameterHidingField=disabled
org.eclipse.jdt.core.compiler.problem.staticAccessReceiver=warning
org.eclipse.jdt.core.compiler.problem.suppressWarnings=enabled
org.eclipse.jdt.core.compiler.problem.syntheticAccessEmulation=ignore
org.eclipse.jdt.core.compiler.problem.typeParameterHiding=warning
org.eclipse.jdt.core.compiler.problem.uncheckedTypeOperation=warning
org.eclipse.jdt.core.compiler.problem.undocumentedEmptyBlock=warning
org.eclipse.jdt.core.compiler.problem.unhandledWarningToken=warning
org.eclipse.jdt.core.compiler.problem.unnecessaryElse=ignore
org.eclipse.jdt.core.compiler.problem.unnecessaryTypeCheck=ignore
org.eclipse.jdt.core.compiler.problem.unqualifiedFieldAccess=ignore
org.eclipse.jdt.core.compiler.problem.unusedDeclaredThrownException=ignore
org.eclipse.jdt.core.compiler.problem.unusedDeclaredThrownExceptionWhenOverriding=disabled
org.eclipse.jdt.core.compiler.problem.unusedImport=warning
org.eclipse.jdt.core.compiler.problem.unusedLabel=warning
org.eclipse.jdt.core.compiler.problem.unusedLocal=warning
org.eclipse.jdt.core.compiler.problem.unusedParameter=ignore
org.eclipse.jdt.core.compiler.problem.unusedParameterWhenImplementingAbstract=disabled
org.eclipse.jdt.core.compiler.problem.unusedParameterWhenOverridingConcrete=disabled
org.eclipse.jdt.core.compiler.problem.unusedPrivateMember=warning
org.eclipse.jdt.core.compiler.problem.varargsArgumentNeedCast=warning
org.eclipse.jdt.core.compiler.source=1.4 org.eclipse.jdt.core.compiler.source=1.4

View file

@ -2,17 +2,15 @@ Manifest-Version: 1.0
Bundle-ManifestVersion: 2 Bundle-ManifestVersion: 2
Bundle-Name: %pluginName Bundle-Name: %pluginName
Bundle-SymbolicName: org.eclipse.tm.terminal; singleton:=true Bundle-SymbolicName: org.eclipse.tm.terminal; singleton:=true
Bundle-Version: 2.6.0 Bundle-Version: 2.7.0
Bundle-Activator: org.eclipse.tm.terminal.TerminalPlugin Bundle-Activator: org.eclipse.tm.terminal.internal.control.TerminalPlugin
Bundle-Vendor: %providerName Bundle-Vendor: %providerName
Bundle-Localization: plugin Bundle-Localization: plugin
Require-Bundle: org.eclipse.core.runtime, Require-Bundle: org.eclipse.core.runtime,
org.eclipse.ui.ide,
org.eclipse.ui.views,
org.eclipse.ui.workbench.texteditor,
org.eclipse.ui.editors,
org.eclipse.core.resources,
org.eclipse.ui, org.eclipse.ui,
org.eclipse.jface.text org.eclipse.jface.text
Eclipse-LazyStart: true Eclipse-LazyStart: true
Bundle-RequiredExecutionEnvironment: J2SE-1.4 Bundle-RequiredExecutionEnvironment: J2SE-1.4
Bundle-ClassPath: .
Export-Package: org.eclipse.tm.terminal,
org.eclipse.tm.terminal.control

View file

View file

@ -0,0 +1,14 @@
bin.includes = .,\
src/,\
META-INF/,\
plugin.xml,\
.classpath,\
.project,\
build.properties,\
plugin.properties,\
schema/,\
.settings/
source.. = src/
output.. = bin/

View file

@ -4,14 +4,3 @@
pluginName = Terminal pluginName = Terminal
providerName = Eclipse.org providerName = Eclipse.org
terminal.views.category.name = Device Debug
terminal.views.view.name = Terminal
terminal.views.view.font.description = The font for the terminal console.
terminal.views.view.font.label = Terminal Console Font
terminal.view.context.name=Terminal view context
terminal.view.context.description=control-q override
terminal.view.insertion.description=Terminal view insertion
terminal.view.insertion.name=Terminal view insert
terminal.view.insertion.category.name=Terminal view commands

View file

@ -1,128 +1,9 @@
<?xml version="1.0" encoding="UTF-8"?> <?xml version="1.0" encoding="UTF-8"?>
<?eclipse version="3.0"?> <?eclipse version="3.0"?>
<plugin> <plugin>
<extension-point id="terminalConnector" name="Terminal Connector" schema="schema/terminalConnector.exsd"/>
<extension <extension
point="org.eclipse.ui.views"> point="org.eclipse.tm.terminal.terminalConnector">
<category <connector class="org.eclipse.tm.terminal.internal.telnet.TelnetConnector"/>
name="%terminal.views.category.name"
id="Terminal">
</category>
<view
allowMultiple="true"
class="org.eclipse.tm.terminal.TerminalView"
icon="icons/cview16/terminal_view.gif"
category="Terminal"
name="%terminal.views.view.name"
id="org.eclipse.tm.terminal.TerminalView">
</view>
</extension>
<extension
point="org.eclipse.ui.perspectiveExtensions">
<perspectiveExtension
targetID="Terminal">
<viewShortcut id="org.eclipse.tm.terminal.TerminalView"/>
<view id="org.eclipse.tm.terminal.TerminalView"
relationship="stack">
</view>
</perspectiveExtension>
</extension>
<extension
point="org.eclipse.ui.preferencePages">
<page
name="%terminal.views.view.name"
class="org.eclipse.tm.terminal.TerminalPreferencePage"
id="org.eclipse.tm.terminal.TerminalPreferencePage">
</page>
</extension>
<extension
point="org.eclipse.ui.fontDefinitions">
<fontDefinition
label="%terminal.views.view.font.label"
defaultsTo="org.eclipse.jface.textfont"
id="terminal.views.view.font.definition">
<description>
%terminal.views.view.font.description
</description>
</fontDefinition>
</extension>
<extension point="org.eclipse.ui.contexts">
<context
name="%terminal.view.context.name"
description="%terminal.view.context.description"
id="org.eclipse.tm.terminal.TerminalContext"
/>
</extension>
<extension
point="org.eclipse.ui.commands">
<command
categoryId="org.eclipse.tm.terminal.category1"
id="org.eclipse.tm.terminal.command1"
name="%terminal.view.insertion.name"/>
<category
description="%terminal.view.insertion.description"
id="org.eclipse.tm.terminal.category1"
name="%terminal.view.insertion.category.name"/>
</extension>
<extension
point="org.eclipse.ui.bindings">
<!--
These keybindings are needed to disable the menu-activation keys (e.g.,
Alt-F for the File menu, etc.). The code in method
TerminalCtrl.TerminalFocusListener.focusGained() disables the Eclipse key
binding service, but it doesn't disable the global menu-activation
keys.
-->
<key
commandId="org.eclipse.tm.terminal.command1"
contextId="org.eclipse.tm.terminal.TerminalContext"
schemeId="org.eclipse.ui.defaultAcceleratorConfiguration"
sequence="Alt+A"/>
<key
commandId="org.eclipse.tm.terminal.command1"
contextId="org.eclipse.tm.terminal.TerminalContext"
schemeId="org.eclipse.ui.defaultAcceleratorConfiguration"
sequence="Alt+E"/>
<key
commandId="org.eclipse.tm.terminal.command1"
contextId="org.eclipse.tm.terminal.TerminalContext"
schemeId="org.eclipse.ui.defaultAcceleratorConfiguration"
sequence="Alt+F"/>
<key
commandId="org.eclipse.tm.terminal.command1"
contextId="org.eclipse.tm.terminal.TerminalContext"
schemeId="org.eclipse.ui.defaultAcceleratorConfiguration"
sequence="Alt+G"/>
<key
commandId="org.eclipse.tm.terminal.command1"
contextId="org.eclipse.tm.terminal.TerminalContext"
schemeId="org.eclipse.ui.defaultAcceleratorConfiguration"
sequence="Alt+H"/>
<key
commandId="org.eclipse.tm.terminal.command1"
contextId="org.eclipse.tm.terminal.TerminalContext"
schemeId="org.eclipse.ui.defaultAcceleratorConfiguration"
sequence="Alt+N"/>
<key
commandId="org.eclipse.tm.terminal.command1"
contextId="org.eclipse.tm.terminal.TerminalContext"
schemeId="org.eclipse.ui.defaultAcceleratorConfiguration"
sequence="Alt+P"/>
<key
commandId="org.eclipse.tm.terminal.command1"
contextId="org.eclipse.tm.terminal.TerminalContext"
schemeId="org.eclipse.ui.defaultAcceleratorConfiguration"
sequence="Alt+R"/>
<key
commandId="org.eclipse.tm.terminal.command1"
contextId="org.eclipse.tm.terminal.TerminalContext"
schemeId="org.eclipse.ui.defaultAcceleratorConfiguration"
sequence="Alt+T"/>
<key
commandId="org.eclipse.tm.terminal.command1"
contextId="org.eclipse.tm.terminal.TerminalContext"
schemeId="org.eclipse.ui.defaultAcceleratorConfiguration"
sequence="Alt+W"/>
</extension> </extension>
</plugin> </plugin>

View 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>

View file

@ -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();
}

View file

@ -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);
}

View file

@ -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);
}

View file

@ -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);
}

View file

@ -16,50 +16,46 @@ import java.io.File;
import java.io.FileOutputStream; import java.io.FileOutputStream;
import java.io.PrintStream; import java.io.PrintStream;
/** /**
* A simple logger class. Every method in this class is static, so they can be called * A simple logger class. Every method in this class is static, so they can be
* from both class and instance methods. To use this class, write code like this: <p> * called from both class and instance methods. To use this class, write code
* like this:
* <p>
* *
* <pre> * <pre>
* Logger.log("something has happened"); * Logger.log(&quot;something has happened&quot;);
* Logger.log("counter is " + counter); * Logger.log(&quot;counter is &quot; + counter);
* </pre> * </pre>
* *
* @author Fran Litterio <francis.litterio@windriver.com> * @author Fran Litterio <francis.litterio@windriver.com>
*/ */
public final class Logger public final class Logger {
{ public static final String TRACE_DEBUG_LOG = "org.eclipse.tm.terminal/debug/log"; //$NON-NLS-1$
/** public static final String TRACE_DEBUG_LOG_ERROR = "org.eclipse.tm.terminal/debug/log/error"; //$NON-NLS-1$
* UNDER CONSTRUCTION public static final String TRACE_DEBUG_LOG_INFO = "org.eclipse.tm.terminal/debug/log/info"; //$NON-NLS-1$
*/ public static final String TRACE_DEBUG_LOG_CHAR = "org.eclipse.tm.terminal/debug/log/char"; //$NON-NLS-1$
public static final String TRACE_DEBUG_LOG_BUFFER_SIZE = "org.eclipse.tm.terminal/debug/log/buffer/size"; //$NON-NLS-1$
private static PrintStream logStream; private static PrintStream logStream;
static static {
{
String logFile = null; String logFile = null;
File logDirWindows = new File("C:\\wblogs"); //$NON-NLS-1$ File logDirWindows = new File("C:\\wblogs"); //$NON-NLS-1$
File logDirUNIX = new File("/tmp/wblogs"); //$NON-NLS-1$ File logDirUNIX = new File("/tmp/wblogs"); //$NON-NLS-1$
if (logDirWindows.isDirectory()) if (logDirWindows.isDirectory()) {
{
logFile = logDirWindows + "\\wbterminal.log"; //$NON-NLS-1$ logFile = logDirWindows + "\\wbterminal.log"; //$NON-NLS-1$
} } else if (logDirUNIX.isDirectory()) {
else if (logDirUNIX.isDirectory())
{
logFile = logDirUNIX + "/wbterminal.log"; //$NON-NLS-1$ logFile = logDirUNIX + "/wbterminal.log"; //$NON-NLS-1$
} }
if (logFile != null) if (logFile != null) {
{ try {
try
{
logStream = new PrintStream(new FileOutputStream(logFile, true)); logStream = new PrintStream(new FileOutputStream(logFile, true));
} } catch (Exception ex) {
catch (Exception ex)
{
logStream = System.err; logStream = System.err;
logStream.println("Exception when opening log file -- logging to stderr!"); //$NON-NLS-1$ logStream
.println("Exception when opening log file -- logging to stderr!"); //$NON-NLS-1$
ex.printStackTrace(logStream); ex.printStackTrace(logStream);
} }
} }
@ -71,11 +67,10 @@ public final class Logger
* *
* @param message A String containing the message to log. * @param message A String containing the message to log.
*/ */
public static final void log(String message) public static final void log(String message) {
{ if (logStream != null) {
if (logStream != null) // Read my own stack to get the class name, method name, and line
{ // number of
// Read my own stack to get the class name, method name, and line number of
// where this method was called. // where this method was called.
StackTraceElement caller = new Throwable().getStackTrace()[1]; StackTraceElement caller = new Throwable().getStackTrace()[1];
@ -90,11 +85,12 @@ public final class Logger
} }
/** /**
* Writes a stack trace for an exception to both Standard Error and to the log file. * Writes a stack trace for an exception to both Standard Error and to the
* log file.
*/ */
public static final void logException(Exception ex) public static final void logException(Exception ex) {
{ // Read my own stack to get the class name, method name, and line number
// Read my own stack to get the class name, method name, and line number of // of
// where this method was called. // where this method was called.
StackTraceElement caller = new Throwable().getStackTrace()[1]; StackTraceElement caller = new Throwable().getStackTrace()[1];
@ -105,12 +101,12 @@ public final class Logger
PrintStream tmpStream = System.err; PrintStream tmpStream = System.err;
if (logStream != null) if (logStream != null) {
{
tmpStream = logStream; tmpStream = logStream;
} }
tmpStream.println(className + "." + methodName + ":" + lineNumber + ": " + //$NON-NLS-1$//$NON-NLS-2$ //$NON-NLS-3$ tmpStream.println(className
+ "." + methodName + ":" + lineNumber + ": " + //$NON-NLS-1$//$NON-NLS-2$ //$NON-NLS-3$
"Caught exception: " + ex); //$NON-NLS-1$ "Caught exception: " + ex); //$NON-NLS-1$
ex.printStackTrace(tmpStream); ex.printStackTrace(tmpStream);
} }

View file

@ -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 + '!';
}
}
}

View file

@ -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

View file

@ -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();
}
}
}
}
}

View file

@ -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);
}
}
}

View file

@ -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);
}
}
}

View file

@ -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()]);
}
}

View file

@ -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;
}

View file

@ -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$
}

View file

@ -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);
}
}

View file

@ -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;
}
}
}

View file

@ -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);
}
}
}
}

View file

@ -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);
}
}
}

View file

@ -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);
}
}
}

Some files were not shown because too many files have changed in this diff Show more