*
* The MIT License (MIT)
*
- * Copyright (C) 2017 Kevin Lamonte
+ * Copyright (C) 2019 Kevin Lamonte
*
* Permission is hereby granted, free of charge, to any person obtaining a
* copy of this software and associated documentation files (the "Software"),
public class CellAttributes {
// ------------------------------------------------------------------------
- // Variables --------------------------------------------------------------
+ // Constants --------------------------------------------------------------
// ------------------------------------------------------------------------
/**
* Bold attribute.
*/
- private boolean bold;
+ private static final int BOLD = 0x01;
/**
* Blink attribute.
*/
- private boolean blink;
+ private static final int BLINK = 0x02;
/**
* Reverse attribute.
*/
- private boolean reverse;
+ private static final int REVERSE = 0x04;
/**
* Underline attribute.
*/
- private boolean underline;
+ private static final int UNDERLINE = 0x08;
/**
* Protected attribute.
*/
- private boolean protect;
+ private static final int PROTECT = 0x10;
+
+
+ // ------------------------------------------------------------------------
+ // Variables --------------------------------------------------------------
+ // ------------------------------------------------------------------------
+
+ /**
+ * Boolean flags.
+ */
+ private int flags = 0;
/**
* Foreground color. Color.WHITE, Color.RED, etc.
*/
- private Color foreColor;
+ private Color foreColor = Color.WHITE;
/**
* Background color. Color.WHITE, Color.RED, etc.
*/
- private Color backColor;
+ private Color backColor = Color.BLACK;
+
+ /**
+ * Foreground color as 24-bit RGB value. Negative value means not set.
+ */
+ private int foreColorRGB = -1;
+
+ /**
+ * Background color as 24-bit RGB value. Negative value means not set.
+ */
+ private int backColorRGB = -1;
// ------------------------------------------------------------------------
// Constructors -----------------------------------------------------------
* @see #reset()
*/
public CellAttributes() {
- reset();
+ // NOP
}
/**
* @return bold value
*/
public final boolean isBold() {
- return bold;
+ return ((flags & BOLD) == 0 ? false : true);
}
/**
* @param bold new bold value
*/
public final void setBold(final boolean bold) {
- this.bold = bold;
+ if (bold) {
+ flags |= BOLD;
+ } else {
+ flags &= ~BOLD;
+ }
}
/**
* @return blink value
*/
public final boolean isBlink() {
- return blink;
+ return ((flags & BLINK) == 0 ? false : true);
}
/**
* @param blink new blink value
*/
public final void setBlink(final boolean blink) {
- this.blink = blink;
+ if (blink) {
+ flags |= BLINK;
+ } else {
+ flags &= ~BLINK;
+ }
}
/**
* @return reverse value
*/
public final boolean isReverse() {
- return reverse;
+ return ((flags & REVERSE) == 0 ? false : true);
}
/**
* @param reverse new reverse value
*/
public final void setReverse(final boolean reverse) {
- this.reverse = reverse;
+ if (reverse) {
+ flags |= REVERSE;
+ } else {
+ flags &= ~REVERSE;
+ }
}
/**
* @return underline value
*/
public final boolean isUnderline() {
- return underline;
+ return ((flags & UNDERLINE) == 0 ? false : true);
}
/**
* @param underline new underline value
*/
public final void setUnderline(final boolean underline) {
- this.underline = underline;
+ if (underline) {
+ flags |= UNDERLINE;
+ } else {
+ flags &= ~UNDERLINE;
+ }
}
/**
* @return protect value
*/
public final boolean isProtect() {
- return protect;
+ return ((flags & PROTECT) == 0 ? false : true);
}
/**
* @param protect new protect value
*/
public final void setProtect(final boolean protect) {
- this.protect = protect;
+ if (protect) {
+ flags |= PROTECT;
+ } else {
+ flags &= ~PROTECT;
+ }
}
/**
this.backColor = backColor;
}
+ /**
+ * Getter for foreColor RGB.
+ *
+ * @return foreColor value. Negative means unset.
+ */
+ public final int getForeColorRGB() {
+ return foreColorRGB;
+ }
+
+ /**
+ * Setter for foreColor RGB.
+ *
+ * @param foreColorRGB new foreColor RGB value
+ */
+ public final void setForeColorRGB(final int foreColorRGB) {
+ this.foreColorRGB = foreColorRGB;
+ }
+
+ /**
+ * Getter for backColor RGB.
+ *
+ * @return backColor value. Negative means unset.
+ */
+ public final int getBackColorRGB() {
+ return backColorRGB;
+ }
+
+ /**
+ * Setter for backColor RGB.
+ *
+ * @param backColorRGB new backColor RGB value
+ */
+ public final void setBackColorRGB(final int backColorRGB) {
+ this.backColorRGB = backColorRGB;
+ }
+
+ /**
+ * See if this cell uses RGB or ANSI colors.
+ *
+ * @return true if this cell has a RGB color
+ */
+ public final boolean isRGB() {
+ return (foreColorRGB >= 0) || (backColorRGB >= 0);
+ }
+
/**
* Set to default: white foreground on black background, no
* bold/underline/blink/rever/protect.
*/
public void reset() {
- bold = false;
- blink = false;
- reverse = false;
- underline = false;
- protect = false;
- foreColor = Color.WHITE;
- backColor = Color.BLACK;
+ flags = 0;
+ foreColor = Color.WHITE;
+ backColor = Color.BLACK;
+ foreColorRGB = -1;
+ backColorRGB = -1;
}
/**
}
CellAttributes that = (CellAttributes) rhs;
- return ((foreColor == that.foreColor)
+ return ((flags == that.flags)
+ && (foreColor == that.foreColor)
&& (backColor == that.backColor)
- && (bold == that.bold)
- && (reverse == that.reverse)
- && (underline == that.underline)
- && (blink == that.blink)
- && (protect == that.protect));
+ && (foreColorRGB == that.foreColorRGB)
+ && (backColorRGB == that.backColorRGB));
}
/**
int A = 13;
int B = 23;
int hash = A;
- hash = (B * hash) + (bold ? 1 : 0);
- hash = (B * hash) + (blink ? 1 : 0);
- hash = (B * hash) + (underline ? 1 : 0);
- hash = (B * hash) + (reverse ? 1 : 0);
- hash = (B * hash) + (protect ? 1 : 0);
+ hash = (B * hash) + flags;
hash = (B * hash) + foreColor.hashCode();
hash = (B * hash) + backColor.hashCode();
+ hash = (B * hash) + foreColorRGB;
+ hash = (B * hash) + backColorRGB;
return hash;
}
public void setTo(final Object rhs) {
CellAttributes that = (CellAttributes) rhs;
- this.bold = that.bold;
- this.blink = that.blink;
- this.reverse = that.reverse;
- this.underline = that.underline;
- this.protect = that.protect;
- this.foreColor = that.foreColor;
- this.backColor = that.backColor;
+ this.flags = that.flags;
+ this.foreColor = that.foreColor;
+ this.backColor = that.backColor;
+ this.foreColorRGB = that.foreColorRGB;
+ this.backColorRGB = that.backColorRGB;
}
/**
*/
@Override
public String toString() {
- return String.format("%s%s%s on %s", (bold == true ? "bold " : ""),
- (blink == true ? "blink " : ""), foreColor, backColor);
+ if ((foreColorRGB >= 0) || (backColorRGB >= 0)) {
+ return String.format("RGB: #%06x on #%06x",
+ (foreColorRGB & 0xFFFFFF),
+ (backColorRGB & 0xFFFFFF));
+ }
+ return String.format("%s%s%s on %s", (isBold() ? "bold " : ""),
+ (isBlink() ? "blink " : ""), foreColor, backColor);
}
}