Add 'src/jexer/' from commit 'cf01c92f5809a0732409e280fb0f32f27393618d'
[nikiroo-utils.git] / src / jexer / menu / TMenu.java
index 7c3121230a3539a8b7158ac7a3ff1ee4ecde927b..6d746df0c42ebc3f6da6ede018a33ff439233235 100644 (file)
@@ -37,6 +37,7 @@ import jexer.TWindow;
 import jexer.bits.CellAttributes;
 import jexer.bits.GraphicsChars;
 import jexer.bits.MnemonicString;
+import jexer.bits.StringUtils;
 import jexer.event.TKeypressEvent;
 import jexer.event.TMouseEvent;
 import static jexer.TKeypress.*;
@@ -61,7 +62,7 @@ public class TMenu extends TWindow {
     // Tools menu
     public static final int MID_REPAINT         = 1;
     public static final int MID_VIEW_IMAGE      = 2;
-    public static final int MID_CHANGE_FONT     = 3;
+    public static final int MID_SCREEN_OPTIONS  = 3;
 
     // File menu
     public static final int MID_NEW             = 10;
@@ -101,6 +102,37 @@ public class TMenu extends TWindow {
     public static final int MID_HELP_ACTIVE_FILE        = 55;
     public static final int MID_ABOUT                   = 56;
 
+    // Table menu
+    public static final int MID_TABLE_RENAME_ROW                = 60;
+    public static final int MID_TABLE_RENAME_COLUMN             = 61;
+    public static final int MID_TABLE_VIEW_ROW_LABELS           = 70;
+    public static final int MID_TABLE_VIEW_COLUMN_LABELS        = 71;
+    public static final int MID_TABLE_VIEW_HIGHLIGHT_ROW        = 72;
+    public static final int MID_TABLE_VIEW_HIGHLIGHT_COLUMN     = 73;
+    public static final int MID_TABLE_BORDER_NONE               = 80;
+    public static final int MID_TABLE_BORDER_ALL                = 81;
+    public static final int MID_TABLE_BORDER_CELL_NONE          = 82;
+    public static final int MID_TABLE_BORDER_CELL_ALL           = 83;
+    public static final int MID_TABLE_BORDER_RIGHT              = 84;
+    public static final int MID_TABLE_BORDER_LEFT               = 85;
+    public static final int MID_TABLE_BORDER_TOP                = 86;
+    public static final int MID_TABLE_BORDER_BOTTOM             = 87;
+    public static final int MID_TABLE_BORDER_DOUBLE_BOTTOM      = 88;
+    public static final int MID_TABLE_BORDER_THICK_BOTTOM       = 89;
+    public static final int MID_TABLE_DELETE_LEFT               = 100;
+    public static final int MID_TABLE_DELETE_UP                 = 101;
+    public static final int MID_TABLE_DELETE_ROW                = 102;
+    public static final int MID_TABLE_DELETE_COLUMN             = 103;
+    public static final int MID_TABLE_INSERT_LEFT               = 104;
+    public static final int MID_TABLE_INSERT_RIGHT              = 105;
+    public static final int MID_TABLE_INSERT_ABOVE              = 106;
+    public static final int MID_TABLE_INSERT_BELOW              = 107;
+    public static final int MID_TABLE_COLUMN_NARROW             = 110;
+    public static final int MID_TABLE_COLUMN_WIDEN              = 111;
+    public static final int MID_TABLE_FILE_OPEN_CSV             = 115;
+    public static final int MID_TABLE_FILE_SAVE_CSV             = 116;
+    public static final int MID_TABLE_FILE_SAVE_TEXT            = 117;
+
     // ------------------------------------------------------------------------
     // Variables --------------------------------------------------------------
     // ------------------------------------------------------------------------
@@ -146,7 +178,7 @@ public class TMenu extends TWindow {
         assert (mnemonic.getShortcutIdx() >= 0);
 
         // Recompute width and height to reflect an empty menu
-        setWidth(getTitle().length() + 4);
+        setWidth(StringUtils.width(getTitle()) + 4);
         setHeight(2);
 
         setActive(false);
@@ -240,15 +272,21 @@ public class TMenu extends TWindow {
         /*
         System.err.printf("keypress: %s active child: %s\n", keypress,
             getActiveChild());
-         */
+        */
 
         if (getActiveChild() != this) {
-            if ((getActiveChild() instanceof TSubMenu)
-                || (getActiveChild() instanceof TMenu)
-            ) {
+            if (getActiveChild() instanceof TMenu) {
                 getActiveChild().onKeypress(keypress);
                 return;
             }
+
+            if (getActiveChild() instanceof TSubMenu) {
+                TSubMenu subMenu = (TSubMenu) getActiveChild();
+                if (subMenu.menu.isActive()) {
+                    subMenu.onKeypress(keypress);
+                    return;
+                }
+            }
         }
 
         if (keypress.equals(kbEsc)) {
@@ -280,12 +318,18 @@ public class TMenu extends TWindow {
         if (!keypress.getKey().isFnKey()
             && !keypress.getKey().isAlt()
             && !keypress.getKey().isCtrl()) {
+
+            // System.err.println("Checking children for mnemonic...");
+
             for (TWidget widget: getChildren()) {
                 TMenuItem item = (TMenuItem) widget;
-                if ((item.getMnemonic() != null)
+                if ((item.isEnabled() == true)
+                    && (item.getMnemonic() != null)
                     && (Character.toLowerCase(item.getMnemonic().getShortcut())
                         == Character.toLowerCase(keypress.getKey().getChar()))
                 ) {
+                    // System.err.println("activate: " + item);
+
                     // Send an enter keystroke to it
                     activate(item);
                     item.handleEvent(new TKeypressEvent(kbEnter));
@@ -387,7 +431,6 @@ public class TMenu extends TWindow {
      * @return the new menu item
      */
     public TMenuItem addItem(final int id, final String label) {
-        assert (id >= 1024);
         return addItemInternal(id, label, null);
     }
 
@@ -508,6 +551,8 @@ public class TMenu extends TWindow {
 
         String label;
         TKeypress key = null;
+        boolean checkable = false;
+        boolean checked = false;
 
         switch (id) {
 
@@ -519,8 +564,8 @@ public class TMenu extends TWindow {
             label = i18n.getString("menuViewImage");
             break;
 
-        case MID_CHANGE_FONT:
-            label = i18n.getString("menuChangeFont");
+        case MID_SCREEN_OPTIONS:
+            label = i18n.getString("menuScreenOptions");
             break;
 
         case MID_NEW:
@@ -627,11 +672,112 @@ public class TMenu extends TWindow {
             label = i18n.getString("menuHelpAbout");
             break;
 
+        case MID_TABLE_RENAME_COLUMN:
+            label = i18n.getString("menuTableRenameColumn");
+            break;
+        case MID_TABLE_RENAME_ROW:
+            label = i18n.getString("menuTableRenameRow");
+            break;
+        case MID_TABLE_VIEW_ROW_LABELS:
+            label = i18n.getString("menuTableViewRowLabels");
+            checkable = true;
+            checked = true;
+            break;
+        case MID_TABLE_VIEW_COLUMN_LABELS:
+            label = i18n.getString("menuTableViewColumnLabels");
+            checkable = true;
+            checked = true;
+            break;
+        case MID_TABLE_VIEW_HIGHLIGHT_ROW:
+            label = i18n.getString("menuTableViewHighlightRow");
+            checkable = true;
+            checked = true;
+            break;
+        case MID_TABLE_VIEW_HIGHLIGHT_COLUMN:
+            label = i18n.getString("menuTableViewHighlightColumn");
+            checkable = true;
+            checked = true;
+            break;
+
+        case MID_TABLE_BORDER_NONE:
+            label = i18n.getString("menuTableBorderNone");
+            break;
+        case MID_TABLE_BORDER_ALL:
+            label = i18n.getString("menuTableBorderAll");
+            break;
+        case MID_TABLE_BORDER_CELL_NONE:
+            label = i18n.getString("menuTableBorderCellNone");
+            break;
+        case MID_TABLE_BORDER_CELL_ALL:
+            label = i18n.getString("menuTableBorderCellAll");
+            break;
+        case MID_TABLE_BORDER_RIGHT:
+            label = i18n.getString("menuTableBorderRight");
+            break;
+        case MID_TABLE_BORDER_LEFT:
+            label = i18n.getString("menuTableBorderLeft");
+            break;
+        case MID_TABLE_BORDER_TOP:
+            label = i18n.getString("menuTableBorderTop");
+            break;
+        case MID_TABLE_BORDER_BOTTOM:
+            label = i18n.getString("menuTableBorderBottom");
+            break;
+        case MID_TABLE_BORDER_DOUBLE_BOTTOM:
+            label = i18n.getString("menuTableBorderDoubleBottom");
+            break;
+        case MID_TABLE_BORDER_THICK_BOTTOM:
+            label = i18n.getString("menuTableBorderThickBottom");
+            break;
+        case MID_TABLE_DELETE_LEFT:
+            label = i18n.getString("menuTableDeleteLeft");
+            break;
+        case MID_TABLE_DELETE_UP:
+            label = i18n.getString("menuTableDeleteUp");
+            break;
+        case MID_TABLE_DELETE_ROW:
+            label = i18n.getString("menuTableDeleteRow");
+            break;
+        case MID_TABLE_DELETE_COLUMN:
+            label = i18n.getString("menuTableDeleteColumn");
+            break;
+        case MID_TABLE_INSERT_LEFT:
+            label = i18n.getString("menuTableInsertLeft");
+            break;
+        case MID_TABLE_INSERT_RIGHT:
+            label = i18n.getString("menuTableInsertRight");
+            break;
+        case MID_TABLE_INSERT_ABOVE:
+            label = i18n.getString("menuTableInsertAbove");
+            break;
+        case MID_TABLE_INSERT_BELOW:
+            label = i18n.getString("menuTableInsertBelow");
+            break;
+        case MID_TABLE_COLUMN_NARROW:
+            label = i18n.getString("menuTableColumnNarrow");
+            key = kbShiftLeft;
+            break;
+        case MID_TABLE_COLUMN_WIDEN:
+            label = i18n.getString("menuTableColumnWiden");
+            key = kbShiftRight;
+            break;
+        case MID_TABLE_FILE_OPEN_CSV:
+            label = i18n.getString("menuTableFileOpenCsv");
+            break;
+        case MID_TABLE_FILE_SAVE_CSV:
+            label = i18n.getString("menuTableFileSaveCsv");
+            break;
+        case MID_TABLE_FILE_SAVE_TEXT:
+            label = i18n.getString("menuTableFileSaveText");
+            break;
+
         default:
             throw new IllegalArgumentException("Invalid menu ID: " + id);
         }
 
-        return addItemInternal(id, label, key, enabled);
+        TMenuItem item = addItemInternal(id, label, key, enabled);
+        item.setCheckable(checkable);
+        return item;
     }
 
     /**