/*
 Usage: java VT100PrintStream

 If you do not get colors etc, but a lot of brackets and numbers, it
 could be 1) that your terminal is not supporting VT100 or 2) that
 the output has to be piped to 'cat' or similar;

   java VT100PrintStream | cat

 Author: Henrik Bengtsson, henrikb@braju.com
 Date: 2002-01-03

 References:
  [1] http://www.fh-jena.de/~gmueller/Kurs_halle/esc_vt100.html
 */

import java.io.*;

public class VT100PrintStream extends PrintStream {
  char ESC = '\u001B';  // ASCII 27(dec), 1B(hex) or 33(oct).

  public VT100PrintStream(OutputStream out) {
    super(out);
  }

  public PrintStream setDisplayAttributes(int[] attr) {
    print(ESC);
    print('[');
    for (int i=0; i<attr.length; i++) {
      if (i > 0) print(';');
      print(attr[i]);
    }
    print('m');
    return this;
  }

  public PrintStream setDisplayAttributes(int attr) {
    return setDisplayAttributes(new int[] {attr});
  }

  public static void main(String[] args) throws Exception {
    VT100PrintStream out = new VT100PrintStream(System.out);

    out.print("Example of VT100 escape sequences.\n\n");
    out.print("Styles: ");
    out.setDisplayAttributes(new int[]{0,1}).print("bold ");    
    out.setDisplayAttributes(new int[]{0,2}).print("dim ");    
    out.setDisplayAttributes(new int[]{0,4}).print("underscore ");    
    out.setDisplayAttributes(new int[]{0,5}).print("blink ");    
    out.setDisplayAttributes(new int[]{0,7}).print("reverse ");    
    out.setDisplayAttributes(new int[]{0,8}).print("hidden\n");

    out.setDisplayAttributes(0).print("Foreground colors: ");
    out.setDisplayAttributes(new int[]{0,30,47}).print("black ");    
    out.setDisplayAttributes(new int[]{0,31}).print("red ");    
    out.setDisplayAttributes(new int[]{0,32}).print("green ");    
    out.setDisplayAttributes(new int[]{0,33}).print("yellow ");    
    out.setDisplayAttributes(new int[]{0,34}).print("blue ");    
    out.setDisplayAttributes(new int[]{0,35}).print("magenta ");    
    out.setDisplayAttributes(new int[]{0,36}).print("cyan ");    
    out.setDisplayAttributes(new int[]{0,37}).print("white\n");    

    out.setDisplayAttributes(0).print("Background colors: ");
    out.setDisplayAttributes(new int[]{0,40}).print("black ");    
    out.setDisplayAttributes(new int[]{0,41}).print("red ");    
    out.setDisplayAttributes(new int[]{0,42}).print("green ");    
    out.setDisplayAttributes(new int[]{0,43}).print("yellow ");    
    out.setDisplayAttributes(new int[]{0,44}).print("blue ");    
    out.setDisplayAttributes(new int[]{0,45}).print("magenta ");    
    out.setDisplayAttributes(new int[]{0,30,46}).print("cyan ");    
    out.setDisplayAttributes(new int[]{0,30,47}).print("white\n");    
  }
} // class VT100PrintStream
