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    }