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