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