LICENSE CHANGED TO MIT
[nikiroo-utils.git] / src / jexer / menu / TMenu.java
index de49760d349d086f4df53597407ce4055941de4c..8915c0c290a93eaf52325e4130d78eb9f9a21bec 100644 (file)
@@ -1,29 +1,27 @@
-/**
+/*
  * 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.
+ * The MIT License (MIT)
  *
- *     Copyright (C) 2015  Kevin Lamonte
+ * Copyright (C) 2016 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.
+ * Permission is hereby granted, free of charge, to any person obtaining a
+ * copy of this software and associated documentation files (the "Software"),
+ * to deal in the Software without restriction, including without limitation
+ * the rights to use, copy, modify, merge, publish, distribute, sublicense,
+ * and/or sell copies of the Software, and to permit persons to whom the
+ * Software is furnished to do so, subject to the following conditions:
  *
- * 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.
+ * The above copyright notice and this permission notice shall be included in
+ * all copies or substantial portions of the Software.
  *
- * 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
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
+ * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+ * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
+ * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
+ * DEALINGS IN THE SOFTWARE.
  *
  * @author Kevin Lamonte [kevin.lamonte@gmail.com]
  * @version 1
@@ -126,16 +124,9 @@ public final class TMenu extends TWindow {
      */
     @Override
     public void draw() {
-        CellAttributes menuColor;
         CellAttributes background = getTheme().getColor("tmenu");
 
-        if (getAbsoluteActive()) {
-            menuColor = getTheme().getColor("tmenu.highlighted");
-        } else {
-            menuColor = getTheme().getColor("tmenu");
-        }
-
-        assert (getAbsoluteActive());
+        assert (isAbsoluteActive());
 
         // Fill in the interior background
         for (int i = 0; i < getHeight(); i++) {
@@ -177,7 +168,6 @@ public final class TMenu extends TWindow {
     @Override
     public void onMouseDown(final TMouseEvent mouse) {
         this.mouse = mouse;
-        setRepaint();
 
         // Pass to children
         for (TWidget widget: getChildren()) {
@@ -202,7 +192,6 @@ public final class TMenu extends TWindow {
     @Override
     public void onMouseUp(final TMouseEvent mouse) {
         this.mouse = mouse;
-        setRepaint();
 
         // Pass to children
         for (TWidget widget: getChildren()) {
@@ -227,11 +216,10 @@ public final class TMenu extends TWindow {
     @Override
     public void onMouseMotion(final TMouseEvent mouse) {
         this.mouse = mouse;
-        setRepaint();
 
         // See if we should activate a different menu item
         for (TWidget widget: getChildren()) {
-            if ((mouse.getMouse1())
+            if ((mouse.isMouse1())
                 && (widget.mouseWouldHit(mouse))
             ) {
                 // Activate this menu item
@@ -251,8 +239,16 @@ public final class TMenu extends TWindow {
      */
     @Override
     public void onKeypress(final TKeypressEvent keypress) {
-        if (getActiveChild() != null) {
-            if (getActiveChild() instanceof TSubMenu) {
+
+        /*
+        System.err.printf("keypress: %s active child: %s\n", keypress,
+            getActiveChild());
+         */
+
+        if (getActiveChild() != this) {
+            if ((getActiveChild() instanceof TSubMenu)
+                || (getActiveChild() instanceof TMenu)
+            ) {
                 getActiveChild().onKeypress(keypress);
                 return;
             }
@@ -271,9 +267,7 @@ public final class TMenu extends TWindow {
             return;
         }
         if (keypress.equals(kbRight)) {
-            if (!isSubMenu) {
-                getApplication().switchMenu(true);
-            }
+            getApplication().switchMenu(true);
             return;
         }
         if (keypress.equals(kbLeft)) {
@@ -286,14 +280,14 @@ public final class TMenu extends TWindow {
         }
 
         // Switch to a menuItem if it has an mnemonic
-        if (!keypress.getKey().getIsKey()
-            && !keypress.getKey().getAlt()
-            && !keypress.getKey().getCtrl()) {
+        if (!keypress.getKey().isFnKey()
+            && !keypress.getKey().isAlt()
+            && !keypress.getKey().isCtrl()) {
             for (TWidget widget: getChildren()) {
                 TMenuItem item = (TMenuItem) widget;
                 if ((item.getMnemonic() != null)
                     && (Character.toLowerCase(item.getMnemonic().getShortcut())
-                        == Character.toLowerCase(keypress.getKey().getCh()))
+                        == Character.toLowerCase(keypress.getKey().getChar()))
                 ) {
                     // Send an enter keystroke to it
                     activate(item);
@@ -305,8 +299,7 @@ public final class TMenu extends TWindow {
 
         // Dispatch the keypress to an active widget
         for (TWidget widget: getChildren()) {
-            if (widget.getActive()) {
-                setRepaint();
+            if (widget.isActive()) {
                 widget.handleEvent(keypress);
                 return;
             }
@@ -314,18 +307,15 @@ public final class TMenu extends TWindow {
     }
 
     /**
-     * Convenience function to add a custom menu item.
+     * Convenience function to add a menu item.
      *
      * @param id menu item ID.  Must be greater than 1024.
      * @param label menu item label
-     * @param key global keyboard accelerator
      * @return the new menu item
      */
-    public final TMenuItem addItem(final int id, final String label,
-        final TKeypress key) {
-
+    public TMenuItem addItem(final int id, final String label) {
         assert (id >= 1024);
-        return addItemInternal(id, label, key);
+        return addItemInternal(id, label, null);
     }
 
     /**
@@ -336,51 +326,29 @@ public final class TMenu extends TWindow {
      * @param key global keyboard accelerator
      * @return the new menu item
      */
-    private TMenuItem addItemInternal(final int id, final String label,
+    public TMenuItem addItem(final int id, final String label,
         final TKeypress key) {
 
-        int newY = getChildren().size() + 1;
-        assert (newY < getHeight());
-
-        TMenuItem menuItem = new TMenuItem(this, id, 1, newY, label);
-        menuItem.setKey(key);
-        setHeight(getHeight() + 1);
-        if (menuItem.getWidth() + 2 > getWidth()) {
-            setWidth(menuItem.getWidth() + 2);
-        }
-        for (TWidget widget: getChildren()) {
-            widget.setWidth(getWidth() - 2);
-        }
-        getApplication().addAccelerator(menuItem, key.toLowerCase());
-        getApplication().recomputeMenuX();
-        activate(0);
-        return menuItem;
+        assert (id >= 1024);
+        return addItemInternal(id, label, key);
     }
 
     /**
-     * Convenience function to add a menu item.
+     * Convenience function to add a custom menu item.
      *
      * @param id menu item ID.  Must be greater than 1024.
      * @param label menu item label
+     * @param key global keyboard accelerator
      * @return the new menu item
      */
-    public final TMenuItem addItem(final int id, final String label) {
-        assert (id >= 1024);
-        return addItemInternal(id, label);
-    }
+    private TMenuItem addItemInternal(final int id, final String label,
+        final TKeypress key) {
 
-    /**
-     * Convenience function to add a menu item.
-     *
-     * @param id menu item ID
-     * @param label menu item label
-     * @return the new menu item
-     */
-    private TMenuItem addItemInternal(final int id, final String label) {
         int newY = getChildren().size() + 1;
         assert (newY < getHeight());
 
         TMenuItem menuItem = new TMenuItem(this, id, 1, newY, label);
+        menuItem.setKey(key);
         setHeight(getHeight() + 1);
         if (menuItem.getWidth() + 2 > getWidth()) {
             setWidth(menuItem.getWidth() + 2);
@@ -388,6 +356,7 @@ public final class TMenu extends TWindow {
         for (TWidget widget: getChildren()) {
             widget.setWidth(getWidth() - 2);
         }
+        getApplication().addMenuItem(menuItem);
         getApplication().recomputeMenuX();
         activate(0);
         return menuItem;
@@ -400,13 +369,12 @@ public final class TMenu extends TWindow {
      * (inclusive).
      * @return the new menu item
      */
-    public final TMenuItem addDefaultItem(final int id) {
+    public TMenuItem addDefaultItem(final int id) {
         assert (id >= 0);
         assert (id < 1024);
 
         String label;
         TKeypress key = null;
-        boolean hasKey = true;
 
         switch (id) {
 
@@ -417,7 +385,6 @@ public final class TMenu extends TWindow {
 
         case MID_SHELL:
             label = "O&S Shell";
-            hasKey = false;
             break;
 
         case MID_OPEN_FILE:
@@ -439,21 +406,17 @@ public final class TMenu extends TWindow {
             break;
         case MID_CLEAR:
             label = "C&lear";
-            hasKey = false;
             // key = kbDel;
             break;
 
         case MID_TILE:
             label = "&Tile";
-            hasKey = false;
             break;
         case MID_CASCADE:
             label = "C&ascade";
-            hasKey = false;
             break;
         case MID_CLOSE_ALL:
             label = "Cl&ose All";
-            hasKey = false;
             break;
         case MID_WINDOW_MOVE:
             label = "&Size/Move";
@@ -473,27 +436,26 @@ public final class TMenu extends TWindow {
             break;
         case MID_WINDOW_CLOSE:
             label = "&Close";
-            key = kbCtrlW;
+            // key = kbCtrlW;
             break;
 
         default:
             throw new IllegalArgumentException("Invalid menu ID: " + id);
         }
 
-        if (hasKey) {
-            return addItemInternal(id, label, key);
-        }
-        return addItemInternal(id, label);
+        return addItemInternal(id, label, key);
     }
 
     /**
      * Convenience function to add a menu separator.
      */
-    public final void addSeparator() {
+    public void addSeparator() {
         int newY = getChildren().size() + 1;
         assert (newY < getHeight());
 
-        TMenuItem menuItem = new TMenuSeparator(this, 1, newY);
+        // We just have to construct it, don't need to hang onto what it
+        // makes.
+        new TMenuSeparator(this, 1, newY);
         setHeight(getHeight() + 1);
     }
 
@@ -504,7 +466,7 @@ public final class TMenu extends TWindow {
      * denoted by prefixing a letter with "&", e.g. "&File"
      * @return the new sub-menu
      */
-    public final TSubMenu addSubMenu(final String title) {
+    public TSubMenu addSubMenu(final String title) {
         int newY = getChildren().size() + 1;
         assert (newY < getHeight());