Initial commit

This commit is contained in:
dotmg 2025-05-13 14:41:26 +02:00
parent 05e9ca1b4e
commit 73981aca6f
116 changed files with 21296 additions and 0 deletions

3
META-INF/MANIFEST.MF Normal file
View file

@ -0,0 +1,3 @@
Manifest-Version: 1.0
Main-Class: net.infordata.em.Main

19
README Normal file
View file

@ -0,0 +1,19 @@
xtn5250mg is a fork of vproietti's xtn5250 (https://sourceforge.net/projects/xtn5250/)
It implements an emulator for 5250 streams to connect to AS400/iSeries.
Difference between xtn5250mg and original xtn5250 will follow :
*** version 0.2 ***
Re-ordering window title. Host comes before software name.
Visual representation of connection status at window title :
- prefix * or ~ if connected
- prefix ! if disconnected
Adds french localization
*** version 0.1 ***
1) xtn5250mg can connect to an AS400 which port is different than the default 23.
For such servers, simply append ":" and the port number to the server's address.
2) KEEPALIVE. If you experience a recurrent session drop with xtn5250 after a
rather small period of inactivity, this fork xtn5250 addresses that issue. However,
the value of /proc/sys/net/ipv4/tcp_keepalive_time may also need to be adjusted.

21
build.sh Normal file
View file

@ -0,0 +1,21 @@
#!/bin/bash
# Let's go to the folder containing the build.sh file
# We don't want to remove all .class files on the system should
# the script run on /
VERSION="0.1-1.19i"
BASEDIR=$(dirname $0)
echo $BASEDIR
cd $BASEDIR
# xtn5250mg is a very tiny project. This build is very simple:
# it deletes all .class object to rebuild them all.
find . -name "*.class" | xargs rm -rf
find . -name "*.java" > .javasources.txt
javac -target 7 -source 7 -encoding "ISO8859-1" @.javasources.txt
#rm -f .javasources.txt
JARFILE="xtn5250mg-${VERSION}.jar"
rm -f $JARFILE
jar cvmf META-INF/MANIFEST.MF $JARFILE build.sh net README logging.properties -C res res

61
logging.properties Normal file
View file

@ -0,0 +1,61 @@
############################################################
# Default Logging Configuration File
#
# You can use a different file by specifying a filename
# with the java.util.logging.config.file system property.
# For example java -Djava.util.logging.config.file=myfile
############################################################
############################################################
# Global properties
############################################################
# "handlers" specifies a comma separated list of log Handler
# classes. These handlers will be installed during VM startup.
# Note that these classes must be on the system classpath.
# By default we only configure a ConsoleHandler, which will only
# show messages at the INFO and above levels.
handlers= java.util.logging.ConsoleHandler
# To also add the FileHandler, use the following line instead.
#handlers= java.util.logging.FileHandler, java.util.logging.ConsoleHandler
# Default global logging level.
# This specifies which kinds of events are logged across
# all loggers. For any given facility this global level
# can be overriden by a facility specific level
# Note that the ConsoleHandler also has a separate level
# setting to limit messages printed to the console.
.level= INFO
############################################################
# Handler specific properties.
# Describes specific configuration info for Handlers.
############################################################
# default file output is in user's home directory.
#java.util.logging.FileHandler.pattern = %h/java%u.log
java.util.logging.FileHandler.pattern = xtn5250.log
java.util.logging.FileHandler.limit = 50000
java.util.logging.FileHandler.count = 1
#java.util.logging.FileHandler.formatter = java.util.logging.XMLFormatter
java.util.logging.FileHandler.level = ALL
java.util.logging.FileHandler.formatter = java.util.logging.SimpleFormatter
# Limit the message that are printed on the console to INFO and above.
java.util.logging.ConsoleHandler.level = ALL
java.util.logging.ConsoleHandler.formatter = java.util.logging.SimpleFormatter
############################################################
# Facility specific properties.
# Provides extra control for each logger.
############################################################
# For example, set the com.xyz.foo logger to only log SEVERE
# messages:
#net.infordata.em.tnprot.level = FINEST
#net.infordata.em.tn5250.XI5250OrdList.level = FINER
#net.infordata.em.tn5250.XI5250Emulator.level = FINER
#net.infordata.em.tn5250.XI5250CmdList.level = FINEST

347
net/infordata/em/Main.java Normal file
View file

@ -0,0 +1,347 @@
package net.infordata.em;
import java.awt.Font;
import java.awt.FontFormatException;
import java.awt.Frame;
import java.awt.event.KeyEvent;
import java.awt.event.WindowAdapter;
import java.awt.event.WindowEvent;
import java.lang.reflect.InvocationTargetException;
import java.io.IOException;
import java.io.FileNotFoundException;
import java.io.FileInputStream;
import java.io.InputStream;
import java.io.File;
import javax.swing.SwingUtilities;
import javax.swing.UIManager;
import net.infordata.em.crt5250.XI5250Field;
import net.infordata.em.crt5250.XIEbcdicTranslator;
import net.infordata.em.tn5250.XI5250Emulator;
import net.infordata.em.tn5250.XI5250Frame;
import net.infordata.em.tn5250ext.PSHBTNCHCHandler;
import net.infordata.em.tn5250ext.XI5250EmulatorExt;
import net.infordata.em.tn5250ext.XI5250PanelHandler;
import net.infordata.em.tn5250ext.XI5250PanelsDispatcher;
import net.infordata.em.tn5250.XIImagesBdl;
/**
* Command line startup utility.
* @author valentino.proietti
*/
public class Main {
// images
private static XIImagesBdl cvImagesBdl =
net.infordata.em.tn5250.XIImagesBdl.getImagesBdl();
private Main() {}
private static void usageError(String msg) {
System.err.println(msg);
System.err.println("Usage: [-3dFX] [-PSHBTNCHC] [-STRPCCMD] [-altFKeyRemap]" +
" [-maximized] [-cp codepage] [-devName name]" +
" [-autoLogon <fieldsCount>;<usrFieldLabel>;<pwdFieldLabel>;<user>;<passwd>]" +
" host-name");
System.err.println("Supported code pages:");
for (String cp : XIEbcdicTranslator.getRegisteredTranslators().keySet()) {
System.err.println(" " + cp +
(XI5250Emulator.DEFAULT_CODE_PAGE.equalsIgnoreCase(cp)? " default" : ""));
}
System.exit(1);
}
public static Font loadFontFromResource(Class theClass, String fontFileName, float fontSize) {
float fntSize = 12f;
if (fontSize >= 1f) {
fntSize = fontSize;
}
InputStream is = null;
try {
is = new FileInputStream("/tmp/Inconsolata.otf");
} catch (FileNotFoundException ex) {
System.err.println("file not found font : " + ex);
}
Font font = null;
try {
System.err.println(" createFont Testing res/" + fontFileName + " ... ");
font = Font.createFont(Font.TRUETYPE_FONT, is);
System.err.println(" createFont OK ");
font = font.deriveFont(fntSize);
} catch (FontFormatException | IOException ex) {
System.err.println(" Font err : " + ex.getMessage());
} finally {
if (is != null) {
try {
is.close();
} catch (IOException ex) {
System.err.println("Close error : " + ex.getMessage());
}
}
}
return font;
}
/**
*/
public static void main(String[] args) {
boolean pUse3dFX = false;
boolean pAltFKeyRemap = false;
boolean pPSHBTNCHC = false;
boolean pSTRPCCMD = false;
boolean pMaximized = false;
String arg;
String pHost = null;
boolean expectCP = false;
boolean expectDevName = false;
boolean expectLogonInfo = false;
String cp = null;
String devName = null;
LogonInfo logonInfo = null;
for (int i = 0; i < args.length; i++) {
arg = args[i];
if (arg.startsWith("-")) {
if ("-3dfx".equalsIgnoreCase(arg))
pUse3dFX = true;
else if ("-PSHBTNCHC".equalsIgnoreCase(arg))
pPSHBTNCHC = true;
else if ("-STRPCCMD".equalsIgnoreCase(arg))
pSTRPCCMD = true;
else if ("-maximized".equalsIgnoreCase(arg))
pMaximized = true;
else if ("-altFKeyRemap".equalsIgnoreCase(arg))
pAltFKeyRemap = true;
else if ("-cp".equalsIgnoreCase(arg))
expectCP = true;
else if ("-devName".equalsIgnoreCase(arg))
expectDevName = true;
else if ("-autoLogon".equalsIgnoreCase(arg))
expectLogonInfo = true;
else
usageError("Wrong option: " + arg);
}
else if (expectCP) {
expectCP = false;
if (XIEbcdicTranslator.getTranslator(arg) == null)
usageError("Unknown codepage: " + arg);
cp = arg;
}
else if (expectDevName) {
expectDevName = false;
devName = arg;
}
else if (expectLogonInfo) {
expectLogonInfo = false;
try {
logonInfo = new LogonInfo(arg);
}
catch (IllegalArgumentException ex) {
usageError(ex.getMessage());
}
}
else {
if (pHost == null)
pHost = arg;
else
usageError("Too many host names.");
}
}
if (expectCP)
usageError("A code page is expected");
final boolean altFKeyRemap = pAltFKeyRemap;
final boolean use3dFX = pUse3dFX;
final boolean enablePSHBTNCHC = pPSHBTNCHC;
final boolean enableSTRPCCMD = pSTRPCCMD;
final boolean maximized = pMaximized;
final String host = pHost;
final String codePage = cp;
final String deviceName = devName;
final LogonInfo autoLogonInfo = logonInfo;
try {
SwingUtilities.invokeAndWait(new Runnable() {
public void run() {
XI5250Emulator em;
if (enablePSHBTNCHC) {
XI5250EmulatorExt emext = new XI5250EmulatorExt();
PanelsDispatcher disp = new PanelsDispatcher();
disp.setEmulator(emext);
new PSHBTNCHCHandler(disp);
if (autoLogonInfo != null)
new AutoLogonHandler(disp, autoLogonInfo);
em = emext;
}
else if (autoLogonInfo != null) {
XI5250EmulatorExt emext = new XI5250EmulatorExt();
PanelsDispatcher disp = new PanelsDispatcher();
disp.setEmulator(emext);
new AutoLogonHandler(disp, autoLogonInfo);
em = emext;
}
else {
em = new XI5250Emulator();
}
em.setTerminalType("IBM-3477-FC");
em.setKeyboardQueue(true);
em.setStrPcCmdEnabled(enableSTRPCCMD);
em.setAltFKeyRemap(altFKeyRemap);
em.setCodePage(codePage);
if (deviceName != null)
em.setTelnetEnv("\u0003DEVNAME\u0001" + deviceName);
if (host != null) {
em.setHost(host);
em.setActive(true);
}
Font mahefaFont = loadFontFromResource(Main.class, "MonoSpaced", 1);
em.setFont(mahefaFont);
XI5250Frame frm = new XI5250Frame("xtn5250mg" + " " +
XI5250Emulator.VERSION, em);
frm.setFont(mahefaFont);
frm.setIconImage(cvImagesBdl.getImage("Logo"));
frm.addWindowListener(new WindowAdapter() {
@Override
public void windowClosed(WindowEvent e) {
System.exit(0);
}
});
//3D FX
if (use3dFX) {
em.setDefFieldsBorderStyle(XI5250Field.LOWERED_BORDER);
em.setDefBackground(UIManager.getColor("control"));
}
//frm.setBounds(0, 0, 570, 510);
frm.centerOnScreen(70);
if (maximized) {
frm.doNotPackOnStartup();
frm.setExtendedState(Frame.MAXIMIZED_BOTH);
}
frm.setVisible(true);
}
});
}
catch (InterruptedException ex) {
ex.printStackTrace();
}
catch (InvocationTargetException ex) {
ex.printStackTrace();
}
}
//////
private static class PanelsDispatcher extends XI5250PanelsDispatcher {
private AutoLogonHandler ivAutoLogonHandler;
private XI5250PanelHandler ivHandler;
@Override
public synchronized void addPanelHandler(XI5250PanelHandler panel) {
if (panel instanceof AutoLogonHandler) {
if (ivAutoLogonHandler != null)
throw new IllegalArgumentException("Handler already setted");
ivAutoLogonHandler = (AutoLogonHandler)panel;
return;
}
if (ivHandler != null)
throw new IllegalArgumentException("Handler already setted");
ivHandler = panel;
}
@Override
protected synchronized XI5250PanelHandler getCurrentPanelHandler() {
return (ivAutoLogonHandler != null && ivAutoLogonHandler.detailedTest()) ? ivAutoLogonHandler : ivHandler;
}
@Override
public synchronized void removePanelHandler(XI5250PanelHandler panel) {
if (ivHandler != panel)
throw new IllegalArgumentException("Not the registered handler " + panel);
ivHandler = null;
}
}
//////
private static class LogonInfo {
final int fieldsCount;
final String userLabel;
final String passwdLabel;
final String user;
final String passwd;
LogonInfo(String info) {
String[] ss = info.split(";", 5);
if (ss.length < 5)
throw new IllegalArgumentException("Invalid autoLogon argument");
try {
fieldsCount = Integer.parseInt(ss[0]);
}
catch (NumberFormatException ex) {
throw new IllegalArgumentException("Invalid autoLogon argument: " + ex.getMessage());
}
userLabel = ss[1];
passwdLabel = ss[2];
user = ss[3];
passwd = ss[4];
}
}
//////
private static class AutoLogonHandler extends XI5250PanelHandler {
private final LogonInfo ivLogonInfo;
private boolean ivLoggedOn;
public AutoLogonHandler(XI5250PanelsDispatcher aPanelDisp, LogonInfo info) {
super(aPanelDisp);
ivLogonInfo = info;
}
@Override
protected boolean detailedTest() {
if (ivLoggedOn)
return false;
// I'm expecting xx fields in the logon panel
if (getFields().size() != ivLogonInfo.fieldsCount)
return false;
// Is there the user id field ?
if (!checkField(getFieldNextTo(ivLogonInfo.userLabel), 10))
return false;
// Is there the password field ?
if (!checkField(getFieldNextTo(ivLogonInfo.passwdLabel), 10))
return false;
return true;
}
@Override
protected void start() {
ivLoggedOn = true;
// Start logon panel processing
XI5250Field userField = getFieldNextTo(ivLogonInfo.userLabel);
XI5250Field passwdField = getFieldNextTo(ivLogonInfo.passwdLabel);
userField.setString(ivLogonInfo.user); // Your user id
passwdField.setString(ivLogonInfo.passwd); // Your password
// Simulate the user ENTER key pressed
getEmulator().processRawKeyEvent(
new KeyEvent(getEmulator(), KeyEvent.KEY_PRESSED,
0, 0, KeyEvent.VK_ENTER, KeyEvent.CHAR_UNDEFINED));
}
@Override
protected void stop() {
}
}
}

File diff suppressed because it is too large Load diff

View file

@ -0,0 +1,84 @@
/*
Copyright 2007 Infordata S.p.A.
Licensed under the Apache License, Version 2.0 (the "License");
you may not use this file except in compliance with the License.
You may obtain a copy of the License at
http://www.apache.org/licenses/LICENSE-2.0
Unless required by applicable law or agreed to in writing, software
distributed under the License is distributed on an "AS IS" BASIS,
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
See the License for the specific language governing permissions and
limitations under the License.
*/
package net.infordata.em.crt;
import java.beans.BeanInfo;
import java.beans.IntrospectionException;
import java.beans.Introspector;
import java.beans.PropertyDescriptor;
import java.beans.SimpleBeanInfo;
public class XICrtBeanInfo extends SimpleBeanInfo {
Class<XICrt> beanClass = XICrt.class;
String iconColor16x16Filename;
String iconColor32x32Filename;
String iconMono16x16Filename;
String iconMono32x32Filename;
public XICrtBeanInfo() {
}
@Override
public PropertyDescriptor[] getPropertyDescriptors() {
try {
PropertyDescriptor _cursorVisible = new PropertyDescriptor("cursorVisible", beanClass, "isCursorVisible", "setCursorVisible");
PropertyDescriptor _font = new PropertyDescriptor("font", beanClass, "getFont", "setFont");
PropertyDescriptor[] pds = new PropertyDescriptor[] {
_cursorVisible,
_font,
};
return pds;
}
catch (IntrospectionException ex) {
ex.printStackTrace();
return null;
}
}
@Override
public java.awt.Image getIcon(int iconKind) {
switch (iconKind) {
case BeanInfo.ICON_COLOR_16x16:
return iconColor16x16Filename != null ? loadImage(iconColor16x16Filename) : null;
case BeanInfo.ICON_COLOR_32x32:
return iconColor32x32Filename != null ? loadImage(iconColor32x32Filename) : null;
case BeanInfo.ICON_MONO_16x16:
return iconMono16x16Filename != null ? loadImage(iconMono16x16Filename) : null;
case BeanInfo.ICON_MONO_32x32:
return iconMono32x32Filename != null ? loadImage(iconMono32x32Filename) : null;
}
return null;
}
@Override
public BeanInfo[] getAdditionalBeanInfo() {
Class<?> superclass = beanClass.getSuperclass();
try {
BeanInfo superBeanInfo = Introspector.getBeanInfo(superclass);
return new BeanInfo[] { superBeanInfo };
}
catch (IntrospectionException ex) {
ex.printStackTrace();
return null;
}
}
}

View file

@ -0,0 +1,599 @@
/*
Copyright 2007 Infordata S.p.A.
Licensed under the Apache License, Version 2.0 (the "License");
you may not use this file except in compliance with the License.
You may obtain a copy of the License at
http://www.apache.org/licenses/LICENSE-2.0
Unless required by applicable law or agreed to in writing, software
distributed under the License is distributed on an "AS IS" BASIS,
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
See the License for the specific language governing permissions and
limitations under the License.
*/
/*
!!V 26/03/97 rel. 0.90 - start of revisions history.
26/03/97 rel. 0.90 - changed to speed up drawing.
10/04/97 rel. 0.93 - chars less than space are not drawed but are stored in ivCharBuffer.
28/04/97 rel. _.__ - ivCharBuffer, ivAttrBuffer array from [cols][rows] to [rows][cols].
14/05/97 rel. 1.00 - first release.
30/07/97 rel. 1.03b- bugs.
13/01/98 rel. 1.05d- NT painting bug.
14/01/98 rel. 1.06 - asynchronous paint on off-screen image.
03/03/98 rel. _.___- SWING and reorganization.
***
30/06/98 rel. _.___- Swing, JBuilder2 e VSS.
29/07/99 rel. 1.14 - Rework on 3d look&feel.
*/
package net.infordata.em.crt;
import java.awt.Color;
import java.awt.Dimension;
import java.awt.FontMetrics;
import java.awt.Graphics;
import java.awt.Point;
import java.awt.Rectangle;
import java.io.IOException;
import java.io.ObjectInputStream;
import java.io.ObjectOutputStream;
import java.io.PrintStream;
import java.io.Serializable;
import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;
///////////////////////////////////////////////////////////////////////////////
/**
* Implements an off-screen image buffer.
* To be used by XICrt.
*
* @see XICrt
*
* @author Valentino Proietti - Infordata S.p.A.
*/
public class XICrtBuffer implements Serializable {
private static final long serialVersionUID = 1L;
private int ivNCols;
private int ivNRows;
transient private Graphics ivGr;
transient private int ivCharW;
transient private int ivCharH;
transient private int ivCharD;
transient private int ivGrW;
transient private int ivGrH;
private int ivDefAttr; // default char attribute
// [rows][cols]
private char[][] ivCharBuffer;
private int[][] ivAttrBuffer;
//!!1.06
transient private List<Rectangle> ivDirtyAreas = new ArrayList<Rectangle>(20);
//!!1.14
transient private XICrt ivCrt;
/**
* Creates a XICrtBuffer with the given dimensions expressed in number of
* chars.
*/
public XICrtBuffer(int nCols, int nRows) {
ivNCols = nCols;
ivNRows = nRows;
ivCharBuffer = new char[ivNRows][ivNCols];
ivAttrBuffer = new int[ivNRows][ivNCols];
clear();
}
/**
* Creates a XICrtBuffer filling it with a portion of another one.
*/
public XICrtBuffer(XICrtBuffer from, int aC, int aR, int aW, int aH) {
this(aW, aH);
copyFrom(0, 0, from, aC, aR, aW, aH);
setDefAttr(from.getDefAttr());
}
/**
* Returns a cloned XICrtBuffer (the new one needs initGraphics() to be
* displayed).
*/
@Override
public Object clone() {
XICrtBuffer aClone = new XICrtBuffer(this, 0, 0, ivNCols, ivNRows);
/* !!1.04
XICrtBuffer aClone = new XICrtBuffer(ivNCols, ivNRows);
aClone.copyFrom(this);
*/
return aClone;
}
/**
*/
final void setCrt(XICrt crt) {
ivCrt = crt;
}
/**
*/
public final XICrt getCrt() {
return ivCrt;
}
/**
* Initializes the graphics area.
*/
public synchronized void setGraphics(Graphics gr) {
ivGr = gr;
if (ivGr != null) {
FontMetrics fontMetrics = ivGr.getFontMetrics();
ivCharW = fontMetrics.charWidth('W');
ivCharH = fontMetrics.getHeight();
ivCharD = fontMetrics.getDescent();
ivGrW = ivNCols * ivCharW;
ivGrH = ivNRows * ivCharH;
copyFrom(this); // refresh !!1.06 required
}
else {
//!!1.03b
ivCharW = 1; // to avoid possible division by 0 in pending events
ivCharH = 1;
ivCharD = 1;
ivGrW = ivNCols * ivCharW;
ivGrH = ivNRows * ivCharH;
}
}
/**
* Dumps the buffer on System.out stream.
* Useful for debugging.
*/
public void dumpBuffer(PrintStream out) {
out.println("BUFFER DUMP");
for (int r = 0; r < ivNRows; r++) {
for (int c = 0; c < ivNCols; c++)
out.print(ivCharBuffer[r][c]);
out.println();
}
for (int r = 0; r < ivNRows; r++) {
for (int c = 0; c < ivNCols; c++)
out.print(Integer.toHexString(ivAttrBuffer[r][c]) + " ");
out.println();
}
out.println("END BUFFER DUMP");
}
/**
* Copy contents from another XICrtBuffer (can be itself).
*/
public void copyFrom(XICrtBuffer from) {
copyFrom(0, 0, from, 0, 0, from.ivNCols, from.ivNRows);
}
/**
* Copy contents from another XICrtBuffer (can be itself).
* @param col the destination column pos.
* @param row the destination row pos.
* @param from the source XICrtBuffer.
* @param aC the source column pos.
* @param aR the source row pos.
* @param aW the source dimension.
* @param aH the source dimension.
*/
public synchronized void copyFrom(int col, int row,
XICrtBuffer from,
int aC, int aR, int aW, int aH) {
aW = Math.min(aW, from.ivNCols - aC);
aH = Math.min(aH, from.ivNRows - aR);
int nCols = Math.min(ivNCols - col, aW);
int nRows = Math.min(ivNRows - row, aH);
int lastAttr;
int lastCol;
int lastRow;
StringBuilder str;
for (int r = 0; r < nRows; r++) {
for (int c = 0; c < nCols; ) {
lastCol = col + c;
lastRow = row + r;
lastAttr = from.getAttrInternal(aC + c, aR + r);
str = new StringBuilder();
// group chars with the same attribute
for ( ; c < nCols && lastAttr == from.getAttrInternal(aC + c, aR + r); c++)
str.append(from.getChar(aC + c, aR + r));
drawString(new String(str), lastCol, lastRow, lastAttr);
}
}
}
public synchronized void invalidateAll() {
addDirtyArea(new Rectangle(0, 0, ivNCols, ivNRows));
}
/**
* Clears the screen buffer.
*/
public synchronized void clear() {
for (int c = 0; c < ivNCols; c++)
for (int r = 0; r < ivNRows; r++) {
ivCharBuffer[r][c] = '\u0000';
ivAttrBuffer[r][c] = ivDefAttr;
}
ivDirtyAreas.clear();
if (ivGr != null) {
Graphics gr = ivGr.create(); //!!1.05d
try {
gr.setColor(getBackground(ivDefAttr));
gr.fillRect(0, 0, ivGrW, ivGrH);
}
finally {
gr.dispose();
}
}
}
/**
*/
public synchronized void scrollDown(int r1, int r2, int nRows) {
if ((r1 >= r2) || (nRows == 0))
throw new IllegalArgumentException("ScrollDown()");
sync();
nRows = Math.max(nRows, r2 - r1);
for (int r = r2; r > (r1 + nRows); r--)
for (int c = 0; c < ivNCols; c++) {
ivCharBuffer[r][c] = ivCharBuffer[r - nRows][c];
ivAttrBuffer[r][c] = ivAttrBuffer[r - nRows][c];
}
for (int r = r1; r <= (r1 + nRows); r++)
for (int c = 0; c < ivNCols; c++) {
ivCharBuffer[r][c] = '\u0000';
ivAttrBuffer[r][c] = ivDefAttr;
}
if (ivGr != null) {
Graphics gr = ivGr.create(); //!!1.05d
try {
gr.copyArea(0, r1 * ivCharH, ivNCols * ivCharW, (r2 - r1) * ivCharH,
0, ivCharH * nRows);
gr.setColor(getBackground(ivDefAttr));
gr.fillRect(0, r1 * ivCharH, ivNCols * ivCharW, ivCharH * nRows);
}
finally {
gr.dispose();
}
}
}
/**
*/
public synchronized void scrollUp(int r1, int r2, int nRows) {
if ((r1 >= r2) || (nRows == 0))
throw new IllegalArgumentException("ScrollUp()");
sync();
nRows = Math.max(nRows, r2 - r1);
for (int r = r1; r < (r2 - nRows); r++)
for (int c = 0; c < ivNCols; c++) {
ivCharBuffer[r][c] = ivCharBuffer[r + nRows][c];
ivAttrBuffer[r][c] = ivAttrBuffer[r + nRows][c];
}
for (int r = r2; r >= (r2 - nRows); r--)
for (int c = 0; c < ivNCols; c++) {
ivCharBuffer[r][c] = '\u0000';
ivAttrBuffer[r][c] = ivDefAttr;
}
if (ivGr != null) {
Graphics gr = ivGr.create(); //!!1.05d
try {
gr.copyArea(0, (r1 + 1) * ivCharH, ivNCols * ivCharW, (r2 - r1) * ivCharH,
0, -ivCharH * nRows);
gr.setColor(getBackground(ivDefAttr));
gr.fillRect(0, (r2 - nRows + 1) * ivCharH, ivNCols * ivCharW, ivCharH * nRows);
}
finally {
gr.dispose();
}
}
}
/**
* Returns the dimensions in chars.
*/
public Dimension getCrtSize() {
return new Dimension(ivNCols, ivNRows);
}
/**
* Returns the dimensions in pixels.
*/
public Dimension getSize() {
return new Dimension(ivGrW, ivGrH);
}
/**
*/
public Dimension getCharSize() {
return new Dimension(ivCharW, ivCharH);
}
/**
* Converts characters coordinates in pixels coordinates.
*/
public Point toPoint(int col, int row) {
return new Point(col * ivCharW, (row + 1) * ivCharH);
}
/**
* Uses the default attribute.
*/
public void drawString(String str, int col, int row) {
drawString(str, col, row, ivDefAttr);
}
/**
* Uses the given attribute.
*/
public synchronized void drawString(String aStr, int col, int row,
int aAttr) {
col = Math.max(0, Math.min(ivNCols - 1, col));
row = Math.max(0, Math.min(ivNRows - 1, row));
int len = Math.min(aStr.length(), ivNCols - col);
if (len <= 0)
return;
for (int i = 0; i < len; i++) {
ivCharBuffer[row][col + i] = aStr.charAt(i);
ivAttrBuffer[row][col + i] = aAttr;
}
addDirtyArea(new Rectangle(col, row, len, 1));
}
/**
*/
private void addDirtyArea(Rectangle newRt) {
Rectangle rt;
Rectangle rtG;
Rectangle res = new Rectangle(newRt); //!!V 03/03/98
int count = 0;
for (Iterator<Rectangle> e = ivDirtyAreas.iterator(); e.hasNext(); ) {
rt = (Rectangle)e.next();
// used to see if rectangles are adiacent (x coord)
rtG = new Rectangle(rt);
rtG.grow(1, 0);
if (rtG.intersects(newRt)) {
e.remove();
res = res.union(rt);
// no more than two rects can be joined (x coord)
if (++count >= 2)
break;
}
}
ivDirtyAreas.add(res);
}
/**
* To be called just before painting the offscreen image.
*/
public synchronized void sync() {
if (ivGr == null || ivDirtyAreas.isEmpty())
return;
Graphics gr = ivGr.create(); //!!1.05d
try {
Rectangle rt;
for (Iterator<Rectangle> e = ivDirtyAreas.iterator(); e.hasNext(); ) {
rt = (Rectangle)e.next();
int lastAttr;
int lastCol;
int lastRow;
StringBuilder str;
for (int r = 0; r < rt.height; r++) {
for (int c = 0; c < rt.width; ) {
lastCol = rt.x + c;
lastRow = rt.y + r;
lastAttr = getAttr(rt.x + c, rt.y + r);
str = new StringBuilder();
// group char with the same attribute to speed up drawing
for ( ; c < rt.width && lastAttr == getAttr(rt.x + c, rt.y + r); c++)
str.append(getChar(rt.x + c, rt.y + r));
_drawString(gr, new String(str), lastCol, lastRow, lastAttr);
}
}
if (XICrt.DEBUG >= 2) {
gr.setColor(Color.yellow);
gr.drawRect(rt.x * ivCharW + 1, rt.y * ivCharH + 1,
rt.width * ivCharW - 3, rt.height * ivCharH - 3);
}
}
ivDirtyAreas.clear();
}
finally {
gr.dispose();
}
}
/**
* Draws the given string on the graphics context (called by sync()).
*/
protected void _drawString(Graphics gr, String aStr, int col, int row,
int aAttr) { //!!1.06
int len = aStr.length();
gr.setColor(getBackground(aAttr));
gr.fillRect(col * ivCharW, row * ivCharH, ivCharW * len, ivCharH);
// do not draw char less than space
StringBuilder strBuf = new StringBuilder(aStr);
for (int i = 0; i < strBuf.length(); i++) {
if (strBuf.charAt(i) < ' ')
strBuf.setCharAt(i, ' ');
}
String str = new String(strBuf);
gr.setColor(getForeground(aAttr));
gr.drawString(str.substring(0, len), col * ivCharW,
(row + 1) * ivCharH - ivCharD);
}
/**
*/
public String getString(int col, int row, int nChars) {
StringBuilder str = new StringBuilder();
for (int i = 0; i < nChars; i++) {
str.append(getChar(col + i, row));
}
return new String(str);
}
/**
*/
public String getString() {
char[] buf = new char[ivNRows * ivNCols];
for (int i = 0; i < ivNRows; i++)
System.arraycopy(ivCharBuffer[i], 0, buf, i * ivNCols, ivNCols);
return new String(buf);
}
/**
* Background attribute to color mapping.
*/
protected Color getBackground(int aAttribute){
return Color.red;
}
/**
* Foreground attribute to color mapping.
*/
protected Color getForeground(int aAttribute) {
return Color.blue;
}
/**
*/
public final int getAttrInternal(int col, int row) {
col = Math.max(0, Math.min(ivNCols - 1, col));
row = Math.max(0, Math.min(ivNRows - 1, row));
return ivAttrBuffer[row][col];
}
/**
*/
public int getAttr(int col, int row) {
return getAttrInternal(col, row);
}
/**
*/
public final char getChar(int col, int row) {
col = Math.max(0, Math.min(ivNCols - 1, col));
row = Math.max(0, Math.min(ivNRows - 1, row));
return ivCharBuffer[row][col];
}
/**
* Sets the default attribute.
*/
public void setDefAttr(int aAttr) {
ivDefAttr = aAttr;
}
/**
* Returns the default attribute.
*/
public final int getDefAttr() {
return ivDefAttr;
}
/**
*/
public Point toPoints(int aCol, int aRow) {
return new Point(aCol * ivCharW, aRow * ivCharH);
}
/**
*/
public Rectangle toPoints(int aCol, int aRow, int aNCols, int aNRows) {
return new Rectangle(aCol * ivCharW, aRow * ivCharH,
aNCols * ivCharW, aNRows * ivCharH);
}
/**
*/
void writeObject(ObjectOutputStream oos) throws IOException {
oos.defaultWriteObject();
}
void readObject(ObjectInputStream ois) throws ClassNotFoundException, IOException {
ois.defaultReadObject();
}
}

