X-Git-Url: http://git.nikiroo.be/?a=blobdiff_plain;f=src%2Fjexer%2FTApplication.java;h=8be6af5af54a9a024d67976a7f6960fe2d4bba90;hb=7c870d89433346ccb5505f8f9ba62d3fc18fe996;hp=0e5020a05896d3a843c0bc3303a5d77d3851b752;hpb=e7083f0b935964ca5a04835187397ff117941044;p=fanfix.git diff --git a/src/jexer/TApplication.java b/src/jexer/TApplication.java index 0e5020a..8be6af5 100644 --- a/src/jexer/TApplication.java +++ b/src/jexer/TApplication.java @@ -51,18 +51,17 @@ import jexer.event.TMenuEvent; import jexer.event.TMouseEvent; import jexer.event.TResizeEvent; import jexer.backend.Backend; -import jexer.backend.AWTBackend; +import jexer.backend.SwingBackend; import jexer.backend.ECMA48Backend; import jexer.io.Screen; import jexer.menu.TMenu; import jexer.menu.TMenuItem; import static jexer.TCommand.*; -import static jexer.TKeypress.*; /** * TApplication sets up a full Text User Interface application. */ -public class TApplication { +public class TApplication implements Runnable { /** * If true, emit thread stuff to System.err. @@ -74,6 +73,26 @@ public class TApplication { */ private static final boolean debugEvents = false; + /** + * Two backend types are available. + */ + public static enum BackendType { + /** + * A Swing JFrame. + */ + SWING, + + /** + * An ECMA48 / ANSI X3.64 / XTERM style terminal. + */ + ECMA48, + + /** + * Synonym for ECMA48 + */ + XTERM + } + /** * WidgetEventHandler is the main event consumer loop. There are at most * two such threads in existence: the primary for normal case and a @@ -462,6 +481,29 @@ public class TApplication { /** * Public constructor. * + * @param backendType BackendType.XTERM, BackendType.ECMA48 or + * BackendType.SWING + * @throws UnsupportedEncodingException if an exception is thrown when + * creating the InputStreamReader + */ + public TApplication(final BackendType backendType) + throws UnsupportedEncodingException { + + switch (backendType) { + case SWING: + backend = new SwingBackend(this); + break; + case XTERM: + // Fall through... + case ECMA48: + backend = new ECMA48Backend(this, null, null); + } + TApplicationImpl(); + } + + /** + * Public constructor. The backend type will be BackendType.ECMA48. + * * @param input an InputStream connected to the remote user, or null for * System.in. If System.in is used, then on non-Windows systems it will * be put in raw mode; shutdown() will (blindly!) put System.in in cooked @@ -475,26 +517,25 @@ public class TApplication { public TApplication(final InputStream input, final OutputStream output) throws UnsupportedEncodingException { - // AWT is the default backend on Windows unless explicitly overridden - // by jexer.AWT. - boolean useAWT = false; - if (System.getProperty("os.name").startsWith("Windows")) { - useAWT = true; - } - if (System.getProperty("jexer.AWT") != null) { - if (System.getProperty("jexer.AWT", "false").equals("true")) { - useAWT = true; - } else { - useAWT = false; - } - } + backend = new ECMA48Backend(this, input, output); + TApplicationImpl(); + } + /** + * Public constructor. This hook enables use with new non-Jexer + * backends. + * + * @param backend a Backend that is already ready to go. + */ + public TApplication(final Backend backend) { + this.backend = backend; + TApplicationImpl(); + } - if (useAWT) { - backend = new AWTBackend(this); - } else { - backend = new ECMA48Backend(this, input, output); - } + /** + * Finish construction once the backend is set. + */ + private void TApplicationImpl() { theme = new ColorTheme(); desktopBottom = getScreen().getHeight() - 1; fillEventQueue = new ArrayList(); @@ -528,7 +569,7 @@ public class TApplication { /** * Draw everything. */ - public final void drawAll() { + private void drawAll() { if (debugThreads) { System.err.printf("drawAll() enter\n"); } @@ -582,7 +623,7 @@ public class TApplication { for (TMenu menu: menus) { CellAttributes menuColor; CellAttributes menuMnemonicColor; - if (menu.getActive()) { + if (menu.isActive()) { menuColor = theme.getColor("tmenu.highlighted"); menuMnemonicColor = theme.getColor("tmenu.mnemonic.highlighted"); } else { @@ -597,7 +638,7 @@ public class TApplication { getScreen().putCharXY(x + 1 + menu.getMnemonic().getShortcutIdx(), 0, menu.getMnemonic().getShortcut(), menuMnemonicColor); - if (menu.getActive()) { + if (menu.isActive()) { menu.drawChildren(); // Reset the screen clipping so we can draw the next title. getScreen().resetClipping(); @@ -618,7 +659,7 @@ public class TApplication { TWidget activeWidget = null; if (sorted.size() > 0) { activeWidget = sorted.get(sorted.size() - 1).getActiveChild(); - if (activeWidget.visibleCursor()) { + if (activeWidget.isCursorVisible()) { getScreen().putCursor(true, activeWidget.getCursorAbsoluteX(), activeWidget.getCursorAbsoluteY()); cursor = true; @@ -639,7 +680,7 @@ public class TApplication { /** * Run this application until it exits. */ - public final void run() { + public void run() { while (!quit) { // Timeout is in milliseconds, so default timeout after 1 second // of inactivity. @@ -844,11 +885,11 @@ public class TApplication { break; } if ((mouse.getType() == TMouseEvent.Type.MOUSE_MOTION) - && (!mouse.getMouse1()) - && (!mouse.getMouse2()) - && (!mouse.getMouse3()) - && (!mouse.getMouseWheelUp()) - && (!mouse.getMouseWheelDown()) + && (!mouse.isMouse1()) + && (!mouse.isMouse2()) + && (!mouse.isMouse3()) + && (!mouse.isMouseWheelUp()) + && (!mouse.isMouseWheelDown()) ) { break; } @@ -880,7 +921,7 @@ public class TApplication { item = accelerators.get(keypressLowercase); } if (item != null) { - if (item.getEnabled()) { + if (item.isEnabled()) { // Let the menu item dispatch item.dispatch(); return; @@ -906,7 +947,7 @@ public class TApplication { // Dispatch events to the active window ------------------------------- for (TWindow window: windows) { - if (window.getActive()) { + if (window.isActive()) { if (event instanceof TMouseEvent) { TMouseEvent mouse = (TMouseEvent) event; // Convert the mouse relative x/y to window coordinates @@ -1091,7 +1132,7 @@ public class TApplication { // Swap z/active between active window and the next in the list int activeWindowI = -1; for (int i = 0; i < windows.size(); i++) { - if (windows.get(i).getActive()) { + if (windows.get(i).isActive()) { activeWindowI = i; break; } @@ -1200,7 +1241,7 @@ public class TApplication { // See if they hit the menu bar if ((mouse.getType() == TMouseEvent.Type.MOUSE_DOWN) - && (mouse.getMouse1()) + && (mouse.isMouse1()) && (!modalWindowActive()) && (mouse.getAbsoluteY() == 0) ) { @@ -1227,7 +1268,7 @@ public class TApplication { // See if they hit the menu bar if ((mouse.getType() == TMouseEvent.Type.MOUSE_MOTION) - && (mouse.getMouse1()) + && (mouse.isMouse1()) && (activeMenu != null) && (mouse.getAbsoluteY() == 0) ) { @@ -1281,8 +1322,8 @@ public class TApplication { } // We will be switching to another window - assert (windows.get(0).getActive()); - assert (!window.getActive()); + assert (windows.get(0).isActive()); + assert (!window.isActive()); windows.get(0).setActive(false); windows.get(0).setZ(window.getZ()); window.setZ(0); @@ -1440,9 +1481,9 @@ public class TApplication { // Default: only menu shortcuts // Process Alt-F, Alt-E, etc. menu shortcut keys - if (!keypress.getKey().getIsKey() - && keypress.getKey().getAlt() - && !keypress.getKey().getCtrl() + if (!keypress.getKey().isFnKey() + && keypress.getKey().isAlt() + && !keypress.getKey().isCtrl() && (activeMenu == null) ) { @@ -1450,7 +1491,7 @@ public class TApplication { for (TMenu menu: menus) { if (Character.toLowerCase(menu.getMnemonic().getShortcut()) - == Character.toLowerCase(keypress.getKey().getCh()) + == Character.toLowerCase(keypress.getKey().getChar()) ) { activeMenu = menu; menu.setActive(true);