001 /** 002 * jline - Java console input library 003 * Copyright (c) 2002,2003 Marc Prud'hommeaux mwp1@cornell.edu 004 * 005 * This library is free software; you can redistribute it and/or 006 * modify it under the terms of the GNU Lesser General Public 007 * License as published by the Free Software Foundation; either 008 * version 2.1 of the License, or (at your option) any later version. 009 * 010 * This library is distributed in the hope that it will be useful, 011 * but WITHOUT ANY WARRANTY; without even the implied warranty of 012 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU 013 * Lesser General Public License for more details. 014 * 015 * You should have received a copy of the GNU Lesser General Public 016 * License along with this library; if not, write to the Free Software 017 * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA 018 */ 019 package jline; 020 021 import java.io.*; 022 import java.util.*; 023 024 025 /** 026 * Representation of the input terminal for a platform. Handles 027 * any initialization that the platform may need to perform 028 * in order to allow the {@link ConsoleReader} to correctly handle 029 * input. 030 * 031 * @author <a href="mailto:mwp1@cornell.edu">Marc Prud'hommeaux</a> 032 */ 033 public abstract class Terminal 034 { 035 private static Terminal term; 036 037 038 /** 039 * @see #setupTerminal 040 */ 041 public static Terminal getTerminal () 042 { 043 return setupTerminal (); 044 } 045 046 047 /** 048 * <p>Configure and return the {@link Terminal} instance for the 049 * current platform. This will initialize any system settings 050 * that are required for the console to be able to handle 051 * input correctly, such as setting tabtop, buffered input, and 052 * character echo.</p> 053 * 054 * <p>This class will use the Terminal implementation specified in the 055 * <code>jline.terminal</code> system property, or, if it is unset, by 056 * detecting the operating system from the <code>os.name</code> 057 * system property and instantiateing either the 058 * {@link WindowsTerminal} or {@link UnixTerminal}. 059 * 060 * @see #initializeTerminal 061 */ 062 public static synchronized Terminal setupTerminal () 063 { 064 if (term != null) 065 return term; 066 067 final Terminal t; 068 069 String os = System.getProperty ("os.name").toLowerCase (); 070 String termProp = System.getProperty ("jline.terminal"); 071 if (termProp != null && termProp.length () > 0) 072 { 073 try 074 { 075 t = (Terminal)Class.forName (termProp).newInstance (); 076 } 077 catch (Exception e) 078 { 079 throw (IllegalArgumentException)new IllegalArgumentException ( 080 e.toString ()).fillInStackTrace (); 081 } 082 } 083 else if (os.indexOf ("windows") != -1) 084 { 085 t = new WindowsTerminal (); 086 } 087 else 088 { 089 t = new UnixTerminal (); 090 } 091 092 try 093 { 094 t.initializeTerminal (); 095 } 096 catch (Exception e) 097 { 098 e.printStackTrace (); 099 return term = new UnsupportedTerminal (); 100 } 101 102 return term = t; 103 } 104 105 106 /** 107 * Initialize any system settings 108 * that are required for the console to be able to handle 109 * input correctly, such as setting tabtop, buffered input, and 110 * character echo. 111 */ 112 public abstract void initializeTerminal () 113 throws Exception; 114 115 116 /** 117 * Returns the current width of the terminal (in characters) 118 */ 119 public abstract int getTerminalWidth (); 120 121 122 /** 123 * Returns the current height of the terminal (in lines) 124 */ 125 public abstract int getTerminalHeight (); 126 127 128 /** 129 * Returns true if this terminal is capable of initializing the 130 * terminal to use jline. 131 */ 132 public abstract boolean isSupported (); 133 134 135 /** 136 * Returns true if the terminal will echo all characters type. 137 */ 138 public abstract boolean getEcho (); 139 }