JAL-3446 test for simpler key mask operation
[jalview.git] / src / jalview / jbgui / GAlignFrame.java
index 87610bb..edaabf1 100755 (executable)
 package jalview.jbgui;
 
 import jalview.analysis.AnnotationSorter.SequenceAnnotationOrder;
+import jalview.analysis.GeneticCodeI;
+import jalview.analysis.GeneticCodes;
 import jalview.api.SplitContainerI;
 import jalview.bin.Cache;
 import jalview.bin.Jalview;
 import jalview.gui.JvSwingUtils;
 import jalview.gui.Preferences;
 import jalview.io.FileFormats;
+import jalview.schemes.ResidueColourScheme;
 import jalview.util.MessageManager;
 import jalview.util.Platform;
 
 import java.awt.BorderLayout;
 import java.awt.Color;
 import java.awt.GridLayout;
-import java.awt.Toolkit;
 import java.awt.event.ActionEvent;
 import java.awt.event.ActionListener;
 import java.awt.event.FocusAdapter;
 import java.awt.event.FocusEvent;
+import java.awt.event.InputEvent;
 import java.awt.event.KeyEvent;
 import java.awt.event.MouseAdapter;
 import java.awt.event.MouseEvent;
@@ -60,15 +63,18 @@ import javax.swing.event.ChangeEvent;
 import javax.swing.event.MenuEvent;
 import javax.swing.event.MenuListener;
 
