(import java |.| applet |.| Applet |;| import java |.| awt .* |;| import java |.| io .* |;| public class Toplevel extends Applet implements SchanReader (#%braces Terminal myterminal |;| public void init (#%parens) (#%braces myterminal = new Terminal (#%parens) |;| HalServer |.| registerReader (#%parens this) |;| resize (#%parens 800 |,| 400) |;| GridBagLayout gb = new GridBagLayout (#%parens) |;| setLayout (#%parens gb) |;| GridBagConstraints cn = new GridBagConstraints (#%parens) |;| cn |.| weightx = 1 |;| cn |.| weighty = 1 |;| cn |.| fill = cn |.| BOTH |;| gb |.| setConstraints (#%parens myterminal |,| cn) |;| add (#%parens myterminal) |;| validate (#%parens) |;| show (#%parens) |;| myterminal |.| init (#%parens) |;| myterminal |.| write (#%parens "Hal Applet Compiled by MLj 0.2 " |,| 0) |;|) public void handlechan (#%parens String thedata) (#%braces myterminal |.| write (#%parens thedata |,| 0) |;|) public void stop (#%parens) (#%braces if (#%parens Terminal |.| computeThread != null && Terminal |.| computeThread |.| isAlive (#%parens)) (#%braces Terminal |.| computeThread |.| stop (#%parens) |;| myterminal |.| write (#%parens "**background computation stopped** " |,| 0) |;|) Terminal |.| computeThread = null |;|) public void start (#%parens) (#%braces Terminal |.| computeThread = null |;|)) class Terminal extends Canvas (#%braces public static Thread computeThread = null |;| static final boolean DEBUG = false |;| static final int OUTF_RAW = 1 << 0 |;| static final int OUTF_PARTIAL = 1 << 1 |;| static final int STYLE_PLAIN = 0 |;| static final int STYLE_INVERSE = 1 << 0 |;| static final int STYLE_BOLD = 1 << 1 |;| static final int STYLE_ITALIC = 1 << 2 |;| static final int STYLE_UNDERSCORE = 1 << 3 |;| static final int INNER_SIZE = 4 |;| static final int ACTIVE_SIZE = 2 |;| static final int BORDER_WIDTH = (#%parens INNER_SIZE + ACTIVE_SIZE) |;| static final int BORDER_HEIGHT = (#%parens INNER_SIZE + ACTIVE_SIZE) |;| int fontsize = - 1 |;| Color defBackground |,| defForeground |;| Toolkit toolkit |;| Font fontPlain |,| fontBold |,| fontItalic |,| fontBoldItalic |;| int charWidth |,| charHeight |;| int fontAscent |,| fontDescent |;| int numRows |,| numCols |;| int curRow |,| curCol |;| int curStyle = STYLE_PLAIN |;| int regionTop |,| regionBottom |,| regionLeft |,| regionRight |;| int lastRow |,| lastCol |;| int dirtyTop = - 1 |,| dirtyBottom = - 1 |;| int scrollCount = 0 |;| boolean overChar = false |;| boolean cursorVisible = true |;| char page (#%brackets) (#%brackets) |;| int style (#%brackets) (#%brackets) |;| public Terminal (#%parens) (#%braces fontsize = 12 |;|) public void init (#%parens) (#%braces Graphics g = getGraphics (#%parens) |;| Font f = g |.| getFont (#%parens) |;| int size = f |.| getSize (#%parens) |;| if (#%parens fontsize > 0) size = fontsize |;| fontPlain = f |;| try (#%braces fontPlain = new Font (#%parens "Courier" |,| Font |.| PLAIN |,| size) |;|) finally (#%braces) if (#%parens fontPlain == null) fontPlain = f |;| if (#%parens DEBUG) (#%braces System |.| out |.| println (#%parens "StdFont name=" + fontPlain |.| getName (#%parens) + " size=" + fontPlain |.| getSize (#%parens) + " style=" + fontPlain |.| getStyle (#%parens)) |;|) fontBold = fontPlain |;| try (#%braces fontBold = new Font (#%parens fontPlain |.| getName (#%parens) |,| Font |.| BOLD |,| fontPlain |.| getSize (#%parens)) |;|) finally (#%braces) fontItalic = fontBoldItalic = fontBold |;| try (#%braces fontItalic = new Font (#%parens fontPlain |.| getName (#%parens) |,| Font |.| ITALIC |,| fontPlain |.| getSize (#%parens)) |;|) finally (#%braces) try (#%braces fontBoldItalic = new Font (#%parens fontPlain |.| getName (#%parens) |,| Font |.| BOLD + Font |.| ITALIC |,| fontPlain |.| getSize (#%parens)) |;|) finally (#%braces) if (#%parens DEBUG) (#%braces System |.| out |.| println (#%parens "BldFont name=" + fontBold |.| getName (#%parens) + " size=" + fontBold |.| getSize (#%parens) + " style=" + fontBold |.| getStyle (#%parens)) |;| System |.| out |.| println (#%parens "ItlFont name=" + fontItalic |.| getName (#%parens) + " size=" + fontItalic |.| getSize (#%parens) + " style=" + fontItalic |.| getStyle (#%parens)) |;|) g |.| setFont (#%parens fontPlain) |;| setFont (#%parens fontPlain) |;| defBackground = getBackground (#%parens) |;| defForeground = getForeground (#%parens) |;| toolkit = getToolkit (#%parens) |;| screenInit (#%parens) |;| repaint (#%parens) |;|) FontMetrics get_metrics (#%parens boolean install) (#%braces Graphics g |;| FontMetrics m |;| Dimension d |;| g = getGraphics (#%parens) |;| m = g |.| getFontMetrics (#%parens fontPlain) |;| if (#%parens install) (#%braces charWidth = m |.| charWidth (#%parens #\W) |;| charHeight = m |.| getHeight (#%parens) |;| fontAscent = m |.| getAscent (#%parens) |;| fontDescent = m |.| getDescent (#%parens) |;|) return m |;|) public Dimension minimumSize (#%parens) (#%braces return (#%parens new Dimension (#%parens 800 |,| 400)) |;|) public Dimension preferredSize (#%parens) (#%braces return minimumSize (#%parens) |;|) public void screenInit (#%parens) (#%braces Dimension d |;| int rows |,| cols |;| get_metrics (#%parens true) |;| if (#%parens DEBUG) System |.| out |.| println (#%parens "Initializing screen...") |;| d = size (#%parens) |;| if (#%parens DEBUG) System |.| out |.| println (#%parens "size: " + d + " bh: " + BORDER_HEIGHT + "bw: " + BORDER_WIDTH + "cw:" + charWidth + " ch: " + charHeight) |;| cols = (#%parens d |.| width - (#%parens BORDER_WIDTH * 2)) / charWidth |;| rows = (#%parens d |.| height - (#%parens BORDER_HEIGHT * 2)) / charHeight |;| if (#%parens cols < 4) cols = 4 |;| if (#%parens rows < 2) rows = 2 |;| if (#%parens numRows == rows && numCols == cols) return |;| numRows = rows |;| numCols = cols |;| curCol = 0 |;| curRow = 0 |;| lastCol = 0 |;| lastRow = 0 |;| scrollCount = 0 |;| setRegion (#%parens) |;| if (#%parens DEBUG) System |.| out |.| println (#%parens "Width = " + d |.| width + ", Height = " + d |.| height) |;| if (#%parens DEBUG) System |.| out |.| println (#%parens "Columns = " + numCols + ", Rows = " + numRows) |;| page = new char (#%brackets numRows) (#%brackets numCols) |;| style = new int (#%brackets numRows) (#%brackets numCols) |;| for (#%parens int r = 0 |;| r < numRows |;| r ++) (#%braces for (#%parens int c = 0 |;| c < numCols |;| c ++) (#%braces page (#%brackets r) (#%brackets c) = #\space |;| style (#%brackets r) (#%brackets c) = STYLE_PLAIN |;|)) dirtyTop = 0 |;| dirtyBottom = numRows - 1 |;|) public int getCursorRow (#%parens) (#%braces return curRow |;|) public int getCursorCol (#%parens) (#%braces return curCol |;|) public int getNumRows (#%parens) (#%braces return numRows |;|) public int getNumCols (#%parens) (#%braces return numCols |;|) public void setCursorPos (#%parens int row |,| int col) (#%braces if (#%parens row < 0) row = 0 |;| if (#%parens row >= numRows) row = numRows - 1 |;| if (#%parens col < 0) col = 0 |;| if (#%parens col >= numCols) col = numCols - 1 |;| curRow = row |;| curCol = col |;|) public void setCursorVisible (#%parens boolean state) (#%braces cursorVisible = state |;|) public boolean getCursorVisible (#%parens) (#%braces return cursorVisible |;|) public void setRegion (#%parens) (#%braces regionTop = 0 |;| regionBottom = numRows - 1 |;| regionLeft = 0 |;| regionRight = numCols - 1 |;|) public void setRegion (#%parens int top |,| int bottom) (#%braces setRegion (#%parens top |,| bottom |,| 0 |,| numCols - 1) |;|) public void setRegion (#%parens int top |,| int bottom |,| int left |,| int right) (#%braces if (#%parens top < 0) top = 0 |;| if (#%parens top >= numRows) top = numRows - 1 |;| if (#%parens bottom < 0) bottom = 0 |;| if (#%parens bottom >= numRows) bottom = numRows - 1 |;| if (#%parens top >= bottom - 2) (#%braces if (#%parens top > 2) top = 0 |;| else bottom = numRows - 1 |;|) if (#%parens left < 0) left = 0 |;| if (#%parens left >= numCols) left = numCols - 1 |;| if (#%parens right < 0) right = 0 |;| if (#%parens right >= numCols) right = numCols - 1 |;| if (#%parens left >= right - 2) (#%braces if (#%parens left > 2) left = 0 |;| else right = numCols - 1 |;|) regionTop = top |;| regionBottom = bottom |;| regionLeft = left |;| regionRight = right |;|) public int getRegionTop (#%parens) (#%braces return regionTop |;|) public int getRegionBottom (#%parens) (#%braces return regionBottom |;|) public int getRegionLeft (#%parens) (#%braces return regionLeft |;|) public int getRegionRight (#%parens) (#%braces return regionRight |;|) public void setStyle (#%parens int style) (#%braces curStyle = style |;|) public int getStyle (#%parens) (#%braces return curStyle |;|) public void setChar (#%parens char c) (#%braces page (#%brackets curRow) (#%brackets curCol) = c |;| style (#%brackets curRow) (#%brackets curCol) = curStyle |;|) public void setChar (#%parens char c |,| int row |,| int col) (#%braces page (#%brackets row) (#%brackets col) = c |;| style (#%brackets row) (#%brackets col) = curStyle |;|) public char getChar (#%parens) (#%braces return page (#%brackets curRow) (#%brackets curCol) |;|) public char getChar (#%parens int row |,| int col) (#%braces return page (#%brackets row) (#%brackets col) |;|) public int getCharStyle (#%parens) (#%braces return style (#%brackets curRow) (#%brackets curCol) |;|) public int getCharStyle (#%parens int row |,| int col) (#%braces return style (#%brackets row) (#%brackets col) |;|) Font get_style_font (#%parens int style) (#%braces switch (#%parens style & (#%parens STYLE_BOLD |\|| STYLE_ITALIC)) (#%braces case STYLE_PLAIN : return fontPlain |;| case STYLE_BOLD : return fontBold |;| case STYLE_ITALIC : return fontItalic |;| case STYLE_BOLD |\|| STYLE_ITALIC : return fontBoldItalic |;| default : return fontPlain |;|)) void drawRowCol (#%parens Graphics g |,| int row |,| int col) (#%braces int x = (#%parens col * charWidth) + BORDER_WIDTH |;| int y = (#%parens row * charHeight) + BORDER_HEIGHT |;| g |.| setFont (#%parens get_style_font (#%parens style (#%brackets row) (#%brackets col))) |;| if (#%parens (#%parens curRow != row |\|\|| curCol != col |\|\|| ! cursorVisible) ^ (#%parens (#%parens style (#%brackets row) (#%brackets col) & STYLE_INVERSE) == STYLE_INVERSE)) (#%braces g |.| clearRect (#%parens x |,| y |,| charWidth |,| charHeight) |;| g |.| setColor (#%parens getForeground (#%parens)) |;| g |.| drawChars (#%parens page (#%brackets row) |,| col |,| 1 |,| x |,| y + fontAscent) |;|) else (#%braces g |.| setColor (#%parens getForeground (#%parens)) |;| g |.| fillRect (#%parens x |,| y |,| charWidth |,| charHeight) |;| g |.| setColor (#%parens getBackground (#%parens)) |;| g |.| drawChars (#%parens page (#%brackets row) |,| col |,| 1 |,| x |,| y + fontAscent) |;|) if (#%parens (#%parens style (#%brackets row) (#%brackets col) & STYLE_UNDERSCORE) != 0) (#%braces g |.| drawLine (#%parens x |,| y + fontAscent |,| x + charWidth - 1 |,| y + fontAscent) |;|)) public void drawRow (#%parens Graphics g |,| int row) (#%braces int (#%brackets) rowStyles = style (#%brackets row) |;| int col = 0 |;| int y = BORDER_HEIGHT + (#%parens row * charHeight) |;| if (#%parens rowStyles == null |\|\|| page (#%brackets row) == null) (#%braces System |.| out |.| println (#%parens "*** null entry at row " + row) |;| return |;|) while (#%parens col < numCols) (#%braces int first = col |;| int cur_style = rowStyles (#%brackets col) |;| while (#%parens col < numCols && cur_style == rowStyles (#%brackets col)) (#%braces col ++ |;|) int x = BORDER_WIDTH + (#%parens first * charWidth) |;| g |.| setFont (#%parens get_style_font (#%parens cur_style)) |;| if (#%parens (#%parens cur_style & STYLE_INVERSE) == 0) (#%braces g |.| setColor (#%parens getBackground (#%parens)) |;|) else (#%braces g |.| setColor (#%parens getForeground (#%parens)) |;|) g |.| fillRect (#%parens x |,| y |,| (#%parens (#%parens col - first) * charWidth) |,| charHeight) |;| if (#%parens (#%parens cur_style & STYLE_INVERSE) == 0) (#%braces g |.| setColor (#%parens getForeground (#%parens)) |;|) else (#%braces g |.| setColor (#%parens getBackground (#%parens)) |;|) g |.| drawChars (#%parens page (#%brackets row) |,| first |,| col - first |,| x |,| y + fontAscent) |;| if (#%parens (#%parens cur_style & STYLE_UNDERSCORE) != 0) (#%braces g |.| drawLine (#%parens x |,| y + fontAscent |,| x + (#%parens (#%parens col - first) * charWidth) |,| y + fontAscent) |;|)) if (#%parens cursorVisible && row == curRow) (#%braces if (#%parens DEBUG) System |.| out |.| println (#%parens "Drawing cursor: row=" + curRow + ", col=" + curCol) |;| drawRowCol (#%parens g |,| curRow |,| curCol) |;|)) public void screenRedraw (#%parens Graphics g |,| int top |,| int bot) (#%braces if (#%parens top < 0) top = 0 |;| if (#%parens bot >= numRows) bot = numRows - 1 |;| g |.| setFont (#%parens fontPlain) |;| if (#%parens DEBUG) System |.| out |.| println (#%parens "Redrawing: " + top + " to " + bot) |;| for (#%parens int i = top |;| i <= bot |;| i ++) (#%braces if (#%parens DEBUG) System |.| out |.| println (#%parens "Drawing: " + i + ", curRow: " + curRow) |;| drawRow (#%parens g |,| i) |;|) scrollCount = 0 |;|) public void screenRedraw (#%parens Graphics g) (#%braces screenRedraw (#%parens g |,| 0 |,| numRows - 1) |;|) public void screenClean (#%parens Graphics g) (#%braces if (#%parens DEBUG) System |.| out |.| println (#%parens "Cleaning screen: " + dirtyTop + " to " + dirtyBottom) |;| if (#%parens dirtyTop >= 0 && dirtyBottom >= 0) (#%braces drawRowCol (#%parens g |,| lastRow |,| lastCol) |;| screenRedraw (#%parens g |,| dirtyTop |,| dirtyBottom) |;|) if (#%parens lastRow != curRow |\|\|| lastCol != curCol) (#%braces drawRowCol (#%parens g |,| lastRow |,| lastCol) |;| drawRowCol (#%parens g |,| curRow |,| curCol) |;|) dirtyTop = - 1 |;| dirtyBottom = - 1 |;| lastRow = curRow |;| lastCol = curCol |;| toolkit |.| sync (#%parens) |;|) void screenDirty (#%parens int top |,| int bottom) (#%braces if (#%parens dirtyTop < 0 |\|\|| top < dirtyTop) dirtyTop = top |;| if (#%parens bottom > dirtyBottom) dirtyBottom = bottom |;|) public void screenScrollRegion (#%parens int top |,| int bottom |,| int amount) (#%braces if (#%parens top >= bottom) return |;| if (#%parens amount < 0) (#%braces amount = - amount |;| for (#%parens int i = top |;| i < (#%parens bottom - amount + 1) |;| i ++) (#%braces page (#%brackets i) = page (#%brackets i + amount) |;| style (#%brackets i) = style (#%brackets i + amount) |;|) for (#%parens int i = bottom - amount + 1 |;| i < bottom + 1 |;| i ++) (#%braces page (#%brackets i) = new char (#%brackets numCols) |;| style (#%brackets i) = new int (#%brackets numCols) |;| for (#%parens int j = 0 |;| j < numCols |;| j ++) (#%braces page (#%brackets i) (#%brackets j) = #\space |;| style (#%brackets i) (#%brackets j) = STYLE_PLAIN |;|)) screenDirty (#%parens top |,| bottom) |;|) else if (#%parens amount > 0) (#%braces for (#%parens int i = bottom |;| i >= top + amount |;| i --) (#%braces page (#%brackets i) = page (#%brackets i - amount) |;| style (#%brackets i) = style (#%brackets i - amount) |;|) for (#%parens int i = top |;| i < top + amount |;| i ++) (#%braces page (#%brackets i) = new char (#%brackets numCols) |;| style (#%brackets i) = new int (#%brackets numCols) |;| for (#%parens int j = 0 |;| j < numCols |;| j ++) (#%braces page (#%brackets i) (#%brackets j) = #\space |;| style (#%brackets i) (#%brackets j) = STYLE_PLAIN |;|)) screenDirty (#%parens top |,| bottom) |;|)) public void screenScroll (#%parens int amount) (#%braces screenScrollRegion (#%parens regionTop |,| regionBottom |,| amount) |;|) public void screenClearEOL (#%parens) (#%braces for (#%parens int i = curCol |;| i <= regionRight |;| i ++) (#%braces page (#%brackets curRow) (#%brackets i) = #\space |;| style (#%brackets curRow) (#%brackets i) = STYLE_PLAIN |;|) screenDirty (#%parens curRow |,| curRow) |;|) public void screenClearBOL (#%parens) (#%braces for (#%parens int i = regionLeft |;| i <= curCol |;| i ++) (#%braces page (#%brackets curRow) (#%brackets i) = #\space |;| style (#%brackets curRow) (#%brackets i) = STYLE_PLAIN |;|) screenDirty (#%parens curRow |,| curRow) |;|) public void screenClearLine (#%parens) (#%braces for (#%parens int i = regionLeft |;| i <= regionRight |;| i ++) (#%braces page (#%brackets curRow) (#%brackets i) = #\space |;| style (#%brackets curRow) (#%brackets i) = STYLE_PLAIN |;|) screenDirty (#%parens curRow |,| curRow) |;|) public void screenClearEOD (#%parens) (#%braces int left = curCol |;| for (#%parens int j = curRow |;| j <= regionBottom |;| j ++) (#%braces for (#%parens int i = left |;| i <= regionRight |;| i ++) (#%braces page (#%brackets j) (#%brackets i) = #\space |;| style (#%brackets j) (#%brackets i) = STYLE_PLAIN |;|) left = regionLeft |;|) screenDirty (#%parens curRow |,| regionBottom) |;|) public void screenClearBOD (#%parens) (#%braces for (#%parens int j = regionTop |;| j < curRow |;| j ++) (#%braces for (#%parens int i = regionLeft |;| i <= regionRight |;| i ++) (#%braces page (#%brackets j) (#%brackets i) = #\space |;| style (#%brackets j) (#%brackets i) = STYLE_PLAIN |;|)) for (#%parens int i = regionLeft |;| i < curCol |;| i ++) (#%braces page (#%brackets curRow) (#%brackets i) = #\space |;| style (#%brackets curRow) (#%brackets i) = STYLE_PLAIN |;|) screenDirty (#%parens regionTop |,| curRow) |;|) public void screenClear (#%parens) (#%braces for (#%parens int j = regionTop |;| j <= regionBottom |;| j ++) (#%braces for (#%parens int i = regionLeft |;| i <= regionRight |;| i ++) (#%braces page (#%brackets j) (#%brackets i) = #\space |;| style (#%brackets j) (#%brackets i) = STYLE_PLAIN |;|)) screenDirty (#%parens regionTop |,| regionBottom) |;|) public synchronized void write (#%parens char (#%brackets) d |,| int off |,| int len |,| int flags) (#%braces if (#%parens DEBUG) (#%braces if (#%parens d == null) d = new char (#%brackets 0) |;| System |.| out |.| println (#%parens "Write: " + new String (#%parens d |,| off |,| len)) |;|) if (#%parens len == 1) (#%braces write (#%parens d (#%brackets off) |,| flags) |;|) else if (#%parens len > 1) (#%braces while (#%parens len > 0) (#%braces int last_row = curRow |;| boolean do_redraw |;| if (#%parens (#%parens flags & OUTF_RAW) != 0) do_redraw = put_char (#%parens d (#%brackets off)) |;| else do_redraw = put_std_char (#%parens d (#%brackets off)) |;| if (#%parens do_redraw) (#%braces if (#%parens last_row < curRow) screenDirty (#%parens last_row |,| curRow) |;| else screenDirty (#%parens curRow |,| last_row) |;|) off ++ |;| len -- |;|) if (#%parens (#%parens flags & OUTF_PARTIAL) == 0) screenClean (#%parens getGraphics (#%parens)) |;|) else if (#%parens (#%parens flags & OUTF_PARTIAL) == 0) screenClean (#%parens getGraphics (#%parens)) |;|) public void write (#%parens String str |,| int flags) (#%braces write (#%parens str |.| toCharArray (#%parens) |,| 0 |,| str |.| length (#%parens) |,| flags) |;|) public synchronized void write (#%parens char c |,| int flags) (#%braces int last_col = curCol |,| last_row = curRow |;| boolean do_redraw |;| if (#%parens (#%parens flags & OUTF_RAW) != 0) do_redraw = put_char (#%parens c) |;| else do_redraw = put_std_char (#%parens c) |;| if (#%parens do_redraw) (#%braces if (#%parens last_row < curRow) screenDirty (#%parens last_row |,| curRow) |;| else screenDirty (#%parens curRow |,| last_row) |;|) if (#%parens (#%parens flags & OUTF_PARTIAL) == 0) screenClean (#%parens getGraphics (#%parens)) |;|) boolean put_char (#%parens char c) (#%braces if (#%parens curCol >= regionRight && ! overChar) (#%braces page (#%brackets curRow) (#%brackets curCol) = c |;| style (#%brackets curRow) (#%brackets curCol) = curStyle |;| curCol = regionRight |;| overChar = true |;|) else if (#%parens curCol >= regionRight && overChar) (#%braces overChar = false |;| screenScroll (#%parens - 1) |;| curRow = regionBottom |;| curCol = 1 |;| page (#%brackets curRow) (#%brackets 0) = c |;| style (#%brackets curRow) (#%brackets 0) = curStyle |;| screenDirty (#%parens regionBottom - 1 |,| regionBottom) |;|) else (#%braces page (#%brackets curRow) (#%brackets curCol) = c |;| style (#%brackets curRow) (#%brackets curCol) = curStyle |;| curCol ++ |;| overChar = false |;|) return true |;|) static final char CTRL_A = (#%parens char) 1 |;| static final char CTRL_B = (#%parens char) 2 |;| static final char CTRL_C = (#%parens char) 3 |;| static final char CTRL_D = (#%parens char) 4 |;| static final char CTRL_E = (#%parens char) 5 |;| static final char CTRL_F = (#%parens char) 6 |;| static final char CTRL_G = (#%parens char) 7 |;| static final char CTRL_H = (#%parens char) 8 |;| static final char CTRL_I = (#%parens char) 9 |;| static final char CTRL_J = (#%parens char) 10 |;| static final char CTRL_K = (#%parens char) 11 |;| static final char CTRL_L = (#%parens char) 12 |;| static final char CTRL_M = (#%parens char) 13 |;| static final char CTRL_N = (#%parens char) 14 |;| static final char CTRL_O = (#%parens char) 15 |;| static final char CTRL_P = (#%parens char) 16 |;| static final char CTRL_Q = (#%parens char) 17 |;| static final char CTRL_R = (#%parens char) 18 |;| static final char CTRL_S = (#%parens char) 19 |;| static final char CTRL_T = (#%parens char) 20 |;| static final char CTRL_U = (#%parens char) 21 |;| static final char CTRL_V = (#%parens char) 22 |;| static final char CTRL_W = (#%parens char) 23 |;| static final char CTRL_X = (#%parens char) 24 |;| static final char CTRL_Y = (#%parens char) 25 |;| static final char CTRL_Z = (#%parens char) 26 |;| boolean put_std_char (#%parens char c) (#%braces boolean do_redraw = false |;| switch (#%parens c) (#%braces case 0 : break |;| case CTRL_G : break |;| case CTRL_I : break |;| case #\newline : if (#%parens curRow >= regionBottom) (#%braces screenScroll (#%parens - 1) |;| curRow = regionBottom |;| screenDirty (#%parens regionBottom |,| regionBottom) |;|) else (#%braces curRow ++ |;|) overChar = false |;| curCol = regionLeft |;| break |;| case #\return : break |;| case #\page : screenInit (#%parens) |;| break |;| case CTRL_H : case 0 x7f : if (#%parens DEBUG) System |.| out |.| println (#%parens "Delete pressed:" + curCol + "," + regionRight) |;| if (#%parens curCol > 0) (#%braces for (#%parens int i = curCol - 1 |;| (#%parens i < regionRight) |;| i ++) (#%braces page (#%brackets curRow) (#%brackets i) = page (#%brackets curRow) (#%brackets i + 1) |;| style (#%brackets curRow) (#%brackets i) = style (#%brackets curRow) (#%brackets i + 1) |;|) page (#%brackets curRow) (#%brackets regionRight) = #\space |;| style (#%brackets curRow) (#%brackets regionRight) = STYLE_PLAIN |;| screenDirty (#%parens curRow |,| curRow) |;| curCol = curCol - 1 |;| do_redraw = true |;|) else (#%braces do_redraw = false |;|) break |;| default : do_redraw = put_char (#%parens c) |;| break |;|) return do_redraw |;|) public synchronized boolean keyDown (#%parens Event e |,| int key) (#%braces if (#%parens DEBUG) System |.| out |.| println (#%parens "Key event: " + key) |;| if (#%parens computeThread != null) (#%braces if (#%parens computeThread |.| isAlive (#%parens)) (#%braces computeThread |.| stop (#%parens) |;| write (#%parens "**interrupted** " |,| 0) |;| computeThread = null |;| return true |;|) computeThread = null |;|) if (#%parens key == #\newline) (#%braces String s = new String (#%parens) |;| for (#%parens int i = 0 |;| i < curCol |;| i ++) (#%braces s += page (#%brackets curRow) (#%brackets i) |;|) write (#%parens (#%parens char) key |,| 0) |;| computeThread = HalServer |.| processline (#%parens s) |;|) else (#%braces write (#%parens (#%parens char) key |,| 0) |;|) return true |;|) public boolean mouseDown (#%parens Event evt |,| int x |,| int y) (#%braces requestFocus (#%parens) |;| return true |;|) boolean have_focus = false |;| void draw_border (#%parens Graphics g) (#%braces Dimension d = size (#%parens) |;| if (#%parens have_focus) (#%braces g |.| setColor (#%parens getForeground (#%parens)) |;|) else (#%braces g |.| setColor (#%parens getBackground (#%parens)) |;|) g |.| drawRect (#%parens 0 |,| 0 |,| d |.| width |,| d |.| height) |;| g |.| drawRect (#%parens 1 |,| 1 |,| d |.| width - 2 |,| d |.| height - 2) |;| g |.| setColor (#%parens Color |.| white) |;| g |.| draw3DRect (#%parens 2 |,| 2 |,| d |.| width - 4 |,| d |.| height - 4 |,| true) |;| g |.| draw3DRect (#%parens 3 |,| 3 |,| d |.| width - 6 |,| d |.| height - 6 |,| true) |;|) public void paint (#%parens Graphics g) (#%braces draw_border (#%parens g) |;| screenRedraw (#%parens g) |;|) public boolean gotFocus (#%parens Event evt |,| Object what) (#%braces Graphics g = getGraphics (#%parens) |;| have_focus = true |;| if (#%parens g != null) draw_border (#%parens g) |;| return true |;|) public boolean lostFocus (#%parens Event evt |,| Object what) (#%braces Graphics g = getGraphics (#%parens) |;| have_focus = false |;| if (#%parens g != null) draw_border (#%parens g) |;| return true |;|) public final synchronized void update (#%parens Graphics g) (#%braces paint (#%parens g) |;|)))