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