View file

@ -0,0 +1,45 @@
/*
Copyright 2007 Infordata S.p.A.
Licensed under the Apache License, Version 2.0 (the "License");
you may not use this file except in compliance with the License.
You may obtain a copy of the License at
http://www.apache.org/licenses/LICENSE-2.0
Unless required by applicable law or agreed to in writing, software
distributed under the License is distributed on an "AS IS" BASIS,
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
See the License for the specific language governing permissions and
limitations under the License.
*/
/*
!!V 03/03/98 rel. _.___- SWING and reorganization.
***
30/06/98 rel. _.___- Swing, JBuilder2 e VSS.
*/
package net.infordata.em.crt5250;
import java.io.IOException;
/**
* Common base interface for XI5250FieldsList and XI5250Field.
* Only for possible future implementations.
*
* @version
* @author Valentino Proietti - Infordata S.p.A.
*/
public interface XI5250BaseField {
/**
*/
public void init();
/**
*/
public void saveTo(XI5250FieldSaver aSaver) throws IOException;
}

File diff suppressed because it is too large Load diff

View file

@ -0,0 +1,75 @@
/*
Copyright 2007 Infordata S.p.A.
Licensed under the Apache License, Version 2.0 (the "License");
you may not use this file except in compliance with the License.
You may obtain a copy of the License at
http://www.apache.org/licenses/LICENSE-2.0
Unless required by applicable law or agreed to in writing, software
distributed under the License is distributed on an "AS IS" BASIS,
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
See the License for the specific language governing permissions and
limitations under the License.
*/
/*
!!V 03/03/98 rel. _.___- SWING and reorganization.
***
30/06/98 rel. _.___- Swing, JBuilder2 e VSS.
*/
package net.infordata.em.crt5250;
/**
* XI5250CrtListener adapter.
* @see XI5250CrtListener
*
* @version
* @author Valentino Proietti - Infordata S.p.A.
*/
public class XI5250CrtAdapter implements XI5250CrtListener {
/**
* @see XI5250CrtEvent#FIELD_ACTIVATED
*/
public void fieldActivated(XI5250CrtEvent e) {
}
/**
* @see XI5250CrtEvent#FIELD_DEACTIVATED
*/
public void fieldDeactivated(XI5250CrtEvent e) {
}
/**
* @see XI5250CrtEvent#SIZE_CHANGED
*/
public void sizeChanged(XI5250CrtEvent e) {
}
/**
* @see XI5250CrtEvent#KEY_EVENT
*/
public void keyEvent(XI5250CrtEvent e) {
}
/**
* @see XI5250CrtEvent#MOUSE_ENTERS_FIELD
*/
public void mouseEntersField(XI5250CrtEvent e) {
}
/**
* @see XI5250CrtEvent#MOUSE_EXITS_FIELD
*/
public void mouseExitsField(XI5250CrtEvent e) {
}
}

View file

@ -0,0 +1,97 @@
/*
Copyright 2007 Infordata S.p.A.
Licensed under the Apache License, Version 2.0 (the "License");
you may not use this file except in compliance with the License.
You may obtain a copy of the License at
http://www.apache.org/licenses/LICENSE-2.0
Unless required by applicable law or agreed to in writing, software
distributed under the License is distributed on an "AS IS" BASIS,
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
See the License for the specific language governing permissions and
limitations under the License.
*/
package net.infordata.em.crt5250;
import java.beans.BeanInfo;
import java.beans.IntrospectionException;
import java.beans.Introspector;
import java.beans.PropertyDescriptor;
import java.beans.SimpleBeanInfo;
public class XI5250CrtBeanInfo extends SimpleBeanInfo {
Class<XI5250Crt> beanClass = XI5250Crt.class;
String iconColor16x16Filename;
String iconColor32x32Filename;
String iconMono16x16Filename;
String iconMono32x32Filename;
public XI5250CrtBeanInfo() {
}
@Override
public PropertyDescriptor[] getPropertyDescriptors() {
try {
PropertyDescriptor _defBackground = new PropertyDescriptor("defBackground", beanClass, "getDefBackground", "setDefBackground");
PropertyDescriptor _defFieldsBorderStyle = new PropertyDescriptor("defFieldsBorderStyle", beanClass, "getDefFieldsBorderStyle", "setDefFieldsBorderStyle");
PropertyDescriptor _font = new PropertyDescriptor("font", beanClass, null, "setFont");
PropertyDescriptor _insertState = new PropertyDescriptor("insertState", beanClass, "isInsertState", "setInsertState");
PropertyDescriptor _referenceCursor = new PropertyDescriptor("referenceCursor", beanClass, "isReferenceCursor", "setReferenceCursor");
PropertyDescriptor _codePage = new PropertyDescriptor("codePage", beanClass, "getCodePage", "setCodePage");
PropertyDescriptor[] pds = new PropertyDescriptor[] {
_defBackground,
_defFieldsBorderStyle,
_font,
_insertState,
_referenceCursor,
_codePage,
};
return pds;
}
catch (IntrospectionException ex) {
ex.printStackTrace();
return null;
}
}
@Override
public java.awt.Image getIcon(int iconKind) {
switch (iconKind) {
case BeanInfo.ICON_COLOR_16x16:
return iconColor16x16Filename != null ? loadImage(iconColor16x16Filename) : null;
case BeanInfo.ICON_COLOR_32x32:
return iconColor32x32Filename != null ? loadImage(iconColor32x32Filename) : null;
case BeanInfo.ICON_MONO_16x16:
return iconMono16x16Filename != null ? loadImage(iconMono16x16Filename) : null;
case BeanInfo.ICON_MONO_32x32:
return iconMono32x32Filename != null ? loadImage(iconMono32x32Filename) : null;
}
return null;
}
@Override
public BeanInfo[] getAdditionalBeanInfo() {
Class<?> superclass = beanClass.getSuperclass();
try {
BeanInfo superBeanInfo = Introspector.getBeanInfo(superclass);
return new BeanInfo[] { superBeanInfo };
}
catch (IntrospectionException ex) {
ex.printStackTrace();
return null;
}
}
}

View file

@ -0,0 +1,676 @@
/*
Copyright 2007 Infordata S.p.A.
Licensed under the Apache License, Version 2.0 (the "License");
you may not use this file except in compliance with the License.
You may obtain a copy of the License at
http://www.apache.org/licenses/LICENSE-2.0
Unless required by applicable law or agreed to in writing, software
distributed under the License is distributed on an "AS IS" BASIS,
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
See the License for the specific language governing permissions and
limitations under the License.
*/
/*
!!V 26/03/97 rel. 0.90 - start of revisions history.
26/03/97 rel. 0.90 - changed to speed up drawing.
10/04/97 rel. 0.93 - some fixes to add SignedNumeric fields handling.
27/05/97 rel. 1.00 - first release.
13/01/98 rel. 1.05d- NT painting bug.
14/01/98 rel. 1.06 - asynchronous paint on off-screen image.
03/03/98 rel. _.___- SWING and reorganization.
***
30/06/98 rel. _.___- Swing, JBuilder2 e VSS.
29/07/99 rel. 1.14 - Rework on 3d look&feel.
*/
package net.infordata.em.crt5250;
import java.awt.Color;
import java.awt.Graphics;
import java.io.Serializable;
import net.infordata.em.crt.XICrtBuffer;
///////////////////////////////////////////////////////////////////////////////
/**
* Adds capabilities required by 5250 emulation to XICrtBuffer.
* To be used by XI5250Crt.
*
* @see XI5250Crt
*
* @version
* @author Valentino Proietti - Infordata S.p.A.
*/
public class XI5250CrtBuffer extends XICrtBuffer implements Serializable {
private static final long serialVersionUID = 1L;
//!!0.95c
public static final int GRAY_INTENSITY = colorAsIntensity(Color.gray);
//!!0.95b
private ColorWrapper ivBackColor = new ColorWrapper(Color.black);
/**
* to be used with dark background
*/
private static final Color blue = new Color(128, 128, 255);
/**
* The character foreground color map used with dark background colors
*/
private final Color[][] DK_FORE_COLORS_MAP = {
{
// normal reverse
Color.green, ivBackColor,
Color.white, ivBackColor,
Color.green, ivBackColor, // underscore
Color.white, // underscore
ivBackColor, // invisible
Color.red, ivBackColor,
Color.red.brighter(), ivBackColor, // blink
Color.red, ivBackColor, // underscore
Color.red.brighter(), // blink, underscore
ivBackColor, // invisible
Color.cyan, ivBackColor, // column separator
Color.yellow, ivBackColor, // column separator
Color.cyan, ivBackColor, // column separator, underscore
Color.yellow, // column separator, underscore
ivBackColor, // invisible
Color.pink, ivBackColor,
blue, ivBackColor,
Color.pink, ivBackColor, // underscore
blue, // underscore
ivBackColor // invisible
}
};
/**
* The character background color map used with dark background colors
*/
private final Color[][] DK_BACK_COLORS_MAP = {
{
// normal reverse
ivBackColor, Color.green,
ivBackColor, Color.white,
ivBackColor, Color.green, // underscore
ivBackColor, // underscore
ivBackColor, // invisible
ivBackColor, Color.red,
ivBackColor, Color.red.brighter(), // blink
ivBackColor, Color.red, // underscore
ivBackColor, // blink, underscore
ivBackColor, // invisible
ivBackColor, Color.cyan, // column separator
ivBackColor, Color.yellow,// column separator
ivBackColor, Color.cyan, // column separator, underscore
ivBackColor, // column separator, underscore
ivBackColor, // invisible
ivBackColor, Color.pink,
ivBackColor, blue,
ivBackColor, Color.pink, // underscore
ivBackColor, // underscore
ivBackColor // invisible
}
};
/**
* The character foreground color map used with bright background colors
*/
private final Color[][] LT_FORE_COLORS_MAP = {
{
// normal reverse
Color.green.darker().darker(), ivBackColor,
Color.darkGray, ivBackColor,
Color.green.darker().darker(), ivBackColor, // underscore
Color.darkGray, // underscore
ivBackColor, // invisible
Color.red, ivBackColor,
Color.red.brighter(), ivBackColor, // blink
Color.red, ivBackColor, // underscore
Color.red.brighter(), // blink, underscore
ivBackColor, // invisible
Color.blue, ivBackColor, // column separator
Color.yellow.darker(), ivBackColor, // column separator
Color.blue, ivBackColor, // column separator, underscore
Color.yellow.darker(), // column separator, underscore
ivBackColor, // invisible
Color.pink.darker(), ivBackColor,
blue.darker(), ivBackColor,
Color.pink.darker(), ivBackColor, // underscore
blue.darker(), // underscore
ivBackColor // invisible
},
{ //** input fields color map
// normal reverse
Color.green.darker().darker(), Color.white,
Color.darkGray, Color.white,
Color.green.darker().darker(), Color.white, // underscore
Color.darkGray, // underscore
Color.white, // invisible
Color.red, Color.white,
Color.red.brighter(), Color.white, // blink
Color.red, Color.white, // underscore
Color.red.brighter(), // blink, underscore
Color.white, // invisible
Color.blue, Color.white, // column separator
Color.yellow.darker(), Color.white, // column separator
Color.blue, Color.white, // column separator, underscore
Color.yellow.darker(), // column separator, underscore
ivBackColor, // invisible
Color.pink.darker(), Color.white,
blue.darker(), Color.white,
Color.pink.darker(), Color.white, // underscore
blue.darker(), // underscore
ivBackColor // invisible
}
};
/**
* The character background color map used with bright background colors
*/
private final Color[][] LT_BACK_COLORS_MAP = {
{
// normal reverse
ivBackColor, Color.green.darker().darker(),
ivBackColor, Color.darkGray,
ivBackColor, Color.green.darker().darker(), // underscore
ivBackColor, // underscore
ivBackColor, // invisible
ivBackColor, Color.red,
ivBackColor, Color.red.brighter(), // blink
ivBackColor, Color.red, // underscore
ivBackColor, // blink, underscore
ivBackColor, // invisible
ivBackColor, Color.blue, // column separator
ivBackColor, Color.yellow.darker(),// column separator
ivBackColor, Color.blue, // column separator, underscore
ivBackColor, // column separator, underscore
ivBackColor, // invisible
ivBackColor, Color.pink.darker(),
ivBackColor, blue.darker(),
ivBackColor, Color.pink.darker(), // underscore
ivBackColor, // underscore
ivBackColor // invisible
},
{ //** input fields color map
// normal reverse
Color.white, Color.green.darker().darker(),
Color.white, Color.darkGray,
Color.white, Color.green.darker().darker(), // underscore
Color.white, // underscore
Color.white, // invisible
Color.white, Color.red,
Color.white, Color.red.brighter(), // blink
Color.white, Color.red, // underscore
Color.white, // blink, underscore
Color.white, // invisible
Color.white, Color.blue, // column separator
Color.white, Color.yellow.darker(),// column separator
Color.white, Color.blue, // column separator, underscore
Color.white, // column separator, underscore
Color.white, // invisible
Color.white, Color.pink.darker(),
Color.white, blue.darker(),
Color.white, Color.pink.darker(), // underscore
Color.white, // underscore
Color.white // invisible
}
};
private Color[][] ivForegroundColorsMap = DK_FORE_COLORS_MAP;
private Color[][] ivBackgroundColorsMap = DK_BACK_COLORS_MAP;
/**
* 5250 Extra char attribute
*/
static final int UNDERSCORE = 0x01;
/**
* 5250 Extra char attribute
*/
static final int COLUMN_SEPARATOR = 0x02;
static final int[] EXTRA_ATTR_MAP = {
// normal reverse
0x00,
0x00,
0x00,
0x00,
UNDERSCORE,
UNDERSCORE,
UNDERSCORE,
0x00,
0x00,
0x00,
0x00,
0x00,
UNDERSCORE,
UNDERSCORE,
UNDERSCORE,
0x00,
COLUMN_SEPARATOR,
COLUMN_SEPARATOR,
COLUMN_SEPARATOR,
COLUMN_SEPARATOR,
COLUMN_SEPARATOR | UNDERSCORE,
COLUMN_SEPARATOR | UNDERSCORE,
COLUMN_SEPARATOR | UNDERSCORE,
0x00,
0x00,
0x00,
0x00,
0x00,
UNDERSCORE,
UNDERSCORE,
UNDERSCORE,
0x00
};
/**
* Contructs a XI5250CrtBuffer with the given dimensions expressed in number of chars.
*/
public XI5250CrtBuffer(int nCols, int nRows) {
super(nCols, nRows);
setDefAttr(0x20);
clear(); // sets new attribute
}
/**
* Creates a XI5250CrtBuffer from a portion of another one.
*/
public XI5250CrtBuffer(XI5250CrtBuffer from, int aC, int aR, int aW, int aH) {
super(from, aC, aR, aW, aH);
setDefBackground(from.getDefBackground());
}
/**
* Returns a cloned XICrtBuffer (the new one needs initGraphics() to be
* displayed).
*/
@Override
public Object clone() {
XI5250CrtBuffer aClone = new XI5250CrtBuffer(this, 0, 0,
getCrtSize().width, getCrtSize().height);
/* !!1.04
XI5250CrtBuffer aClone = new XI5250CrtBuffer(getCrtSize().width, getCrtSize().height);
aClone.setDefBackground(getDefBackground()); //!!0.95b
aClone.copyFrom(this);
*/
return aClone;
}
/**
* Handles lines wrap.
*/
@Override
public synchronized void drawString(String aStr, int col, int row,
int aAttr) {
int lPos = toLinearPos(col, row);
col = toColPos(lPos);
row = toRowPos(lPos);
// if attribute == USE_PRESENT_ATTRIBUTE then get previous attribute
if (aAttr == XI5250Crt.USE_PRESENT_ATTRIBUTE)
aAttr = getAttr(col, row);
// split line to handle wrap
int len = aStr.length();
int x = col;
int y = row;
int dx;
int i = 0;
int maxW = getCrtSize().width;
while (len > 0) {
dx = Math.min(maxW - x, len);
super.drawString(aStr.substring(i, i + dx), x, y, aAttr);
i += dx;
len -= dx;
x = 0;
++y;
}
}
/**
* Draws attribute place-holder char.
*/
protected void _drawAttributePlaceHolder(Graphics gr, int col, int row,
int aAttr) {
int lPos = toLinearPos(col, row);
col = toColPos(lPos);
row = toRowPos(lPos);
int charW = getCharSize().width;
int charH = getCharSize().height;
gr.setColor(getBackground(0x20));
gr.fillRect(col * charW, row * charH, charW, charH);
if (XI5250Crt.DEBUG >= 2) { // to see them
gr.setColor(getForeground(0x20));
gr.drawString("#", col * charW, (row + 1) * charH);
}
}
/**
* Draws 5250 extra attribute (UNDERLINE and COLUMN_SEPARATOR).
*/
protected void _drawExtraAttribute(Graphics gr, int col, int row, int len,
int aAttr) {
int extra = getExtraCharAttribute(aAttr);
int dy = 2; //!!0.95b
int charW = getCharSize().width;
int charH = getCharSize().height;
gr.setColor(getForeground(aAttr));
if ((extra & UNDERSCORE) != 0) {
gr.drawLine(col * charW, (row + 1) * charH - dy - 1,
(col + len) * charW - 1, (row + 1) * charH - dy - 1);
}
if ((extra & COLUMN_SEPARATOR) != 0) {
gr.setColor(getForeground(0x22));
for (int i = 0; i < len; i++) {
gr.drawLine((col + i) * charW, (row + 1) * charH - dy,
(col + i) * charW, (row + 1) * charH - dy);
gr.drawLine((col + i + 1) * charW - 1, (row + 1) * charH - dy,
(col + i + 1) * charW - 1, (row + 1) * charH - dy);
}
}
}
/**
* Splits string to detect attribute place-holder presence.
*/
@Override
protected void _drawString(Graphics gr, String aStr, int col, int row,
int aAttr) {
if (aStr.length() <= 0)
return;
int pos = -1;
for (int i = 0; i < aStr.length(); i++) {
if (aStr.charAt(i) == XI5250Crt.ATTRIBUTE_PLACE_HOLDER) {
pos = i;
break;
}
}
if (pos == -1) {
super._drawString(gr, aStr, col, row, aAttr);
_drawExtraAttribute(gr, col, row, aStr.length(), aAttr);
}
else {
// draw string portion before attribute place-holder
if (pos > 0) {
super._drawString(gr, aStr, col, row, aAttr);
_drawExtraAttribute(gr, col, row, aStr.length(), aAttr);
}
// draw attribute place-holder
_drawAttributePlaceHolder(gr, col + pos, row, aAttr);
// draw string portion after attribute place-holder
if (pos < (aStr.length() - 1))
_drawString(gr, aStr.substring(pos + 1), col + pos + 1, row, aAttr);
}
}
/**
* Can be used to verify the presence of a string in the buffer.
* Redefined to implement lines wrap.
* @see String#indexOf
*/
@Override
public String getString(int col, int row, int nChars) {
StringBuilder str = new StringBuilder();
for (int i = 0; i < nChars; i++) {
int j = toLinearPos(col + i, row);
str.append(getChar(toColPos(j), toRowPos(j)));
}
return new String(str);
}
/**
* Attribute to color mapping.
*/
@Override
protected Color getBackground(int aAttribute) {
// see SA21-9247-6 pg 2-143
int mapIdx = Math.min(ivBackgroundColorsMap.length - 1,
getColorMapIdx(aAttribute));
return ivBackgroundColorsMap[mapIdx]
[getColorAttributeIdx(aAttribute) - 0x20];
}
/**
* Attribute to color mapping.
*/
@Override
protected Color getForeground(int aAttribute) {
// see SA21-9247-6 pg 2-143
int mapIdx = Math.min(ivForegroundColorsMap.length - 1,
getColorMapIdx(aAttribute));
return ivForegroundColorsMap[mapIdx]
[getColorAttributeIdx(aAttribute) - 0x20];
}
/**
* Attribute to extra char attribute mapping.
*/
protected int getExtraCharAttribute(int aAttribute) {
return EXTRA_ATTR_MAP[getColorAttributeIdx(aAttribute) - 0x20];
}
/**
*/
protected final byte getColorMapIdx(int aAttribute) {
return (byte)((aAttribute >> 24) & 0xFF);
}
/**
*/
protected final int getColorAttributeIdx(int aAttribute) {
return aAttribute & 0x00FFFFFF;
}
/**
*/
@Override
public int getAttr(int col, int row) {
int attr = super.getAttr(col, row);
XI5250Crt crt = (XI5250Crt)getCrt();
if (crt != null) {
//!!1.14 change color table
XI5250Field field = crt.getFieldFromPos(col, row);
if (field != null && !field.isOrgBypassField())
attr |= (1 << 24);
}
return attr;
}
/**
* Converts x-y coord to buffer linear position.
*/
public final int toLinearPos(int aCol, int aRow) {
return (aRow * getCrtSize().width) + aCol;
}
/**
* Converts buffer linear position to x-y coord.
*/
public final int toColPos(int aPos) {
return aPos % getCrtSize().width;
}
/**
* Converts buffer linear position to x-y coord.
*/
public final int toRowPos(int aPos) {
return aPos / getCrtSize().width;
}
/**
* Converts color to an intensity value (0 to 1000)
* @see #setDefBackground
*/
public static final int colorAsIntensity(Color aColor) {
float[] hsb = Color.RGBtoHSB(aColor.getRed(), aColor.getGreen(),
aColor.getBlue(), null);
return (int)(hsb[2] * 1000);
}
/**
* Changes the default background color.
* The new color intensity is used to choose which colors table must be used.
*/
public void setDefBackground(Color aColor) {
if (ivBackColor.equals(aColor))
return;
// check if background color intensity (referred to GRAY_INTENSITY)
// has changed
if ((colorAsIntensity(ivBackColor) >= GRAY_INTENSITY) !=
(colorAsIntensity(aColor) >= GRAY_INTENSITY)) {
boolean dark = (colorAsIntensity(aColor) < GRAY_INTENSITY);
ivBackgroundColorsMap = (dark) ? DK_BACK_COLORS_MAP : LT_BACK_COLORS_MAP;
ivForegroundColorsMap = (dark) ? DK_FORE_COLORS_MAP : LT_FORE_COLORS_MAP;
}
ivBackColor.setColor(aColor);
}
/**
*/
public Color getDefBackground() {
return ivBackColor.getColor();
}
// /**
// */
// void writeObject(ObjectOutputStream oos) throws IOException {
// oos.defaultWriteObject();
// }
//
// void readObject(ObjectInputStream ois) throws ClassNotFoundException, IOException {
// ois.defaultReadObject();
// }
//////////////////////////////////////////////////////////////////////////////
/**
* Simply routes all method calls to the contained color methods
*/
private static class ColorWrapper extends Color implements Serializable {
private static final long serialVersionUID = 1L;
private Color ivColor;
/**
*/
public ColorWrapper(Color aColor) {
super(0);
ivColor = aColor;
}
/**
*/
public void setColor(Color aColor) {
ivColor = aColor;
}
/**
*/
public Color getColor() {
return ivColor;
}
/**
*/
@Override
public int getRed() {
return ivColor.getRed();
}
@Override
public int getGreen() {
return ivColor.getGreen();
}
@Override
public int getBlue() {
return ivColor.getBlue();
}
@Override
public int getRGB() {
return ivColor.getRGB();
}
@Override
public Color brighter() {
return ivColor.brighter();
}
@Override
public Color darker() {
return ivColor.darker();
}
@Override
public int hashCode() {
return ivColor.hashCode();
}
@Override
public boolean equals(Object obj) {
return ivColor.equals(obj);
}
@Override
public String toString() {
return ivColor.toString();
}
}
}

View file

@ -0,0 +1,275 @@
/*
Copyright 2007 Infordata S.p.A.
Licensed under the Apache License, Version 2.0 (the "License");
you may not use this file except in compliance with the License.
You may obtain a copy of the License at
http://www.apache.org/licenses/LICENSE-2.0
Unless required by applicable law or agreed to in writing, software
distributed under the License is distributed on an "AS IS" BASIS,
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
See the License for the specific language governing permissions and
limitations under the License.
*/
/*
***
!!V 15/06/99 rel. 1.13 - creation.
*/
package net.infordata.em.crt5250;
import java.awt.Color;
import java.awt.Graphics;
import java.awt.Graphics2D;
import java.awt.SystemColor;
import java.awt.event.KeyEvent;
import java.awt.print.PageFormat;
import java.awt.print.Printable;
import java.awt.print.PrinterException;
import java.awt.print.PrinterJob;
import java.beans.PropertyChangeEvent;
import java.beans.PropertyChangeListener;
import java.util.logging.Level;
import java.util.logging.Logger;
import javax.swing.JOptionPane;
import javax.swing.SwingUtilities;
import javax.swing.UIManager;
import net.infordata.em.util.XICommand;
import net.infordata.em.util.XICommandMgr;
/**
* Handles common commands.
*/
public class XI5250CrtCtrl {
private static final Logger LOGGER = Logger.getLogger(XI5250CrtCtrl.class.getName());
private XI5250Crt ivCrt;
private XICommandMgr ivCommandMgr = new XICommandMgr();
public static final String SWITCH_3DFX_CMD = "SWITCH_3DFX_CMD";
public static final String REFERENCE_CURSOR_CMD = "REFERENCE_CURSOR_CMD";
public static final String COPY_CMD = "COPY_CMD";
public static final String PASTE_CMD = "PASTE_CMD";
public static final String PRINT_CMD = "PRINT_CMD";
/**
*/
public XI5250CrtCtrl(XI5250Crt aCrt) {
if (aCrt == null)
throw new IllegalArgumentException("An XI5250Crt instance is required.");
ivCrt = aCrt;
ivCrt.addPropertyChangeListener(new PropertyListener());
// Copy command
getCommandMgr().enableCommand(
COPY_CMD, ivCrt.getSelectedArea() != null);
getCommandMgr().setCommand(COPY_CMD, new XICommand() {
public void execute() {
processCopyCmd();
}
});
// Paste command
getCommandMgr().setCommand(PASTE_CMD, new XICommand() {
public void execute() {
processPasteCmd();
}
});
// 3Dfx command
getCommandMgr().setCommandState(SWITCH_3DFX_CMD, is3DFX());
getCommandMgr().setCommand(SWITCH_3DFX_CMD, new XICommand() {
public void execute() {
processSwitch3dFxCmd();
}
});
// Reference cursor command
getCommandMgr().setCommandState(
REFERENCE_CURSOR_CMD, ivCrt.isReferenceCursor());
getCommandMgr().setCommand(REFERENCE_CURSOR_CMD, new XICommand() {
public void execute() {
processReferenceCursorCmd();
}
});
// Print command
getCommandMgr().setCommand(PRINT_CMD, new XICommand() {
public void execute() {
processPrintCmd();
}
});
}
/**
*/
public final XI5250Crt getCrt() {
return ivCrt;
}
/**
*/
public final XICommandMgr getCommandMgr() {
return ivCommandMgr;
}
/**
*/
public final boolean is3DFX() {
return
(getCrt().getDefFieldsBorderStyle() == XI5250Field.LOWERED_BORDER);
}
/**
*/
protected void processCopyCmd() {
getCrt().processRawKeyEvent(
new KeyEvent(getCrt(), KeyEvent.KEY_PRESSED,
0, KeyEvent.CTRL_MASK, KeyEvent.VK_INSERT, (char)KeyEvent.VK_INSERT));
}
/**
*/
protected void processPasteCmd() {
getCrt().processRawKeyEvent(
new KeyEvent(getCrt(), KeyEvent.KEY_PRESSED,
0, KeyEvent.SHIFT_MASK, KeyEvent.VK_INSERT, (char)KeyEvent.VK_INSERT));
}
/**
*/
protected void processSwitch3dFxCmd() {
boolean flag = getCommandMgr().getCommandState(SWITCH_3DFX_CMD);
if (flag) {
getCrt().setDefFieldsBorderStyle(XI5250Field.LOWERED_BORDER);
getCrt().setDefBackground(UIManager.getColor("control"));
}
else {
getCrt().setDefFieldsBorderStyle(XI5250Field.NO_BORDER);
getCrt().setDefBackground(SystemColor.black);
}
}
/**
*/
protected void processReferenceCursorCmd() {
boolean flag = getCommandMgr().getCommandState(REFERENCE_CURSOR_CMD);
getCrt().setReferenceCursor(flag);
}
/**
*/
protected void emulatorPropertyChanged(PropertyChangeEvent e) {
String propertyName = e.getPropertyName();
if (propertyName == XI5250Crt.SELECTED_AREA) {
getCommandMgr().enableCommand(
COPY_CMD, getCrt().getSelectedArea() != null);
}
else if (propertyName == XI5250Crt.DEF_FIELDS_BORDER_STYLE) {
getCommandMgr().setCommandState(SWITCH_3DFX_CMD, is3DFX());
}
else if (propertyName == XI5250Crt.REFERENCE_CURSOR) {
getCommandMgr().setCommandState(
REFERENCE_CURSOR_CMD, getCrt().isReferenceCursor());
}
}
/**
*/
protected void processPrintCmd() {
PrinterJob job = PrinterJob.getPrinterJob();
job.setPrintable(new Printable() {
public int print(Graphics graphics, PageFormat pageFormat, int pageIndex)
throws PrinterException {
if (pageIndex > 0) {
return NO_SUCH_PAGE;
}
final int imgWidth = (int)pageFormat.getImageableWidth();
final int imgHeight = (int)pageFormat.getImageableHeight();
final XI5250Crt crt = getCrt();
Graphics2D g2d = (Graphics2D)graphics;
g2d.translate(pageFormat.getImageableX(), pageFormat.getImageableY());
double scale;
{
int w = crt.getSize().width;
int h = crt.getSize().height;
scale = Math.min(((double)imgWidth) / w, ((double)imgHeight) / h);
g2d.scale(scale, scale);
}
synchronized (crt.getTreeLock()) {
synchronized (crt) {
Color oldBG = crt.getDefBackground();
//int oldBS = crt.getDefFieldsBorderStyle();
try {
//crt.setDefFieldsBorderStyle(XI5250Field.NO_BORDER);
crt.setDefBackground(SystemColor.white);
crt.printAll(g2d);
}
finally {
//crt.setDefFieldsBorderStyle(oldBS);
crt.setDefBackground(oldBG);
}
}
}
return PAGE_EXISTS; }
});
boolean doPrint = job.printDialog();
if (doPrint) {
try {
job.print();
}
catch (final PrinterException ex) {
LOGGER.log(Level.SEVERE, "catchedException()", ex);
SwingUtilities.invokeLater(new Runnable() {
public void run() {
JOptionPane.showMessageDialog(getCrt(),
ex.getMessage() + "\nSee the log for details ",
"ERROR", JOptionPane.ERROR_MESSAGE);
}
});
}
}
}
//////////////////////////////////////////////////////////////////////////////
/**
* Usata per sincronizzare i comandi con le property dell' emulatore.
*/
class PropertyListener implements PropertyChangeListener {
public void propertyChange(PropertyChangeEvent e) {
emulatorPropertyChanged(e);
}
}
}

