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