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