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