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