/*
 * 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:Guillaume Nodet
/** * 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.
Returns:the new style
/** * 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; } }