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