+@SuppressWarnings("serial")
 public class GAlignFrame extends JInternalFrame
 {
   protected JMenuBar alignFrameMenuBar = new JMenuBar();
 
   protected JMenuItem closeMenuItem = new JMenuItem();
 
-  protected JMenu webService = new JMenu();
+  public JMenu webService = new JMenu();// BH 2019 was protected, but not
+                                        // sufficient for AlignFrame thread run
 
-  protected JMenuItem webServiceNoServices;
+  public JMenuItem webServiceNoServices;// BH 2019 was protected, but not
+                                        // sufficient for AlignFrame thread run
 
   protected JCheckBoxMenuItem viewBoxesMenuItem = new JCheckBoxMenuItem();
 
@@ -76,7 +82,9 @@ public class GAlignFrame extends JInternalFrame
 
   protected JMenu sortByAnnotScore = new JMenu();
 
-  public JLabel statusBar = new JLabel();
+  public JLabel statusBar = new JLabel(); // BH 2019 was protected, but not
+                                          // sufficient for
+                                          // AlignFrame.printWriter
 
   protected JMenu outputTextboxMenu = new JMenu();
 
@@ -124,7 +132,7 @@ public class GAlignFrame extends JInternalFrame
 
   protected JMenuItem modifyPID;
 
-  protected JMenuItem annotationColour;
+  protected JRadioButtonMenuItem annotationColour;
 
   protected JMenu sortByTreeMenu = new JMenu();
 
@@ -138,7 +146,7 @@ public class GAlignFrame extends JInternalFrame
 
   protected JCheckBoxMenuItem showDbRefsMenuitem = new JCheckBoxMenuItem();
 
-  protected JMenuItem showTranslation = new JMenuItem();
+  protected JMenu showTranslation = new JMenu();
 
   protected JMenuItem showReverse = new JMenuItem();
 
@@ -170,7 +178,7 @@ public class GAlignFrame extends JInternalFrame
 
   protected JCheckBoxMenuItem hiddenMarkers = new JCheckBoxMenuItem();
 
-  protected JTabbedPane tabbedPane = jalview.jbgui.GDesktop.createTabbedPane();
+  protected JTabbedPane tabbedPane = new JTabbedPane();
 
   protected JMenuItem reload = new JMenuItem();
 
@@ -197,14 +205,14 @@ public class GAlignFrame extends JInternalFrame
   protected JCheckBoxMenuItem normaliseSequenceLogo = new JCheckBoxMenuItem();
 
   protected JCheckBoxMenuItem applyAutoAnnotationSettings = new JCheckBoxMenuItem();
-  
+
   protected JMenuItem openFeatureSettings;
 
   private SequenceAnnotationOrder annotationSortOrder;
 
   private boolean showAutoCalculatedAbove = false;
 
-  private Map<KeyStroke, JMenuItem> accelerators = new HashMap<KeyStroke, JMenuItem>();
+  private Map<KeyStroke, JMenuItem> accelerators = new HashMap<>();
 
   private SplitContainerI splitFrame;
 
@@ -212,6 +220,11 @@ public class GAlignFrame extends JInternalFrame
   {
     try
     {
+
+      // for Web-page embedding using id=align-frame-div
+      setName(Jalview.getAppID("alignment"));
+
+
       jbInit();
       setJMenuBar(alignFrameMenuBar);
 
@@ -236,7 +249,7 @@ public class GAlignFrame extends JInternalFrame
       System.err.println(e.toString());
     }
 
-    if (!Platform.isAMac())
+    if (Platform.allowMnemonics()) // was "not mac and not JS"
     {
       closeMenuItem.setMnemonic('C');
       outputTextboxMenu.setMnemonic('T');
@@ -265,15 +278,12 @@ public class GAlignFrame extends JInternalFrame
     };
 
     // FIXME getDefaultToolkit throws an exception in Headless mode
-    KeyStroke keyStroke = KeyStroke.getKeyStroke(KeyEvent.VK_S,
-            Toolkit.getDefaultToolkit().getMenuShortcutKeyMask()
-                    | KeyEvent.SHIFT_MASK,
+    KeyStroke keyStroke = KeyStroke.getKeyStroke(KeyEvent.VK_S, Platform.SHORTCUT_KEY_MASK | InputEvent.SHIFT_DOWN_MASK,
             false);
     addMenuActionAndAccelerator(keyStroke, saveAs, al);
 
     closeMenuItem.setText(MessageManager.getString("action.close"));
-    keyStroke = KeyStroke.getKeyStroke(KeyEvent.VK_W,
-            Toolkit.getDefaultToolkit().getMenuShortcutKeyMask(), false);
+    keyStroke = KeyStroke.getKeyStroke(KeyEvent.VK_W, Platform.SHORTCUT_KEY_MASK, false);
     al = new ActionListener()
     {
       @Override
@@ -296,7 +306,7 @@ public class GAlignFrame extends JInternalFrame
     JMenuItem selectAllSequenceMenuItem = new JMenuItem(
             MessageManager.getString("action.select_all"));
     keyStroke = KeyStroke.getKeyStroke(KeyEvent.VK_A,
-            Toolkit.getDefaultToolkit().getMenuShortcutKeyMask(), false);
+            Platform.SHORTCUT_KEY_MASK, false);
     al = new ActionListener()
     {
       @Override
@@ -323,7 +333,7 @@ public class GAlignFrame extends JInternalFrame
     JMenuItem invertSequenceMenuItem = new JMenuItem(
             MessageManager.getString("action.invert_sequence_selection"));
     keyStroke = KeyStroke.getKeyStroke(KeyEvent.VK_I,
-            Toolkit.getDefaultToolkit().getMenuShortcutKeyMask(), false);
+            Platform.SHORTCUT_KEY_MASK, false);
     al = new ActionListener()
     {
       @Override
@@ -359,7 +369,7 @@ public class GAlignFrame extends JInternalFrame
     JMenuItem remove2LeftMenuItem = new JMenuItem(
             MessageManager.getString("action.remove_left"));
     keyStroke = KeyStroke.getKeyStroke(KeyEvent.VK_L,
-            Toolkit.getDefaultToolkit().getMenuShortcutKeyMask(), false);
+            Platform.SHORTCUT_KEY_MASK, false);
     al = new ActionListener()
     {
       @Override
@@ -373,7 +383,7 @@ public class GAlignFrame extends JInternalFrame
     JMenuItem remove2RightMenuItem = new JMenuItem(
             MessageManager.getString("action.remove_right"));
     keyStroke = KeyStroke.getKeyStroke(KeyEvent.VK_R,
-            Toolkit.getDefaultToolkit().getMenuShortcutKeyMask(), false);
+            Platform.SHORTCUT_KEY_MASK, false);
     al = new ActionListener()
     {
       @Override
@@ -387,7 +397,7 @@ public class GAlignFrame extends JInternalFrame
     JMenuItem removeGappedColumnMenuItem = new JMenuItem(
             MessageManager.getString("action.remove_empty_columns"));
     keyStroke = KeyStroke.getKeyStroke(KeyEvent.VK_E,
-            Toolkit.getDefaultToolkit().getMenuShortcutKeyMask(), false);
+            Platform.SHORTCUT_KEY_MASK, false);
     al = new ActionListener()
     {
       @Override
@@ -401,8 +411,8 @@ public class GAlignFrame extends JInternalFrame
     JMenuItem removeAllGapsMenuItem = new JMenuItem(
             MessageManager.getString("action.remove_all_gaps"));
     keyStroke = KeyStroke.getKeyStroke(KeyEvent.VK_E,
-            Toolkit.getDefaultToolkit().getMenuShortcutKeyMask()
-                    | KeyEvent.SHIFT_MASK,
+            Platform.SHORTCUT_KEY_MASK
+                    | InputEvent.SHIFT_DOWN_MASK,
             false);
     al = new ActionListener()
     {
@@ -509,7 +519,7 @@ public class GAlignFrame extends JInternalFrame
     JMenuItem removeRedundancyMenuItem = new JMenuItem(
             MessageManager.getString("action.remove_redundancy"));
     keyStroke = KeyStroke.getKeyStroke(KeyEvent.VK_D,
-            Toolkit.getDefaultToolkit().getMenuShortcutKeyMask(), false);
+            Platform.SHORTCUT_KEY_MASK, false);
     al = new ActionListener()
     {
       @Override
@@ -684,7 +694,7 @@ public class GAlignFrame extends JInternalFrame
     undoMenuItem.setEnabled(false);
     undoMenuItem.setText(MessageManager.getString("action.undo"));
     keyStroke = KeyStroke.getKeyStroke(KeyEvent.VK_Z,
-            Toolkit.getDefaultToolkit().getMenuShortcutKeyMask(), false);
+            Platform.SHORTCUT_KEY_MASK, false);
     al = new ActionListener()
     {
       @Override
@@ -698,7 +708,7 @@ public class GAlignFrame extends JInternalFrame
     redoMenuItem.setEnabled(false);
     redoMenuItem.setText(MessageManager.getString("action.redo"));
     keyStroke = KeyStroke.getKeyStroke(KeyEvent.VK_Y,
-            Toolkit.getDefaultToolkit().getMenuShortcutKeyMask(), false);
+            Platform.SHORTCUT_KEY_MASK, false);
     al = new ActionListener()
     {
       @Override
@@ -722,7 +732,7 @@ public class GAlignFrame extends JInternalFrame
     JMenuItem printMenuItem = new JMenuItem(
             MessageManager.getString("action.print"));
     keyStroke = KeyStroke.getKeyStroke(KeyEvent.VK_P,
-            Toolkit.getDefaultToolkit().getMenuShortcutKeyMask(), false);
+            Platform.SHORTCUT_KEY_MASK, false);
     al = new ActionListener()
     {
       @Override
@@ -748,7 +758,7 @@ public class GAlignFrame extends JInternalFrame
     JMenuItem findMenuItem = new JMenuItem(
             MessageManager.getString("action.find"));
     keyStroke = KeyStroke.getKeyStroke(KeyEvent.VK_F,
-            Toolkit.getDefaultToolkit().getMenuShortcutKeyMask(), false);
+            Platform.SHORTCUT_KEY_MASK, false);
     findMenuItem.setToolTipText(JvSwingUtils.wrapTooltip(true,
             MessageManager.getString("label.find_tip")));
     al = new ActionListener()
@@ -909,7 +919,7 @@ public class GAlignFrame extends JInternalFrame
     JMenuItem deleteGroups = new JMenuItem(
             MessageManager.getString("action.undefine_groups"));
     keyStroke = KeyStroke.getKeyStroke(KeyEvent.VK_U,
-            Toolkit.getDefaultToolkit().getMenuShortcutKeyMask(), false);
+            Platform.SHORTCUT_KEY_MASK, false);
     al = new ActionListener()
     {
       @Override
@@ -934,7 +944,7 @@ public class GAlignFrame extends JInternalFrame
     JMenuItem createGroup = new JMenuItem(
             MessageManager.getString("action.create_group"));
     keyStroke = KeyStroke.getKeyStroke(KeyEvent.VK_G,
-            Toolkit.getDefaultToolkit().getMenuShortcutKeyMask(), false);
+            Platform.SHORTCUT_KEY_MASK, false);
     al = new ActionListener()
     {
       @Override
@@ -948,8 +958,8 @@ public class GAlignFrame extends JInternalFrame
     JMenuItem unGroup = new JMenuItem(
             MessageManager.getString("action.remove_group"));
     keyStroke = KeyStroke.getKeyStroke(KeyEvent.VK_G,
-            Toolkit.getDefaultToolkit().getMenuShortcutKeyMask()
-                    | KeyEvent.SHIFT_MASK,
+            Platform.SHORTCUT_KEY_MASK
+                    | InputEvent.SHIFT_DOWN_MASK,
             false);
     al = new ActionListener()
     {
@@ -963,27 +973,27 @@ public class GAlignFrame extends JInternalFrame
 
     copy.setText(MessageManager.getString("action.copy"));
     keyStroke = KeyStroke.getKeyStroke(KeyEvent.VK_C,
-            Toolkit.getDefaultToolkit().getMenuShortcutKeyMask(), false);
+            Platform.SHORTCUT_KEY_MASK, false);
 
     al = new ActionListener()
     {
       @Override
       public void actionPerformed(ActionEvent e)
       {
-        copy_actionPerformed(e);
+        copy_actionPerformed();
       }
     };
     addMenuActionAndAccelerator(keyStroke, copy, al);
 
     cut.setText(MessageManager.getString("action.cut"));
     keyStroke = KeyStroke.getKeyStroke(KeyEvent.VK_X,
-            Toolkit.getDefaultToolkit().getMenuShortcutKeyMask(), false);
+            Platform.SHORTCUT_KEY_MASK, false);
     al = new ActionListener()
     {
       @Override
       public void actionPerformed(ActionEvent e)
       {
-        cut_actionPerformed(e);
+        cut_actionPerformed();
       }
     };
     addMenuActionAndAccelerator(keyStroke, cut, al);
@@ -995,7 +1005,7 @@ public class GAlignFrame extends JInternalFrame
       @Override
       public void actionPerformed(ActionEvent e)
       {
-        delete_actionPerformed(e);
+        delete_actionPerformed();
       }
     });
 
@@ -1003,8 +1013,8 @@ public class GAlignFrame extends JInternalFrame
     JMenuItem pasteNew = new JMenuItem(
             MessageManager.getString("label.to_new_alignment"));
     keyStroke = KeyStroke.getKeyStroke(KeyEvent.VK_V,
-            Toolkit.getDefaultToolkit().getMenuShortcutKeyMask()
-                    | KeyEvent.SHIFT_MASK,
+            Platform.SHORTCUT_KEY_MASK
+                    | InputEvent.SHIFT_DOWN_MASK,
             false);
     al = new ActionListener()
     {
@@ -1019,7 +1029,7 @@ public class GAlignFrame extends JInternalFrame
     JMenuItem pasteThis = new JMenuItem(
             MessageManager.getString("label.to_this_alignment"));
     keyStroke = KeyStroke.getKeyStroke(KeyEvent.VK_V,
-            Toolkit.getDefaultToolkit().getMenuShortcutKeyMask(), false);
+            Platform.SHORTCUT_KEY_MASK, false);
     al = new ActionListener()
     {
       @Override
@@ -1224,16 +1234,33 @@ public class GAlignFrame extends JInternalFrame
         vamsasStore_actionPerformed(e);
       }
     });
