reflowable text box
[nikiroo-utils.git] / demos / Demo1.java
index 44333a42b4be7f3a30f93f38c995bf31f5a395c1..a179b0746eed115b90c9b79176982dcc259ba574 100644 (file)
  */
 
 import jexer.*;
+import jexer.event.*;
 import jexer.menu.*;
 
+class DemoTextWindow extends TWindow {
+
+    /**
+     * Hang onto my TText so I can resize it with the window.
+     */
+    private TText textField;
+
+    /**
+     * Public constructor.
+     */
+    public DemoTextWindow(TApplication parent) {
+        super(parent, "Text Areas", 0, 0, 44, 20, RESIZABLE);
+
+        textField = addText(
+"This is an example of a reflowable text field.  Some example text follows.\n" +
+"\n" +
+"This library implements a text-based windowing system loosely\n" +
+"reminiscient of Borland's [Turbo\n" +
+"Vision](http://en.wikipedia.org/wiki/Turbo_Vision) library.  For those\n" +
+"wishing to use the actual C++ Turbo Vision library, see [Sergio\n" +
+"Sigala's updated version](http://tvision.sourceforge.net/) that runs\n" +
+"on many more platforms.\n" +
+"\n" +
+"Currently the only console platform supported is Posix (tested on\n" +
+"Linux).  Input/output is handled through terminal escape sequences\n" +
+"generated by the library itself: ncurses is not required or linked to. \n" +
+"xterm mouse tracking using UTF8 coordinates is supported.\n" +
+"\n" +
+"This library is licensed LGPL (\"GNU Lesser General Public License\")\n" +
+"version 3 or greater.  See the file COPYING for the full license text,\n" +
+"which includes both the GPL v3 and the LGPL supplemental terms.\n" +
+"\n",
+            1, 1, 40, 16);
+    }
+
+    /**
+     * Handle window/screen resize events.
+     *
+     * @param event resize event
+     */
+    @Override
+    public void onResize(final TResizeEvent event) {
+        if (event.getType() == TResizeEvent.Type.WIDGET) {
+            // Resize the text field
+            textField.setWidth(event.getWidth() - 4);
+            textField.setHeight(event.getHeight() - 4);
+            textField.reflow();
+            return;
+        }
+
+        // Pass to children instead
+        for (TWidget widget: getChildren()) {
+            widget.onResize(event);
+        }
+    }
+}
+
 class DemoCheckboxWindow extends TWindow {
 
     /**
-     * Constructor
+     * Constructor.
      */
     DemoCheckboxWindow(TApplication parent) {
         this(parent, CENTERED | RESIZABLE);
     }
 
     /**
-     * Constructor
+     * Constructor.
      */
     DemoCheckboxWindow(TApplication parent, int flags) {
         // Construct a demo window.  X and Y don't matter because it
@@ -60,19 +118,18 @@ class DemoCheckboxWindow extends TWindow {
         addCheckbox(35, row++, "Checkbox 2", true);
         row += 2;
 
-        /*
-        auto group = addRadioGroup(1, row, "Group 1");
+        TRadioGroup group = addRadioGroup(1, row, "Group 1");
         group.addRadioButton("Radio option 1");
         group.addRadioButton("Radio option 2");
         group.addRadioButton("Radio option 3");
 
-        addButton("&Close Window", (width - 14) / 2, height - 4,
-            {
-                application.closeWindow(this);
+        addButton("&Close Window", (getWidth() - 14) / 2, getHeight() - 4,
+            new TAction() {
+                public void DO() {
+                    DemoCheckboxWindow.this.getApplication().closeWindow(DemoCheckboxWindow.this);
+                }
             }
-
         );
-         */
     }
 
 }
@@ -198,10 +255,14 @@ EOS",
 
 
 class DemoMainWindow extends TWindow {
-    /*
-    // Timer that increments a number
+
+    // Timer that increments a number.
     private TTimer timer;
 
+    // Timer label is updated with timer ticks.
+    TLabel timerLabel;
+
+    /*
     // The modal window is a more low-level example of controlling a window
     // "from the outside".  Most windows will probably subclass TWindow and
     // do this kind of logic on their own.
@@ -217,14 +278,17 @@ class DemoMainWindow extends TWindow {
     private void modalWindowClose() {
         application.closeWindow(modalWindow);
     }
+     */
 
-    /// We need to override onClose so that the timer will no longer be
-    /// called after we close the window.  TTimers currently are completely
-    /// unaware of the rest of the UI classes.
-    override public void onClose() {
-        application.removeTimer(timer);
-    }
+    /**
+     * We need to override onClose so that the timer will no longer be called
+     * after we close the window.  TTimers currently are completely unaware
+     * of the rest of the UI classes.
      */
+    @Override
+    public void onClose() {
+        getApplication().removeTimer(timer);
+    }
 
     /**
      * Construct demo window.  It will be centered on screen.
@@ -233,6 +297,9 @@ class DemoMainWindow extends TWindow {
         this(parent, CENTERED | RESIZABLE);
     }
 
+    int timerI = 0;
+    TProgressBar progressBar;
+
     /**
      * Constructor.
      */
@@ -267,21 +334,19 @@ class DemoMainWindow extends TWindow {
 
         row += 2;
 
-        /*
         addLabel("Variable-width text field:", 1, row);
         addField(35, row++, 15, false, "Field text");
 
         addLabel("Fixed-width text field:", 1, row);
         addField(35, row, 15, true);
         row += 2;
-         */
 
         if (!isModal()) {
             addLabel("Radio buttons and checkboxes", 1, row);
             addButton("&Checkboxes", 35, row,
                 new TAction() {
                     public void DO() {
-                        new DemoCheckboxWindow(getApplication(), MODAL);
+                        new DemoCheckboxWindow(getApplication());
                     }
                 }
             );
@@ -298,17 +363,21 @@ class DemoMainWindow extends TWindow {
             );
         }
         row += 2;
+         */
 
         if (!isModal()) {
             addLabel("Text areas", 1, row);
             addButton("&Text", 35, row,
-                {
-                    new DemoTextWindow(application);
+                new TAction() {
+                    public void DO() {
+                        new DemoTextWindow(getApplication());
+                    }
                 }
             );
         }
         row += 2;
 
+        /*
         if (!isModal()) {
             addLabel("Tree views", 1, row);
             addButton("Tree&View", 35, row,
@@ -328,24 +397,25 @@ class DemoMainWindow extends TWindow {
             );
         }
         row += 2;
+         */
 
-        TProgressBar bar = addProgressBar(1, row, 22);
+        progressBar = addProgressBar(1, row, 22, 0);
         row++;
-        TLabel timerLabel = addLabel("Timer", 1, row);
-        timer = parent.addTimer(100,
-            {
-                static int i = 0;
-                auto writer = appender!dstring();
-                formattedWrite(writer, "Timer: %d", i);
-                timerLabel.text = writer.data;
-                timerLabel.width = cast(uint)timerLabel.text.length;
-                if (i < 100) {
-                    i++;
+        timerLabel = addLabel("Timer", 1, row);
+        timer = getApplication().addTimer(100, true,
+            new TAction() {
+
+                public void DO() {
+                    timerLabel.setText(String.format("Timer: %d", timerI));
+                    timerLabel.setWidth(timerLabel.getText().length());
+                    if (timerI < 100) {
+                        timerI++;
+                    }
+                    progressBar.setValue(timerI);
+                    DemoMainWindow.this.setRepaint();
                 }
-                bar.value = i;
-                parent.repaint = true;
-            }, true);
-         */
+            }
+        );
     }
 }
 
@@ -353,6 +423,7 @@ class DemoMainWindow extends TWindow {
  * The demo application itself.
  */
 class DemoApplication extends TApplication {
+
     /**
      * Public constructor
      */
@@ -398,9 +469,9 @@ public class Demo1 {
     /**
      * Main entry point.
      *
-     * @param  args Command line arguments
+     * @param args Command line arguments
      */
-    public static void main(String [] args) {
+    public static void main(final String [] args) {
         try {
             DemoApplication app = new DemoApplication();
             app.run();