2 * Jalview - A Sequence Alignment Editor and Viewer ($$Version-Rel$$)
\r
3 * Copyright (C) $$Year-Rel$$ The Jalview Authors
\r
5 * This file is part of Jalview.
\r
7 * Jalview is free software: you can redistribute it and/or
\r
8 * modify it under the terms of the GNU General Public License
\r
9 * as published by the Free Software Foundation, either version 3
\r
10 * of the License, or (at your option) any later version.
\r
12 * Jalview is distributed in the hope that it will be useful, but
\r
13 * WITHOUT ANY WARRANTY; without even the implied warranty
\r
14 * of MERCHANTABILITY or FITNESS FOR A PARTICULAR
\r
15 * PURPOSE. See the GNU General Public License for more details.
\r
17 * You should have received a copy of the GNU General Public License
\r
18 * along with Jalview. If not, see <http://www.gnu.org/licenses/>.
\r
19 * The Jalview Authors are detailed in the 'AUTHORS' file.
\r
21 package jalview.appletgui;
\r
23 import jalview.analysis.AlignmentSorter;
\r
24 import jalview.analysis.AnnotationSorter.SequenceAnnotationOrder;
\r
25 import jalview.api.AlignViewControllerGuiI;
\r
26 import jalview.api.AlignViewControllerI;
\r
27 import jalview.api.AlignViewportI;
\r
28 import jalview.api.FeatureRenderer;
\r
29 import jalview.api.FeatureSettingsControllerI;
\r
30 import jalview.api.SequenceStructureBinding;
\r
31 import jalview.bin.JalviewLite;
\r
32 import jalview.commands.CommandI;
\r
33 import jalview.commands.EditCommand;
\r
34 import jalview.commands.EditCommand.Action;
\r
35 import jalview.commands.OrderCommand;
\r
36 import jalview.commands.RemoveGapColCommand;
\r
37 import jalview.commands.RemoveGapsCommand;
\r
38 import jalview.commands.SlideSequencesCommand;
\r
39 import jalview.commands.TrimRegionCommand;
\r
40 import jalview.controller.AlignViewController;
\r
41 import jalview.datamodel.Alignment;
\r
42 import jalview.datamodel.AlignmentAnnotation;
\r
43 import jalview.datamodel.AlignmentI;
\r
44 import jalview.datamodel.AlignmentOrder;
\r
45 import jalview.datamodel.ColumnSelection;
\r
46 import jalview.datamodel.PDBEntry;
\r
47 import jalview.datamodel.Sequence;
\r
48 import jalview.datamodel.SequenceGroup;
\r
49 import jalview.datamodel.SequenceI;
\r
51 import jalview.io.AlignFile;
\r
52 import jalview.io.AlignmentProperties;
\r
53 import jalview.io.AnnotationFile;
\r
54 import jalview.io.AppletFormatAdapter;
\r
55 import jalview.io.FeaturesFile;
\r
56 import jalview.io.NewickFile;
\r
57 import jalview.jsdev.GenericFileAdapter;
\r
58 import jalview.schemes.Blosum62ColourScheme;
\r
59 import jalview.schemes.BuriedColourScheme;
\r
60 import jalview.schemes.ClustalxColourScheme;
\r
61 import jalview.schemes.ColourSchemeI;
\r
62 import jalview.schemes.HelixColourScheme;
\r
63 import jalview.schemes.HydrophobicColourScheme;
\r
64 import jalview.schemes.NucleotideColourScheme;
\r
65 import jalview.schemes.PIDColourScheme;
\r
66 import jalview.schemes.PurinePyrimidineColourScheme;
\r
67 import jalview.schemes.RNAHelicesColourChooser;
\r
68 import jalview.schemes.RNAInteractionColourScheme;
\r
69 import jalview.schemes.StrandColourScheme;
\r
70 import jalview.schemes.TCoffeeColourScheme;
\r
71 import jalview.schemes.TaylorColourScheme;
\r
72 import jalview.schemes.TurnColourScheme;
\r
73 import jalview.schemes.ZappoColourScheme;
\r
74 import jalview.structure.StructureSelectionManager;
\r
75 import jalview.structures.models.AAStructureBindingModel;
\r
76 import jalview.util.Comparison;
\r
77 import jalview.util.MappingUtils;
\r
78 import jalview.util.MessageManager;
\r
79 import jalview.viewmodel.AlignmentViewport;
\r
81 import java.awt.BorderLayout;
\r
82 import java.awt.Color;
\r
83 import java.awt.Font;
\r
84 import java.awt.FontMetrics;
\r
85 import java.awt.Graphics;
\r
86 import java.awt.event.ActionEvent;
\r
87 import java.awt.event.ActionListener;
\r
88 import java.awt.event.FocusEvent;
\r
89 import java.awt.event.FocusListener;
\r
90 import java.awt.event.ItemEvent;
\r
91 import java.awt.event.ItemListener;
\r
92 import java.awt.event.KeyEvent;
\r
93 import java.awt.event.KeyListener;
\r
94 import java.awt.event.WindowAdapter;
\r
95 import java.awt.event.WindowEvent;
\r
96 import java.io.IOException;
\r
97 import java.net.URL;
\r
98 import java.net.URLEncoder;
\r
99 import java.util.Arrays;
\r
100 import java.util.Deque;
\r
101 import java.util.HashMap;
\r
102 import java.util.Hashtable;
\r
103 import java.util.List;
\r
104 import java.util.Map;
\r
105 import java.util.StringTokenizer;
\r
106 import java.util.Vector;
\r
108 import javax.swing.JCheckBoxMenuItem;
\r
109 import javax.swing.JFrame;
\r
110 import javax.swing.JLabel;
\r
111 import javax.swing.JMenu;
\r
112 import javax.swing.JMenuBar;
\r
113 import javax.swing.JMenuItem;
\r
114 import javax.swing.JPanel;
\r
116 import org.jmol.viewer.Viewer;
\r
118 public class AlignFrame extends EmbmenuFrame implements ActionListener,
\r
119 ItemListener, KeyListener, AlignViewControllerGuiI
\r
121 public AlignViewControllerI avc;
\r
123 public AlignmentPanel alignPanel;
\r
125 public AlignViewport viewport;
\r
127 // width and height may be overridden by applet parameters
\r
128 int frameWidth = 700;
\r
130 int frameHeight = 500;
\r
132 String jalviewServletURL;
\r
135 * Flag for showing autocalculated consensus above or below other consensus
\r
138 private boolean showAutoCalculatedAbove;
\r
140 private SequenceAnnotationOrder annotationSortOrder;
\r
143 * Constructor that creates the frame and adds it to the display.
\r
150 public AlignFrame(AlignmentI al, JalviewLite applet,
\r
151 String title, boolean embedded)
\r
153 this(al, applet, title, embedded, true);
\r
157 * Constructor that optionally allows the frame to be displayed or only
\r
164 * @param addToDisplay
\r
166 public AlignFrame(AlignmentI al, JalviewLite applet,
\r
167 String title, boolean embedded, boolean addToDisplay)
\r
169 this(al, null, null, applet, title, embedded, addToDisplay);
\r
172 public AlignFrame(AlignmentI al, SequenceI[] hiddenSeqs,
\r
173 ColumnSelection columnSelection, JalviewLite applet,
\r
174 String title, boolean embedded)
\r
176 this(al, hiddenSeqs, columnSelection, applet, title, embedded, true);
\r
179 public AlignFrame(AlignmentI al, SequenceI[] hiddenSeqs,
\r
180 ColumnSelection columnSelection, JalviewLite applet,
\r
181 String title, boolean embedded, boolean addToDisplay)
\r
183 if (applet != null)
\r
185 jalviewServletURL = applet.getParameter("APPLICATION_URL");
\r
191 } catch (Exception ex)
\r
193 ex.printStackTrace();
\r
195 // need to get window geometry before we calculate alignment layout
\r
196 if (applet != null)
\r
201 param = applet.getParameter("windowWidth");
\r
204 int width = Integer.parseInt(param);
\r
205 frameWidth = width;
\r
207 param = applet.getParameter("windowHeight");
\r
210 int height = Integer.parseInt(param);
\r
211 frameHeight = height;
\r
213 } catch (Exception ex)
\r
217 viewport = new AlignViewport(al, applet);
\r
219 if (hiddenSeqs != null && hiddenSeqs.length > 0)
\r
221 viewport.hideSequence(hiddenSeqs);
\r
223 if (columnSelection != null)
\r
225 viewport.setColumnSelection(columnSelection);
\r
228 alignPanel = new AlignmentPanel(this, viewport);
\r
229 avc = new AlignViewController(this, viewport,
\r
231 viewport.updateConservation(alignPanel);
\r
232 viewport.updateConsensus(alignPanel);
\r
234 displayNonconservedMenuItem.setState(viewport.getShowUnconserved());
\r
235 followMouseOverFlag.setState(viewport.isFollowHighlight());
\r
236 showGroupConsensus.setState(viewport.isShowGroupConsensus());
\r
237 showGroupConservation.setState(viewport.isShowGroupConservation());
\r
238 showConsensusHistogram.setState(viewport.isShowConsensusHistogram());
\r
239 showSequenceLogo.setState(viewport.isShowSequenceLogo());
\r
240 normSequenceLogo.setState(viewport.isNormaliseSequenceLogo());
\r
241 applyToAllGroups.setState(viewport.getColourAppliesToAllGroups());
\r
242 annotationPanelMenuItem.setState(viewport.isShowAnnotation());
\r
243 showAlignmentAnnotations.setState(viewport.isShowAnnotation());
\r
244 showSequenceAnnotations.setState(viewport.isShowAnnotation());
\r
246 seqLimits.setState(viewport.getShowJVSuffix());
\r
248 if (applet != null)
\r
250 String param = applet.getParameter("sortBy");
\r
253 if (param.equalsIgnoreCase("Id"))
\r
255 sortIDMenuItem_actionPerformed();
\r
257 else if (param.equalsIgnoreCase("Pairwise Identity"))
\r
259 sortPairwiseMenuItem_actionPerformed();
\r
261 else if (param.equalsIgnoreCase("Length"))
\r
263 sortLengthMenuItem_actionPerformed();
\r
267 param = applet.getParameter("wrap");
\r
270 if (param.equalsIgnoreCase("true"))
\r
272 wrapMenuItem.setState(true);
\r
273 wrapMenuItem_actionPerformed();
\r
276 param = applet.getParameter("centrecolumnlabels");
\r
279 centreColumnLabelFlag.setState(true);
\r
280 centreColumnLabelFlag_stateChanged();
\r
284 if (viewport.getAlignment().isNucleotide())
\r
286 viewport.updateStrucConsensus(alignPanel);
\r
287 if (viewport.getAlignment().hasRNAStructure())
\r
289 RNAHelixColour.setEnabled(true);
\r
293 RNAHelixColour.setEnabled(false);
\r
298 RNAHelixColour.setEnabled(false);
\r
299 purinePyrimidineColour.setEnabled(false);
\r
301 // Some JVMS send keyevents to Top frame or lowest panel,
\r
302 // Havent worked out why yet. So add to both this frame and seqCanvas for
\r
304 this.addKeyListener(this);
\r
305 alignPanel.seqPanel.seqCanvas.addKeyListener(this);
\r
306 alignPanel.idPanel.idCanvas.addKeyListener(this);
\r
307 alignPanel.scalePanel.addKeyListener(this);
\r
308 alignPanel.annotationPanel.addKeyListener(this);
\r
309 alignPanel.annotationPanelHolder.addKeyListener(this);
\r
310 alignPanel.annotationSpaceFillerHolder.addKeyListener(this);
\r
311 alignPanel.alabels.addKeyListener(this);
\r
315 addToDisplay(embedded);
\r
322 public void addToDisplay(boolean embedded)
\r
324 createAlignFrameWindow(embedded);
\r
326 alignPanel.adjustAnnotationHeight();
\r
327 alignPanel.paintAlignment(true);
\r
330 public AlignViewport getAlignViewport()
\r
335 public SeqCanvas getSeqcanvas()
\r
337 return alignPanel.seqPanel.seqCanvas;
\r
341 * Load a features file onto the alignment
\r
344 * file URL, content, or other resolvable path
\r
346 * is protocol for accessing data referred to by file
\r
349 public boolean parseFeaturesFile(String file, String type)
\r
351 return parseFeaturesFile(file, type, true);
\r
355 * Load a features file onto the alignment
\r
358 * file URL, content, or other resolvable path
\r
360 * is protocol for accessing data referred to by file
\r
361 * @param autoenabledisplay
\r
362 * when true, display features flag will be automatically enabled if
\r
363 * features are loaded
\r
364 * @return true if data parsed as a features file
\r
366 public boolean parseFeaturesFile(String file, String type,
\r
367 boolean autoenabledisplay)
\r
369 // TODO: test if importing a features file onto an alignment which already
\r
370 // has features with links overwrites the original links.
\r
372 Hashtable featureLinks = new Hashtable();
\r
373 boolean featuresFile = false;
\r
376 featuresFile = new FeaturesFile(file, type)
\r
377 .parse(viewport.getAlignment(), alignPanel.seqPanel.seqCanvas
\r
378 .getFeatureRenderer().getFeatureColours(), featureLinks,
\r
379 true, viewport.applet.getDefaultParameter(
\r
380 "relaxedidmatch", false));
\r
381 } catch (Exception ex)
\r
383 ex.printStackTrace();
\r
388 if (featureLinks.size() > 0)
\r
390 alignPanel.seqPanel.seqCanvas.getFeatureRenderer().featureLinks = featureLinks;
\r
392 if (autoenabledisplay)
\r
394 viewport.setShowSequenceFeatures(true);
\r
395 sequenceFeatures.setState(true);
\r
397 if (alignPanel.seqPanel.seqCanvas.fr != null)
\r
399 // update the min/max ranges where necessary
\r
400 alignPanel.seqPanel.seqCanvas.fr.findAllFeatures(true);
\r
402 if (viewport.featureSettings != null)
\r
404 viewport.featureSettings.refreshTable();
\r
406 alignPanel.paintAlignment(true);
\r
407 statusBar.setText(MessageManager
\r
408 .getString("label.successfully_added_features_alignment"));
\r
410 return featuresFile;
\r
414 public void keyPressed(KeyEvent evt)
\r
416 if (viewport.cursorMode
\r
417 && ((evt.getKeyCode() >= KeyEvent.VK_0 && evt.getKeyCode() <= KeyEvent.VK_9) || (evt
\r
418 .getKeyCode() >= KeyEvent.VK_NUMPAD0 && evt
\r
419 .getKeyCode() <= KeyEvent.VK_NUMPAD9))
\r
420 && Character.isDigit(evt.getKeyChar()))
\r
422 alignPanel.seqPanel.numberPressed(evt.getKeyChar());
\r
425 switch (evt.getKeyCode())
\r
427 case 27: // escape key
\r
428 deselectAllSequenceMenuItem_actionPerformed();
\r
430 alignPanel.alabels.cancelDrag();
\r
432 case KeyEvent.VK_X:
\r
433 if (evt.isControlDown() || evt.isMetaDown())
\r
435 cut_actionPerformed();
\r
438 case KeyEvent.VK_C:
\r
439 if (viewport.cursorMode && !evt.isControlDown())
\r
441 alignPanel.seqPanel.setCursorColumn();
\r
443 if (evt.isControlDown() || evt.isMetaDown())
\r
445 copy_actionPerformed();
\r
448 case KeyEvent.VK_V:
\r
449 if (evt.isControlDown())
\r
451 paste(evt.isShiftDown());
\r
454 case KeyEvent.VK_A:
\r
455 if (evt.isControlDown() || evt.isMetaDown())
\r
457 selectAllSequenceMenuItem_actionPerformed();
\r
460 case KeyEvent.VK_DOWN:
\r
461 if (viewport.cursorMode)
\r
463 alignPanel.seqPanel.moveCursor(0, 1);
\r
467 moveSelectedSequences(false);
\r
471 case KeyEvent.VK_UP:
\r
472 if (viewport.cursorMode)
\r
474 alignPanel.seqPanel.moveCursor(0, -1);
\r
478 moveSelectedSequences(true);
\r
482 case KeyEvent.VK_LEFT:
\r
483 if (evt.isAltDown() || !viewport.cursorMode)
\r
485 slideSequences(false, alignPanel.seqPanel.getKeyboardNo1());
\r
489 alignPanel.seqPanel.moveCursor(-1, 0);
\r
493 case KeyEvent.VK_RIGHT:
\r
494 if (evt.isAltDown() || !viewport.cursorMode)
\r
496 slideSequences(true, alignPanel.seqPanel.getKeyboardNo1());
\r
500 alignPanel.seqPanel.moveCursor(1, 0);
\r
504 case KeyEvent.VK_SPACE:
\r
505 if (viewport.cursorMode)
\r
507 alignPanel.seqPanel.insertGapAtCursor(evt.isControlDown()
\r
508 || evt.isShiftDown() || evt.isAltDown());
\r
512 case KeyEvent.VK_DELETE:
\r
513 case KeyEvent.VK_BACK_SPACE:
\r
514 if (viewport.cursorMode)
\r
516 alignPanel.seqPanel.deleteGapAtCursor(evt.isControlDown()
\r
517 || evt.isShiftDown() || evt.isAltDown());
\r
521 cut_actionPerformed();
\r
522 alignPanel.seqPanel.seqCanvas.repaint();
\r
526 case KeyEvent.VK_S:
\r
527 if (viewport.cursorMode)
\r
529 alignPanel.seqPanel.setCursorRow();
\r
532 case KeyEvent.VK_P:
\r
533 if (viewport.cursorMode)
\r
535 alignPanel.seqPanel.setCursorPosition();
\r
539 case KeyEvent.VK_ENTER:
\r
540 case KeyEvent.VK_COMMA:
\r
541 if (viewport.cursorMode)
\r
543 alignPanel.seqPanel.setCursorRowAndColumn();
\r
547 case KeyEvent.VK_Q:
\r
548 if (viewport.cursorMode)
\r
550 alignPanel.seqPanel.setSelectionAreaAtCursor(true);
\r
553 case KeyEvent.VK_M:
\r
554 if (viewport.cursorMode)
\r
556 alignPanel.seqPanel.setSelectionAreaAtCursor(false);
\r
560 case KeyEvent.VK_F2:
\r
561 viewport.cursorMode = !viewport.cursorMode;
\r
562 statusBar.setText(MessageManager.formatMessage(
\r
563 "label.keyboard_editing_mode", new String[]
\r
564 { (viewport.cursorMode ? "on" : "off") }));
\r
565 if (viewport.cursorMode)
\r
567 alignPanel.seqPanel.seqCanvas.cursorX = viewport.startRes;
\r
568 alignPanel.seqPanel.seqCanvas.cursorY = viewport.startSeq;
\r
572 case KeyEvent.VK_F:
\r
573 if (evt.isControlDown())
\r
575 findMenuItem_actionPerformed();
\r
579 case KeyEvent.VK_H:
\r
581 boolean toggleSeqs = !evt.isControlDown();
\r
582 boolean toggleCols = !evt.isShiftDown();
\r
583 toggleHiddenRegions(toggleSeqs, toggleCols);
\r
587 case KeyEvent.VK_PAGE_UP:
\r
588 if (viewport.getWrapAlignment())
\r
590 alignPanel.scrollUp(true);
\r
594 alignPanel.setScrollValues(viewport.startRes, viewport.startSeq
\r
595 - viewport.endSeq + viewport.startSeq);
\r
599 case KeyEvent.VK_PAGE_DOWN:
\r
600 if (viewport.getWrapAlignment())
\r
602 alignPanel.scrollUp(false);
\r
606 alignPanel.setScrollValues(viewport.startRes, viewport.startSeq
\r
607 + viewport.endSeq - viewport.startSeq);
\r
611 case KeyEvent.VK_Z:
\r
612 if (evt.isControlDown())
\r
614 undoMenuItem_actionPerformed();
\r
618 case KeyEvent.VK_Y:
\r
619 if (evt.isControlDown())
\r
621 redoMenuItem_actionPerformed();
\r
625 case KeyEvent.VK_L:
\r
626 if (evt.isControlDown())
\r
628 trimAlignment(true);
\r
632 case KeyEvent.VK_R:
\r
633 if (evt.isControlDown())
\r
635 trimAlignment(false);
\r
639 case KeyEvent.VK_E:
\r
640 if (evt.isControlDown())
\r
642 if (evt.isShiftDown())
\r
644 this.removeAllGapsMenuItem_actionPerformed();
\r
648 removeGappedColumnMenuItem_actionPerformed();
\r
652 case KeyEvent.VK_I:
\r
653 if (evt.isControlDown())
\r
655 if (evt.isAltDown())
\r
657 invertColSel_actionPerformed();
\r
661 invertSequenceMenuItem_actionPerformed();
\r
666 case KeyEvent.VK_G:
\r
667 if (evt.isControlDown())
\r
669 if (evt.isShiftDown())
\r
671 this.unGroup_actionPerformed();
\r
675 this.createGroup_actionPerformed();
\r
680 case KeyEvent.VK_U:
\r
681 if (evt.isControlDown())
\r
683 this.deleteGroups_actionPerformed();
\r
687 case KeyEvent.VK_T:
\r
688 if (evt.isControlDown())
\r
695 alignPanel.paintAlignment(true);
\r
699 * called by key handler and the hide all/show all menu items
\r
701 * @param toggleSeqs
\r
702 * @param toggleCols
\r
704 private void toggleHiddenRegions(boolean toggleSeqs, boolean toggleCols)
\r
706 boolean hide = false;
\r
707 SequenceGroup sg = viewport.getSelectionGroup();
\r
708 if (!toggleSeqs && !toggleCols)
\r
710 // Hide everything by the current selection - this is a hack - we do the
\r
711 // invert and then hide
\r
712 // first check that there will be visible columns after the invert.
\r
713 if ((viewport.getColumnSelection() != null
\r
714 && viewport.getColumnSelection().getSelected() != null && viewport
\r
715 .getColumnSelection().getSelected().size() > 0)
\r
716 || (sg != null && sg.getSize() > 0 && sg.getStartRes() <= sg
\r
719 // now invert the sequence set, if required - empty selection implies
\r
720 // that no hiding is required.
\r
723 invertSequenceMenuItem_actionPerformed();
\r
724 sg = viewport.getSelectionGroup();
\r
728 viewport.expandColSelection(sg, true);
\r
729 // finally invert the column selection and get the new sequence
\r
730 // selection and indicate it should be hidden.
\r
731 invertColSel_actionPerformed();
\r
738 if (sg != null && sg.getSize() != viewport.getAlignment().getHeight())
\r
741 viewport.hideAllSelectedSeqs();
\r
743 else if (!(toggleCols && viewport.getColumnSelection().getSelected()
\r
746 viewport.showAllHiddenSeqs();
\r
752 if (viewport.getColumnSelection().getSelected().size() > 0)
\r
754 viewport.hideSelectedColumns();
\r
757 viewport.setSelectionGroup(sg);
\r
762 viewport.showAllHiddenColumns();
\r
768 public void keyReleased(KeyEvent evt)
\r
773 public void keyTyped(KeyEvent evt)
\r
778 public void itemStateChanged(ItemEvent evt)
\r
780 final Object source = evt.getSource();
\r
781 if (source == displayNonconservedMenuItem)
\r
783 displayNonconservedMenuItem_actionPerformed();
\r
785 else if (source == colourTextMenuItem)
\r
787 colourTextMenuItem_actionPerformed();
\r
789 else if (source == wrapMenuItem)
\r
791 wrapMenuItem_actionPerformed();
\r
793 else if (source == scaleAbove)
\r
795 viewport.setScaleAboveWrapped(scaleAbove.getState());
\r
797 else if (source == scaleLeft)
\r
799 viewport.setScaleLeftWrapped(scaleLeft.getState());
\r
801 else if (source == scaleRight)
\r
803 viewport.setScaleRightWrapped(scaleRight.getState());
\r
805 else if (source == seqLimits)
\r
807 seqLimits_itemStateChanged();
\r
809 else if (source == viewBoxesMenuItem)
\r
811 viewport.setShowBoxes(viewBoxesMenuItem.getState());
\r
813 else if (source == viewTextMenuItem)
\r
815 viewport.setShowText(viewTextMenuItem.getState());
\r
817 else if (source == renderGapsMenuItem)
\r
819 viewport.setRenderGaps(renderGapsMenuItem.getState());
\r
821 else if (source == annotationPanelMenuItem)
\r
823 viewport.setShowAnnotation(annotationPanelMenuItem.getState());
\r
824 alignPanel.setAnnotationVisible(annotationPanelMenuItem.getState());
\r
826 else if (source == sequenceFeatures)
\r
828 viewport.setShowSequenceFeatures(sequenceFeatures.getState());
\r
829 alignPanel.seqPanel.seqCanvas.repaint();
\r
831 else if (source == showAlignmentAnnotations)
\r
833 setAnnotationsVisibility();
\r
835 else if (source == showSequenceAnnotations)
\r
837 setAnnotationsVisibility();
\r
839 else if (source == sortAnnBySequence)
\r
841 boolean newState = sortAnnBySequence.getState();
\r
842 sortAnnByLabel.setState(false);
\r
843 setAnnotationSortOrder(newState ? SequenceAnnotationOrder.SEQUENCE_AND_LABEL
\r
844 : SequenceAnnotationOrder.NONE);
\r
845 setViewportAnnotationOrder();
\r
847 else if (source == sortAnnByLabel)
\r
849 boolean newState = sortAnnByLabel.getState();
\r
850 sortAnnBySequence.setState(false);
\r
851 setAnnotationSortOrder(newState ? SequenceAnnotationOrder.LABEL_AND_SEQUENCE
\r
852 : SequenceAnnotationOrder.NONE);
\r
853 setViewportAnnotationOrder();
\r
855 else if (source == showAutoFirst)
\r
857 showAutoLast.setState(!showAutoFirst.getState());
\r
858 setShowAutoCalculatedAbove(showAutoFirst.getState());
\r
859 setViewportAnnotationOrder();
\r
861 else if (source == showAutoLast)
\r
863 showAutoFirst.setState(!showAutoLast.getState());
\r
864 setShowAutoCalculatedAbove(showAutoFirst.getState());
\r
865 setViewportAnnotationOrder();
\r
867 else if (source == conservationMenuItem)
\r
869 conservationMenuItem_actionPerformed();
\r
871 else if (source == abovePIDThreshold)
\r
873 abovePIDThreshold_actionPerformed();
\r
875 else if (source == applyToAllGroups)
\r
877 viewport.setColourAppliesToAllGroups(applyToAllGroups.getState());
\r
879 else if (source == autoCalculate)
\r
881 viewport.autoCalculateConsensus = autoCalculate.getState();
\r
883 else if (source == sortByTree)
\r
885 viewport.sortByTree = sortByTree.getState();
\r
887 else if (source == this.centreColumnLabelFlag)
\r
889 centreColumnLabelFlag_stateChanged();
\r
891 else if (source == this.followMouseOverFlag)
\r
893 mouseOverFlag_stateChanged();
\r
895 else if (source == showGroupConsensus)
\r
897 showGroupConsensus_actionPerformed();
\r
899 else if (source == showGroupConservation)
\r
901 showGroupConservation_actionPerformed();
\r
903 else if (source == showSequenceLogo)
\r
905 showSequenceLogo_actionPerformed();
\r
907 else if (source == normSequenceLogo)
\r
909 normSequenceLogo_actionPerformed();
\r
911 else if (source == showConsensusHistogram)
\r
913 showConsensusHistogram_actionPerformed();
\r
915 else if (source == applyAutoAnnotationSettings)
\r
917 applyAutoAnnotationSettings_actionPerformed();
\r
919 alignPanel.paintAlignment(true);
\r
923 * Set the visibility state of sequence-related and/or alignment-related
\r
924 * annotations depending on checkbox selections. Repaint after calling.
\r
928 private void setAnnotationsVisibility()
\r
930 boolean showForAlignment = showAlignmentAnnotations.getState();
\r
931 boolean showForSequences = showSequenceAnnotations.getState();
\r
932 for (AlignmentAnnotation aa : alignPanel.getAlignment()
\r
933 .getAlignmentAnnotation())
\r
935 boolean visible = (aa.sequenceRef == null ? showForAlignment
\r
936 : showForSequences);
\r
937 aa.visible = visible;
\r
939 alignPanel.validateAnnotationDimensions(true);
\r
944 private void setAnnotationSortOrder(SequenceAnnotationOrder order)
\r
946 this.annotationSortOrder = order;
\r
950 * Set flags on the viewport that control annotation ordering
\r
952 private void setViewportAnnotationOrder()
\r
954 this.alignPanel.av.setSortAnnotationsBy(this.annotationSortOrder);
\r
956 .setShowAutocalculatedAbove(this.showAutoCalculatedAbove);
\r
959 private void setShowAutoCalculatedAbove(boolean showAbove)
\r
961 this.showAutoCalculatedAbove = showAbove;
\r
964 private void mouseOverFlag_stateChanged()
\r
966 viewport.setFollowHighlight(followMouseOverFlag.getState());
\r
967 // TODO: could kick the scrollTo mechanism to reset view for current
\r
971 private void centreColumnLabelFlag_stateChanged()
\r
973 viewport.centreColumnLabels = centreColumnLabelFlag.getState();
\r
974 this.alignPanel.annotationPanel.repaint();
\r
978 public void actionPerformed(ActionEvent evt)
\r
980 Object source = evt.getSource();
\r
982 if (source == inputText)
\r
984 inputText_actionPerformed();
\r
986 else if (source == loadTree)
\r
988 loadTree_actionPerformed();
\r
990 else if (source == loadApplication)
\r
992 launchFullApplication();
\r
994 else if (source == loadAnnotations)
\r
998 else if (source == outputAnnotations)
\r
1000 outputAnnotations(true);
\r
1002 else if (source == outputFeatures)
\r
1004 outputFeatures(true, "Jalview");
\r
1006 else if (source == closeMenuItem)
\r
1008 closeMenuItem_actionPerformed();
\r
1010 else if (source == copy)
\r
1012 copy_actionPerformed();
\r
1014 else if (source == undoMenuItem)
\r
1016 undoMenuItem_actionPerformed();
\r
1018 else if (source == redoMenuItem)
\r
1020 redoMenuItem_actionPerformed();
\r
1022 else if (source == inputText)
\r
1024 inputText_actionPerformed();
\r
1026 else if (source == closeMenuItem)
\r
1028 closeMenuItem_actionPerformed();
\r
1030 else if (source == undoMenuItem)
\r
1032 undoMenuItem_actionPerformed();
\r
1034 else if (source == redoMenuItem)
\r
1036 redoMenuItem_actionPerformed();
\r
1038 else if (source == copy)
\r
1040 copy_actionPerformed();
\r
1042 else if (source == pasteNew)
\r
1044 pasteNew_actionPerformed();
\r
1046 else if (source == pasteThis)
\r
1048 pasteThis_actionPerformed();
\r
1050 else if (source == cut)
\r
1052 cut_actionPerformed();
\r
1054 else if (source == delete)
\r
1056 delete_actionPerformed();
\r
1058 else if (source == grpsFromSelection)
\r
1060 makeGrpsFromSelection_actionPerformed();
\r
1062 else if (source == deleteGroups)
\r
1064 deleteGroups_actionPerformed();
\r
1066 else if (source == selectAllSequenceMenuItem)
\r
1068 selectAllSequenceMenuItem_actionPerformed();
\r
1070 else if (source == deselectAllSequenceMenuItem)
\r
1072 deselectAllSequenceMenuItem_actionPerformed();
\r
1074 else if (source == invertSequenceMenuItem)
\r
1076 invertSequenceMenuItem_actionPerformed();
\r
1078 else if (source == invertColSel)
\r
1080 viewport.invertColumnSelection();
\r
1081 alignPanel.paintAlignment(true);
\r
1083 else if (source == remove2LeftMenuItem)
\r
1085 trimAlignment(true);
\r
1087 else if (source == remove2RightMenuItem)
\r
1089 trimAlignment(false);
\r
1091 else if (source == removeGappedColumnMenuItem)
\r
1093 removeGappedColumnMenuItem_actionPerformed();
\r
1095 else if (source == removeAllGapsMenuItem)
\r
1097 removeAllGapsMenuItem_actionPerformed();
\r
1099 else if (source == findMenuItem)
\r
1101 findMenuItem_actionPerformed();
\r
1103 else if (source == font)
\r
1105 new FontChooser(alignPanel);
\r
1107 else if (source == newView)
\r
1111 else if (source == showColumns)
\r
1113 viewport.showAllHiddenColumns();
\r
1114 alignPanel.paintAlignment(true);
\r
1116 else if (source == showSeqs)
\r
1118 viewport.showAllHiddenSeqs();
\r
1119 alignPanel.paintAlignment(true);
\r
1121 else if (source == hideColumns)
\r
1123 viewport.hideSelectedColumns();
\r
1124 alignPanel.paintAlignment(true);
\r
1126 else if (source == hideSequences
\r
1127 && viewport.getSelectionGroup() != null)
\r
1129 viewport.hideAllSelectedSeqs();
\r
1130 alignPanel.paintAlignment(true);
\r
1132 else if (source == hideAllButSelection)
\r
1134 toggleHiddenRegions(false, false);
\r
1135 alignPanel.paintAlignment(true);
\r
1137 else if (source == hideAllSelection)
\r
1139 SequenceGroup sg = viewport.getSelectionGroup();
\r
1140 viewport.expandColSelection(sg, false);
\r
1141 viewport.hideAllSelectedSeqs();
\r
1142 viewport.hideSelectedColumns();
\r
1143 alignPanel.paintAlignment(true);
\r
1145 else if (source == showAllHidden)
\r
1147 viewport.showAllHiddenColumns();
\r
1148 viewport.showAllHiddenSeqs();
\r
1149 alignPanel.paintAlignment(true);
\r
1151 else if (source == showGroupConsensus)
\r
1153 showGroupConsensus_actionPerformed();
\r
1155 else if (source == showGroupConservation)
\r
1157 showGroupConservation_actionPerformed();
\r
1159 else if (source == showSequenceLogo)
\r
1161 showSequenceLogo_actionPerformed();
\r
1163 else if (source == normSequenceLogo)
\r
1165 normSequenceLogo_actionPerformed();
\r
1167 else if (source == showConsensusHistogram)
\r
1169 showConsensusHistogram_actionPerformed();
\r
1171 else if (source == applyAutoAnnotationSettings)
\r
1173 applyAutoAnnotationSettings_actionPerformed();
\r
1175 else if (source == featureSettings)
\r
1177 new FeatureSettings(alignPanel);
\r
1179 else if (source == alProperties)
\r
1181 StringBuffer contents = new AlignmentProperties(
\r
1182 viewport.getAlignment()).formatAsString();
\r
1183 CutAndPasteTransfer cap = new CutAndPasteTransfer(false, this);
\r
1184 cap.setText(contents.toString());
\r
1185 JFrame frame = new JFrame();
\r
1187 JalviewLite.addFrame(frame, MessageManager.formatMessage(
\r
1188 "label.alignment_properties", new String[]
\r
1189 { getTitle() }), 400, 250);
\r
1191 else if (source == overviewMenuItem)
\r
1193 overviewMenuItem_actionPerformed();
\r
1195 else if (source == noColourmenuItem)
\r
1197 changeColour(null);
\r
1199 else if (source == clustalColour)
\r
1201 abovePIDThreshold.setState(false);
\r
1202 changeColour(new ClustalxColourScheme(viewport.getAlignment(), null));
\r
1204 else if (source == zappoColour)
\r
1206 changeColour(new ZappoColourScheme());
\r
1208 else if (source == taylorColour)
\r
1210 changeColour(new TaylorColourScheme());
\r
1212 else if (source == hydrophobicityColour)
\r
1214 changeColour(new HydrophobicColourScheme());
\r
1216 else if (source == helixColour)
\r
1218 changeColour(new HelixColourScheme());
\r
1220 else if (source == strandColour)
\r
1222 changeColour(new StrandColourScheme());
\r
1224 else if (source == turnColour)
\r
1226 changeColour(new TurnColourScheme());
\r
1228 else if (source == buriedColour)
\r
1230 changeColour(new BuriedColourScheme());
\r
1232 else if (source == nucleotideColour)
\r
1234 changeColour(new NucleotideColourScheme());
\r
1236 else if (source == purinePyrimidineColour)
\r
1238 changeColour(new PurinePyrimidineColourScheme());
\r
1240 else if (source == RNAInteractionColour)
\r
1242 changeColour(new RNAInteractionColourScheme());
\r
1244 else if (source == RNAHelixColour)
\r
1246 new RNAHelicesColourChooser(viewport, alignPanel);
\r
1248 else if (source == modifyPID)
\r
1250 modifyPID_actionPerformed();
\r
1252 else if (source == modifyConservation)
\r
1254 modifyConservation_actionPerformed();
\r
1256 else if (source == userDefinedColour)
\r
1258 new UserDefinedColours(alignPanel, null);
\r
1260 else if (source == PIDColour)
\r
1262 changeColour(new PIDColourScheme());
\r
1264 else if (source == BLOSUM62Colour)
\r
1266 changeColour(new Blosum62ColourScheme());
\r
1268 else if (source == tcoffeeColour)
\r
1270 changeColour(new TCoffeeColourScheme(alignPanel.getAlignment()));
\r
1272 else if (source == annotationColour)
\r
1274 new AnnotationColourChooser(viewport, alignPanel);
\r
1276 else if (source == annotationColumnSelection)
\r
1278 new AnnotationColumnChooser(viewport, alignPanel);
\r
1280 else if (source == sortPairwiseMenuItem)
\r
1282 sortPairwiseMenuItem_actionPerformed();
\r
1284 else if (source == sortIDMenuItem)
\r
1286 sortIDMenuItem_actionPerformed();
\r
1288 else if (source == sortLengthMenuItem)
\r
1290 sortLengthMenuItem_actionPerformed();
\r
1292 else if (source == sortGroupMenuItem)
\r
1294 sortGroupMenuItem_actionPerformed();
\r
1296 else if (source == removeRedundancyMenuItem)
\r
1298 removeRedundancyMenuItem_actionPerformed();
\r
1300 else if (source == pairwiseAlignmentMenuItem)
\r
1302 pairwiseAlignmentMenuItem_actionPerformed();
\r
1304 else if (source == PCAMenuItem)
\r
1306 PCAMenuItem_actionPerformed();
\r
1308 else if (source == averageDistanceTreeMenuItem)
\r
1310 averageDistanceTreeMenuItem_actionPerformed();
\r
1312 else if (source == neighbourTreeMenuItem)
\r
1314 neighbourTreeMenuItem_actionPerformed();
\r
1316 else if (source == njTreeBlosumMenuItem)
\r
1318 njTreeBlosumMenuItem_actionPerformed();
\r
1320 else if (source == avDistanceTreeBlosumMenuItem)
\r
1322 avTreeBlosumMenuItem_actionPerformed();
\r
1324 else if (source == documentation)
\r
1326 documentation_actionPerformed();
\r
1328 else if (source == about)
\r
1330 about_actionPerformed();
\r
1335 public void inputText_actionPerformed()
\r
1337 CutAndPasteTransfer cap = new CutAndPasteTransfer(true, this);
\r
1338 JFrame frame = new JFrame();
\r
1340 JalviewLite.addFrame(frame,
\r
1341 MessageManager.getString("label.input_cut_paste"), 500, 500);
\r
1344 protected void outputText_actionPerformed(ActionEvent e)
\r
1346 CutAndPasteTransfer cap = new CutAndPasteTransfer(true, this);
\r
1347 JFrame frame = new JFrame();
\r
1349 JalviewLite.addFrame(frame, MessageManager.formatMessage(
\r
1350 "label.alignment_output_command", new Object[]
\r
1351 { e.getActionCommand() }), 600, 500);
\r
1353 FeatureRenderer fr = this.alignPanel.cloneFeatureRenderer();
\r
1354 cap.setText(new AppletFormatAdapter(alignPanel).formatSequences(
\r
1355 e.getActionCommand(), viewport.getAlignment(),
\r
1356 viewport.getShowJVSuffix()));
\r
1359 public void loadAnnotations()
\r
1361 CutAndPasteTransfer cap = new CutAndPasteTransfer(true, this);
\r
1362 cap.setText(MessageManager
\r
1363 .getString("label.paste_features_annotations_Tcoffee_here"));
\r
1364 cap.setAnnotationImport();
\r
1365 JFrame frame = new JFrame();
\r
1367 JalviewLite.addFrame(frame,
\r
1368 MessageManager.getString("action.paste_annotations"), 400, 300);
\r
1372 public String outputAnnotations(boolean displayTextbox)
\r
1374 String annotation = new AnnotationFile()
\r
1375 .printAnnotationsForView(viewport);
\r
1377 if (displayTextbox)
\r
1379 CutAndPasteTransfer cap = new CutAndPasteTransfer(false, this);
\r
1380 JFrame frame = new JFrame();
\r
1382 JalviewLite.addFrame(frame,
\r
1383 MessageManager.getString("label.annotations"), 600, 500);
\r
1384 cap.setText(annotation);
\r
1387 return annotation;
\r
1390 private Map<String,Object> getDisplayedFeatureCols()
\r
1392 if (alignPanel.getFeatureRenderer() != null
\r
1393 && viewport.getFeaturesDisplayed()!= null)
\r
1395 return alignPanel.getFeatureRenderer().getDisplayedFeatureCols();
\r
1401 public String outputFeatures(boolean displayTextbox, String format)
\r
1404 if (format.equalsIgnoreCase("Jalview"))
\r
1406 features = new FeaturesFile().printJalviewFormat(viewport
\r
1407 .getAlignment().getSequencesArray(),
\r
1408 getDisplayedFeatureCols());
\r
1412 features = new FeaturesFile().printGFFFormat(viewport.getAlignment()
\r
1413 .getSequencesArray(), getDisplayedFeatureCols());
\r
1416 if (displayTextbox)
\r
1418 boolean frimport = false;
\r
1419 if (features == null || features.equals("No Features Visible"))
\r
1421 features = "# No features visible - paste some and import them here.";
\r
1425 CutAndPasteTransfer cap = new CutAndPasteTransfer(frimport, this);
\r
1428 cap.setAnnotationImport();
\r
1430 JFrame frame = new JFrame();
\r
1432 JalviewLite.addFrame(frame,
\r
1433 MessageManager.getString("label.features"), 600, 500);
\r
1434 cap.setText(features);
\r
1438 if (features == null)
\r
1447 void launchFullApplication()
\r
1449 StringBuffer url = new StringBuffer(jalviewServletURL);
\r
1451 // allow servlet parameters to be passed in applet parameter
\r
1452 String firstSep = url.lastIndexOf("?") > url.lastIndexOf("/") ? "&"
\r
1454 url.append(firstSep);
\r
1456 url.append("open="
\r
1457 + appendProtocol(viewport.applet.getParameter("file")));
\r
1459 if (viewport.applet.getParameter("features") != null)
\r
1461 url.append("&features=");
\r
1462 url.append(appendProtocol(viewport.applet.getParameter("features")));
\r
1465 if (viewport.applet.getParameter("annotations") != null)
\r
1467 url.append("&annotations=");
\r
1468 url.append(appendProtocol(viewport.applet.getParameter("annotations")));
\r
1471 if (viewport.applet.getParameter("jnetfile") != null)
\r
1473 url.append("&annotations=");
\r
1474 url.append(appendProtocol(viewport.applet.getParameter("jnetfile")));
\r
1477 if (viewport.applet.getParameter("defaultColour") != null)
\r
1479 url.append("&colour="
\r
1480 + removeWhiteSpace(viewport.applet
\r
1481 .getParameter("defaultColour")));
\r
1484 if (viewport.applet.getParameter("userDefinedColour") != null)
\r
1486 url.append("&colour="
\r
1487 + removeWhiteSpace(viewport.applet
\r
1488 .getParameter("userDefinedColour")));
\r
1490 if (viewport.applet.getParameter("tree") != null)
\r
1492 url.append("&tree="
\r
1493 + appendProtocol(viewport.applet.getParameter("tree")));
\r
1495 if (viewport.applet.getParameter("treeFile") != null)
\r
1497 url.append("&tree="
\r
1498 + appendProtocol(viewport.applet.getParameter("treeFile")));
\r
1501 showURL(url.toString(), "FULL_APP");
\r
1504 String removeWhiteSpace(String colour)
\r
1506 StringBuffer sb = new StringBuffer();
\r
1507 for (int i = 0; i < colour.length(); i++)
\r
1509 if (Character.isWhitespace(colour.charAt(i)))
\r
1515 sb.append(colour.charAt(i));
\r
1519 return sb.toString();
\r
1522 String appendProtocol(String url)
\r
1527 url = URLEncoder.encode(url);
\r
1530 * When we finally deprecate 1.1 compatibility, we can start to use
\r
1531 * URLEncoder.encode(url,"UTF-8") and then we'll need this catch: catch
\r
1532 * (UnsupportedEncodingException ex) { System.err.println("WARNING -
\r
1533 * IMPLEMENTATION ERROR - UNSUPPORTED ENCODING EXCEPTION FOR "+url);
\r
1534 * ex.printStackTrace(); }
\r
1536 catch (java.net.MalformedURLException ex)
\r
1538 url = viewport.applet.getCodeBase() + url;
\r
1543 public void closeMenuItem_actionPerformed()
\r
1545 PaintRefresher.RemoveComponent(alignPanel);
\r
1546 if (alignPanel.seqPanel != null
\r
1547 && alignPanel.seqPanel.seqCanvas != null)
\r
1549 PaintRefresher.RemoveComponent(alignPanel.seqPanel.seqCanvas);
\r
1551 if (alignPanel.idPanel != null && alignPanel.idPanel.idCanvas != null)
\r
1553 PaintRefresher.RemoveComponent(alignPanel.idPanel.idCanvas);
\r
1556 if (PaintRefresher.components.size() == 0 && viewport.applet == null)
\r
1564 alignPanel = null;
\r
1571 void updateEditMenuBar()
\r
1574 if (viewport.getHistoryList().size() > 0)
\r
1576 undoMenuItem.setEnabled(true);
\r
1577 CommandI command = viewport.getHistoryList().peek();
\r
1578 undoMenuItem.setLabel(MessageManager.formatMessage(
\r
1579 "label.undo_command", new Object[]
\r
1580 { command.getDescription() }));
\r
1584 undoMenuItem.setEnabled(false);
\r
1585 undoMenuItem.setLabel(MessageManager.getString("action.undo"));
\r
1588 if (viewport.getRedoList().size() > 0)
\r
1590 redoMenuItem.setEnabled(true);
\r
1592 CommandI command = viewport.getRedoList().peek();
\r
1593 redoMenuItem.setLabel(MessageManager.formatMessage(
\r
1594 "label.redo_command", new Object[]
\r
1595 { command.getDescription() }));
\r
1599 redoMenuItem.setEnabled(false);
\r
1600 redoMenuItem.setLabel(MessageManager.getString("action.redo"));
\r
1608 public void addHistoryItem(CommandI command)
\r
1610 if (command.getSize() > 0)
\r
1612 viewport.addToHistoryList(command);
\r
1613 viewport.clearRedoList();
\r
1614 updateEditMenuBar();
\r
1615 viewport.updateHiddenColumns();
\r
1620 * TODO: JAL-1104 DOCUMENT ME!
\r
1625 protected void undoMenuItem_actionPerformed()
\r
1627 if (viewport.getHistoryList().isEmpty())
\r
1632 CommandI command = viewport.getHistoryList().pop();
\r
1633 viewport.addToRedoList(command);
\r
1634 command.undoCommand(null);
\r
1636 AlignmentViewport originalSource = getOriginatingSource(command);
\r
1638 if (originalSource != viewport)
\r
1641 .println("Warning: Viewport object mismatch whilst undoing");
\r
1643 originalSource.updateHiddenColumns(); // originalSource.hasHiddenColumns =
\r
1644 // viewport.getColumnSelection().getHiddenColumns()
\r
1646 updateEditMenuBar();
\r
1647 originalSource.firePropertyChange("alignment", null, originalSource
\r
1648 .getAlignment().getSequences());
\r
1652 * TODO: JAL-1104 DOCUMENT ME!
\r
1657 protected void redoMenuItem_actionPerformed()
\r
1659 if (viewport.getRedoList().isEmpty())
\r
1664 CommandI command = viewport.getRedoList().pop();
\r
1665 viewport.addToHistoryList(command);
\r
1666 command.doCommand(null);
\r
1668 AlignmentViewport originalSource = getOriginatingSource(command);
\r
1670 if (originalSource != viewport)
\r
1673 .println("Warning: Viewport object mismatch whilst re-doing");
\r
1675 originalSource.updateHiddenColumns(); // sethasHiddenColumns(); =
\r
1676 // viewport.getColumnSelection().getHiddenColumns()
\r
1679 updateEditMenuBar();
\r
1680 originalSource.firePropertyChange("alignment", null, originalSource
\r
1681 .getAlignment().getSequences());
\r
1684 AlignmentViewport getOriginatingSource(CommandI command)
\r
1686 AlignmentViewport originalSource = null;
\r
1687 // For sequence removal and addition, we need to fire
\r
1688 // the property change event FROM the viewport where the
\r
1689 // original alignment was altered
\r
1690 AlignmentI al = null;
\r
1691 if (command instanceof EditCommand)
\r
1693 EditCommand editCommand = (EditCommand) command;
\r
1694 al = editCommand.getAlignment();
\r
1695 Vector comps = (Vector) PaintRefresher.components.get(viewport
\r
1696 .getSequenceSetId());
\r
1697 for (int i = 0; i < comps.size(); i++)
\r
1699 if (comps.elementAt(i) instanceof AlignmentPanel)
\r
1701 if (al == ((AlignmentPanel) comps.elementAt(i)).av.getAlignment())
\r
1703 originalSource = ((AlignmentPanel) comps.elementAt(i)).av;
\r
1710 if (originalSource == null)
\r
1712 // The original view is closed, we must validate
\r
1713 // the current view against the closed view first
\r
1716 PaintRefresher.validateSequences(al, viewport.getAlignment());
\r
1719 originalSource = viewport;
\r
1722 return originalSource;
\r
1726 * Move the currently selected sequences up or down one position in the
\r
1731 public void moveSelectedSequences(boolean up)
\r
1733 SequenceGroup sg = viewport.getSelectionGroup();
\r
1738 viewport.getAlignment().moveSelectedSequencesByOne(sg,
\r
1739 up ? null : viewport.getHiddenRepSequences(), up);
\r
1740 alignPanel.paintAlignment(true);
\r
1743 * Also move cDNA/protein complement sequences
\r
1745 AlignViewportI complement = viewport.getCodingComplement();
\r
1746 if (complement != null)
\r
1748 SequenceGroup mappedSelection = MappingUtils.mapSequenceGroup(sg,
\r
1749 viewport, complement);
\r
1750 complement.getAlignment().moveSelectedSequencesByOne(mappedSelection,
\r
1751 up ? null : complement.getHiddenRepSequences(), up);
\r
1752 // TODO need to trigger a repaint of the complementary panel - how?
\r
1753 // would prefer to handle in SplitFrame but it is not overriding key
\r
1758 synchronized void slideSequences(boolean right, int size)
\r
1760 List<SequenceI> sg = new Vector<SequenceI>();
\r
1761 if (viewport.cursorMode)
\r
1763 sg.add(viewport.getAlignment().getSequenceAt(
\r
1764 alignPanel.seqPanel.seqCanvas.cursorY));
\r
1766 else if (viewport.getSelectionGroup() != null
\r
1767 && viewport.getSelectionGroup().getSize() != viewport
\r
1768 .getAlignment().getHeight())
\r
1770 sg = viewport.getSelectionGroup().getSequences(
\r
1771 viewport.getHiddenRepSequences());
\r
1774 if (sg.size() < 1)
\r
1779 Vector<SequenceI> invertGroup = new Vector();
\r
1781 for (int i = 0; i < viewport.getAlignment().getHeight(); i++)
\r
1783 if (!sg.contains(viewport.getAlignment().getSequenceAt(i)))
\r
1785 invertGroup.addElement(viewport.getAlignment().getSequenceAt(i));
\r
1789 SequenceI[] seqs1 = sg.toArray(new SequenceI[sg.size()]);
\r
1791 SequenceI[] seqs2 = invertGroup.toArray(new SequenceI[invertGroup
\r
1793 for (int i = 0; i < invertGroup.size(); i++)
\r
1795 seqs2[i] = invertGroup.elementAt(i);
\r
1798 SlideSequencesCommand ssc;
\r
1801 ssc = new SlideSequencesCommand("Slide Sequences", seqs2, seqs1,
\r
1802 size, viewport.getGapCharacter());
\r
1806 ssc = new SlideSequencesCommand("Slide Sequences", seqs1, seqs2,
\r
1807 size, viewport.getGapCharacter());
\r
1810 int groupAdjustment = 0;
\r
1811 if (ssc.getGapsInsertedBegin() && right)
\r
1813 if (viewport.cursorMode)
\r
1815 alignPanel.seqPanel.moveCursor(size, 0);
\r
1819 groupAdjustment = size;
\r
1822 else if (!ssc.getGapsInsertedBegin() && !right)
\r
1824 if (viewport.cursorMode)
\r
1826 alignPanel.seqPanel.moveCursor(-size, 0);
\r
1830 groupAdjustment = -size;
\r
1834 if (groupAdjustment != 0)
\r
1836 viewport.getSelectionGroup().setStartRes(
\r
1837 viewport.getSelectionGroup().getStartRes() + groupAdjustment);
\r
1838 viewport.getSelectionGroup().setEndRes(
\r
1839 viewport.getSelectionGroup().getEndRes() + groupAdjustment);
\r
1842 boolean appendHistoryItem = false;
\r
1843 Deque<CommandI> historyList = viewport.getHistoryList();
\r
1844 if (historyList != null && historyList.size() > 0
\r
1845 && historyList.peek() instanceof SlideSequencesCommand)
\r
1847 appendHistoryItem = ssc
\r
1848 .appendSlideCommand((SlideSequencesCommand) historyList
\r
1852 if (!appendHistoryItem)
\r
1854 addHistoryItem(ssc);
\r
1860 static StringBuffer copiedSequences;
\r
1862 static Vector copiedHiddenColumns;
\r
1864 protected void copy_actionPerformed()
\r
1866 if (viewport.getSelectionGroup() == null)
\r
1871 SequenceGroup sg = viewport.getSelectionGroup();
\r
1872 copiedSequences = new StringBuffer();
\r
1873 Map<Integer, SequenceI> orderedSeqs = new HashMap<Integer, SequenceI>();
\r
1874 for (int i = 0; i < sg.getSize(); i++)
\r
1876 SequenceI seq = sg.getSequenceAt(i);
\r
1877 int index = viewport.getAlignment().findIndex(seq);
\r
1878 orderedSeqs.put(index, seq);
\r
1881 int index = 0, startRes, endRes;
\r
1884 if (viewport.hasHiddenColumns() && viewport.getSelectionGroup() != null)
\r
1886 copiedHiddenColumns = new Vector();
\r
1887 int hiddenOffset = viewport.getSelectionGroup().getStartRes();
\r
1888 for (int[] region : viewport.getColumnSelection().getHiddenColumns())
\r
1890 copiedHiddenColumns.addElement(new int[]
\r
1891 { region[0] - hiddenOffset, region[1] - hiddenOffset });
\r
1896 copiedHiddenColumns = null;
\r
1899 for (int i = 0; i < sg.getSize(); i++)
\r
1901 SequenceI seq = null;
\r
1903 while (seq == null)
\r
1905 if (orderedSeqs.containsKey(index))
\r
1907 seq = orderedSeqs.get(index);
\r
1918 // Returns residue following index if gap
\r
1919 startRes = seq.findPosition(sg.getStartRes());
\r
1922 // Need to find the residue preceeding index if gap
\r
1925 for (int j = 0; j < sg.getEndRes() + 1 && j < seq.getLength(); j++)
\r
1927 ch = seq.getCharAt(j);
\r
1928 if (!Comparison.isGap((ch)))
\r
1936 endRes += seq.getStart() - 1;
\r
1939 copiedSequences.append(seq.getName()
\r
1945 + seq.getSequenceAsString(sg.getStartRes(),
\r
1946 sg.getEndRes() + 1) + "\n");
\r
1951 protected void pasteNew_actionPerformed()
\r
1956 protected void pasteThis_actionPerformed()
\r
1961 void paste(boolean newAlignment)
\r
1966 if (copiedSequences == null)
\r
1971 StringTokenizer st = new StringTokenizer(copiedSequences.toString());
\r
1972 Vector seqs = new Vector();
\r
1973 while (st.hasMoreElements())
\r
1975 String name = st.nextToken();
\r
1976 int start = Integer.parseInt(st.nextToken());
\r
1977 int end = Integer.parseInt(st.nextToken());
\r
1978 seqs.addElement(new Sequence(name, st.nextToken(), start, end));
\r
1980 SequenceI[] newSeqs = new SequenceI[seqs.size()];
\r
1981 for (int i = 0; i < seqs.size(); i++)
\r
1983 newSeqs[i] = (SequenceI) seqs.elementAt(i);
\r
1988 String newtitle = MessageManager.getString("label.copied_sequences");
\r
1989 if (getTitle().startsWith(MessageManager.getString("label.copied_sequences")))
\r
1991 newtitle = getTitle();
\r
1995 newtitle = newtitle.concat(MessageManager.formatMessage("label.from_msname", new String[]{getTitle()}));
\r
1997 AlignFrame af = new AlignFrame(new Alignment(newSeqs),
\r
1998 viewport.applet, newtitle, false);
\r
1999 if (copiedHiddenColumns != null)
\r
2001 for (int i = 0; i < copiedHiddenColumns.size(); i++)
\r
2003 int[] region = (int[]) copiedHiddenColumns.elementAt(i);
\r
2004 af.viewport.hideColumns(region[0], region[1]);
\r
2008 JalviewLite.addFrame(af, newtitle, frameWidth,
\r
2013 addSequences(newSeqs);
\r
2016 } catch (Exception ex)
\r
2018 } // could be anything being pasted in here
\r
2022 void addSequences(SequenceI[] seqs)
\r
2024 for (int i = 0; i < seqs.length; i++)
\r
2026 viewport.getAlignment().addSequence(seqs[i]);
\r
2030 addHistoryItem(new EditCommand(
\r
2031 MessageManager.getString("label.add_sequences"), Action.PASTE,
\r
2032 seqs, 0, viewport.getAlignment().getWidth(),
\r
2033 viewport.getAlignment()));
\r
2035 viewport.setEndSeq(viewport.getAlignment().getHeight());
\r
2036 viewport.getAlignment().getWidth();
\r
2037 viewport.firePropertyChange("alignment", null, viewport.getAlignment()
\r
2042 protected void cut_actionPerformed()
\r
2044 copy_actionPerformed();
\r
2045 delete_actionPerformed();
\r
2048 protected void delete_actionPerformed()
\r
2051 SequenceGroup sg = viewport.getSelectionGroup();
\r
2057 Vector seqs = new Vector();
\r
2059 for (int i = 0; i < sg.getSize(); i++)
\r
2061 seq = sg.getSequenceAt(i);
\r
2062 seqs.addElement(seq);
\r
2065 // If the cut affects all sequences, remove highlighted columns
\r
2066 if (sg.getSize() == viewport.getAlignment().getHeight())
\r
2068 viewport.getColumnSelection().removeElements(sg.getStartRes(),
\r
2069 sg.getEndRes() + 1);
\r
2072 SequenceI[] cut = new SequenceI[seqs.size()];
\r
2073 for (int i = 0; i < seqs.size(); i++)
\r
2075 cut[i] = (SequenceI) seqs.elementAt(i);
\r
2079 * //ADD HISTORY ITEM
\r
2081 addHistoryItem(new EditCommand(
\r
2082 MessageManager.getString("label.cut_sequences"), Action.CUT,
\r
2083 cut, sg.getStartRes(), sg.getEndRes() - sg.getStartRes() + 1,
\r
2084 viewport.getAlignment()));
\r
2086 viewport.setSelectionGroup(null);
\r
2087 viewport.getAlignment().deleteGroup(sg);
\r
2089 viewport.firePropertyChange("alignment", null, viewport.getAlignment()
\r
2092 if (viewport.getAlignment().getHeight() < 1)
\r
2094 this.setVisible(false);
\r
2096 viewport.sendSelection();
\r
2100 * group consensus toggled
\r
2103 protected void showGroupConsensus_actionPerformed()
\r
2105 viewport.setShowGroupConsensus(showGroupConsensus.getState());
\r
2106 alignPanel.updateAnnotation(applyAutoAnnotationSettings.getState());
\r
2111 * group conservation toggled.
\r
2113 protected void showGroupConservation_actionPerformed()
\r
2115 viewport.setShowGroupConservation(showGroupConservation.getState());
\r
2116 alignPanel.updateAnnotation(applyAutoAnnotationSettings.getState());
\r
2123 * jalview.jbgui.GAlignFrame#showConsensusHistogram_actionPerformed(java.awt
\r
2124 * .event.ActionEvent)
\r
2126 protected void showConsensusHistogram_actionPerformed()
\r
2128 viewport.setShowConsensusHistogram(showConsensusHistogram.getState());
\r
2129 alignPanel.updateAnnotation(applyAutoAnnotationSettings.getState());
\r
2136 * jalview.jbgui.GAlignFrame#showConsensusProfile_actionPerformed(java.awt
\r
2137 * .event.ActionEvent)
\r
2139 protected void showSequenceLogo_actionPerformed()
\r
2141 viewport.setShowSequenceLogo(showSequenceLogo.getState());
\r
2142 alignPanel.updateAnnotation(applyAutoAnnotationSettings.getState());
\r
2145 protected void normSequenceLogo_actionPerformed()
\r
2147 showSequenceLogo.setState(true);
\r
2148 viewport.setShowSequenceLogo(true);
\r
2149 viewport.setNormaliseSequenceLogo(normSequenceLogo.getState());
\r
2150 alignPanel.updateAnnotation(applyAutoAnnotationSettings.getState());
\r
2153 protected void applyAutoAnnotationSettings_actionPerformed()
\r
2155 alignPanel.updateAnnotation(applyAutoAnnotationSettings.getState());
\r
2158 protected void makeGrpsFromSelection_actionPerformed()
\r
2160 if (avc.makeGroupsFromSelection())
\r
2162 PaintRefresher.Refresh(this, viewport.getSequenceSetId());
\r
2163 alignPanel.updateAnnotation();
\r
2164 alignPanel.paintAlignment(true);
\r
2168 protected void createGroup_actionPerformed()
\r
2170 avc.createGroup();
\r
2173 protected void unGroup_actionPerformed()
\r
2175 if (avc.unGroup())
\r
2177 alignPanel.alignmentChanged();
\r
2181 protected void deleteGroups_actionPerformed()
\r
2183 if (avc.deleteGroups())
\r
2185 alignPanel.alignmentChanged();
\r
2189 public void selectAllSequenceMenuItem_actionPerformed()
\r
2191 SequenceGroup sg = new SequenceGroup();
\r
2192 for (int i = 0; i < viewport.getAlignment().getSequences().size(); i++)
\r
2194 sg.addSequence(viewport.getAlignment().getSequenceAt(i), false);
\r
2196 sg.setEndRes(viewport.getAlignment().getWidth() - 1);
\r
2197 viewport.setSelectionGroup(sg);
\r
2198 alignPanel.paintAlignment(true);
\r
2199 PaintRefresher.Refresh(alignPanel, viewport.getSequenceSetId());
\r
2200 viewport.sendSelection();
\r
2203 public void deselectAllSequenceMenuItem_actionPerformed()
\r
2205 if (viewport.cursorMode)
\r
2207 alignPanel.seqPanel.keyboardNo1 = null;
\r
2208 alignPanel.seqPanel.keyboardNo2 = null;
\r
2210 viewport.setSelectionGroup(null);
\r
2211 viewport.getColumnSelection().clear();
\r
2212 viewport.setSelectionGroup(null);
\r
2213 alignPanel.idPanel.idCanvas.searchResults = null;
\r
2214 alignPanel.seqPanel.seqCanvas.highlightSearchResults(null);
\r
2215 alignPanel.paintAlignment(true);
\r
2216 PaintRefresher.Refresh(alignPanel, viewport.getSequenceSetId());
\r
2217 viewport.sendSelection();
\r
2220 public void invertSequenceMenuItem_actionPerformed()
\r
2222 SequenceGroup sg = viewport.getSelectionGroup();
\r
2223 for (int i = 0; i < viewport.getAlignment().getSequences().size(); i++)
\r
2225 sg.addOrRemove(viewport.getAlignment().getSequenceAt(i), false);
\r
2228 PaintRefresher.Refresh(alignPanel, viewport.getSequenceSetId());
\r
2229 viewport.sendSelection();
\r
2232 public void invertColSel_actionPerformed()
\r
2234 viewport.invertColumnSelection();
\r
2235 alignPanel.paintAlignment(true);
\r
2236 PaintRefresher.Refresh(alignPanel, viewport.getSequenceSetId());
\r
2237 viewport.sendSelection();
\r
2240 void trimAlignment(boolean trimLeft)
\r
2242 ColumnSelection colSel = viewport.getColumnSelection();
\r
2245 if (colSel.size() > 0)
\r
2249 column = colSel.getMin();
\r
2253 column = colSel.getMax();
\r
2257 if (viewport.getSelectionGroup() != null)
\r
2259 seqs = viewport.getSelectionGroup().getSequencesAsArray(
\r
2260 viewport.getHiddenRepSequences());
\r
2264 seqs = viewport.getAlignment().getSequencesArray();
\r
2267 TrimRegionCommand trimRegion;
\r
2270 trimRegion = new TrimRegionCommand("Remove Left",
\r
2271 TrimRegionCommand.TRIM_LEFT, seqs, column,
\r
2272 viewport.getAlignment(), viewport.getColumnSelection(),
\r
2273 viewport.getSelectionGroup());
\r
2274 viewport.setStartRes(0);
\r
2278 trimRegion = new TrimRegionCommand("Remove Right",
\r
2279 TrimRegionCommand.TRIM_RIGHT, seqs, column,
\r
2280 viewport.getAlignment(), viewport.getColumnSelection(),
\r
2281 viewport.getSelectionGroup());
\r
2284 statusBar.setText(MessageManager.formatMessage(
\r
2285 "label.removed_columns", new String[]
\r
2286 { Integer.valueOf(trimRegion.getSize()).toString() }));
\r
2287 addHistoryItem(trimRegion);
\r
2289 for (SequenceGroup sg : viewport.getAlignment().getGroups())
\r
2291 if ((trimLeft && !sg.adjustForRemoveLeft(column))
\r
2292 || (!trimLeft && !sg.adjustForRemoveRight(column)))
\r
2294 viewport.getAlignment().deleteGroup(sg);
\r
2298 viewport.firePropertyChange("alignment", null, viewport
\r
2299 .getAlignment().getSequences());
\r
2303 public void removeGappedColumnMenuItem_actionPerformed()
\r
2305 int start = 0, end = viewport.getAlignment().getWidth() - 1;
\r
2308 if (viewport.getSelectionGroup() != null)
\r
2310 seqs = viewport.getSelectionGroup().getSequencesAsArray(
\r
2311 viewport.getHiddenRepSequences());
\r
2312 start = viewport.getSelectionGroup().getStartRes();
\r
2313 end = viewport.getSelectionGroup().getEndRes();
\r
2317 seqs = viewport.getAlignment().getSequencesArray();
\r
2320 RemoveGapColCommand removeGapCols = new RemoveGapColCommand(
\r
2321 "Remove Gapped Columns", seqs, start, end,
\r
2322 viewport.getAlignment());
\r
2324 addHistoryItem(removeGapCols);
\r
2326 statusBar.setText(MessageManager.formatMessage(
\r
2327 "label.removed_empty_columns", new String[]
\r
2328 { Integer.valueOf(removeGapCols.getSize()).toString() }));
\r
2330 // This is to maintain viewport position on first residue
\r
2331 // of first sequence
\r
2332 SequenceI seq = viewport.getAlignment().getSequenceAt(0);
\r
2333 int startRes = seq.findPosition(viewport.startRes);
\r
2334 // ShiftList shifts;
\r
2335 // viewport.getAlignment().removeGaps(shifts=new ShiftList());
\r
2336 // edit.alColumnChanges=shifts.getInverse();
\r
2337 // if (viewport.hasHiddenColumns)
\r
2338 // viewport.getColumnSelection().compensateForEdits(shifts);
\r
2339 viewport.setStartRes(seq.findIndex(startRes) - 1);
\r
2340 viewport.firePropertyChange("alignment", null, viewport.getAlignment()
\r
2345 public void removeAllGapsMenuItem_actionPerformed()
\r
2347 int start = 0, end = viewport.getAlignment().getWidth() - 1;
\r
2350 if (viewport.getSelectionGroup() != null)
\r
2352 seqs = viewport.getSelectionGroup().getSequencesAsArray(
\r
2353 viewport.getHiddenRepSequences());
\r
2354 start = viewport.getSelectionGroup().getStartRes();
\r
2355 end = viewport.getSelectionGroup().getEndRes();
\r
2359 seqs = viewport.getAlignment().getSequencesArray();
\r
2362 // This is to maintain viewport position on first residue
\r
2363 // of first sequence
\r
2364 SequenceI seq = viewport.getAlignment().getSequenceAt(0);
\r
2365 int startRes = seq.findPosition(viewport.startRes);
\r
2367 addHistoryItem(new RemoveGapsCommand("Remove Gaps", seqs, start, end,
\r
2368 viewport.getAlignment()));
\r
2370 viewport.setStartRes(seq.findIndex(startRes) - 1);
\r
2372 viewport.firePropertyChange("alignment", null, viewport.getAlignment()
\r
2377 public void findMenuItem_actionPerformed()
\r
2379 new Finder(alignPanel);
\r
2383 * create a new view derived from the current view
\r
2385 * @param viewtitle
\r
2386 * @return frame for the new view
\r
2388 public AlignFrame newView(String viewtitle)
\r
2391 if (viewport.hasHiddenRows())
\r
2393 newal = new Alignment(viewport.getAlignment().getHiddenSequences()
\r
2394 .getFullAlignment().getSequencesArray());
\r
2398 newal = new Alignment(viewport.getAlignment().getSequencesArray());
\r
2401 if (viewport.getAlignment().getAlignmentAnnotation() != null)
\r
2403 for (int i = 0; i < viewport.getAlignment().getAlignmentAnnotation().length; i++)
\r
2405 if (!viewport.getAlignment().getAlignmentAnnotation()[i].autoCalculated)
\r
2407 newal.addAnnotation(viewport.getAlignment()
\r
2408 .getAlignmentAnnotation()[i]);
\r
2413 AlignFrame newaf = new AlignFrame(newal, viewport.applet, "", false);
\r
2415 newaf.viewport.setSequenceSetId(alignPanel.av.getSequenceSetId());
\r
2416 PaintRefresher.Register(alignPanel, alignPanel.av.getSequenceSetId());
\r
2417 PaintRefresher.Register(newaf.alignPanel,
\r
2418 newaf.alignPanel.av.getSequenceSetId());
\r
2420 PaintRefresher.Register(newaf.alignPanel.idPanel.idCanvas,
\r
2421 newaf.alignPanel.av.getSequenceSetId());
\r
2422 PaintRefresher.Register(newaf.alignPanel.seqPanel.seqCanvas,
\r
2423 newaf.alignPanel.av.getSequenceSetId());
\r
2425 Vector comps = (Vector) PaintRefresher.components.get(viewport
\r
2426 .getSequenceSetId());
\r
2427 int viewSize = -1;
\r
2428 for (int i = 0; i < comps.size(); i++)
\r
2430 if (comps.elementAt(i) instanceof AlignmentPanel)
\r
2436 String title = new String(this.getTitle());
\r
2437 if (viewtitle != null)
\r
2439 title = viewtitle + " ( " + title + ")";
\r
2443 if (title.indexOf("(View") > -1)
\r
2445 title = title.substring(0, title.indexOf("(View"));
\r
2447 title += "(View " + viewSize + ")";
\r
2450 newaf.setTitle(title.toString());
\r
2452 newaf.viewport.setHistoryList(viewport.getHistoryList());
\r
2453 newaf.viewport.setRedoList(viewport.getRedoList());
\r
2459 * @return list of feature groups on the view
\r
2461 public String[] getFeatureGroups()
\r
2463 FeatureRenderer fr = null;
\r
2464 if (alignPanel != null
\r
2465 && (fr = alignPanel.getFeatureRenderer()) != null)
\r
2467 List<String> gps = fr.getFeatureGroups();
\r
2468 String[] _gps = gps.toArray(new String[gps.size()]);
\r
2475 * get sequence feature groups that are hidden or shown
\r
2481 public String[] getFeatureGroupsOfState(boolean visible)
\r
2483 FeatureRenderer fr = null;
\r
2484 if (alignPanel != null
\r
2485 && (fr = alignPanel.getFeatureRenderer()) != null)
\r
2487 List<String> gps = fr.getGroups(visible);
\r
2488 String[] _gps = gps.toArray(new String[gps.size()]);
\r
2495 * Change the display state for the given feature groups
\r
2498 * list of group strings
\r
2500 * visible or invisible
\r
2502 public void setFeatureGroupState(String[] groups, boolean state)
\r
2504 FeatureRenderer fr = null;
\r
2505 this.sequenceFeatures.setState(true);
\r
2506 viewport.setShowSequenceFeatures(true);
\r
2507 if (alignPanel != null
\r
2508 && (fr = alignPanel.getFeatureRenderer()) != null)
\r
2511 fr.setGroupVisibility(Arrays.asList(groups), state);
\r
2512 alignPanel.seqPanel.seqCanvas.repaint();
\r
2513 if (alignPanel.overviewPanel != null)
\r
2515 alignPanel.overviewPanel.updateOverviewImage();
\r
2520 public void seqLimits_itemStateChanged()
\r
2522 viewport.setShowJVSuffix(seqLimits.getState());
\r
2523 alignPanel.fontChanged();
\r
2524 alignPanel.paintAlignment(true);
\r
2527 protected void colourTextMenuItem_actionPerformed()
\r
2529 viewport.setColourText(colourTextMenuItem.getState());
\r
2530 alignPanel.paintAlignment(true);
\r
2533 protected void displayNonconservedMenuItem_actionPerformed()
\r
2535 viewport.setShowUnconserved(displayNonconservedMenuItem.getState());
\r
2536 alignPanel.paintAlignment(true);
\r
2539 protected void wrapMenuItem_actionPerformed()
\r
2541 viewport.setWrapAlignment(wrapMenuItem.getState());
\r
2542 alignPanel.setWrapAlignment(wrapMenuItem.getState());
\r
2543 scaleAbove.setEnabled(wrapMenuItem.getState());
\r
2544 scaleLeft.setEnabled(wrapMenuItem.getState());
\r
2545 scaleRight.setEnabled(wrapMenuItem.getState());
\r
2546 alignPanel.paintAlignment(true);
\r
2549 public void overviewMenuItem_actionPerformed()
\r
2551 if (alignPanel.overviewPanel != null)
\r
2556 JFrame frame = new JFrame();
\r
2557 OverviewPanel overview = new OverviewPanel(alignPanel);
\r
2558 frame.add(overview);
\r
2559 // +50 must allow for applet frame window
\r
2560 JalviewLite.addFrame(frame, MessageManager.formatMessage(
\r
2561 "label.overview_params", new String[]
\r
2562 { this.getTitle() }), overview.getPreferredSize().width,
\r
2563 overview.getPreferredSize().height + 50);
\r
2566 final AlignmentPanel ap = alignPanel;
\r
2567 frame.addWindowListener(new WindowAdapter()
\r
2570 public void windowClosing(WindowEvent e)
\r
2574 ap.setOverviewPanel(null);
\r
2579 alignPanel.setOverviewPanel(overview);
\r
2583 public void changeColour(ColourSchemeI cs)
\r
2585 int threshold = 0;
\r
2589 if (viewport.getAbovePIDThreshold())
\r
2591 viewport.setThreshold(SliderPanel.setPIDSliderSource(alignPanel,
\r
2592 cs, "Background"));
\r
2595 if (viewport.getConservationSelected())
\r
2597 cs.setConservationApplied(true);
\r
2598 viewport.setIncrement(SliderPanel.setConservationSlider(alignPanel,
\r
2599 cs, "Background"));
\r
2603 cs.setConservationApplied(false);
\r
2606 viewport.setGlobalColourScheme(cs);
\r
2608 if (alignPanel.getOverviewPanel() != null)
\r
2610 alignPanel.getOverviewPanel().updateOverviewImage();
\r
2613 StructureSelectionManager.getStructureSelectionManager(viewport.applet)
\r
2614 .sequenceColoursChanged(alignPanel);
\r
2616 alignPanel.paintAlignment(true);
\r
2619 protected void modifyPID_actionPerformed()
\r
2621 if (viewport.getAbovePIDThreshold()
\r
2622 && viewport.getGlobalColourScheme() != null)
\r
2624 SliderPanel.setPIDSliderSource(alignPanel,
\r
2625 viewport.getGlobalColourScheme(), "Background");
\r
2626 SliderPanel.showPIDSlider();
\r
2630 protected void modifyConservation_actionPerformed()
\r
2632 if (viewport.getConservationSelected()
\r
2633 && viewport.getGlobalColourScheme() != null)
\r
2635 SliderPanel.setConservationSlider(alignPanel,
\r
2636 viewport.getGlobalColourScheme(), "Background");
\r
2637 SliderPanel.showConservationSlider();
\r
2641 protected void conservationMenuItem_actionPerformed()
\r
2643 viewport.setConservationSelected(conservationMenuItem.getState());
\r
2645 viewport.setAbovePIDThreshold(false);
\r
2646 abovePIDThreshold.setState(false);
\r
2648 changeColour(viewport.getGlobalColourScheme());
\r
2650 modifyConservation_actionPerformed();
\r
2653 public void abovePIDThreshold_actionPerformed()
\r
2655 viewport.setAbovePIDThreshold(abovePIDThreshold.getState());
\r
2657 conservationMenuItem.setState(false);
\r
2658 viewport.setConservationSelected(false);
\r
2660 changeColour(viewport.getGlobalColourScheme());
\r
2662 modifyPID_actionPerformed();
\r
2665 public void sortPairwiseMenuItem_actionPerformed()
\r
2667 SequenceI[] oldOrder = viewport.getAlignment().getSequencesArray();
\r
2668 AlignmentSorter.sortByPID(viewport.getAlignment(), viewport
\r
2669 .getAlignment().getSequenceAt(0), null);
\r
2671 addHistoryItem(new OrderCommand("Pairwise Sort", oldOrder,
\r
2672 viewport.getAlignment()));
\r
2673 alignPanel.paintAlignment(true);
\r
2676 public void sortIDMenuItem_actionPerformed()
\r
2678 SequenceI[] oldOrder = viewport.getAlignment().getSequencesArray();
\r
2679 AlignmentSorter.sortByID(viewport.getAlignment());
\r
2680 addHistoryItem(new OrderCommand("ID Sort", oldOrder,
\r
2681 viewport.getAlignment()));
\r
2682 alignPanel.paintAlignment(true);
\r
2685 public void sortLengthMenuItem_actionPerformed()
\r
2687 SequenceI[] oldOrder = viewport.getAlignment().getSequencesArray();
\r
2688 AlignmentSorter.sortByLength(viewport.getAlignment());
\r
2689 addHistoryItem(new OrderCommand("Length Sort", oldOrder,
\r
2690 viewport.getAlignment()));
\r
2691 alignPanel.paintAlignment(true);
\r
2694 public void sortGroupMenuItem_actionPerformed()
\r
2696 SequenceI[] oldOrder = viewport.getAlignment().getSequencesArray();
\r
2697 AlignmentSorter.sortByGroup(viewport.getAlignment());
\r
2698 addHistoryItem(new OrderCommand("Group Sort", oldOrder,
\r
2699 viewport.getAlignment()));
\r
2700 alignPanel.paintAlignment(true);
\r
2704 public void removeRedundancyMenuItem_actionPerformed()
\r
2706 new RedundancyPanel(alignPanel);
\r
2709 public void pairwiseAlignmentMenuItem_actionPerformed()
\r
2711 if (viewport.getSelectionGroup() != null
\r
2712 && viewport.getSelectionGroup().getSize() > 1)
\r
2714 JFrame frame = new JFrame();
\r
2715 frame.add(new PairwiseAlignPanel(alignPanel));
\r
2716 JalviewLite.addFrame(frame,
\r
2717 MessageManager.getString("action.pairwise_alignment"), 600,
\r
2722 public void PCAMenuItem_actionPerformed()
\r
2724 // are the sequences aligned?
\r
2725 if (!viewport.getAlignment().isAligned(false))
\r
2727 SequenceI current;
\r
2728 int Width = viewport.getAlignment().getWidth();
\r
2730 for (int i = 0; i < viewport.getAlignment().getSequences().size(); i++)
\r
2732 current = viewport.getAlignment().getSequenceAt(i);
\r
2734 if (current.getLength() < Width)
\r
2736 current.insertCharAt(Width - 1, viewport.getGapCharacter());
\r
2739 alignPanel.paintAlignment(true);
\r
2742 if ((viewport.getSelectionGroup() != null
\r
2743 && viewport.getSelectionGroup().getSize() < 4 && viewport
\r
2744 .getSelectionGroup().getSize() > 0)
\r
2745 || viewport.getAlignment().getHeight() < 4)
\r
2752 new PCAPanel(viewport);
\r
2753 } catch (java.lang.OutOfMemoryError ex)
\r
2759 public void averageDistanceTreeMenuItem_actionPerformed()
\r
2761 NewTreePanel("AV", "PID", "Average distance tree using PID");
\r
2764 public void neighbourTreeMenuItem_actionPerformed()
\r
2766 NewTreePanel("NJ", "PID", "Neighbour joining tree using PID");
\r
2769 protected void njTreeBlosumMenuItem_actionPerformed()
\r
2771 NewTreePanel("NJ", "BL", "Neighbour joining tree using BLOSUM62");
\r
2774 protected void avTreeBlosumMenuItem_actionPerformed()
\r
2776 NewTreePanel("AV", "BL", "Average distance tree using BLOSUM62");
\r
2779 void NewTreePanel(String type, String pwType, String title)
\r
2781 // are the sequences aligned?
\r
2782 if (!viewport.getAlignment().isAligned(false))
\r
2784 SequenceI current;
\r
2785 int Width = viewport.getAlignment().getWidth();
\r
2787 for (int i = 0; i < viewport.getAlignment().getSequences().size(); i++)
\r
2789 current = viewport.getAlignment().getSequenceAt(i);
\r
2791 if (current.getLength() < Width)
\r
2793 current.insertCharAt(Width - 1, viewport.getGapCharacter());
\r
2796 alignPanel.paintAlignment(true);
\r
2800 if ((viewport.getSelectionGroup() != null && viewport
\r
2801 .getSelectionGroup().getSize() > 1)
\r
2802 || (viewport.getAlignment().getHeight() > 1))
\r
2804 final TreePanel tp = new TreePanel(alignPanel, type, pwType);
\r
2806 addTreeMenuItem(tp, title);
\r
2808 JalviewLite.addFrame(tp, title, 600, 500);
\r
2812 void loadTree_actionPerformed()
\r
2814 CutAndPasteTransfer cap = new CutAndPasteTransfer(true, this);
\r
2815 cap.setText(MessageManager.getString("label.paste_newick_tree_file"));
\r
2816 cap.setTreeImport();
\r
2817 JFrame frame = new JFrame();
\r
2819 JalviewLite.addFrame(frame,
\r
2820 MessageManager.getString("label.paste_newick_file"), 400, 300);
\r
2823 public void loadTree(NewickFile tree, String treeFile)
\r
2825 TreePanel tp = new TreePanel(alignPanel, treeFile,
\r
2826 MessageManager.getString("label.load_tree_from_file"), tree);
\r
2827 JalviewLite.addFrame(tp, treeFile, 600, 500);
\r
2828 addTreeMenuItem(tp, treeFile);
\r
2832 * sort the alignment using the given treePanel
\r
2834 * @param treePanel
\r
2835 * tree used to sort view
\r
2837 * string used for undo event name
\r
2839 public void sortByTree(TreePanel treePanel, String title)
\r
2841 SequenceI[] oldOrder = viewport.getAlignment().getSequencesArray();
\r
2843 .sortByTree(viewport.getAlignment(), treePanel.getTree());
\r
2844 // addHistoryItem(new HistoryItem("Sort", viewport.alignment,
\r
2845 // HistoryItem.SORT));
\r
2846 addHistoryItem(new OrderCommand(MessageManager.formatMessage(
\r
2847 "label.order_by_params", new String[]
\r
2848 { title }), oldOrder, viewport.getAlignment()));
\r
2849 alignPanel.paintAlignment(true);
\r
2853 * Do any automatic reordering of the alignment and add the necessary bits to
\r
2854 * the menu structure for the new tree
\r
2856 * @param treePanel
\r
2859 protected void addTreeMenuItem(final TreePanel treePanel,
\r
2860 final String title)
\r
2862 final JMenuItem item = new JMenuItem(title);
\r
2863 sortByTreeMenu.add(item);
\r
2864 item.addActionListener(new java.awt.event.ActionListener()
\r
2867 public void actionPerformed(ActionEvent evt)
\r
2869 sortByTree(treePanel, title); // treePanel.getTitle());
\r
2873 treePanel.addWindowListener(new WindowAdapter()
\r
2876 public void windowOpened(WindowEvent e)
\r
2878 if (viewport.sortByTree)
\r
2880 sortByTree(treePanel, title);
\r
2882 super.windowOpened(e);
\r
2886 public void windowClosing(WindowEvent e)
\r
2888 sortByTreeMenu.remove(item);
\r
2893 public boolean sortBy(AlignmentOrder alorder, String undoname)
\r
2895 SequenceI[] oldOrder = viewport.getAlignment().getSequencesArray();
\r
2896 if (JalviewLite.debug)
\r
2898 System.err.println("Sorting " + alorder.getOrder().size()
\r
2899 + " in alignment '" + getTitle() + "'");
\r
2901 AlignmentSorter.sortBy(viewport.getAlignment(), alorder);
\r
2902 if (undoname != null)
\r
2904 addHistoryItem(new OrderCommand(undoname, oldOrder,
\r
2905 viewport.getAlignment()));
\r
2907 alignPanel.paintAlignment(true);
\r
2911 protected void documentation_actionPerformed()
\r
2913 alignPanel.av.applet.openJalviewHelpUrl();
\r
2916 protected void about_actionPerformed()
\r
2919 class AboutPanel extends JPanel
\r
2925 public AboutPanel(String version, String builddate)
\r
2927 this.version = version;
\r
2928 this.builddate = builddate;
\r
2932 public void paint(Graphics g)
\r
2934 g.setColor(Color.white);
\r
2935 g.fillRect(0, 0, getSize().width, getSize().height);
\r
2936 g.setFont(new Font("Helvetica", Font.PLAIN, 12));
\r
2937 FontMetrics fm = g.getFontMetrics();
\r
2938 int fh = fm.getHeight();
\r
2940 g.setColor(Color.black);
\r
2941 // TODO: update this text for each release or centrally store it for
\r
2942 // lite and application
\r
2943 g.setFont(new Font("Helvetica", Font.BOLD, 14));
\r
2944 g.drawString(MessageManager.formatMessage(
\r
2945 "label.jalviewLite_release", new String[]
\r
2946 { version }), x, y += fh);
\r
2947 g.setFont(new Font("Helvetica", Font.BOLD, 12));
\r
2948 g.drawString(MessageManager.formatMessage(
\r
2949 "label.jaview_build_date", new String[]
\r
2950 { builddate }), x, y += fh);
\r
2951 g.setFont(new Font("Helvetica", Font.PLAIN, 12));
\r
2952 g.drawString(MessageManager.getString("label.jalview_authors_1"),
\r
2953 x, y += fh * 1.5);
\r
2954 g.drawString(MessageManager.getString("label.jalview_authors_2"),
\r
2955 x + 50, y += fh + 8);
\r
2957 MessageManager.getString("label.jalview_dev_managers"), x,
\r
2959 g.drawString(MessageManager
\r
2960 .getString("label.jalview_distribution_lists"), x, y += fh);
\r
2961 g.drawString(MessageManager.getString("label.jalview_please_cite"),
\r
2964 MessageManager.getString("label.jalview_cite_1_authors"),
\r
2967 MessageManager.getString("label.jalview_cite_1_title"), x,
\r
2969 g.drawString(MessageManager.getString("label.jalview_cite_1_ref"),
\r
2974 JFrame frame = new JFrame();
\r
2975 frame.add(new AboutPanel(JalviewLite.getVersion(), JalviewLite
\r
2976 .getBuildDate()));
\r
2977 JalviewLite.addFrame(frame,
\r
2978 MessageManager.getString("label.jalview"), 580, 220);
\r
2982 public void showURL(String url, String target)
\r
2984 if (viewport.applet == null)
\r
2986 System.out.println("Not running as applet - no browser available.");
\r
2990 viewport.applet.showURL(url, target);
\r
2994 // ////////////////////////////////////////////////////////////////////////////////
\r
2995 // JBuilder Graphics here
\r
2997 JMenuBar alignFrameMenuBar = new JMenuBar();
\r
2999 JMenu fileMenu = new JMenu(MessageManager.getString("action.file"));
\r
3001 JMenuItem loadApplication = new JMenuItem(
\r
3002 MessageManager.getString("label.view_full_application"));
\r
3004 JMenuItem loadTree = new JMenuItem(
\r
3005 MessageManager.getString("label.load_associated_tree"));
\r
3007 JMenuItem loadAnnotations = new JMenuItem(
\r
3008 MessageManager.getString("label.load_features_annotations"));
\r
3010 JMenuItem outputFeatures = new JMenuItem(
\r
3011 MessageManager.getString("label.export_features").concat("..."));
\r
3013 JMenuItem outputAnnotations = new JMenuItem(
\r
3014 MessageManager.getString("label.export_annotations").concat("..."));
\r
3016 JMenuItem closeMenuItem = new JMenuItem(
\r
3017 MessageManager.getString("action.close"));
\r
3019 JMenuItem selectAllSequenceMenuItem = new JMenuItem(
\r
3020 MessageManager.getString("action.select_all"));
\r
3022 JMenuItem deselectAllSequenceMenuItem = new JMenuItem(
\r
3023 MessageManager.getString("action.deselect_all"));
\r
3025 JMenuItem invertSequenceMenuItem = new JMenuItem(
\r
3026 MessageManager.getString("action.invert_selection"));
\r
3028 JMenuItem remove2LeftMenuItem = new JMenuItem();
\r
3030 JMenuItem remove2RightMenuItem = new JMenuItem();
\r
3032 JMenuItem removeGappedColumnMenuItem = new JMenuItem();
\r
3034 JMenuItem removeAllGapsMenuItem = new JMenuItem();
\r
3036 JCheckBoxMenuItem viewBoxesMenuItem = new JCheckBoxMenuItem();
\r
3038 JCheckBoxMenuItem viewTextMenuItem = new JCheckBoxMenuItem();
\r
3040 JMenuItem sortPairwiseMenuItem = new JMenuItem();
\r
3042 JMenuItem sortIDMenuItem = new JMenuItem();
\r
3044 JMenuItem sortLengthMenuItem = new JMenuItem();
\r
3046 JMenuItem sortGroupMenuItem = new JMenuItem();
\r
3048 JMenuItem removeRedundancyMenuItem = new JMenuItem();
\r
3050 JMenuItem pairwiseAlignmentMenuItem = new JMenuItem();
\r
3052 JMenuItem PCAMenuItem = new JMenuItem();
\r
3054 JMenuItem averageDistanceTreeMenuItem = new JMenuItem();
\r
3056 JMenuItem neighbourTreeMenuItem = new JMenuItem();
\r
3058 BorderLayout borderLayout1 = new BorderLayout();
\r
3060 public JLabel statusBar = new JLabel();
\r
3062 JMenuItem clustalColour = new JMenuItem();
\r
3064 JMenuItem zappoColour = new JMenuItem();
\r
3066 JMenuItem taylorColour = new JMenuItem();
\r
3068 JMenuItem hydrophobicityColour = new JMenuItem();
\r
3070 JMenuItem helixColour = new JMenuItem();
\r
3072 JMenuItem strandColour = new JMenuItem();
\r
3074 JMenuItem turnColour = new JMenuItem();
\r
3076 JMenuItem buriedColour = new JMenuItem();
\r
3078 JMenuItem purinePyrimidineColour = new JMenuItem();
\r
3080 JMenuItem RNAInteractionColour = new JMenuItem();
\r
3082 JMenuItem RNAHelixColour = new JMenuItem();
\r
3084 JMenuItem userDefinedColour = new JMenuItem();
\r
3086 JMenuItem PIDColour = new JMenuItem();
\r
3088 JMenuItem BLOSUM62Colour = new JMenuItem();
\r
3090 JMenuItem tcoffeeColour = new JMenuItem();
\r
3092 JMenuItem njTreeBlosumMenuItem = new JMenuItem();
\r
3094 JMenuItem avDistanceTreeBlosumMenuItem = new JMenuItem();
\r
3096 JCheckBoxMenuItem annotationPanelMenuItem = new JCheckBoxMenuItem();
\r
3098 JCheckBoxMenuItem colourTextMenuItem = new JCheckBoxMenuItem();
\r
3100 JCheckBoxMenuItem displayNonconservedMenuItem = new JCheckBoxMenuItem();
\r
3102 JMenuItem alProperties = new JMenuItem(
\r
3103 MessageManager.getString("label.alignment_props"));
\r
3105 JMenuItem overviewMenuItem = new JMenuItem();
\r
3107 JMenuItem undoMenuItem = new JMenuItem();
\r
3109 JMenuItem redoMenuItem = new JMenuItem();
\r
3111 JCheckBoxMenuItem conservationMenuItem = new JCheckBoxMenuItem();
\r
3113 JMenuItem noColourmenuItem = new JMenuItem();
\r
3115 JCheckBoxMenuItem wrapMenuItem = new JCheckBoxMenuItem();
\r
3117 JCheckBoxMenuItem renderGapsMenuItem = new JCheckBoxMenuItem();
\r
3119 JMenuItem findMenuItem = new JMenuItem();
\r
3121 JCheckBoxMenuItem abovePIDThreshold = new JCheckBoxMenuItem();
\r
3123 JMenuItem nucleotideColour = new JMenuItem();
\r
3125 JMenuItem deleteGroups = new JMenuItem();
\r
3127 JMenuItem grpsFromSelection = new JMenuItem();
\r
3129 JMenuItem createGroup = new JMenuItem();
\r
3131 JMenuItem unGroup = new JMenuItem();
\r
3133 JMenuItem delete = new JMenuItem();
\r
3135 JMenuItem copy = new JMenuItem();
\r
3137 JMenuItem cut = new JMenuItem();
\r
3139 JMenu pasteMenu = new JMenu();
\r
3141 JMenuItem pasteNew = new JMenuItem();
\r
3143 JMenuItem pasteThis = new JMenuItem();
\r
3145 JCheckBoxMenuItem applyToAllGroups = new JCheckBoxMenuItem();
\r
3147 JMenuItem font = new JMenuItem();
\r
3149 JCheckBoxMenuItem scaleAbove = new JCheckBoxMenuItem();
\r
3151 JCheckBoxMenuItem scaleLeft = new JCheckBoxMenuItem();
\r
3153 JCheckBoxMenuItem scaleRight = new JCheckBoxMenuItem();
\r
3155 JMenuItem modifyPID = new JMenuItem();
\r
3157 JMenuItem modifyConservation = new JMenuItem();
\r
3159 JCheckBoxMenuItem autoCalculate = null;
\r
3161 JCheckBoxMenuItem sortByTree = new JCheckBoxMenuItem(
\r
3162 "Sort Alignment With New Tree", true);
\r
3164 JMenu sortByTreeMenu = new JMenu();
\r
3166 JMenuItem inputText = new JMenuItem();
\r
3168 JMenuItem documentation = new JMenuItem();
\r
3170 JMenuItem about = new JMenuItem();
\r
3172 JCheckBoxMenuItem seqLimits = new JCheckBoxMenuItem();
\r
3174 JCheckBoxMenuItem centreColumnLabelFlag = new JCheckBoxMenuItem();
\r
3176 JCheckBoxMenuItem followMouseOverFlag = new JCheckBoxMenuItem();
\r
3178 JCheckBoxMenuItem showSequenceLogo = new JCheckBoxMenuItem();
\r
3180 JCheckBoxMenuItem applyAutoAnnotationSettings = new JCheckBoxMenuItem();
\r
3182 JCheckBoxMenuItem showConsensusHistogram = new JCheckBoxMenuItem();
\r
3184 JCheckBoxMenuItem showGroupConsensus = new JCheckBoxMenuItem();
\r
3186 JCheckBoxMenuItem showGroupConservation = new JCheckBoxMenuItem();
\r
3188 JCheckBoxMenuItem normSequenceLogo = new JCheckBoxMenuItem();
\r
3191 * Initialise menus and other items
\r
3193 * @throws Exception
\r
3195 private void jbInit() throws Exception
\r
3197 setJMenuBar(alignFrameMenuBar);
\r
3200 * Configure File menu items and actions
\r
3203 .setLabel(MessageManager.getString("label.input_from_textbox"));
\r
3204 inputText.addActionListener(this);
\r
3205 JMenu outputTextboxMenu = new JMenu(
\r
3206 MessageManager.getString("label.out_to_textbox"));
\r
3207 for (int i = 0; i < AppletFormatAdapter.WRITEABLE_FORMATS.length; i++)
\r
3210 JMenuItem item = new JMenuItem(AppletFormatAdapter.WRITEABLE_FORMATS[i]);
\r
3212 item.addActionListener(new java.awt.event.ActionListener()
\r
3215 public void actionPerformed(ActionEvent e)
\r
3217 outputText_actionPerformed(e);
\r
3221 outputTextboxMenu.add(item);
\r
3223 closeMenuItem.addActionListener(this);
\r
3224 loadApplication.addActionListener(this);
\r
3225 loadTree.addActionListener(this);
\r
3226 loadAnnotations.addActionListener(this);
\r
3227 outputFeatures.addActionListener(this);
\r
3228 outputAnnotations.addActionListener(this);
\r
3231 * Configure Edit menu items and actions
\r
3233 undoMenuItem.setEnabled(false);
\r
3234 undoMenuItem.setLabel(MessageManager.getString("action.undo"));
\r
3235 undoMenuItem.addActionListener(this);
\r
3236 redoMenuItem.setEnabled(false);
\r
3237 redoMenuItem.setLabel(MessageManager.getString("action.redo"));
\r
3238 redoMenuItem.addActionListener(this);
\r
3239 copy.setLabel(MessageManager.getString("action.copy"));
\r
3240 copy.addActionListener(this);
\r
3241 cut.setLabel(MessageManager.getString("action.cut"));
\r
3242 cut.addActionListener(this);
\r
3243 delete.setLabel(MessageManager.getString("action.delete"));
\r
3244 delete.addActionListener(this);
\r
3245 pasteMenu.setLabel(MessageManager.getString("action.paste"));
\r
3246 pasteNew.setLabel(MessageManager.getString("label.to_new_alignment"));
\r
3247 pasteNew.addActionListener(this);
\r
3248 pasteThis.setLabel(MessageManager.getString("label.to_this_alignment"));
\r
3249 pasteThis.addActionListener(this);
\r
3250 remove2LeftMenuItem.setLabel(MessageManager
\r
3251 .getString("action.remove_left"));
\r
3252 remove2LeftMenuItem.addActionListener(this);
\r
3253 remove2RightMenuItem.setLabel(MessageManager
\r
3254 .getString("action.remove_right"));
\r
3255 remove2RightMenuItem.addActionListener(this);
\r
3256 removeGappedColumnMenuItem.setLabel(MessageManager
\r
3257 .getString("action.remove_empty_columns"));
\r
3258 removeGappedColumnMenuItem.addActionListener(this);
\r
3259 removeAllGapsMenuItem.setLabel(MessageManager
\r
3260 .getString("action.remove_all_gaps"));
\r
3261 removeAllGapsMenuItem.addActionListener(this);
\r
3262 removeRedundancyMenuItem.setLabel(MessageManager.getString(
\r
3263 "action.remove_redundancy").concat("..."));
\r
3264 removeRedundancyMenuItem.addActionListener(this);
\r
3267 * Configure Select menu items and actions
\r
3269 findMenuItem.setLabel(MessageManager.getString("action.find"));
\r
3270 findMenuItem.addActionListener(this);
\r
3271 selectAllSequenceMenuItem.addActionListener(this);
\r
3272 deselectAllSequenceMenuItem.addActionListener(this);
\r
3273 invertSequenceMenuItem.setLabel(MessageManager
\r
3274 .getString("action.invert_sequence_selection"));
\r
3275 invertSequenceMenuItem.addActionListener(this);
\r
3276 invertColSel.setLabel(MessageManager
\r
3277 .getString("action.invert_column_selection"));
\r
3278 invertColSel.addActionListener(this);
\r
3279 deleteGroups.setLabel(MessageManager
\r
3280 .getString("action.undefine_groups"));
\r
3281 deleteGroups.addActionListener(this);
\r
3282 grpsFromSelection.setLabel(MessageManager
\r
3283 .getString("action.make_groups_selection"));
\r
3284 grpsFromSelection.addActionListener(this);
\r
3285 createGroup.setLabel(MessageManager.getString("action.create_group"));
\r
3286 unGroup.setLabel(MessageManager.getString("action.remove_group"));
\r
3287 annotationColumnSelection.setLabel("Select by Annotation");
\r
3288 annotationColumnSelection.addActionListener(this);
\r
3291 * Configure View menu items and actions
\r
3293 newView.setLabel(MessageManager.getString("action.new_view"));
\r
3294 newView.addActionListener(this);
\r
3295 JMenu showMenu = new JMenu(MessageManager.getString("action.show"));
\r
3296 showColumns.setLabel(MessageManager.getString("label.all_columns"));
\r
3297 showSeqs.setLabel(MessageManager.getString("label.all_sequences"));
\r
3298 JMenu hideMenu = new JMenu(MessageManager.getString("action.hide"));
\r
3300 .setLabel(MessageManager.getString("label.selected_columns"));
\r
3301 hideSequences.setLabel(MessageManager
\r
3302 .getString("label.selected_sequences"));
\r
3303 hideAllButSelection.setLabel(MessageManager
\r
3304 .getString("label.all_but_selected_region"));
\r
3305 hideAllSelection.setLabel(MessageManager
\r
3306 .getString("label.selected_region"));
\r
3307 showAllHidden.setLabel(MessageManager
\r
3308 .getString("label.all_sequences_columns"));
\r
3309 showColumns.addActionListener(this);
\r
3310 showSeqs.addActionListener(this);
\r
3311 hideColumns.addActionListener(this);
\r
3312 hideSequences.addActionListener(this);
\r
3313 hideAllButSelection.addActionListener(this);
\r
3314 hideAllSelection.addActionListener(this);
\r
3315 showAllHidden.addActionListener(this);
\r
3316 featureSettings.setLabel(MessageManager
\r
3317 .getString("label.feature_settings"));
\r
3318 featureSettings.addActionListener(this);
\r
3319 sequenceFeatures.setLabel(MessageManager
\r
3320 .getString("label.show_sequence_features"));
\r
3321 sequenceFeatures.addItemListener(this);
\r
3322 sequenceFeatures.setState(false);
\r
3323 followMouseOverFlag.setLabel(MessageManager
\r
3324 .getString("label.automatic_scrolling"));
\r
3325 followMouseOverFlag.addItemListener(this);
\r
3326 alProperties.addActionListener(this);
\r
3327 overviewMenuItem.setLabel(MessageManager
\r
3328 .getString("label.overview_window"));
\r
3329 overviewMenuItem.addActionListener(this);
\r
3332 * Configure Annotations menu items and actions
\r
3334 annotationPanelMenuItem.setLabel(MessageManager
\r
3335 .getString("label.show_annotations"));
\r
3336 annotationPanelMenuItem.addItemListener(this);
\r
3337 showGroupConsensus.setLabel(MessageManager
\r
3338 .getString("label.group_consensus"));
\r
3339 showGroupConservation.setLabel(MessageManager
\r
3340 .getString("label.group_conservation"));
\r
3341 showConsensusHistogram.setLabel(MessageManager
\r
3342 .getString("label.show_consensus_histogram"));
\r
3343 showSequenceLogo.setLabel(MessageManager
\r
3344 .getString("label.show_consensus_logo"));
\r
3345 normSequenceLogo.setLabel(MessageManager
\r
3346 .getString("label.norm_consensus_logo"));
\r
3347 applyAutoAnnotationSettings.setLabel(MessageManager
\r
3348 .getString("label.apply_all_groups"));
\r
3349 applyAutoAnnotationSettings.setState(true);
\r
3350 JMenu autoAnnMenu = new JMenu(
\r
3351 MessageManager.getString("label.autocalculated_annotation"));
\r
3352 showGroupConsensus.addItemListener(this);
\r
3353 showGroupConservation.addItemListener(this);
\r
3354 showConsensusHistogram.addItemListener(this);
\r
3355 showSequenceLogo.addItemListener(this);
\r
3356 normSequenceLogo.addItemListener(this);
\r
3357 applyAutoAnnotationSettings.addItemListener(this);
\r
3358 showAlignmentAnnotations = new JCheckBoxMenuItem(
\r
3359 MessageManager.getString("label.show_all_al_annotations"));
\r
3360 showSequenceAnnotations = new JCheckBoxMenuItem(
\r
3361 MessageManager.getString("label.show_all_seq_annotations"));
\r
3362 sortAnnBySequence = new JCheckBoxMenuItem(
\r
3363 MessageManager.getString("label.sort_annotations_by_sequence"));
\r
3364 sortAnnByLabel = new JCheckBoxMenuItem(
\r
3365 MessageManager.getString("label.sort_annotations_by_label"));
\r
3366 showAutoFirst = new JCheckBoxMenuItem(
\r
3367 MessageManager.getString("label.show_first"));
\r
3368 showAutoLast = new JCheckBoxMenuItem(
\r
3369 MessageManager.getString("label.show_last"));
\r
3370 showAlignmentAnnotations.addItemListener(this);
\r
3371 showSequenceAnnotations.addItemListener(this);
\r
3372 sortAnnBySequence.addItemListener(this);
\r
3373 sortAnnByLabel.addItemListener(this);
\r
3374 showAutoFirst.addItemListener(this);
\r
3375 showAutoLast.addItemListener(this);
\r
3378 * Configure Format menu items and actions
\r
3380 font.setLabel(MessageManager.getString("action.font"));
\r
3381 font.addActionListener(this);
\r
3382 scaleAbove.setLabel(MessageManager.getString("action.scale_above"));
\r
3383 scaleAbove.setState(true);
\r
3384 scaleAbove.setEnabled(false);
\r
3385 scaleAbove.addItemListener(this);
\r
3386 scaleLeft.setEnabled(false);
\r
3387 scaleLeft.setState(true);
\r
3388 scaleLeft.setLabel(MessageManager.getString("action.scale_left"));
\r
3389 scaleLeft.addItemListener(this);
\r
3390 scaleRight.setEnabled(false);
\r
3391 scaleRight.setState(true);
\r
3392 scaleRight.setLabel(MessageManager.getString("action.scale_right"));
\r
3393 scaleRight.addItemListener(this);
\r
3394 viewBoxesMenuItem.setLabel(MessageManager.getString("action.boxes"));
\r
3395 viewBoxesMenuItem.setState(true);
\r
3396 viewBoxesMenuItem.addItemListener(this);
\r
3397 viewTextMenuItem.setLabel(MessageManager.getString("action.text"));
\r
3398 viewTextMenuItem.setState(true);
\r
3399 viewTextMenuItem.addItemListener(this);
\r
3400 colourTextMenuItem.setLabel(MessageManager
\r
3401 .getString("label.colour_text"));
\r
3402 colourTextMenuItem.addItemListener(this);
\r
3403 displayNonconservedMenuItem.setLabel(MessageManager
\r
3404 .getString("label.show_non_conversed"));
\r
3405 displayNonconservedMenuItem.addItemListener(this);
\r
3406 wrapMenuItem.setLabel(MessageManager.getString("action.wrap"));
\r
3407 wrapMenuItem.addItemListener(this);
\r
3408 renderGapsMenuItem.setLabel(MessageManager
\r
3409 .getString("action.show_gaps"));
\r
3410 renderGapsMenuItem.setState(true);
\r
3411 renderGapsMenuItem.addItemListener(this);
\r
3412 centreColumnLabelFlag.setLabel(MessageManager
\r
3413 .getString("label.centre_column_labels"));
\r
3414 centreColumnLabelFlag.addItemListener(this);
\r
3415 seqLimits.setState(true);
\r
3416 seqLimits.setLabel(MessageManager
\r
3417 .getString("label.show_sequence_limits"));
\r
3418 seqLimits.addItemListener(this);
\r
3421 * Configure Colour menu items and actions
\r
3423 applyToAllGroups.setLabel(MessageManager
\r
3424 .getString("label.apply_colour_to_all_groups"));
\r
3425 applyToAllGroups.setState(true);
\r
3426 applyToAllGroups.addItemListener(this);
\r
3427 clustalColour.setLabel(MessageManager.getString("label.clustalx"));
\r
3428 clustalColour.addActionListener(this);
\r
3429 zappoColour.setLabel(MessageManager.getString("label.zappo"));
\r
3430 zappoColour.addActionListener(this);
\r
3431 taylorColour.setLabel(MessageManager.getString("label.taylor"));
\r
3432 taylorColour.addActionListener(this);
\r
3433 hydrophobicityColour.setLabel(MessageManager
\r
3434 .getString("label.hydrophobicity"));
\r
3435 hydrophobicityColour.addActionListener(this);
\r
3437 .setLabel(MessageManager.getString("label.helix_propensity"));
\r
3438 helixColour.addActionListener(this);
\r
3439 strandColour.setLabel(MessageManager
\r
3440 .getString("label.strand_propensity"));
\r
3441 strandColour.addActionListener(this);
\r
3442 turnColour.setLabel(MessageManager.getString("label.turn_propensity"));
\r
3443 turnColour.addActionListener(this);
\r
3444 buriedColour.setLabel(MessageManager.getString("label.buried_index"));
\r
3445 buriedColour.addActionListener(this);
\r
3446 purinePyrimidineColour.setLabel(MessageManager
\r
3447 .getString("label.purine_pyrimidine"));
\r
3448 purinePyrimidineColour.addActionListener(this);
\r
3449 RNAInteractionColour.setLabel(MessageManager
\r
3450 .getString("label.rna_interaction"));
\r
3451 RNAInteractionColour.addActionListener(this);
\r
3452 RNAHelixColour.setLabel(MessageManager
\r
3453 .getString("action.by_rna_helixes"));
\r
3454 RNAHelixColour.addActionListener(this);
\r
3455 userDefinedColour.setLabel(MessageManager
\r
3456 .getString("action.user_defined"));
\r
3457 userDefinedColour.addActionListener(this);
\r
3458 PIDColour.setLabel(MessageManager
\r
3459 .getString("label.percentage_identity"));
\r
3460 PIDColour.addActionListener(this);
\r
3461 BLOSUM62Colour.setLabel(MessageManager
\r
3462 .getString("label.blosum62_score"));
\r
3463 BLOSUM62Colour.addActionListener(this);
\r
3465 .setLabel(MessageManager.getString("label.tcoffee_scores"));
\r
3466 // it will be enabled only if a score file is provided
\r
3467 tcoffeeColour.setEnabled(false);
\r
3468 tcoffeeColour.addActionListener(this);
\r
3469 conservationMenuItem.setLabel(MessageManager
\r
3470 .getString("action.by_conservation"));
\r
3471 conservationMenuItem.addItemListener(this);
\r
3472 noColourmenuItem.setLabel(MessageManager.getString("label.none"));
\r
3473 noColourmenuItem.addActionListener(this);
\r
3474 abovePIDThreshold.setLabel(MessageManager
\r
3475 .getString("label.above_identity_threshold"));
\r
3476 abovePIDThreshold.addItemListener(this);
\r
3477 nucleotideColour.setLabel(MessageManager.getString("label.nucleotide"));
\r
3478 nucleotideColour.addActionListener(this);
\r
3479 modifyPID.setLabel(MessageManager
\r
3480 .getString("label.modify_identity_thereshold"));
\r
3481 modifyPID.addActionListener(this);
\r
3482 modifyConservation.setLabel(MessageManager
\r
3483 .getString("label.modify_conservation_thereshold"));
\r
3484 modifyConservation.addActionListener(this);
\r
3485 annotationColour.setLabel(MessageManager
\r
3486 .getString("action.by_annotation"));
\r
3487 annotationColour.addActionListener(this);
\r
3490 * Configure Calculate menu items and actions
\r
3492 sortPairwiseMenuItem.setLabel(MessageManager
\r
3493 .getString("action.by_pairwise_id"));
\r
3494 sortPairwiseMenuItem.addActionListener(this);
\r
3495 sortIDMenuItem.setLabel(MessageManager.getString("action.by_id"));
\r
3496 sortIDMenuItem.addActionListener(this);
\r
3497 sortLengthMenuItem.setLabel(MessageManager
\r
3498 .getString("action.by_length"));
\r
3499 sortLengthMenuItem.addActionListener(this);
\r
3500 sortGroupMenuItem.setLabel(MessageManager.getString("action.by_group"));
\r
3501 sortGroupMenuItem.addActionListener(this);
\r
3502 pairwiseAlignmentMenuItem.setLabel(MessageManager
\r
3503 .getString("action.pairwise_alignment"));
\r
3504 pairwiseAlignmentMenuItem.addActionListener(this);
\r
3505 PCAMenuItem.setLabel(MessageManager
\r
3506 .getString("label.principal_component_analysis"));
\r
3507 PCAMenuItem.addActionListener(this);
\r
3508 autoCalculate = new JCheckBoxMenuItem(
\r
3509 MessageManager.getString("label.autocalculate_consensus"), true);
\r
3510 averageDistanceTreeMenuItem.setLabel(MessageManager
\r
3511 .getString("label.average_distance_identity"));
\r
3512 averageDistanceTreeMenuItem.addActionListener(this);
\r
3513 neighbourTreeMenuItem.setLabel(MessageManager
\r
3514 .getString("label.neighbour_joining_identity"));
\r
3515 neighbourTreeMenuItem.addActionListener(this);
\r
3516 avDistanceTreeBlosumMenuItem.setLabel(MessageManager
\r
3517 .getString("label.average_distance_bloslum62"));
\r
3518 avDistanceTreeBlosumMenuItem.addActionListener(this);
\r
3519 njTreeBlosumMenuItem.setLabel(MessageManager
\r
3520 .getString("label.neighbour_blosum62"));
\r
3521 njTreeBlosumMenuItem.addActionListener(this);
\r
3522 sortByTreeMenu.setLabel(MessageManager
\r
3523 .getString("action.by_tree_order"));
\r
3524 JMenu sortMenu = new JMenu(MessageManager.getString("action.sort"));
\r
3525 JMenu calculateTreeMenu = new JMenu(
\r
3526 MessageManager.getString("action.calculate_tree"));
\r
3527 autoCalculate.addItemListener(this);
\r
3528 sortByTree.addItemListener(this);
\r
3531 * Configure Help menu items and actions
\r
3533 JMenu helpMenu = new JMenu(MessageManager.getString("action.help"));
\r
3534 documentation.setLabel(MessageManager.getString("label.documentation"));
\r
3535 documentation.addActionListener(this);
\r
3536 about.setLabel(MessageManager.getString("label.about"));
\r
3537 about.addActionListener(this);
\r
3540 * Add top level menus to frame
\r
3542 alignFrameMenuBar.add(fileMenu);
\r
3543 JMenu editMenu = new JMenu(MessageManager.getString("action.edit"));
\r
3544 alignFrameMenuBar.add(editMenu);
\r
3545 JMenu selectMenu = new JMenu(MessageManager.getString("action.select"));
\r
3546 alignFrameMenuBar.add(selectMenu);
\r
3547 JMenu viewMenu = new JMenu(MessageManager.getString("action.view"));
\r
3548 alignFrameMenuBar.add(viewMenu);
\r
3549 JMenu annotationsMenu = new JMenu(
\r
3550 MessageManager.getString("action.annotations"));
\r
3551 alignFrameMenuBar.add(annotationsMenu);
\r
3552 JMenu formatMenu = new JMenu(MessageManager.getString("action.format"));
\r
3553 alignFrameMenuBar.add(formatMenu);
\r
3554 JMenu colourMenu = new JMenu(MessageManager.getString("action.colour"));
\r
3555 alignFrameMenuBar.add(colourMenu);
\r
3556 JMenu calculateMenu = new JMenu(
\r
3557 MessageManager.getString("action.calculate"));
\r
3558 alignFrameMenuBar.add(calculateMenu);
\r
3559 alignFrameMenuBar.add(helpMenu);
\r
3564 fileMenu.add(inputText);
\r
3565 fileMenu.add(loadTree);
\r
3566 fileMenu.add(loadAnnotations);
\r
3567 fileMenu.addSeparator();
\r
3568 fileMenu.add(outputTextboxMenu);
\r
3569 fileMenu.add(outputFeatures);
\r
3570 fileMenu.add(outputAnnotations);
\r
3571 if (jalviewServletURL != null)
\r
3573 fileMenu.add(loadApplication);
\r
3575 fileMenu.addSeparator();
\r
3576 fileMenu.add(closeMenuItem);
\r
3581 editMenu.add(undoMenuItem);
\r
3582 editMenu.add(redoMenuItem);
\r
3583 editMenu.add(cut);
\r
3584 editMenu.add(copy);
\r
3585 pasteMenu.add(pasteNew);
\r
3586 pasteMenu.add(pasteThis);
\r
3587 editMenu.add(pasteMenu);
\r
3588 editMenu.add(delete);
\r
3589 editMenu.addSeparator();
\r
3590 editMenu.add(remove2LeftMenuItem);
\r
3591 editMenu.add(remove2RightMenuItem);
\r
3592 editMenu.add(removeGappedColumnMenuItem);
\r
3593 editMenu.add(removeAllGapsMenuItem);
\r
3594 editMenu.add(removeRedundancyMenuItem);
\r
3599 selectMenu.add(findMenuItem);
\r
3600 selectMenu.addSeparator();
\r
3601 selectMenu.add(selectAllSequenceMenuItem);
\r
3602 selectMenu.add(deselectAllSequenceMenuItem);
\r
3603 selectMenu.add(invertSequenceMenuItem);
\r
3604 selectMenu.add(invertColSel);
\r
3605 selectMenu.add(createGroup);
\r
3606 selectMenu.add(unGroup);
\r
3607 selectMenu.add(grpsFromSelection);
\r
3608 selectMenu.add(deleteGroups);
\r
3609 selectMenu.add(annotationColumnSelection);
\r
3614 viewMenu.add(newView);
\r
3615 viewMenu.addSeparator();
\r
3616 showMenu.add(showColumns);
\r
3617 showMenu.add(showSeqs);
\r
3618 showMenu.add(showAllHidden);
\r
3619 viewMenu.add(showMenu);
\r
3620 hideMenu.add(hideColumns);
\r
3621 hideMenu.add(hideSequences);
\r
3622 hideMenu.add(hideAllSelection);
\r
3623 hideMenu.add(hideAllButSelection);
\r
3624 viewMenu.add(hideMenu);
\r
3625 viewMenu.addSeparator();
\r
3626 viewMenu.add(followMouseOverFlag);
\r
3627 viewMenu.addSeparator();
\r
3628 viewMenu.add(sequenceFeatures);
\r
3629 viewMenu.add(featureSettings);
\r
3630 viewMenu.addSeparator();
\r
3631 viewMenu.add(alProperties);
\r
3632 viewMenu.addSeparator();
\r
3633 viewMenu.add(overviewMenuItem);
\r
3636 * Annotations menu
\r
3638 annotationsMenu.add(annotationPanelMenuItem);
\r
3639 annotationsMenu.addSeparator();
\r
3640 annotationsMenu.add(showAlignmentAnnotations);
\r
3641 annotationsMenu.add(showSequenceAnnotations);
\r
3642 annotationsMenu.add(sortAnnBySequence);
\r
3643 annotationsMenu.add(sortAnnByLabel);
\r
3644 annotationsMenu.addSeparator();
\r
3645 autoAnnMenu.add(showAutoFirst);
\r
3646 autoAnnMenu.add(showAutoLast);
\r
3647 autoAnnMenu.addSeparator();
\r
3648 autoAnnMenu.add(applyAutoAnnotationSettings);
\r
3649 autoAnnMenu.add(showConsensusHistogram);
\r
3650 autoAnnMenu.add(showSequenceLogo);
\r
3651 autoAnnMenu.add(normSequenceLogo);
\r
3652 autoAnnMenu.addSeparator();
\r
3653 autoAnnMenu.add(showGroupConservation);
\r
3654 autoAnnMenu.add(showGroupConsensus);
\r
3655 annotationsMenu.add(autoAnnMenu);
\r
3660 formatMenu.add(font);
\r
3661 formatMenu.add(seqLimits);
\r
3662 formatMenu.add(wrapMenuItem);
\r
3663 formatMenu.add(scaleAbove);
\r
3664 formatMenu.add(scaleLeft);
\r
3665 formatMenu.add(scaleRight);
\r
3666 formatMenu.add(viewBoxesMenuItem);
\r
3667 formatMenu.add(viewTextMenuItem);
\r
3668 formatMenu.add(colourTextMenuItem);
\r
3669 formatMenu.add(displayNonconservedMenuItem);
\r
3670 formatMenu.add(renderGapsMenuItem);
\r
3671 formatMenu.add(centreColumnLabelFlag);
\r
3676 colourMenu.add(applyToAllGroups);
\r
3677 colourMenu.addSeparator();
\r
3678 colourMenu.add(noColourmenuItem);
\r
3679 colourMenu.add(clustalColour);
\r
3680 colourMenu.add(BLOSUM62Colour);
\r
3681 colourMenu.add(PIDColour);
\r
3682 colourMenu.add(zappoColour);
\r
3683 colourMenu.add(taylorColour);
\r
3684 colourMenu.add(hydrophobicityColour);
\r
3685 colourMenu.add(helixColour);
\r
3686 colourMenu.add(strandColour);
\r
3687 colourMenu.add(turnColour);
\r
3688 colourMenu.add(buriedColour);
\r
3689 colourMenu.add(nucleotideColour);
\r
3690 colourMenu.add(purinePyrimidineColour);
\r
3691 // colourMenu.add(RNAInteractionColour);
\r
3692 colourMenu.add(tcoffeeColour);
\r
3693 colourMenu.add(userDefinedColour);
\r
3694 colourMenu.addSeparator();
\r
3695 colourMenu.add(conservationMenuItem);
\r
3696 colourMenu.add(modifyConservation);
\r
3697 colourMenu.add(abovePIDThreshold);
\r
3698 colourMenu.add(modifyPID);
\r
3699 colourMenu.add(annotationColour);
\r
3700 colourMenu.add(RNAHelixColour);
\r
3705 sortMenu.add(sortIDMenuItem);
\r
3706 sortMenu.add(sortLengthMenuItem);
\r
3707 sortMenu.add(sortByTreeMenu);
\r
3708 sortMenu.add(sortGroupMenuItem);
\r
3709 sortMenu.add(sortPairwiseMenuItem);
\r
3710 calculateMenu.add(sortMenu);
\r
3711 calculateTreeMenu.add(averageDistanceTreeMenuItem);
\r
3712 calculateTreeMenu.add(neighbourTreeMenuItem);
\r
3713 calculateTreeMenu.add(avDistanceTreeBlosumMenuItem);
\r
3714 calculateTreeMenu.add(njTreeBlosumMenuItem);
\r
3715 calculateMenu.add(calculateTreeMenu);
\r
3716 calculateMenu.addSeparator();
\r
3717 calculateMenu.add(pairwiseAlignmentMenuItem);
\r
3718 calculateMenu.add(PCAMenuItem);
\r
3719 calculateMenu.add(autoCalculate);
\r
3720 calculateMenu.add(sortByTree);
\r
3725 helpMenu.add(documentation);
\r
3726 helpMenu.add(about);
\r
3731 statusBar.setBackground(Color.white);
\r
3732 statusBar.setFont(new java.awt.Font("Verdana", 0, 11));
\r
3733 statusBar.setText(MessageManager.getString("label.status_bar"));
\r
3734 this.add(statusBar, BorderLayout.SOUTH);
\r
3737 public void setStatus(String string)
\r
3739 statusBar.setText(string);
\r
3742 JMenuItem featureSettings = new JMenuItem();
\r
3744 JCheckBoxMenuItem sequenceFeatures = new JCheckBoxMenuItem();
\r
3746 JMenuItem annotationColour = new JMenuItem();
\r
3748 JMenuItem annotationColumnSelection = new JMenuItem();
\r
3750 JMenuItem invertColSel = new JMenuItem();
\r
3752 JMenuItem showColumns = new JMenuItem();
\r
3754 JMenuItem showSeqs = new JMenuItem();
\r
3756 JMenuItem hideColumns = new JMenuItem();
\r
3758 JMenuItem hideSequences = new JMenuItem();
\r
3760 JMenuItem hideAllButSelection = new JMenuItem();
\r
3762 JMenuItem hideAllSelection = new JMenuItem();
\r
3764 JMenuItem showAllHidden = new JMenuItem();
\r
3766 JMenuItem newView = new JMenuItem();
\r
3768 private JCheckBoxMenuItem showAlignmentAnnotations;
\r
3770 private JCheckBoxMenuItem showSequenceAnnotations;
\r
3772 private JCheckBoxMenuItem sortAnnBySequence;
\r
3774 private JCheckBoxMenuItem sortAnnByLabel;
\r
3776 private JCheckBoxMenuItem showAutoFirst;
\r
3778 private JCheckBoxMenuItem showAutoLast;
\r
3780 private SplitFrame splitFrame;
\r
3783 * Attach the alignFrame panels after embedding menus, if necessary. This used
\r
3784 * to be called setEmbedded, but is now creates the dropdown menus in a
\r
3785 * platform independent manner to avoid OSX/Mac menu appendage daftness.
\r
3787 * @param reallyEmbedded
\r
3788 * true to attach the view to the applet area on the page rather than
\r
3791 public void createAlignFrameWindow(boolean reallyEmbedded)
\r
3793 if (reallyEmbedded)
\r
3795 embedAlignFrameInApplet(viewport.applet);
\r
3800 // test and embed menu bar if necessary.
\r
3802 if (embedMenuIfNeeded(alignPanel))
\r
3805 * adjust for status bar height too. ? pointless as overridden by layout
\r
3808 alignPanel.setSize(getSize().width,
\r
3809 getSize().height - statusBar.getHeight());
\r
3811 add(statusBar, BorderLayout.SOUTH);
\r
3812 add(alignPanel, BorderLayout.CENTER);
\r
3813 // and register with the applet so it can pass external API calls to us
\r
3814 JalviewLite.addFrame(this, this.getTitle(),
\r
3821 * Add the components of this AlignFrame to the applet container.
\r
3823 * @param theApplet
\r
3825 public void embedAlignFrameInApplet(final JalviewLite theApplet)
\r
3828 // Explicitly build the embedded menu panel for the on-page applet
\r
3830 // view cannot be closed if its actually on the page
\r
3831 fileMenu.remove(closeMenuItem);
\r
3832 fileMenu.remove(3); // Remove Separator
\r
3833 // construct embedded menu, using default font
\r
3834 embeddedMenu = makeEmbeddedPopupMenu(alignFrameMenuBar, false, false);
\r
3835 // and actually add the components to the applet area
\r
3836 theApplet.setLayout(new BorderLayout());
\r
3837 theApplet.add(embeddedMenu, BorderLayout.NORTH);
\r
3838 theApplet.add(statusBar, BorderLayout.SOUTH);
\r
3839 // TODO should size be left to the layout manager?
\r
3840 alignPanel.setSize(theApplet.getSize().width,
\r
3841 theApplet.getSize().height - embeddedMenu.getHeight()
\r
3842 - statusBar.getHeight());
\r
3843 theApplet.add(alignPanel, BorderLayout.CENTER);
\r
3844 final AlignFrame me = this;
\r
3845 theApplet.addFocusListener(new FocusListener()
\r
3849 public void focusLost(FocusEvent e)
\r
3851 if (theApplet.currentAlignFrame == me)
\r
3853 theApplet.currentAlignFrame = null;
\r
3858 public void focusGained(FocusEvent e)
\r
3860 theApplet.currentAlignFrame = me;
\r
3863 theApplet.validate();
\r
3867 * create a new binding between structures in an existing jmol viewer instance
\r
3868 * and an alignpanel with sequences that have existing PDBFile entries. Note,
\r
3869 * this does not open a new Jmol window, or modify the display of the
\r
3870 * structures in the original jmol window. Note This method doesn't work
\r
3871 * without an additional javascript library to exchange messages between the
\r
3872 * distinct applets. See http://issues.jalview.org/browse/JAL-621
\r
3875 * JmolViewer instance
\r
3876 * @param sequenceIds
\r
3877 * - sequence Ids to search for associations
\r
3879 public SequenceStructureBinding addStructureViewInstance(
\r
3880 Object jmolviewer, String[] sequenceIds)
\r
3882 Viewer viewer = null;
\r
3885 viewer = (Viewer) jmolviewer;
\r
3886 } catch (ClassCastException ex)
\r
3888 System.err.println("Unsupported viewer object :"
\r
3889 + jmolviewer.getClass());
\r
3891 if (viewer == null)
\r
3893 System.err.println("Can't use this object as a structure viewer:"
\r
3894 + jmolviewer.getClass());
\r
3897 SequenceI[] seqs = null;
\r
3898 if (sequenceIds == null || sequenceIds.length == 0)
\r
3900 seqs = viewport.getAlignment().getSequencesArray();
\r
3904 Vector sqi = new Vector();
\r
3905 AlignmentI al = viewport.getAlignment();
\r
3906 for (int sid = 0; sid < sequenceIds.length; sid++)
\r
3908 SequenceI sq = al.findName(sequenceIds[sid]);
\r
3911 sqi.addElement(sq);
\r
3914 if (sqi.size() > 0)
\r
3916 seqs = new SequenceI[sqi.size()];
\r
3917 for (int sid = 0, sSize = sqi.size(); sid < sSize; sid++)
\r
3919 seqs[sid] = (SequenceI) sqi.elementAt(sid);
\r
3927 AAStructureBindingModel jmv = null;
\r
3928 // TODO: search for a jmv that involves viewer
\r
3930 { // create a new viewer/jalview binding.
\r
3931 jmv = new ExtJmol(viewer, alignPanel, new SequenceI[][]
\r
3939 * bind a pdb file to a sequence in the current view
\r
3941 * @param sequenceId
\r
3942 * - sequenceId within the dataset.
\r
3943 * @param pdbEntryString
\r
3944 * - the short name for the PDB file
\r
3946 * - pdb file - either a URL or a valid PDB file.
\r
3947 * @return true if binding was as success TODO: consider making an exception
\r
3948 * structure for indicating when PDB parsing or sequenceId location
\r
3951 public boolean addPdbFile(String sequenceId, String pdbEntryString,
\r
3954 SequenceI toaddpdb = viewport.getAlignment().findName(sequenceId);
\r
3955 boolean needtoadd = false;
\r
3956 if (toaddpdb != null)
\r
3958 Vector pdbe = toaddpdb.getPDBId();
\r
3959 PDBEntry pdbentry = null;
\r
3960 if (pdbe != null && pdbe.size() > 0)
\r
3962 for (int pe = 0, peSize = pdbe.size(); pe < peSize; pe++)
\r
3964 pdbentry = (PDBEntry) pdbe.elementAt(pe);
\r
3965 if (!pdbentry.getId().equals(pdbEntryString)
\r
3966 && !pdbentry.getFile().equals(pdbFile))
\r
3976 if (pdbentry == null)
\r
3978 pdbentry = new PDBEntry();
\r
3979 pdbentry.setId(pdbEntryString);
\r
3980 pdbentry.setFile(pdbFile);
\r
3981 needtoadd = true; // add this new entry to sequence.
\r
3983 // resolve data source
\r
3984 // TODO: this code should be a refactored to an io package
\r
3985 String protocol = AppletFormatAdapter.resolveProtocol(pdbFile, "PDB");
\r
3986 if (protocol == null)
\r
3992 // make a note of the access mode and add
\r
3993 if (pdbentry.getProperty() == null)
\r
3995 pdbentry.setProperty(new Hashtable());
\r
3997 pdbentry.getProperty().put("protocol", protocol);
\r
3998 toaddpdb.addPDBId(pdbentry);
\r
3999 alignPanel.getStructureSelectionManager()
\r
4000 .registerPDBEntry(pdbentry);
\r
4006 private Object[] cleanSeqChainArrays(SequenceI[] seqs, String[] chains)
\r
4010 Vector sequences = new Vector();
\r
4011 for (int i = 0; i < seqs.length; i++)
\r
4013 if (seqs[i] != null)
\r
4015 sequences.addElement(new Object[]
\r
4016 { seqs[i], (chains != null) ? chains[i] : null });
\r
4019 seqs = new SequenceI[sequences.size()];
\r
4020 chains = new String[sequences.size()];
\r
4021 for (int i = 0, isize = sequences.size(); i < isize; i++)
\r
4023 Object[] oj = (Object[]) sequences.elementAt(i);
\r
4025 seqs[i] = (SequenceI) oj[0];
\r
4026 chains[i] = (String) oj[1];
\r
4029 return new Object[]
\r
4034 public void newStructureView(JalviewLite applet, PDBEntry pdb,
\r
4035 SequenceI[] seqs, String[] chains, String protocol)
\r
4037 // Scrub any null sequences from the array
\r
4038 Object[] sqch = cleanSeqChainArrays(seqs, chains);
\r
4039 seqs = (SequenceI[]) sqch[0];
\r
4040 chains = (String[]) sqch[1];
\r
4041 if (seqs == null || seqs.length == 0)
\r
4044 .println("JalviewLite.AlignFrame:newStructureView: No sequence to bind structure to.");
\r
4046 if (protocol == null || protocol.trim().length() == 0
\r
4047 || protocol.equals("null"))
\r
4049 protocol = (String) pdb.getProperty().get("protocol");
\r
4050 if (protocol == null)
\r
4052 System.err.println("Couldn't work out protocol to open structure: "
\r
4057 if (applet.useXtrnalSviewer)
\r
4059 // register the association(s) and quit, don't create any windows.
\r
4060 if (StructureSelectionManager.getStructureSelectionManager(applet)
\r
4061 .setMapping(seqs, chains, pdb.getFile(), protocol) == null)
\r
4063 System.err.println("Failed to map " + pdb.getFile() + " ("
\r
4064 + protocol + ") to any sequences");
\r
4068 if (applet.isAlignPdbStructures() && applet.jmolAvailable)
\r
4070 // can only do alignments with Jmol
\r
4071 // find the last jmol window assigned to this alignment
\r
4072 AppletJmol ajm = null, tajm;
\r
4073 Vector jmols = applet
\r
4074 .getAppletWindow(AppletJmol.class);
\r
4075 for (int i = 0, iSize = jmols.size(); i < iSize; i++)
\r
4077 tajm = (AppletJmol) jmols.elementAt(i);
\r
4078 if (tajm.ap.alignFrame == this)
\r
4087 .println("Incremental adding and aligning structure to existing Jmol view not yet implemented.");
\r
4088 // try and add the pdb structure
\r
4093 // otherwise, create a new window
\r
4094 // if (applet.jmolAvailable)
\r
4096 new AppletJmol(pdb, seqs, chains, alignPanel, protocol);
\r
4097 applet.lastFrameX += 40;
\r
4098 applet.lastFrameY += 40;
\r
4102 // new MCview.AppletPDBViewer(pdb, seqs, chains, alignPanel, protocol);
\r
4107 public void alignedStructureView(JalviewLite applet, PDBEntry[] pdb,
\r
4108 SequenceI[][] seqs, String[][] chains, String[] protocols)
\r
4110 // TODO Auto-generated method stub
\r
4111 System.err.println("Aligned Structure View: Not yet implemented.");
\r
4115 * modify the current selection, providing the user has not made a selection
\r
4119 * - sequences from this alignment
\r
4121 * - columns to be selected on the alignment
\r
4123 public void select(SequenceGroup sel, ColumnSelection csel)
\r
4125 alignPanel.seqPanel.selection(sel, csel, null);
\r
4128 public void scrollTo(int row, int column)
\r
4130 alignPanel.seqPanel.scrollTo(row, column);
\r
4133 public void scrollToRow(int row)
\r
4135 alignPanel.seqPanel.scrollToRow(row);
\r
4138 public void scrollToColumn(int column)
\r
4140 alignPanel.seqPanel.scrollToColumn(column);
\r
4144 * @return the alignments unique ID.
\r
4146 public String getSequenceSetId()
\r
4148 return viewport.getSequenceSetId();
\r
4152 * Load the (T-Coffee) score file from the specified url
\r
4155 * File/URL/T-COFFEE score file contents
\r
4156 * @throws IOException
\r
4157 * @return true if alignment was annotated with data from source
\r
4159 public boolean loadScoreFile(String source) throws IOException
\r
4162 AlignFile file = GenericFileAdapter.newTCoffeeScoreFile(source,
\r
4163 AppletFormatAdapter.checkProtocol(source));
\r
4164 if (!file.isValid())
\r
4166 // TODO: raise dialog for gui
\r
4167 System.err.println("Problems parsing T-Coffee scores: "
\r
4168 + file.getWarningMessage());
\r
4169 System.err.println("Origin was:\n" + source);
\r
4174 * check that the score matrix matches the alignment dimensions
\r
4177 if ((aln = viewport.getAlignment()) != null
\r
4178 && (aln.getHeight() != file.getHeight() || aln.getWidth() != file
\r
4181 // TODO: raise a dialog box here rather than bomb out.
\r
4183 .println("The scores matrix does not match the alignment dimensions");
\r
4187 // TODO add parameter to indicate if matching should be done
\r
4188 if (file.annotateAlignment(alignPanel.getAlignment(), false))
\r
4190 alignPanel.fontChanged();
\r
4191 tcoffeeColour.setEnabled(true);
\r
4192 // switch to this color
\r
4193 changeColour(new TCoffeeColourScheme(alignPanel.getAlignment()));
\r
4198 System.err.println("Problems resolving T-Coffee scores:");
\r
4199 if (file.getWarningMessage() != null)
\r
4201 System.err.println(file.getWarningMessage());
\r
4207 public SplitFrame getSplitFrame()
\r
4209 return this.splitFrame;
\r
4212 public void setSplitFrame(SplitFrame sf)
\r
4214 this.splitFrame = sf;
\r
4217 // may not need this
\r
4219 public void setShowSeqFeatures(boolean b)
\r
4221 // showSeqFeatures.setSelected(b);
\r
4222 viewport.setShowSequenceFeatures(b);
\r
4227 public void setMenusForViewport()
\r
4229 // setMenusFromViewport(viewport);
\r
4233 public void refreshFeatureUI(boolean enableIfNecessary)
\r
4235 if (enableIfNecessary)
\r
4237 sequenceFeatures.setState(true);
\r
4238 alignPanel.av.setShowSequenceFeatures(true);
\r
4243 public FeatureSettingsControllerI getFeatureSettingsUI()
\r
4245 return alignPanel.av.featureSettings;
\r