View file

@ -0,0 +1,128 @@
/*
Copyright 2007 Infordata S.p.A.
Licensed under the Apache License, Version 2.0 (the "License");
you may not use this file except in compliance with the License.
You may obtain a copy of the License at
http://www.apache.org/licenses/LICENSE-2.0
Unless required by applicable law or agreed to in writing, software
distributed under the License is distributed on an "AS IS" BASIS,
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
See the License for the specific language governing permissions and
limitations under the License.
*/
/*
!!V 03/03/98 rel. _.___- SWING and reorganization.
***
30/06/98 rel. _.___- Swing, JBuilder2 e VSS.
*/
package net.infordata.em.crt5250;
import java.awt.event.KeyEvent;
import java.util.EventObject;
/**
*/
public class XI5250CrtEvent extends EventObject {
private static final long serialVersionUID = 1L;
/**
* A field has been activated.
*/
public static final int FIELD_ACTIVATED = 0;
/**
* A field has been deactivated.
*/
public static final int FIELD_DEACTIVATED = FIELD_ACTIVATED + 1;
/**
* The crt real-size is changed (ie. the font size is changed) (this event is posted).
*/
public static final int SIZE_CHANGED = FIELD_ACTIVATED + 2;
/**
* A key has been pressed.
* !!! Use this event instead of AWT KeyEvent !!!.
*/
public static final int KEY_EVENT = FIELD_ACTIVATED + 3;
/**
* Mouse enters the field area.
*/
public static final int MOUSE_ENTERS_FIELD = FIELD_ACTIVATED + 4;
/**
* Mouse exits from a field area.
*/
public static final int MOUSE_EXITS_FIELD = FIELD_ACTIVATED + 5;
private static final String[] cvIdDescr = {"FIELD_ACTIVATED",
"FIELD_DEACTIVATED",
"SIZE_CHANGED",
"KEY_EVENT",
"MOUSE_ENTERS_FIELD",
"MOUSE_EXITS_FIELD"};
private int ivId;
private XI5250Field ivField;
private KeyEvent ivKeyEvent;
/**
*/
protected XI5250CrtEvent(int aId, XI5250Crt aCrt, XI5250Field aField,
KeyEvent aKeyEvent) {
super(aCrt);
ivId = aId;
ivField = aField;
ivKeyEvent = aKeyEvent;
}
/**
*/
public XI5250CrtEvent(int aId, XI5250Crt aCrt, XI5250Field aField) {
this(aId, aCrt, aField, null);
}
/**
*/
public final int getID() {
return ivId;
}
/**
*/
public final XI5250Crt getCrt() {
return (XI5250Crt)getSource();
}
/**
*/
public final XI5250Field getField() {
return ivField;
}
/**
*/
public final KeyEvent getKeyEvent() {
return ivKeyEvent;
}
/**
*/
@Override
public String toString() {
return super.toString() + "[" + cvIdDescr[getID()] + "," + ivField + "]";
}
}

View file

@ -0,0 +1,371 @@
/*
Copyright 2007 Infordata S.p.A.
Licensed under the Apache License, Version 2.0 (the "License");
you may not use this file except in compliance with the License.
You may obtain a copy of the License at
http://www.apache.org/licenses/LICENSE-2.0
Unless required by applicable law or agreed to in writing, software
distributed under the License is distributed on an "AS IS" BASIS,
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
See the License for the specific language governing permissions and
limitations under the License.
*/
/*
***
!!V 15/06/99 rel. 1.13 - creation.
*/
package net.infordata.em.crt5250;
import java.awt.AWTEvent;
import java.awt.BorderLayout;
import java.awt.Dimension;
import java.awt.Toolkit;
import java.awt.event.WindowEvent;
import java.beans.PropertyChangeEvent;
import java.beans.PropertyChangeListener;
import java.util.ResourceBundle;
import javax.swing.AbstractButton;
import javax.swing.JButton;
import javax.swing.JCheckBoxMenuItem;
import javax.swing.JFrame;
import javax.swing.JMenu;
import javax.swing.JMenuBar;
import javax.swing.JMenuItem;
import javax.swing.JPanel;
import javax.swing.JToggleButton;
import javax.swing.JToolBar;
import javax.swing.SwingUtilities;
import net.infordata.em.tn5250.XI5250EmulatorCtrl;
import net.infordata.em.util.XICommand;
import net.infordata.em.util.XICommandMgr;
import net.infordata.em.util.XIUtil;
/**
*/
public class XI5250CrtFrame extends JFrame {
private static final long serialVersionUID = 1L;
// images
private static XIImagesBdl cvImagesBdl = XIImagesBdl.getImagesBdl();
private static ResourceBundle cvRes =
ResourceBundle.getBundle("net.infordata.em.crt5250.resources.Res");
private boolean ivPending;
private boolean ivOpened;
private boolean ivFirstTime = true; //!!1.11
private boolean ivSizeControlledFrame = false; //!!1.11
private XI5250CrtCtrl ivCrtCtrl;
public static final String EXIT_CMD = "EXIT_CMD";
/**
*/
public XI5250CrtFrame(String aTitle, XI5250Crt aCrt) {
this(aTitle, aCrt, false);
}
/**
*/
public XI5250CrtFrame(String aTitle, XI5250Crt aCrt,
boolean sizeControlledFrame) {
super(aTitle);
ivSizeControlledFrame = sizeControlledFrame;
if (aCrt == null)
throw new IllegalArgumentException("An XI5250Crt instance is required.");
setDefaultCloseOperation(DO_NOTHING_ON_CLOSE);
ivCrtCtrl = createController(aCrt);
enableEvents(AWTEvent.WINDOW_EVENT_MASK);
JPanel panel = new XI5250Crt.SupportPanel(getCrt());
panel.setBackground(getCrt().getBackground());
getContentPane().add(panel, BorderLayout.CENTER);
getCrt().addPropertyChangeListener(new PropertyChangeListener() {
public void propertyChange(PropertyChangeEvent evt) {
emulatorPropertyChanged(evt);
}
});
//
JToolBar toolBar = createToolBar();
JMenuBar menuBar = createMenuBar();
setJMenuBar(menuBar);
getContentPane().add(toolBar, BorderLayout.NORTH);
// Exit command
getCommandMgr().setCommand(EXIT_CMD, new XICommand() {
public void execute() {
processExitCmd();
}
});
}
public void doNotPackOnStartup() {
ivFirstTime = false;
}
/**
*/
protected void processExitCmd() {
setVisible(false);
dispose();
}
/**
*/
protected XI5250CrtCtrl createController(XI5250Crt crt) {
return new XI5250CrtCtrl(crt);
}
/**
*/
protected final XI5250CrtCtrl getCrtCtrl() {
return ivCrtCtrl;
}
/**
*/
public final XI5250Crt getCrt() {
return ivCrtCtrl.getCrt();
}
/**
*/
private void emulatorPropertyChanged(PropertyChangeEvent evt) {
String propertyName = evt.getPropertyName();
if ("background".equals(propertyName))
getCrt().getParent().setBackground(getCrt().getBackground());
else if ("font".equals(propertyName) ||
XI5250Crt.CRT_SIZE.equals(propertyName)) {
getCrt().revalidate();
sizeChanged();
}
}
/**
*/
public final XICommandMgr getCommandMgr() {
return ivCrtCtrl.getCommandMgr();
}
/**
*/
@Override
public void invalidate() {
super.invalidate();
sizeChanged();
}
/**
*/
protected void sizeChanged() {
if (ivOpened && !ivPending) {
ivPending = true;
SwingUtilities.invokeLater(new Runnable() {
public void run() {
try {
if (ivFirstTime || ivSizeControlledFrame) {
ivFirstTime = false;
pack(); //!!1.03b
}
}
finally {
ivPending = false;
}
}
});
}
}
/**
*/
public void centerOnScreen() {
Dimension ss = Toolkit.getDefaultToolkit().getScreenSize();
Dimension dim = getSize();
setBounds((ss.width - dim.width) / 2, (ss.height - dim.height) / 2 ,
dim.width, dim.height);
}
/**
*/
public void centerOnScreen(int perc) {
Dimension ss = Toolkit.getDefaultToolkit().getScreenSize();
Dimension dim = getSize();
dim.width = (ss.width * perc) / 100;
dim.height = (ss.height * perc) / 100;
setBounds((ss.width - dim.width) / 2, (ss.height - dim.height) / 2 ,
dim.width, dim.height);
}
/**
*/
@Override
protected void processWindowEvent(WindowEvent e) {
switch(e.getID()) {
case WindowEvent.WINDOW_OPENED:
getCrt().requestFocus();
ivOpened = true;
sizeChanged();
break;
case WindowEvent.WINDOW_CLOSING:
getCommandMgr().dispatchCommand(EXIT_CMD);
break;
case WindowEvent.WINDOW_CLOSED:
break;
}
super.processWindowEvent(e);
}
/**
*/
protected JMenuBar createMenuBar() {
String str;
str = cvRes.getString("TXT_Edit");
JMenu editMenu = new JMenu(XIUtil.removeMnemonics(str));
editMenu.setMnemonic(XIUtil.getMnemonic(str));
{
JMenuItem copyItem =
new JMenuItem(cvRes.getString("TXT_Copy"));
JMenuItem pasteItem =
new JMenuItem(cvRes.getString("TXT_Paste"));
JMenuItem printItem =
new JMenuItem(cvRes.getString("TXT_Print"));
editMenu.add(copyItem);
editMenu.add(pasteItem);
editMenu.addSeparator();
editMenu.add(printItem);
getCommandMgr().handleCommand(copyItem,
XI5250CrtCtrl.COPY_CMD);
getCommandMgr().handleCommand(pasteItem,
XI5250CrtCtrl.PASTE_CMD);
getCommandMgr().handleCommand(printItem,
XI5250EmulatorCtrl.PRINT_CMD);
}
str = cvRes.getString("TXT_Options");
JMenu optionsMenu = new JMenu(XIUtil.removeMnemonics(str));
optionsMenu.setMnemonic(XIUtil.getMnemonic(str));
{
JCheckBoxMenuItem switch3DfxItem =
new JCheckBoxMenuItem(cvRes.getString("TXT_3dFx"));
JCheckBoxMenuItem referenceCursorItem =
new JCheckBoxMenuItem(cvRes.getString("TXT_RefCursor"));
optionsMenu.add(switch3DfxItem);
optionsMenu.add(referenceCursorItem);
getCommandMgr().handleCommand(switch3DfxItem,
XI5250CrtCtrl.SWITCH_3DFX_CMD);
getCommandMgr().handleCommand(referenceCursorItem,
XI5250CrtCtrl.REFERENCE_CURSOR_CMD);
}
JMenuBar menuBar = new JMenuBar();
menuBar.add(editMenu);
menuBar.add(optionsMenu);
return menuBar;
}
/**
* Inserisce nella tool-bar i bottoni di default.
*/
protected JToolBar createToolBar() {
// bottoni della tool-bar
AbstractButton[] buttons = new AbstractButton[] {
new JButton(cvImagesBdl.getIcon("Copy")),
new JButton(cvImagesBdl.getIcon("Paste")),
null,
new JButton(cvImagesBdl.getIcon("Print")),
null,
new JToggleButton(cvImagesBdl.getIcon("3dFx")),
new JToggleButton(cvImagesBdl.getIcon("RefCursor")),
};
// action commands associati con i bottoni della tool-bar.
String[] buttonsActCmd = new String[] {
XI5250CrtCtrl.COPY_CMD,
XI5250CrtCtrl.PASTE_CMD,
null,
XI5250EmulatorCtrl.PRINT_CMD,
null,
XI5250CrtCtrl.SWITCH_3DFX_CMD,
XI5250CrtCtrl.REFERENCE_CURSOR_CMD,
};
// Hint associati ad i vari bottoni.
String[] buttonHints = new String[] {
cvRes.getString("TXT_Copy"),
cvRes.getString("TXT_Paste"),
null,
cvRes.getString("TXT_Print"),
null,
cvRes.getString("TXT_3dFx"),
cvRes.getString("TXT_RefCursor"),
};
JToolBar toolBar = new JToolBar();
toolBar.setFloatable(false);
Dimension size = new Dimension(26, 26);
for (int i = 0; i < buttons.length; i++) {
if (buttons[i] != null) {
AbstractButton button = (AbstractButton)buttons[i];
toolBar.add(button);
button.setToolTipText(buttonHints[i]);
button.setMinimumSize(size);
button.setPreferredSize(size);
button.setMaximumSize(size);
button.setRequestFocusEnabled(false);
getCommandMgr().handleCommand(button, buttonsActCmd[i]);
}
else
toolBar.addSeparator();
}
return toolBar;
}
}

View file

@ -0,0 +1,72 @@
/*
Copyright 2007 Infordata S.p.A.
Licensed under the Apache License, Version 2.0 (the "License");
you may not use this file except in compliance with the License.
You may obtain a copy of the License at
http://www.apache.org/licenses/LICENSE-2.0
Unless required by applicable law or agreed to in writing, software
distributed under the License is distributed on an "AS IS" BASIS,
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
See the License for the specific language governing permissions and
limitations under the License.
*/
/**
!!V 03/03/98 rel. _.___- SWING and reorganization.
***
30/06/98 rel. _.___- Swing, JBuilder2 e VSS.
*/
package net.infordata.em.crt5250;
import java.util.EventListener;
/**
* XI5250CrtEvent listener
*
* @version
* @author Valentino Proietti - Infordata S.p.A.
*/
public interface XI5250CrtListener extends EventListener {
/**
* @see XI5250CrtEvent#FIELD_ACTIVATED
*/
public void fieldActivated(XI5250CrtEvent e);
/**
* @see XI5250CrtEvent#FIELD_DEACTIVATED
*/
public void fieldDeactivated(XI5250CrtEvent e);
/**
* @see XI5250CrtEvent#SIZE_CHANGED
*/
public void sizeChanged(XI5250CrtEvent e);
/**
* @see XI5250CrtEvent#KEY_EVENT
*/
public void keyEvent(XI5250CrtEvent e);
/**
* @see XI5250CrtEvent#MOUSE_ENTERS_FIELD
*/
public void mouseEntersField(XI5250CrtEvent e);
/**
* @see XI5250CrtEvent#MOUSE_EXITS_FIELD
*/
public void mouseExitsField(XI5250CrtEvent e);
}

File diff suppressed because it is too large Load diff

View file

@ -0,0 +1,67 @@
/*
Copyright 2007 Infordata S.p.A.
Licensed under the Apache License, Version 2.0 (the "License");
you may not use this file except in compliance with the License.
You may obtain a copy of the License at
http://www.apache.org/licenses/LICENSE-2.0
Unless required by applicable law or agreed to in writing, software
distributed under the License is distributed on an "AS IS" BASIS,
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
See the License for the specific language governing permissions and
limitations under the License.
*/
/*
!!V 14/05/97 rel. 0.96d- removed SIZE_CHANGED.
27/05/97 rel. 1.00 - first release.
03/03/98 rel. _.___- SWING and reorganization.
***
30/06/98 rel. _.___- Swing, JBuilder2 e VSS.
*/
package net.infordata.em.crt5250;
/**
* XI5250FieldListener adapter.
* @see XI5250FieldListener
*
* @version
* @author Valentino Proietti - Infordata S.p.A.
*/
public class XI5250FieldAdapter implements XI5250FieldListener {
/**
*/
public void activated(XI5250FieldEvent e) {
}
/**
*/
public void deactivated(XI5250FieldEvent e) {
}
/**
*/
public void valueChanged(XI5250FieldEvent e) {
}
/**
*/
public void enabledStateChanged(XI5250FieldEvent e) {
}
/**
*/
public void keyEvent(XI5250FieldEvent e) {
}
}

View file

@ -0,0 +1,118 @@
/*
Copyright 2007 Infordata S.p.A.
Licensed under the Apache License, Version 2.0 (the "License");
you may not use this file except in compliance with the License.
You may obtain a copy of the License at
http://www.apache.org/licenses/LICENSE-2.0
Unless required by applicable law or agreed to in writing, software
distributed under the License is distributed on an "AS IS" BASIS,
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
See the License for the specific language governing permissions and
limitations under the License.
*/
/*
!!V 14/05/97 rel. 0.96d- removed SIZE_CHANGED.
27/05/97 rel. 1.00 - first release.
03/03/98 rel. _.___- SWING and reorganization.
***
30/06/98 rel. _.___- Swing, JBuilder2 e VSS.
*/
package net.infordata.em.crt5250;
import java.awt.event.KeyEvent;
import java.util.EventObject;
/**
* XI5250Field notification event.
*
* @version
* @author Valentino Proietti - Infordata S.p.A.
*/
public class XI5250FieldEvent extends EventObject {
private static final long serialVersionUID = 1L;
/**
* The field has been activated (ie. the cursor enters the field area)
*/
public static final int ACTIVATED = 0;
/**
* The field has been deactivated (ie. the cursor exits the field area)
*/
public static final int DEACTIVATED = 1;
/**
* The field value has been changed.
*/
public static final int VALUE_CHANGED = 2;
/**
* The field enabled state has changed.
*/
public static final int ENABLED_STATE_CHANGED = 3;
/**
*/
public static final int KEY_EVENT = 4;
private static final String[] cvIdDescr = {"ACTIVATED",
"DEACTIVATED",
"VALUE_CHANGED",
"ENABLED_STATE_CHANGED",
"KEY_EVENT"};
private int ivId;
private KeyEvent ivKeyEvent;
/**
*/
public XI5250FieldEvent(int aId, XI5250Field aField) {
super(aField);
ivId = aId;
}
/**
*/
public XI5250FieldEvent(int aId, XI5250Field aField, KeyEvent ke) {
this(aId, aField);
ivKeyEvent = ke;
}
/**
*/
public final int getID() {
return ivId;
}
/**
*/
public final XI5250Field getField() {
return (XI5250Field)getSource();
}
/**
*/
public final KeyEvent getKeyEvent() {
return ivKeyEvent;
}
/**
*/
@Override
public String toString() {
return super.toString() + "[" + cvIdDescr[ivId] + "," + getSource() + "]";
}
}

View file

@ -0,0 +1,68 @@
/*
Copyright 2007 Infordata S.p.A.
Licensed under the Apache License, Version 2.0 (the "License");
you may not use this file except in compliance with the License.
You may obtain a copy of the License at
http://www.apache.org/licenses/LICENSE-2.0
Unless required by applicable law or agreed to in writing, software
distributed under the License is distributed on an "AS IS" BASIS,
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
See the License for the specific language governing permissions and
limitations under the License.
*/
/*
!!V 14/05/97 rel. 0.96d- removed SIZE_CHANGED.
27/05/97 rel. 1.00 - first release.
03/03/98 rel. _.___- SWING and reorganization.
***
30/06/98 rel. _.___- Swing, JBuilder2 e VSS.
*/
package net.infordata.em.crt5250;
import java.util.EventListener;
/**
* Listener for XI5250FieldEvent.
*
* @version
* @author Valentino Proietti - Infordata S.p.A.
*/
public interface XI5250FieldListener extends EventListener {
/**
* Input cursor enters in the field area
*/
public void activated(XI5250FieldEvent e);
/**
* Input cursor exits from the input area
*/
public void deactivated(XI5250FieldEvent e);
/**
* Field value is changed
*/
public void valueChanged(XI5250FieldEvent e);
/**
* Field enabled state is changed using setEnabled method
* @see XI5250Field#setEnabled
* @see XI5250Field#isEnabled
*/
public void enabledStateChanged(XI5250FieldEvent e);
/**
*/
public void keyEvent(XI5250FieldEvent e);
}

View file

@ -0,0 +1,45 @@
/*
Copyright 2007 Infordata S.p.A.
Licensed under the Apache License, Version 2.0 (the "License");
you may not use this file except in compliance with the License.
You may obtain a copy of the License at
http://www.apache.org/licenses/LICENSE-2.0
Unless required by applicable law or agreed to in writing, software
distributed under the License is distributed on an "AS IS" BASIS,
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
See the License for the specific language governing permissions and
limitations under the License.
*/
/*
!!V 27/05/97 rel. 1.00 - first release.
03/03/98 rel. _.___- SWING and reorganization.
***
30/06/98 rel. _.___- Swing, JBuilder2 e VSS.
*/
package net.infordata.em.crt5250;
/**
* XI5250FieldPaintListener adapter.
* @see XI5250FieldPaintListener
*/
public class XI5250FieldPaintAdapter implements XI5250FieldPaintListener {
/**
*/
public void fieldPaint(XI5250FieldPaintEvent e) {
}
/**
*/
public void rowPaint(XI5250FieldPaintEvent e) {
}
}

View file

@ -0,0 +1,95 @@
/*
Copyright 2007 Infordata S.p.A.
Licensed under the Apache License, Version 2.0 (the "License");
you may not use this file except in compliance with the License.
You may obtain a copy of the License at
http://www.apache.org/licenses/LICENSE-2.0
Unless required by applicable law or agreed to in writing, software
distributed under the License is distributed on an "AS IS" BASIS,
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
See the License for the specific language governing permissions and
limitations under the License.
*/
/*
!!V 27/05/97 rel. 1.00 - first release.
03/03/98 rel. _.___- SWING and reorganization.
***
30/06/98 rel. _.___- Swing, JBuilder2 e VSS.
*/
package net.infordata.em.crt5250;
import java.awt.Graphics;
import java.util.EventObject;
/**
* XI5250Field painting event.
*
* @version
* @author Valentino Proietti - Infordata S.p.A.
*/
public class XI5250FieldPaintEvent extends EventObject {
private static final long serialVersionUID = 1L;
/**
* Paint at field level can be added.
*/
public static final int FIELD_PAINT = 0;
/**
* Paint at field singol row level can be added.
*/
public static final int ROW_PAINT = 1;
private static final String[] cvIdDescr = {"FIELD_PAINT",
"ROW_PAINT"};
private int ivId;
private Graphics ivGr;
/**
*/
public XI5250FieldPaintEvent(int aId, XI5250Field aField, Graphics aGr) {
super(aField);
ivId = aId;
ivGr = aGr;
}
/**
*/
public int getID() {
return ivId;
}
/**
* Returns the Graphics that can be used to paint.
*/
public Graphics getGraphics() {
return ivGr;
}
/**
*/
public XI5250Field getField() {
return (XI5250Field)getSource();
}
/**
*/
@Override
public String toString() {
return super.toString() + "[" + cvIdDescr[ivId] + "," + getSource() + "]";
}
}

View file

@ -0,0 +1,55 @@
/*
Copyright 2007 Infordata S.p.A.
Licensed under the Apache License, Version 2.0 (the "License");
you may not use this file except in compliance with the License.
You may obtain a copy of the License at
http://www.apache.org/licenses/LICENSE-2.0
Unless required by applicable law or agreed to in writing, software
distributed under the License is distributed on an "AS IS" BASIS,
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
See the License for the specific language governing permissions and
limitations under the License.
*/
/*
!!V 27/05/97 rel. 1.00 - first release.
03/03/98 rel. _.___- SWING and reorganization.
***
30/06/98 rel. _.___- Swing, JBuilder2 e VSS.
*/
package net.infordata.em.crt5250;
import java.util.EventListener;
/**
* Usefull to add some paint over a field.
*
* @version
* @author Valentino Proietti - Infordata S.p.A.
*/
public interface XI5250FieldPaintListener extends EventListener {
/**
* One event for paint, the bounding rectangle is setted as the clip region.
* Coordinate are relative to the field bounding rectangle
* @see XI5250Field#getBoundingRect
*/
public void fieldPaint(XI5250FieldPaintEvent e);
/**
* One event for each row that makes up the field
* (a field can be splitted over multiple rows)
* Coordinate are relative to the field bounding rectangle
* @see XI5250Field#getRowsRects
*/
public void rowPaint(XI5250FieldPaintEvent e);
}

View file

@ -0,0 +1,44 @@
/*
Copyright 2007 Infordata S.p.A.
Licensed under the Apache License, Version 2.0 (the "License");
you may not use this file except in compliance with the License.
You may obtain a copy of the License at
http://www.apache.org/licenses/LICENSE-2.0
Unless required by applicable law or agreed to in writing, software
distributed under the License is distributed on an "AS IS" BASIS,
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
See the License for the specific language governing permissions and
limitations under the License.
*/
/*
03/03/98 rel. _.___- SWING and reorganization.
***
30/06/98 rel. _.___- Swing, JBuilder2 e VSS.
*/
package net.infordata.em.crt5250;
import java.io.IOException;
///////////////////////////////////////////////////////////////////////////////
/**
* Interface that must be implemented to save XI5250 field status.
*
* @see XI5250Field#saveTo
*
* @version
* @author Valentino Proietti - Infordata S.p.A.
*/
public interface XI5250FieldSaver {
/**
*
*/
public void write(XI5250Field aField, String aStr) throws IOException;
}

View file

@ -0,0 +1,310 @@
/*
Copyright 2007 Infordata S.p.A.
Licensed under the Apache License, Version 2.0 (the "License");
you may not use this file except in compliance with the License.
You may obtain a copy of the License at
http://www.apache.org/licenses/LICENSE-2.0
Unless required by applicable law or agreed to in writing, software
distributed under the License is distributed on an "AS IS" BASIS,
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
See the License for the specific language governing permissions and
limitations under the License.
*/
/*
!!V 27/05/97 rel. 1.00 - first release.
03/03/98 rel. _.___- SWING and reorganization.
***
30/06/98 rel. _.___- Swing, JBuilder2 e VSS.
*/
package net.infordata.em.crt5250;
import java.awt.Graphics;
import java.awt.Rectangle;
import java.io.IOException;
import java.util.ArrayList;
import java.util.Collections;
import java.util.Iterator;
import java.util.List;
///////////////////////////////////////////////////////////////////////////////
/**
* It is used by XI5250Crt to handle the XI5250Field collection.
*
* @see XI5250Crt
*
* @version
* @author Valentino Proietti - Infordata S.p.A.
*/
public class XI5250FieldsList implements XI5250BaseField, Cloneable {
private XI5250Crt ivCrt;
private ArrayList<XI5250Field> ivFields = new ArrayList<XI5250Field>(40);
private List<XI5250Field> ivROFields = Collections.unmodifiableList(ivFields);
/**
*/
public XI5250FieldsList(XI5250Crt aCrt) {
ivCrt = aCrt;
}
/**
* Returns a cloned XI5250FieldList
*/
@Override
@SuppressWarnings("unchecked")
public Object clone() {
try {
XI5250FieldsList aClone = (XI5250FieldsList)super.clone();
// non clono singoli campi perchè vengono sempre ricreati da 0 e mai modificati
aClone.ivFields = (ArrayList<XI5250Field>)ivFields.clone();
aClone.ivROFields = Collections.unmodifiableList(aClone.ivFields);
return aClone;
}
catch (CloneNotSupportedException e) {
throw new InternalError();
}
}
/**
* Calls init for each field it owns.
* @see XI5250Field#init
*/
public void init() {
for (int i = 0; i < ivFields.size(); i++)
ivFields.get(i).init();
}
/**
* Calls removeNotify for each field it owns.
*/
public void removeNotify() {
for (int i = 0; i < ivFields.size(); i++)
ivFields.get(i).removeNotify();
}
/**
* Calls saveTo for each field it owns.
* @see XI5250Field#saveTo
*/
public void saveTo(XI5250FieldSaver aSaver) throws IOException {
for (int i = 0; i < ivFields.size(); i++)
ivFields.get(i).saveTo(aSaver);
}
/**
* Calls resized for each field it owns.
* @see XI5250Field#resized
*/
public void resized() {
for (int i = 0; i < ivFields.size(); i++)
ivFields.get(i).resized();
}
/**
* Lets fields paint themselves.
*/
public void paint(Graphics g) {
XI5250Field field = null;
Rectangle clip = g.getClipBounds();
for (int i = 0; i < ivFields.size(); i++) {
field = ivFields.get(i);
Rectangle fr = field.getBoundingRect();
if (clip.intersects(fr)) {
Graphics fg = g.create(fr.x, fr.y, fr.width, fr.height);
try {
field.paint(fg);
}
finally {
fg.dispose();
}
}
}
}
/**
* Ricerca campo che inizia da tale posizione, se non lo trova
* ritorna un numero negativo che trasformandolo con la formula
* idx = (-idx) - 1 indica la posizione nel vettore dove dovrebbe
* essere inserito
*/
private int searchField(int aCol, int aRow) {
int kk = ivCrt.toLinearPos(aCol, aRow);
int min = 0;
int max = ivFields.size();
int med = (max + min) / 2;
XI5250Field field;
// ricerca binaria
while ((med < ivFields.size()) && (min <= max)) {
field = ivFields.get(med);
if (field.getSortKey() == kk)
return med;
else if (field.getSortKey() > kk)
max = med - 1;
else
min = med + 1;
med = (max + min) / 2;
}
// non esiste quindi
return -(min + 1);
}
/**
* Adds a field to the fields collection.
*/
public void addField(XI5250Field aField) {
/*
// !!V già presente in quella posizione, oppure overlapping,
// sollevare una eccezione invece di return ??
if (fieldFromPos(aField.ivCol, aField.ivRow) != null)
return;
*/
// !!V già presente in quella posizione, oppure overlapping,
// viene sostituito il campo
XI5250Field field = fieldFromPos(aField.getCol(), aField.getRow());
if (field != null) {
ivFields.set(fromFieldToIdx(field), aField);
}
else {
int idx = searchField(aField.getCol(), aField.getRow());
idx = (-idx) - 1;
ivFields.add(idx, aField);
}
}
/**
* Campo presente in tale posizione oppure precedente
*/
private XI5250Field prevFieldFromPosInternal(int aCol, int aRow) {
int idx = searchField(aCol, aRow);
if (idx >= 0)
return ivFields.get(idx);
idx = (-idx) - 1;
if (idx == 0)
return null;
// accedo al precedente
return ivFields.get(idx - 1);
}
/**
* Ritorna indice del campo
*/
protected int fromFieldToIdx(XI5250Field aField) {
XI5250Field field;
int i = 0;
for (Iterator<XI5250Field> e = ivFields.iterator(); e.hasNext(); i++) {
field = e.next();
if (field == aField)
return i;
}
return -1;
}
/**
* Returns the field present in the given position, null if none.
*/
public XI5250Field fieldFromPos(int aCol, int aRow) {
// accedo al precedente
XI5250Field field = prevFieldFromPosInternal(aCol, aRow);
if (field == null)
return null;
int kk = ivCrt.toLinearPos(aCol, aRow);
int fk = field.getSortKey();
// verifico che posizione sia sul campo
if ((kk >= fk) && (kk < (fk + field.getLength())))
return field;
else
return null;
}
/**
*/
public XI5250Field nextFieldFromPos(int aCol, int aRow) {
if (ivFields.isEmpty())
return null;
// accedo al precedente
XI5250Field field = prevFieldFromPosInternal(aCol, aRow);
if (field == null || field == ivFields.get(ivFields.size() - 1))
return ((!ivFields.isEmpty()) ? ivFields.get(0) :
null);
int idx = fromFieldToIdx(field);
return ivFields.get(idx + 1);
}
/**
*/
public XI5250Field prevFieldFromPos(int aCol, int aRow) {
if (ivFields.isEmpty())
return null;
XI5250Field field = fieldFromPos(aCol, aRow);
// caso cursore sul campo
if (field != null) {
if (field == ivFields.get(0))
return ivFields.get(ivFields.size() - 1);
int idx = fromFieldToIdx(field);
idx = (idx == 0) ? (ivFields.size() - 1) : idx - 1;
return ivFields.get(idx);
}
// caso cursore non sul campo
// accedo al precedente
field = prevFieldFromPosInternal(aCol, aRow);
if (field == null)
return ((!ivFields.isEmpty()) ? ivFields.get(ivFields.size() - 1) : null);
return field;
}
/**
*/
public List<XI5250Field> getFields() {
return ivROFields;
}
/**
* Returns the field at the given index (null if none).
* Fields enumeration is based on their linear buffer position.
*/
public XI5250Field getField(int idx) {
try {
return (XI5250Field)ivFields.get(idx);
}
catch (ArrayIndexOutOfBoundsException ex) {
return null;
}
}
}

