Add AttributeOnly fields to generate SA (Set Attribute) orders

This commit is contained in:
Matthew R. Wilson committed 2025-12-11 17:29:59 -08:00
1 parent 83e1a68bb0
commit 6c0b3b038a
2 files changed
+44 -4

No files matched your search

+13 -3
View File
@@ -40,9 +40,19 @@ var screen1 = go3270.Screen{
{Row: 8, Col: 6, Intense: true, Content: "enter"},
{Row: 8, Col: 12, Content: "to submit your name."},
{Row: 10, Col: 0, Intense: true, Color: go3270.Red, Name: "errormsg"}, // a blank field for error messages
{Row: 14, Col: 0, Content: "Detected code page:"},
{Row: 14, Col: 20, Name: "codepage"},
{Row: 15, Col: 0, Content: "The following should be left and right square brackets: [ ]"},
// Demonstrate the AttributeOnly property:
{Row: 12, Col: 0, Content: "Demonstration of AttributeOnly to change format without a new field:"},
{Row: 13, Col: 1, AttributeOnly: true, Color: go3270.Green, Content: "████"},
{Row: 13, Col: 5, AttributeOnly: true, Color: go3270.Yellow, Content: "████"},
{Row: 13, Col: 9, AttributeOnly: true, Color: go3270.Red, Content: "████"},
{Row: 13, Col: 13, AttributeOnly: true, Color: go3270.Red, Highlighting: go3270.Blink, Content: "████"},
// When using extended attributes, need to explicitly reset to defaults, the next field won't necessarily clear the attributes out.
{Row: 13, Col: 17, AttributeOnly: true, Color: go3270.DefaultColor, Highlighting: go3270.DefaultHighlight},
{Row: 15, Col: 0, Content: "Detected code page:"},
{Row: 15, Col: 20, Name: "codepage"},
{Row: 16, Col: 0, Content: "The following should be left and right square brackets: [ ]"},
{Row: 22, Col: 0, Content: "PF3 Exit"},
}
+31 -1
View File
@@ -54,6 +54,24 @@ type Field struct {
// is the default (i.e. no) highlighting.
Highlighting Highlight
// AttributeOnly will cause this "field" (which won't really be a new
// field) to use the SA (Set Attribute) 3270 command to change the color
// and highlighting of the text WITHOUT starting a new field. You can
// create a field at Row 5, Column 10, with AttributeOnly true, and the
// text will start in Roe 5, Column 10 and not skip a space to column 11
// like a new field would when AttributeOnly is false.
//
// If AttributeOnly is true, the Write, Autoskip, Intense, Hidden, and
// NumericOnly properties will have no effect. Only Highlighting and Color
// will affect the output, and will both default to Default (e.g. default
// highlighting and default color) if not specificed in this field.
//
// After using AttributeOnly to change color and highlighting, you may
// need to explicitly use another AttributeOnly "field" to reset to
// defaults, a regular (AttributeOnly = false) field may not end the
// attributes. (See example1.)
AttributeOnly bool
// Name is the name of this field, which is used to get the user-entered
// data. All writeable fields on a screen must have a unique name.
// Protected fields may also have a name to populate them dynamically when
@@ -355,9 +373,21 @@ func sba(row, col, cols int) []byte {
}
// buildField will return either an sf or sfe command depending for the
// field.
// field, or an sa if only setting attributes.
func buildField(f Field) []byte {
var buf bytes.Buffer
if f.AttributeOnly {
buf.WriteByte(0x28) // sa - "set attribute"
// We will always set both highlighting and color bytes
buf.WriteByte(0x41)
buf.WriteByte(byte(f.Highlighting))
buf.WriteByte(0x28) // sa - "set attribute"
buf.WriteByte(0x42)
buf.WriteByte(byte(f.Color))
return buf.Bytes()
}
if f.Color == DefaultColor && f.Highlighting == DefaultHighlight {
// this is a traditional field, issue a normal sf command
buf.WriteByte(0x1d) // sf - "start field"