001 /*
002 * cs101 Graphical Console
003 *
004 * Developed for "Rethinking CS101", a project of Lynn Andrea Stein's AP Group.
005 * For more information, see <a href="http://www.ai.mit.edu/projects/cs101/">the
006 * CS101 homepage</a> or email <las@ai.mit.edu>.
007 *
008 * Copyright (C) 1998 Massachusetts Institute of Technology.
009 * Please do not redistribute without obtaining permission.
010 */
011
012 package cs101.awt;
013
014 import java.awt.*;
015 import java.awt.event.*;
016 import cs101.util.queue.Queue;
017 import cs101.util.queue.DefaultQueue;
018 import cs101.util.queue.EmptyQueueException;
019
020 /**
021 * A graphical helper class for Java Console IO. Contains appropiate
022 * console read and print methods.<p>
023 *
024 * Exists mostly to ease the differences between the numerous (and
025 * sometimes broken) IDE java consoles.<p>
026 *
027 * Copyright (c) 1998 Massachusetts Institute of Technolgoy
028 *
029 * @author Todd C. Parnell, tparnell@ai.mit.edu
030 * @version $Id: Console.java,v 1.1.1.1 2002/06/05 21:56:32 root Exp $
031 *
032 * @see cs101.io.Console
033 */
034 public class Console extends Frame {
035
036 /** Buffer for input lines not yet read. */
037 private Queue inputLines;
038
039 private TextArea ta;
040
041 /**
042 * Create and display a new Console.
043 */
044 public Console() {
045 super("CS101 Console");
046
047 this.inputLines = new DefaultQueue();
048
049 this.ta = new TextArea("", 24, 80, TextArea.SCROLLBARS_BOTH);
050 ta.setFont(new Font("Monospaced", Font.PLAIN, 10));
051 ta.addKeyListener(new ConsoleKeyAdapter(this));
052
053 this.add("Center", this.ta);
054 this.pack();
055 this.show();
056
057 this.addWindowListener(new WindowAdapter() {
058 public void windowClosing(ActionEvent e) {
059 Console.this.setVisible(false);
060 }
061 });
062 }
063
064 /**
065 * Write a String to Console. The String written is concatenated
066 * with a newline.
067 */
068 public void println(String s) {
069 this.print(s+"\n");
070 }
071
072 /**
073 * Write a line to Console. The String written is <I>not</I>
074 * concatenated with a newline.
075 */
076 public void print(String s) {
077 this.ta.append(s);
078 }
079
080 /**
081 * Read a line from Console. The String returned is not terminated
082 * with a newline.
083 *
084 * @return the String the user typed
085 */
086 public String readln() {
087 boolean success = false;
088 String temp = "";
089 while (!success) {
090 try {
091 temp = (String)this.inputLines.dequeue();
092 success = true;
093 } catch (EmptyQueueException eqe) {
094 try { Thread.sleep(100); }
095 catch (InterruptedException ie) {}
096 }
097 }
098 return temp;
099 }
100
101 /**
102 * Insert a line into the user input queue. Text inserted in this manner
103 * will appear to readln() calls.
104 */
105 void addInputLine(String newInputLine) {
106 this.inputLines.enqueue(newInputLine);
107 }
108
109
110 /** The KeyAdapter used by Console to record user input. */
111 class ConsoleKeyAdapter extends KeyAdapter {
112
113 private Console myConsole;
114 private StringBuffer curInputLine;
115
116 public ConsoleKeyAdapter(Console myConsole) {
117 this.myConsole = myConsole;
118 this.curInputLine = new StringBuffer();
119 }
120
121 public void keyTyped(KeyEvent e) {
122 char c = e.getKeyChar();
123 if (c == '\u0008' && curInputLine.length() > 0) {
124 this.curInputLine.deleteCharAt(this.curInputLine.length() - 1);
125 return;
126 }
127 if (c == '\n') {
128 // don't include newline with String
129 this.myConsole.addInputLine(this.curInputLine.toString());
130 this.curInputLine = new StringBuffer();
131 }
132 else if (e.isActionKey()) return;
133 else this.curInputLine.append(c);
134 }
135 }
136 }
137
138 /*
139 * $Log: Console.java,v $
140 * Revision 1.1.1.1 2002/06/05 21:56:32 root
141 * CS101 comes to Olin finally.
142 *
143 * Revision 1.3 2000/04/30 02:33:50 mharder
144 * Changed import statements to confirm to new cs101 packages.
145 *
146 * Revision 1.2 1999/02/08 20:52:13 tparnell
147 * fixed references to Queue
148 *
149 * Revision 1.1 1998/07/28 17:46:19 tparnell
150 * Initial revision. Uses cs101.util.Queue as abstraction.
151 *
152 */
153
154
155
156
157
158
159
160