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