stubs for TFileOpenBox, cleanup putStringXY
authorKevin Lamonte <kevin.lamonte@gmail.com>
Sat, 28 Mar 2015 17:01:43 +0000 (13:01 -0400)
committerKevin Lamonte <kevin.lamonte@gmail.com>
Sat, 28 Mar 2015 17:01:43 +0000 (13:01 -0400)
34 files changed:
README.md
src/jexer/TApplication.java
src/jexer/TButton.java
src/jexer/TCheckbox.java
src/jexer/TDirectoryList.java [new file with mode: 0644]
src/jexer/TDirectoryTreeItem.java
src/jexer/TField.java
src/jexer/TFileOpenBox.java [new file with mode: 0644]
src/jexer/TLabel.java
src/jexer/TPasswordField.java
src/jexer/TRadioButton.java
src/jexer/TRadioGroup.java
src/jexer/TTerminalWindow.java
src/jexer/TText.java
src/jexer/TTreeItem.java
src/jexer/TTreeView.java
src/jexer/TWidget.java
src/jexer/TWindow.java
src/jexer/bits/Color.java
src/jexer/demos/Demo1.java
src/jexer/demos/DemoApplication.java
src/jexer/demos/DemoCheckboxWindow.java
src/jexer/demos/DemoMainWindow.java
src/jexer/demos/DemoMsgBoxWindow.java
src/jexer/demos/DemoTextWindow.java
src/jexer/demos/DemoTreeViewWindow.java
src/jexer/io/ECMA48Terminal.java
src/jexer/io/Screen.java
src/jexer/io/SwingScreen.java
src/jexer/io/SwingTerminal.java
src/jexer/menu/TMenuItem.java
src/jexer/net/TelnetInputStream.java
src/jexer/net/TelnetOutputStream.java
src/jexer/tterminal/ECMA48.java

index 9ffed93744fd9fb9127e5991e32e0f397583a809..693e278ac79ef146f6d787b1fc741cd91653b37b 100644 (file)
--- a/README.md
+++ b/README.md
@@ -175,11 +175,10 @@ Many tasks remain before calling this version 1.0:
 
 0.0.3: FINISH PORTING
 
-- TTreeView
-  - Also add keyboard navigation
 - TDirectoryList
   - Also add keyboard navigation
 - TFileOpen
+  - Also add keyboard navigation
 
 0.0.4: NEW STUFF
 
index a37cf03d7382fe564562a2faa06059c5be900c2c..d0c34bf0303adbe99e917f6afbcd278032915af6 100644 (file)
@@ -31,6 +31,7 @@
 package jexer;
 
 import java.io.InputStream;
+import java.io.IOException;
 import java.io.OutputStream;
 import java.io.UnsupportedEncodingException;
 import java.util.Collections;
@@ -646,7 +647,7 @@ public class TApplication implements Runnable {
             // Draw the menu title
             getScreen().hLineXY(x, 0, menu.getTitle().length() + 2, ' ',
                 menuColor);
-            getScreen().putStrXY(x + 1, 0, menu.getTitle(), menuColor);
+            getScreen().putStringXY(x + 1, 0, menu.getTitle(), menuColor);
             // Draw the highlight character
             getScreen().putCharXY(x + 1 + menu.getMnemonic().getShortcutIdx(),
                 0, menu.getMnemonic().getShortcut(), menuMnemonicColor);
@@ -1820,4 +1821,30 @@ public class TApplication implements Runnable {
         return new TTerminalWindow(this, x, y, flags);
     }
 
+    /**
+     * Convenience function to spawn an file open box.
+     *
+     * @param path path of selected file
+     * @return the result of the new file open box
+     */
+    public final String fileOpenBox(final String path) throws IOException {
+
+        TFileOpenBox box = new TFileOpenBox(this, path, TFileOpenBox.Type.OPEN);
+        return box.getFilename();
+    }
+
+    /**
+     * Convenience function to spawn an file open box.
+     *
+     * @param path path of selected file
+     * @param type one of the Type constants
+     * @return the result of the new file open box
+     */
+    public final String fileOpenBox(final String path,
+        final TFileOpenBox.Type type) throws IOException {
+
+        TFileOpenBox box = new TFileOpenBox(this, path, type);
+        return box.getFilename();
+    }
+
 }