+
+    /*
+     * Translate as cDNA with sub-menu of translation tables
+     */
     showTranslation
             .setText(MessageManager.getString("label.translate_cDNA"));
-    showTranslation.addActionListener(new ActionListener()
+    boolean first = true;
+    for (final GeneticCodeI table : GeneticCodes.getInstance()
+            .getCodeTables())
     {
-      @Override
-      public void actionPerformed(ActionEvent e)
+      JMenuItem item = new JMenuItem(table.getId() + " " + table.getName());
+      showTranslation.add(item);
+      item.addActionListener(new ActionListener()
+      {
+        @Override
+        public void actionPerformed(ActionEvent e)
+        {
+          showTranslation_actionPerformed(table);
+        }
+      });
+      if (first)
       {
-        showTranslation_actionPerformed(e);
+        showTranslation.addSeparator();
       }
-    });
+      first = false;
+    }
+
     showReverse.setText(MessageManager.getString("label.reverse"));
     showReverse.addActionListener(new ActionListener()
     {
@@ -1292,6 +1319,10 @@ public class GAlignFrame extends JInternalFrame
         featureSettings_actionPerformed(e);
       }
     });
+
+    /*
+     * add sub-menu of database we can fetch from
+     */
     JMenuItem fetchSequence = new JMenuItem(
             MessageManager.getString("label.fetch_sequences"));
     fetchSequence.addActionListener(new ActionListener()
@@ -1299,7 +1330,7 @@ public class GAlignFrame extends JInternalFrame
       @Override
       public void actionPerformed(ActionEvent e)
       {
-        fetchSequence_actionPerformed(e);
+        fetchSequence_actionPerformed();
       }
     });
 
