diff --git a/src/main/java/net/sf/f3270/Terminal.java b/src/main/java/net/sf/f3270/Terminal.java index 2fad089..88831e2 100644 --- a/src/main/java/net/sf/f3270/Terminal.java +++ b/src/main/java/net/sf/f3270/Terminal.java @@ -28,6 +28,7 @@ public class Terminal { private final boolean showTerminalWindow; private static final char MAINFRAME_BLANK_CHAR = '\u0000'; private static final char SINGLE_SPACE = ' '; + private static final String MASKED_VALUE = "****"; public Terminal(final String s3270Path, final String hostname, final int port, final TerminalType type, final TerminalMode mode, final boolean showTerminalWindow) { @@ -202,8 +203,23 @@ public void write(String label, String value, int skip, int matchNumber, MatchMo public void write(FieldIdentifier fieldIdentifier, String value) { assertConnected(); - getInputField(fieldIdentifier).setValue(value); - commandIssued("write", null, buildParameters(fieldIdentifier, value)); + InputField inputField = getInputField(fieldIdentifier); + inputField.setValue(value); + commandIssued("write", null, buildParameters(fieldIdentifier, getMaskedValueIfFieldIsHidden(inputField, value))); + } + + public void write(FieldIdentifier fieldIdentifier, int lineNumber, String value) { + assertConnected(); + InputField inputField = getInputField(fieldIdentifier); + if(!inputField.isMultiline()){ + throw new RuntimeException("write method with Line Number can be used only with multi-line input field"); + } + inputField.setValue(lineNumber, value); + commandIssued("write", null, buildParameters(fieldIdentifier, getMaskedValueIfFieldIsHidden(inputField, value))); + } + + private String getMaskedValueIfFieldIsHidden(InputField inputField, String value) { + return inputField.isHidden()? MASKED_VALUE : value; } /** diff --git a/src/main/java/net/sf/f3270/TerminalWindow.java b/src/main/java/net/sf/f3270/TerminalWindow.java index af2b9c0..eaf87f2 100644 --- a/src/main/java/net/sf/f3270/TerminalWindow.java +++ b/src/main/java/net/sf/f3270/TerminalWindow.java @@ -35,12 +35,14 @@ public class TerminalWindow { - private S3270 s3270; + private static final String MASKED_VALUE = "****"; + private S3270 s3270; private int currentWidth; private int currentHeight; private Style styleInputChanged; private Style styleInput; + private Style styleHidden; private Style styleBlack; private Style styleCommand; @@ -83,6 +85,7 @@ public TerminalWindow(final S3270 s3270) { private void initializeStyles() { styleInputChanged = createStyle(Color.black, Color.red, false); styleInput = createStyle(Color.green, Color.black, false); + styleHidden= createStyle(Color.black, Color.black, false); styleCommand = createStyle(Color.black, Color.white, false); stylePunctuation = createStyle(Color.gray, Color.white, false); styleReturn = createStyle(Color.magenta, Color.white, false); @@ -159,6 +162,10 @@ private void updateFieldsTable() { private Style getStyle(final Field f) { final boolean isInput = f instanceof InputField; + if (f.isHidden()) { + return styleHidden; + } + if (isInput) { final InputField inputField = (InputField) f; if (inputField.isChanged()) { @@ -182,13 +189,6 @@ private Style getStyle(final Field f) { if (f.isIntensified()) { foregroundColor = Color.white; } - - if (f.isHidden()) { - foregroundColor = Color.black; - backgroundColor = Color.black; - isUnderline = false; - } - return createStyle(foregroundColor, backgroundColor, isUnderline); } @@ -325,12 +325,17 @@ public Object getValueAt(final int rowIndex, final int columnIndex) { .isChanged()) ? " *" : ""); } if (columnIndex == 2) { - return "[" + f.getValue().replace('\u0000', ' ') + "]"; + return getMaskedValueIfFieldIsHidden(f); } throw new RuntimeException("unknown column index " + columnIndex); } + private String getMaskedValueIfFieldIsHidden(Field f) { + String value = f.isHidden() ? MASKED_VALUE : f.getValue().replace('\u0000', ' '); + return "[" + value + "]"; + } + public boolean isCellEditable(final int rowIndex, final int columnIndex) { return columnIndex == 2; diff --git a/src/main/java/org/h3270/host/S3270Screen.java b/src/main/java/org/h3270/host/S3270Screen.java index 6fc8d5b..04f3eb1 100644 --- a/src/main/java/org/h3270/host/S3270Screen.java +++ b/src/main/java/org/h3270/host/S3270Screen.java @@ -268,7 +268,7 @@ private char[] decode(String line, final int y, final List fields) { private Field createField(final byte startCode, final int startx, final int starty, final int endx, final int endy, final int color, final int extHighlight) { - if ((startCode & Field.ATTR_PROTECTED) == 0) { + if ((startCode & Field.ATTR_PROTECTED) == 0 || !isFormatted) { return new InputField(this, startCode, startx, starty, endx, endy, color, extHighlight); } else { return new Field(this, startCode, startx, starty, endx, endy, color, extHighlight);