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