JAL-518 better test coverage and support for case preservation
[jalview.git] / src / jalview / jbgui / GAlignFrame.java
1 /*
2  * Jalview - A Sequence Alignment Editor and Viewer ($$Version-Rel$$)
3  * Copyright (C) $$Year-Rel$$ The Jalview Authors
4  * 
5  * This file is part of Jalview.
6  * 
7  * Jalview is free software: you can redistribute it and/or
8  * modify it under the terms of the GNU General Public License 
9  * as published by the Free Software Foundation, either version 3
10  * of the License, or (at your option) any later version.
11  *  
12  * Jalview is distributed in the hope that it will be useful, but 
13  * WITHOUT ANY WARRANTY; without even the implied warranty 
14  * of MERCHANTABILITY or FITNESS FOR A PARTICULAR 
15  * PURPOSE.  See the GNU General Public License for more details.
16  * 
17  * You should have received a copy of the GNU General Public License
18  * along with Jalview.  If not, see <http://www.gnu.org/licenses/>.
19  * The Jalview Authors are detailed in the 'AUTHORS' file.
20  */
21 package jalview.jbgui;
22
23 import java.awt.BorderLayout;
24 import java.awt.Color;
25 import java.awt.GridLayout;
26 import java.awt.event.ActionEvent;
27 import java.awt.event.ActionListener;
28 import java.awt.event.FocusAdapter;
29 import java.awt.event.FocusEvent;
30 import java.awt.event.KeyEvent;
31 import java.awt.event.MouseAdapter;
32 import java.awt.event.MouseEvent;
33 import java.util.HashMap;
34 import java.util.Map;
35
36 import javax.swing.BorderFactory;
37 import javax.swing.ButtonGroup;
38 import javax.swing.JCheckBoxMenuItem;
39 import javax.swing.JInternalFrame;
40 import javax.swing.JLabel;
41 import javax.swing.JMenu;
42 import javax.swing.JMenuBar;
43 import javax.swing.JMenuItem;
44 import javax.swing.JPanel;
45 import javax.swing.JRadioButtonMenuItem;
46 import javax.swing.JTabbedPane;
47 import javax.swing.KeyStroke;
48 import javax.swing.event.ChangeEvent;
49 import javax.swing.event.MenuEvent;
50 import javax.swing.event.MenuListener;
51
52 import jalview.analysis.AnnotationSorter.SequenceAnnotationOrder;
53 import jalview.analysis.GeneticCodeI;
54 import jalview.analysis.GeneticCodes;
55 import jalview.api.SplitContainerI;
56 import jalview.bin.Cache;
57 import jalview.gui.JvSwingUtils;
58 import jalview.gui.Preferences;
59 import jalview.io.FileFormats;
60 import jalview.schemes.ResidueColourScheme;
61 import jalview.util.MessageManager;
62 import jalview.util.Platform;
63
64 @SuppressWarnings("serial")
65 public class GAlignFrame extends JInternalFrame
66 {
67   protected JMenuBar alignFrameMenuBar = new JMenuBar();
68
69   protected JMenuItem closeMenuItem = new JMenuItem();
70
71   public JMenu webService = new JMenu();// BH 2019 was protected, but not
72                                         // sufficient for AlignFrame thread run
73
74   public JMenuItem webServiceNoServices;// BH 2019 was protected, but not
75                                         // sufficient for AlignFrame thread run
76
77   protected JCheckBoxMenuItem viewBoxesMenuItem = new JCheckBoxMenuItem();
78
79   protected JCheckBoxMenuItem viewTextMenuItem = new JCheckBoxMenuItem();
80
81   protected JMenu sortByAnnotScore = new JMenu();
82
83   public JLabel statusBar = new JLabel(); // BH 2019 was protected, but not
84                                           // sufficient for
85                                           // AlignFrame.printWriter
86
87   protected JMenu outputTextboxMenu = new JMenu();
88
89   protected JCheckBoxMenuItem annotationPanelMenuItem = new JCheckBoxMenuItem();
90
91   protected JCheckBoxMenuItem colourTextMenuItem = new JCheckBoxMenuItem();
92
93   protected JCheckBoxMenuItem showNonconservedMenuItem = new JCheckBoxMenuItem();
94
95   protected JMenuItem undoMenuItem = new JMenuItem();
96
97   protected JMenuItem redoMenuItem = new JMenuItem();
98
99   protected JCheckBoxMenuItem wrapMenuItem = new JCheckBoxMenuItem();
100
101   protected JCheckBoxMenuItem renderGapsMenuItem = new JCheckBoxMenuItem();
102
103   public JCheckBoxMenuItem showSeqFeatures = new JCheckBoxMenuItem();
104
105   JMenuItem copy = new JMenuItem();
106
107   JMenuItem cut = new JMenuItem();
108
109   JMenu pasteMenu = new JMenu();
110
111   protected JCheckBoxMenuItem seqLimits = new JCheckBoxMenuItem();
112
113   protected JCheckBoxMenuItem scaleAbove = new JCheckBoxMenuItem();
114
115   protected JCheckBoxMenuItem scaleLeft = new JCheckBoxMenuItem();
116
117   protected JCheckBoxMenuItem scaleRight = new JCheckBoxMenuItem();
118
119   protected JCheckBoxMenuItem applyToAllGroups;
120
121   protected JMenu colourMenu = new JMenu();
122
123   protected JMenuItem textColour;
124
125   protected JCheckBoxMenuItem conservationMenuItem;
126
127   protected JMenuItem modifyConservation;
128
129   protected JCheckBoxMenuItem abovePIDThreshold;
130
131   protected JMenuItem modifyPID;
132
133   protected JRadioButtonMenuItem annotationColour;
134
135   protected JMenu sortByTreeMenu = new JMenu();
136
137   protected JMenu sort = new JMenu();
138
139   protected JMenuItem calculateTree = new JMenuItem();
140
141   protected JCheckBoxMenuItem padGapsMenuitem = new JCheckBoxMenuItem();
142
143   protected JCheckBoxMenuItem showNpFeatsMenuitem = new JCheckBoxMenuItem();
144
145   protected JCheckBoxMenuItem showDbRefsMenuitem = new JCheckBoxMenuItem();
146
147   protected JMenu showTranslation = new JMenu();
148
149   protected JMenuItem showReverse = new JMenuItem();
150
151   protected JMenuItem showReverseComplement = new JMenuItem();
152
153   protected JMenu showProducts = new JMenu();
154
155   protected JMenuItem runGroovy = new JMenuItem();
156
157   protected JMenuItem loadVcf;
158
159   protected JCheckBoxMenuItem autoCalculate = new JCheckBoxMenuItem();
160
161   protected JCheckBoxMenuItem sortByTree = new JCheckBoxMenuItem();
162
163   protected JCheckBoxMenuItem listenToViewSelections = new JCheckBoxMenuItem();
164
165   protected JPanel statusPanel = new JPanel();
166
167   protected JMenuItem showAllSeqAnnotations = new JMenuItem();
168
169   protected JMenuItem hideAllSeqAnnotations = new JMenuItem();
170
171   protected JMenuItem showAllAlAnnotations = new JMenuItem();
172
173   protected JMenuItem hideAllAlAnnotations = new JMenuItem();
174
175   protected JCheckBoxMenuItem showComplementMenuItem = new JCheckBoxMenuItem();
176
177   protected JCheckBoxMenuItem hiddenMarkers = new JCheckBoxMenuItem();
178
179   protected JTabbedPane tabbedPane = new JTabbedPane();
180
181   protected JMenuItem reload = new JMenuItem();
182
183   protected JMenu formatMenu = new JMenu();
184
185   protected JCheckBoxMenuItem idRightAlign = new JCheckBoxMenuItem();
186
187   protected JCheckBoxMenuItem centreColumnLabelsMenuItem = new JCheckBoxMenuItem();
188
189   protected JCheckBoxMenuItem followHighlightMenuItem = new JCheckBoxMenuItem();
190
191   protected JMenuItem gatherViews = new JMenuItem();
192
193   protected JMenuItem expandViews = new JMenuItem();
194
195   protected JCheckBoxMenuItem showGroupConsensus = new JCheckBoxMenuItem();
196
197   protected JCheckBoxMenuItem showGroupConservation = new JCheckBoxMenuItem();
198
199   protected JCheckBoxMenuItem showConsensusHistogram = new JCheckBoxMenuItem();
200
201   protected JCheckBoxMenuItem showSequenceLogo = new JCheckBoxMenuItem();
202
203   protected JCheckBoxMenuItem normaliseSequenceLogo = new JCheckBoxMenuItem();
204
205   protected JCheckBoxMenuItem applyAutoAnnotationSettings = new JCheckBoxMenuItem();
206
207   protected JMenuItem openFeatureSettings;
208
209   private SequenceAnnotationOrder annotationSortOrder;
210
211   private boolean showAutoCalculatedAbove = false;
212
213   private Map<KeyStroke, JMenuItem> accelerators = new HashMap<>();
214
215   private SplitContainerI splitFrame;
216
217   public GAlignFrame()
218   {
219     try
220     {
221
222       // for Web-page embedding using id=align-frame-div
223       setName("jalview-alignment");
224
225       jbInit();
226       setJMenuBar(alignFrameMenuBar);
227
228       // dynamically fill save as menu with available formats
229       for (String ff : FileFormats.getInstance().getWritableFormats(true))
230       {
231         JMenuItem item = new JMenuItem(ff);
232
233         item.addActionListener(new ActionListener()
234         {
235           @Override
236           public void actionPerformed(ActionEvent e)
237           {
238             outputText_actionPerformed(e.getActionCommand());
239           }
240         });
241
242         outputTextboxMenu.add(item);
243       }
244     } catch (Exception e)
245     {
246       System.err.println(e.toString());
247     }
248
249     if (Platform.allowMnemonics()) // was "not mac and not JS"
250     {
251       closeMenuItem.setMnemonic('C');
252       outputTextboxMenu.setMnemonic('T');
253       undoMenuItem.setMnemonic('Z');
254       redoMenuItem.setMnemonic('0');
255       copy.setMnemonic('C');
256       cut.setMnemonic('U');
257       pasteMenu.setMnemonic('P');
258       reload.setMnemonic('R');
259     }
260   }
261
262   private void jbInit() throws Exception
263   {
264     initColourMenu();
265
266     JMenuItem saveAs = new JMenuItem(
267             MessageManager.getString("action.save_as"));
268     ActionListener al = new ActionListener()
269     {
270       @Override
271       public void actionPerformed(ActionEvent e)
272       {
273         saveAs_actionPerformed();
274       }
275     };
276
277     // FIXME getDefaultToolkit throws an exception in Headless mode
278     KeyStroke keyStroke = KeyStroke.getKeyStroke(KeyEvent.VK_S,
279             jalview.util.ShortcutKeyMaskExWrapper.getMenuShortcutKeyMaskEx()
280                     | jalview.util.ShortcutKeyMaskExWrapper.SHIFT_DOWN_MASK,
281             false);
282     addMenuActionAndAccelerator(keyStroke, saveAs, al);
283
284     closeMenuItem.setText(MessageManager.getString("action.close"));
285     keyStroke = KeyStroke.getKeyStroke(KeyEvent.VK_W,
286             jalview.util.ShortcutKeyMaskExWrapper
287                     .getMenuShortcutKeyMaskEx(),
288             false);
289     al = new ActionListener()
290     {
291       @Override
292       public void actionPerformed(ActionEvent e)
293       {
294         closeMenuItem_actionPerformed(false);
295       }
296     };
297     addMenuActionAndAccelerator(keyStroke, closeMenuItem, al);
298
299     JMenu editMenu = new JMenu(MessageManager.getString("action.edit"));
300     JMenu viewMenu = new JMenu(MessageManager.getString("action.view"));
301     JMenu annotationsMenu = new JMenu(
302             MessageManager.getString("action.annotations"));
303     JMenu showMenu = new JMenu(MessageManager.getString("action.show"));
304     colourMenu.setText(MessageManager.getString("action.colour"));
305     JMenu calculateMenu = new JMenu(
306             MessageManager.getString("action.calculate"));
307     webService.setText(MessageManager.getString("action.web_service"));
308     JMenuItem selectAllSequenceMenuItem = new JMenuItem(
309             MessageManager.getString("action.select_all"));
310     keyStroke = KeyStroke.getKeyStroke(KeyEvent.VK_A,
311             jalview.util.ShortcutKeyMaskExWrapper
312                     .getMenuShortcutKeyMaskEx(),
313             false);
314     al = new ActionListener()
315     {
316       @Override
317       public void actionPerformed(ActionEvent e)
318       {
319         selectAllSequenceMenuItem_actionPerformed(e);
320       }
321     };
322     addMenuActionAndAccelerator(keyStroke, selectAllSequenceMenuItem, al);
323
324     JMenuItem deselectAllSequenceMenuItem = new JMenuItem(
325             MessageManager.getString("action.deselect_all"));
326     keyStroke = KeyStroke.getKeyStroke(KeyEvent.VK_ESCAPE, 0, false);
327     al = new ActionListener()
328     {
329       @Override
330       public void actionPerformed(ActionEvent e)
331       {
332         deselectAllSequenceMenuItem_actionPerformed(e);
333       }
334     };
335     addMenuActionAndAccelerator(keyStroke, deselectAllSequenceMenuItem, al);
336
337     JMenuItem invertSequenceMenuItem = new JMenuItem(
338             MessageManager.getString("action.invert_sequence_selection"));
339     keyStroke = KeyStroke.getKeyStroke(KeyEvent.VK_I,
340             jalview.util.ShortcutKeyMaskExWrapper
341                     .getMenuShortcutKeyMaskEx(),
342             false);
343     al = new ActionListener()
344     {
345       @Override
346       public void actionPerformed(ActionEvent e)
347       {
348         invertSequenceMenuItem_actionPerformed(e);
349       }
350     };
351     addMenuActionAndAccelerator(keyStroke, invertSequenceMenuItem, al);
352
353     JMenuItem grpsFromSelection = new JMenuItem(
354             MessageManager.getString("action.make_groups_selection"));
355     grpsFromSelection.addActionListener(new ActionListener()
356     {
357       @Override
358       public void actionPerformed(ActionEvent e)
359       {
360         makeGrpsFromSelection_actionPerformed(e);
361       }
362     });
363     JMenuItem expandAlignment = new JMenuItem(
364             MessageManager.getString("action.view_flanking_regions"));
365     expandAlignment.setToolTipText(
366             MessageManager.getString("label.view_flanking_regions"));
367     expandAlignment.addActionListener(new ActionListener()
368     {
369       @Override
370       public void actionPerformed(ActionEvent e)
371       {
372         expand_newalign(e);
373       }
374     });
375     JMenuItem remove2LeftMenuItem = new JMenuItem(
376             MessageManager.getString("action.remove_left"));
377     keyStroke = KeyStroke.getKeyStroke(KeyEvent.VK_L,
378             jalview.util.ShortcutKeyMaskExWrapper
379                     .getMenuShortcutKeyMaskEx(),
380             false);
381     al = new ActionListener()
382     {
383       @Override
384       public void actionPerformed(ActionEvent e)
385       {
386         remove2LeftMenuItem_actionPerformed(e);
387       }
388     };
389     addMenuActionAndAccelerator(keyStroke, remove2LeftMenuItem, al);
390
391     JMenuItem remove2RightMenuItem = new JMenuItem(
392             MessageManager.getString("action.remove_right"));
393     keyStroke = KeyStroke.getKeyStroke(KeyEvent.VK_R,
394             jalview.util.ShortcutKeyMaskExWrapper
395                     .getMenuShortcutKeyMaskEx(),
396             false);
397     al = new ActionListener()
398     {
399       @Override
400       public void actionPerformed(ActionEvent e)
401       {
402         remove2RightMenuItem_actionPerformed(e);
403       }
404     };
405     addMenuActionAndAccelerator(keyStroke, remove2RightMenuItem, al);
406
407     JMenuItem removeGappedColumnMenuItem = new JMenuItem(
408             MessageManager.getString("action.remove_empty_columns"));
409     keyStroke = KeyStroke.getKeyStroke(KeyEvent.VK_E,
410             jalview.util.ShortcutKeyMaskExWrapper
411                     .getMenuShortcutKeyMaskEx(),
412             false);
413     al = new ActionListener()
414     {
415       @Override
416       public void actionPerformed(ActionEvent e)
417       {
418         removeGappedColumnMenuItem_actionPerformed(e);
419       }
420     };
421     addMenuActionAndAccelerator(keyStroke, removeGappedColumnMenuItem, al);
422
423     JMenuItem removeAllGapsMenuItem = new JMenuItem(
424             MessageManager.getString("action.remove_all_gaps"));
425     keyStroke = KeyStroke.getKeyStroke(KeyEvent.VK_E,
426             jalview.util.ShortcutKeyMaskExWrapper.getMenuShortcutKeyMaskEx()
427                     | jalview.util.ShortcutKeyMaskExWrapper.SHIFT_DOWN_MASK,
428             false);
429     al = new ActionListener()
430     {
431       @Override
432       public void actionPerformed(ActionEvent e)
433       {
434         removeAllGapsMenuItem_actionPerformed(e);
435       }
436     };
437     addMenuActionAndAccelerator(keyStroke, removeAllGapsMenuItem, al);
438
439     JMenuItem justifyLeftMenuItem = new JMenuItem(
440             MessageManager.getString("action.left_justify"));
441     justifyLeftMenuItem.setToolTipText(
442             MessageManager.getString("tooltip.left_justify"));
443     justifyLeftMenuItem.addActionListener(new ActionListener()
444     {
445       @Override
446       public void actionPerformed(ActionEvent e)
447       {
448         justifyLeftMenuItem_actionPerformed(e);
449       }
450     });
451     JMenuItem justifyRightMenuItem = new JMenuItem(
452             MessageManager.getString("action.right_justify"));
453     justifyRightMenuItem.setToolTipText(
454             MessageManager.getString("action.left_justify"));
455
456     justifyRightMenuItem.addActionListener(new ActionListener()
457     {
458       @Override
459       public void actionPerformed(ActionEvent e)
460       {
461         justifyRightMenuItem_actionPerformed(e);
462       }
463     });
464     viewBoxesMenuItem.setText(MessageManager.getString("action.boxes"));
465     viewBoxesMenuItem.setState(true);
466     viewBoxesMenuItem.addActionListener(new ActionListener()
467     {
468       @Override
469       public void actionPerformed(ActionEvent e)
470       {
471         viewBoxesMenuItem_actionPerformed(e);
472       }
473     });
474     viewTextMenuItem.setText(MessageManager.getString("action.text"));
475     viewTextMenuItem.setState(true);
476     viewTextMenuItem.addActionListener(new ActionListener()
477     {
478       @Override
479       public void actionPerformed(ActionEvent e)
480       {
481         viewTextMenuItem_actionPerformed(e);
482       }
483     });
484     showNonconservedMenuItem
485             .setText(MessageManager.getString("label.show_non_conserved"));
486     showNonconservedMenuItem.setState(false);
487     showNonconservedMenuItem.addActionListener(new ActionListener()
488     {
489       @Override
490       public void actionPerformed(ActionEvent e)
491       {
492         showUnconservedMenuItem_actionPerformed(e);
493       }
494     });
495     JMenuItem sortPairwiseMenuItem = new JMenuItem(
496             MessageManager.getString("action.by_pairwise_id"));
497     sortPairwiseMenuItem.addActionListener(new ActionListener()
498     {
499       @Override
500       public void actionPerformed(ActionEvent e)
501       {
502         sortPairwiseMenuItem_actionPerformed(e);
503       }
504     });
505     JMenuItem sortIDMenuItem = new JMenuItem(
506             MessageManager.getString("action.by_id"));
507     sortIDMenuItem.addActionListener(new ActionListener()
508     {
509       @Override
510       public void actionPerformed(ActionEvent e)
511       {
512         sortIDMenuItem_actionPerformed(e);
513       }
514     });
515     JMenuItem sortLengthMenuItem = new JMenuItem(
516             MessageManager.getString("action.by_length"));
517     sortLengthMenuItem.addActionListener(new ActionListener()
518     {
519       @Override
520       public void actionPerformed(ActionEvent e)
521       {
522         sortLengthMenuItem_actionPerformed(e);
523       }
524     });
525     JMenuItem sortGroupMenuItem = new JMenuItem(
526             MessageManager.getString("action.by_group"));
527     sortGroupMenuItem.addActionListener(new ActionListener()
528     {
529       @Override
530       public void actionPerformed(ActionEvent e)
531       {
532         sortGroupMenuItem_actionPerformed(e);
533       }
534     });
535
536     JMenuItem removeRedundancyMenuItem = new JMenuItem(
537             MessageManager.getString("action.remove_redundancy"));
538     keyStroke = KeyStroke.getKeyStroke(KeyEvent.VK_D,
539             jalview.util.ShortcutKeyMaskExWrapper
540                     .getMenuShortcutKeyMaskEx(),
541             false);
542     al = new ActionListener()
543     {
544       @Override
545       public void actionPerformed(ActionEvent e)
546       {
547         removeRedundancyMenuItem_actionPerformed(e);
548       }
549     };
550     addMenuActionAndAccelerator(keyStroke, removeRedundancyMenuItem, al);
551
552     JMenuItem pairwiseAlignmentMenuItem = new JMenuItem(
553             MessageManager.getString("action.pairwise_alignment"));
554     pairwiseAlignmentMenuItem.addActionListener(new ActionListener()
555     {
556       @Override
557       public void actionPerformed(ActionEvent e)
558       {
559         pairwiseAlignmentMenuItem_actionPerformed(e);
560       }
561     });
562
563     this.getContentPane().setLayout(new BorderLayout());
564     alignFrameMenuBar.setFont(new java.awt.Font("Verdana", 0, 11));
565     statusBar.setBackground(Color.white);
566     statusBar.setFont(new java.awt.Font("Verdana", 0, 11));
567     statusBar.setBorder(BorderFactory.createLineBorder(Color.black));
568     statusBar.setText(MessageManager.getString("label.status_bar"));
569     outputTextboxMenu
570             .setText(MessageManager.getString("label.out_to_textbox"));
571
572     annotationPanelMenuItem.setActionCommand("");
573     annotationPanelMenuItem
574             .setText(MessageManager.getString("label.show_annotations"));
575     annotationPanelMenuItem
576             .setState(Cache.getDefault("SHOW_ANNOTATIONS", true));
577     annotationPanelMenuItem.addActionListener(new ActionListener()
578     {
579       @Override
580       public void actionPerformed(ActionEvent e)
581       {
582         annotationPanelMenuItem_actionPerformed(e);
583       }
584     });
585     showAllAlAnnotations.setText(
586             MessageManager.getString("label.show_all_al_annotations"));
587     final boolean isAnnotationPanelShown = annotationPanelMenuItem
588             .getState();
589     showAllAlAnnotations.setEnabled(isAnnotationPanelShown);
590     showAllAlAnnotations.addActionListener(new ActionListener()
591     {
592       @Override
593       public void actionPerformed(ActionEvent e)
594       {
595         showAllAnnotations_actionPerformed(false, true);
596       }
597     });
598     hideAllAlAnnotations.setText(
599             MessageManager.getString("label.hide_all_al_annotations"));
600     hideAllAlAnnotations.setEnabled(isAnnotationPanelShown);
601     hideAllAlAnnotations.addActionListener(new ActionListener()
602     {
603       @Override
604       public void actionPerformed(ActionEvent e)
605       {
606         hideAllAnnotations_actionPerformed(false, true);
607       }
608     });
609     showAllSeqAnnotations.setText(
610             MessageManager.getString("label.show_all_seq_annotations"));
611     showAllSeqAnnotations.setEnabled(isAnnotationPanelShown);
612     showAllSeqAnnotations.addActionListener(new ActionListener()
613     {
614       @Override
615       public void actionPerformed(ActionEvent e)
616       {
617         showAllAnnotations_actionPerformed(true, false);
618       }
619     });
620     hideAllSeqAnnotations.setText(
621             MessageManager.getString("label.hide_all_seq_annotations"));
622     hideAllSeqAnnotations.setEnabled(isAnnotationPanelShown);
623     hideAllSeqAnnotations.addActionListener(new ActionListener()
624     {
625       @Override
626       public void actionPerformed(ActionEvent e)
627       {
628         hideAllAnnotations_actionPerformed(true, false);
629       }
630     });
631     SequenceAnnotationOrder sortAnnotationsBy = SequenceAnnotationOrder
632             .valueOf(Cache.getDefault(Preferences.SORT_ANNOTATIONS,
633                     SequenceAnnotationOrder.NONE.name()));
634     final JCheckBoxMenuItem sortAnnBySequence = new JCheckBoxMenuItem(
635             MessageManager.getString("label.sort_annotations_by_sequence"));
636     final JCheckBoxMenuItem sortAnnByLabel = new JCheckBoxMenuItem(
637             MessageManager.getString("label.sort_annotations_by_label"));
638
639     sortAnnBySequence.setSelected(
640             sortAnnotationsBy == SequenceAnnotationOrder.SEQUENCE_AND_LABEL);
641     sortAnnBySequence.addActionListener(new ActionListener()
642     {
643       @Override
644       public void actionPerformed(ActionEvent e)
645       {
646         boolean newState = sortAnnBySequence.getState();
647         sortAnnByLabel.setSelected(false);
648         setAnnotationSortOrder(
649                 newState ? SequenceAnnotationOrder.SEQUENCE_AND_LABEL
650                         : SequenceAnnotationOrder.NONE);
651         sortAnnotations_actionPerformed();
652       }
653     });
654     sortAnnByLabel.setSelected(
655             sortAnnotationsBy == SequenceAnnotationOrder.LABEL_AND_SEQUENCE);
656     sortAnnByLabel.addActionListener(new ActionListener()
657     {
658       @Override
659       public void actionPerformed(ActionEvent e)
660       {
661         boolean newState = sortAnnByLabel.getState();
662         sortAnnBySequence.setSelected(false);
663         setAnnotationSortOrder(
664                 newState ? SequenceAnnotationOrder.LABEL_AND_SEQUENCE
665                         : SequenceAnnotationOrder.NONE);
666         sortAnnotations_actionPerformed();
667       }
668     });
669     colourTextMenuItem = new JCheckBoxMenuItem(
670             MessageManager.getString("label.colour_text"));
671     colourTextMenuItem.addActionListener(new ActionListener()
672     {
673       @Override
674       public void actionPerformed(ActionEvent e)
675       {
676         colourTextMenuItem_actionPerformed(e);
677       }
678     });
679
680     JMenuItem htmlMenuItem = new JMenuItem(
681             MessageManager.getString("label.html"));
682     htmlMenuItem.addActionListener(new ActionListener()
683     {
684       @Override
685       public void actionPerformed(ActionEvent e)
686       {
687         htmlMenuItem_actionPerformed(e);
688       }
689     });
690
691     JMenuItem createBioJS = new JMenuItem(
692             MessageManager.getString("label.biojs_html_export"));
693     createBioJS.addActionListener(new java.awt.event.ActionListener()
694     {
695       @Override
696       public void actionPerformed(ActionEvent e)
697       {
698         bioJSMenuItem_actionPerformed(e);
699       }
700     });
701
702     JMenuItem overviewMenuItem = new JMenuItem(
703             MessageManager.getString("label.overview_window"));
704     overviewMenuItem.addActionListener(new ActionListener()
705     {
706       @Override
707       public void actionPerformed(ActionEvent e)
708       {
709         overviewMenuItem_actionPerformed(e);
710       }
711     });
712
713     undoMenuItem.setEnabled(false);
714     undoMenuItem.setText(MessageManager.getString("action.undo"));
715     keyStroke = KeyStroke.getKeyStroke(KeyEvent.VK_Z,
716             jalview.util.ShortcutKeyMaskExWrapper
717                     .getMenuShortcutKeyMaskEx(),
718             false);
719     al = new ActionListener()
720     {
721       @Override
722       public void actionPerformed(ActionEvent e)
723       {
724         undoMenuItem_actionPerformed(e);
725       }
726     };
727     addMenuActionAndAccelerator(keyStroke, undoMenuItem, al);
728
729     redoMenuItem.setEnabled(false);
730     redoMenuItem.setText(MessageManager.getString("action.redo"));
731     keyStroke = KeyStroke.getKeyStroke(KeyEvent.VK_Y,
732             jalview.util.ShortcutKeyMaskExWrapper
733                     .getMenuShortcutKeyMaskEx(),
734             false);
735     al = new ActionListener()
736     {
737       @Override
738       public void actionPerformed(ActionEvent e)
739       {
740         redoMenuItem_actionPerformed(e);
741       }
742     };
743     addMenuActionAndAccelerator(keyStroke, redoMenuItem, al);
744
745     wrapMenuItem.setText(MessageManager.getString("label.wrap"));
746     wrapMenuItem.addActionListener(new ActionListener()
747     {
748       @Override
749       public void actionPerformed(ActionEvent e)
750       {
751         wrapMenuItem_actionPerformed(e);
752       }
753     });
754
755     JMenuItem printMenuItem = new JMenuItem(
756             MessageManager.getString("action.print"));
757     keyStroke = KeyStroke.getKeyStroke(KeyEvent.VK_P,
758             jalview.util.ShortcutKeyMaskExWrapper
759                     .getMenuShortcutKeyMaskEx(),
760             false);
761     al = new ActionListener()
762     {
763       @Override
764       public void actionPerformed(ActionEvent e)
765       {
766         printMenuItem_actionPerformed(e);
767       }
768     };
769     addMenuActionAndAccelerator(keyStroke, printMenuItem, al);
770
771     renderGapsMenuItem
772             .setText(MessageManager.getString("action.show_gaps"));
773     renderGapsMenuItem.setState(true);
774     renderGapsMenuItem.addActionListener(new ActionListener()
775     {
776       @Override
777       public void actionPerformed(ActionEvent e)
778       {
779         renderGapsMenuItem_actionPerformed(e);
780       }
781     });
782
783     JMenuItem findMenuItem = new JMenuItem(
784             MessageManager.getString("action.find"));
785     keyStroke = KeyStroke.getKeyStroke(KeyEvent.VK_F,
786             jalview.util.ShortcutKeyMaskExWrapper
787                     .getMenuShortcutKeyMaskEx(),
788             false);
789     findMenuItem.setToolTipText(JvSwingUtils.wrapTooltip(true,
790             MessageManager.getString("label.find_tip")));
791     al = new ActionListener()
792     {
793       @Override
794       public void actionPerformed(ActionEvent e)
795       {
796         findMenuItem_actionPerformed(e);
797       }
798     };
799     addMenuActionAndAccelerator(keyStroke, findMenuItem, al);
800
801     showSeqFeatures.setText(
802             MessageManager.getString("label.show_sequence_features"));
803     showSeqFeatures.addActionListener(new ActionListener()
804     {
805       @Override
806       public void actionPerformed(ActionEvent actionEvent)
807       {
808         showSeqFeatures_actionPerformed(actionEvent);
809       }
810     });
811     /*
812      * showSeqFeaturesHeight.setText("Vary Sequence Feature Height");
813      * showSeqFeaturesHeight.addActionListener(new ActionListener() { public
814      * void actionPerformed(ActionEvent actionEvent) {
815      * showSeqFeaturesHeight_actionPerformed(actionEvent); } });
816      */
817     showDbRefsMenuitem
818             .setText(MessageManager.getString("label.show_database_refs"));
819     showDbRefsMenuitem.addActionListener(new ActionListener()
820     {
821
822       @Override
823       public void actionPerformed(ActionEvent e)
824       {
825         showDbRefs_actionPerformed(e);
826       }
827
828     });
829     showNpFeatsMenuitem.setText(
830             MessageManager.getString("label.show_non_positional_features"));
831     showNpFeatsMenuitem.addActionListener(new ActionListener()
832     {
833
834       @Override
835       public void actionPerformed(ActionEvent e)
836       {
837         showNpFeats_actionPerformed(e);
838       }
839
840     });
841     showGroupConservation
842             .setText(MessageManager.getString("label.group_conservation"));
843     showGroupConservation.addActionListener(new ActionListener()
844     {
845
846       @Override
847       public void actionPerformed(ActionEvent e)
848       {
849         showGroupConservation_actionPerformed(e);
850       }
851
852     });
853
854     showGroupConsensus
855             .setText(MessageManager.getString("label.group_consensus"));
856     showGroupConsensus.addActionListener(new ActionListener()
857     {
858
859       @Override
860       public void actionPerformed(ActionEvent e)
861       {
862         showGroupConsensus_actionPerformed(e);
863       }
864
865     });
866     showConsensusHistogram.setText(
867             MessageManager.getString("label.show_consensus_histogram"));
868     showConsensusHistogram.addActionListener(new ActionListener()
869     {
870
871       @Override
872       public void actionPerformed(ActionEvent e)
873       {
874         showConsensusHistogram_actionPerformed(e);
875       }
876
877     });
878     showSequenceLogo
879             .setText(MessageManager.getString("label.show_consensus_logo"));
880     showSequenceLogo.addActionListener(new ActionListener()
881     {
882
883       @Override
884       public void actionPerformed(ActionEvent e)
885       {
886         showSequenceLogo_actionPerformed(e);
887       }
888
889     });
890     normaliseSequenceLogo
891             .setText(MessageManager.getString("label.norm_consensus_logo"));
892     normaliseSequenceLogo.addActionListener(new ActionListener()
893     {
894
895       @Override
896       public void actionPerformed(ActionEvent e)
897       {
898         normaliseSequenceLogo_actionPerformed(e);
899       }
900
901     });
902     applyAutoAnnotationSettings
903             .setText(MessageManager.getString("label.apply_all_groups"));
904     applyAutoAnnotationSettings.setState(false);
905     applyAutoAnnotationSettings.setVisible(true);
906     applyAutoAnnotationSettings.addActionListener(new ActionListener()
907     {
908       @Override
909       public void actionPerformed(ActionEvent e)
910       {
911         applyAutoAnnotationSettings_actionPerformed(e);
912       }
913     });
914
915     ButtonGroup buttonGroup = new ButtonGroup();
916     final JRadioButtonMenuItem showAutoFirst = new JRadioButtonMenuItem(
917             MessageManager.getString("label.show_first"));
918     final JRadioButtonMenuItem showAutoLast = new JRadioButtonMenuItem(
919             MessageManager.getString("label.show_last"));
920     buttonGroup.add(showAutoFirst);
921     buttonGroup.add(showAutoLast);
922     final boolean autoFirst = Cache
923             .getDefault(Preferences.SHOW_AUTOCALC_ABOVE, false);
924     showAutoFirst.setSelected(autoFirst);
925     setShowAutoCalculatedAbove(autoFirst);
926     showAutoFirst.addActionListener(new ActionListener()
927     {
928       @Override
929       public void actionPerformed(ActionEvent e)
930       {
931         setShowAutoCalculatedAbove(showAutoFirst.isSelected());
932         sortAnnotations_actionPerformed();
933       }
934     });
935     showAutoLast.setSelected(!showAutoFirst.isSelected());
936     showAutoLast.addActionListener(new ActionListener()
937     {
938       @Override
939       public void actionPerformed(ActionEvent e)
940       {
941         setShowAutoCalculatedAbove(!showAutoLast.isSelected());
942         sortAnnotations_actionPerformed();
943       }
944     });
945
946     JMenuItem deleteGroups = new JMenuItem(
947             MessageManager.getString("action.undefine_groups"));
948     keyStroke = KeyStroke.getKeyStroke(KeyEvent.VK_U,
949             jalview.util.ShortcutKeyMaskExWrapper
950                     .getMenuShortcutKeyMaskEx(),
951             false);
952     al = new ActionListener()
953     {
954       @Override
955       public void actionPerformed(ActionEvent e)
956       {
957         deleteGroups_actionPerformed(e);
958       }
959     };
960     addMenuActionAndAccelerator(keyStroke, deleteGroups, al);
961
962     JMenuItem annotationColumn = new JMenuItem(
963             MessageManager.getString("action.select_by_annotation"));
964     annotationColumn.addActionListener(new ActionListener()
965     {
966       @Override
967       public void actionPerformed(ActionEvent e)
968       {
969         annotationColumn_actionPerformed(e);
970       }
971     });
972
973     JMenuItem createGroup = new JMenuItem(
974             MessageManager.getString("action.create_group"));
975     keyStroke = KeyStroke.getKeyStroke(KeyEvent.VK_G,
976             jalview.util.ShortcutKeyMaskExWrapper
977                     .getMenuShortcutKeyMaskEx(),
978             false);
979     al = new ActionListener()
980     {
981       @Override
982       public void actionPerformed(ActionEvent e)
983       {
984         createGroup_actionPerformed(e);
985       }
986     };
987     addMenuActionAndAccelerator(keyStroke, createGroup, al);
988
989     JMenuItem unGroup = new JMenuItem(
990             MessageManager.getString("action.remove_group"));
991     keyStroke = KeyStroke.getKeyStroke(KeyEvent.VK_G,
992             jalview.util.ShortcutKeyMaskExWrapper.getMenuShortcutKeyMaskEx()
993                     | jalview.util.ShortcutKeyMaskExWrapper.SHIFT_DOWN_MASK,
994             false);
995     al = new ActionListener()
996     {
997       @Override
998       public void actionPerformed(ActionEvent e)
999       {
1000         unGroup_actionPerformed(e);
1001       }
1002     };
1003     addMenuActionAndAccelerator(keyStroke, unGroup, al);
1004
1005     copy.setText(MessageManager.getString("action.copy"));
1006     keyStroke = KeyStroke.getKeyStroke(KeyEvent.VK_C,
1007             jalview.util.ShortcutKeyMaskExWrapper
1008                     .getMenuShortcutKeyMaskEx(),
1009             false);
1010
1011     al = new ActionListener()
1012     {
1013       @Override
1014       public void actionPerformed(ActionEvent e)
1015       {
1016         copy_actionPerformed();
1017       }
1018     };
1019     addMenuActionAndAccelerator(keyStroke, copy, al);
1020
1021     cut.setText(MessageManager.getString("action.cut"));
1022     keyStroke = KeyStroke.getKeyStroke(KeyEvent.VK_X,
1023             jalview.util.ShortcutKeyMaskExWrapper
1024                     .getMenuShortcutKeyMaskEx(),
1025             false);
1026     al = new ActionListener()
1027     {
1028       @Override
1029       public void actionPerformed(ActionEvent e)
1030       {
1031         cut_actionPerformed();
1032       }
1033     };
1034     addMenuActionAndAccelerator(keyStroke, cut, al);
1035
1036     JMenuItem delete = new JMenuItem(
1037             MessageManager.getString("action.delete"));
1038     delete.addActionListener(new ActionListener()
1039     {
1040       @Override
1041       public void actionPerformed(ActionEvent e)
1042       {
1043         delete_actionPerformed();
1044       }
1045     });
1046
1047     pasteMenu.setText(MessageManager.getString("action.paste"));
1048     JMenuItem pasteNew = new JMenuItem(
1049             MessageManager.getString("label.to_new_alignment"));
1050     keyStroke = KeyStroke.getKeyStroke(KeyEvent.VK_V,
1051             jalview.util.ShortcutKeyMaskExWrapper.getMenuShortcutKeyMaskEx()
1052                     | jalview.util.ShortcutKeyMaskExWrapper.SHIFT_DOWN_MASK,
1053             false);
1054     al = new ActionListener()
1055     {
1056       @Override
1057       public void actionPerformed(ActionEvent e)
1058       {
1059         pasteNew_actionPerformed(e);
1060       }
1061     };
1062     addMenuActionAndAccelerator(keyStroke, pasteNew, al);
1063
1064     JMenuItem pasteThis = new JMenuItem(
1065             MessageManager.getString("label.to_this_alignment"));
1066     keyStroke = KeyStroke.getKeyStroke(KeyEvent.VK_V,
1067             jalview.util.ShortcutKeyMaskExWrapper
1068                     .getMenuShortcutKeyMaskEx(),
1069             false);
1070     al = new ActionListener()
1071     {
1072       @Override
1073       public void actionPerformed(ActionEvent e)
1074       {
1075         pasteThis_actionPerformed(e);
1076       }
1077     };
1078     addMenuActionAndAccelerator(keyStroke, pasteThis, al);
1079
1080     JMenuItem createPNG = new JMenuItem("PNG");
1081     createPNG.addActionListener(new ActionListener()
1082     {
1083       @Override
1084       public void actionPerformed(ActionEvent e)
1085       {
1086         createPNG(null);
1087       }
1088     });
1089     createPNG.setActionCommand(
1090             MessageManager.getString("label.save_png_image"));
1091
1092     JMenuItem font = new JMenuItem(MessageManager.getString("action.font"));
1093     font.addActionListener(new ActionListener()
1094     {
1095       @Override
1096       public void actionPerformed(ActionEvent e)
1097       {
1098         font_actionPerformed(e);
1099       }
1100     });
1101     seqLimits.setText(
1102             MessageManager.getString("label.show_sequence_limits"));
1103     seqLimits.setState(Cache.getDefault("SHOW_JVSUFFIX", true));
1104     seqLimits.addActionListener(new ActionListener()
1105     {
1106       @Override
1107       public void actionPerformed(ActionEvent e)
1108       {
1109         seqLimit_actionPerformed(e);
1110       }
1111     });
1112     JMenuItem epsFile = new JMenuItem("EPS");
1113     epsFile.addActionListener(new ActionListener()
1114     {
1115       @Override
1116       public void actionPerformed(ActionEvent e)
1117       {
1118         createEPS(null);
1119       }
1120     });
1121
1122     JMenuItem createSVG = new JMenuItem("SVG");
1123     createSVG.addActionListener(new ActionListener()
1124     {
1125       @Override
1126       public void actionPerformed(ActionEvent e)
1127       {
1128         createSVG(null);
1129       }
1130     });
1131
1132     JMenuItem loadTreeMenuItem = new JMenuItem(
1133             MessageManager.getString("label.load_associated_tree"));
1134     loadTreeMenuItem.setActionCommand(
1135             MessageManager.getString("label.load_tree_for_sequence_set"));
1136     loadTreeMenuItem.addActionListener(new ActionListener()
1137     {
1138       @Override
1139       public void actionPerformed(ActionEvent e)
1140       {
1141         loadTreeMenuItem_actionPerformed(e);
1142       }
1143     });
1144
1145     scaleAbove.setVisible(false);
1146     scaleAbove.setText(MessageManager.getString("action.scale_above"));
1147     scaleAbove.addActionListener(new ActionListener()
1148     {
1149       @Override
1150       public void actionPerformed(ActionEvent e)
1151       {
1152         scaleAbove_actionPerformed(e);
1153       }
1154     });
1155     scaleLeft.setVisible(false);
1156     scaleLeft.setSelected(true);
1157     scaleLeft.setText(MessageManager.getString("action.scale_left"));
1158     scaleLeft.addActionListener(new ActionListener()
1159     {
1160       @Override
1161       public void actionPerformed(ActionEvent e)
1162       {
1163         scaleLeft_actionPerformed(e);
1164       }
1165     });
1166     scaleRight.setVisible(false);
1167     scaleRight.setSelected(true);
1168     scaleRight.setText(MessageManager.getString("action.scale_right"));
1169     scaleRight.addActionListener(new ActionListener()
1170     {
1171       @Override
1172       public void actionPerformed(ActionEvent e)
1173       {
1174         scaleRight_actionPerformed(e);
1175       }
1176     });
1177     centreColumnLabelsMenuItem.setVisible(true);
1178     centreColumnLabelsMenuItem.setState(false);
1179     centreColumnLabelsMenuItem.setText(
1180             MessageManager.getString("label.centre_column_labels"));
1181     centreColumnLabelsMenuItem.addActionListener(new ActionListener()
1182     {
1183       @Override
1184       public void actionPerformed(ActionEvent e)
1185       {
1186         centreColumnLabels_actionPerformed(e);
1187       }
1188     });
1189     followHighlightMenuItem.setVisible(true);
1190     followHighlightMenuItem.setState(true);
1191     followHighlightMenuItem
1192             .setText(MessageManager.getString("label.automatic_scrolling"));
1193     followHighlightMenuItem.addActionListener(new ActionListener()
1194     {
1195
1196       @Override
1197       public void actionPerformed(ActionEvent e)
1198       {
1199         followHighlight_actionPerformed();
1200       }
1201
1202     });
1203
1204     sortByTreeMenu
1205             .setText(MessageManager.getString("action.by_tree_order"));
1206     sort.setText(MessageManager.getString("action.sort"));
1207     sort.addMenuListener(new MenuListener()
1208     {
1209       @Override
1210       public void menuSelected(MenuEvent e)
1211       {
1212         buildTreeSortMenu();
1213       }
1214
1215       @Override
1216       public void menuDeselected(MenuEvent e)
1217       {
1218       }
1219
1220       @Override
1221       public void menuCanceled(MenuEvent e)
1222       {
1223       }
1224     });
1225     sortByAnnotScore
1226             .setText(MessageManager.getString("label.sort_by_score"));
1227     sort.add(sortByAnnotScore);
1228     sort.addMenuListener(new javax.swing.event.MenuListener()
1229     {
1230
1231       @Override
1232       public void menuCanceled(MenuEvent e)
1233       {
1234       }
1235
1236       @Override
1237       public void menuDeselected(MenuEvent e)
1238       {
1239       }
1240
1241       @Override
1242       public void menuSelected(MenuEvent e)
1243       {
1244         buildSortByAnnotationScoresMenu();
1245       }
1246     });
1247     sortByAnnotScore.setVisible(false);
1248
1249     calculateTree
1250             .setText(MessageManager.getString("action.calculate_tree_pca"));
1251
1252     padGapsMenuitem.setText(MessageManager.getString("label.pad_gaps"));
1253     padGapsMenuitem.setState(Cache.getDefault("PAD_GAPS", false));
1254     padGapsMenuitem.addActionListener(new ActionListener()
1255     {
1256       @Override
1257       public void actionPerformed(ActionEvent e)
1258       {
1259         padGapsMenuitem_actionPerformed(e);
1260       }
1261     });
1262     JMenuItem vamsasStore = new JMenuItem(
1263             MessageManager.getString("label.vamsas_store"));
1264     vamsasStore.setVisible(false);
1265     vamsasStore.addActionListener(new ActionListener()
1266     {
1267       @Override
1268       public void actionPerformed(ActionEvent e)
1269       {
1270         vamsasStore_actionPerformed(e);
1271       }
1272     });
1273
1274     /*
1275      * Translate as cDNA with sub-menu of translation tables
1276      */
1277     showTranslation
1278             .setText(MessageManager.getString("label.translate_cDNA"));
1279     boolean first = true;
1280     for (final GeneticCodeI table : GeneticCodes.getInstance()
1281             .getCodeTables())
1282     {
1283       JMenuItem item = new JMenuItem(table.getId() + " " + table.getName());
1284       showTranslation.add(item);
1285       item.addActionListener(new ActionListener()
1286       {
1287         @Override
1288         public void actionPerformed(ActionEvent e)
1289         {
1290           showTranslation_actionPerformed(table);
1291         }
1292       });
1293       if (first)
1294       {
1295         showTranslation.addSeparator();
1296       }
1297       first = false;
1298     }
1299
1300     showReverse.setText(MessageManager.getString("label.reverse"));
1301     showReverse.addActionListener(new ActionListener()
1302     {
1303       @Override
1304       public void actionPerformed(ActionEvent e)
1305       {
1306         showReverse_actionPerformed(false);
1307       }
1308     });
1309     showReverseComplement
1310             .setText(MessageManager.getString("label.reverse_complement"));
1311     showReverseComplement.addActionListener(new ActionListener()
1312     {
1313       @Override
1314       public void actionPerformed(ActionEvent e)
1315       {
1316         showReverse_actionPerformed(true);
1317       }
1318     });
1319
1320     JMenuItem extractScores = new JMenuItem(
1321             MessageManager.getString("label.extract_scores"));
1322     extractScores.addActionListener(new ActionListener()
1323     {
1324       @Override
1325       public void actionPerformed(ActionEvent e)
1326       {
1327         extractScores_actionPerformed(e);
1328       }
1329     });
1330     extractScores.setVisible(true);
1331     // JBPNote: TODO: make gui for regex based score extraction
1332
1333     // for show products actions see AlignFrame.canShowProducts
1334     showProducts.setText(MessageManager.getString("label.get_cross_refs"));
1335
1336     runGroovy.setText(MessageManager.getString("label.run_groovy"));
1337     runGroovy.setToolTipText(
1338             MessageManager.getString("label.run_groovy_tip"));
1339     runGroovy.addActionListener(new ActionListener()
1340     {
1341       @Override
1342       public void actionPerformed(ActionEvent e)
1343       {
1344         runGroovy_actionPerformed();
1345       }
1346     });
1347
1348     openFeatureSettings = new JMenuItem(
1349             MessageManager.getString("action.feature_settings"));
1350     openFeatureSettings.addActionListener(new ActionListener()
1351     {
1352       @Override
1353       public void actionPerformed(ActionEvent e)
1354       {
1355         featureSettings_actionPerformed(e);
1356       }
1357     });
1358
1359     /*
1360      * add sub-menu of database we can fetch from
1361      */
1362     JMenuItem fetchSequence = new JMenuItem(
1363             MessageManager.getString("label.fetch_sequences"));
1364     fetchSequence.addActionListener(new ActionListener()
1365     {
1366       @Override
1367       public void actionPerformed(ActionEvent e)
1368       {
1369         fetchSequence_actionPerformed();
1370       }
1371     });
1372
1373     JMenuItem associatedData = new JMenuItem(
1374             MessageManager.getString("label.load_features_annotations"));
1375     associatedData.addActionListener(new ActionListener()
1376     {
1377       @Override
1378       public void actionPerformed(ActionEvent e)
1379       {
1380         associatedData_actionPerformed(e);
1381       }
1382     });
1383     loadVcf = new JMenuItem(
1384             MessageManager.getString("label.load_vcf_file"));
1385     loadVcf.setToolTipText(MessageManager.getString("label.load_vcf"));
1386     loadVcf.addActionListener(new ActionListener()
1387     {
1388       @Override
1389       public void actionPerformed(ActionEvent e)
1390       {
1391         loadVcf_actionPerformed();
1392       }
1393     });
1394     autoCalculate.setText(
1395             MessageManager.getString("label.autocalculate_consensus"));
1396     autoCalculate.setState(Cache.getDefault("AUTO_CALC_CONSENSUS", true));
1397     autoCalculate.addActionListener(new ActionListener()
1398     {
1399       @Override
1400       public void actionPerformed(ActionEvent e)
1401       {
1402         autoCalculate_actionPerformed(e);
1403       }
1404     });
1405     sortByTree.setText(
1406             MessageManager.getString("label.sort_alignment_new_tree"));
1407     sortByTree.setToolTipText("<html>" + MessageManager.getString(
1408             "label.enable_automatically_sort_alignment_when_open_new_tree"));
1409     sortByTree.setState(Cache.getDefault("SORT_BY_TREE", false));
1410     sortByTree.addActionListener(new ActionListener()
1411     {
1412       @Override
1413       public void actionPerformed(ActionEvent e)
1414       {
1415         sortByTreeOption_actionPerformed(e);
1416       }
1417     });
1418
1419     listenToViewSelections.setText(
1420             MessageManager.getString("label.listen_for_selections"));
1421     listenToViewSelections
1422             .setToolTipText("<html>" + MessageManager.getString(
1423                     "label.selections_mirror_selections_made_same_sequences_other_views"));
1424     listenToViewSelections.setState(false);
1425     listenToViewSelections.addActionListener(new ActionListener()
1426     {
1427       @Override
1428       public void actionPerformed(ActionEvent e)
1429       {
1430         listenToViewSelections_actionPerformed(e);
1431       }
1432     });
1433
1434     JMenu addSequenceMenu = new JMenu(
1435             MessageManager.getString("label.add_sequences"));
1436     JMenuItem addFromFile = new JMenuItem(
1437             MessageManager.getString("label.from_file"));
1438     addFromFile.addActionListener(new ActionListener()
1439     {
1440       @Override
1441       public void actionPerformed(ActionEvent e)
1442       {
1443         addFromFile_actionPerformed(e);
1444       }
1445     });
1446     JMenuItem addFromText = new JMenuItem(
1447             MessageManager.getString("label.from_textbox"));
1448     addFromText.addActionListener(new ActionListener()
1449     {
1450       @Override
1451       public void actionPerformed(ActionEvent e)
1452       {
1453         addFromText_actionPerformed(e);
1454       }
1455     });
1456     JMenuItem addFromURL = new JMenuItem(
1457             MessageManager.getString("label.from_url"));
1458     addFromURL.addActionListener(new ActionListener()
1459     {
1460       @Override
1461       public void actionPerformed(ActionEvent e)
1462       {
1463         addFromURL_actionPerformed(e);
1464       }
1465     });
1466     JMenuItem exportFeatures = new JMenuItem(
1467             MessageManager.getString("label.export_features"));
1468     exportFeatures.addActionListener(new ActionListener()
1469     {
1470       @Override
1471       public void actionPerformed(ActionEvent e)
1472       {
1473         exportFeatures_actionPerformed(e);
1474       }
1475     });
1476     JMenuItem exportAnnotations = new JMenuItem(
1477             MessageManager.getString("label.export_annotations"));
1478     exportAnnotations.addActionListener(new ActionListener()
1479     {
1480       @Override
1481       public void actionPerformed(ActionEvent e)
1482       {
1483         exportAnnotations_actionPerformed(e);
1484       }
1485     });
1486     statusPanel.setLayout(new GridLayout());
1487     JMenuItem showAllSeqs = new JMenuItem(
1488             MessageManager.getString("label.all_sequences"));
1489     showAllSeqs.setToolTipText(
1490             MessageManager.getString("label.toggle_sequence_visibility"));
1491     showAllSeqs.addActionListener(new ActionListener()
1492     {
1493       @Override
1494       public void actionPerformed(ActionEvent e)
1495       {
1496         showAllSeqs_actionPerformed(e);
1497       }
1498     });
1499     JMenuItem showAllColumns = new JMenuItem(
1500             MessageManager.getString("label.all_columns"));
1501     showAllColumns.setToolTipText(
1502             MessageManager.getString("label.toggle_columns_visibility"));
1503     showAllColumns.addActionListener(new ActionListener()
1504     {
1505       @Override
1506       public void actionPerformed(ActionEvent e)
1507       {
1508         showAllColumns_actionPerformed(e);
1509       }
1510     });
1511     JMenu hideMenu = new JMenu(MessageManager.getString("action.hide"));
1512     JMenuItem hideSelSequences = new JMenuItem(
1513             MessageManager.getString("label.selected_sequences"));
1514     hideSelSequences.setToolTipText(
1515             MessageManager.getString("label.toggle_sequence_visibility"));
1516     hideSelSequences.addActionListener(new ActionListener()
1517     {
1518       @Override
1519       public void actionPerformed(ActionEvent e)
1520       {
1521         hideSelSequences_actionPerformed(e);
1522       }
1523     });
1524     JMenuItem hideSelColumns = new JMenuItem(
1525             MessageManager.getString("label.selected_columns"));
1526     hideSelColumns.setToolTipText(
1527             MessageManager.getString("label.toggle_columns_visibility"));
1528     hideSelColumns.addActionListener(new ActionListener()
1529     {
1530       @Override
1531       public void actionPerformed(ActionEvent e)
1532       {
1533         hideSelColumns_actionPerformed(e);
1534       }
1535     });
1536     JMenuItem hideAllSelection = new JMenuItem(
1537             MessageManager.getString("label.selected_region"));
1538     hideAllSelection.addActionListener(new ActionListener()
1539     {
1540       @Override
1541       public void actionPerformed(ActionEvent e)
1542       {
1543         hideAllSelection_actionPerformed(e);
1544       }
1545     });
1546     // TODO: should be hidden if no selection exists.
1547     JMenuItem hideAllButSelection = new JMenuItem(
1548             MessageManager.getString("label.all_but_selected_region"));
1549     hideAllButSelection.addActionListener(new ActionListener()
1550     {
1551       @Override
1552       public void actionPerformed(ActionEvent e)
1553       {
1554         hideAllButSelection_actionPerformed(e);
1555       }
1556     });
1557     JMenuItem showAllhidden = new JMenuItem(
1558             MessageManager.getString("label.all_sequences_columns"));
1559     showAllhidden.setToolTipText(MessageManager
1560             .getString("label.toggles_visibility_hidden_selected_regions"));
1561     showAllhidden.addActionListener(new ActionListener()
1562     {
1563       @Override
1564       public void actionPerformed(ActionEvent e)
1565       {
1566         showAllhidden_actionPerformed(e);
1567       }
1568     });
1569     hiddenMarkers.setText(
1570             MessageManager.getString("action.show_hidden_markers"));
1571     hiddenMarkers.addActionListener(new ActionListener()
1572     {
1573       @Override
1574       public void actionPerformed(ActionEvent e)
1575       {
1576         hiddenMarkers_actionPerformed(e);
1577       }
1578     });
1579
1580     JMenuItem invertColSel = new JMenuItem(
1581             MessageManager.getString("action.invert_column_selection"));
1582     keyStroke = KeyStroke.getKeyStroke(KeyEvent.VK_I,
1583             jalview.util.ShortcutKeyMaskExWrapper.getMenuShortcutKeyMaskEx()
1584                     | jalview.util.ShortcutKeyMaskExWrapper.ALT_DOWN_MASK,
1585             false);
1586     al = new ActionListener()
1587     {
1588       @Override
1589       public void actionPerformed(ActionEvent e)
1590       {
1591         invertColSel_actionPerformed(e);
1592       }
1593     };
1594     addMenuActionAndAccelerator(keyStroke, invertColSel, al);
1595
1596     showComplementMenuItem.setVisible(false);
1597     showComplementMenuItem.addActionListener(new ActionListener()
1598     {
1599       @Override
1600       public void actionPerformed(ActionEvent e)
1601       {
1602         showComplement_actionPerformed(showComplementMenuItem.getState());
1603       }
1604     });
1605
1606     tabbedPane.addChangeListener(new javax.swing.event.ChangeListener()
1607     {
1608       @Override
1609       public void stateChanged(ChangeEvent evt)
1610       {
1611         JTabbedPane pane = (JTabbedPane) evt.getSource();
1612         int sel = pane.getSelectedIndex();
1613         tabSelectionChanged(sel);
1614       }
1615     });
1616     tabbedPane.addMouseListener(new MouseAdapter()
1617     {
1618       @Override
1619       public void mousePressed(MouseEvent e)
1620       {
1621         if (e.isPopupTrigger()) // Mac
1622         {
1623           tabbedPane_mousePressed(e);
1624         }
1625       }
1626
1627       @Override
1628       public void mouseReleased(MouseEvent e)
1629       {
1630         if (e.isPopupTrigger()) // Windows
1631         {
1632           tabbedPane_mousePressed(e);
1633         }
1634       }
1635     });
1636     tabbedPane.addFocusListener(new FocusAdapter()
1637     {
1638       @Override
1639       public void focusGained(FocusEvent e)
1640       {
1641         tabbedPane_focusGained(e);
1642       }
1643     });
1644
1645     JMenuItem save = new JMenuItem(MessageManager.getString("action.save"));
1646     keyStroke = KeyStroke.getKeyStroke(KeyEvent.VK_S,
1647             jalview.util.ShortcutKeyMaskExWrapper
1648                     .getMenuShortcutKeyMaskEx(),
1649             false);
1650     al = new ActionListener()
1651     {
1652       @Override
1653       public void actionPerformed(ActionEvent e)
1654       {
1655         save_actionPerformed(e);
1656       }
1657     };
1658     addMenuActionAndAccelerator(keyStroke, save, al);
1659
1660     reload.setEnabled(false);
1661     reload.setText(MessageManager.getString("action.reload"));
1662     reload.addActionListener(new ActionListener()
1663     {
1664       @Override
1665       public void actionPerformed(ActionEvent e)
1666       {
1667         reload_actionPerformed(e);
1668       }
1669     });
1670
1671     JMenuItem newView = new JMenuItem(
1672             MessageManager.getString("action.new_view"));
1673     keyStroke = KeyStroke.getKeyStroke(KeyEvent.VK_T,
1674             jalview.util.ShortcutKeyMaskExWrapper
1675                     .getMenuShortcutKeyMaskEx(),
1676             false);
1677     al = new ActionListener()
1678     {
1679       @Override
1680       public void actionPerformed(ActionEvent e)
1681       {
1682         newView_actionPerformed(e);
1683       }
1684     };
1685     addMenuActionAndAccelerator(keyStroke, newView, al);
1686
1687     tabbedPane.setToolTipText("<html><i>"
1688             + MessageManager.getString("label.rename_tab_eXpand_reGroup")
1689             + "</i></html>");
1690
1691     formatMenu.setText(MessageManager.getString("action.format"));
1692     JMenu selectMenu = new JMenu(MessageManager.getString("action.select"));
1693
1694     idRightAlign.setText(
1695             MessageManager.getString("label.right_align_sequence_id"));
1696     idRightAlign.addActionListener(new ActionListener()
1697     {
1698       @Override
1699       public void actionPerformed(ActionEvent e)
1700       {
1701         idRightAlign_actionPerformed(e);
1702       }
1703     });
1704
1705     gatherViews.setEnabled(false);
1706     gatherViews.setText(MessageManager.getString("action.gather_views"));
1707     keyStroke = KeyStroke.getKeyStroke(KeyEvent.VK_G, 0, false);
1708     al = new ActionListener()
1709     {
1710       @Override
1711       public void actionPerformed(ActionEvent e)
1712       {
1713         gatherViews_actionPerformed(e);
1714       }
1715     };
1716     addMenuActionAndAccelerator(keyStroke, gatherViews, al);
1717
1718     expandViews.setEnabled(false);
1719     expandViews.setText(MessageManager.getString("action.expand_views"));
1720     keyStroke = KeyStroke.getKeyStroke(KeyEvent.VK_X, 0, false);
1721     al = new ActionListener()
1722     {
1723       @Override
1724       public void actionPerformed(ActionEvent e)
1725       {
1726         expandViews_actionPerformed(e);
1727       }
1728     };
1729     addMenuActionAndAccelerator(keyStroke, expandViews, al);
1730
1731     JMenuItem pageSetup = new JMenuItem(
1732             MessageManager.getString("action.page_setup"));
1733     pageSetup.addActionListener(new ActionListener()
1734     {
1735       @Override
1736       public void actionPerformed(ActionEvent e)
1737       {
1738         pageSetup_actionPerformed(e);
1739       }
1740     });
1741     JMenuItem alignmentProperties = new JMenuItem(
1742             MessageManager.getString("label.alignment_props"));
1743     alignmentProperties.addActionListener(new ActionListener()
1744     {
1745       @Override
1746       public void actionPerformed(ActionEvent actionEvent)
1747       {
1748         alignmentProperties();
1749       }
1750     });
1751     JMenuItem selectHighlighted = new JMenuItem(
1752             MessageManager.getString("action.select_highlighted_columns"));
1753     selectHighlighted.setToolTipText(
1754             MessageManager.getString("tooltip.select_highlighted_columns"));
1755     al = new ActionListener()
1756     {
1757       @Override
1758       public void actionPerformed(ActionEvent actionEvent)
1759       {
1760         selectHighlightedColumns_actionPerformed(actionEvent);
1761       }
1762     };
1763     selectHighlighted.addActionListener(al);
1764     JMenu tooltipSettingsMenu = new JMenu(
1765             MessageManager.getString("label.sequence_id_tooltip"));
1766     JMenu autoAnnMenu = new JMenu(
1767             MessageManager.getString("label.autocalculated_annotation"));
1768
1769     JMenu exportImageMenu = new JMenu(
1770             MessageManager.getString("label.export_image"));
1771     JMenu fileMenu = new JMenu(MessageManager.getString("action.file"));
1772     alignFrameMenuBar.add(fileMenu);
1773     alignFrameMenuBar.add(editMenu);
1774     alignFrameMenuBar.add(selectMenu);
1775     alignFrameMenuBar.add(viewMenu);
1776     alignFrameMenuBar.add(annotationsMenu);
1777     alignFrameMenuBar.add(formatMenu);
1778     alignFrameMenuBar.add(colourMenu);
1779     alignFrameMenuBar.add(calculateMenu);
1780     if (!Platform.isJS())
1781     {
1782       alignFrameMenuBar.add(webService);
1783     }
1784
1785     fileMenu.add(fetchSequence);
1786     fileMenu.add(addSequenceMenu);
1787     fileMenu.add(reload);
1788     fileMenu.addSeparator();
1789     fileMenu.add(vamsasStore);
1790     fileMenu.add(save);
1791     fileMenu.add(saveAs);
1792     fileMenu.add(outputTextboxMenu);
1793     fileMenu.add(pageSetup);
1794     fileMenu.add(printMenuItem);
1795     fileMenu.addSeparator();
1796     fileMenu.add(exportImageMenu);
1797     fileMenu.add(exportFeatures);
1798     fileMenu.add(exportAnnotations);
1799     fileMenu.add(loadTreeMenuItem);
1800     fileMenu.add(associatedData);
1801     if (!Platform.isJS())
1802     {
1803       fileMenu.add(loadVcf);
1804     }
1805     fileMenu.addSeparator();
1806     fileMenu.add(closeMenuItem);
1807
1808     pasteMenu.add(pasteNew);
1809     pasteMenu.add(pasteThis);
1810     editMenu.add(undoMenuItem);
1811     editMenu.add(redoMenuItem);
1812     editMenu.add(cut);
1813     editMenu.add(copy);
1814     editMenu.add(pasteMenu);
1815     editMenu.add(delete);
1816     editMenu.addSeparator();
1817     editMenu.add(remove2LeftMenuItem);
1818     editMenu.add(remove2RightMenuItem);
1819     editMenu.add(removeGappedColumnMenuItem);
1820     editMenu.add(removeAllGapsMenuItem);
1821     editMenu.add(removeRedundancyMenuItem);
1822     editMenu.addSeparator();
1823
1824     editMenu.add(justifyLeftMenuItem);
1825     editMenu.add(justifyRightMenuItem);
1826
1827     editMenu.addSeparator();
1828     editMenu.add(padGapsMenuitem);
1829
1830     showMenu.add(showAllColumns);
1831     showMenu.add(showAllSeqs);
1832     showMenu.add(showAllhidden);
1833     hideMenu.add(hideSelColumns);
1834     hideMenu.add(hideSelSequences);
1835     hideMenu.add(hideAllSelection);
1836     hideMenu.add(hideAllButSelection);
1837     viewMenu.add(newView);
1838     viewMenu.add(expandViews);
1839     viewMenu.add(gatherViews);
1840     viewMenu.addSeparator();
1841     viewMenu.add(showMenu);
1842     viewMenu.add(hideMenu);
1843     viewMenu.add(showComplementMenuItem);
1844     viewMenu.addSeparator();
1845     viewMenu.add(followHighlightMenuItem);
1846     viewMenu.addSeparator();
1847     viewMenu.add(showSeqFeatures);
1848     // viewMenu.add(showSeqFeaturesHeight);
1849     viewMenu.add(openFeatureSettings);
1850     tooltipSettingsMenu.add(showDbRefsMenuitem);
1851     tooltipSettingsMenu.add(showNpFeatsMenuitem);
1852     viewMenu.add(tooltipSettingsMenu);
1853     viewMenu.addSeparator();
1854     viewMenu.add(alignmentProperties);
1855     viewMenu.addSeparator();
1856     viewMenu.add(overviewMenuItem);
1857
1858     annotationsMenu.add(annotationPanelMenuItem);
1859     annotationsMenu.addSeparator();
1860     annotationsMenu.add(showAllAlAnnotations);
1861     annotationsMenu.add(hideAllAlAnnotations);
1862     annotationsMenu.addSeparator();
1863     annotationsMenu.add(showAllSeqAnnotations);
1864     annotationsMenu.add(hideAllSeqAnnotations);
1865     annotationsMenu.add(sortAnnBySequence);
1866     annotationsMenu.add(sortAnnByLabel);
1867     annotationsMenu.addSeparator();
1868     autoAnnMenu.add(showAutoFirst);
1869     autoAnnMenu.add(showAutoLast);
1870     autoAnnMenu.addSeparator();
1871     autoAnnMenu.add(applyAutoAnnotationSettings);
1872     autoAnnMenu.add(showConsensusHistogram);
1873     autoAnnMenu.add(showSequenceLogo);
1874     autoAnnMenu.add(normaliseSequenceLogo);
1875     autoAnnMenu.addSeparator();
1876     autoAnnMenu.add(showGroupConservation);
1877     autoAnnMenu.add(showGroupConsensus);
1878     annotationsMenu.add(autoAnnMenu);
1879
1880     sort.add(sortIDMenuItem);
1881     sort.add(sortLengthMenuItem);
1882     sort.add(sortGroupMenuItem);
1883     sort.add(sortPairwiseMenuItem);
1884     sort.add(sortByTreeMenu);
1885     calculateMenu.add(sort);
1886     calculateMenu.add(calculateTree);
1887     calculateMenu.addSeparator();
1888     calculateMenu.add(pairwiseAlignmentMenuItem);
1889     calculateMenu.addSeparator();
1890     calculateMenu.add(showTranslation);
1891     calculateMenu.add(showReverse);
1892     calculateMenu.add(showReverseComplement);
1893     calculateMenu.add(showProducts);
1894     calculateMenu.add(autoCalculate);
1895     calculateMenu.add(sortByTree);
1896     calculateMenu.addSeparator();
1897     calculateMenu.add(expandAlignment);
1898     calculateMenu.add(extractScores);
1899     if (!Platform.isJS())
1900     {
1901       calculateMenu.addSeparator();
1902       calculateMenu.add(runGroovy);
1903     }
1904
1905     webServiceNoServices = new JMenuItem(
1906             MessageManager.getString("label.no_services"));
1907     webService.add(webServiceNoServices);
1908     if (!Platform.isJS())
1909     {
1910       exportImageMenu.add(htmlMenuItem);
1911     }
1912     exportImageMenu.add(epsFile);
1913     exportImageMenu.add(createPNG);
1914     if (!Platform.isJS())
1915     {
1916       exportImageMenu.add(createBioJS);
1917       exportImageMenu.add(createSVG);
1918     }
1919     addSequenceMenu.add(addFromFile);
1920     addSequenceMenu.add(addFromText);
1921     addSequenceMenu.add(addFromURL);
1922     this.getContentPane().add(statusPanel, java.awt.BorderLayout.SOUTH);
1923     statusPanel.add(statusBar, null);
1924     this.getContentPane().add(tabbedPane, java.awt.BorderLayout.CENTER);
1925
1926     formatMenu.add(font);
1927     formatMenu.addSeparator();
1928     formatMenu.add(wrapMenuItem);
1929     formatMenu.add(scaleAbove);
1930     formatMenu.add(scaleLeft);
1931     formatMenu.add(scaleRight);
1932     formatMenu.add(seqLimits);
1933     formatMenu.add(idRightAlign);
1934     formatMenu.add(hiddenMarkers);
1935     formatMenu.add(viewBoxesMenuItem);
1936     formatMenu.add(viewTextMenuItem);
1937     formatMenu.add(colourTextMenuItem);
1938     formatMenu.add(renderGapsMenuItem);
1939     formatMenu.add(centreColumnLabelsMenuItem);
1940     formatMenu.add(showNonconservedMenuItem);
1941     selectMenu.add(findMenuItem);
1942     selectMenu.addSeparator();
1943     selectMenu.add(selectAllSequenceMenuItem);
1944     selectMenu.add(deselectAllSequenceMenuItem);
1945     selectMenu.add(invertSequenceMenuItem);
1946     selectMenu.add(invertColSel);
1947     selectMenu.add(createGroup);
1948     selectMenu.add(unGroup);
1949     selectMenu.add(grpsFromSelection);
1950     selectMenu.add(deleteGroups);
1951     selectMenu.add(annotationColumn);
1952     selectMenu.add(selectHighlighted);
1953     // TODO - determine if the listenToViewSelections button is needed : see bug
1954     // JAL-574
1955     // selectMenu.addSeparator();
1956     // selectMenu.add(listenToViewSelections);
1957   }
1958
1959   protected void loadVcf_actionPerformed()
1960   {
1961   }
1962
1963   /**
1964    * Constructs the entries on the Colour menu (but does not add them to the
1965    * menu).
1966    */
1967   protected void initColourMenu()
1968   {
1969     applyToAllGroups = new JCheckBoxMenuItem(
1970             MessageManager.getString("label.apply_colour_to_all_groups"));
1971     applyToAllGroups.addActionListener(new ActionListener()
1972     {
1973       @Override
1974       public void actionPerformed(ActionEvent e)
1975       {
1976         applyToAllGroups_actionPerformed(applyToAllGroups.isSelected());
1977       }
1978     });
1979
1980     textColour = new JMenuItem(
1981             MessageManager.getString("label.text_colour"));
1982     textColour.addActionListener(new ActionListener()
1983     {
1984       @Override
1985       public void actionPerformed(ActionEvent e)
1986       {
1987         textColour_actionPerformed();
1988       }
1989     });
1990
1991     conservationMenuItem = new JCheckBoxMenuItem(
1992             MessageManager.getString("action.by_conservation"));
1993     conservationMenuItem.addActionListener(new ActionListener()
1994     {
1995       @Override
1996       public void actionPerformed(ActionEvent e)
1997       {
1998         conservationMenuItem_actionPerformed(
1999                 conservationMenuItem.isSelected());
2000       }
2001     });
2002
2003     abovePIDThreshold = new JCheckBoxMenuItem(
2004             MessageManager.getString("label.above_identity_threshold"));
2005     abovePIDThreshold.addActionListener(new ActionListener()
2006     {
2007       @Override
2008       public void actionPerformed(ActionEvent e)
2009       {
2010         abovePIDThreshold_actionPerformed(abovePIDThreshold.isSelected());
2011       }
2012     });
2013     modifyPID = new JMenuItem(
2014             MessageManager.getString("label.modify_identity_threshold"));
2015     modifyPID.addActionListener(new ActionListener()
2016     {
2017       @Override
2018       public void actionPerformed(ActionEvent e)
2019       {
2020         modifyPID_actionPerformed();
2021       }
2022     });
2023     modifyConservation = new JMenuItem(MessageManager
2024             .getString("label.modify_conservation_threshold"));
2025     modifyConservation.addActionListener(new ActionListener()
2026     {
2027       @Override
2028       public void actionPerformed(ActionEvent e)
2029       {
2030         modifyConservation_actionPerformed();
2031       }
2032     });
2033
2034     annotationColour = new JRadioButtonMenuItem(
2035             MessageManager.getString("action.by_annotation"));
2036     annotationColour.setName(ResidueColourScheme.ANNOTATION_COLOUR);
2037     annotationColour.addActionListener(new ActionListener()
2038     {
2039       @Override
2040       public void actionPerformed(ActionEvent e)
2041       {
2042         annotationColour_actionPerformed();
2043       }
2044     });
2045   }
2046
2047   protected void selectHighlightedColumns_actionPerformed(
2048           ActionEvent actionEvent)
2049   {
2050     // TODO Auto-generated method stub
2051
2052   }
2053
2054   /**
2055    * Generate the reverse sequence (or reverse complement if the flag is true)
2056    * and add it to the alignment
2057    * 
2058    * @param complement
2059    */
2060   protected void showReverse_actionPerformed(boolean complement)
2061   {
2062   }
2063
2064   /**
2065    * Try to run script in a Groovy console, having first ensured that this
2066    * alignframe is set as currentAlignFrame in Desktop
2067    */
2068   protected void runGroovy_actionPerformed()
2069   {
2070
2071   }
2072
2073   /**
2074    * Adds the given action listener and key accelerator to the given menu item.
2075    * Also saves in a lookup table to support lookup of action by key stroke.
2076    * 
2077    * @param keyStroke
2078    * @param menuItem
2079    * @param actionListener
2080    */
2081   protected void addMenuActionAndAccelerator(KeyStroke keyStroke,
2082           JMenuItem menuItem, ActionListener actionListener)
2083   {
2084     menuItem.setAccelerator(keyStroke);
2085     accelerators.put(keyStroke, menuItem);
2086     menuItem.addActionListener(actionListener);
2087   }
2088
2089   /**
2090    * Action on clicking sort annotations by type.
2091    * 
2092    * @param sortOrder
2093    */
2094   protected void sortAnnotations_actionPerformed()
2095   {
2096   }
2097
2098   /**
2099    * Action on clicking Show all annotations.
2100    * 
2101    * @param forSequences
2102    *          update sequence-related annotations
2103    * @param forAlignment
2104    *          update non-sequence-related annotations
2105    */
2106   protected void showAllAnnotations_actionPerformed(boolean forSequences,
2107           boolean forAlignment)
2108   {
2109     setAnnotationsVisibility(true, forSequences, forAlignment);
2110   }
2111
2112   /**
2113    * Action on clicking Hide all annotations.
2114    * 
2115    * @param forSequences
2116    *          update sequence-related annotations
2117    * @param forAlignment
2118    *          update non-sequence-related annotations
2119    */
2120   protected void hideAllAnnotations_actionPerformed(boolean forSequences,
2121           boolean forAlignment)
2122   {
2123     setAnnotationsVisibility(false, forSequences, forAlignment);
2124   }
2125
2126   /**
2127    * Set the visibility of annotations to true or false. Can act on
2128    * sequence-related annotations, or alignment-related, or both.
2129    * 
2130    * @param visible
2131    * @param forSequences
2132    *          update sequence-related annotations
2133    * @param forAlignment
2134    *          update non-sequence-related annotations
2135    */
2136   protected void setAnnotationsVisibility(boolean visible,
2137           boolean forSequences, boolean forAlignment)
2138   {
2139
2140   }
2141
2142   protected void normaliseSequenceLogo_actionPerformed(ActionEvent e)
2143   {
2144     // TODO Auto-generated method stub
2145
2146   }
2147
2148   protected void listenToViewSelections_actionPerformed(ActionEvent e)
2149   {
2150     // TODO Auto-generated method stub
2151
2152   }
2153
2154   protected void showAllhidden_actionPerformed(ActionEvent e)
2155   {
2156     // TODO Auto-generated method stub
2157
2158   }
2159
2160   protected void hideAllButSelection_actionPerformed(ActionEvent e)
2161   {
2162     // TODO Auto-generated method stub
2163
2164   }
2165
2166   protected void hideAllSelection_actionPerformed(ActionEvent e)
2167   {
2168     // TODO Auto-generated method stub
2169
2170   }
2171
2172   protected void applyAutoAnnotationSettings_actionPerformed(ActionEvent e)
2173   {
2174     // TODO Auto-generated method stub
2175
2176   }
2177
2178   protected void showConsensusHistogram_actionPerformed(ActionEvent e)
2179   {
2180     // TODO Auto-generated method stub
2181
2182   }
2183
2184   protected void showSequenceLogo_actionPerformed(ActionEvent e)
2185   {
2186     // TODO Auto-generated method stub
2187
2188   }
2189
2190   protected void makeGrpsFromSelection_actionPerformed(ActionEvent e)
2191   {
2192     // TODO Auto-generated method stub
2193
2194   }
2195
2196   protected void showGroupConsensus_actionPerformed(ActionEvent e)
2197   {
2198     // TODO Auto-generated method stub
2199
2200   }
2201
2202   protected void showGroupConservation_actionPerformed(ActionEvent e)
2203   {
2204     // TODO Auto-generated method stub
2205
2206   }
2207
2208   protected void showUnconservedMenuItem_actionPerformed(ActionEvent e)
2209   {
2210     // TODO Auto-generated method stub
2211
2212   }
2213
2214   protected void justifyRightMenuItem_actionPerformed(ActionEvent e)
2215   {
2216     // TODO Auto-generated method stub
2217
2218   }
2219
2220   protected void justifyLeftMenuItem_actionPerformed(ActionEvent e)
2221   {
2222     // TODO Auto-generated method stub
2223
2224   }
2225
2226   protected void followHighlight_actionPerformed()
2227   {
2228     // TODO Auto-generated method stub
2229
2230   }
2231
2232   protected void showNpFeats_actionPerformed(ActionEvent e)
2233   {
2234     // TODO Auto-generated method stub
2235
2236   }
2237
2238   protected void showDbRefs_actionPerformed(ActionEvent e)
2239   {
2240     // TODO Auto-generated method stub
2241
2242   }
2243
2244   protected void centreColumnLabels_actionPerformed(ActionEvent e)
2245   {
2246   }
2247
2248   protected void buildSortByAnnotationScoresMenu()
2249   {
2250   }
2251
2252   protected void extractScores_actionPerformed(ActionEvent e)
2253   {
2254   }
2255
2256   protected void outputText_actionPerformed(String formatName)
2257   {
2258   }
2259
2260   public void addFromFile_actionPerformed(ActionEvent e)
2261   {
2262
2263   }
2264
2265   public void addFromText_actionPerformed(ActionEvent e)
2266   {
2267
2268   }
2269
2270   public void addFromURL_actionPerformed(ActionEvent e)
2271   {
2272
2273   }
2274
2275   public void exportFeatures_actionPerformed(ActionEvent e)
2276   {
2277
2278   }
2279
2280   public void exportAnnotations_actionPerformed(ActionEvent e)
2281   {
2282
2283   }
2284
2285   protected void htmlMenuItem_actionPerformed(ActionEvent e)
2286   {
2287   }
2288
2289   protected void bioJSMenuItem_actionPerformed(ActionEvent e)
2290   {
2291
2292   }
2293
2294   protected void closeMenuItem_actionPerformed(boolean b)
2295   {
2296   }
2297
2298   protected void redoMenuItem_actionPerformed(ActionEvent e)
2299   {
2300   }
2301
2302   protected void undoMenuItem_actionPerformed(ActionEvent e)
2303   {
2304   }
2305
2306   protected void selectAllSequenceMenuItem_actionPerformed(ActionEvent e)
2307   {
2308   }
2309
2310   protected void deselectAllSequenceMenuItem_actionPerformed(ActionEvent e)
2311   {
2312   }
2313
2314   protected void invertSequenceMenuItem_actionPerformed(ActionEvent e)
2315   {
2316   }
2317
2318   protected void remove2LeftMenuItem_actionPerformed(ActionEvent e)
2319   {
2320   }
2321
2322   protected void remove2RightMenuItem_actionPerformed(ActionEvent e)
2323   {
2324   }
2325
2326   protected void removeGappedColumnMenuItem_actionPerformed(ActionEvent e)
2327   {
2328   }
2329
2330   protected void removeAllGapsMenuItem_actionPerformed(ActionEvent e)
2331   {
2332   }
2333
2334   protected void wrapMenuItem_actionPerformed(ActionEvent e)
2335   {
2336   }
2337
2338   protected void viewBoxesMenuItem_actionPerformed(ActionEvent e)
2339   {
2340   }
2341
2342   protected void viewTextMenuItem_actionPerformed(ActionEvent e)
2343   {
2344   }
2345
2346   protected void colourTextMenuItem_actionPerformed(ActionEvent e)
2347   {
2348   }
2349
2350   protected void annotationPanelMenuItem_actionPerformed(ActionEvent e)
2351   {
2352   }
2353
2354   protected void overviewMenuItem_actionPerformed(ActionEvent e)
2355   {
2356   }
2357
2358   protected void sortPairwiseMenuItem_actionPerformed(ActionEvent e)
2359   {
2360   }
2361
2362   protected void sortIDMenuItem_actionPerformed(ActionEvent e)
2363   {
2364   }
2365
2366   protected void sortLengthMenuItem_actionPerformed(ActionEvent e)
2367   {
2368   }
2369
2370   protected void sortGroupMenuItem_actionPerformed(ActionEvent e)
2371   {
2372   }
2373
2374   protected void removeRedundancyMenuItem_actionPerformed(ActionEvent e)
2375   {
2376   }
2377
2378   protected void pairwiseAlignmentMenuItem_actionPerformed(ActionEvent e)
2379   {
2380   }
2381
2382   protected void neighbourTreeMenuItem_actionPerformed(ActionEvent e)
2383   {
2384   }
2385
2386   protected void conservationMenuItem_actionPerformed(boolean selected)
2387   {
2388   }
2389
2390   protected void printMenuItem_actionPerformed(ActionEvent e)
2391   {
2392   }
2393
2394   protected void renderGapsMenuItem_actionPerformed(ActionEvent e)
2395   {
2396   }
2397
2398   protected void findMenuItem_actionPerformed(ActionEvent e)
2399   {
2400   }
2401
2402   protected void abovePIDThreshold_actionPerformed(boolean selected)
2403   {
2404   }
2405
2406   public void showSeqFeatures_actionPerformed(ActionEvent actionEvent)
2407   {
2408   }
2409
2410   protected void deleteGroups_actionPerformed(ActionEvent e)
2411   {
2412   }
2413
2414   protected void createGroup_actionPerformed(ActionEvent e)
2415   {
2416   }
2417
2418   protected void unGroup_actionPerformed(ActionEvent e)
2419   {
2420   }
2421
2422   protected void copy_actionPerformed()
2423   {
2424   }
2425
2426   protected void cut_actionPerformed()
2427   {
2428   }
2429
2430   protected void delete_actionPerformed()
2431   {
2432   }
2433
2434   protected void pasteNew_actionPerformed(ActionEvent e)
2435   {
2436   }
2437
2438   protected void pasteThis_actionPerformed(ActionEvent e)
2439   {
2440   }
2441
2442   protected void applyToAllGroups_actionPerformed(boolean selected)
2443   {
2444   }
2445
2446   public void createPNG(java.io.File f)
2447   {
2448   }
2449
2450   protected void font_actionPerformed(ActionEvent e)
2451   {
2452   }
2453
2454   protected void seqLimit_actionPerformed(ActionEvent e)
2455   {
2456   }
2457
2458   public void seqDBRef_actionPerformed(ActionEvent e)
2459   {
2460
2461   }
2462
2463   public void createEPS(java.io.File f)
2464   {
2465   }
2466
2467   public void createSVG(java.io.File f)
2468   {
2469
2470   }
2471
2472   protected void loadTreeMenuItem_actionPerformed(ActionEvent e)
2473   {
2474
2475   }
2476
2477   /**
2478    * Template method to handle the 'load T-Coffee scores' menu event.
2479    * <p>
2480    * Subclasses override this method to provide a custom action.
2481    * 
2482    * @param event
2483    *          The raised event
2484    */
2485   protected void loadScores_actionPerformed(ActionEvent event)
2486   {
2487
2488   }
2489
2490   protected void jpred_actionPerformed(ActionEvent e)
2491   {
2492   }
2493
2494   protected void scaleAbove_actionPerformed(ActionEvent e)
2495   {
2496   }
2497
2498   protected void scaleLeft_actionPerformed(ActionEvent e)
2499   {
2500   }
2501
2502   protected void scaleRight_actionPerformed(ActionEvent e)
2503   {
2504   }
2505
2506   protected void modifyPID_actionPerformed()
2507   {
2508   }
2509
2510   protected void modifyConservation_actionPerformed()
2511   {
2512   }
2513
2514   protected void saveAs_actionPerformed()
2515   {
2516   }
2517
2518   protected void padGapsMenuitem_actionPerformed(ActionEvent e)
2519   {
2520   }
2521
2522   public void vamsasStore_actionPerformed(ActionEvent e)
2523   {
2524
2525   }
2526
2527   public void vamsasLoad_actionPerformed(ActionEvent e)
2528   {
2529
2530   }
2531
2532   public void showTranslation_actionPerformed(GeneticCodeI codeTable)
2533   {
2534
2535   }
2536
2537   public void featureSettings_actionPerformed(ActionEvent e)
2538   {
2539
2540   }
2541
2542   public void fetchSequence_actionPerformed()
2543   {
2544
2545   }
2546
2547   public void smoothFont_actionPerformed(ActionEvent e)
2548   {
2549
2550   }
2551
2552   public void annotationColour_actionPerformed()
2553   {
2554   }
2555
2556   public void annotationColumn_actionPerformed(ActionEvent e)
2557   {
2558   }
2559
2560   public void associatedData_actionPerformed(ActionEvent e)
2561   {
2562
2563   }
2564
2565   public void autoCalculate_actionPerformed(ActionEvent e)
2566   {
2567
2568   }
2569
2570   public void sortByTreeOption_actionPerformed(ActionEvent e)
2571   {
2572
2573   }
2574
2575   public void showAllSeqs_actionPerformed(ActionEvent e)
2576   {
2577
2578   }
2579
2580   public void showAllColumns_actionPerformed(ActionEvent e)
2581   {
2582
2583   }
2584
2585   public void hideSelSequences_actionPerformed(ActionEvent e)
2586   {
2587
2588   }
2589
2590   public void hideSelColumns_actionPerformed(ActionEvent e)
2591   {
2592
2593   }
2594
2595   public void hiddenMarkers_actionPerformed(ActionEvent e)
2596   {
2597
2598   }
2599
2600   public void findPdbId_actionPerformed(ActionEvent e)
2601   {
2602
2603   }
2604
2605   public void enterPdbId_actionPerformed(ActionEvent e)
2606   {
2607
2608   }
2609
2610   public void pdbFile_actionPerformed(ActionEvent e)
2611   {
2612
2613   }
2614
2615   public void invertColSel_actionPerformed(ActionEvent e)
2616   {
2617
2618   }
2619
2620   public void tabSelectionChanged(int sel)
2621   {
2622
2623   }
2624
2625   public void tabbedPane_mousePressed(MouseEvent e)
2626   {
2627
2628   }
2629
2630   public void tabbedPane_focusGained(FocusEvent e)
2631   {
2632     requestFocus();
2633   }
2634
2635   public void save_actionPerformed(ActionEvent e)
2636   {
2637
2638   }
2639
2640   public void reload_actionPerformed(ActionEvent e)
2641   {
2642
2643   }
2644
2645   public void newView_actionPerformed(ActionEvent e)
2646   {
2647
2648   }
2649
2650   public void textColour_actionPerformed()
2651   {
2652
2653   }
2654
2655   public void idRightAlign_actionPerformed(ActionEvent e)
2656   {
2657
2658   }
2659
2660   public void expandViews_actionPerformed(ActionEvent e)
2661   {
2662
2663   }
2664
2665   public void gatherViews_actionPerformed(ActionEvent e)
2666   {
2667
2668   }
2669
2670   public void buildTreeSortMenu()
2671   {
2672
2673   }
2674
2675   public void pageSetup_actionPerformed(ActionEvent e)
2676   {
2677
2678   }
2679
2680   public void alignmentProperties()
2681   {
2682
2683   }
2684
2685   protected void expand_newalign(ActionEvent e)
2686   {
2687     // TODO Auto-generated method stub
2688
2689   }
2690
2691   protected boolean isShowAutoCalculatedAbove()
2692   {
2693     return showAutoCalculatedAbove;
2694   }
2695
2696   protected void setShowAutoCalculatedAbove(boolean showAutoCalculatedAbove)
2697   {
2698     this.showAutoCalculatedAbove = showAutoCalculatedAbove;
2699   }
2700
2701   protected SequenceAnnotationOrder getAnnotationSortOrder()
2702   {
2703     return annotationSortOrder;
2704   }
2705
2706   protected void setAnnotationSortOrder(
2707           SequenceAnnotationOrder annotationSortOrder)
2708   {
2709     this.annotationSortOrder = annotationSortOrder;
2710   }
2711
2712   public Map<KeyStroke, JMenuItem> getAccelerators()
2713   {
2714     return this.accelerators;
2715   }
2716
2717   /**
2718    * Returns the selected index of the tabbed pane, or -1 if none selected
2719    * (including the case where the tabbed pane has not been made visible).
2720    * 
2721    * @return
2722    */
2723   public int getTabIndex()
2724   {
2725     return tabbedPane.getSelectedIndex();
2726   }
2727
2728   public JPanel getStatusPanel()
2729   {
2730     return statusPanel;
2731   }
2732
2733   /**
2734    * Sets a reference to the containing split frame. Also makes the 'toggle
2735    * split view' menu item visible and checked.
2736    * 
2737    * @param sf
2738    */
2739   public void setSplitFrame(SplitContainerI sf)
2740   {
2741     this.splitFrame = sf;
2742     if (sf != null)
2743     {
2744       this.showComplementMenuItem.setVisible(true);
2745       this.showComplementMenuItem.setState(true);
2746     }
2747   }
2748
2749   public SplitContainerI getSplitViewContainer()
2750   {
2751     return this.splitFrame;
2752   }
2753
2754   protected void showComplement_actionPerformed(boolean complement)
2755   {
2756   }
2757 }