File diff suppressed because it is too large Load diff

View file

@ -0,0 +1,273 @@
/*
Copyright 2007 Infordata S.p.A.
Licensed under the Apache License, Version 2.0 (the "License");
you may not use this file except in compliance with the License.
You may obtain a copy of the License at
http://www.apache.org/licenses/LICENSE-2.0
Unless required by applicable law or agreed to in writing, software
distributed under the License is distributed on an "AS IS" BASIS,
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
See the License for the specific language governing permissions and
limitations under the License.
*/
/*
!!V 10/04/97 rel. 0.93 - moved to crt5250 package.
16/04/97 rel. 0.94 - toPacked method added.
28/04/97 rel. 0.94c- corrected problem with underscore.
27/05/97 rel. 1.00 - first release.
25/07/97 rel. 1.03a- '|' char mapping.
03/03/98 rel. _.___- SWING and reorganization.
***
30/06/98 rel. _.___- Swing, JBuilder2 e VSS.
*/
package net.infordata.em.crt5250;
import java.util.Collections;
import java.util.LinkedHashMap;
import java.util.Map;
/**
* @version
* @author Valentino Proietti - Infordata S.p.A.
*/
public abstract class XIEbcdicTranslator {
private static final Map<String,XIEbcdicTranslator> cvRegistry =
Collections.synchronizedMap(new LinkedHashMap<String,XIEbcdicTranslator>());
private static final Map<String,XIEbcdicTranslator> cvRORegistry =
Collections.unmodifiableMap(cvRegistry);
static {
registerTranslator("CP37", XIEbcdicNTranslator.TRANSLATOR_CP37);
registerTranslator("CP273", XIEbcdicNTranslator.TRANSLATOR_CP273);
registerTranslator("CP277", XIEbcdicNTranslator.TRANSLATOR_CP277);
registerTranslator("CP278", XIEbcdicNTranslator.TRANSLATOR_CP278);
registerTranslator("CP280", XIEbcdicNTranslator.TRANSLATOR_CP280);
registerTranslator("CP284", XIEbcdicNTranslator.TRANSLATOR_CP284);
registerTranslator("CP285", XIEbcdicNTranslator.TRANSLATOR_CP285);
registerTranslator("CP297", XIEbcdicNTranslator.TRANSLATOR_CP297);
registerTranslator("CP424", XIEbcdicNTranslator.TRANSLATOR_CP424);
registerTranslator("CP500", XIEbcdicNTranslator.TRANSLATOR_CP500);
registerTranslator("CP850", XIEbcdicNTranslator.TRANSLATOR_CP850);
registerTranslator("CP870", XIEbcdicNTranslator.TRANSLATOR_CP870);
registerTranslator("CP838", XIEbcdicNTranslator.TRANSLATOR_CP838);
registerTranslator("CP1140", XIEbcdicNTranslator.TRANSLATOR_CP1140);
registerTranslator("CP1141", XIEbcdicNTranslator.TRANSLATOR_CP1141);
registerTranslator("CP1144", XIEbcdicNTranslator.TRANSLATOR_CP1144);
registerTranslator("CP1147", XIEbcdicNTranslator.TRANSLATOR_CP1147);
registerTranslator("CP1153", XIEbcdicNTranslator.TRANSLATOR_CP1153);
registerTranslator("CP1160", XIEbcdicNTranslator.TRANSLATOR_CP1160);
//
registerTranslator("CP1025", XIEbcdicNTranslator.TRANSLATOR_CP1025);
registerTranslator("CP1026", XIEbcdicNTranslator.TRANSLATOR_CP1026);
registerTranslator("CP1112", XIEbcdicNTranslator.TRANSLATOR_CP1112);
registerTranslator("CP1122", XIEbcdicNTranslator.TRANSLATOR_CP1122);
registerTranslator("CP1123", XIEbcdicNTranslator.TRANSLATOR_CP1123);
registerTranslator("CP1125", XIEbcdicNTranslator.TRANSLATOR_CP1125);
registerTranslator("CP1130", XIEbcdicNTranslator.TRANSLATOR_CP1130);
registerTranslator("CP1132", XIEbcdicNTranslator.TRANSLATOR_CP1132);
registerTranslator("CP1137", XIEbcdicNTranslator.TRANSLATOR_CP1137);
registerTranslator("CP1142", XIEbcdicNTranslator.TRANSLATOR_CP1142);
registerTranslator("CP1145", XIEbcdicNTranslator.TRANSLATOR_CP1145);
registerTranslator("CP1146", XIEbcdicNTranslator.TRANSLATOR_CP1146);
registerTranslator("CP1148", XIEbcdicNTranslator.TRANSLATOR_CP1148);
registerTranslator("CP1149", XIEbcdicNTranslator.TRANSLATOR_CP1149);
registerTranslator("CP1154", XIEbcdicNTranslator.TRANSLATOR_CP1154);
registerTranslator("CP1155", XIEbcdicNTranslator.TRANSLATOR_CP1155);
registerTranslator("CP1156", XIEbcdicNTranslator.TRANSLATOR_CP1156);
registerTranslator("CP1157", XIEbcdicNTranslator.TRANSLATOR_CP1157);
registerTranslator("CP1158", XIEbcdicNTranslator.TRANSLATOR_CP1158);
registerTranslator("CP1164", XIEbcdicNTranslator.TRANSLATOR_CP1164);
registerTranslator("CP420", XIEbcdicNTranslator.TRANSLATOR_CP420);
registerTranslator("CP871", XIEbcdicNTranslator.TRANSLATOR_CP871);
registerTranslator("CP875", XIEbcdicNTranslator.TRANSLATOR_CP875);
}
/**
*/
protected XIEbcdicTranslator() {
}
/**
*/
public static synchronized void registerTranslator(String id,
XIEbcdicTranslator tr) {
if (id == null)
throw new NullPointerException("id is null");
if (tr == null)
throw new NullPointerException("tr is null");
if (cvRegistry.containsKey(id.toLowerCase()))
throw new IllegalArgumentException("Translator " + id.toLowerCase() + " already registered");
cvRegistry.put(id.toLowerCase(), tr);
}
/**
* @return a read-only map of registered translators
*/
public static Map<String,XIEbcdicTranslator> getRegisteredTranslators() {
return cvRORegistry;
}
/**
* Returns the XIEbcdicTranslator.
*/
public static XIEbcdicTranslator getTranslator(String id) {
return cvRegistry.get(id.toLowerCase());
}
/**
* Converts byte to int without sign.
*/
public static final int toInt(byte bb) {
return ((int)bb & 0xff);
}
/**
* Converts byte to hex rapresentation
*/
public static final String toHex(byte bb) {
String hex = Integer.toString(toInt(bb), 16);
return "00".substring(hex.length()) + hex;
}
/**
* From ebcdic code to char
*/
public abstract char toChar(byte aEbcdicChar);
/**
* From char to ebcdic code
*/
public abstract byte toEBCDIC(char aChar);
/**
* From String to ebcdic string
*/
public byte[] toText(String aString, int aLen) {
byte[] bb = new byte[aLen];
int i;
int len = Math.min(aLen, aString.length());
for (i = 0; i < len; i++)
bb[i] = toEBCDIC(aString.charAt(i));
// fill with space
for (i = len; i < aLen; i++)
bb[i] = toEBCDIC(' ');
return bb;
}
/**
* From int to ebcdic numeric not packed
*/
public byte[] toNumeric(int aNum, int aLen) {
byte[] bb = new byte[aLen];
int i;
for (i = aLen - 1; i >= 0; i--) {
bb[i] = toEBCDIC((char)(((int)'0') + (aNum % 10)));
aNum /= 10;
}
return bb;
}
/**
* From int to packed
*/
public byte[] toPacked(int aNum, int aLen) {
byte[] res = new byte[(aLen + 1) / 2];
int x;
for (int i = res.length - 1; i >= 0; i--) {
if (i == res.length - 1 && aNum < 0) {
res[i] = (byte)0x0D;
}
else {
x = aNum % 10;
aNum /= 10;
res[i] = (byte)x;
}
x = aNum % 10;
aNum /= 10;
res[i] |= (byte)(x << 4);
}
return res;
}
/**
* From ebcdic string to String
*/
public String toString(byte[] aBuf, int aOfs, int aLen) {
String str = "";
int i;
for (i = aOfs; i < (aOfs + aLen); i++)
str += toChar(aBuf[i]);
// strip trailing blanks
for (i = str.length() - 1; (i >= 0) && (str.charAt(i) == ' '); i--)
;
return str.substring(0, Math.max(0, Math.min(str.length(), i + 1)));
}
/**
* From ebcdic numeric not packed to int
*/
public int toInt(byte[] aBuf, int aOfs, int aLen) {
String str = toString(aBuf, aOfs, aLen);
return Integer.parseInt(str);
}
/**
* From ebcdic packed to int
*/
public int toIntFromPacked(byte[] aBuf, int aOfs, int aLen) {
int res = 0;
for (int i = aOfs; i < (aOfs + aLen); i++) {
res = (res * 100) + ((aBuf[i] >> 4 & 0x0F) * 10);
if ((aBuf[i] & 0x0F) == 0x0D)
res /= -10;
else if ((aBuf[i] & 0x0F) == 0x0F)
res /= 10;
else
res += (aBuf[i] & 0x0F);
}
return res;
}
}

View file

@ -0,0 +1,124 @@
/*
Copyright 2007 Infordata S.p.A.
Licensed under the Apache License, Version 2.0 (the "License");
you may not use this file except in compliance with the License.
You may obtain a copy of the License at
http://www.apache.org/licenses/LICENSE-2.0
Unless required by applicable law or agreed to in writing, software
distributed under the License is distributed on an "AS IS" BASIS,
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
See the License for the specific language governing permissions and
limitations under the License.
*/
/*
***
!!V 15/06/99 rel. 1.13 - creation.
*/
package net.infordata.em.crt5250;
import java.awt.Image;
import java.util.HashMap;
import java.util.ListResourceBundle;
import java.util.Map;
import javax.swing.Icon;
import javax.swing.ImageIcon;
import net.infordata.em.util.XIUtil;
/**
* The image bundle.
*
* @version
* @author Valentino Proietti - Infordata S.p.A.
*/
public class XIImagesBdl extends ListResourceBundle {
private static XIImagesBdl cvImagesBdl;
private static Object[][] cvContents = null;
static {
try {
cvContents = new Object[][] {
{"ShiftDown",
XIUtil.createImage(
XIImagesBdl.class, "resources/ShiftDown.gif")},
{"CapsLock",
XIUtil.createImage(
XIImagesBdl.class, "resources/CapsLock.gif")},
//
{"3dFx",
XIUtil.createImage(
XIImagesBdl.class, "resources/3dFx.gif")},
{"Copy",
XIUtil.createImage(
XIImagesBdl.class, "resources/Copy.gif")},
{"Paste",
XIUtil.createImage(
XIImagesBdl.class, "resources/Paste.gif")},
{"RefCursor",
XIUtil.createImage(
XIImagesBdl.class, "resources/RefCursor.gif")},
{"Print",
XIUtil.createImage(
XIImagesBdl.class, "resources/Print.gif")},
//
{"Logo",
XIUtil.createImage(
XIImagesBdl.class, "resources/Logo.gif")},
};
}
catch (RuntimeException ex) {
throw ex;
}
}
private XIImagesBdl() {
}
public static XIImagesBdl getImagesBdl() {
if (cvImagesBdl == null) {
cvImagesBdl = new XIImagesBdl();
}
return cvImagesBdl;
}
@Override
public Object[][] getContents() {
return cvContents;
}
/**
*/
public final Image getImage(String anImageName) {
return ((ImageIcon)getIcon(anImageName)).getImage();
}
private Map<String, Icon> ivIcons = new HashMap<String, Icon>();
/**
*/
public synchronized final Icon getIcon(String anImageName) {
Icon icon = (Icon)ivIcons.get(anImageName);
if (icon == null) {
icon = new ImageIcon((Image)getObject(anImageName));
ivIcons.put(anImageName, icon);
}
return icon;
}
}

Binary file not shown.

After

Width:  |  Height:  |  Size: 1 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 903 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 153 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.9 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 173 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 155 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 941 B

View file

@ -0,0 +1,13 @@
# crt5250
TXT_Copy = Copy
TXT_Options = &Options
TXT_RefCursor = Ref. cursor
TXT_Exit = Exit
TXT_Paste = Paste
TXT_Edit = &Edit
TXT_3dFx = 3dFx
TXT_Print = Print

View file

@ -0,0 +1,12 @@
# crt5250
TXT_Copy = Copia
TXT_Options = &Opzioni
TXT_RefCursor = Cursore di riferimento
TXT_Exit = Chiudi
TXT_Paste = Incolla
TXT_Edit = &Modifica
TXT_3dFx = 3dFx
TXT_Print = Stampa pannello

Binary file not shown.

After

Width:  |  Height:  |  Size: 220 B

View file

@ -0,0 +1,126 @@
package net.infordata.em.tn5250;
import java.awt.event.WindowAdapter;
import java.awt.event.WindowEvent;
import java.lang.reflect.InvocationTargetException;
import javax.swing.SwingUtilities;
import javax.swing.UIManager;
import net.infordata.em.crt5250.XI5250Field;
import net.infordata.em.crt5250.XIEbcdicTranslator;
public class Test {
private Test() { }
private static void usageError(String msg) {
System.err.println(msg);
System.err.println("Usage: [-3dFX] [-altFKeyRemap] [-cp codepage] host-name");
System.err.println("Supported code pages:");
for (String cp : XIEbcdicTranslator.getRegisteredTranslators().keySet()) {
System.err.println(" " + cp +
(XI5250Emulator.DEFAULT_CODE_PAGE.equalsIgnoreCase(cp)? " default" : ""));
}
System.exit(1);
}
/**
* Used only for test purposes.
*/
public static void main(String[] args) {
/*!!1.12
if (System.getProperty("java.version").compareTo("1.1.1") < 0 ||
System.getProperty("java.version").compareTo("1.1_Final") == 0) {
System.err.println("!!! Use JDK 1.1.1 or newer !!!");
}
*/
// checkJDK();
boolean pUse3dFX = false;
boolean pAltFKeyRemap = false;
String arg;
String pHost = null;
boolean expectCP = false;
String cp = null;
for (int i = 0; i < args.length; i++) {
arg = args[i];
if (arg.startsWith("-")) {
if ("-3dfx".equalsIgnoreCase(arg))
pUse3dFX = true;
else if ("-altFKeyRemap".equalsIgnoreCase(arg))
pAltFKeyRemap = true;
else if ("-cp".equalsIgnoreCase(arg))
expectCP = true;
else
usageError("Wrong option: " + arg);
}
else if (expectCP) {
expectCP = false;
if (XIEbcdicTranslator.getTranslator(arg) == null)
usageError("Unknown codepage: " + arg);
cp = arg;
}
else {
if (pHost == null)
pHost = arg;
else
usageError("Too many host names.");
}
}
if (expectCP)
usageError("A code page is expected");
final boolean altFKeyRemap = pAltFKeyRemap;
final boolean use3dFX = pUse3dFX;
final String host = pHost;
final String codePage = cp;
try {
SwingUtilities.invokeAndWait(new Runnable() {
public void run() {
XI5250Emulator em = new XI5250Emulator();
em.setTerminalType("IBM-3477-FC");
em.setKeyboardQueue(true);
em.setAltFKeyRemap(altFKeyRemap);
em.setCodePage(codePage);
if (host != null) {
em.setHost(host);
em.setActive(true);
}
XI5250Frame frm = new XI5250Frame("xtn5250mg" + " " +
XI5250Emulator.VERSION, em);
frm.addWindowListener(new WindowAdapter() {
@Override
public void windowClosed(WindowEvent e) {
System.exit(0);
}
});
//3D FX
if (use3dFX) {
em.setDefFieldsBorderStyle(XI5250Field.LOWERED_BORDER);
em.setDefBackground(UIManager.getColor("control"));
}
//frm.setBounds(0, 0, 570, 510);
frm.centerOnScreen(70);
frm.setVisible(true);
}
});
}
catch (InterruptedException ex) {
ex.printStackTrace();
}
catch (InvocationTargetException ex) {
ex.printStackTrace();
}
}
}

View file

@ -0,0 +1,544 @@
/*
Copyright 2007 Infordata S.p.A.
Licensed under the Apache License, Version 2.0 (the "License");
you may not use this file except in compliance with the License.
You may obtain a copy of the License at
http://www.apache.org/licenses/LICENSE-2.0
Unless required by applicable law or agreed to in writing, software
distributed under the License is distributed on an "AS IS" BASIS,
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
See the License for the specific language governing permissions and
limitations under the License.
*/
/*
***
!!V 09/07/98 rel. 1.10 - creation.
05/02/99 rel. 1.11 - Swing 1.1 bug work-around.
08/06/99 rel. 1.11a- The emulator is centered.
*/
package net.infordata.em.tn5250;
import java.awt.BorderLayout;
import java.awt.Color;
import java.awt.Dimension;
import java.awt.Graphics;
import java.awt.Rectangle;
import java.awt.event.WindowEvent;
import java.beans.PropertyChangeEvent;
import java.beans.PropertyChangeListener;
import java.util.ResourceBundle;
import javax.swing.AbstractButton;
import javax.swing.JApplet;
import javax.swing.JButton;
import javax.swing.JCheckBoxMenuItem;
import javax.swing.JMenu;
import javax.swing.JMenuBar;
import javax.swing.JMenuItem;
import javax.swing.JPanel;
import javax.swing.JToggleButton;
import javax.swing.JToolBar;
import javax.swing.SwingUtilities;
import javax.swing.UIManager;
import net.infordata.em.crt5250.XI5250Crt;
import net.infordata.em.crt5250.XI5250Field;
import net.infordata.em.util.XICommand;
import net.infordata.em.util.XICommandMgr;
import net.infordata.em.util.XIUtil;
/**
*/
public class XI5250Applet extends JApplet {
private static final long serialVersionUID = 1L;
private static final int DEBUG = 0;
// if true the emulation frame survives to the applet dead,
// !!VERIFY: a stopped applet causes event dispatching problems
private static final boolean UNDEAD_FRAME = false;
// images
private static XIImagesBdl cvImagesBdl = XIImagesBdl.getImagesBdl();
private static ResourceBundle cvRes =
ResourceBundle.getBundle("net.infordata.em.tn5250.resources.Res");
private XI5250EmulatorCtrl ivEmulatorCtrl;
private EmulatorFrame ivFrame;
private boolean ivFirstTime = true;
private boolean ivDestroyed = false;
private PropertyChangeListener ivPropertyChangeListener =
new PropertyChangeListener() {
public void propertyChange(PropertyChangeEvent evt) {
emulatorPropertyChanged(evt);
}
};
public static final String INFRAME_CMD = "INFRAME_CMD";
protected XI5250Emulator createEmulator() {
return new XI5250Emulator();
}
/**
*/
@Override
public void init() {
if (DEBUG >= 1)
System.out.println("init()");
/*!!1.12
if (System.getProperty("java.version").compareTo("1.1.1") < 0 ||
System.getProperty("java.version").compareTo("1.1_Final") == 0) {
System.err.println("!!! Use JDK 1.1.1 or newer !!!");
}
*/
// XI5250Emulator.checkJDK();
String host = null;
host = getParameter("host");
/*
if (host == null) {
System.err.println("Host name or ip address is required.");
System.exit(-1);
}
*/
boolean inplace = true;
{
String ss = getParameter("inplace");
if (ss != null && "false".equals(ss.toLowerCase()))
inplace = false;
}
final boolean p3dFX = "true".equalsIgnoreCase(getParameter("3dFX"));
final boolean altFKeyRemap = "true".equalsIgnoreCase(getParameter("altFKeyRemap"));
final String codePage = getParameter("codePage");
final boolean requestFocus = !"false".equalsIgnoreCase(getParameter("requestFocus"));
final boolean pSTRPCCMD = "true".equalsIgnoreCase(getParameter("STRPCCMD"));
final String deviceName = getParameter("devName");
ivEmulatorCtrl = new XI5250EmulatorCtrl(createEmulator());
getEmulator().setTerminalType("IBM-3477-FC");
getEmulator().setHost(host);
//3D FX
if (p3dFX) {
getEmulator().setDefFieldsBorderStyle(XI5250Field.LOWERED_BORDER);
getEmulator().setDefBackground(UIManager.getColor("control"));
}
getEmulator().setAltFKeyRemap(altFKeyRemap);
getEmulator().setCodePage(codePage);
getEmulator().setStrPcCmdEnabled(pSTRPCCMD);
if (deviceName != null)
getEmulator().setTelnetEnv("\u0003DEVNAME\u0001" + deviceName);
//!! 1.11a execution moved to the EventQueueThread
if (inplace)
SwingUtilities.invokeLater(new Runnable() {
public void run() {
emulatorInPlace();
if (requestFocus)
getEmulator().requestFocusInWindow();
}
});
else
SwingUtilities.invokeLater(new Runnable() {
public void run() {
emulatorInFrame();
if (requestFocus)
getEmulator().requestFocusInWindow();
}
});
// InFrame command
getCommandMgr().enableCommand(
INFRAME_CMD, ivFrame == null);
getCommandMgr().setCommand(INFRAME_CMD, new XICommand() {
public void execute() {
processInFrameCmd();
}
});
}
/**
*/
@Override
public void start() {
if (DEBUG >= 1)
System.out.println("start()");
if (getEmulator().getHost() != null) {
SwingUtilities.invokeLater(new Runnable() {
public void run() {
getEmulator().setActive(true);
}
});
}
}
/**
*/
@Override
public void stop() {
if (DEBUG >= 1)
System.out.println("stop()");
}
/**
*/
@Override
public void destroy() {
if (DEBUG >= 1)
System.out.println("destroy()");
ivDestroyed = true;
if (!UNDEAD_FRAME || ivFrame == null) {
emulatorInPlace();
getEmulator().setActive(false);
}
}
/**
*/
public final XI5250Emulator getEmulator() {
return ivEmulatorCtrl.getEmulator();
}
/**
*/
public final XICommandMgr getCommandMgr() {
return ivEmulatorCtrl.getCommandMgr();
}
/**
*/
protected void processInFrameCmd() {
emulatorInFrame();
}
/**
*/
protected void emulatorInPlace() {
if (!ivFirstTime && ivFrame == null)
return;
ivFirstTime = false;
if (DEBUG >= 1)
System.out.println("inplace");
if (ivFrame != null) {
ivFrame.setJMenuBar(null); // work around for a Swing 1.1 bug
ivFrame.dispose();
ivFrame = null;
}
getCommandMgr().enableCommand(INFRAME_CMD, true);
JToolBar toolBar = createToolBar();
JMenuBar menuBar = createMenuBar();
setJMenuBar(menuBar);
getContentPane().setLayout(new BorderLayout());
getContentPane().add(toolBar, BorderLayout.NORTH);
JPanel panel = new XI5250Emulator.SupportPanel(getEmulator());
panel.setBackground(getEmulator().getBackground());
getContentPane().add(panel, BorderLayout.CENTER);
getEmulator().addPropertyChangeListener(ivPropertyChangeListener);
}
/**
*/
protected void emulatorInFrame() {
if (ivFrame != null)
return;
if (DEBUG >= 1)
System.out.println("inframe");
getCommandMgr().enableCommand(INFRAME_CMD, false);
getEmulator().removePropertyChangeListener(ivPropertyChangeListener);
setJMenuBar(null);
getContentPane().removeAll();
validate();
repaint();
ivFrame = new EmulatorFrame("xtn5250mg" + " " +
XI5250Emulator.VERSION,
getEmulator());
ivFrame.setBounds(0, 0, 648, 506);
ivFrame.centerOnScreen();
ivFrame.setVisible(true);
}
/**
*/
private void frameClosed() {
if (DEBUG >= 1)
System.out.println("frameClosed()");
if (UNDEAD_FRAME && ivDestroyed)
getEmulator().setActive(false);
else {
emulatorInPlace();
invalidate();
validate();
getEmulator().requestFocusInWindow();
}
}
/**
*/
private void emulatorPropertyChanged(PropertyChangeEvent evt) {
String propertyName = evt.getPropertyName();
if ("background".equals(propertyName))
getEmulator().getParent().setBackground(getEmulator().getBackground());
else if ("font".equals(propertyName) ||
XI5250Crt.CRT_SIZE.equals(propertyName))
getEmulator().revalidate();
}
/**
*/
private JMenuBar createMenuBar() {
String str;
str = cvRes.getString("TXT_Communications");
JMenu commMenu = new JMenu(XIUtil.removeMnemonics(str));
commMenu.setMnemonic(XIUtil.getMnemonic(str));
{
JMenuItem connItem =
new JMenuItem(cvRes.getString("TXT_Connect"));
JMenuItem disconnItem =
new JMenuItem(cvRes.getString("TXT_Disconnect"));
JMenuItem aboutItem =
new JMenuItem(cvRes.getString("TXT_About"));
commMenu.add(connItem);
commMenu.add(disconnItem);
commMenu.addSeparator();
commMenu.add(aboutItem);
getCommandMgr().handleCommand(connItem,
XI5250EmulatorCtrl.CONNECT_CMD);
getCommandMgr().handleCommand(disconnItem,
XI5250EmulatorCtrl.DISCONNECT_CMD);
getCommandMgr().handleCommand(aboutItem,
XI5250EmulatorCtrl.ABOUT_CMD);
}
str = cvRes.getString("TXT_Edit");
JMenu editMenu = new JMenu(XIUtil.removeMnemonics(str));
editMenu.setMnemonic(XIUtil.getMnemonic(str));
{
JMenuItem copyItem =
new JMenuItem(cvRes.getString("TXT_Copy"));
JMenuItem pasteItem =
new JMenuItem(cvRes.getString("TXT_Paste"));
JMenuItem snapShotItem =
new JMenuItem(cvRes.getString("TXT_SnapShot"));
JMenuItem printItem =
new JMenuItem(cvRes.getString("TXT_Print"));
editMenu.add(copyItem);
editMenu.add(pasteItem);
editMenu.addSeparator();
editMenu.add(snapShotItem);
editMenu.addSeparator();
editMenu.add(printItem);
getCommandMgr().handleCommand(copyItem,
XI5250EmulatorCtrl.COPY_CMD);
getCommandMgr().handleCommand(pasteItem,
XI5250EmulatorCtrl.PASTE_CMD);
getCommandMgr().handleCommand(snapShotItem,
XI5250EmulatorCtrl.SNAPSHOT_CMD);
getCommandMgr().handleCommand(printItem,
XI5250EmulatorCtrl.PRINT_CMD);
}
str = cvRes.getString("TXT_Options");
JMenu optionsMenu = new JMenu(XIUtil.removeMnemonics(str));
optionsMenu.setMnemonic(XIUtil.getMnemonic(str));
{
JMenuItem inFrameItem =
new JMenuItem(cvRes.getString("TXT_InFrame"));
JCheckBoxMenuItem switch3DfxItem =
new JCheckBoxMenuItem(cvRes.getString("TXT_3dFx"));
JCheckBoxMenuItem referenceCursorItem =
new JCheckBoxMenuItem(cvRes.getString("TXT_RefCursor"));
optionsMenu.add(inFrameItem);
optionsMenu.addSeparator();
optionsMenu.add(switch3DfxItem);
optionsMenu.add(referenceCursorItem);
getCommandMgr().handleCommand(inFrameItem,
INFRAME_CMD);
getCommandMgr().handleCommand(switch3DfxItem,
XI5250EmulatorCtrl.SWITCH_3DFX_CMD);
getCommandMgr().handleCommand(referenceCursorItem,
XI5250EmulatorCtrl.REFERENCE_CURSOR_CMD);
}
JMenuBar menuBar = new JMenuBar();
menuBar.add(commMenu);
menuBar.add(editMenu);
menuBar.add(optionsMenu);
return menuBar;
}
/**
* Inserisce nella tool-bar i bottoni di default.
*/
private JToolBar createToolBar() {
// bottoni della tool-bar
AbstractButton[] buttons = new AbstractButton[] {
new JButton(cvImagesBdl.getIcon("Connect")),
new JButton(cvImagesBdl.getIcon("Disconnect")),
null,
new JButton(cvImagesBdl.getIcon("Copy")),
new JButton(cvImagesBdl.getIcon("Paste")),
null,
new JButton(cvImagesBdl.getIcon("SnapShot")),
new JButton(cvImagesBdl.getIcon("Print")),
null,
new JButton(cvImagesBdl.getIcon("InFrame")),
null,
new JToggleButton(cvImagesBdl.getIcon("3dFx")),
new JToggleButton(cvImagesBdl.getIcon("RefCursor")),
};
// action commands associati con i bottoni della tool-bar.
String[] buttonsActCmd = new String[] {
XI5250EmulatorCtrl.CONNECT_CMD,
XI5250EmulatorCtrl.DISCONNECT_CMD,
null,
XI5250EmulatorCtrl.COPY_CMD,
XI5250EmulatorCtrl.PASTE_CMD,
null,
XI5250EmulatorCtrl.SNAPSHOT_CMD,
XI5250EmulatorCtrl.PRINT_CMD,
null,
INFRAME_CMD,
null,
XI5250EmulatorCtrl.SWITCH_3DFX_CMD,
XI5250EmulatorCtrl.REFERENCE_CURSOR_CMD,
};
// Hint associati ad i vari bottoni.
String[] buttonHints = new String[] {
cvRes.getString("TXT_Connect"),
cvRes.getString("TXT_Disconnect"),
null,
cvRes.getString("TXT_Copy"),
cvRes.getString("TXT_Paste"),
null,
cvRes.getString("TXT_SnapShot"),
cvRes.getString("TXT_Print"),
null,
cvRes.getString("TXT_InFrame"),
null,
cvRes.getString("TXT_3dFx"),
cvRes.getString("TXT_RefCursor"),
};
JToolBar toolBar = new JToolBar();
toolBar.setFloatable(false);
Dimension size = new Dimension(26, 26);
for (int i = 0; i < buttons.length; i++) {
if (buttons[i] != null) {
AbstractButton button = (AbstractButton)buttons[i];
toolBar.add(button);
button.setToolTipText(buttonHints[i]);
button.setMinimumSize(size);
button.setPreferredSize(size);
button.setMaximumSize(size);
button.setRequestFocusEnabled(false);
getCommandMgr().handleCommand(button, buttonsActCmd[i]);
}
else
toolBar.addSeparator();
}
return toolBar;
}
/**
*/
@Override
public void paint(Graphics g) {
super.paint(g);
if (ivFrame != null) {
Rectangle rt = getBounds();
g.setColor(Color.darkGray);
int hh = rt.height;
for (int x = -hh; x < rt.width; x += 16)
g.drawLine(x, hh, x + hh, 0);
}
}
///////////////////////////////////////////////////////////////////////////////
/**
*/
private class EmulatorFrame extends XI5250Frame {
private static final long serialVersionUID = 1L;
public EmulatorFrame(String aTitle, XI5250Emulator aCrt) {
super(aTitle, aCrt);
}
@Override
protected void processExitCmd() {
if (UNDEAD_FRAME && ivDestroyed)
super.processExitCmd();
else
dispose();
}
@Override
protected void processWindowEvent(WindowEvent e) {
switch(e.getID()) {
case WindowEvent.WINDOW_CLOSED:
XI5250Applet.this.frameClosed();
return;
}
super.processWindowEvent(e);
}
}
}

