diff options
author | Han-Wen Nienhuys <hanwen@google.com> | 2015-02-25 16:45:20 +0100 |
---|---|---|
committer | Han-Wen Nienhuys <hanwen@google.com> | 2015-02-25 16:45:20 +0100 |
commit | d08b27fa9701fecfdb69e1b0d1ac2459efc2129b (patch) | |
tree | 5d50963026239ca5aebfb47ea5b8db7e814e57c8 /src/main/java/com/google/devtools/build/lib/util/io/AnsiTerminal.java |
Update from Google.
--
MOE_MIGRATED_REVID=85702957
Diffstat (limited to 'src/main/java/com/google/devtools/build/lib/util/io/AnsiTerminal.java')
-rw-r--r-- | src/main/java/com/google/devtools/build/lib/util/io/AnsiTerminal.java | 198 |
1 files changed, 198 insertions, 0 deletions
diff --git a/src/main/java/com/google/devtools/build/lib/util/io/AnsiTerminal.java b/src/main/java/com/google/devtools/build/lib/util/io/AnsiTerminal.java new file mode 100644 index 0000000000..93bc12af10 --- /dev/null +++ b/src/main/java/com/google/devtools/build/lib/util/io/AnsiTerminal.java @@ -0,0 +1,198 @@ +// Copyright 2014 Google Inc. All rights reserved. +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. +package com.google.devtools.build.lib.util.io; + +import java.io.IOException; +import java.io.OutputStream; + +/** + * A class which encapsulates the fancy curses-type stuff that you can do using + * standard ANSI terminal control sequences. + */ +public class AnsiTerminal { + private static final byte[] ESC = {27, (byte) '['}; + private static final byte BEL = 7; + private static final byte UP = (byte) 'A'; + private static final byte ERASE_LINE = (byte) 'K'; + private static final byte SET_GRAPHICS = (byte) 'm'; + private static final byte TEXT_BOLD = (byte) '1'; + private static final byte[] SET_TERM_TITLE = {27, (byte) ']', (byte) '0', (byte) ';'}; + + public static final String FG_BLACK = "30"; + public static final String FG_RED = "31"; + public static final String FG_GREEN = "32"; + public static final String FG_YELLOW = "33"; + public static final String FG_BLUE = "34"; + public static final String FG_MAGENTA = "35"; + public static final String FG_CYAN = "36"; + public static final String FG_GRAY = "37"; + public static final String BG_BLACK = "40"; + public static final String BG_RED = "41"; + public static final String BG_GREEN = "42"; + public static final String BG_YELLOW = "43"; + public static final String BG_BLUE = "44"; + public static final String BG_MAGENTA = "45"; + public static final String BG_CYAN = "46"; + public static final String BG_GRAY = "47"; + + public static byte[] CR = { 13 }; + + private final OutputStream out; + + /** + * Creates an AnsiTerminal object wrapping an output stream which is going to + * be displayed in an ANSI compatible terminal or shell window. + * + * @param out the output stream + */ + public AnsiTerminal(OutputStream out) { + this.out = out; + } + + /** + * Moves the cursor upwards by a specified number of lines. This will not + * cause any scrolling if it tries to move above the top of the terminal + * window. + */ + public void cursorUp(int numLines) throws IOException { + writeBytes(ESC, ("" + numLines).getBytes(), new byte[] { UP }); + } + + /** + * Clear the current terminal line from the cursor position to the end. + */ + public void clearLine() throws IOException { + writeEscapeSequence(ERASE_LINE); + } + + /** + * Makes any text output to the terminal appear in bold. + */ + public void textBold() throws IOException { + writeEscapeSequence(TEXT_BOLD, SET_GRAPHICS); + } + + /** + * Set the color of the foreground or background of the terminal. + * + * @param color one of the foreground or background color + * constants + */ + public void setTextColor(String color) throws IOException { + writeBytes(ESC, color.getBytes(), new byte[] { SET_GRAPHICS }); + } + + /** + * Resets the terminal colors and fonts to defaults. + */ + public void resetTerminal() throws IOException { + writeEscapeSequence((byte)'0', (byte)'m'); + } + + /** + * Makes text print on the terminal in red. + */ + public void textRed() throws IOException { + setTextColor(FG_RED); + } + + /** + * Makes text print on the terminal in blue. + */ + public void textBlue() throws IOException { + setTextColor(FG_BLUE); + } + + /** + * Makes text print on the terminal in red. + */ + public void textGreen() throws IOException { + setTextColor(FG_GREEN); + } + + /** + * Makes text print on the terminal in red. + */ + public void textMagenta() throws IOException { + setTextColor(FG_MAGENTA); + } + + /** + * Set the terminal title. + */ + public void setTitle(String title) throws IOException { + writeBytes(SET_TERM_TITLE, title.getBytes(), new byte[] { BEL }); + } + + /** + * Writes a string to the terminal using the current font, color and cursor + * position settings. + * + * @param text the text to write + */ + public void writeString(String text) throws IOException { + out.write(text.getBytes()); + } + + /** + * Writes a byte sequence to the terminal using the current font, color and + * cursor position settings. + * + * @param bytes the bytes to write + */ + public void writeBytes(byte[] bytes) throws IOException { + out.write(bytes); + } + + /** + * Utility method which makes it easier to generate the control sequences for + * the terminal. + * + * @param bytes bytes which should be prefixed with the terminal escape + * sequence to produce a valid control sequence + */ + private void writeEscapeSequence(byte... bytes) throws IOException { + writeBytes(ESC, bytes); + } + + /** + * Utility method for generating control sequences. Takes a collection of byte + * arrays, which contain the components of a control sequence, concatenates + * them, and prints them to the terminal. + * + * @param stuff the byte arrays that make up the sequence to be sent to the + * terminal + */ + private void writeBytes(byte[]... stuff) throws IOException { + for (byte[] bytes : stuff) { + out.write(bytes); + } + } + + /** + * Sends a carriage return to the terminal. + */ + public void cr() throws IOException { + writeBytes(CR); + } + + /** + * Flushes the underlying stream. + * This class does not do any buffering of its own, but the underlying + * OutputStream may. + */ + public void flush() throws IOException { + out.flush(); + } +} |