#14 TDesktop working, TWindow hide/show/max/restore working
authorKevin Lamonte <kevin.lamonte@gmail.com>
Sat, 15 Jul 2017 20:35:28 +0000 (16:35 -0400)
committerKevin Lamonte <kevin.lamonte@gmail.com>
Sat, 15 Jul 2017 20:35:28 +0000 (16:35 -0400)
docs/TODO.md
docs/worklog.md
src/jexer/TApplication.java
src/jexer/demos/DesktopDemoApplication.java

index eb7164f067dbfad72e028b2bf847e8d98f251ffd..29e5194f61d6a7f3606dd40373876a4522d7b2dd 100644 (file)
@@ -10,7 +10,14 @@ BUG: TTreeView.reflow() doesn't keep the vertical dot within the
 
 0.0.5
 
-- TDesktop (#14)
+
+- Scrollable:
+  - TTreeView
+  - TText
+  - TList
+  - TTerminalWindow
+  - TScrollableWindow
+
 
 - TWindow:
   - UNCLOSABLE (#8)
@@ -35,8 +42,8 @@ BUG: TTreeView.reflow() doesn't keep the vertical dot within the
 - Refactor SwingBackend to be embeddable
   - jexer.Swing.blockMousePointer: false = do not invert cell, true
     (default) is current behavior
-  - Make Demo4 with two separate Swing demos in a single JFrame.
-  - Make Demo5 mixing Swing and Jexer components
+  - Make Demo5 with two separate Swing demos in a single JFrame.
+  - Make Demo6 mixing Swing and Jexer components
 
 - THelpWindow
   - TText + clickable links
index 379d3fcfe8a04721b3b777a0a6566516386fa346..be5f0442c5ad8e0da7cf3d283c3cb262f5b03137 100644 (file)
@@ -1,6 +1,40 @@
 Jexer Work Log
 ==============
 
+July 15, 2017
+
+I think I have cleaned up most of the window show/hide/activate mess
+in TApplication.  Demo4 has some cool interactions between a
+background TDesktop and several foreground TWindows, which helped
+expose bugs.
+
+July 9, 2017
+
+While working on TWindow.hide/show I decided that I am sick of
+TApplication's active window handling.  TApplication makes lots of
+assumptions, things are too fragile between modal and not, and one
+cannot easily say window.activate().  So I will also be changing that
+too. ... Code is still a bit of a mess, but hooks are in place at
+least for show/hide/activate.
+
+July 8, 2017
+
+Qodem 1.0.0 released last month, I had a vacation, and a Jexer user
+(nikiroo) started opening up pull requests. :-) So back unto the
+breach we go!
+
+TButton is now animated so that there is some feedback when selected
+via keyboard.  StringJustifier was written which permits TText's to
+have left/centered/right and full justification.  TDesktop is now in
+too which can act as a permanent max-sized window without borders.
+
+Next up is Viewport, an interface to collect scrollbar API, and then a
+cleaner API for scrollable widgets and windows.  After that is more
+window API: hide/show/maximize/restore, and unclosable windows.  I am
+cherry-picking bits from @nikiroo's PRs, which will likely break them
+before it fixes things, but I will find some way to get Niki credited
+with those pieces.
+
 March 21, 2017
 
 I am starting to gear up for making Jexer a serious project now.  I've
index d8bec5e5d07b00dd54faca3f0660fbfcf9e4884a..6d71dc7771327d84b6135c75054b22f36d2033f4 100644 (file)
@@ -1278,9 +1278,9 @@ public class TApplication implements Runnable {
     }
 
     /**
-     * Return the number of windows that are visible.
+     * Return the number of windows that are showing.
      *
-     * @return the number of windows that are visible
+     * @return the number of windows that are showing on screen
      */
     public final int shownWindowCount() {
         int n = 0;
@@ -1292,6 +1292,21 @@ public class TApplication implements Runnable {
         return n;
     }
 
+    /**
+     * Return the number of windows that are hidden.
+     *
+     * @return the number of windows that are hidden
+     */
+    public final int hiddenWindowCount() {
+        int n = 0;
+        for (TWindow w: windows) {
+            if (w.isHidden()) {
+                n++;
+            }
+        }
+        return n;
+    }
+
     /**
      * Check if a window instance is in this application's window list.
      *
@@ -1304,6 +1319,7 @@ public class TApplication implements Runnable {
         }
         for (TWindow w: windows) {
             if (w == window) {
+                assert (window.getApplication() == this);
                 return true;
             }
         }
@@ -1496,8 +1512,8 @@ public class TApplication implements Runnable {
      * otherwise switch to the previous window in the list
      */
     public final void switchWindow(final boolean forward) {
-        // Only switch if there are multiple windows
-        if (windows.size() < 2) {
+        // Only switch if there are multiple visible windows
+        if (shownWindowCount() < 2) {
             return;
         }
         assert (activeWindow != null);
@@ -1522,18 +1538,23 @@ public class TApplication implements Runnable {
                 return;
             }
 
-            int nextWindowI;
-            if (forward) {
-                nextWindowI = (activeWindowI + 1) % windows.size();
-            } else {
-                if (activeWindowI == 0) {
-                    nextWindowI = windows.size() - 1;
+            int nextWindowI = activeWindowI;
+            for (;;) {
+                if (forward) {
+                    nextWindowI++;
+                    nextWindowI %= windows.size();
                 } else {
-                    nextWindowI = activeWindowI - 1;
+                    nextWindowI--;
+                    if (nextWindowI < 0) {
+                        nextWindowI = windows.size() - 1;
+                    }
                 }
-            }
 
-            activateWindow(windows.get(nextWindowI));
+                if (windows.get(nextWindowI).isShown()) {
+                    activateWindow(windows.get(nextWindowI));
+                    break;
+                }
+            }
         } // synchronized (windows)
 
     }
@@ -1746,11 +1767,11 @@ public class TApplication implements Runnable {
                 continue;
             }
             for (int x = w.getX(); x < w.getX() + w.getWidth(); x++) {
-                if (x == width) {
+                if (x >= width) {
                     continue;
                 }
                 for (int y = w.getY(); y < w.getY() + w.getHeight(); y++) {
-                    if (y == height) {
+                    if (y >= height) {
                         continue;
                     }
                     overlapMatrix[x][y]++;
@@ -1793,11 +1814,11 @@ public class TApplication implements Runnable {
                 long newOverlapN = 0;
                 // Start by adding each new cell.
                 for (int wx = x; wx < x + window.getWidth(); wx++) {
-                    if (wx == width) {
+                    if (wx >= width) {
                         continue;
                     }
                     for (int wy = y; wy < y + window.getHeight(); wy++) {
-                        if (wy == height) {
+                        if (wy >= height) {
                             continue;
                         }
                         newMatrix[wx][wy]++;
index 2a2ca34cbf7719cf224c0f7aaf305273beb0ddb8..63db19edf201ff1356f8e44812d64bed62714cf4 100644 (file)
@@ -69,8 +69,8 @@ public class DesktopDemoApplication extends TApplication {
             }
         );
 
-        final TWindow windowA = addWindow("Window A", 20, 14);
-        final TWindow windowB = addWindow("Window B", 20, 14);
+        final TWindow windowA = addWindow("Window A", 25, 14);
+        final TWindow windowB = addWindow("Window B", 25, 14);
         windowA.addButton("&Show Window B", 2, 2,
             new TAction() {
                 public void DO() {
@@ -85,6 +85,20 @@ public class DesktopDemoApplication extends TApplication {
                 }
             }
         );
+        windowA.addButton("&Maximize Window B", 2, 6,
+            new TAction() {
+                public void DO() {
+                    windowB.maximize();
+                }
+            }
+        );
+        windowA.addButton("&Restore Window B", 2, 8,
+            new TAction() {
+                public void DO() {
+                    windowB.restore();
+                }
+            }
+        );
         windowB.addButton("&Show Window A", 2, 2,
             new TAction() {
                 public void DO() {
@@ -99,8 +113,22 @@ public class DesktopDemoApplication extends TApplication {
                 }
             }
         );
+        windowB.addButton("&Maximize Window A", 2, 6,
+            new TAction() {
+                public void DO() {
+                    windowA.maximize();
+                }
+            }
+        );
+        windowB.addButton("&Restore Window A", 2, 8,
+            new TAction() {
+                public void DO() {
+                    windowA.restore();
+                }
+            }
+        );
 
-        desktop.addButton("&Show Window B", 25, 2,
+        desktop.addButton("S&how Window B", 25, 2,
             new TAction() {
                 public void DO() {
                     windowB.show();
@@ -128,6 +156,14 @@ public class DesktopDemoApplication extends TApplication {
                 }
             }
         );
+        desktop.addButton("&Create Window C", 25, 15,
+            new TAction() {
+                public void DO() {
+                    desktop.getApplication().addWindow("Window C",
+                        30, 20);
+                }
+            }
+        );
 
 
     }