View file

@ -0,0 +1,60 @@
/*
Copyright 2007 Infordata S.p.A.
Licensed under the Apache License, Version 2.0 (the "License");
you may not use this file except in compliance with the License.
You may obtain a copy of the License at
http://www.apache.org/licenses/LICENSE-2.0
Unless required by applicable law or agreed to in writing, software
distributed under the License is distributed on an "AS IS" BASIS,
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
See the License for the specific language governing permissions and
limitations under the License.
*/
/*
***
30/06/98 rel. _.___- Swing, JBuilder2 e VSS.
*/
package net.infordata.em.tn5250;
import java.io.IOException;
import java.io.InputStream;
///////////////////////////////////////////////////////////////////////////////
/**
* Abstract class for all 5250 commands
*
* @version
* @author Valentino Proietti - Infordata S.p.A.
*/
public abstract class XI5250Cmd {
protected XI5250Emulator ivEmulator;
protected void init(XI5250Emulator aEmulator) {
ivEmulator = aEmulator;
}
/**
* @exception XI5250Exception raised if command parameters are wrong.
*/
protected abstract void readFrom5250Stream(InputStream inStream)
throws IOException, XI5250Exception;
protected abstract void execute();
protected void executePending(int anAidCode, boolean isMasked) {
throw new RuntimeException("executePending() not supported");
}
}

View file

@ -0,0 +1,181 @@
/*
Copyright 2007 Infordata S.p.A.
Licensed under the Apache License, Version 2.0 (the "License");
you may not use this file except in compliance with the License.
You may obtain a copy of the License at
http://www.apache.org/licenses/LICENSE-2.0
Unless required by applicable law or agreed to in writing, software
distributed under the License is distributed on an "AS IS" BASIS,
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
See the License for the specific language governing permissions and
limitations under the License.
*/
/*
***
30/06/98 rel. _.___- Swing, JBuilder2 e VSS.
*/
package net.infordata.em.tn5250;
import java.io.IOException;
import java.io.InputStream;
import java.util.ArrayList;
import java.util.List;
import java.util.logging.Level;
import java.util.logging.Logger;
import net.infordata.em.tnprot.XITelnet;
///////////////////////////////////////////////////////////////////////////////
/**
* 5250 Commands list (Works like a macro command).
*
* @version
* @author Valentino Proietti - Infordata S.p.A.
*/
public class XI5250CmdList extends XI5250Cmd {
private static final Logger LOGGER = Logger.getLogger(XI5250CmdList.class.getName());
private static Class<?>[] cv5250CmdClasses = new Class[256];;
protected List<XI5250Cmd> ivCmdVect;
// flags used across command execution
protected boolean ivICOrderExecuted;
static {
cv5250CmdClasses[XITelnet.toInt(XI5250Emulator.CMD_READ_IMMEDIATE)] =
XIReadImmediateCmd.class;
cv5250CmdClasses[XITelnet.toInt(XI5250Emulator.CMD_READ_FIELDS)] =
XIReadFieldsCmd.class;
cv5250CmdClasses[XITelnet.toInt(XI5250Emulator.CMD_READ_MDT_FIELDS)] =
XIReadMdtFieldsCmd.class;
cv5250CmdClasses[XITelnet.toInt(XI5250Emulator.CMD_READ_SCREEN)] =
XIReadScreenCmd.class;
cv5250CmdClasses[XITelnet.toInt(XI5250Emulator.CMD_SAVE_SCREEN)] =
XISaveScreenCmd.class;
cv5250CmdClasses[XITelnet.toInt(XI5250Emulator.CMD_CLEAR_FMT_TABLE)] =
XIClearFmtTableCmd.class;
cv5250CmdClasses[XITelnet.toInt(XI5250Emulator.CMD_CLEAR_UNIT)] =
XIClearUnitCmd.class;
cv5250CmdClasses[XITelnet.toInt(XI5250Emulator.CMD_CLEAR_UNIT_ALT)] =
XIClearUnitAltCmd.class;
cv5250CmdClasses[XITelnet.toInt(XI5250Emulator.CMD_RESTORE_SCREEN)] =
XIRestoreScreenCmd.class;
cv5250CmdClasses[XITelnet.toInt(XI5250Emulator.CMD_ROLL)] =
XIRollCmd.class;
cv5250CmdClasses[XITelnet.toInt(XI5250Emulator.CMD_WRITE_ERROR_CODE)] =
XIWriteErrorCodeCmd.class;
cv5250CmdClasses[XITelnet.toInt(XI5250Emulator.CMD_WRITE_TO_DISPLAY)] =
XIWriteToDisplayCmd.class;
cv5250CmdClasses[XITelnet.toInt(XI5250Emulator.CMD_QUERY_DEVICE)] =
XIQueryCmd.class;
}
/**
*/
protected XI5250CmdList(XI5250Emulator aEmulator) {
init(aEmulator);
}
/**
* @exception XI5250Exception raised if command parameters are wrong.
*/
@Override
protected void readFrom5250Stream(InputStream inStream)
throws IOException, XI5250Exception {
int bb;
XI5250Cmd cmd;
ivCmdVect = new ArrayList<XI5250Cmd>(100);
if (LOGGER.isLoggable(Level.FINER))
LOGGER.finer("START OF COMMANDS LIST");
// jump until ESC is found
while ((bb = inStream.read()) != -1 && (byte)bb != XI5250Emulator.ESC)
;
// start from 1 because ESC is already read
for (int i = 1; (bb = inStream.read()) != -1; i++) {
switch (i % 2) {
case 0:
if ((byte)bb != XI5250Emulator.ESC)
throw new XI5250Exception("Malformed 5250 packet", XI5250Emulator.ERR_INVALID_COMMAND);
break;
case 1:
try {
cmd = createCmdInstance(XITelnet.toInt((byte)bb));
}
catch (Exception ex) {
throw new RuntimeException(ex);
}
if (cmd != null) {
cmd.init(ivEmulator);
cmd.readFrom5250Stream(inStream);
if (LOGGER.isLoggable(Level.FINER))
LOGGER.finer("" + cmd);
ivCmdVect.add(cmd);
}
else {
throw new XI5250Exception("Command not supported : 0x" +
XITelnet.toHex((byte)bb),
XI5250Emulator.ERR_INVALID_COMMAND);
}
break;
}
}
}
/**
*/
@Override
protected void execute() {
for (int i = 0; i < ivCmdVect.size(); i++)
ivCmdVect.get(i).execute();
}
/**
* Creates the 5250 command related to the given 5250 command id.
* @exception IllegalAccessException .
* @exception InstantiationException .
*/
protected XI5250Cmd createCmdInstance(int aCmd)
throws IllegalAccessException, InstantiationException {
Class<?> cls;
cls = cv5250CmdClasses[aCmd];
if (cls != null)
return (XI5250Cmd)cls.newInstance();
else
return null;
}
/**
*/
@Override
public String toString() {
String ss = super.toString() + ivCmdVect.toString();
return ss;
}
}

File diff suppressed because it is too large Load diff

View file

@ -0,0 +1,74 @@
/*
Copyright 2007 Infordata S.p.A.
Licensed under the Apache License, Version 2.0 (the "License");
you may not use this file except in compliance with the License.
You may obtain a copy of the License at
http://www.apache.org/licenses/LICENSE-2.0
Unless required by applicable law or agreed to in writing, software
distributed under the License is distributed on an "AS IS" BASIS,
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
See the License for the specific language governing permissions and
limitations under the License.
*/
/*
***
30/06/98 rel. _.___- Swing, JBuilder2 e VSS.
*/
package net.infordata.em.tn5250;
/**
* XI5250EmulatorListener adapter.
*
* @version
* @author Valentino Proietti - Infordata S.p.A.
*/
public class XI5250EmulatorAdapter implements XI5250EmulatorListener {
/**
*/
public void connecting(XI5250EmulatorEvent e) {
}
/**
*/
public void connected(XI5250EmulatorEvent e) {
}
/**
*/
public void disconnected(XI5250EmulatorEvent e) {
}
/**
*/
public void stateChanged(XI5250EmulatorEvent e) {
}
/**
*/
public void newPanelReceived(XI5250EmulatorEvent e) {
}
/**
*/
public void fieldsRemoved(XI5250EmulatorEvent e) {
}
/**
*/
public void dataSended(XI5250EmulatorEvent e) {
}
}

View file

@ -0,0 +1,102 @@
/*
Copyright 2007 Infordata S.p.A.
Licensed under the Apache License, Version 2.0 (the "License");
you may not use this file except in compliance with the License.
You may obtain a copy of the License at
http://www.apache.org/licenses/LICENSE-2.0
Unless required by applicable law or agreed to in writing, software
distributed under the License is distributed on an "AS IS" BASIS,
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
See the License for the specific language governing permissions and
limitations under the License.
*/
package net.infordata.em.tn5250;
import java.beans.BeanInfo;
import java.beans.IntrospectionException;
import java.beans.Introspector;
import java.beans.PropertyDescriptor;
import java.beans.SimpleBeanInfo;
public class XI5250EmulatorBeanInfo extends SimpleBeanInfo {
Class<XI5250Emulator> beanClass = XI5250Emulator.class;
String iconColor16x16Filename = "resources/XI5250Emulator_16.gif";
String iconColor32x32Filename = "resources/XI5250Emulator_32.gif";
String iconMono16x16Filename;
String iconMono32x32Filename;
public XI5250EmulatorBeanInfo() {
}
@Override
public PropertyDescriptor[] getPropertyDescriptors() {
try {
PropertyDescriptor _active =
new PropertyDescriptor("active", beanClass, "isActive", "setActive");
PropertyDescriptor _host =
new PropertyDescriptor("host", beanClass, "getHost", "setHost");
PropertyDescriptor _keyboardQueue =
new PropertyDescriptor("keyboardQueue", beanClass,
"isKeyboardQueue", "setKeyboardQueue");
PropertyDescriptor _terminalType =
new PropertyDescriptor("terminalType", beanClass,
"getTerminalType", "setTerminalType");
PropertyDescriptor _altFKeyRemap =
new PropertyDescriptor("altFKeyRemap", beanClass,
"getAltFKeyRemap", "setAltFKeyRemap");
PropertyDescriptor[] pds = new PropertyDescriptor[] {
_active,
_host,
_keyboardQueue,
_terminalType,
_altFKeyRemap,
};
return pds;
}
catch (IntrospectionException ex) {
ex.printStackTrace();
return null;
}
}
@Override
public java.awt.Image getIcon(int iconKind) {
switch (iconKind) {
case BeanInfo.ICON_COLOR_16x16:
return iconColor16x16Filename != null ? loadImage(iconColor16x16Filename) : null;
case BeanInfo.ICON_COLOR_32x32:
return iconColor32x32Filename != null ? loadImage(iconColor32x32Filename) : null;
case BeanInfo.ICON_MONO_16x16:
return iconMono16x16Filename != null ? loadImage(iconMono16x16Filename) : null;
case BeanInfo.ICON_MONO_32x32:
return iconMono32x32Filename != null ? loadImage(iconMono32x32Filename) : null;
}
return null;
}
@Override
public BeanInfo[] getAdditionalBeanInfo() {
Class<?> superclass = beanClass.getSuperclass();
try {
BeanInfo superBeanInfo = Introspector.getBeanInfo(superclass);
return new BeanInfo[] { superBeanInfo };
}
catch (IntrospectionException ex) {
ex.printStackTrace();
return null;
}
}
}

View file

@ -0,0 +1,204 @@
/*
Copyright 2007 Infordata S.p.A.
Licensed under the Apache License, Version 2.0 (the "License");
you may not use this file except in compliance with the License.
You may obtain a copy of the License at
http://www.apache.org/licenses/LICENSE-2.0
Unless required by applicable law or agreed to in writing, software
distributed under the License is distributed on an "AS IS" BASIS,
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
See the License for the specific language governing permissions and
limitations under the License.
*/
/*
***
!!V 09/07/98 rel. 1.10 - creation.
*/
package net.infordata.em.tn5250;
import java.util.ResourceBundle;
import javax.swing.JOptionPane;
import net.infordata.em.crt5250.XI5250Crt;
import net.infordata.em.crt5250.XI5250CrtCtrl;
import net.infordata.em.crt5250.XI5250CrtFrame;
import net.infordata.em.util.XICommand;
/**
* Handles common commands shared by XI5250Frame and XI5250Applet.
*/
public class XI5250EmulatorCtrl extends XI5250CrtCtrl {
// images
private static XIImagesBdl cvImagesBdl =
net.infordata.em.tn5250.XIImagesBdl.getImagesBdl();
private static ResourceBundle cvRes =
ResourceBundle.getBundle("net.infordata.em.tn5250.resources.Res");
public static final String CONNECT_CMD = "CONNECT_CMD";
public static final String DISCONNECT_CMD = "DISCONNECT_CMD";
public static final String ABOUT_CMD = "ABOUT_CMD";
public static final String SNAPSHOT_CMD = "SNAPSHOT_CMD";
private int ivSnapShotCount = 0;
/**
*/
public XI5250EmulatorCtrl(XI5250Emulator aCrt) {
super(aCrt);
getEmulator().addEmulatorListener(new EmulatorListener());
// Connect command
getCommandMgr().enableCommand(
CONNECT_CMD, !getEmulator().isActive());
getCommandMgr().setCommand(CONNECT_CMD, new XICommand() {
public void execute() {
processConnectCmd();
}
});
// Disconnect command
getCommandMgr().enableCommand(
DISCONNECT_CMD, getEmulator().isActive());
getCommandMgr().setCommand(DISCONNECT_CMD, new XICommand() {
public void execute() {
processDisconnectCmd();
}
});
// About command
getCommandMgr().setCommand(ABOUT_CMD, new XICommand() {
public void execute() {
processAboutCmd();
}
});
// Snapshot command
getCommandMgr().setCommand(SNAPSHOT_CMD, new XICommand() {
public void execute() {
processSnapShotCmd();
}
});
}
/**
*/
public final XI5250Emulator getEmulator() {
return (XI5250Emulator)getCrt();
}
/**
*/
protected void processConnectCmd() {
if (!getEmulator().isActive()) {
Object ret = JOptionPane.showInputDialog(
getEmulator(),
cvRes.getString("TXT_HostNameInput"),
"", JOptionPane.QUESTION_MESSAGE, null,
null, getEmulator().getHost());
if (ret == null)
return;
getEmulator().setHost((String)ret);
}
getEmulator().setActive(true);
}
/**
*/
protected void processDisconnectCmd() {
if (getEmulator().isActive()) {
int ret = JOptionPane.showConfirmDialog(
getEmulator(),
cvRes.getString("TXT_ConfirmDisconnect"),
"", JOptionPane.YES_NO_OPTION);
if (ret == JOptionPane.NO_OPTION)
return;
}
getEmulator().setActive(false);
}
/**
*/
protected void processAboutCmd() {
String forkedFrom = cvRes.getString("TXT_Forked").replaceFirst("%1s", "xtn5250");
forkedFrom = forkedFrom.replaceFirst("%2s", "Infordata S.p.A.");
JOptionPane.showMessageDialog(getEmulator(),
cvRes.getString("TXT_Version").replaceFirst("%1s", XI5250Emulator.VERSION) + "\n" +
"\n" +
"Mahefa Randimbisoa http://xtn5250mg.sf.net\n" +
"\n" +
forkedFrom + "\n" +
"http://xtn5250.sourceforge.net",
cvRes.getString("TXT_About"),
JOptionPane.INFORMATION_MESSAGE,
cvImagesBdl.getIcon("Logo"));
}
/**
*/
protected void processSnapShotCmd() {
XI5250Crt clone = getEmulator().getStaticClone();
String title = cvRes.getString("TXT_SnapShot") + " " + getEmulator().getHost() + " #" +
(++ivSnapShotCount);
XI5250CrtFrame frm = new XI5250CrtFrame(title, clone);
frm.setBounds(0, 0, 728, 512);
frm.centerOnScreen();
frm.setVisible(true);
}
//////////////////////////////////////////////////////////////////////////////
/**
* Usata per sincronizzare i comandi con lo stato dell' emulator.
*/
class EmulatorListener extends XI5250EmulatorAdapter {
protected void enableCmd() {
getCommandMgr().enableCommand(
CONNECT_CMD, !getEmulator().isActive());
getCommandMgr().enableCommand(
DISCONNECT_CMD, getEmulator().isActive());
}
@Override
public void connecting(XI5250EmulatorEvent e) {
enableCmd();
}
@Override
public void connected(XI5250EmulatorEvent e) {
enableCmd();
}
@Override
public void disconnected(XI5250EmulatorEvent e) {
enableCmd();
}
@Override
public void stateChanged(XI5250EmulatorEvent e) {
}
}
}

View file

@ -0,0 +1,124 @@
/*
Copyright 2007 Infordata S.p.A.
Licensed under the Apache License, Version 2.0 (the "License");
you may not use this file except in compliance with the License.
You may obtain a copy of the License at
http://www.apache.org/licenses/LICENSE-2.0
Unless required by applicable law or agreed to in writing, software
distributed under the License is distributed on an "AS IS" BASIS,
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
See the License for the specific language governing permissions and
limitations under the License.
*/
/*
***
30/06/98 rel. _.___- Swing, JBuilder2 e VSS.
*/
package net.infordata.em.tn5250;
import java.util.EventObject;
/**
* XI5250Emulator notification event.
*
* @version
* @author Valentino Proietti - Infordata S.p.A.
*/
public class XI5250EmulatorEvent extends EventObject {
private static final long serialVersionUID = 1L;
/**
* Fired just before trying to connect.
*/
public static final int CONNECTING = 0;
/**
* Connection established.
*/
public static final int CONNECTED = 1;
/**
* Connection closed.
*/
public static final int DISCONNECTED = 2;
/**
* Internal state is changed.
*/
public static final int STATE_CHANGED = 3;
/**
* A new 5250 panel has been received and it is ready for the user.
*/
public static final int NEW_PANEL_RECEIVED = 4;
/**
* Fields removed.
*/
public static final int FIELDS_REMOVED = 5;
/**
* Data have been sended (ie. an aid-code was pressed)
*/
public static final int DATA_SENDED = 6;
protected static final String[] cvIdDescr = {"CONNECTING",
"CONNECTED",
"DISCONNECTED",
"STATE_CHANGED",
"NEW_PANEL_RECEIVED",
"FIELDS_REMOVED",
"DATA_SENDED"};
protected int ivId;
protected byte ivAidCode;
/**
*/
public XI5250EmulatorEvent(int aId, XI5250Emulator aEm) {
super(aEm);
ivId = aId;
}
/**
*/
public XI5250EmulatorEvent(int aId, XI5250Emulator aEm, byte anAidCode) {
this(aId, aEm);
ivAidCode = anAidCode;
}
/**
*/
public int getID() {
return ivId;
}
/**
*/
public XI5250Emulator get5250Emulator() {
return (XI5250Emulator)getSource();
}
/**
* The aid code (DATA_SENDED event)
*/
public byte getAidCode() {
return ivAidCode;
}
/**
*/
@Override
public String toString() {
return super.toString() + "[" + cvIdDescr[ivId] + "]";
}
}

View file

@ -0,0 +1,77 @@
/*
Copyright 2007 Infordata S.p.A.
Licensed under the Apache License, Version 2.0 (the "License");
you may not use this file except in compliance with the License.
You may obtain a copy of the License at
http://www.apache.org/licenses/LICENSE-2.0
Unless required by applicable law or agreed to in writing, software
distributed under the License is distributed on an "AS IS" BASIS,
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
See the License for the specific language governing permissions and
limitations under the License.
*/
/*
***
30/06/98 rel. _.___- Swing, JBuilder2 e VSS.
*/
package net.infordata.em.tn5250;
import java.util.EventListener;
/**
* Listener for XI5250EmulatorEvent.
*
* @version
* @author Valentino Proietti - Infordata S.p.A.
*/
public interface XI5250EmulatorListener extends EventListener {
/**
* @see XI5250EmulatorEvent#CONNECTING
*/
public void connecting(XI5250EmulatorEvent e);
/**
* @see XI5250EmulatorEvent#CONNECTED
*/
public void connected(XI5250EmulatorEvent e);
/**
* @see XI5250EmulatorEvent#DISCONNECTED
*/
public void disconnected(XI5250EmulatorEvent e);
/**
* @see XI5250EmulatorEvent#STATE_CHANGED
*/
public void stateChanged(XI5250EmulatorEvent e);
/**
* @see XI5250EmulatorEvent#NEW_PANEL_RECEIVED
*/
public void newPanelReceived(XI5250EmulatorEvent e);
/**
* @see XI5250EmulatorEvent#FIELDS_REMOVED
*/
public void fieldsRemoved(XI5250EmulatorEvent e);
/**
* @see XI5250EmulatorEvent#DATA_SENDED
*/
public void dataSended(XI5250EmulatorEvent e);
}

View file

@ -0,0 +1,83 @@
/*
Copyright 2007 Infordata S.p.A.
Licensed under the Apache License, Version 2.0 (the "License");
you may not use this file except in compliance with the License.
You may obtain a copy of the License at
http://www.apache.org/licenses/LICENSE-2.0
Unless required by applicable law or agreed to in writing, software
distributed under the License is distributed on an "AS IS" BASIS,
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
See the License for the specific language governing permissions and
limitations under the License.
*/
/*
***
30/06/98 rel. _.___- Swing, JBuilder2 e VSS.
*/
package net.infordata.em.tn5250;
import net.infordata.em.crt5250.XI5250CrtBuffer;
import net.infordata.em.crt5250.XI5250FieldsList;
///////////////////////////////////////////////////////////////////////////////
/**
* Used to store, without exposing it, the internal state of XI5250Emulator.
*
* @see XI5250Emulator#createMemento
*
* @version
* @author Valentino Proietti - Infordata S.p.A.
*/
public class XI5250EmulatorMemento {
protected XI5250FieldsList ivFields;
protected int ivFunctionKeysMask;
protected XI5250Cmd ivPendingCmd;
protected int ivState;
protected int ivPrevState;
protected int ivCol;
protected int ivRow;
protected int ivErrorRow;
// from super classes
protected XI5250CrtBuffer ivCrtBuffer;
public XI5250EmulatorMemento(XI5250FieldsList aFieldList,
int aFunctionKeysMask, XI5250Cmd aPendingCmd,
int aState, int aPrevState,
int aCol, int aRow,
int aErrorRow,
XI5250CrtBuffer aCrtBuffer) {
ivFields = aFieldList;
ivFunctionKeysMask = aFunctionKeysMask;
ivPendingCmd = aPendingCmd;
ivState = aState;
ivPrevState = aPrevState;
ivCol = aCol;
ivRow = aRow;
ivErrorRow = aErrorRow;
ivCrtBuffer = aCrtBuffer;
}
}

View file

@ -0,0 +1,47 @@
/*
Copyright 2007 Infordata S.p.A.
Licensed under the Apache License, Version 2.0 (the "License");
you may not use this file except in compliance with the License.
You may obtain a copy of the License at
http://www.apache.org/licenses/LICENSE-2.0
Unless required by applicable law or agreed to in writing, software
distributed under the License is distributed on an "AS IS" BASIS,
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
See the License for the specific language governing permissions and
limitations under the License.
*/
/*
***
30/06/98 rel. _.___- Swing, JBuilder2 e VSS.
*/
package net.infordata.em.tn5250;
/**
* Used internally.<br>
* It is raised if an error is detected while reading and parsing the 5250 stream.
*
* @version
* @author Valentino Proietti - Infordata S.p.A.
*/
public class XI5250Exception extends Exception {
private static final long serialVersionUID = 1L;
private final int ivErrorCode;
public XI5250Exception(String s, int errorCode) {
super(s);
ivErrorCode = errorCode;
}
public final int getErrorCode() {
return ivErrorCode;
}
}

View file

@ -0,0 +1,331 @@
/*
Copyright 2007 Infordata S.p.A.
Licensed under the Apache License, Version 2.0 (the "License");
you may not use this file except in compliance with the License.
You may obtain a copy of the License at
http://www.apache.org/licenses/LICENSE-2.0
Unless required by applicable law or agreed to in writing, software
distributed under the License is distributed on an "AS IS" BASIS,
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
See the License for the specific language governing permissions and
limitations under the License.
*/
/*
***
!!V 07/07/98 rel. 1.07 - creation.
04/02/99 rel. 1.11 - Swing 1.1 + ivSizeControlledFrame.
*/
package net.infordata.em.tn5250;
import java.awt.Dimension;
import java.awt.event.ActionEvent;
import java.awt.event.KeyEvent;
import java.awt.event.WindowEvent;
import java.util.ResourceBundle;
import javax.swing.AbstractButton;
import javax.swing.JButton;
import javax.swing.JCheckBoxMenuItem;
import javax.swing.JMenu;
import javax.swing.JMenuBar;
import javax.swing.JMenuItem;
import javax.swing.JOptionPane;
import javax.swing.JToggleButton;
import javax.swing.JToolBar;
import javax.swing.KeyStroke;
import javax.swing.SwingUtilities;
import net.infordata.em.crt5250.XI5250Crt;
import net.infordata.em.crt5250.XI5250CrtCtrl;
import net.infordata.em.crt5250.XI5250CrtFrame;
import net.infordata.em.util.XIUtil;
/**
*/
public class XI5250Frame extends XI5250CrtFrame {
private static final long serialVersionUID = 1L;
// images
private static XIImagesBdl cvImagesBdl =
net.infordata.em.tn5250.XIImagesBdl.getImagesBdl();
private static ResourceBundle cvRes =
ResourceBundle.getBundle("net.infordata.em.tn5250.resources.Res");
private final String ivTitle;
/**
*/
public XI5250Frame(String aTitle, XI5250Emulator aCrt) {
super(aTitle, aCrt);
ivTitle = aTitle;
init(aCrt);
}
/**
*/
public XI5250Frame(String aTitle, XI5250Emulator aCrt,
boolean sizeControlledFrame) {
super(aTitle, aCrt, sizeControlledFrame);
ivTitle = aTitle;
init(aCrt);
}
private void init(XI5250Emulator aCrt) {
if (aCrt.isActive())
setTitle("*" + aCrt.getHost() + " - " + ivTitle);
aCrt.addEmulatorListener(new XI5250EmulatorAdapter() {
@Override
public void connected(XI5250EmulatorEvent e) {
setTitle("~" + e.get5250Emulator().getHost() + " - " + ivTitle);
}
@Override
public void disconnected(XI5250EmulatorEvent e) {
setTitle("! " + ivTitle);
}
});
}
/**
*/
@Override
protected XI5250CrtCtrl createController(XI5250Crt crt) {
return new XI5250EmulatorCtrl((XI5250Emulator)crt);
}
/**
*/
protected final XI5250EmulatorCtrl getEmulatorCtrl() {
return (XI5250EmulatorCtrl)getCrtCtrl();
}
/**
*/
public final XI5250Emulator getEmulator() {
return getEmulatorCtrl().getEmulator();
}
/**
*/
@Override
protected void processExitCmd() {
if (getEmulator().isActive()) {
//!!1.13a otherwise a dead-lock may occur !!
SwingUtilities.invokeLater(new Runnable() {
public void run() {
int ret = JOptionPane.showConfirmDialog(
XI5250Frame.this,
cvRes.getString("TXT_ConfirmExit"),
"", JOptionPane.YES_NO_OPTION);
if (ret != JOptionPane.NO_OPTION) {
setVisible(false);
dispose();
}
}
});
}
else {
setVisible(false);
dispose();
}
}
/**
*/
@Override
protected void processWindowEvent(WindowEvent e) {
super.processWindowEvent(e);
switch(e.getID()) {
case WindowEvent.WINDOW_OPENED:
if (getEmulator().getHost() == null)
getCommandMgr().dispatchCommand(XI5250EmulatorCtrl.CONNECT_CMD);
break;
}
}
/**
*/
@Override
protected JMenuBar createMenuBar() {
String str;
str = cvRes.getString("TXT_Communications");
JMenu commMenu = new JMenu(XIUtil.removeMnemonics(str));
commMenu.setMnemonic(XIUtil.getMnemonic(str));
{
JMenuItem connItem =
new JMenuItem(cvRes.getString("TXT_Connect"));
JMenuItem disconnItem =
new JMenuItem(cvRes.getString("TXT_Disconnect"));
JMenuItem aboutItem =
new JMenuItem(cvRes.getString("TXT_About"));
JMenuItem exitItem =
new JMenuItem(cvRes.getString("TXT_Exit"));
exitItem.setAccelerator(KeyStroke.getKeyStroke(KeyEvent.VK_F4,
ActionEvent.ALT_MASK));
commMenu.add(connItem);
commMenu.add(disconnItem);
commMenu.addSeparator();
commMenu.add(aboutItem);
commMenu.addSeparator();
commMenu.add(exitItem);
getCommandMgr().handleCommand(connItem,
XI5250EmulatorCtrl.CONNECT_CMD);
getCommandMgr().handleCommand(disconnItem,
XI5250EmulatorCtrl.DISCONNECT_CMD);
getCommandMgr().handleCommand(aboutItem,
XI5250EmulatorCtrl.ABOUT_CMD);
getCommandMgr().handleCommand(exitItem,
EXIT_CMD);
}
str = cvRes.getString("TXT_Edit");
JMenu editMenu = new JMenu(XIUtil.removeMnemonics(str));
editMenu.setMnemonic(XIUtil.getMnemonic(str));
{
JMenuItem copyItem =
new JMenuItem(cvRes.getString("TXT_Copy"));
JMenuItem pasteItem =
new JMenuItem(cvRes.getString("TXT_Paste"));
JMenuItem snapShotItem =
new JMenuItem(cvRes.getString("TXT_SnapShot"));
JMenuItem printItem =
new JMenuItem(cvRes.getString("TXT_Print"));
editMenu.add(copyItem);
editMenu.add(pasteItem);
editMenu.addSeparator();
editMenu.add(snapShotItem);
editMenu.addSeparator();
editMenu.add(printItem);
getCommandMgr().handleCommand(copyItem,
XI5250EmulatorCtrl.COPY_CMD);
getCommandMgr().handleCommand(pasteItem,
XI5250EmulatorCtrl.PASTE_CMD);
getCommandMgr().handleCommand(snapShotItem,
XI5250EmulatorCtrl.SNAPSHOT_CMD);
getCommandMgr().handleCommand(printItem,
XI5250EmulatorCtrl.PRINT_CMD);
}
str = cvRes.getString("TXT_Options");
JMenu optionsMenu = new JMenu(XIUtil.removeMnemonics(str));
optionsMenu.setMnemonic(XIUtil.getMnemonic(str));
{
JCheckBoxMenuItem switch3DfxItem =
new JCheckBoxMenuItem(cvRes.getString("TXT_3dFx"));
JCheckBoxMenuItem referenceCursorItem =
new JCheckBoxMenuItem(cvRes.getString("TXT_RefCursor"));
optionsMenu.add(switch3DfxItem);
optionsMenu.add(referenceCursorItem);
getCommandMgr().handleCommand(switch3DfxItem,
XI5250EmulatorCtrl.SWITCH_3DFX_CMD);
getCommandMgr().handleCommand(referenceCursorItem,
XI5250EmulatorCtrl.REFERENCE_CURSOR_CMD);
}
JMenuBar menuBar = new JMenuBar();
menuBar.add(commMenu);
menuBar.add(editMenu);
menuBar.add(optionsMenu);
return menuBar;
}
/**
* Inserisce nella tool-bar i bottoni di default.
*/
@Override
protected JToolBar createToolBar() {
// bottoni della tool-bar
AbstractButton[] buttons = new AbstractButton[] {
new JButton(cvImagesBdl.getIcon("Connect")),
new JButton(cvImagesBdl.getIcon("Disconnect")),
null,
new JButton(cvImagesBdl.getIcon("Copy")),
new JButton(cvImagesBdl.getIcon("Paste")),
null,
new JButton(cvImagesBdl.getIcon("SnapShot")),
new JButton(cvImagesBdl.getIcon("Print")),
null,
new JToggleButton(cvImagesBdl.getIcon("3dFx")),
new JToggleButton(cvImagesBdl.getIcon("RefCursor")),
};
// action commands associati con i bottoni della tool-bar.
String[] buttonsActCmd = new String[] {
XI5250EmulatorCtrl.CONNECT_CMD,
XI5250EmulatorCtrl.DISCONNECT_CMD,
null,
XI5250EmulatorCtrl.COPY_CMD,
XI5250EmulatorCtrl.PASTE_CMD,
null,
XI5250EmulatorCtrl.SNAPSHOT_CMD,
XI5250EmulatorCtrl.PRINT_CMD,
null,
XI5250EmulatorCtrl.SWITCH_3DFX_CMD,
XI5250EmulatorCtrl.REFERENCE_CURSOR_CMD,
};
// Hint associati ad i vari bottoni.
String[] buttonHints = new String[] {
cvRes.getString("TXT_Connect"),
cvRes.getString("TXT_Disconnect"),
null,
cvRes.getString("TXT_Copy"),
cvRes.getString("TXT_Paste"),
null,
cvRes.getString("TXT_SnapShot"),
cvRes.getString("TXT_Print"),
null,
cvRes.getString("TXT_3dFx"),
cvRes.getString("TXT_RefCursor"),
};
JToolBar toolBar = new JToolBar();
toolBar.setFloatable(false);
Dimension size = new Dimension(26, 26);
for (int i = 0; i < buttons.length; i++) {
if (buttons[i] != null) {
AbstractButton button = (AbstractButton)buttons[i];
toolBar.add(button);
button.setToolTipText(buttonHints[i]);
button.setMinimumSize(size);
button.setPreferredSize(size);
button.setMaximumSize(size);
button.setRequestFocusEnabled(false);
getCommandMgr().handleCommand(button, buttonsActCmd[i]);
}
else
toolBar.addSeparator();
}
return toolBar;
}
}