@@ -1313,7 +1344,8 @@ public class GAlignFrame extends JInternalFrame
         associatedData_actionPerformed(e);
       }
     });
-    loadVcf = new JMenuItem(MessageManager.getString("label.load_vcf_file"));
+    loadVcf = new JMenuItem(
+            MessageManager.getString("label.load_vcf_file"));
     loadVcf.setToolTipText(MessageManager.getString("label.load_vcf"));
     loadVcf.addActionListener(new ActionListener()
     {
@@ -1514,8 +1546,8 @@ public class GAlignFrame extends JInternalFrame
     JMenuItem invertColSel = new JMenuItem(
             MessageManager.getString("action.invert_column_selection"));
     keyStroke = KeyStroke.getKeyStroke(KeyEvent.VK_I,
-            Toolkit.getDefaultToolkit().getMenuShortcutKeyMask()
-                    | KeyEvent.ALT_MASK,
+            Platform.SHORTCUT_KEY_MASK
+                    | InputEvent.ALT_DOWN_MASK,
             false);
     al = new ActionListener()
     {
@@ -1578,7 +1610,7 @@ public class GAlignFrame extends JInternalFrame
 
     JMenuItem save = new JMenuItem(MessageManager.getString("action.save"));
     keyStroke = KeyStroke.getKeyStroke(KeyEvent.VK_S,
-            Toolkit.getDefaultToolkit().getMenuShortcutKeyMask(), false);
+            Platform.SHORTCUT_KEY_MASK, false);
     al = new ActionListener()
     {
       @Override
@@ -1603,7 +1635,7 @@ public class GAlignFrame extends JInternalFrame
     JMenuItem newView = new JMenuItem(
             MessageManager.getString("action.new_view"));
     keyStroke = KeyStroke.getKeyStroke(KeyEvent.VK_T,
-            Toolkit.getDefaultToolkit().getMenuShortcutKeyMask(), false);
+            Platform.SHORTCUT_KEY_MASK, false);
     al = new ActionListener()
     {
       @Override
@@ -1707,7 +1739,7 @@ public class GAlignFrame extends JInternalFrame
     alignFrameMenuBar.add(formatMenu);
     alignFrameMenuBar.add(colourMenu);
     alignFrameMenuBar.add(calculateMenu);
-    if (!Jalview.isJS())
+    if (!Platform.isJS())
     {
       alignFrameMenuBar.add(webService);
     }
@@ -1728,7 +1760,7 @@ public class GAlignFrame extends JInternalFrame
     fileMenu.add(exportAnnotations);
     fileMenu.add(loadTreeMenuItem);
     fileMenu.add(associatedData);
-    if (!Jalview.isJS())
+    if (!Platform.isJS())
     {
       fileMenu.add(loadVcf);
     }
@@ -1765,11 +1797,8 @@ public class GAlignFrame extends JInternalFrame
     hideMenu.add(hideAllSelection);
     hideMenu.add(hideAllButSelection);
     viewMenu.add(newView);
-    if (!Jalview.isJS())
-    {
-      viewMenu.add(expandViews);
-      viewMenu.add(gatherViews);
-    }
+    viewMenu.add(expandViews);
+    viewMenu.add(gatherViews);
     viewMenu.addSeparator();
     viewMenu.add(showMenu);
     viewMenu.add(hideMenu);
@@ -1829,7 +1858,7 @@ public class GAlignFrame extends JInternalFrame
     calculateMenu.addSeparator();
     calculateMenu.add(expandAlignment);
     calculateMenu.add(extractScores);
-    if (!Jalview.isJS())
+    if (!Platform.isJS())
     {
       calculateMenu.addSeparator();
       calculateMenu.add(runGroovy);
@@ -1838,15 +1867,15 @@ public class GAlignFrame extends JInternalFrame
     webServiceNoServices = new JMenuItem(
             MessageManager.getString("label.no_services"));
     webService.add(webServiceNoServices);
-    if (!Jalview.isJS())
+    if (!Platform.isJS())
     {
       exportImageMenu.add(htmlMenuItem);
     }
     exportImageMenu.add(epsFile);
     exportImageMenu.add(createPNG);
-    exportImageMenu.add(createBioJS);
-    if (!Jalview.isJS())
+    if (!Platform.isJS())
     {
+      exportImageMenu.add(createBioJS);
       exportImageMenu.add(createSVG);
     }
     addSequenceMenu.add(addFromFile);
@@ -1964,8 +1993,9 @@ public class GAlignFrame extends JInternalFrame
       }
     });
 
-    annotationColour = new JMenuItem(
+    annotationColour = new JRadioButtonMenuItem(
             MessageManager.getString("action.by_annotation"));
+    annotationColour.setName(ResidueColourScheme.ANNOTATION_COLOUR);
     annotationColour.addActionListener(new ActionListener()
     {
       @Override
@@ -2351,15 +2381,15 @@ public class GAlignFrame extends JInternalFrame
   {
   }
 
-  protected void copy_actionPerformed(ActionEvent e)
+  protected void copy_actionPerformed()
   {
   }
 
-  protected void cut_actionPerformed(ActionEvent e)
+  protected void cut_actionPerformed()
   {
   }
 
-  protected void delete_actionPerformed(ActionEvent e)
+  protected void delete_actionPerformed()
   {
   }
 
@@ -2461,7 +2491,7 @@ public class GAlignFrame extends JInternalFrame
 
   }
 
-  public void showTranslation_actionPerformed(ActionEvent e)
+  public void showTranslation_actionPerformed(GeneticCodeI codeTable)
   {
 
   }
@@ -2471,7 +2501,7 @@ public class GAlignFrame extends JInternalFrame
 
   }
 
-  public void fetchSequence_actionPerformed(ActionEvent e)
+  public void fetchSequence_actionPerformed()
   {
 
   }