Moved hacky terminal fiddling code into a separate class.
git-svn-id: https://samskivert.googlecode.com/svn/trunk@775 6335cc39-0255-0410-8fd6-9bcaacd3b74c
This commit is contained in:
@@ -0,0 +1,130 @@
|
|||||||
|
//
|
||||||
|
// $Id: TermUtil.java,v 1.1 2002/06/06 20:52:36 mdb Exp $
|
||||||
|
|
||||||
|
package com.samskivert.util;
|
||||||
|
|
||||||
|
import java.awt.Dimension;
|
||||||
|
|
||||||
|
import java.io.BufferedInputStream;
|
||||||
|
import java.io.DataInputStream;
|
||||||
|
import java.io.IOException;
|
||||||
|
import java.io.InputStream;
|
||||||
|
|
||||||
|
import java.util.regex.Matcher;
|
||||||
|
import java.util.regex.Pattern;
|
||||||
|
import java.util.regex.PatternSyntaxException;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Provides access to the very platform specific concept of the terminal
|
||||||
|
* (ie. vt100, xterm, etc.) in which our code is running. Bear in mind
|
||||||
|
* that applications will commonly not be running in a terminal and this
|
||||||
|
* code should only be used when the operating environment is well known.
|
||||||
|
* It is generally useful to make things behave more nicely for the
|
||||||
|
* developer while developing.
|
||||||
|
*/
|
||||||
|
public class TermUtil
|
||||||
|
{
|
||||||
|
/** VT100 formatting code to enabled bold text. */
|
||||||
|
public static final String BOLD = "\033[1m";
|
||||||
|
|
||||||
|
/** VT100 formatting code to enabled reverse video text. */
|
||||||
|
public static final String REVERSE = "\033[7m";
|
||||||
|
|
||||||
|
/** VT100 formatting code to enabled underlined text. */
|
||||||
|
public static final String UNDERLINE = "\033[4m";
|
||||||
|
|
||||||
|
/** VT100 formatting code to revert to plain text. */
|
||||||
|
public static final String PLAIN = "\033[m";
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Returns a string that wraps the supplied string in the VT100 esacpe
|
||||||
|
* codes necessary to make it bold.
|
||||||
|
*/
|
||||||
|
public static String makeBold (String text)
|
||||||
|
{
|
||||||
|
return BOLD + text + PLAIN;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Returns a string that wraps the supplied string in the VT100 esacpe
|
||||||
|
* codes necessary to make it underlined.
|
||||||
|
*/
|
||||||
|
public static String makeUnderlined (String text)
|
||||||
|
{
|
||||||
|
return UNDERLINE + text + PLAIN;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Returns a string that wraps the supplied string in the VT100 esacpe
|
||||||
|
* codes necessary to display it in reverse video.
|
||||||
|
*/
|
||||||
|
public static String makeReverseVideo (String text)
|
||||||
|
{
|
||||||
|
return REVERSE + text + PLAIN;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Attempts to obtain the dimensions of the terminal in which the
|
||||||
|
* application is running (the units are columns by lines, for example
|
||||||
|
* 80 by 24).
|
||||||
|
*
|
||||||
|
* @return the terminal dimensions or null if we were unable to obtain
|
||||||
|
* the dimensions.
|
||||||
|
*/
|
||||||
|
public static Dimension getTerminalSize ()
|
||||||
|
{
|
||||||
|
// we may eventually have a variety of methods for obtaining
|
||||||
|
// terminal size, but for now there's only one
|
||||||
|
return getSizeViaResize();
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Tries to obtain the terminal dimensions by running 'resize'.
|
||||||
|
*/
|
||||||
|
protected static Dimension getSizeViaResize ()
|
||||||
|
{
|
||||||
|
try {
|
||||||
|
Process proc = Runtime.getRuntime().exec("resize");
|
||||||
|
InputStream in = proc.getInputStream();
|
||||||
|
BufferedInputStream bin = new BufferedInputStream(in);
|
||||||
|
DataInputStream din = new DataInputStream(bin);
|
||||||
|
Pattern regex = Pattern.compile("([0-9]+)");
|
||||||
|
String line;
|
||||||
|
int columns = -1, lines = -1;
|
||||||
|
while ((line = din.readLine()) != null) {
|
||||||
|
if (line.indexOf("COLUMNS") != -1) {
|
||||||
|
Matcher match = regex.matcher(line);
|
||||||
|
if (match.find()) {
|
||||||
|
columns = safeToInt(match.group());
|
||||||
|
}
|
||||||
|
} else if (line.indexOf("LINES") != -1) {
|
||||||
|
Matcher match = regex.matcher(line);
|
||||||
|
if (match.find()) {
|
||||||
|
lines = safeToInt(match.group());
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if (columns != -1 && lines != -1) {
|
||||||
|
return new Dimension(columns, lines);
|
||||||
|
}
|
||||||
|
|
||||||
|
} catch (PatternSyntaxException pse) {
|
||||||
|
} catch (SecurityException se) {
|
||||||
|
} catch (IOException ioe) {
|
||||||
|
}
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
|
||||||
|
/** Converts the string to an integer, returning -1 on any error. */
|
||||||
|
protected static int safeToInt (String intstr)
|
||||||
|
{
|
||||||
|
if (!StringUtil.blank(intstr)) {
|
||||||
|
try {
|
||||||
|
return Integer.parseInt(intstr);
|
||||||
|
} catch (NumberFormatException nfe) {
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
}
|
||||||
Reference in New Issue
Block a user