View file

@ -0,0 +1,55 @@
/*
Copyright 2007 Infordata S.p.A.
Licensed under the Apache License, Version 2.0 (the "License");
you may not use this file except in compliance with the License.
You may obtain a copy of the License at
http://www.apache.org/licenses/LICENSE-2.0
Unless required by applicable law or agreed to in writing, software
distributed under the License is distributed on an "AS IS" BASIS,
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
See the License for the specific language governing permissions and
limitations under the License.
*/
/*
***
30/06/98 rel. _.___- Swing, JBuilder2 e VSS.
*/
package net.infordata.em.tn5250;
import java.io.IOException;
import java.io.InputStream;
///////////////////////////////////////////////////////////////////////////////
/**
* Abstract base class for all 5250 Orders
*
* @version
* @author Valentino Proietti - Infordata S.p.A.
*/
public abstract class XI5250Ord {
protected XI5250Emulator ivEmulator;
protected void init(XI5250Emulator aEmulator) {
ivEmulator = aEmulator;
}
/**
* @exception XI5250Exception raised if order parameters are wrong.
*/
protected abstract void readFrom5250Stream(InputStream inStream)
throws IOException, XI5250Exception;
protected abstract void execute();
}

View file

@ -0,0 +1,206 @@
/*
Copyright 2007 Infordata S.p.A.
Licensed under the Apache License, Version 2.0 (the "License");
you may not use this file except in compliance with the License.
You may obtain a copy of the License at
http://www.apache.org/licenses/LICENSE-2.0
Unless required by applicable law or agreed to in writing, software
distributed under the License is distributed on an "AS IS" BASIS,
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
See the License for the specific language governing permissions and
limitations under the License.
*/
/*
!!V 15/07/97 rel. 1.02c- XIDataOrd includes 0x1F char.
***
30/06/98 rel. _.___- Swing, JBuilder2 e VSS.
*/
package net.infordata.em.tn5250;
import java.io.IOException;
import java.io.InputStream;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
import java.util.logging.Level;
import java.util.logging.Logger;
import net.infordata.em.tnprot.XITelnet;
///////////////////////////////////////////////////////////////////////////////
/**
* 5250 Orders list.
*
* @version
* @author Valentino Proietti - Infordata S.p.A.
*/
public class XI5250OrdList extends XI5250Ord {
private static final Logger LOGGER = Logger.getLogger(XI5250OrdList.class.getName());
private static Class<?>[] cv5250OrdClasses = new Class<?>[256];
protected List<XI5250Ord> ivOrdVect;
protected boolean[] ivOrdPresent = new boolean[256];
static {
cv5250OrdClasses[XI5250Emulator.ORD_IC] = XIICOrd.class;
cv5250OrdClasses[XI5250Emulator.ORD_RA] = XIRAOrd.class;
cv5250OrdClasses[XI5250Emulator.ORD_SBA] = XISBAOrd.class;
cv5250OrdClasses[XI5250Emulator.ORD_SF] = XISFOrd.class;
cv5250OrdClasses[XI5250Emulator.ORD_SOH] = XISOHOrd.class;
cv5250OrdClasses[XI5250Emulator.ORD_MC] = XIMCOrd.class;
cv5250OrdClasses[XI5250Emulator.ORD_EA] = XIEAOrd.class;
cv5250OrdClasses[XI5250Emulator.ORD_TD] = XITDOrd.class;
cv5250OrdClasses[XI5250Emulator.ORD_WEA] = XIWEAOrd.class;
cv5250OrdClasses[XI5250Emulator.ORD_WDSF] = XIWdsfOrd.class;
}
/**
*/
protected XI5250OrdList(XI5250Emulator aEmulator) {
init(aEmulator);
}
/**
*/
public boolean isOrderPresent(byte aOrder) {
return ivOrdPresent[aOrder];
}
/**
* @exception XI5250Exception raised if order parameters are wrong.
*/
@Override
protected void readFrom5250Stream(InputStream inStream)
throws IOException, XI5250Exception {
int bb;
XI5250Ord ord;
ivOrdVect = new ArrayList<XI5250Ord>(100);
if (LOGGER.isLoggable(Level.FINER))
LOGGER.finer(" START OF ORDERS LIST");
for (int i = 0; ; i++) {
inStream.mark(1);
if ((bb = inStream.read()) == -1)
break;
if ((byte)bb == XI5250Emulator.ESC) {
inStream.reset();
break;
}
if (XIDataOrd.isDataCharacter(bb)) {
inStream.reset(); // need it (it is also the color attribute)
if (ivEmulator.isStrPcCmdEnabled()) {
inStream.mark(XI5250Emulator.STRPCCMD.length);
byte[] lhbb = new byte[XI5250Emulator.STRPCCMD.length];
int sz = inStream.read(lhbb);
if (sz == XI5250Emulator.STRPCCMD.length) {
if (Arrays.equals(lhbb, XI5250Emulator.STRPCCMD)) {
ivEmulator.receivedStrPcCmd();
}
else if (Arrays.equals(lhbb, XI5250Emulator.ENDSTRPCCMD)) {
ivEmulator.receivedEndStrPcCmd();
}
else {
inStream.reset();
}
}
else {
inStream.reset();
}
}
}
else
ivOrdPresent[bb] = true; // remember orders present
try {
ord = createOrdInstance(bb);
}
catch (Exception ex) {
throw new RuntimeException(ex);
}
if (ord != null) {
ord.init(ivEmulator);
ord.readFrom5250Stream(inStream);
if (LOGGER.isLoggable(Level.FINER))
LOGGER.finer(" " + ord);
ivOrdVect.add(ord);
}
else {
if (LOGGER.isLoggable(Level.FINE)) {
LOGGER.fine("Order not supported : 0x" + XITelnet.toHex((byte)bb));
for (int ii = 0; ii < ivOrdVect.size(); ii++) {
LOGGER.fine("Prev. order[" + ii + "]: " + ivOrdVect.get(ii));
}
byte[] buf = new byte[10];
int count = inStream.read(buf);
LOGGER.fine("Next " + count + " bytes: " + XITelnet.toHex(buf, count));
}
throw new XI5250Exception("Order not supported : 0x" + XITelnet.toHex((byte)bb),
XI5250Emulator.ERR_INVALID_COMMAND);
}
}
}
/**
*/
@Override
protected void execute() {
for (int i = 0; i < ivOrdVect.size(); i++)
ivOrdVect.get(i).execute();
}
/**
* Creates the 5250 order instance related to the given 5250 order id.
* @exception IllegalAccessException .
* @exception InstantiationException .
*/
public XI5250Ord createOrdInstance(int aOrd)
throws IllegalAccessException, InstantiationException {
Class<?> cls;
if (XIDataOrd.isDataCharacter(aOrd))
cls = XIDataOrd.class;
else
cls = cv5250OrdClasses[aOrd];
if (cls != null)
return (XI5250Ord)cls.newInstance();
else
return null;
}
/**
*/
@Override
public String toString() {
String ss = super.toString() + ivOrdVect.toString();
return ss;
}
}

View file

@ -0,0 +1,358 @@
/*
Copyright 2007 Infordata S.p.A.
Licensed under the Apache License, Version 2.0 (the "License");
you may not use this file except in compliance with the License.
You may obtain a copy of the License at
http://www.apache.org/licenses/LICENSE-2.0
Unless required by applicable law or agreed to in writing, software
distributed under the License is distributed on an "AS IS" BASIS,
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
See the License for the specific language governing permissions and
limitations under the License.
*/
/*
***
30/06/98 rel. _.___- Swing, JBuilder2 e VSS.
30/07/99 rel. 1.14b- removed statusbar.* sub package.
*/
package net.infordata.em.tn5250;
import java.awt.Dimension;
import java.awt.FontMetrics;
import java.awt.Graphics;
import java.awt.Image;
import java.awt.Insets;
import javax.swing.BorderFactory;
import javax.swing.JComponent;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.border.Border;
import net.infordata.em.util.XIRatioLayout;
/**
* The 5250 status bar.
*/
public class XI5250StatusBar extends JPanel {
private static final long serialVersionUID = 1L;
//
public final static int SHIFT_UP = 0;
public final static int SHIFT_DOWN = 1;
//
public final static int CAPS_LOCK_UP = 0;
public final static int CAPS_LOCK_DOWN = 1;
//
public final static int MESSAGE_OFF = 0;
public final static int MESSAGE_ON = 1;
// images
static XIImagesBdl cvImagesBdl = XIImagesBdl.getImagesBdl();
private static Image
cvTemporaryLockImage = cvImagesBdl.getImage("TemporaryLock");
private static Image
cvNormalLockImage = cvImagesBdl.getImage("NormalLock");
private static Image
cvHelpImage = cvImagesBdl.getImage("Help");
private static Image
cvShiftDownImage = cvImagesBdl.getImage("ShiftDown");
private static Image
cvCapsLockImage = cvImagesBdl.getImage("CapsLock");
private static Image
cvMessageImage = cvImagesBdl.getImage("Message");
private static Image
cvFlashImage = cvImagesBdl.getImage("Flash");
// status bar components
private TextAndImage ivFlashArea;
private TextAndImage ivStateArea;
private TextAndImage ivMessageArea;
private TextAndImage ivShiftArea;
private TextAndImage ivCapsLockArea;
private JLabel ivCoordArea;
private boolean ivFlashOn;
private int ivShiftAreaState = -1;
private int ivState = XI5250Emulator.ST_NULL;
/**
*/
public XI5250StatusBar() {
super(new XIRatioLayout(4));
setBorder(BorderFactory.createRaisedBevelBorder());
// add components
addComponents();
}
/**
*/
@Override
public boolean isValidateRoot() {
return true;
}
/**
*/
public void addComponents() {
Border border = BorderFactory.createEtchedBorder();
ivFlashArea = new TextAndImage(TextAndImage.CENTER);
ivFlashArea.setBorder(border);
add(ivFlashArea, new XIRatioLayout.Constraints(0.03f));
JComponent dummyArea = new TextAndImage(TextAndImage.CENTER);
dummyArea.setBorder(border);
add(dummyArea, new XIRatioLayout.Constraints(0.03f));
// STATE AREA
ivStateArea = new TextAndImage();
ivStateArea.setBorder(border);
add(ivStateArea, new XIRatioLayout.Constraints(0.3f));
// MESSAGE AREA
ivMessageArea = new TextAndImage(TextAndImage.CENTER);
ivMessageArea.setBorder(border);
add(ivMessageArea, new XIRatioLayout.Constraints(0.03f));
// SHIFT AREA
ivShiftArea = new TextAndImage(TextAndImage.CENTER);
ivShiftArea.setBorder(border);
add(ivShiftArea, new XIRatioLayout.Constraints(0.03f));
// CAPS LOCK AREA
ivCapsLockArea = new TextAndImage(TextAndImage.CENTER);
ivCapsLockArea.setBorder(border);
add(ivCapsLockArea, new XIRatioLayout.Constraints(0.03f));
// COORD AREA
ivCoordArea = new JLabel(null, null, JLabel.RIGHT);
ivCoordArea.setFont(null);
ivCoordArea.setBorder(border);
add(ivCoordArea, new XIRatioLayout.Constraints(0.15f, XIRatioLayout.RIGHT));
}
/**
*/
public void setCoordArea(int aCol, int aRow) {
ivCoordArea.setText(aRow + " / " + aCol + " ");
}
/**
*/
public void setFlashArea(boolean flag) {
if (flag == ivFlashOn)
return;
ivFlashOn = flag;
if (flag)
ivFlashArea.setImage(cvFlashImage);
else
ivFlashArea.setImage(null);
}
/**
*/
public void setShiftArea(int aState) {
if (aState == ivShiftAreaState)
return;
ivShiftAreaState = aState;
if (aState == SHIFT_DOWN)
ivShiftArea.setImage(cvShiftDownImage);
else
ivShiftArea.setImage(null);
}
/**
*/
public void setCapsLockArea(int aState) {
if (aState == CAPS_LOCK_DOWN) {
ivCapsLockArea.setImage(cvCapsLockImage);
}
else {
ivCapsLockArea.setImage(null);
}
}
/**
*/
public void setMessageArea(int aState) {
if (aState == MESSAGE_ON) {
ivMessageArea.setImage(cvMessageImage);
}
else {
ivMessageArea.setImage(null);
}
}
/**
*/
public void setStateArea(int aState) {
if (aState == ivState)
return;
switch (aState) {
case XI5250Emulator.ST_HARDWARE_ERROR:
ivStateArea.setImage(null);
ivStateArea.setText("HARDWARE_ERROR");
break;
case XI5250Emulator.ST_NORMAL_LOCKED:
ivStateArea.setImage(cvNormalLockImage);
ivStateArea.setText("SYSTEM");
break;
case XI5250Emulator.ST_NORMAL_UNLOCKED:
ivStateArea.setImage(null);
ivStateArea.setText("");
break;
case XI5250Emulator.ST_POST_HELP:
ivStateArea.setImage(null);
ivStateArea.setText("POST_HELP");
break;
case XI5250Emulator.ST_POWER_ON:
ivStateArea.setImage(null);
ivStateArea.setText("");
break;
case XI5250Emulator.ST_PRE_HELP:
ivStateArea.setImage(cvHelpImage);
ivStateArea.setText("");
break;
case XI5250Emulator.ST_SS_MESSAGE:
ivStateArea.setImage(null);
ivStateArea.setText("SS_MESSAGE");
break;
case XI5250Emulator.ST_SYSTEM_REQUEST:
ivStateArea.setImage(null);
ivStateArea.setText("SYSTEM_REQUEST");
break;
case XI5250Emulator.ST_TEMPORARY_LOCK:
ivStateArea.setImage(cvTemporaryLockImage);
ivStateArea.setText("");
break;
}
}
/**
public void revalidate() {
// otherwise causes interferences with the emulator when it tries to
// force the position and the size of the status bar
}
*/
//////////////////////////////////////////////////////////////////////////////
/**
*/
protected static class TextAndImage extends JComponent {
private static final long serialVersionUID = 1L;
public static final int LEFT = 0;
public static final int CENTER = 1;
private Image ivImage = null;
private String ivText = null;
private int ivAlignment;
private final int ivHGap = 2;
public TextAndImage(int alignment) {
ivAlignment = alignment;
}
public TextAndImage() {
this(LEFT);
}
public void setText(String aText) {
ivText = aText;
repaint();
}
public void setImage(Image aImage) {
ivImage = aImage;
repaint();
}
@Override
public void paintComponent(Graphics gr) {
Insets insets = getInsets();
int imageWidth = 0;
int imageHeight = 0;
int textWidth = 0;
Dimension dim = getSize();
FontMetrics fm = null;
if ((ivImage != null)) {
int w = ivImage.getWidth(this);
int h = ivImage.getHeight(this);
imageHeight = dim.height - insets.top - insets.bottom;
imageWidth = w * imageHeight / h;
}
if (ivText != null && ivText.length() != 0) {
fm = gr.getFontMetrics();
textWidth = fm.stringWidth(ivText);
}
int width = imageWidth + textWidth +
((ivImage != null && fm != null) ? ivHGap : 0);
int x = insets.left;
if (ivAlignment == CENTER)
x = (dim.width - width) / 2;
if ((ivImage != null)) {
gr.drawImage(ivImage, x, insets.top,
imageWidth, imageHeight, this);
x += imageWidth + ivHGap;
}
if (fm != null) {
gr.setColor(getForeground());
int y = (dim.height + fm.getHeight()) / 2;
gr.drawString(ivText, x, y - fm.getDescent());
}
}
}
}

View file

@ -0,0 +1,152 @@
/*
Copyright 2007 Infordata S.p.A.
Licensed under the Apache License, Version 2.0 (the "License");
you may not use this file except in compliance with the License.
You may obtain a copy of the License at
http://www.apache.org/licenses/LICENSE-2.0
Unless required by applicable law or agreed to in writing, software
distributed under the License is distributed on an "AS IS" BASIS,
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
See the License for the specific language governing permissions and
limitations under the License.
*/
/*
01/09/97 rel. 1.04a- executeCC1() implemented.
***
30/06/98 rel. _.___- Swing, JBuilder2 e VSS.
*/
package net.infordata.em.tn5250;
import java.awt.Toolkit;
import java.io.IOException;
import java.io.InputStream;
import java.util.Iterator;
import net.infordata.em.crt5250.XI5250Field;
import net.infordata.em.tnprot.XITelnet;
///////////////////////////////////////////////////////////////////////////////
/**
* Abstract base class for all 5250 commands with CC parameter.
*
* @version
* @author Valentino Proietti - Infordata S.p.A.
*/
public abstract class XICCCmd extends XI5250Cmd {
protected byte[] ivCC;
/**
* @exception XI5250Exception raised if command parameters are wrong.
*/
@Override
protected abstract void readFrom5250Stream(InputStream inStream)
throws IOException, XI5250Exception;
@Override
protected abstract void execute();
/**
* @exception XI5250Exception raised if command parameters are wrong.
*/
protected void readCC(InputStream inStream)
throws IOException, XI5250Exception {
int bb;
int i;
ivCC = new byte[2];
for (i = 0; (i < 2) && ((bb = inStream.read()) != -1); i++)
ivCC[i] = (byte)bb;
if (i < 2)
throw new XI5250Exception("CC required", XI5250Emulator.ERR_INVALID_COMMAND);
}
protected void executeCC1() {
//!!1.04a
int cc1 = ivCC[0] & 0xE0;
// reset pending aid; lock keyboard
if (cc1 != 0) {
ivEmulator.ivPendingCmd = null;
ivEmulator.setState(XI5250Emulator.ST_NORMAL_LOCKED);
}
// clear master mdt; reset mdt in nonbypass-fields
if (cc1 == 0x40 || cc1 == 0xA0 || cc1 == 0xC0) {
//!!V gestire master mdt
XI5250Field field;
for (Iterator<XI5250Field> e = ivEmulator.getFields().iterator(); e.hasNext(); ) {
field = e.next();
if (!field.isOrgBypassField())
field.resetMDT();
}
}
// clear master mdt; reset mdt in all fields
if (cc1 == 0x60 || cc1 == 0xE0) {
//!!V gestire master mdt
XI5250Field field;
for (Iterator<XI5250Field> e = ivEmulator.getFields().iterator(); e.hasNext(); ) {
field = e.next();
field.resetMDT();
}
}
// null nonbypass-fields with mdt on
if (cc1 == 0x80 || cc1 == 0xC0) {
XI5250Field field;
for (Iterator<XI5250Field> e = ivEmulator.getFields().iterator(); e.hasNext(); ) {
field = e.next();
if (!field.isOrgBypassField() && field.isMDTOn())
field.clear();
}
}
// null all nonbypass-fields
if (cc1 == 0xA0 || cc1 == 0xE0) {
XI5250Field field;
for (Iterator<XI5250Field> e = ivEmulator.getFields().iterator(); e.hasNext(); ) {
field = e.next();
if (!field.isBypassField())
field.clear();
}
}
}
protected void executeCC2() {
if ((ivCC[1] & 0x10) != 0)
ivEmulator.setBlinkingCursor(true);
else if ((ivCC[1] & 0x20) != 0)
ivEmulator.setBlinkingCursor(false);
// unlock the keyboard
if ((ivCC[1] & 0x08) != 0)
ivEmulator.setState(XI5250Emulator.ST_NORMAL_UNLOCKED);
if ((ivCC[1] & 0x04) != 0)
Toolkit.getDefaultToolkit().beep();
}
@Override
public String toString() {
return super.toString() + " [CC=[" + XITelnet.toHex(ivCC[0]) + "," + XITelnet.toHex(ivCC[1]) + "]]";
}
}

View file

@ -0,0 +1,53 @@
/*
Copyright 2007 Infordata S.p.A.
Licensed under the Apache License, Version 2.0 (the "License");
you may not use this file except in compliance with the License.
You may obtain a copy of the License at
http://www.apache.org/licenses/LICENSE-2.0
Unless required by applicable law or agreed to in writing, software
distributed under the License is distributed on an "AS IS" BASIS,
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
See the License for the specific language governing permissions and
limitations under the License.
*/
/*
***
30/06/98 rel. _.___- Swing, JBuilder2 e VSS.
*/
package net.infordata.em.tn5250;
import java.io.InputStream;
///////////////////////////////////////////////////////////////////////////////
/**
* Clear Format Table
*
* @version
* @author Valentino Proietti - Infordata S.p.A.
*/
public class XIClearFmtTableCmd extends XI5250Cmd {
@Override
protected void readFrom5250Stream(InputStream inStream) {
}
@Override
protected void execute() {
ivEmulator.setState(XI5250Emulator.ST_NORMAL_LOCKED);
ivEmulator.ivPendingCmd = null;
ivEmulator.setDefAttr(0x20);
ivEmulator.removeFields();
ivEmulator.setErrorRow(ivEmulator.getCrtSize().height - 1);
}
}

View file

@ -0,0 +1,70 @@
/*
Copyright 2007 Infordata S.p.A.
Licensed under the Apache License, Version 2.0 (the "License");
you may not use this file except in compliance with the License.
You may obtain a copy of the License at
http://www.apache.org/licenses/LICENSE-2.0
Unless required by applicable law or agreed to in writing, software
distributed under the License is distributed on an "AS IS" BASIS,
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
See the License for the specific language governing permissions and
limitations under the License.
*/
/*
!!V 14/07/97 rel. 1.02 - added support for 27x132 terminal type (IBM-3477-FC).
***
30/06/98 rel. _.___- Swing, JBuilder2 e VSS.
*/
package net.infordata.em.tn5250;
import java.awt.Font;
import java.io.IOException;
import java.io.InputStream;
///////////////////////////////////////////////////////////////////////////////
/**
* Clear Unit Alternative
*
* @version
* @author Valentino Proietti - Infordata S.p.A.
*/
public class XIClearUnitAltCmd extends XI5250Cmd {
protected int ivPar;
@Override
protected void readFrom5250Stream(InputStream inStream) throws IOException, XI5250Exception {
ivPar = Math.max(0, inStream.read()); //!!1.02
if (ivPar != 0x00 && ivPar != 0x80)
throw new XI5250Exception("Invalid clear unit param: " + ivPar,
XI5250Emulator.ERR_INVALID_CLEAR_UNIT_ALT);
}
@Override
protected void execute() {
ivEmulator.setState(XI5250Emulator.ST_NORMAL_LOCKED);
ivEmulator.ivPendingCmd = null;
if (ivEmulator.ivPrevFont == null) { //!!1.04a
Font ft = ivEmulator.getFont();
ivEmulator.ivPrevFont = new Font(ft.getName(), ft.getStyle(), ft.getSize()); //!!1.03a
}
ivEmulator.setCrtSize(132, 27); //!!1.02
ivEmulator.setDefAttr(0x20);
ivEmulator.clear();
ivEmulator.removeFields();
ivEmulator.setErrorRow(ivEmulator.getCrtSize().height - 1);
}
}

View file

@ -0,0 +1,63 @@
/*
Copyright 2007 Infordata S.p.A.
Licensed under the Apache License, Version 2.0 (the "License");
you may not use this file except in compliance with the License.
You may obtain a copy of the License at
http://www.apache.org/licenses/LICENSE-2.0
Unless required by applicable law or agreed to in writing, software
distributed under the License is distributed on an "AS IS" BASIS,
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
See the License for the specific language governing permissions and
limitations under the License.
*/
/*
!!V 14/07/97 rel. 1.02 - added support for 27x132 terminal type (IBM-3477-FC).
***
30/06/98 rel. _.___- Swing, JBuilder2 e VSS.
*/
package net.infordata.em.tn5250;
import java.io.InputStream;
///////////////////////////////////////////////////////////////////////////////
/**
* 5250 Clear unit command
*
* @version
* @author Valentino Proietti - Infordata S.p.A.
*/
public class XIClearUnitCmd extends XI5250Cmd {
@Override
protected void readFrom5250Stream(InputStream inStream) {
}
@Override
protected void execute() {
ivEmulator.setState(XI5250Emulator.ST_NORMAL_LOCKED);
ivEmulator.ivPendingCmd = null;
ivEmulator.setCrtSize(80, 24); //!!1.02
ivEmulator.setDefAttr(0x20);
ivEmulator.clear();
ivEmulator.removeFields();
ivEmulator.setErrorRow(ivEmulator.getCrtSize().height - 1);
// switch back to the previous used font
if (ivEmulator.ivPrevFont != null) { //!!1.03a
ivEmulator.setFont(ivEmulator.ivPrevFont);
ivEmulator.ivPrevFont = null;
}
}
}

View file

@ -0,0 +1,130 @@
/*
Copyright 2007 Infordata S.p.A.
Licensed under the Apache License, Version 2.0 (the "License");
you may not use this file except in compliance with the License.
You may obtain a copy of the License at
http://www.apache.org/licenses/LICENSE-2.0
Unless required by applicable law or agreed to in writing, software
distributed under the License is distributed on an "AS IS" BASIS,
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
See the License for the specific language governing permissions and
limitations under the License.
*/
/*
!!V 15/07/97 rel. 1.02c- XIDataOrd includes 0x1F char.
***
30/06/98 rel. _.___- Swing, JBuilder2 e VSS.
*/
package net.infordata.em.tn5250;
import java.io.IOException;
import java.io.InputStream;
import net.infordata.em.crt5250.XIEbcdicTranslator;
import net.infordata.em.tnprot.XITelnet;
///////////////////////////////////////////////////////////////////////////////
/**
* 5250 Data Order
*
* @version
* @author Valentino Proietti - Infordata S.p.A.
*/
public class XIDataOrd extends XI5250Ord {
protected String ivData;
protected byte ivColor;
/**
* see http://publibfp.boulder.ibm.com/cgi-bin/bookmgr/BOOKS/co2e2001/15.6.2?SHELF=&DT=19950629163252&CASE=
* and IBM SA21-9247-6 pg. 2.13
*/
public static final boolean isDataCharacter(int bb) {
// 0x1F instead of 0x20 and keep 0xFF chars
// return (bb == 0x00 || bb == 0x1C || bb == 0x1E || bb == 0x0E || bb == 0x0F ||
// (bb >= 0x1F && bb <= 0xFF));
switch (bb) {
case XI5250Emulator.ORD_IC:
case XI5250Emulator.ORD_RA:
case XI5250Emulator.ORD_SBA:
case XI5250Emulator.ORD_SF:
case XI5250Emulator.ORD_SOH:
case XI5250Emulator.ORD_MC:
case XI5250Emulator.ORD_EA:
case XI5250Emulator.ORD_TD:
case XI5250Emulator.ORD_WEA:
case XI5250Emulator.ORD_WDSF:
case XI5250Emulator.ESC:
return false;
default:
return true;
}
}
@Override
protected void readFrom5250Stream(InputStream inStream) throws IOException {
XIEbcdicTranslator translator = ivEmulator.getTranslator();
int bb;
ivColor = 0;
StringBuilder sb = new StringBuilder(128);
for (int i = 0; ; i++) {
inStream.mark(1);
bb = inStream.read();
if (bb == -1)
break;
// see IBM SA21-9247-6 pg. 2.13
if (isDataCharacter(bb)) {
// is it a color ?
if (bb > 0x1F && bb <= 0x3F) {
if (i == 0)
ivColor = (byte)bb;
else {
// cut string if different color
inStream.reset();
break;
}
}
else
sb.append(translator.toChar((byte)bb));
}
else {
inStream.reset();
break;
}
}
ivData = sb.toString();
}
@Override
protected void execute() {
if (ivColor != 0) {
ivEmulator.setDefAttr(XITelnet.toInt(ivColor));
ivEmulator.drawString(String.valueOf(XI5250Emulator.ATTRIBUTE_PLACE_HOLDER),
ivEmulator.getSBACol(), ivEmulator.getSBARow());
ivEmulator.setSBA(ivEmulator.getSBA() + 1);
}
ivEmulator.drawString(ivData, ivEmulator.getSBACol(), ivEmulator.getSBARow());
ivEmulator.setSBA(ivEmulator.getSBA() + ivData.length());
}
@Override
public String toString() {
return super.toString() + " [" + XITelnet.toHex(ivColor) + "," + ",\"" + ivData + "\"" + "]";
}
}

View file

