--- /dev/null 2015-04-26 06:51:08.003313989 -0700 +++ new/jdk/src/jdk.jline/share/classes/jdk/internal/jline/TerminalSupport.java 2015-06-18 03:05:11.197855896 -0700 @@ -0,0 +1,123 @@ +/* + * Copyright (c) 2002-2012, 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. + * + * http://www.opensource.org/licenses/bsd-license.php + */ +package jline; + +import java.io.IOException; +import java.io.InputStream; +import java.io.OutputStream; + +import jline.internal.Log; +import jline.internal.ShutdownHooks; +import jline.internal.ShutdownHooks.Task; + +/** + * Provides support for {@link Terminal} instances. + * + * @author Jason Dillon + * @since 2.0 + */ +public abstract class TerminalSupport + implements Terminal +{ + public static final int DEFAULT_WIDTH = 80; + + public static final int DEFAULT_HEIGHT = 24; + + private Task shutdownTask; + + private boolean supported; + + private boolean echoEnabled; + + private boolean ansiSupported; + + protected TerminalSupport(final boolean supported) { + this.supported = supported; + } + + public void init() throws Exception { + if (shutdownTask != null) { + ShutdownHooks.remove(shutdownTask); + } + // Register a task to restore the terminal on shutdown + this.shutdownTask = ShutdownHooks.add(new Task() + { + public void run() throws Exception { + restore(); + } + }); + } + + public void restore() throws Exception { + TerminalFactory.resetIf(this); + if (shutdownTask != null) { + ShutdownHooks.remove(shutdownTask); + shutdownTask = null; + } + } + + public void reset() throws Exception { + restore(); + init(); + } + + public final boolean isSupported() { + return supported; + } + + public synchronized boolean isAnsiSupported() { + return ansiSupported; + } + + protected synchronized void setAnsiSupported(final boolean supported) { + this.ansiSupported = supported; + Log.debug("Ansi supported: ", supported); + } + + /** + * Subclass to change behavior if needed. + * @return the passed out + */ + public OutputStream wrapOutIfNeeded(OutputStream out) { + return out; + } + + /** + * Defaults to true which was the behaviour before this method was added. + */ + public boolean hasWeirdWrap() { + return true; + } + + public int getWidth() { + return DEFAULT_WIDTH; + } + + public int getHeight() { + return DEFAULT_HEIGHT; + } + + public synchronized boolean isEchoEnabled() { + return echoEnabled; + } + + public synchronized void setEchoEnabled(final boolean enabled) { + this.echoEnabled = enabled; + Log.debug("Echo enabled: ", enabled); + } + + public InputStream wrapInIfNeeded(InputStream in) throws IOException { + return in; + } + + public String getOutputEncoding() { + // null for unknown + return null; + } +}