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