@ -0,0 +1,87 @@
/*
Copyright 2007 Infordata S.p.A.
Licensed under the Apache License, Version 2.0 (the "License");
you may not use this file except in compliance with the License.
You may obtain a copy of the License at
http://www.apache.org/licenses/LICENSE-2.0
Unless required by applicable law or agreed to in writing, software
distributed under the License is distributed on an "AS IS" BASIS,
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
See the License for the specific language governing permissions and
limitations under the License.
*/
/*
***
30/06/98 rel. _.___- Swing, JBuilder2 e VSS.
*/
package net.infordata.em.tn5250;
import java.io.IOException;
import java.io.InputStream;
import net.infordata.em.tnprot.XITelnet;
///////////////////////////////////////////////////////////////////////////////
/**
* EA - Erase to address
* TODO
*
* see: http://publibfp.boulder.ibm.com/cgi-bin/bookmgr/BOOKS/co2e2001/15.6.8?DT=19950629163252
*
* @version
* @author Valentino Proietti - Infordata S.p.A.
*/
public class XIEAOrd extends XI5250Ord {
protected int ivRow;
protected int ivCol;
protected int ivLen;
protected byte[] ivAttributeTypes;
/**
* @exception XI5250Exception raised if order parameters are wrong.
*/
@Override
protected void readFrom5250Stream(InputStream inStream)
throws IOException, XI5250Exception {
{
byte[] buf = new byte[3];
if (inStream.read(buf) < buf.length)
throw new XI5250Exception("EOF reached", XI5250Emulator.ERR_INVALID_ROW_COL_ADDR);
ivRow = XITelnet.toInt(buf[0]);
ivCol = XITelnet.toInt(buf[1]);
ivLen = XITelnet.toInt(buf[2]);
}
if (ivLen < 2 || ivLen > 5)
throw new XI5250Exception("Invalid len: " + ivLen, XI5250Emulator.ERR_INVALID_ROW_COL_ADDR);
ivLen--;
ivAttributeTypes = new byte[ivLen];
if (inStream.read(ivAttributeTypes) < ivLen)
throw new XI5250Exception("EOF reached", XI5250Emulator.ERR_INVALID_ROW_COL_ADDR);
}
@Override
protected void execute() {
//TODO
throw new IllegalStateException("Not supported");
}
@Override
public String toString() {
return super.toString() + " [" + ivRow + "," + ivCol + "," + ivLen + "," + ",[" +
XITelnet.toHex(ivAttributeTypes) + "]" + "]";
}
}

View file

@ -0,0 +1,157 @@
/*
Copyright 2007 Infordata S.p.A.
Licensed under the Apache License, Version 2.0 (the "License");
you may not use this file except in compliance with the License.
You may obtain a copy of the License at
http://www.apache.org/licenses/LICENSE-2.0
Unless required by applicable law or agreed to in writing, software
distributed under the License is distributed on an "AS IS" BASIS,
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
See the License for the specific language governing permissions and
limitations under the License.
*/
/*
!!V 10/04/97 rel. 0.93 - some fix to add SignedNumeric fields handling.
06/08/97 rel. 1.03c- bug fix.
02/09/97 rel. 1.04a- changed to make XIReadFieldsCmd and XIReadImmediateCmd work.
***
30/06/98 rel. _.___- Swing, JBuilder2 e VSS.
*/
package net.infordata.em.tn5250;
import java.io.IOException;
import java.io.OutputStream;
import net.infordata.em.crt5250.XI5250Field;
import net.infordata.em.crt5250.XI5250FieldSaver;
import net.infordata.em.crt5250.XIEbcdicTranslator;
///////////////////////////////////////////////////////////////////////////////
/**
* Implements XI5250FieldSaver to write fields content to an OutputStream.
*
* @see XI5250Emulator#send5250Data
*
* @version
* @author Valentino Proietti - Infordata S.p.A.
*/
public class XIFieldTo5250Stream implements XI5250FieldSaver {
XI5250Emulator ivEmulator;
OutputStream ivOut;
boolean ivOnlyMDT;
/**
*/
public XIFieldTo5250Stream(XI5250Emulator aEmulator, OutputStream aOutStream,
boolean onlyMDT) {
ivEmulator = aEmulator;
ivOut = aOutStream;
ivOnlyMDT = onlyMDT;
}
/**
*
*/
public void write(XI5250Field aField, String aStr)
throws IOException {
if (ivOnlyMDT && !aField.isMDTOn())
return;
XIEbcdicTranslator translator = ivEmulator.getTranslator();
// requires some special handling
// see IBM 5250 function reference manual page 2-70
if (aStr.length() > 0) {
if (aField.isSignedNumeric()) {
StringBuilder strBuf = new StringBuilder(aStr);
int i;
// find last digit char
for (i = strBuf.length() - 1;
(i >= 0) && !Character.isDigit(strBuf.charAt(i)); i--)
;
// replace non digit chars between digit char with zeroes
for (int j = i - 1; j >= 0; j--)
if (!Character.isDigit(strBuf.charAt(j)))
strBuf.setCharAt(j, '0');
if (strBuf.charAt(strBuf.length() - 1) == '-') {
if (i >= 0) {
byte xx = translator.toEBCDIC(strBuf.charAt(i));
xx &= 0x0F;
xx |= 0xD0;
strBuf.setCharAt(i, translator.toChar(xx));
aStr = new String(strBuf).substring(0, strBuf.length() - 1);
}
else
aStr = "";
}
else
aStr = new String(strBuf);
}
}
int i = aStr.length() - 1;
if (ivOnlyMDT) { //!!1.04a
byte[] cBuf = {XI5250Emulator.ORD_SBA,
(byte)(aField.getRow() + 1),
(byte)(aField.getCol() + 1)};
ivOut.write(cBuf);
// exclude trailing null chars
for (; (i >= 0) && (aStr.charAt(i) == '\u0000'); i--)
;
}
byte[] strBuf = new byte[i + 1];
{
int linearPos = ivEmulator.toLinearPos(aField.getCol(), aField.getRow());
int j;
int len = Math.min(i + 1, aStr.length());
byte space = translator.toEBCDIC(' ');
for (j = 0; j < len; j++) {
char ch = aStr.charAt(j);
if (ch == XI5250Emulator.ATTRIBUTE_PLACE_HOLDER) {
ch = (char)ivEmulator.getAttr(ivEmulator.toColPos(linearPos + j),
ivEmulator.toRowPos(linearPos + j));
strBuf[j] = (byte)ch; // leave attributes as is
}
else if (ch == '\u0000') {
strBuf[j] = space;
}
else {
strBuf[j] = translator.toEBCDIC(ch);
}
}
// fill with space
for (j = len; j < i + 1; j++)
strBuf[j] = space;
}
if (i >= 0) {
for (int j = 0; j < (i + 1); j++) {
// convert nulls to EBCDIC spaces
if (strBuf[j] == 0)
strBuf[j] = 0x40;
}
ivOut.write(strBuf, 0, i + 1);
}
}
}

View file

@ -0,0 +1,66 @@
/*
Copyright 2007 Infordata S.p.A.
Licensed under the Apache License, Version 2.0 (the "License");
you may not use this file except in compliance with the License.
You may obtain a copy of the License at
http://www.apache.org/licenses/LICENSE-2.0
Unless required by applicable law or agreed to in writing, software
distributed under the License is distributed on an "AS IS" BASIS,
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
See the License for the specific language governing permissions and
limitations under the License.
*/
/*
***
30/06/98 rel. _.___- Swing, JBuilder2 e VSS.
*/
package net.infordata.em.tn5250;
import java.io.IOException;
import java.io.InputStream;
///////////////////////////////////////////////////////////////////////////////
/**
* 5250 IC Order
*
* @version
* @author Valentino Proietti - Infordata S.p.A.
*/
public class XIICOrd extends XI5250Ord {
protected int ivRow, ivCol;
@Override
protected void readFrom5250Stream(InputStream inStream) throws IOException, XI5250Exception {
ivRow = Math.max(0, inStream.read());
ivCol = Math.max(0, inStream.read());
// Cannot deal with real dimensions, since they can be not applied yet
if (ivRow <= 0 || ivRow > XI5250Emulator.MAX_ROWS ||
ivCol <= 0 || ivCol > XI5250Emulator.MAX_COLS)
throw new XI5250Exception("Invalid screen coord: " + ivRow + "," + ivCol,
XI5250Emulator.ERR_INVALID_ROW_COL_ADDR);
}
@Override
protected void execute() {
ivEmulator.setCursorPos(ivCol - 1, ivRow - 1);
ivEmulator.ivCmdList.ivICOrderExecuted = true;
}
@Override
public String toString() {
return super.toString() + " [" + ivRow + "," + ivCol + "]";
}
}

View file

@ -0,0 +1,134 @@
/*
Copyright 2007 Infordata S.p.A.
Licensed under the Apache License, Version 2.0 (the "License");
you may not use this file except in compliance with the License.
You may obtain a copy of the License at
http://www.apache.org/licenses/LICENSE-2.0
Unless required by applicable law or agreed to in writing, software
distributed under the License is distributed on an "AS IS" BASIS,
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
See the License for the specific language governing permissions and
limitations under the License.
*/
/*
***
30/06/98 rel. _.___- Swing, JBuilder2 e VSS.
07/07/98 rel. 1.07 - Uses XIUtil.createImage(), the old approach doesn' t
work at design time.
15/06/99 rel. 1.13 - Introduced crt5250 bundle.
*/
package net.infordata.em.tn5250;
import java.awt.Image;
import java.util.HashMap;
import java.util.ListResourceBundle;
import java.util.Map;
import javax.swing.Icon;
import javax.swing.ImageIcon;
import net.infordata.em.util.XIUtil;
/**
* The image bundle.
*
* @version
* @author Valentino Proietti - Infordata S.p.A.
*/
public class XIImagesBdl extends ListResourceBundle {
private static XIImagesBdl cvImagesBdl;
private static Object[][] cvContents = null;
static {
try {
Object[][] contents = new Object[][] {
{"TemporaryLock",
XIUtil.createImage(
XIImagesBdl.class, "resources/TemporaryLockState.gif")},
{"NormalLock",
XIUtil.createImage(
XIImagesBdl.class, "resources/NormalLockState.gif")},
{"Help",
XIUtil.createImage(
XIImagesBdl.class, "resources/HelpState.gif")},
{"Message",
XIUtil.createImage(
XIImagesBdl.class, "resources/Message.gif")},
{"Flash",
XIUtil.createImage(
XIImagesBdl.class, "resources/Flash.gif")},
//
{"Connect",
XIUtil.createImage(
XIImagesBdl.class, "resources/Connect.gif")},
{"Disconnect",
XIUtil.createImage(
XIImagesBdl.class, "resources/Disconnect.gif")},
{"InFrame",
XIUtil.createImage(
XIImagesBdl.class, "resources/InFrame.gif")},
{"SnapShot",
XIUtil.createImage(
XIImagesBdl.class, "resources/SnapShot.gif")},
};
Object[][] superContents =
net.infordata.em.crt5250.XIImagesBdl.getImagesBdl().getContents();
cvContents = new Object[superContents.length + contents.length][2];
System.arraycopy(superContents, 0, cvContents, 0, superContents.length);
System.arraycopy(contents, 0, cvContents, superContents.length, contents.length);
}
catch (RuntimeException ex) {
throw ex;
}
}
private XIImagesBdl() {
}
public static XIImagesBdl getImagesBdl() {
if (cvImagesBdl == null) {
cvImagesBdl = new XIImagesBdl();
}
return cvImagesBdl;
}
@Override
public Object[][] getContents() {
return cvContents;
}
/**
*/
public final Image getImage(String anImageName) {
return ((ImageIcon)getIcon(anImageName)).getImage();
}
private Map<String, Icon> ivIcons = new HashMap<String, Icon>();
/**
*/
public synchronized final Icon getIcon(String anImageName) {
Icon icon = (Icon)ivIcons.get(anImageName);
if (icon == null) {
icon = new ImageIcon((Image)getObject(anImageName));
ivIcons.put(anImageName, icon);
}
return icon;
}
}

View file

@ -0,0 +1,71 @@
/*
Copyright 2007 Infordata S.p.A.
Licensed under the Apache License, Version 2.0 (the "License");
you may not use this file except in compliance with the License.
You may obtain a copy of the License at
http://www.apache.org/licenses/LICENSE-2.0
Unless required by applicable law or agreed to in writing, software
distributed under the License is distributed on an "AS IS" BASIS,
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
See the License for the specific language governing permissions and
limitations under the License.
*/
/*
***
30/06/98 rel. _.___- Swing, JBuilder2 e VSS.
*/
package net.infordata.em.tn5250;
import java.io.IOException;
import java.io.InputStream;
///////////////////////////////////////////////////////////////////////////////
/**
* MC - Move cursor
*
* see: http://publibfp.boulder.ibm.com/cgi-bin/bookmgr/BOOKS/co2e2001/15.6.6?DT=19950629163252
*
* @version
* @author Valentino Proietti - Infordata S.p.A.
*/
public class XIMCOrd extends XI5250Ord {
protected int ivRow, ivCol;
/**
* @exception XI5250Exception raised if order parameters are wrong.
*/
@Override
protected void readFrom5250Stream(InputStream inStream)
throws IOException, XI5250Exception {
ivRow = Math.max(0, inStream.read());
ivCol = Math.max(0, inStream.read());
// Cannot deal with real dimensions, since they can be not applied yet
if (ivRow <= 0 || ivRow > XI5250Emulator.MAX_ROWS ||
ivCol <= 0 || ivCol > XI5250Emulator.MAX_COLS)
throw new XI5250Exception("Invalid screen coord: " + ivRow + "," + ivCol,
XI5250Emulator.ERR_INVALID_ROW_COL_ADDR);
}
@Override
protected void execute() {
ivEmulator.setCursorPos(ivCol - 1, ivRow - 1);
}
@Override
public String toString() {
return super.toString() + " [" + ivRow + "," + ivCol + "]";
}
}

View file

@ -0,0 +1,90 @@
/*
Copyright 2007 Infordata S.p.A.
Licensed under the Apache License, Version 2.0 (the "License");
you may not use this file except in compliance with the License.
You may obtain a copy of the License at
http://www.apache.org/licenses/LICENSE-2.0
Unless required by applicable law or agreed to in writing, software
distributed under the License is distributed on an "AS IS" BASIS,
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
See the License for the specific language governing permissions and
limitations under the License.
*/
/*
***
30/06/98 rel. _.___- Swing, JBuilder2 e VSS.
*/
package net.infordata.em.tn5250;
import java.io.IOException;
import java.io.InputStream;
import net.infordata.em.crt5250.XIEbcdicTranslator;
///////////////////////////////////////////////////////////////////////////////
/**
* 5250 Query command.
*
* @version
* @author Valentino Proietti - Infordata S.p.A.
*/
public class XIQueryCmd extends XI5250Cmd {
protected int[] ivPar = new int[5];
@Override
protected void readFrom5250Stream(InputStream inStream) throws IOException {
for (int i = 0; i < 5; i++)
ivPar[i] = inStream.read();
if (ivPar[0] != 0x00 || ivPar[1] != 0x05 ||
ivPar[2] != 0xD9 || ivPar[3] != 0x70 ||
ivPar[4] != 0x00)
; //!!V gestire errori
}
@Override
protected void execute() {
XIEbcdicTranslator trans = ivEmulator.getTranslator();
// see rfc 1205
byte[] buf = {
(byte)0x00, (byte)0x00,
(byte)0x88,
(byte)0x00, (byte)0x3A,
(byte)0xD9,
(byte)0x70,
(byte)0x80,
(byte)0x06, (byte)0x00, // any other 5250 emulator
(byte)0x01, (byte)0x01, (byte)0x00, // version
(byte)0x00, (byte)0x00, (byte)0x00, (byte)0x00, (byte)0x00, (byte)0x00,
(byte)0x00, (byte)0x00, (byte)0x00, (byte)0x00, (byte)0x00, (byte)0x00,
(byte)0x00, (byte)0x00, (byte)0x00, (byte)0x00,
(byte)0x01,
(byte)trans.toEBCDIC('5'), (byte)trans.toEBCDIC('2'), (byte)trans.toEBCDIC('5'), (byte)trans.toEBCDIC('1'), // 5251
(byte)trans.toEBCDIC('0'), (byte)trans.toEBCDIC('1'), (byte)trans.toEBCDIC('1'),
(byte)0x02, (byte)0x00, // keyboard
(byte)0x00,
(byte)0x00, (byte)0x00, (byte)0x00, (byte)0x00, // S/N
(byte)0x01, (byte)0x00, // max input fields
(byte)0x00, (byte)0x00, (byte)0x00,
(byte)0x01, // Row 1 e col 1 support
(byte)(0x03 | 0x40), // 24x80 and 27x132 color supported
(byte)0x00, // reserved
(byte)0x00,
(byte)0x00, //0x07, // enhanced mode ??
(byte)0x00, (byte)0x00, (byte)0x00, (byte)0x00,
(byte)0x00, (byte)0x00, (byte)0x00};
ivEmulator.send5250Packet((byte)0x00, (byte)0x00, buf);
}
}

View file

@ -0,0 +1,75 @@
/*
Copyright 2007 Infordata S.p.A.
Licensed under the Apache License, Version 2.0 (the "License");
you may not use this file except in compliance with the License.
You may obtain a copy of the License at
http://www.apache.org/licenses/LICENSE-2.0
Unless required by applicable law or agreed to in writing, software
distributed under the License is distributed on an "AS IS" BASIS,
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
See the License for the specific language governing permissions and
limitations under the License.
*/
/*
***
30/06/98 rel. _.___- Swing, JBuilder2 e VSS.
*/
package net.infordata.em.tn5250;
import java.io.IOException;
import java.io.InputStream;
///////////////////////////////////////////////////////////////////////////////
/**
* 5250 RA Order
*
* @version
* @author Valentino Proietti - Infordata S.p.A.
*/
public class XIRAOrd extends XI5250Ord {
protected int ivEndRow, ivEndCol;
protected char ivChar;
@Override
protected void readFrom5250Stream(InputStream inStream) throws IOException, XI5250Exception {
ivEndRow = Math.max(0, inStream.read());
ivEndCol = Math.max(0, inStream.read());
ivChar = ivEmulator.getTranslator().toChar((byte)Math.max(0, inStream.read()));
// Cannot deal with real dimensions, since they can be not applied yet
if (ivEndRow <= 0 || ivEndRow > XI5250Emulator.MAX_ROWS ||
ivEndCol <= 0 || ivEndCol > XI5250Emulator.MAX_COLS)
throw new XI5250Exception("Invalid screen coord: " + ivEndRow + "," + ivEndCol,
XI5250Emulator.ERR_INVALID_ROW_COL_ADDR);
}
@Override
protected void execute() {
int start = ivEmulator.toLinearPos(ivEmulator.getSBACol(), ivEmulator.getSBARow());
int end = ivEmulator.toLinearPos(ivEndCol - 1, ivEndRow - 1);
StringBuilder str = new StringBuilder(end - start + 1);
for (int i = 0; i < (end - start + 1); i++)
str.append(ivChar);
ivEmulator.drawString(str.toString(), ivEmulator.getSBACol(), ivEmulator.getSBARow());
ivEmulator.setSBA(ivEmulator.getSBA() + (end - start + 1));
}
@Override
public String toString() {
return super.toString() +
" [" + ivEndRow + "," + ivEndCol + ",'" + ivChar + "'" + "]";
}
}

View file

@ -0,0 +1,63 @@
/*
Copyright 2007 Infordata S.p.A.
Licensed under the Apache License, Version 2.0 (the "License");
you may not use this file except in compliance with the License.
You may obtain a copy of the License at
http://www.apache.org/licenses/LICENSE-2.0
Unless required by applicable law or agreed to in writing, software
distributed under the License is distributed on an "AS IS" BASIS,
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
See the License for the specific language governing permissions and
limitations under the License.
*/
/*
***
30/06/98 rel. _.___- Swing, JBuilder2 e VSS.
*/
package net.infordata.em.tn5250;
import java.io.IOException;
import java.io.InputStream;
////////////////////////////////////////////////////////////////////////////////
/**
* 5250 Read fields
*
* @version
* @author Valentino Proietti - Infordata S.p.A.
*/
public class XIReadFieldsCmd extends XICCCmd {
/**
* @exception XI5250Exception raised if command parameters are wrong.
*/
@Override
protected void readFrom5250Stream(InputStream inStream)
throws IOException, XI5250Exception {
readCC(inStream);
}
@Override
protected void execute() {
ivEmulator.ivPendingCmd = this;
executeCC1();
executeCC2();
}
@Override
protected void executePending(int anAidCode, boolean isMasked) {
ivEmulator.setState(XI5250Emulator.ST_TEMPORARY_LOCK);
ivEmulator.send5250Data(anAidCode, ivEmulator.isMasterMDTSet() && !isMasked, false);
//!!0.92a ivEmulator.ivPendingCmd = null;
//ivEmulator.removeFields();
}
}

View file

@ -0,0 +1,49 @@
/*
Copyright 2007 Infordata S.p.A.
Licensed under the Apache License, Version 2.0 (the "License");
you may not use this file except in compliance with the License.
You may obtain a copy of the License at
http://www.apache.org/licenses/LICENSE-2.0
Unless required by applicable law or agreed to in writing, software
distributed under the License is distributed on an "AS IS" BASIS,
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
See the License for the specific language governing permissions and
limitations under the License.
*/
/*
***
30/06/98 rel. _.___- Swing, JBuilder2 e VSS.
*/
package net.infordata.em.tn5250;
import java.io.IOException;
import java.io.InputStream;
///////////////////////////////////////////////////////////////////////////////
/**
* 5250 Read Immediate
*
* @version
* @author Valentino Proietti - Infordata S.p.A.
*/
public class XIReadImmediateCmd extends XI5250Cmd {
@Override
protected void readFrom5250Stream(InputStream inStream) throws IOException {
}
@Override
protected void execute() {
ivEmulator.send5250Data(0x00, ivEmulator.isMasterMDTSet(), false);
}
}

View file

@ -0,0 +1,65 @@
/*
Copyright 2007 Infordata S.p.A.
Licensed under the Apache License, Version 2.0 (the "License");
you may not use this file except in compliance with the License.
You may obtain a copy of the License at
http://www.apache.org/licenses/LICENSE-2.0
Unless required by applicable law or agreed to in writing, software
distributed under the License is distributed on an "AS IS" BASIS,
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
See the License for the specific language governing permissions and
limitations under the License.
*/
/*
***
30/06/98 rel. _.___- Swing, JBuilder2 e VSS.
*/
package net.infordata.em.tn5250;
import java.io.IOException;
import java.io.InputStream;
///////////////////////////////////////////////////////////////////////////////
/**
* 5250 Read MDT fields command
*
* @version
* @author Valentino Proietti - Infordata S.p.A.
*/
public class XIReadMdtFieldsCmd extends XICCCmd {
/**
* @exception XI5250Exception raised if command parameters are wrong.
*/
@Override
protected void readFrom5250Stream(InputStream inStream)
throws IOException, XI5250Exception {
readCC(inStream);
}
@Override
protected void execute() {
ivEmulator.ivPendingCmd = this;
executeCC1();
executeCC2();
}
@Override
protected void executePending(int anAidCode, boolean isMasked) {
ivEmulator.setState(XI5250Emulator.ST_TEMPORARY_LOCK);
ivEmulator.send5250Data(anAidCode,
ivEmulator.isMasterMDTSet() && !isMasked, true);
//!!0.92a ivEmulator.ivPendingCmd = null;
//!!V1 ivEmulator.removeFields();
}
}

View file

@ -0,0 +1,49 @@
/*
Copyright 2007 Infordata S.p.A.
Licensed under the Apache License, Version 2.0 (the "License");
you may not use this file except in compliance with the License.
You may obtain a copy of the License at
http://www.apache.org/licenses/LICENSE-2.0
Unless required by applicable law or agreed to in writing, software
distributed under the License is distributed on an "AS IS" BASIS,
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
See the License for the specific language governing permissions and
limitations under the License.
*/
/*
***
30/06/98 rel. _.___- Swing, JBuilder2 e VSS.
*/
package net.infordata.em.tn5250;
import java.io.IOException;
import java.io.InputStream;
///////////////////////////////////////////////////////////////////////////////
/**
* 5250 read screen command
*
* @version
* @author Valentino Proietti - Infordata S.p.A.
*/
public class XIReadScreenCmd extends XI5250Cmd {
@Override
protected void readFrom5250Stream(InputStream inStream) throws IOException {
}
@Override
protected void execute() {
ivEmulator.send5250Screen();
}
}

View file

@ -0,0 +1,71 @@
/*
Copyright 2007 Infordata S.p.A.
Licensed under the Apache License, Version 2.0 (the "License");
you may not use this file except in compliance with the License.
You may obtain a copy of the License at
http://www.apache.org/licenses/LICENSE-2.0
Unless required by applicable law or agreed to in writing, software
distributed under the License is distributed on an "AS IS" BASIS,
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
See the License for the specific language governing permissions and
limitations under the License.
*/
/*
***
30/06/98 rel. _.___- Swing, JBuilder2 e VSS.
*/
package net.infordata.em.tn5250;
import java.io.IOException;
import java.io.InputStream;
///////////////////////////////////////////////////////////////////////////////
/**
* 5250 Restore screen command
*
* @version
* @author Valentino Proietti - Infordata S.p.A.
*/
public class XIRestoreScreenCmd extends XI5250Cmd {
protected int ivPos;
/**
* @exception XI5250Exception raised if command parameters are wrong.
*/
@Override
protected void readFrom5250Stream(InputStream inStream)
throws IOException, XI5250Exception {
ivPos = inStream.read();
if (ivPos == -1)
throw new XI5250Exception("Restore screen position required",
XI5250Emulator.ERR_INVALID_COMMAND);
}
@Override
protected void execute() {
try {
/*!!1.06a
XI5250EmulatorMemento mm = (XI5250EmulatorMemento)ivEmulator.ivSavedScreenList.elementAt(ivPos);
ivEmulator.ivSavedScreenList.setSize(ivPos + 1);
*/
//!!1.06a
XI5250EmulatorMemento mm = ivEmulator.ivSavedScreens[ivPos];
ivEmulator.restoreMemento(mm);
}
catch (ArrayIndexOutOfBoundsException ex) {
}
}
}

View file

@ -0,0 +1,79 @@
/*
Copyright 2007 Infordata S.p.A.
Licensed under the Apache License, Version 2.0 (the "License");
you may not use this file except in compliance with the License.
You may obtain a copy of the License at
http://www.apache.org/licenses/LICENSE-2.0
Unless required by applicable law or agreed to in writing, software
distributed under the License is distributed on an "AS IS" BASIS,
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
See the License for the specific language governing permissions and
limitations under the License.
*/
/*
***
30/06/98 rel. _.___- Swing, JBuilder2 e VSS.
*/
package net.infordata.em.tn5250;
import java.io.IOException;
import java.io.InputStream;
///////////////////////////////////////////////////////////////////////////////
/**
* 5250 Roll command
*
* @version
* @author Valentino Proietti - Infordata S.p.A.
*/
public class XIRollCmd extends XI5250Cmd {
boolean ivDown;
int ivNRows;
int ivTopRow;
int ivBottomRow;
/**
* @exception XI5250Exception raised if command parameters are wrong.
*/
@Override
protected void readFrom5250Stream(InputStream inStream)
throws IOException, XI5250Exception {
int[] bb = new int[3];
int i;
for (i = 0; i < 3 && (bb[i] = inStream.read()) >= 0; i++)
;
if (i < 3)
throw new XI5250Exception("Roll parameter missing",
XI5250Emulator.ERR_INVALID_ROW_COL_ADDR);
ivDown = ((bb[0] & 0x80) != 0);
ivNRows = (bb[0] & 0x1F);
ivTopRow = bb[1];
ivBottomRow = bb[2];
if (ivTopRow > ivBottomRow)
throw new XI5250Exception("TopRow greater then BottomRow",
XI5250Emulator.ERR_INVALID_ROW_COL_ADDR);
}
@Override
protected void execute() {
ivEmulator.scroll(ivDown, ivTopRow - 1, ivBottomRow, ivNRows);
}
}

View file

@ -0,0 +1,65 @@
/*
Copyright 2007 Infordata S.p.A.
Licensed under the Apache License, Version 2.0 (the "License");
you may not use this file except in compliance with the License.
You may obtain a copy of the License at
http://www.apache.org/licenses/LICENSE-2.0
Unless required by applicable law or agreed to in writing, software
distributed under the License is distributed on an "AS IS" BASIS,
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
See the License for the specific language governing permissions and
limitations under the License.
*/
/*
***
30/06/98 rel. _.___- Swing, JBuilder2 e VSS.
*/
package net.infordata.em.tn5250;
import java.io.IOException;
import java.io.InputStream;
///////////////////////////////////////////////////////////////////////////////
/**
* 5250 SBA Order
*
* @version
* @author Valentino Proietti - Infordata S.p.A.
*/
public class XISBAOrd extends XI5250Ord {
protected int ivRow, ivCol;
@Override
protected void readFrom5250Stream(InputStream inStream) throws IOException, XI5250Exception {
ivRow = Math.max(0, inStream.read());
ivCol = Math.max(0, inStream.read());
// Cannot deal with real dimensions, since they can be not applied yet
if (ivRow <= 0 || ivRow > XI5250Emulator.MAX_ROWS ||
ivCol <= 0 || ivCol > XI5250Emulator.MAX_COLS)
throw new XI5250Exception("Invalid screen coord: " + ivRow + "," + ivCol,
XI5250Emulator.ERR_INVALID_ROW_COL_ADDR);
}
@Override
protected void execute() {
ivEmulator.setSBA(ivCol - 1, ivRow - 1);
}
@Override
public String toString() {
return super.toString() + " [" + ivRow + "," + ivCol + "]";
}
}

View file

@ -0,0 +1,106 @@
/*
Copyright 2007 Infordata S.p.A.
Licensed under the Apache License, Version 2.0 (the "License");
you may not use this file except in compliance with the License.
You may obtain a copy of the License at
http://www.apache.org/licenses/LICENSE-2.0
Unless required by applicable law or agreed to in writing, software
distributed under the License is distributed on an "AS IS" BASIS,
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
See the License for the specific language governing permissions and
limitations under the License.
*/
/*
!!V 04/06/97 rel. 1.00b- uses XI5250Emulator create5250Field factory method.
***
30/06/98 rel. _.___- Swing, JBuilder2 e VSS.
*/
package net.infordata.em.tn5250;
import java.io.IOException;
import java.io.InputStream;
import net.infordata.em.tnprot.XITelnet;
///////////////////////////////////////////////////////////////////////////////
/**
* 5250 SF Order
*
* @version
* @author Valentino Proietti - Infordata S.p.A.
*/
public class XISFOrd extends XI5250Ord {
protected byte[] FFW = new byte[2];
protected byte[] FCW = new byte[2];
protected byte ivScreenAttr;
protected int ivFieldLen;
@Override
protected void readFrom5250Stream(InputStream inStream) throws IOException {
byte bb;
inStream.mark(1);
bb = (byte)Math.max(0, inStream.read());
// check if FFW is present
if ((bb & 0xC0) == 0x40) {
FFW[0] = bb;
FFW[1] = (byte)Math.max(0, inStream.read());
inStream.mark(1);
bb = (byte)Math.max(0, inStream.read());
// check if FCW is present
if ((bb & 0xC0) == 0x80) {
FCW[0] = bb;
FCW[1] = (byte)Math.max(0, inStream.read());
}
else
inStream.reset();
}
else
inStream.reset();
ivScreenAttr = (byte)Math.max(0, inStream.read());
ivFieldLen = (Math.max(0, inStream.read()) << 8) + Math.max(0, inStream.read());
//!!V effettuare check dei parametri
}
@Override
protected void execute() {
if (ivScreenAttr != 0) {
//NO ivEmulator.setDefAttr(XITelnet.toInt(ivScreenAttr));
ivEmulator.drawString(String.valueOf(XI5250Emulator.ATTRIBUTE_PLACE_HOLDER),
ivEmulator.getSBACol(), ivEmulator.getSBARow(),
ivScreenAttr);
ivEmulator.setSBA(ivEmulator.getSBA() + 1);
}
// -1 to force attribute reload
ivEmulator.addField(ivEmulator.create5250Field((byte[])FFW.clone(),
(byte[])FCW.clone(),
ivEmulator.getSBACol(),
ivEmulator.getSBARow(),
ivFieldLen, -1));
}
@Override
public String toString() {
return super.toString() + " [FFW=[" + XITelnet.toHex(FFW[0]) + "," +
XITelnet.toHex(FFW[1]) + "]," +
"FCW=[" + XITelnet.toHex(FCW[0]) + "," +
XITelnet.toHex(FCW[1]) + "]," +
XITelnet.toHex(ivScreenAttr) + "," + ivFieldLen + "]";
}
}

