/* * Licensed to the Apache Software Foundation (ASF) under one * or more contributor license agreements. See the NOTICE file * distributed with this work for additional information * regarding copyright ownership. The ASF licenses this file * to you under the Apache License, Version 2.0 (the * "License"); you may not use this file except in compliance * with the License. You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, * software distributed under the License is distributed on an * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY * KIND, either express or implied. See the License for the * specific language governing permissions and limitations * under the License. */ package org.apache.felix.service.terminal; import java.io.*; /** * Terminal. * * The Terminal interface describes a minimal terminal that can easily be mapped * to command line editing tools. * * A Terminal is associated with an Input Stream and an Output Stream. The Input * Stream represents the keyboard and the Output Stream the screen. * * A terminal does not block the input, each character is returned as it is * typed, no buffering or line editing takes place, characters are also not * echoed. However, the Input Stream is not restricted to bytes only, it can * also return translated key strokes. Integers from 1000 are used for those. * Not all keys have to be supported by an implementation. * * A number of functions is provided to move the cursor and erase * characters/lines/screens. Any text outputed to the Output Stream is * immediately added to the cursor position, which is then moved forwards. The * control characters (LF,CR,TAB,BS) perform their normal actions. However lines * do not wrap. Text typed that is longer than the window will not be visible, * it is the responsibility of the sender to ensure this does not happen. * * A screen is considered to be {@link #height()} lines that each have * {@link #width()} characters. For cursor positioning, the screen is assumed to * be starting at 0,0 and increases its position from left to right and from top * to bottom. Positioning outside the screen bounds is undefined. */ public interface Terminal { /** * Cursor up key */ int CURSOR_UP = 1000; /** * Cursor down key. */ int CURSOR_DOWN = 1001; /** * Cursors forward key. Usually right. */ int CURSOR_FORWARD = 1002; /** * Cursors backward key. Usually left. */ int CURSOR_BACKWARD = 1003; /** * Page up key */ int PAGE_UP = 1004; /** * Page down key */ int PAGE_DOWN = 1005; /** * Home key */ int HOME = 1006; /** * End key */ int END = 1007; /** * Insert key */ int INSERT = 1008; /** * Delete key */ int DELETE = 1009; /** * Break key */ int BREAK = 1009; /** * Function key 1 */ int F1 = 1101; /** * Function key 2 */ int F2 = 1102; /** * Function key 3 */ int F3 = 1103; /** * Function key 4 */ int F4 = 1104; /** * Function key 5 */ int F5 = 1105; /** * Function key 6 */ int F6 = 1106; /** * Function key 7 */ int F7 = 1107; /** * Function key 8 */ int F8 = 1108; /** * Function key 9 */ int F9 = 1109; /** * Function key 10 */ int F10 = 1110; /** * Function key 11 */ int F11 = 1111; /** * Function key 12 */ int F12 = 1112; enum Attribute { BLINK, UNDERLINE, STRIKE_THROUGH, BOLD, DIM, REVERSED; } enum Color { NONE, BLACK, GREEN, YELLOW, MAGENTA, CYAN, BLUE, RED, WHITE; } /** * Return the associated Input Stream that represents the keyboard. Note * that this InputStream can return values > 256, these characters are * defined in this interface as special keys. This Input Stream should not * be closed by the client. If the client is done, it should unget the * services. * * @return the current Input Stream. */ InputStream getInputStream(); /** * Return the Output Stream that is associated with the screen. Any writes * Clear the complete screen and position the cursor at 0,0. * * @throws Exception */ void clear() throws Exception; /** * Leave the cursor where it is but clear the remainder of the line. */ void eraseEndOfLine(); /** * Move the cursor up one line, this must not cause a scroll if the cursor * moves off the screen. * * @throws Exception */ void up() throws Exception; /** * Move the cursor down one line, this must not cause a scroll if the * cursors moves off the screen. * * @throws Exception */ void down() throws Exception; /** * Move the cursor backward. Must not wrap to previous line. * * @throws Exception */ void backward() throws Exception; /** * Move the cursor forward. Must not wrap to next line if the cursor becomes * higher than the width. * * @throws Exception */ void forward() throws Exception; /** * Return the actual width of the screen. Some screens can change their size * and this method must return the actual width. * * @return the width of the screen. * * @throws Exception */ int width() throws Exception; /** * Return the actual height of the screen. Some screens can change their * size and this method must return the actual height. * * @return the height of the screen. * * @throws Exception */ int height() throws Exception; /** * Return the current cursor position. * * The position is returned as an array of 2 elements. The first element is * the x position and the second elements is the y position. Both are zero * based. * * @return the current position or null if not possible. * * @throws Exception */ int[] getPosition() throws Exception; /** * Position the cursor on the screen. Positioning starts at 0,0 and the * maxium value is given by {@link #width()}, {@link #height()}. The visible * cursor is moved to this position and text insertion will continue from * that position. * * @param x * The x position, must be from 0-width * @param y * The y position, must be from 0-height * @throws IllegalArgumenException * when x or y is not in range * @throws Exception */ boolean position(int x, int y) throws Exception; /** * Set the attributes of the text to outputed. This method * must reset all current attributes. That is, attributes * are not inherited from the current position. * * @param foreground The foreground color * @param background The background color (around the character) * @param attr A number of attributes. */ boolean attributes(Color foreground, Color background, Attribute... attr); }