window focus events and enable/disable menu items
[fanfix.git] / src / jexer / menu / TMenu.java
index 51cc343e8606164291af84a252e561fec695625b..6dfb5fcfabe71f2f1d961572c0a877045b0e85a2 100644 (file)
@@ -241,8 +241,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;
             }
@@ -261,9 +269,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)) {
@@ -303,18 +309,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 final TMenuItem addItem(final int id, final String label) {
         assert (id >= 1024);
-        return addItemInternal(id, label, key);
+        return addItemInternal(id, label, null);
     }
 
     /**
@@ -325,51 +328,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 final 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);
@@ -377,6 +358,7 @@ public final class TMenu extends TWindow {
         for (TWidget widget: getChildren()) {
             widget.setWidth(getWidth() - 2);
         }
+        getApplication().addMenuItem(menuItem);
         getApplication().recomputeMenuX();
         activate(0);
         return menuItem;
@@ -395,7 +377,6 @@ public final class TMenu extends TWindow {
 
         String label;
         TKeypress key = null;
-        boolean hasKey = true;
 
         switch (id) {
 
@@ -406,7 +387,6 @@ public final class TMenu extends TWindow {
 
         case MID_SHELL:
             label = "O&S Shell";
-            hasKey = false;
             break;
 
         case MID_OPEN_FILE:
@@ -428,21 +408,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";
@@ -462,7 +438,6 @@ public final class TMenu extends TWindow {
             break;
         case MID_WINDOW_CLOSE:
             label = "&Close";
-            hasKey = false;
             // key = kbCtrlW;
             break;
 
@@ -470,10 +445,7 @@ public final class TMenu extends TWindow {
             throw new IllegalArgumentException("Invalid menu ID: " + id);
         }
 
-        if (hasKey) {
-            return addItemInternal(id, label, key);
-        }
-        return addItemInternal(id, label);
+        return addItemInternal(id, label, key);
     }
 
     /**