View file

@ -0,0 +1,102 @@
/*
Copyright 2007 Infordata S.p.A.
Licensed under the Apache License, Version 2.0 (the "License");
you may not use this file except in compliance with the License.
You may obtain a copy of the License at
http://www.apache.org/licenses/LICENSE-2.0
Unless required by applicable law or agreed to in writing, software
distributed under the License is distributed on an "AS IS" BASIS,
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
See the License for the specific language governing permissions and
limitations under the License.
*/
/*
***
30/06/98 rel. _.___- Swing, JBuilder2 e VSS.
*/
package net.infordata.em.tn5250;
import java.io.IOException;
import java.io.InputStream;
import net.infordata.em.tnprot.XITelnet;
///////////////////////////////////////////////////////////////////////////////
/**
* 5250 SOH Order
*
* @version
* @author Valentino Proietti - Infordata S.p.A.
*/
public class XISOHOrd extends XI5250Ord {
protected byte[] ivData;
protected int ivLen;
/**
* @exception XI5250Exception raised if order parameters are wrong.
*/
@Override
protected void readFrom5250Stream(InputStream inStream)
throws IOException, XI5250Exception {
int i = 0;
int bb;
ivLen = inStream.read();
if (ivLen > 0) {
ivData = new byte[ivLen];
for (i = 0; (i < ivLen) && ((bb = inStream.read()) != -1); i++)
ivData[i] = (byte)bb;
}
// parameters check
if (ivLen < 0 || ivLen > 7 || i < ivLen)
throw new XI5250Exception("Bad SOH Order", XI5250Emulator.ERR_INVALID_SOH_LENGTH);
}
@Override
protected void execute() {
// I didn' t found them on docs, but i need them
ivEmulator.ivCmdList.ivICOrderExecuted = false;
ivEmulator.removeFields();
ivEmulator.ivPendingCmd = null; //!!0.92a
if (ivLen >= 2) {
// resequencing byte present
if (ivLen >= 3) {
// error line address present
if (ivLen >= 4) {
ivEmulator.setErrorRow(ivData[3] - 1);
// function keys mask present
if (ivLen >= 7) {
int xx = XITelnet.toInt(ivData[4]) << 16 | //!!1.05a
XITelnet.toInt(ivData[5]) << 8 |
XITelnet.toInt(ivData[6]);
ivEmulator.setFunctionKeysMask(xx);
}
}
}
}
}
@Override
public String toString() {
String str = "";
for (int i = 0; i < ivLen; i++)
str += XITelnet.toHex(ivData[i]) + ",";
return super.toString() + " [" + ivLen + ",[" + str + "]]";
}
}

View file

@ -0,0 +1,57 @@
/*
Copyright 2007 Infordata S.p.A.
Licensed under the Apache License, Version 2.0 (the "License");
you may not use this file except in compliance with the License.
You may obtain a copy of the License at
http://www.apache.org/licenses/LICENSE-2.0
Unless required by applicable law or agreed to in writing, software
distributed under the License is distributed on an "AS IS" BASIS,
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
See the License for the specific language governing permissions and
limitations under the License.
*/
/*
***
30/06/98 rel. _.___- Swing, JBuilder2 e VSS.
*/
package net.infordata.em.tn5250;
import java.io.IOException;
import java.io.InputStream;
///////////////////////////////////////////////////////////////////////////////
/**
* 5250 Save screen command
*
* @version
* @author Valentino Proietti - Infordata S.p.A.
*/
public class XISaveScreenCmd extends XI5250Cmd {
@Override
protected void readFrom5250Stream(InputStream inStream) throws IOException {
}
@Override
protected void execute() {
/*!!1.06a
int pos = ivEmulator.ivSavedScreenList.size();
ivEmulator.ivSavedScreenList.addElement(ivEmulator.createMemento());
*/
//!!1.06a
int pos = (ivEmulator.ivSavedScreensIdx++) % ivEmulator.ivSavedScreens.length;
ivEmulator.ivSavedScreens[pos] = ivEmulator.createMemento();
ivEmulator.send5250SavedScreen(pos);
}
}

View file

@ -0,0 +1,90 @@
/*
Copyright 2007 Infordata S.p.A.
Licensed under the Apache License, Version 2.0 (the "License");
you may not use this file except in compliance with the License.
You may obtain a copy of the License at
http://www.apache.org/licenses/LICENSE-2.0
Unless required by applicable law or agreed to in writing, software
distributed under the License is distributed on an "AS IS" BASIS,
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
See the License for the specific language governing permissions and
limitations under the License.
*/
/*
***
30/06/98 rel. _.___- Swing, JBuilder2 e VSS.
*/
package net.infordata.em.tn5250;
import java.io.IOException;
import java.io.InputStream;
import net.infordata.em.crt5250.XIEbcdicTranslator;
import net.infordata.em.tnprot.XITelnet;
///////////////////////////////////////////////////////////////////////////////
/**
* TD - Transparent data
*
* see: http://publibfp.boulder.ibm.com/cgi-bin/bookmgr/BOOKS/co2e2001/15.6.10?DT=19950629163252
*
* @version
* @author Valentino Proietti - Infordata S.p.A.
*/
public class XITDOrd extends XI5250Ord {
protected String ivData;
protected int ivLen;
/**
* @exception XI5250Exception raised if order parameters are wrong.
*/
@Override
protected void readFrom5250Stream(InputStream inStream)
throws IOException, XI5250Exception {
{
byte[] buf = new byte[2];
if (inStream.read(buf) < buf.length)
throw new XI5250Exception("EOF reached", XI5250Emulator.ERR_INVALID_ROW_COL_ADDR);
ivLen = (XITelnet.toInt(buf[0]) << 8) | XITelnet.toInt(buf[1]);
// Cannot deal with real dimensions, since they can be not applied yet
if (ivLen < 0 || ivLen > (XI5250Emulator.MAX_ROWS * XI5250Emulator.MAX_COLS))
throw new XI5250Exception("Invalid len", XI5250Emulator.ERR_INVALID_ROW_COL_ADDR);
}
{
byte[] buf = new byte[ivLen];
int count = inStream.read(buf);
if (count < buf.length)
throw new XI5250Exception("EOF reached, requested: " + ivLen +
" readden:" + count, XI5250Emulator.ERR_INVALID_ROW_COL_ADDR);
XIEbcdicTranslator translator = ivEmulator.getTranslator();
StringBuilder sb = new StringBuilder(ivLen);
for (int i = 0; i < count ; i++) {
sb.append(translator.toChar(buf[i]));
}
ivData = sb.toString();
}
}
@Override
protected void execute() {
ivEmulator.drawString(ivData, ivEmulator.getSBACol(), ivEmulator.getSBARow());
ivEmulator.setSBA(ivEmulator.getSBA() + ivData.length());
}
@Override
public String toString() {
return super.toString() + " [" + ivLen + ",\"" + ivData + "\"" + "]";
}
}

View file

@ -0,0 +1,82 @@
/*
Copyright 2007 Infordata S.p.A.
Licensed under the Apache License, Version 2.0 (the "License");
you may not use this file except in compliance with the License.
You may obtain a copy of the License at
http://www.apache.org/licenses/LICENSE-2.0
Unless required by applicable law or agreed to in writing, software
distributed under the License is distributed on an "AS IS" BASIS,
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
See the License for the specific language governing permissions and
limitations under the License.
*/
/*
***
30/06/98 rel. _.___- Swing, JBuilder2 e VSS.
*/
package net.infordata.em.tn5250;
import java.io.IOException;
import java.io.InputStream;
import net.infordata.em.tnprot.XITelnet;
///////////////////////////////////////////////////////////////////////////////
/**
* WEA - Write extended attribute
* TODO
*
* see: http://publibfp.boulder.ibm.com/cgi-bin/bookmgr/BOOKS/co2e2001/15.6.11?DT=19950629163252
*
* @version
* @author Valentino Proietti - Infordata S.p.A.
*/
public class XIWEAOrd extends XI5250Ord {
protected byte ivAttributeType;
protected byte ivAttribute;
/**
* @exception XI5250Exception raised if order parameters are wrong.
*/
@Override
protected void readFrom5250Stream(InputStream inStream)
throws IOException, XI5250Exception {
// If not in enhanced mode ...
if (true)
throw new XI5250Exception("Not supported", XI5250Emulator.ERR_INVALID_ROW_COL_ADDR);
{
byte[] buf = new byte[2];
if (inStream.read(buf) < buf.length)
throw new XI5250Exception("EOF reached", XI5250Emulator.ERR_INVALID_EXT_ATTR_TYPE);
ivAttributeType = buf[0];
ivAttribute = buf[1];
if (ivAttributeType != 0x01 && ivAttributeType != 0x03 && ivAttributeType != 0x05)
throw new XI5250Exception("Invalid attr type: " + XITelnet.toHex(ivAttributeType),
XI5250Emulator.ERR_INVALID_EXT_ATTR_TYPE);
}
}
@Override
protected void execute() {
//TODO
throw new IllegalStateException("Not supported");
}
@Override
public String toString() {
return super.toString() + " [" + XITelnet.toHex(ivAttributeType) + "," +
XITelnet.toHex(ivAttribute) + "]";
}
}

View file

@ -0,0 +1,65 @@
/*
Copyright 2007 Infordata S.p.A.
Licensed under the Apache License, Version 2.0 (the "License");
you may not use this file except in compliance with the License.
You may obtain a copy of the License at
http://www.apache.org/licenses/LICENSE-2.0
Unless required by applicable law or agreed to in writing, software
distributed under the License is distributed on an "AS IS" BASIS,
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
See the License for the specific language governing permissions and
limitations under the License.
*/
/*
***
30/06/98 rel. _.___- Swing, JBuilder2 e VSS.
*/
package net.infordata.em.tn5250;
import java.io.IOException;
import java.io.InputStream;
///////////////////////////////////////////////////////////////////////////////
/**
* WDSF - Write to Display Structured Field
* TODO
*
* see: http://publibfp.boulder.ibm.com/cgi-bin/bookmgr/BOOKS/co2e2001/15.6.13?DT=19950629163252
*
* @version
* @author Valentino Proietti - Infordata S.p.A.
*/
public class XIWdsfOrd extends XI5250Ord {
/**
* @exception XI5250Exception raised if order parameters are wrong.
*/
@Override
protected void readFrom5250Stream(InputStream inStream)
throws IOException, XI5250Exception {
// If not in enhanced mode ...
if (true)
throw new XI5250Exception("Not supported", XI5250Emulator.ERR_INVALID_ROW_COL_ADDR);
}
@Override
protected void execute() {
throw new IllegalStateException("Not supported");
}
@Override
public String toString() {
return super.toString();
}
}

View file

@ -0,0 +1,64 @@
/*
Copyright 2007 Infordata S.p.A.
Licensed under the Apache License, Version 2.0 (the "License");
you may not use this file except in compliance with the License.
You may obtain a copy of the License at
http://www.apache.org/licenses/LICENSE-2.0
Unless required by applicable law or agreed to in writing, software
distributed under the License is distributed on an "AS IS" BASIS,
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
See the License for the specific language governing permissions and
limitations under the License.
*/
/*
!!V 12/05/97 rel. 0.95d- setDefAttr() to 0x20.
***
30/06/98 rel. _.___- Swing, JBuilder2 e VSS.
*/
package net.infordata.em.tn5250;
import java.io.IOException;
import java.io.InputStream;
///////////////////////////////////////////////////////////////////////////////
/**
* 5250 Write error code command
*
* @version
* @author Valentino Proietti - Infordata S.p.A.
*/
public class XIWriteErrorCodeCmd extends XI5250Cmd {
protected XI5250OrdList ivOrdList;
/**
* @exception XI5250Exception raised if command parameters are wrong.
*/
@Override
protected void readFrom5250Stream(InputStream inStream)
throws IOException, XI5250Exception {
ivOrdList = ivEmulator.createOrdList(ivEmulator);
ivOrdList.readFrom5250Stream(inStream);
}
@Override
protected void execute() {
ivEmulator.setState(XI5250Emulator.ST_PRE_HELP);
ivEmulator.setDefAttr(0x20); //!!0.95d
ivEmulator.setSBA(0, ivEmulator.getErrorRow());
ivOrdList.execute();
}
}

View file

@ -0,0 +1,97 @@
/*
Copyright 2007 Infordata S.p.A.
Licensed under the Apache License, Version 2.0 (the "License");
you may not use this file except in compliance with the License.
You may obtain a copy of the License at
http://www.apache.org/licenses/LICENSE-2.0
Unless required by applicable law or agreed to in writing, software
distributed under the License is distributed on an "AS IS" BASIS,
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
See the License for the specific language governing permissions and
limitations under the License.
*/
/*
***
30/06/98 rel. _.___- Swing, JBuilder2 e VSS.
*/
package net.infordata.em.tn5250;
import java.io.IOException;
import java.io.InputStream;
import java.util.Iterator;
import net.infordata.em.crt5250.XI5250Field;
///////////////////////////////////////////////////////////////////////////////
/**
* 5250 write to display command
*
* @version
* @author Valentino Proietti - Infordata S.p.A.
*/
public class XIWriteToDisplayCmd extends XICCCmd {
protected XI5250OrdList ivOrdList;
/**
* @exception XI5250Exception raised if command parameters are wrong.
*/
@Override
protected void readFrom5250Stream(InputStream inStream)
throws IOException, XI5250Exception {
readCC(inStream);
ivOrdList = ivEmulator.createOrdList(ivEmulator);
ivOrdList.readFrom5250Stream(inStream);
}
/**
*/
@Override
protected void execute() {
//ivEmulator.setSBA(0, 0);
executeCC1();
// if format table is going to be altered then enter NORMAL_LOCKED state
if (ivOrdList.isOrderPresent(XI5250Emulator.ORD_SF) ||
ivOrdList.isOrderPresent(XI5250Emulator.ORD_SOH)) {
ivEmulator.setState(XI5250Emulator.ST_NORMAL_LOCKED);
}
ivOrdList.execute();
if (ivEmulator.getState() != XI5250Emulator.ST_NORMAL_UNLOCKED) {
//if (!ivOrdList.isOrderPresent(XI5250Emulator.ORD_IC))
if (!ivEmulator.ivCmdList.ivICOrderExecuted) {
// search first not bypass field
XI5250Field field;
boolean found = false;
for (Iterator<XI5250Field> e = ivEmulator.getFields().iterator(); e.hasNext(); ) {
field = e.next();
if (!field.isBypassField()) {
ivEmulator.setCursorPos(field.getCol(), field.getRow());
found = true;
break;
}
}
if (!found)
ivEmulator.setCursorPos(0, 0);
}
}
executeCC2();
}
}

Binary file not shown.

After

Width:  |  Height:  |  Size: 166 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 160 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 186 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 221 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 165 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 225 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 140 B

View file

@ -0,0 +1,28 @@
# tn5250
TXT_Copy = Copy
TXT_Options = &Options
TXT_RefCursor = Ref. cursor
TXT_Exit = Exit
TXT_Paste = Paste
TXT_Edit = &Edit
TXT_3dFx = 3dFx
TXT_About = About
TXT_ConfirmExit = Confirm exit
TXT_Communications = &Communications
TXT_Connect = Connect
TXT_Disconnect = Disconnect
TXT_ConfirmDisconnect = Close connection
TXT_HostNameInput = Enter host-name or ip-address
TXT_InFrame = Emulator in window
TXT_SnapShot = Snap-shot
TXT_Print = Print
TXT_Forked = Forked from %1s by %2s
TXT_Version = Version %1s

View file

@ -0,0 +1,27 @@
# tn5250
TXT_Copy = Copier
TXT_Options = &Options
TXT_RefCursor = Réf. curseur
TXT_Exit = Quitter
TXT_Paste = Coller
TXT_Edit = &Editer
TXT_3dFx = Effets 3D
TXT_About = A propos
TXT_ConfirmExit = Confirmer clôture
TXT_Communications = &Communications
TXT_Connect = Connecter
TXT_Disconnect = Déconnecter
TXT_ConfirmDisconnect = Fermer la connexion
TXT_HostNameInput = Entrer adresse ip ou nom serveur
TXT_InFrame = Emulateur dans une fenêtre
TXT_SnapShot = Copie-écran
TXT_Print = Imprimer
TXT_Forked = Un fork du projet %1s de %2s
TXT_Version = Version %1s

View file

@ -0,0 +1,26 @@
# tn5250
TXT_Copy = Copia
TXT_Options = &Opzioni
TXT_RefCursor = Cursore di riferimento
TXT_Exit = Chiudi
TXT_Paste = Incolla
TXT_Edit = &Modifica
TXT_3dFx = 3dFx
TXT_About = Informazioni
TXT_ConfirmExit = Confermi chiusura
TXT_Communications = &Collegamento
TXT_Connect = Connetti
TXT_Disconnect = Disconnetti
TXT_ConfirmDisconnect = Chiudo connessione
TXT_HostNameInput = Immetti nome host o indirizzo IP
TXT_InFrame = Emulatore in finestra
TXT_SnapShot = Foto pannello
TXT_Print = Stampa pannello

Binary file not shown.

After

Width:  |  Height:  |  Size: 926 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 227 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 151 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 254 B

View file

@ -0,0 +1,115 @@
package net.infordata.em.tn5250ext;
import java.awt.Font;
import java.awt.Insets;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.KeyEvent;
import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;
import javax.swing.JButton;
import net.infordata.em.crt.XICrt;
import net.infordata.em.crt5250.XI5250Field;
/**
*/
public class PSHBTNCHCHandler extends XI5250PanelHandler {
private PSHBTNCHCHandler.FontsCache ivFontsCache;
private List<JButton> ivButtons = new ArrayList<JButton>();
public PSHBTNCHCHandler(XI5250PanelsDispatcher disp) {
super(disp, "");
}
@Override
protected void sizeChanged() {
super.sizeChanged();
final XI5250EmulatorExt em = getEmulator();
for (JButton btn : ivButtons) {
btn.setFont(ivFontsCache.getFont(
Math.max(1, em.getFont().getSize() - 2)));
}
}
@Override
protected boolean detailedTest() {
return true;
}
@Override
protected void start() {
ivButtons.clear();
final XI5250EmulatorExt em = getEmulator();
final int crtWidth = em.getCrtSize().width;
for (Iterator<XI5250Field> e = getFields().iterator(); e.hasNext(); ) {
final XI5250Field field = e.next();
if (field.isIOOnly()) {
final int col = field.getCol() - 1;
final int row = field.getRow();
if (col >= 0 &&
"<".equals(em.getString(col, row, 1))) {
final int len;
{
final int fieldEnd = col + field.getLength();
String str = em.getString(fieldEnd + 1, row, crtWidth - fieldEnd);
int idx = str.indexOf(">");
len = (idx < 0) ? -1 : idx + 2 + 1;
}
if (len > 0) {
final String txt = em.getString(col + 1, row, len - 2);
JButton btn = new JButton(txt);
if (ivFontsCache == null)
ivFontsCache = new FontsCache(btn.getFont());
btn.setFont(ivFontsCache.getFont(Math.max(1, em.getFont().getSize() - 2)));
btn.setMargin(new Insets(2, 2, 2, 2));
btn.setFocusable(false);
btn.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e) {
em.setCursorPos(field.getCol(), field.getRow());
em.requestFocusInWindow();
em.processRawKeyEvent(new KeyEvent(em, KeyEvent.KEY_PRESSED, 0,
0, KeyEvent.VK_ENTER, (char)KeyEvent.VK_ENTER));
}
});
ivButtons.add(btn);
new XI5250PanelConnection(this,
btn, col, row, len, 1);
}
}
}
}
}
@Override
protected void stop() {
ivButtons.clear();
}
///////
private static class FontsCache {
private Font[] ivFonts = new Font[XICrt.MAX_FONT_SIZE - XICrt.MIN_FONT_SIZE + 1];
private Font ivFont;
public FontsCache(Font font) {
ivFont = font;
}
public Font getFont(int size) {
if (ivFonts[size - XICrt.MIN_FONT_SIZE] == null) {
ivFonts[size - XICrt.MIN_FONT_SIZE] =
new Font(ivFont.getName(),
ivFont.getStyle(),
size);
}
return ivFonts[size - XICrt.MIN_FONT_SIZE];
}
}
}

View file

@ -0,0 +1,184 @@
package net.infordata.em.tn5250ext;
import java.awt.Font;
import java.awt.Insets;
import java.awt.SystemColor;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.KeyEvent;
import java.awt.event.WindowAdapter;
import java.awt.event.WindowEvent;
import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;
import javax.swing.JButton;
import javax.swing.JMenuItem;
import javax.swing.JPopupMenu;
import net.infordata.em.crt.XICrt;
import net.infordata.em.crt5250.XI5250Field;
import net.infordata.em.tn5250.XI5250Emulator;
import net.infordata.em.tn5250.XI5250Frame;
public class Test {
private Test() { }
/**
* @param args
*/
public static void main(String[] argv) {
XI5250EmulatorExt em = new XI5250EmulatorExt();
em.setTerminalType("IBM-3477-FC");
em.setKeyboardQueue(true);
em.setHintOnActiveField(true);
XI5250PanelsDispatcher disp = new XI5250SimplePanelsDispatcher(em);
new TestHandler(disp);
if (argv.length >= 1) {
em.setHost(argv[0]);
em.setActive(true);
}
XI5250Frame frm = new XI5250Frame("tn5250ext" + " " +
XI5250Emulator.VERSION, em);
//3D FX
if (argv.length >= 2 && "3DFX".equals(argv[1].toUpperCase())) {
em.setDefFieldsBorderStyle(XI5250Field.LOWERED_BORDER);
em.setDefBackground(SystemColor.control);
}
frm.addWindowListener(new WindowAdapter() {
@Override
public void windowClosed(WindowEvent e) {
System.exit(0);
}
});
frm.setBounds(0, 0, 570, 510);
frm.centerOnScreen();
frm.setVisible(true);
}
//////////////////////////////////////////////////////////////////////////////
/**
*/
private static class TestHandler extends XI5250PanelHandler {
private FontsCache ivFontsCache;
private List<JButton> ivButtons = new ArrayList<JButton>();
public TestHandler(XI5250PanelsDispatcher disp) {
super(disp, "");
}
@Override
protected void sizeChanged() {
super.sizeChanged();
final XI5250EmulatorExt em = getEmulator();
for (JButton btn : ivButtons) {
btn.setFont(ivFontsCache.getFont(
Math.max(1, em.getFont().getSize() - 2)));
}
}
@Override
protected boolean detailedTest() {
return true;
}
@Override
protected void start() {
ivButtons.clear();
final XI5250EmulatorExt em = getEmulator();
final int crtWidth = em.getCrtSize().width;
for (Iterator<XI5250Field> e = getFields().iterator(); e.hasNext(); ) {
final XI5250Field field = e.next();
boolean isButton = false;
if (field.isIOOnly()) {
final int col = field.getCol() - 1;
final int row = field.getRow();
if (col >= 0 &&
"<".equals(em.getString(col, row, 1))) {
final int len;
{
final int fieldEnd = col + field.getLength();
String str = em.getString(fieldEnd + 1, row, crtWidth - fieldEnd);
int idx = str.indexOf(">");
len = (idx < 0) ? -1 : idx + 2 + 1;
}
if (len > 0) {
isButton = true;
final String txt = em.getString(col + 1, row, len - 2);
JButton btn = new JButton(txt);
if (ivFontsCache == null)
ivFontsCache = new FontsCache(btn.getFont());
btn.setFont(ivFontsCache.getFont(Math.max(1, em.getFont().getSize() - 2)));
btn.setMargin(new Insets(2, 2, 2, 2));
btn.setFocusable(false);
btn.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e) {
em.setCursorPos(field.getCol(), field.getRow());
em.requestFocusInWindow();
em.processRawKeyEvent(new KeyEvent(em, KeyEvent.KEY_PRESSED, 0,
0, KeyEvent.VK_ENTER, (char)KeyEvent.VK_ENTER));
}
});
ivButtons.add(btn);
new XI5250PanelConnection(this,
btn, col, row, len, 1);
}
}
}
if (!isButton) {
setFieldHint(field, new XIHint(field.toString()));
JPopupMenu pm = new JPopupMenu();
pm.add(new JMenuItem(field.toString()));
setFieldPopupMenu(field, pm);
JButton btn = new JButton();
new XI5250FieldConnection(this, field, btn);
}
new XI5250PanelConnection(this,
new JButton("+-"),
15, 15, 10, 6);
}
}
@Override
protected void stop() {
ivButtons.clear();
}
}
///////
private static class FontsCache {
private Font[] ivFonts = new Font[XICrt.MAX_FONT_SIZE - XICrt.MIN_FONT_SIZE + 1];
private Font ivFont;
public FontsCache(Font font) {
ivFont = font;
}
public Font getFont(int size) {
if (ivFonts[size - XICrt.MIN_FONT_SIZE] == null) {
ivFonts[size - XICrt.MIN_FONT_SIZE] =
new Font(ivFont.getName(),
ivFont.getStyle(),
size);
}
return ivFonts[size - XICrt.MIN_FONT_SIZE];
}
}
}

View file

@ -0,0 +1,74 @@
/*
Copyright 2007 Infordata S.p.A.
Licensed under the Apache License, Version 2.0 (the "License");
you may not use this file except in compliance with the License.
You may obtain a copy of the License at
http://www.apache.org/licenses/LICENSE-2.0
Unless required by applicable law or agreed to in writing, software
distributed under the License is distributed on an "AS IS" BASIS,
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
See the License for the specific language governing permissions and
limitations under the License.
*/
package net.infordata.em.tn5250ext;
import net.infordata.em.tn5250.XI5250Applet;
public class XI5250AppletExt extends XI5250Applet {
private static final long serialVersionUID = 1L;
@Override
protected XI5250EmulatorExt createEmulator() {
return new XI5250EmulatorExt();
}
@Override
public void init() {
super.init();
final boolean pPSHBTNCHC = "true".equalsIgnoreCase(getParameter("PSHBTNCHC"));
if (pPSHBTNCHC) {
XI5250EmulatorExt emext = getEmulatorExt();
PanelsDispatcher disp = new PanelsDispatcher();
disp.setEmulator(emext);
new PSHBTNCHCHandler(disp);
}
}
/**
*/
public final XI5250EmulatorExt getEmulatorExt() {
return (XI5250EmulatorExt)super.getEmulator();
}
//////
private static class PanelsDispatcher extends XI5250PanelsDispatcher {
private XI5250PanelHandler ivHandler;
@Override
public synchronized void addPanelHandler(XI5250PanelHandler panel) {
if (ivHandler != null)
throw new IllegalArgumentException("Handler already setted");
ivHandler = panel;
}
@Override
protected synchronized XI5250PanelHandler getCurrentPanelHandler() {
return ivHandler;
}
@Override
public synchronized void removePanelHandler(XI5250PanelHandler panel) {
if (ivHandler != panel)
throw new IllegalArgumentException("Not the registered handler " + panel);
ivHandler = null;
}
}
}

View file

@ -0,0 +1,147 @@
/*
Copyright 2007 Infordata S.p.A.
Licensed under the Apache License, Version 2.0 (the "License");
you may not use this file except in compliance with the License.
You may obtain a copy of the License at
http://www.apache.org/licenses/LICENSE-2.0
Unless required by applicable law or agreed to in writing, software
distributed under the License is distributed on an "AS IS" BASIS,
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
See the License for the specific language governing permissions and
limitations under the License.
*/
/*
!!V 09/09/97 rel. 1.04c- creation.
24/09/97 rel. 1.05 - DNCX project.
***
10/07/98 rel. _.___- Swing, JBuilder2 e VSS.
*/
package net.infordata.em.tn5250ext;
import java.io.Serializable;
import java.util.ArrayList;
import java.util.Iterator;
import net.infordata.em.tn5250.XI5250Emulator;
/**
* THE 5250 EMULATOR extension.
*
* @version
* @author Valentino Proietti - Infordata S.p.A.
*/
public class XI5250EmulatorExt extends XI5250Emulator implements Serializable {
private static final long serialVersionUID = 1L;
private boolean ivShowHints = true;
private boolean ivHintOnActiveField = false;
transient private ArrayList<XI5250PanelsDispatcher> ivDispatchers =
new ArrayList<XI5250PanelsDispatcher>();
public static final String SHOW_HINTS = "showHints";
public static final String HINT_ON_ACTIVE_FIELD = "hintOnActiveField";
/**
* Default contructor.
*/
public XI5250EmulatorExt() {
}
/**
*/
protected synchronized void addDispatcher(XI5250PanelsDispatcher aDispatcher) {
if (!ivDispatchers.contains(aDispatcher))
ivDispatchers.add(aDispatcher);
}
/**
*/
protected synchronized void removeDispatcher(XI5250PanelsDispatcher aDispatcher) {
ivDispatchers.remove(aDispatcher);
}
/**
*/
protected synchronized void refreshHint() {
XI5250PanelsDispatcher disp;
XI5250PanelHandler hndl;
for (Iterator<XI5250PanelsDispatcher> en = ivDispatchers.iterator(); en.hasNext(); ) {
disp = en.next();
hndl = disp.getCurrentPanelHandler();
if (hndl != null)
hndl.refreshHint();
}
}
/**
* Enables or disables the fields hints showing (default true).
*/
public void setShowHints(boolean aFlag) {
if (ivShowHints == aFlag)
return;
boolean oldShowHints = ivShowHints;
ivShowHints = aFlag;
//!!1.04d refreshHint();
firePropertyChange(SHOW_HINTS, oldShowHints, ivShowHints);
}
/**
*/
public boolean getShowHints() {
return ivShowHints;
}
/**
*/
public void setHintOnActiveField(boolean aFlag) {
if (ivHintOnActiveField == aFlag)
return;
boolean oldHintOnActiveField = ivHintOnActiveField;
ivHintOnActiveField = aFlag;
//!!1.04d refreshHint();
firePropertyChange(HINT_ON_ACTIVE_FIELD,
oldHintOnActiveField, ivHintOnActiveField);
}
/**
*/
public boolean isHintOnActiveField() {
return ivHintOnActiveField;
}
// /**
// */
// void writeObject(ObjectOutputStream oos) throws IOException {
// oos.defaultWriteObject();
// }
//
// void readObject(ObjectInputStream ois) throws ClassNotFoundException, IOException {
// ois.defaultReadObject();
// }
}

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