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