index ce04f5c79a51de37c935b71bd74e99043aa3dc49..0fc36a2de2afac6f682e44af5e930289c9cbb60a 100644 (file)
@@ -158,11 +158,11 @@ public final class TButton extends TWidget {
 
         if (inButtonPress) {
             getScreen().putCharXY(1, 0, ' ', buttonColor);
-            getScreen().putStrXY(2, 0, mnemonic.getRawLabel(), buttonColor);
+            getScreen().putStringXY(2, 0, mnemonic.getRawLabel(), buttonColor);
             getScreen().putCharXY(getWidth() - 1, 0, ' ', buttonColor);
         } else {
             getScreen().putCharXY(0, 0, ' ', buttonColor);
-            getScreen().putStrXY(1, 0, mnemonic.getRawLabel(), buttonColor);
+            getScreen().putStringXY(1, 0, mnemonic.getRawLabel(), buttonColor);
             getScreen().putCharXY(getWidth() - 2, 0, ' ', buttonColor);
 
             getScreen().putCharXY(getWidth() - 1, 0,
index 1562ca023d9af4c2adee8139f837cbbdcb5c190b..e15a47f8f8e7795f133cd3e2a7c29ec45a78c801 100644 (file)
@@ -127,7 +127,7 @@ public final class TCheckbox extends TWidget {
             getScreen().putCharXY(1, 0, ' ', checkboxColor);
         }
         getScreen().putCharXY(2, 0, ']', checkboxColor);
-        getScreen().putStrXY(4, 0, label, checkboxColor);
+        getScreen().putStringXY(4, 0, label, checkboxColor);
     }
 
     /**
diff --git a/src/jexer/TDirectoryList.java b/src/jexer/TDirectoryList.java
new file mode 100644 (file)
index 0000000..3a09bf3
--- /dev/null
@@ -0,0 +1,313 @@
+/**
+ * Jexer - Java Text User Interface
+ *
+ * License: LGPLv3 or later
+ *
+ * This module is licensed under the GNU Lesser General Public License
+ * Version 3.  Please see the file "COPYING" in this directory for more
+ * information about the GNU Lesser General Public License Version 3.
+ *
+ *     Copyright (C) 2015  Kevin Lamonte
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public License
+ * as published by the Free Software Foundation; either version 3 of
+ * the License, or (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful, but
+ * WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+ * General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this program; if not, see
+ * http://www.gnu.org/licenses/, or write to the Free Software
+ * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
+ * 02110-1301 USA
+ *
+ * @author Kevin Lamonte [kevin.lamonte@gmail.com]
+ * @version 1
+ */
+package jexer;
+
+import java.io.File;
+import java.util.ArrayList;
+import java.util.List;
+
+import jexer.bits.CellAttributes;
+import jexer.event.TKeypressEvent;
+import jexer.event.TMouseEvent;
+import static jexer.TKeypress.*;
+
+/**
+ * TDirectoryList shows the files within a directory.
+ */
+public class TDirectoryList extends TWidget {
+
+    /**
+     * Files in the directory.
+     */
+    private List<File> files;
+
+    /**
+     * Selected file.
+     */
+    private int selectedFile = -1;
+
+    /**
+     * Root path containing files to display.
+     */
+    public File path;
+
+    /**
+     * Vertical scrollbar.
+     */
+    private TVScroller vScroller;
+
+    /**
+     * Horizontal scrollbar.
+     */
+    private THScroller hScroller;
+
+    /**
+     * Maximum width of a single line.
+     */
+    private int maxLineWidth;
+
+    /**
+     * The action to perform when the user selects an item.
+     */
+    private TAction action = null;
+
+    /**
+     * Perform user selection action.
+     */
+    public void dispatch() {
+        assert (selectedFile >= 0);
+        assert (selectedFile < files.size());
+        if (action != null) {
+            action.DO();
+        }
+    }
+
+    /**
+     * Format one of the entries for drawing on the screen.
+     *
+     * @param index index into files
+     * @return the line to draw
+     */
+    private String renderFile(int index) {
+        File file = files.get(index);
+        String name = file.getName();
+        if (name.length() > 20) {
+            name = name.substring(0, 17) + "...";
+        }
+        return String.format("%-20s %5dk", name, (file.length() / 1024));
+    }
+
+    /**
+     * Resize for a new width/height.
+     */
+    public void reflow() {
+
+        // Reset the lines
+        selectedFile = -1;
+        maxLineWidth = 0;
+        files.clear();
+
+        // Build a list of files in this directory
+        File [] newFiles = path.listFiles();
+        for (int i = 0; i < newFiles.length; i++) {
+            if (newFiles[i].getName().startsWith(".")) {
+                continue;
+            }
+            if (newFiles[i].isDirectory()) {
+                continue;
+            }
+            files.add(newFiles[i]);
+        }
+
+        for (int i = 0; i < files.size(); i++) {
+            String line = renderFile(i);
+            if (line.length() > maxLineWidth) {
+                maxLineWidth = line.length();
+            }
+        }
+
+        // Start at the top
+        if (vScroller == null) {
+            vScroller = new TVScroller(this, getWidth() - 1, 0,
+                getHeight() - 1);
+        } else {
+            vScroller.setX(getWidth() - 1);
+            vScroller.setHeight(getHeight() - 1);
+        }
+        vScroller.setBottomValue(files.size() - getHeight() - 1);
+        vScroller.setTopValue(0);
+        vScroller.setValue(0);
+        if (vScroller.getBottomValue() < 0) {
+            vScroller.setBottomValue(0);
+        }
+        vScroller.setBigChange(getHeight() - 1);
+
+        // Start at the left
+        if (hScroller == null) {
+            hScroller = new THScroller(this, 0, getHeight() - 1,
+                getWidth() - 1);
+        } else {
+            hScroller.setY(getHeight() - 1);
+            hScroller.setWidth(getWidth() - 1);
+        }
+        hScroller.setRightValue(maxLineWidth - getWidth() + 1);
+        hScroller.setLeftValue(0);
+        hScroller.setValue(0);
+        if (hScroller.getRightValue() < 0) {
+            hScroller.setRightValue(0);
+        }
+        hScroller.setBigChange(getWidth() - 1);
+    }
+
+    /**
+     * Public constructor.
+     *
+     * @param parent parent widget
+     * @param path directory path, must be a directory
+     * @param x column relative to parent
+     * @param y row relative to parent
+     * @param width width of text area
+     * @param height height of text area
+     */
+    public TDirectoryList(final TWidget parent, final String path, final int x,
+        final int y, final int width, final int height) {
+
+        this(parent, path, x, y, width, height, null);
+    }
+
+    /**
+     * Public constructor.
+     *
+     * @param parent parent widget
+     * @param path directory path, must be a directory
+     * @param x column relative to parent
+     * @param y row relative to parent
+     * @param width width of text area
+     * @param height height of text area
+     * @param action action to perform when an item is selected
+     */
+    public TDirectoryList(final TWidget parent, final String path, final int x,
+        final int y, final int width, final int height, final TAction action) {
+
+        this.path   = new File(path);
+        this.action = action;
+        files = new ArrayList<File>();
+        reflow();
+    }
+
+    /**
+     * Draw the files list.
+     */
+    @Override
+    public void draw() {
+        CellAttributes color = null;
+        int begin = vScroller.getValue();
+        int topY = 0;
+        for (int i = begin; i < files.size() - 1; i++) {
+            String line = renderFile(i);
+            if (hScroller.getValue() < line.length()) {
+                line = line.substring(hScroller.getValue());
+            } else {
+                line = "";
+            }
+            if (i == selectedFile) {
+                color = getTheme().getColor("tdirectorylist.selected");
+            } else if (isAbsoluteActive()) {
+                color = getTheme().getColor("tdirectorylist");
+            } else {
+                color = getTheme().getColor("tdirectorylist.inactive");
+            }
+            String formatString = "%-" + Integer.toString(getWidth() - 1) + "s";
+            getScreen().putStringXY(0, topY, String.format(formatString, line),
+                    color);
+            topY++;
+            if (topY >= getHeight() - 1) {
+                break;
+            }
+        }
+
+        // Pad the rest with blank lines
+        for (int i = topY; i < getHeight() - 1; i++) {
+            getScreen().hLineXY(0, i, getWidth() - 1, ' ', color);
+        }
+    }
+
+    /**
+     * Handle mouse press events.
+     *
+     * @param mouse mouse button press event
+     */
+    @Override
+    public void onMouseDown(final TMouseEvent mouse) {
+        if (mouse.isMouseWheelUp()) {
+            vScroller.decrement();
+            return;
+        }
+        if (mouse.isMouseWheelDown()) {
+            vScroller.increment();
+            return;
+        }
+
+        if ((mouse.getX() < getWidth() - 1)
+            && (mouse.getY() < getHeight() - 1)) {
+            if (vScroller.getValue() + mouse.getY() < files.size()) {
+                selectedFile = vScroller.getValue() + mouse.getY();
+            }
+            path = files.get(selectedFile);
+            dispatch();
+            return;
+        }
+
+        // Pass to children
+        super.onMouseDown(mouse);
+    }
+
+    /**
+     * Handle mouse release events.
+     *
+     * @param mouse mouse button release event
+     */
+    @Override
+    public void onMouseUp(final TMouseEvent mouse) {
+        // Pass to children
+        super.onMouseDown(mouse);
+    }
+
+    /**
+     * Handle keystrokes.
+     *
+     * @param keypress keystroke event
+     */
+    @Override
+    public void onKeypress(final TKeypressEvent keypress) {
+        if (keypress.equals(kbLeft)) {
+            hScroller.decrement();
+        } else if (keypress.equals(kbRight)) {
+            hScroller.increment();
+        } else if (keypress.equals(kbUp)) {
+            vScroller.decrement();
+        } else if (keypress.equals(kbDown)) {
+            vScroller.increment();
+        } else if (keypress.equals(kbPgUp)) {
+            vScroller.bigDecrement();
+        } else if (keypress.equals(kbPgDn)) {
+            vScroller.bigIncrement();
+        } else if (keypress.equals(kbHome)) {
+            vScroller.toTop();
+        } else if (keypress.equals(kbEnd)) {
+            vScroller.toBottom();
+        } else {
+            // Pass other keys (tab etc.) on
+            super.onKeypress(keypress);
+        }
+    }
+
+}
index 25a33dfa50b5958a368cab9097b987caf87e1ff2..01c9b46a4170dad07854cc65898d46e80511d712 100644 (file)
@@ -31,6 +31,7 @@
 package jexer;
 
 import java.io.File;
+import java.io.IOException;
 import java.util.Collections;
 import java.util.List;
 import java.util.LinkedList;
@@ -51,6 +52,8 @@ public class TDirectoryTreeItem extends TTreeItem {
      */
     @Override
     public void onExpand() {
+        // System.err.printf("onExpand() %s\n", dir);
+
         if (dir == null) {
             return;
         }
@@ -70,20 +73,26 @@ public class TDirectoryTreeItem extends TTreeItem {
             return;
         }
 
-        // Refresh my child list
         for (File file: dir.listFiles()) {
-            if (file.getName().equals(".")) {
+            // System.err.printf("   -> file %s %s\n", file, file.getName());
+
+            if (file.getName().startsWith(".")) {
+                // Hide dot-files
                 continue;
             }
             if (!file.isDirectory()) {
                 continue;
             }
 
-            TDirectoryTreeItem item = new TDirectoryTreeItem(getTreeView(),
-                file.getName(), false, false);
+            try {
+                TDirectoryTreeItem item = new TDirectoryTreeItem(getTreeView(),
+                    file.getCanonicalPath(), false, false);
 
-            item.level = this.level + 1;
-            getChildren().add(item);
+                item.level = this.level + 1;
+                getChildren().add(item);
+            } catch (IOException e) {
+                continue;
+            }
         }
         Collections.sort(getChildren());
 
@@ -110,7 +119,9 @@ public class TDirectoryTreeItem extends TTreeItem {
      * @param view root TTreeView
      * @param text text for this item
      */
-    public TDirectoryTreeItem(final TTreeView view, final String text) {
+    public TDirectoryTreeItem(final TTreeView view,
+        final String text) throws IOException {
+
         this(view, text, false, true);
     }
 
@@ -122,7 +133,7 @@ public class TDirectoryTreeItem extends TTreeItem {
      * @param expanded if true, have it expanded immediately
      */
     public TDirectoryTreeItem(final TTreeView view, final String text,
-        final boolean expanded) {
+        final boolean expanded) throws IOException {
 
         this(view, text, expanded, true);
     }
@@ -137,31 +148,38 @@ public class TDirectoryTreeItem extends TTreeItem {
      * return the root path entry
      */
     public TDirectoryTreeItem(final TTreeView view, final String text,
-        final boolean expanded, final boolean openParents) {
+        final boolean expanded, final boolean openParents) throws IOException {
 
         super(view, text, false);
 
-        List<TDirectoryTreeItem> parentItems = new LinkedList<TDirectoryTreeItem>();
         List<String> parentPaths = new LinkedList<String>();
         boolean oldExpanded = expanded;
 
+        // Convert to canonical path
+        File rootPath = new File(text);
+        rootPath = rootPath.getCanonicalFile();
+
         if (openParents == true) {
             setExpanded(true);
 
             // Go up the directory tree
-            File rootPath = new File(text);
             File parent = rootPath.getParentFile();
             while (parent != null) {
                 parentPaths.add(rootPath.getName());
                 rootPath = rootPath.getParentFile();
                 parent = rootPath.getParentFile();
             }
-            setText(rootPath.getName());
+        }
+        dir = rootPath;
+        if (rootPath.getParentFile() == null) {
+            // This is a filesystem root, use its full name
+            setText(rootPath.getCanonicalPath());
         } else {
-            setText(text);
+            // This is a relative path.  We got here because openParents was
+            // false.
+            assert (openParents == false);
+            setText(rootPath.getName());
         }
-
-        dir = new File(getText());
         onExpand();
 
         if (openParents == true) {
index 07a457bcf7eb7beb4e05af9e71f8f782a6cc2227..8055a3893563c7c248e10294de546820c6b4b9a3 100644 (file)
@@ -201,7 +201,7 @@ public class TField extends TWidget {
             end = text.length();
         }
         getScreen().hLineXY(0, 0, getWidth(), GraphicsChars.HATCH, fieldColor);
-        getScreen().putStrXY(0, 0, text.substring(windowStart, end),
+        getScreen().putStringXY(0, 0, text.substring(windowStart, end),
             fieldColor);
 
         // Fix the cursor, it will be rendered by TApplication.drawAll().
diff --git a/src/jexer/TFileOpenBox.java b/src/jexer/TFileOpenBox.java
new file mode 100644 (file)
index 0000000..eb2c924
--- /dev/null
@@ -0,0 +1,243 @@
+/**
+ * Jexer - Java Text User Interface
+ *
+ * License: LGPLv3 or later
+ *
+ * This module is licensed under the GNU Lesser General Public License
+ * Version 3.  Please see the file "COPYING" in this directory for more
+ * information about the GNU Lesser General Public License Version 3.
+ *
+ *     Copyright (C) 2015  Kevin Lamonte
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public License
+ * as published by the Free Software Foundation; either version 3 of
+ * the License, or (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful, but
+ * WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+ * General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this program; if not, see
+ * http://www.gnu.org/licenses/, or write to the Free Software
+ * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
+ * 02110-1301 USA
+ *
+ * @author Kevin Lamonte [kevin.lamonte@gmail.com]
+ * @version 1
+ */
+package jexer;
+
+import java.io.File;
+import java.io.IOException;
+
+import jexer.bits.GraphicsChars;
+import jexer.event.TKeypressEvent;
+import static jexer.TKeypress.*;
+
+/**
+ * TFileOpenBox is a system-modal dialog for selecting a file to open.  Call
+ * it like:
+ *
+ * <p>
+ * <pre>
+ * {@code
+ *     filename = application.fileOpenBox("/path/to/file.ext",
+ *         TFileOpenBox.Type.OPEN);
+ *     if (filename != null) {
+ *         ... the user selected a file, go open it ...
+ *     }
+ * }
+ * </pre>
+ *
+ */
+public final class TFileOpenBox extends TWindow {
+
+    /**
+     * TFileOpenBox can be called for either Open or Save actions.
+     */
+    public enum Type {
+        OPEN,
+        SAVE
+    }
+
+    /**
+     * String to return, or null if the user canceled.
+     */
+    private String filename = null;
+
+    /**
+     * Get the return string.
+     *
+     * @return the filename the user selected, or null if they canceled.
+     */
+    public String getFilename() {
+        return filename;
+    }
+
+    /**
+     * The left-side tree view pane.
+     */
+    private TTreeView treeView;
+
+    /**
+     * The data behind treeView.
+     */
+    private TDirectoryTreeItem treeViewRoot;
+
+    /**
+     * The right-side directory list pane.
+     */
+    @SuppressWarnings("unused")
+    private TDirectoryList directoryList;
+
+    /**
+     * The top row text field.
+     */
+    private TField entryField;
+
+    /**
+     * The Open or Save button.
+     */
+    private TButton openButton;
+
+    /**
+     * Update the fields in response to other field updates.
+     *
+     * @param enter if true, the user manually entered a filename
+     */
+    @SuppressWarnings("unused")
+    private void onUpdate(boolean enter) throws IOException {
+        String newFilename = entryField.getText();
+        File newFile = new File(newFilename);
+        if (newFile.exists()) {
+            if (enter) {
+                if (newFile.isFile()) {
+                    filename = entryField.getText();
+                    getApplication().closeWindow(this);
+                }
+                if (newFile.isDirectory()) {
+                    treeViewRoot = new TDirectoryTreeItem(treeView,
+                        entryField.getText(), true);
+                    treeView.setTreeRoot(treeViewRoot, true);
+                    treeView.reflow();
+                }
+                openButton.setEnabled(false);
+            } else {
+                if (newFile.isFile()) {
+                    openButton.setEnabled(true);
+                } else {
+                    openButton.setEnabled(false);
+                }
+            }
+        } else {
+            openButton.setEnabled(false);
+        }
+    }
+
+    /**
+     * Public constructor.  The file open box will be centered on screen.
+     *
+     * @param application the TApplication that manages this window
+     * @param path path of selected file
+     * @param type one of the Type constants
+     */
+    public TFileOpenBox(final TApplication application, final String path,
+        final Type type) throws IOException {
+
+        // Register with the TApplication
+        super(application, "", 0, 0, 76, 22, MODAL);
+
+        // Add text field
+        entryField = addField(1, 1, getWidth() - 4, false,
+            (new File(path)).getCanonicalPath(),
+            new TAction() {
+                public void DO() {}
+            }, null);
+
+        // Add directory treeView
+        treeView = addTreeView(1, 3, 30, getHeight() - 6,
+            new TAction() {
+                public void DO() {}
+            }
+        );
+        treeViewRoot = new TDirectoryTreeItem(treeView, path, true);
+
+        // Add directory files list
+        directoryList = addDirectoryList(path, 34, 3, 28, getHeight() - 6,
+            new TAction() {
+                public void DO() {}
+            }
+        );
+
+        String openLabel = "";
+        switch (type) {
+        case OPEN:
+            openLabel = " &Open ";
+            setTitle("Open File...");
+            break;
+        case SAVE:
+            openLabel = " &Save ";
+            setTitle("Save File...");
+            break;
+        default:
+            throw new IllegalArgumentException("Invalid type: " + type);
+        }
+
+        // Setup button actions
+        openButton = addButton(openLabel, this.getWidth() - 12, 3,
+            new TAction() {
+                public void DO() {}
+            }
+        );
+        openButton.setEnabled(false);
+
+        addButton("&Cancel", getWidth() - 12, 5,
+            new TAction() {
+                public void DO() {
+                    filename = null;
+                    getApplication().closeWindow(TFileOpenBox.this);
+                }
+            }
+        );
+
+        // Set the secondaryFiber to run me
+        getApplication().enableSecondaryEventReceiver(this);
+
+        // Yield to the secondary thread.  When I come back from the
+        // constructor response will already be set.
+        getApplication().yield();
+    }
+
+    /**
+     * Draw me on screen.
+     */
+    @Override
+    public void draw() {
+        super.draw();
+        getScreen().vLineXY(33, 4, getHeight() - 6, GraphicsChars.WINDOW_SIDE,
+            getBackground());
+    }
+
+    /**
+     * Handle keystrokes.
+     *
+     * @param keypress keystroke event
+     */
+    @Override
+    public void onKeypress(final TKeypressEvent keypress) {
+        // Escape - behave like cancel
+        if (keypress.equals(kbEsc)) {
+            // Close window
+            filename = null;
+            getApplication().closeWindow(this);
+            return;
+        }
+
+        // Pass to my parent
+        super.onKeypress(keypress);
+    }
+
+}
index ad30035980ef1c4ae13fdd3cac0ac89a39eb43b8..801db2a25ac299f5571c70c53611c2fd048538b5 100644 (file)
@@ -108,7 +108,7 @@ public final class TLabel extends TWidget {
         CellAttributes background = getWindow().getBackground();
         color.setBackColor(background.getBackColor());
 
-        getScreen().putStrXY(0, 0, label, color);
+        getScreen().putStringXY(0, 0, label, color);
     }
 
 }
index 5cb9732e6f1e4945257a3b0837d92c90d70e8c63..d68a21c45bbac5a4804aca46fea7d217d2f24946 100644 (file)
@@ -114,7 +114,7 @@ public final class TPasswordField extends TField {
             getScreen().hLineXY(0, 0, getWidth() - 2, '*',
                 fieldColor);
         } else {
-            getScreen().putStrXY(0, 0, text.substring(windowStart, end),
+            getScreen().putStringXY(0, 0, text.substring(windowStart, end),
                 fieldColor);
         }
 
index ddeec0911711b6621be41e4854b459826f93537f..4875e2b935e8a89d2efc8e3040da12f96224510b 100644 (file)
@@ -147,7 +147,7 @@ public final class TRadioButton extends TWidget {
             getScreen().putCharXY(1, 0, ' ', radioButtonColor);
         }
         getScreen().putCharXY(2, 0, ')', radioButtonColor);
-        getScreen().putStrXY(4, 0, label, radioButtonColor);
+        getScreen().putStringXY(4, 0, label, radioButtonColor);
     }
 
     /**
index 723148fd1f781e080901cf013fc41e510a2b5283..365c074e99b3655671ba2e2e38282f83a88831ad 100644 (file)
@@ -106,7 +106,7 @@ public final class TRadioGroup extends TWidget {
             radioGroupColor, radioGroupColor, 3, false);
 
         getScreen().hLineXY(1, 0, label.length() + 2, ' ', radioGroupColor);
-        getScreen().putStrXY(2, 0, label, radioGroupColor);
+        getScreen().putStringXY(2, 0, label, radioGroupColor);
     }
 
     /**
index bb91a6317453f665a08119b8a83f0564fd9e7fa3..6d89e529580f0993b812bade180de4db2b33bea2 100644 (file)
@@ -285,7 +285,7 @@ public class TTerminalWindow extends TWindow {
                     int rc = shell.exitValue();
                     // The emulator exited on its own, all is fine
                     setTitle(String.format("%s [Completed - %d]",
-                            getTitle(), shell.exitValue()));
+                            getTitle(), rc));
                     shell = null;
                     emulator.close();
                 } catch (IllegalThreadStateException e) {
index 64e96bbe602e00a455ea0f35be986240d9fe82b1..2516a0a6e44f72ecfe96f0e7298ddbf05eba2023 100644 (file)
@@ -294,7 +294,7 @@ public final class TText extends TWidget {
                 line = "";
             }
             String formatString = "%-" + Integer.toString(getWidth() - 1) + "s";
-            getScreen().putStrXY(0, topY, String.format(formatString, line),
+            getScreen().putStringXY(0, topY, String.format(formatString, line),
                     color);
             topY++;
 
index e97ea0eb5aa641a4bd818033c6074136d5d0e671..11a81a7f8c1af6fc014e07d9d292fe96add861d7 100644 (file)
@@ -203,6 +203,18 @@ public class TTreeItem extends TWidget {
         this.selectable = selectable;
     }
 
+    /**
+     * Pointer to the previous keyboard-navigable item (kbUp).  Note package
+     * private access.
+     */
+    TTreeItem keyboardPrevious = null;
+
+    /**
+     * Pointer to the next keyboard-navigable item (kbDown).  Note package
+     * private access.
+     */
+    TTreeItem keyboardNext = null;
+
     /**
      * Public constructor.
      *
@@ -323,7 +335,7 @@ public class TTreeItem extends TWidget {
      */
     @Override
     public void onMouseUp(final TMouseEvent mouse) {
-        if ((mouse.getX() == (getExpanderX() - view.hScroller.getValue()))
+        if ((mouse.getX() == (getExpanderX() - view.getHScroller().getValue()))
             && (mouse.getY() == 0)
         ) {
             if (selectable) {
@@ -356,6 +368,34 @@ public class TTreeItem extends TWidget {
         }
     }
 
+    /**
+     * Handle keystrokes.
+     *
+     * @param keypress keystroke event
+     */
+    @Override
+    public void onKeypress(final TKeypressEvent keypress) {
+        if (keypress.equals(kbLeft)
+            || keypress.equals(kbRight)
+            || keypress.equals(kbSpace)
+        ) {
+            if (selectable) {
+                // Flip expanded flag
+                expanded = !expanded;
+                if (expanded == false) {
+                    // Unselect children that became invisible
+                    unselect();
+                }
+                view.setSelected(this);
+            }
+            // Let subclasses do something with this
+            onExpand();
+        } else {
+            // Pass other keys (tab etc.) on to TWidget's handler.
+            super.onKeypress(keypress);
+        }
+    }
+
     /**
      * Draw this item to a window.
      */
@@ -365,7 +405,7 @@ public class TTreeItem extends TWidget {
             return;
         }
 
-        int offset = -view.hScroller.getValue();
+        int offset = -view.getHScroller().getValue();
 
         CellAttributes color = getTheme().getColor("ttreeview");
         CellAttributes textColor = getTheme().getColor("ttreeview");
@@ -384,7 +424,6 @@ public class TTreeItem extends TWidget {
         // Blank out the background
         getScreen().hLineXY(0, 0, getWidth(), ' ', color);
 
-        int expandX = 0;
         String line = prefix;
         if (level > 0) {
             if (last) {
@@ -397,12 +436,12 @@ public class TTreeItem extends TWidget {
                 line += "[ ] ";
             }
         }
-        getScreen().putStrXY(offset, 0, line, color);
+        getScreen().putStringXY(offset, 0, line, color);
         if (selected) {
-            getScreen().putStrXY(offset + line.length(), 0, text,
+            getScreen().putStringXY(offset + line.length(), 0, text,
                 selectedColor);
         } else {
-            getScreen().putStrXY(offset + line.length(), 0, text, textColor);
+            getScreen().putStringXY(offset + line.length(), 0, text, textColor);
         }
         if ((level > 0) && (expandable)) {
             if (expanded) {
index 8c710f3e407ef82b6507e8159678661706d0b539..a6855ba83c44088bda82fc68737c5742d4d8bbfc 100644 (file)
@@ -30,8 +30,6 @@
  */
 package jexer;
 
-import jexer.bits.CellAttributes;
-import jexer.bits.GraphicsChars;
 import jexer.event.TKeypressEvent;
 import jexer.event.TMouseEvent;
 import static jexer.TKeypress.*;
@@ -47,9 +45,17 @@ public class TTreeView extends TWidget {
     private TVScroller vScroller;
 
     /**
-     * Horizontal scrollbar.  Note package private access.
+     * Horizontal scrollbar.
      */
-    THScroller hScroller;
+    private THScroller hScroller;
+
+    /**
+     * Get the horizontal scrollbar.  This is used by TTreeItem.draw(), and
+     * potentially subclasses.
+     */
+    public final THScroller getHScroller() {
+        return hScroller;
+    }
 
     /**
      * Root of the tree.
@@ -148,11 +154,11 @@ public class TTreeView extends TWidget {
     }
 
     /**
-     * Set the new selected tree view item.  Note package private access.
+     * Set the new selected tree view item.
      *
      * @param item new item that became selected
      */
-    void setSelected(final TTreeItem item) {
+    public void setSelected(final TTreeItem item) {
         if (item != null) {
             item.setSelected(true);
         }
@@ -163,9 +169,9 @@ public class TTreeView extends TWidget {
     }
 
     /**
-     * Perform user selection action.  Note package private access.
+     * Perform user selection action.
      */
-    void dispatch() {
+    public void dispatch() {
         if (action != null) {
             action.DO();
         }
@@ -217,12 +223,16 @@ public class TTreeView extends TWidget {
                 TTreeItem item = (TTreeItem) widget;
                 item.setInvisible(true);
                 item.setEnabled(false);
+                item.keyboardPrevious = null;
+                item.keyboardNext = null;
             }
         }
 
         // Expand the tree into a linear list
         getChildren().clear();
         getChildren().addAll(treeRoot.expandTree("", true));
+
+        // Locate the selected row and maximum line width
         for (TWidget widget: getChildren()) {
             TTreeItem item = (TTreeItem) widget;
 
@@ -239,6 +249,7 @@ public class TTreeView extends TWidget {
                 maxLineWidth = lineWidth;
             }
         }
+
         if ((centerWindow) && (foundSelectedRow)) {
             if ((selectedRow < vScroller.getValue())
                 || (selectedRow > vScroller.getValue() + getHeight() - 2)
@@ -282,13 +293,24 @@ public class TTreeView extends TWidget {
 
         int begin = vScroller.getValue();
         int topY = 0;
+
+        // As we walk the list we also adjust next/previous pointers,
+        // resulting in a doubly-linked list but only of the expanded items.
+        TTreeItem p = null;
+
         for (int i = 0; i < getChildren().size(); i++) {
             if (!(getChildren().get(i) instanceof TTreeItem)) {
-                // Skip
+                // Skip the scrollbars
                 continue;
             }
             TTreeItem item = (TTreeItem) getChildren().get(i);
 
+            if (p != null) {
+                item.keyboardPrevious = p;
+                p.keyboardNext = item;
+            }
+            p = item;
+
             if (i < begin) {
                 // Render invisible
                 item.setEnabled(false);
@@ -309,6 +331,7 @@ public class TTreeView extends TWidget {
             item.setWidth(getWidth() - 1);
             topY++;
         }
+
     }
 
     /**
@@ -352,17 +375,35 @@ public class TTreeView extends TWidget {
      */
     @Override
     public void onKeypress(final TKeypressEvent keypress) {
-        if (keypress.equals(kbLeft)) {
+        if (keypress.equals(kbShiftLeft)
+            || keypress.equals(kbCtrlLeft)
+            || keypress.equals(kbAltLeft)
+        ) {
             hScroller.decrement();
-        } else if (keypress.equals(kbRight)) {
+        } else if (keypress.equals(kbShiftRight)
+            || keypress.equals(kbCtrlRight)
+            || keypress.equals(kbAltRight)
+        ) {
             hScroller.increment();
-        } else if (keypress.equals(kbUp)) {
+        } else if (keypress.equals(kbShiftUp)
+            || keypress.equals(kbCtrlUp)
+            || keypress.equals(kbAltUp)
+        ) {
             vScroller.decrement();
-        } else if (keypress.equals(kbDown)) {
+        } else if (keypress.equals(kbShiftDown)
+            || keypress.equals(kbCtrlDown)
+            || keypress.equals(kbAltDown)
+        ) {
             vScroller.increment();
-        } else if (keypress.equals(kbPgUp)) {
+        } else if (keypress.equals(kbShiftPgUp)
+            || keypress.equals(kbCtrlPgUp)
+            || keypress.equals(kbAltPgUp)
+        ) {
             vScroller.bigDecrement();
-        } else if (keypress.equals(kbPgDn)) {
+        } else if (keypress.equals(kbShiftPgDn)
+            || keypress.equals(kbCtrlPgDn)
+            || keypress.equals(kbAltPgDn)
+        ) {
             vScroller.bigIncrement();
         } else if (keypress.equals(kbHome)) {
             vScroller.toTop();
@@ -372,8 +413,33 @@ public class TTreeView extends TWidget {
             if (selectedItem != null) {
                 dispatch();
             }
+        } else if (keypress.equals(kbUp)) {
+            // Select the previous item
+            if (selectedItem != null) {
+                TTreeItem oldItem = selectedItem;
+                if (selectedItem.keyboardPrevious != null) {
+                    setSelected(selectedItem.keyboardPrevious);
+                    if (oldItem.getY() == 0) {
+                        vScroller.decrement();
+                    }
+                }
+            }
+        } else if (keypress.equals(kbDown)) {
+            // Select the next item
+            if (selectedItem != null) {
+                TTreeItem oldItem = selectedItem;
+                if (selectedItem.keyboardNext != null) {
+                    setSelected(selectedItem.keyboardNext);
+                    if (oldItem.getY() == getHeight() - 2) {
+                        vScroller.increment();
+                    }
+                }
+            }
+        } else if (selectedItem != null) {
+            // Give the TTreeItem a chance to handle arrow keys
+            selectedItem.onKeypress(keypress);
         } else {
-            // Pass other keys (tab etc.) on
+            // Pass other keys (tab etc.) on to TWidget's handler.
             super.onKeypress(keypress);
         }
 
index a32b716a523eebe2231947b1f680da4b693aa2a2..29b6c72217e546abe52fb58749e97dd1b89a9d0d 100644 (file)
@@ -30,6 +30,7 @@
  */
 package jexer;
 
+import java.io.IOException;
 import java.util.List;
 import java.util.LinkedList;
 
@@ -381,7 +382,6 @@ public abstract class TWidget implements Comparable<TWidget> {
      * @return difference between this.tabOrder and that.tabOrder, or
      * difference between this.z and that.z, or String.compareTo(text)
      */
-    @Override
     public final int compareTo(final TWidget that) {
         if ((this instanceof TWindow)
             && (that instanceof TWindow)
@@ -1312,5 +1312,57 @@ public abstract class TWidget implements Comparable<TWidget> {
         return new TTreeView(this, x, y, width, height, action);
     }
 
+    /**
+     * Convenience function to spawn a file open box.
+     *
+     * @param path path of selected file
+     * @return the result of the new file open box
+     */
+    public final String fileOpenBox(final String path) throws IOException {
+        return getApplication().fileOpenBox(path);
+    }
+
+    /**
+     * Convenience function to spawn a file open box.
+     *
+     * @param path path of selected file
+     * @param type one of the Type constants
+     * @return the result of the new file open box
+     */
+    public final String fileOpenBox(final String path,
+        final TFileOpenBox.Type type) throws IOException {
+
+        return getApplication().fileOpenBox(path, type);
+    }
+    /**
+     * Convenience function to add a directory list to this container/window.
+     *
+     * @param path directory path, must be a directory
+     * @param x column relative to parent
+     * @param y row relative to parent
+     * @param width width of text area
+     * @param height height of text area
+     */
+    public final TDirectoryList addDirectoryList(final String path, final int x,
+        final int y, final int width, final int height) {
+
+        return new TDirectoryList(this, path, x, y, width, height, null);
+    }
+
+    /**
+     * Convenience function to add a directory list to this container/window.
+     *
+     * @param path directory path, must be a directory
+     * @param x column relative to parent
+     * @param y row relative to parent
+     * @param width width of text area
+     * @param height height of text area
+     * @param action action to perform when an item is selected
+     */
+    public final TDirectoryList addDirectoryList(final String path, final int x,
+        final int y, final int width, final int height, final TAction action) {
+
+        return new TDirectoryList(this, path, x, y, width, height, action);
+    }
 
 }
index 82d187c762a4d89743edbc6bdd600c6409b0a810..e047bc80204324f4298e475c9677c5de3c2ea6f7 100644 (file)
@@ -473,7 +473,7 @@ public class TWindow extends TWidget {
         // Draw the title
         int titleLeft = (getWidth() - title.length() - 2) / 2;
         putCharXY(titleLeft, 0, ' ', border);
-        putStrXY(titleLeft + 1, 0, title);
+        putStringXY(titleLeft + 1, 0, title);
         putCharXY(titleLeft + title.length() + 1, 0, ' ', border);
 
         if (isActive()) {
@@ -776,6 +776,10 @@ public class TWindow extends TWidget {
                 }
             }
 
+            // Pass a resize event to my children
+            onResize(new TResizeEvent(TResizeEvent.Type.WIDGET,
+                    getWidth(), getHeight()));
+
             return;
         }
 
@@ -999,10 +1003,10 @@ public class TWindow extends TWidget {
      * @param str string to draw
      * @param attr attributes to use (bold, foreColor, backColor)
      */
-    public final void putStrXY(final int x, final int y, final String str,
+    public final void putStringXY(final int x, final int y, final String str,
         final CellAttributes attr) {
 
-        getScreen().putStrXY(x, y, str, attr);
+        getScreen().putStringXY(x, y, str, attr);
     }
 
     /**
@@ -1013,8 +1017,8 @@ public class TWindow extends TWidget {
      * @param y row coordinate.  0 is the top-most row.
      * @param str string to draw
      */
-    public final void putStrXY(final int x, final int y, final String str) {
-        getScreen().putStrXY(x, y, str);
+    public final void putStringXY(final int x, final int y, final String str) {
+        getScreen().putStringXY(x, y, str);
     }
 
     /**
index 54ae66aeaf0d54fac263e1e3445bfa47dc50ef9c..31be310ad0dd5fd9f1474556e99edf9d8f1a16e9 100644 (file)
@@ -66,26 +66,27 @@ public final class Color {
      * @return Color.RED, Color.BLUE, etc.
      */
     static Color getColor(final String colorName) {
-        switch (colorName.toLowerCase()) {
-        case "black":
+        String str = colorName.toLowerCase();
+
+        if (str.equals("black")) {
             return Color.BLACK;
-        case "white":
+        } else if (str.equals("white")) {
             return Color.WHITE;
-        case "red":
+        } else if (str.equals("red")) {
             return Color.RED;
-        case "cyan":
+        } else if (str.equals("cyan")) {
             return Color.CYAN;
-        case "green":
+        } else if (str.equals("green")) {
             return Color.GREEN;
-        case "magenta":
+        } else if (str.equals("magenta")) {
             return Color.MAGENTA;
-        case "blue":
+        } else if (str.equals("blue")) {
             return Color.BLUE;
-        case "yellow":
+        } else if (str.equals("yellow")) {
             return Color.YELLOW;
-        case "brown":
+        } else if (str.equals("brown")) {
             return Color.YELLOW;
-        default:
+        } else {
             // Let unknown strings become white
             return Color.WHITE;
         }
index 53c205f89ad37955e9cc97c403143358fee5472a..d1dab90b09c93f1852b3212f48d4f629cb12cee5 100644 (file)
@@ -30,9 +30,7 @@
  */
 package jexer.demos;
 
-import jexer.*;
-import jexer.event.*;
-import jexer.menu.*;
+import jexer.TApplication;
 
 /**
  * This class is the main driver for a simple demonstration of Jexer's
index 4b31c717a0a89c5a9ac746cf2c50de9eb7360769..95d0a54f81d4c8e1fe9b781fcf02a07e81f32e51 100644 (file)
@@ -33,7 +33,6 @@ package jexer.demos;
 import java.io.*;
 
 import jexer.*;
-import jexer.event.*;
 import jexer.menu.*;
 
 /**
index 783ad8bbdff64536acb1182d7d731116a62a81b6..fa958f08cd0243ec1327be35b90ea15956a3384d 100644 (file)
@@ -31,8 +31,6 @@
 package jexer.demos;
 
 import jexer.*;
-import jexer.event.*;
-import jexer.menu.*;
 
 /**
  * This window demonstates the TRadioGroup, TRadioButton, and TCheckbox
index c2f77e80882b95d509636d5a2173950a4a960cd9..9a834645c5aa6c6176453fc6838dc452ec2b7d6f 100644 (file)
@@ -31,8 +31,6 @@
 package jexer.demos;
 
 import jexer.*;
-import jexer.event.*;
-import jexer.menu.*;
 
 /**
  * This is the main "demo" application window.  It makes use of the TTimer,
@@ -158,7 +156,11 @@ public class DemoMainWindow extends TWindow {
             addButton("Tree&View", 35, row,
                 new TAction() {
                     public void DO() {
-                        new DemoTreeViewWindow(getApplication());
+                        try {
+                            new DemoTreeViewWindow(getApplication());
+                        } catch (Exception e) {
+                            e.printStackTrace();
+                        }
                     }
                 }
             );
index e0c7b2112ce43da33263cd04bba8ecebcf1f4c37..b2cef0dbc9522b0267353a02c2b5b193c5726e98 100644 (file)
@@ -31,8 +31,6 @@
 package jexer.demos;
 
 import jexer.*;
-import jexer.event.*;
-import jexer.menu.*;
 
 /**
  * This window demonstates the TMessageBox and TInputBox widgets.
index 81235cdad2d1b8330dfcc8de0d6602838e2ea42e..711bf3bf9ff6dab2795f246339d9ee784a4e88e7 100644 (file)
@@ -32,7 +32,6 @@ package jexer.demos;
 
 import jexer.*;
 import jexer.event.*;
-import jexer.menu.*;
 
 /**
  * This window demonstates the TText, THScroller, and TVScroller widgets.
index 4bd5a3885c14fd39fd36b0870c2cbaaf3c5ab766..0fc5dfe5747678f59adbac0604f32e12cf32687d 100644 (file)
  */
 package jexer.demos;
 
+import java.io.IOException;
+
 import jexer.*;
 import jexer.event.*;
-import jexer.menu.*;
 
 /**
  * This window demonstates the TTreeView widget.
@@ -49,12 +50,12 @@ public class DemoTreeViewWindow extends TWindow {
      *
      * @param parent the main application
      */
-    public DemoTreeViewWindow(TApplication parent) {
+    public DemoTreeViewWindow(TApplication parent) throws IOException {
         super(parent, "Tree View", 0, 0, 44, 16, TWindow.RESIZABLE);
 
         // Load the treeview with "stuff"
         treeView = addTreeView(1, 1, 40, 12);
-        TDirectoryTreeItem root = new TDirectoryTreeItem(treeView, ".", true);
+        new TDirectoryTreeItem(treeView, ".", true);
     }
 
     /**
index 1aafa3c41619a4864d0297f1e966818e39e939da..8e1a03dd7d7158ec2e91b076a615758f041b542d 100644 (file)
@@ -1165,25 +1165,6 @@ public final class ECMA48Terminal implements Runnable {
         return "\033[?1036l";
     }
 
-    /**
-     * Convert a list of SGR parameters into a full escape sequence.  This
-     * also eliminates a trailing ';' which would otherwise reset everything
-     * to white-on-black not-bold.
-     *
-     * @param str string of parameters, e.g. "31;1;"
-     * @return the string to emit to an ANSI / ECMA-style terminal,
-     * e.g. "\033[31;1m"
-     */
-    private String addHeaderSGR(String str) {
-        if (str.length() > 0) {
-            // Nix any trailing ';' because that resets all attributes
-            while (str.endsWith(":")) {
-                str = str.substring(0, str.length() - 1);
-            }
-        }
-        return "\033[" + str + "m";
-    }
-
     /**
      * Create a SGR parameter sequence for a single color change.  Note
      * package private access.
@@ -1332,20 +1313,6 @@ public final class ECMA48Terminal implements Runnable {
         return sb.toString();
     }
 
-    /**
-     * Create a SGR parameter sequence for enabling reverse color.
-     *
-     * @param on if true, turn on reverse
-     * @return the string to emit to an ANSI / ECMA-style terminal,
-     * e.g. "\033[7m"
-     */
-    private String reverse(final boolean on) {
-        if (on) {
-            return "\033[7m";
-        }
-        return "\033[27m";
-    }
-
     /**
      * Create a SGR parameter sequence to reset to defaults.  Note package
      * private access.
@@ -1372,87 +1339,6 @@ public final class ECMA48Terminal implements Runnable {
         return "0;37;40";
     }
 
-    /**
-     * Create a SGR parameter sequence for enabling boldface.
-     *
-     * @param on if true, turn on bold
-     * @return the string to emit to an ANSI / ECMA-style terminal,
-     * e.g. "\033[1m"
-     */
-    private String bold(final boolean on) {
-        return bold(on, true);
-    }
-
-    /**
-     * Create a SGR parameter sequence for enabling boldface.
-     *
-     * @param on if true, turn on bold
-     * @param header if true, make the full header, otherwise just emit the
-     * bare parameter e.g. "1;"
-     * @return the string to emit to an ANSI / ECMA-style terminal,
-     * e.g. "\033[1m"
-     */
-    private String bold(final boolean on, final boolean header) {
-        if (header) {
-            if (on) {
-                return "\033[1m";
-            }
-            return "\033[22m";
-        }
-        if (on) {
-            return "1;";
-        }
-        return "22;";
-    }
-
-    /**
-     * Create a SGR parameter sequence for enabling blinking text.
-     *
-     * @param on if true, turn on blink
-     * @return the string to emit to an ANSI / ECMA-style terminal,
-     * e.g. "\033[5m"
-     */
-    private String blink(final boolean on) {
-        return blink(on, true);
-    }
-
-    /**
-     * Create a SGR parameter sequence for enabling blinking text.
-     *
-     * @param on if true, turn on blink
-     * @param header if true, make the full header, otherwise just emit the
-     * bare parameter e.g. "5;"
-     * @return the string to emit to an ANSI / ECMA-style terminal,
-     * e.g. "\033[5m"
-     */
-    private String blink(final boolean on, final boolean header) {
-        if (header) {
-            if (on) {
-                return "\033[5m";
-            }
-            return "\033[25m";
-        }
-        if (on) {
-            return "5;";
-        }
-        return "25;";
-    }
-
-    /**
-     * Create a SGR parameter sequence for enabling underline / underscored
-     * text.
-     *
-     * @param on if true, turn on underline
-     * @return the string to emit to an ANSI / ECMA-style terminal,
-     * e.g. "\033[4m"
-     */
-    private String underline(final boolean on) {
-        if (on) {
-            return "\033[4m";
-        }
-        return "\033[24m";
-    }
-
     /**
      * Create a SGR parameter sequence for enabling the visible cursor.  Note
      * package private access.
@@ -1493,35 +1379,6 @@ public final class ECMA48Terminal implements Runnable {
         return "\033[0;37;40m\033[K";
     }
 
-    /**
-     * Clear the line up the cursor (inclusive).  Because some terminals use
-     * back-color-erase, set the color to white-on-black beforehand.
-     *
-     * @return the string to emit to an ANSI / ECMA-style terminal
-     */
-    private String clearPreceedingLine() {
-        return "\033[0;37;40m\033[1K";
-    }
-
-    /**
-     * Clear the line.  Because some terminals use back-color-erase, set the
-     * color to white-on-black beforehand.
-     *
-     * @return the string to emit to an ANSI / ECMA-style terminal
-     */
-    private String clearLine() {
-        return "\033[0;37;40m\033[2K";
-    }
-
-    /**
-     * Move the cursor to the top-left corner.
-     *
-     * @return the string to emit to an ANSI / ECMA-style terminal
-     */
-    private String home() {
-        return "\033[H";
-    }
-
     /**
      * Move the cursor to (x, y).  Note package private access.
      *
index ec5309d669c3cf06a36dc5c2a460615d9b3422ad..4dab0ff65a44e3141d6451f84d12ec9920f8931b 100644 (file)
@@ -387,7 +387,7 @@ public abstract class Screen {
      * @param str string to draw
      * @param attr attributes to use (bold, foreColor, backColor)
      */
-    public final void putStrXY(final int x, final int y, final String str,
+    public final void putStringXY(final int x, final int y, final String str,
         final CellAttributes attr) {
 
         int i = x;
@@ -409,7 +409,7 @@ public abstract class Screen {
      * @param y row coordinate.  0 is the top-most row.
      * @param str string to draw
      */
-    public final void putStrXY(final int x, final int y, final String str) {
+    public final void putStringXY(final int x, final int y, final String str) {
 
         int i = x;
         for (int j = 0; j < str.length(); j++) {
index 2c31d765ac1f15f7e8b4fa93229e371b3ff7f695..be8fb67ac73a645fb624bda6bd9adbd2c1a33a55 100644 (file)
@@ -329,7 +329,7 @@ public final class SwingScreen extends Screen {
             getFontDimensions();
 
             // Setup double-buffering
-            if (screen.doubleBuffer) {
+            if (SwingScreen.doubleBuffer) {
                 setIgnoreRepaint(true);
                 createBufferStrategy(2);
                 bufferStrategy = getBufferStrategy();
@@ -582,7 +582,7 @@ public final class SwingScreen extends Screen {
 
         if (reallyCleared) {
             // Really refreshed, do it all
-            if (doubleBuffer) {
+            if (SwingScreen.doubleBuffer) {
                 Graphics gr = frame.bufferStrategy.getDrawGraphics();
                 frame.paint(gr);
                 gr.dispose();
@@ -649,7 +649,7 @@ public final class SwingScreen extends Screen {
         // Repaint the desired area
         // System.err.printf("REPAINT X %d %d Y %d %d\n", xMin, xMax,
         //     yMin, yMax);
-        if (doubleBuffer) {
+        if (SwingScreen.doubleBuffer) {
             Graphics gr = frame.bufferStrategy.getDrawGraphics();
             Rectangle bounds = new Rectangle(xMin, yMin, xMax - xMin,
                 yMax - yMin);
index a7a4c33d58437ecf7d1214d9865021adb367468b..3fa07cedae2d140fa008352fa32a253e7419405e 100644 (file)
@@ -172,7 +172,6 @@ public final class SwingTerminal implements ComponentListener, KeyListener,
      *
      * @param key keystroke received
      */
-    @Override
     public void keyReleased(final KeyEvent key) {
         // Ignore release events
     }
@@ -182,7 +181,6 @@ public final class SwingTerminal implements ComponentListener, KeyListener,
      *
      * @param key keystroke received
      */
-    @Override
     public void keyTyped(final KeyEvent key) {
         // Ignore typed events
     }
@@ -192,7 +190,6 @@ public final class SwingTerminal implements ComponentListener, KeyListener,
      *
      * @param key keystroke received
      */
-    @Override
     public void keyPressed(final KeyEvent key) {
         boolean alt = false;
         boolean shift = false;
@@ -397,7 +394,6 @@ public final class SwingTerminal implements ComponentListener, KeyListener,
      *
      * @param event window event received
      */
-    @Override
     public void windowActivated(final WindowEvent event) {
         // Force a total repaint
         synchronized (screen) {
@@ -410,7 +406,6 @@ public final class SwingTerminal implements ComponentListener, KeyListener,
      *
      * @param event window event received
      */
-    @Override
     public void windowClosed(final WindowEvent event) {
         // Ignore
     }
@@ -420,7 +415,6 @@ public final class SwingTerminal implements ComponentListener, KeyListener,
      *
      * @param event window event received
      */
-    @Override
     public void windowClosing(final WindowEvent event) {
         // Drop a cmAbort and walk away
         synchronized (eventQueue) {
@@ -436,7 +430,6 @@ public final class SwingTerminal implements ComponentListener, KeyListener,
      *
      * @param event window event received
      */
-    @Override
     public void windowDeactivated(final WindowEvent event) {
         // Ignore
     }
@@ -446,7 +439,6 @@ public final class SwingTerminal implements ComponentListener, KeyListener,
      *
      * @param event window event received
      */
-    @Override
     public void windowDeiconified(final WindowEvent event) {
         // Ignore
     }
@@ -456,7 +448,6 @@ public final class SwingTerminal implements ComponentListener, KeyListener,
      *
      * @param event window event received
      */
-    @Override
     public void windowIconified(final WindowEvent event) {
         // Ignore
     }
@@ -466,7 +457,6 @@ public final class SwingTerminal implements ComponentListener, KeyListener,
      *
      * @param event window event received
      */
-    @Override
     public void windowOpened(final WindowEvent event) {
         // Ignore
     }
@@ -476,7 +466,6 @@ public final class SwingTerminal implements ComponentListener, KeyListener,
      *
      * @param event component event received
      */
-    @Override
     public void componentHidden(final ComponentEvent event) {
         // Ignore
     }
@@ -486,7 +475,6 @@ public final class SwingTerminal implements ComponentListener, KeyListener,
      *
      * @param event component event received
      */
-    @Override
     public void componentShown(final ComponentEvent event) {
         // Ignore
     }
@@ -496,7 +484,6 @@ public final class SwingTerminal implements ComponentListener, KeyListener,
      *
      * @param event component event received
      */
-    @Override
     public void componentMoved(final ComponentEvent event) {
         // Ignore
     }
@@ -506,7 +493,6 @@ public final class SwingTerminal implements ComponentListener, KeyListener,
      *
      * @param event component event received
      */
-    @Override
     public void componentResized(final ComponentEvent event) {
         // Drop a new TResizeEvent into the queue
         sessionInfo.queryWindowSize();
@@ -525,7 +511,6 @@ public final class SwingTerminal implements ComponentListener, KeyListener,
      *
      * @param mouse mouse event received
      */
-    @Override
     public void mouseDragged(final MouseEvent mouse) {
         int modifiers = mouse.getModifiersEx();
         boolean eventMouse1 = false;
@@ -562,7 +547,6 @@ public final class SwingTerminal implements ComponentListener, KeyListener,
      *
      * @param mouse mouse event received
      */
-    @Override
     public void mouseMoved(final MouseEvent mouse) {
         int x = screen.textColumn(mouse.getX());
         int y = screen.textRow(mouse.getY());
@@ -589,7 +573,6 @@ public final class SwingTerminal implements ComponentListener, KeyListener,
      *
      * @param mouse mouse event received
      */
-    @Override
     public void mouseClicked(final MouseEvent mouse) {
         // Ignore
     }
@@ -599,7 +582,6 @@ public final class SwingTerminal implements ComponentListener, KeyListener,
      *
      * @param mouse mouse event received
      */
-    @Override
     public void mouseEntered(final MouseEvent mouse) {
         // Ignore
     }
@@ -609,7 +591,6 @@ public final class SwingTerminal implements ComponentListener, KeyListener,
      *
      * @param mouse mouse event received
      */
-    @Override
     public void mouseExited(final MouseEvent mouse) {
         // Ignore
     }
@@ -619,7 +600,6 @@ public final class SwingTerminal implements ComponentListener, KeyListener,
      *
      * @param mouse mouse event received
      */
-    @Override
     public void mousePressed(final MouseEvent mouse) {
         int modifiers = mouse.getModifiersEx();
         boolean eventMouse1 = false;
@@ -656,7 +636,6 @@ public final class SwingTerminal implements ComponentListener, KeyListener,
      *
      * @param mouse mouse event received
      */
-    @Override
     public void mouseReleased(final MouseEvent mouse) {
         int modifiers = mouse.getModifiersEx();
         boolean eventMouse1 = false;
@@ -702,7 +681,6 @@ public final class SwingTerminal implements ComponentListener, KeyListener,
      *
      * @param mouse mouse event received
      */
-    @Override
     public void mouseWheelMoved(final MouseWheelEvent mouse) {
         int modifiers = mouse.getModifiersEx();
         boolean eventMouse1 = false;
index 43ea8f03cccc1f5e6f6f2d4b1e82ef7646f7b2d1..e60d1d4e7e320b00a2b2997bf5140cf80811fb19 100644 (file)
@@ -218,10 +218,10 @@ public class TMenuItem extends TWidget {
         getScreen().vLineXY(getWidth() - 1, 0, 1, cVSide, background);
 
         getScreen().hLineXY(1, 0, getWidth() - 2, ' ', menuColor);
-        getScreen().putStrXY(2, 0, mnemonic.getRawLabel(), menuColor);
+        getScreen().putStringXY(2, 0, mnemonic.getRawLabel(), menuColor);
         if (hasKey) {
             String keyLabel = key.toString();
-            getScreen().putStrXY((getWidth() - keyLabel.length() - 2), 0,
+            getScreen().putStringXY((getWidth() - keyLabel.length() - 2), 0,
                 keyLabel, menuColor);
         }
         if (mnemonic.getShortcutIdx() >= 0) {
index d8164a4567d6f5d15a88e49b4e2221ce024a7c61..fc9ad5d0c1e947d3bc1f9cd17a9bf12cafa22a32 100644 (file)
@@ -414,6 +414,7 @@ public final class TelnetInputStream extends InputStream
      * @param option the telnet option byte
      * @return a string describing the telnet option code
      */
+    @SuppressWarnings("unused")
     private String optionString(final int option) {
         switch (option) {
         case 0: return "Binary Transmission";
@@ -871,7 +872,6 @@ public final class TelnetInputStream extends InputStream
                 for (int i = 2; i < subnegBuffer.size(); i++) {
                     speedString.append((char)subnegBuffer.get(i).byteValue());
                 }
-                String termSpeed = speedString.toString();
                 master.terminalSpeed = speedString.toString();
             }
             break;
index 1bc82951fd76b490b76226e758d1f51d828b70e4..ad38cdb68d0b225f9d89d2cf8f43c4c7592cc6c8 100644 (file)
@@ -33,6 +33,8 @@ package jexer.net;
 import java.io.OutputStream;
 import java.io.IOException;
 
+import static jexer.net.TelnetSocket.*;
+
 /**
  * TelnetOutputStream works with TelnetSocket to perform the telnet protocol.
  */
@@ -87,8 +89,8 @@ public final class TelnetOutputStream extends OutputStream {
             // The last byte sent to this.write() was a CR, which was never
             // actually sent.  So send the CR in ascii mode, then flush.
             // CR <anything> -> CR NULL
-            output.write(master.C_CR);
-            output.write(master.C_NUL);
+            output.write(C_CR);
+            output.write(C_NUL);
             writeCR = false;
         }
         output.flush();
@@ -182,10 +184,10 @@ public final class TelnetOutputStream extends OutputStream {
 
             if (master.binaryMode == true) {
 
-                if (ch == master.TELNET_IAC) {
+                if (ch == TELNET_IAC) {
                     // IAC -> IAC IAC
-                    writeBuffer[writeBufferI++] = (byte)master.TELNET_IAC;
-                    writeBuffer[writeBufferI++] = (byte)master.TELNET_IAC;
+                    writeBuffer[writeBufferI++] = (byte)TELNET_IAC;
+                    writeBuffer[writeBufferI++] = (byte)TELNET_IAC;
                 } else {
                     // Anything else -> just send
                     writeBuffer[writeBufferI++] = ch;
@@ -197,39 +199,39 @@ public final class TelnetOutputStream extends OutputStream {
             // the case that the last byte of b was a CR.
 
             // Bare carriage return -> CR NUL
-            if (ch == master.C_CR) {
+            if (ch == C_CR) {
                 if (writeCR == true) {
                     // Flush the previous CR to the stream.
                     // CR <anything> -> CR NULL
-                    writeBuffer[writeBufferI++] = (byte)master.C_CR;
-                    writeBuffer[writeBufferI++] = (byte)master.C_NUL;
+                    writeBuffer[writeBufferI++] = (byte)C_CR;
+                    writeBuffer[writeBufferI++] = (byte)C_NUL;
                 }
                 writeCR = true;
-            } else if (ch == master.C_LF) {
+            } else if (ch == C_LF) {
                 if (writeCR == true) {
                     // CR LF -> CR LF
-                    writeBuffer[writeBufferI++] = (byte)master.C_CR;
-                    writeBuffer[writeBufferI++] = (byte)master.C_LF;
+                    writeBuffer[writeBufferI++] = (byte)C_CR;
+                    writeBuffer[writeBufferI++] = (byte)C_LF;
                     writeCR = false;
                 } else {
                     // Bare LF -> LF
                     writeBuffer[writeBufferI++] = ch;
                 }
-            } else if (ch == master.TELNET_IAC) {
+            } else if (ch == TELNET_IAC) {
                 if (writeCR == true) {
                     // CR <anything> -> CR NULL
-                    writeBuffer[writeBufferI++] = (byte)master.C_CR;
-                    writeBuffer[writeBufferI++] = (byte)master.C_NUL;
+                    writeBuffer[writeBufferI++] = (byte)C_CR;
+                    writeBuffer[writeBufferI++] = (byte)C_NUL;
                     writeCR = false;
                 }
                 // IAC -> IAC IAC
-                writeBuffer[writeBufferI++] = (byte)master.TELNET_IAC;
-                writeBuffer[writeBufferI++] = (byte)master.TELNET_IAC;
+                writeBuffer[writeBufferI++] = (byte)TELNET_IAC;
+                writeBuffer[writeBufferI++] = (byte)TELNET_IAC;
             } else {
                 if (writeCR == true) {
                     // CR <anything> -> CR NULL
-                    writeBuffer[writeBufferI++] = (byte)master.C_CR;
-                    writeBuffer[writeBufferI++] = (byte)master.C_NUL;
+                    writeBuffer[writeBufferI++] = (byte)C_CR;
+                    writeBuffer[writeBufferI++] = (byte)C_NUL;
                     writeCR = false;
                 } else {
                     // Normal character */
index 0918e9b6630f8636ef8a21bfb7270e2411c3ffb5..98dbcdd825eb45a8cd9123aaa29bdc645171d37a 100644 (file)
@@ -683,6 +683,7 @@ public class ECMA48 implements Runnable {
      * Whether number pad keys send VT100 or VT52, application or numeric
      * sequences.
      */
+    @SuppressWarnings("unused")
     private KeypadMode keypadMode;
 
     /**