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