blob: 254b07654b2013ef0ace9f1024ebb3d08ccc8edc [file] [log] [blame]
/*
* Copyright (c) 2002-2018, the original author or authors.
*
* This software is distributable under the BSD license. See the terms of the
* BSD license in the documentation provided with this software.
*
* https://opensource.org/licenses/BSD-3-Clause
*/
package jdk.internal.org.jline.utils;
/**
* Text styling.
*
* @author <a href="mailto:gnodet@gmail.com">Guillaume Nodet</a>
*/
public class AttributedStyle {
public static final int BLACK = 0;
public static final int RED = 1;
public static final int GREEN = 2;
public static final int YELLOW = 3;
public static final int BLUE = 4;
public static final int MAGENTA = 5;
public static final int CYAN = 6;
public static final int WHITE = 7;
public static final int BRIGHT = 8;
static final int F_BOLD = 0x00000001;
static final int F_FAINT = 0x00000002;
static final int F_ITALIC = 0x00000004;
static final int F_UNDERLINE = 0x00000008;
static final int F_BLINK = 0x00000010;
static final int F_INVERSE = 0x00000020;
static final int F_CONCEAL = 0x00000040;
static final int F_CROSSED_OUT = 0x00000080;
static final int F_FOREGROUND = 0x00000100;
static final int F_BACKGROUND = 0x00000200;
static final int F_HIDDEN = 0x00000400;
static final int MASK = 0x000007FF;
static final int FG_COLOR_EXP = 16;
static final int BG_COLOR_EXP = 24;
static final int FG_COLOR = 0xFF << FG_COLOR_EXP;
static final int BG_COLOR = 0xFF << BG_COLOR_EXP;
public static final AttributedStyle DEFAULT = new AttributedStyle();
public static final AttributedStyle BOLD = DEFAULT.bold();
public static final AttributedStyle BOLD_OFF = DEFAULT.boldOff();
public static final AttributedStyle INVERSE = DEFAULT.inverse();
public static final AttributedStyle INVERSE_OFF = DEFAULT.inverseOff();
public static final AttributedStyle HIDDEN = DEFAULT.hidden();
public static final AttributedStyle HIDDEN_OFF = DEFAULT.hiddenOff();
final int style;
final int mask;
public AttributedStyle() {
this(0, 0);
}
public AttributedStyle(AttributedStyle s) {
this(s.style, s.mask);
}
public AttributedStyle(int style, int mask) {
this.style = style;
this.mask = mask & MASK | ((style & F_FOREGROUND) != 0 ? FG_COLOR : 0)
| ((style & F_BACKGROUND) != 0 ? BG_COLOR : 0);
}
public AttributedStyle bold() {
return new AttributedStyle(style | F_BOLD, mask | F_BOLD);
}
public AttributedStyle boldOff() {
return new AttributedStyle(style & ~F_BOLD, mask | F_BOLD);
}
public AttributedStyle boldDefault() {
return new AttributedStyle(style & ~F_BOLD, mask & ~F_BOLD);
}
public AttributedStyle faint() {
return new AttributedStyle(style | F_FAINT, mask | F_FAINT);
}
public AttributedStyle faintOff() {
return new AttributedStyle(style & ~F_FAINT, mask | F_FAINT);
}
public AttributedStyle faintDefault() {
return new AttributedStyle(style & ~F_FAINT, mask & ~F_FAINT);
}
public AttributedStyle italic() {
return new AttributedStyle(style | F_ITALIC, mask | F_ITALIC);
}
public AttributedStyle italicOff() {
return new AttributedStyle(style & ~F_ITALIC, mask | F_ITALIC);
}
public AttributedStyle italicDefault() {
return new AttributedStyle(style & ~F_ITALIC, mask & ~F_ITALIC);
}
public AttributedStyle underline() {
return new AttributedStyle(style | F_UNDERLINE, mask | F_UNDERLINE);
}
public AttributedStyle underlineOff() {
return new AttributedStyle(style & ~F_UNDERLINE, mask | F_UNDERLINE);
}
public AttributedStyle underlineDefault() {
return new AttributedStyle(style & ~F_UNDERLINE, mask & ~F_UNDERLINE);
}
public AttributedStyle blink() {
return new AttributedStyle(style | F_BLINK, mask | F_BLINK);
}
public AttributedStyle blinkOff() {
return new AttributedStyle(style & ~F_BLINK, mask | F_BLINK);
}
public AttributedStyle blinkDefault() {
return new AttributedStyle(style & ~F_BLINK, mask & ~F_BLINK);
}
public AttributedStyle inverse() {
return new AttributedStyle(style | F_INVERSE, mask | F_INVERSE);
}
public AttributedStyle inverseNeg() {
int s = (style & F_INVERSE) != 0 ? style & ~F_INVERSE : style | F_INVERSE;
return new AttributedStyle(s, mask | F_INVERSE);
}
public AttributedStyle inverseOff() {
return new AttributedStyle(style & ~F_INVERSE, mask | F_INVERSE);
}
public AttributedStyle inverseDefault() {
return new AttributedStyle(style & ~F_INVERSE, mask & ~F_INVERSE);
}
public AttributedStyle conceal() {
return new AttributedStyle(style | F_CONCEAL, mask | F_CONCEAL);
}
public AttributedStyle concealOff() {
return new AttributedStyle(style & ~F_CONCEAL, mask | F_CONCEAL);
}
public AttributedStyle concealDefault() {
return new AttributedStyle(style & ~F_CONCEAL, mask & ~F_CONCEAL);
}
public AttributedStyle crossedOut() {
return new AttributedStyle(style | F_CROSSED_OUT, mask | F_CROSSED_OUT);
}
public AttributedStyle crossedOutOff() {
return new AttributedStyle(style & ~F_CROSSED_OUT, mask | F_CROSSED_OUT);
}
public AttributedStyle crossedOutDefault() {
return new AttributedStyle(style & ~F_CROSSED_OUT, mask & ~F_CROSSED_OUT);
}
public AttributedStyle foreground(int color) {
return new AttributedStyle(style & ~FG_COLOR | F_FOREGROUND | ((color << FG_COLOR_EXP) & FG_COLOR), mask | F_FOREGROUND);
}
public AttributedStyle foregroundOff() {
return new AttributedStyle(style & ~FG_COLOR & ~F_FOREGROUND, mask | F_FOREGROUND);
}
public AttributedStyle foregroundDefault() {
return new AttributedStyle(style & ~FG_COLOR & ~F_FOREGROUND, mask & ~(F_FOREGROUND | FG_COLOR));
}
public AttributedStyle background(int color) {
return new AttributedStyle(style & ~BG_COLOR | F_BACKGROUND | ((color << BG_COLOR_EXP) & BG_COLOR), mask | F_BACKGROUND);
}
public AttributedStyle backgroundOff() {
return new AttributedStyle(style & ~BG_COLOR & ~F_BACKGROUND, mask | F_BACKGROUND);
}
public AttributedStyle backgroundDefault() {
return new AttributedStyle(style & ~BG_COLOR & ~F_BACKGROUND, mask & ~(F_BACKGROUND | BG_COLOR));
}
/**
* The hidden flag can be used to embed custom escape sequences.
* The characters are considered being 0-column long and will be printed as-is.
* The user is responsible for ensuring that those sequences do not move the cursor.
*
* @return the new style
*/
public AttributedStyle hidden() {
return new AttributedStyle(style | F_HIDDEN, mask | F_HIDDEN);
}
public AttributedStyle hiddenOff() {
return new AttributedStyle(style & ~F_HIDDEN, mask | F_HIDDEN);
}
public AttributedStyle hiddenDefault() {
return new AttributedStyle(style & ~F_HIDDEN, mask & ~F_HIDDEN);
}
public int getStyle() {
return style;
}
public int getMask() {
return mask;
}
@Override
public boolean equals(Object o) {
if (this == o) return true;
if (o == null || getClass() != o.getClass()) return false;
AttributedStyle that = (AttributedStyle) o;
if (style != that.style) return false;
return mask == that.mask;
}
@Override
public int hashCode() {
int result = style;
result = 31 * result + mask;
return result;
}
}