/* * Jalview - A Sequence Alignment Editor and Viewer ($$Version-Rel$$) * Copyright (C) $$Year-Rel$$ The Jalview Authors * * This file is part of Jalview. * * Jalview is free software: you can redistribute it and/or * modify it under the terms of the GNU General Public License * as published by the Free Software Foundation, either version 3 * of the License, or (at your option) any later version. * * Jalview is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty * of MERCHANTABILITY or FITNESS FOR A PARTICULAR * PURPOSE. See the GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with Jalview. If not, see . * The Jalview Authors are detailed in the 'AUTHORS' file. */ package jalview.appletgui; import jalview.analysis.AlignmentSorter; import jalview.analysis.AnnotationSorter.SequenceAnnotationOrder; import jalview.api.AlignViewControllerGuiI; import jalview.api.AlignViewControllerI; import jalview.api.AlignViewportI; import jalview.api.FeatureRenderer; import jalview.api.FeatureSettingsControllerI; import jalview.api.SequenceStructureBinding; import jalview.bin.JalviewLite; import jalview.commands.CommandI; import jalview.commands.EditCommand; import jalview.commands.EditCommand.Action; import jalview.commands.OrderCommand; import jalview.commands.RemoveGapColCommand; import jalview.commands.RemoveGapsCommand; import jalview.commands.SlideSequencesCommand; import jalview.commands.TrimRegionCommand; import jalview.controller.AlignViewController; import jalview.datamodel.Alignment; import jalview.datamodel.AlignmentAnnotation; import jalview.datamodel.AlignmentI; import jalview.datamodel.AlignmentOrder; import jalview.datamodel.ColumnSelection; import jalview.datamodel.PDBEntry; import jalview.datamodel.Sequence; import jalview.datamodel.SequenceGroup; import jalview.datamodel.SequenceI; import jalview.io.AlignmentProperties; import jalview.io.AnnotationFile; import jalview.io.AppletFormatAdapter; import jalview.io.FeaturesFile; import jalview.io.NewickFile; import jalview.io.AlignFile; import jalview.io.TCoffeeScoreFile; import jalview.jsdev.GenericFileAdapter; import jalview.schemes.Blosum62ColourScheme; import jalview.schemes.BuriedColourScheme; import jalview.schemes.ClustalxColourScheme; import jalview.schemes.ColourSchemeI; import jalview.schemes.HelixColourScheme; import jalview.schemes.HydrophobicColourScheme; import jalview.schemes.NucleotideColourScheme; import jalview.schemes.PIDColourScheme; import jalview.schemes.PurinePyrimidineColourScheme; import jalview.schemes.RNAHelicesColourChooser; import jalview.schemes.RNAInteractionColourScheme; import jalview.schemes.StrandColourScheme; import jalview.schemes.TCoffeeColourScheme; import jalview.schemes.TaylorColourScheme; import jalview.schemes.TurnColourScheme; import jalview.schemes.ZappoColourScheme; import jalview.structure.StructureSelectionManager; import jalview.structures.models.AAStructureBindingModel; import jalview.util.Comparison; import jalview.util.MappingUtils; import jalview.util.MessageManager; import jalview.viewmodel.AlignmentViewport; import java.awt.BorderLayout; import java.awt.Color; import java.awt.Font; import java.awt.FontMetrics; import java.awt.Graphics; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; import java.awt.event.FocusEvent; import java.awt.event.FocusListener; import java.awt.event.ItemEvent; import java.awt.event.ItemListener; import java.awt.event.KeyEvent; import java.awt.event.KeyListener; import java.awt.event.WindowAdapter; import java.awt.event.WindowEvent; import java.io.IOException; import java.net.URL; import java.net.URLEncoder; import java.util.Arrays; import java.util.Deque; import java.util.HashMap; import java.util.Hashtable; import java.util.List; import java.util.Map; import java.util.StringTokenizer; import java.util.Vector; import awt2swing.Canvas; import awt2swing.CheckboxMenuItem; import awt2swing.Frame; import awt2swing.Label; import awt2swing.Menu; import awt2swing.MenuBar; import awt2swing.MenuItem; //import org.jmol.viewer.Viewer; public class AlignFrame extends EmbmenuFrame implements ActionListener, ItemListener, KeyListener, AlignViewControllerGuiI { public AlignViewControllerI avc; public AlignmentPanel alignPanel; public AlignViewport viewport; // width and height may be overridden by applet parameters int frameWidth = 700; int frameHeight = 500; String jalviewServletURL; /* * Flag for showing autocalculated consensus above or below other consensus * rows */ private boolean showAutoCalculatedAbove; private SequenceAnnotationOrder annotationSortOrder; /** * Constructor that creates the frame and adds it to the display. * * @param al * @param applet * @param title * @param embedded */ public AlignFrame(AlignmentI al, JalviewLite applet, String title, boolean embedded) { this(al, applet, title, embedded, true); } /** * Constructor that optionally allows the frame to be displayed or only * created. * * @param al * @param applet * @param title * @param embedded * @param addToDisplay */ public AlignFrame(AlignmentI al, JalviewLite applet, String title, boolean embedded, boolean addToDisplay) { this(al, null, null, applet, title, embedded, addToDisplay); } public AlignFrame(AlignmentI al, SequenceI[] hiddenSeqs, ColumnSelection columnSelection, JalviewLite applet, String title, boolean embedded) { this(al, hiddenSeqs, columnSelection, applet, title, embedded, true); } public AlignFrame(AlignmentI al, SequenceI[] hiddenSeqs, ColumnSelection columnSelection, JalviewLite applet, String title, boolean embedded, boolean addToDisplay) { if (applet != null) { jalviewServletURL = applet.jalviewServletURL; } try { jbInit(); } catch (Exception ex) { ex.printStackTrace(); } // need to get window geometry before we calculate alignment layout if (applet != null) { String param; try { param = applet.windowWidth; if (param != null) { int width = Integer.parseInt(param); frameWidth = width; } param = applet.windowHeight; if (param != null) { int height = Integer.parseInt(param); frameHeight = height; } } catch (Exception ex) { } } viewport = new AlignViewport(al, applet); if (hiddenSeqs != null && hiddenSeqs.length > 0) { viewport.hideSequence(hiddenSeqs); } if (columnSelection != null) { viewport.setColumnSelection(columnSelection); } alignPanel = new AlignmentPanel(this, viewport); avc = new AlignViewController(this, viewport, alignPanel); viewport.updateConservation(alignPanel); viewport.updateConsensus(alignPanel); displayNonconservedMenuItem.setState(viewport.getShowUnconserved()); followMouseOverFlag.setState(viewport.isFollowHighlight()); showGroupConsensus.setState(viewport.isShowGroupConsensus()); showGroupConservation.setState(viewport.isShowGroupConservation()); showConsensusHistogram.setState(viewport.isShowConsensusHistogram()); showSequenceLogo.setState(viewport.isShowSequenceLogo()); normSequenceLogo.setState(viewport.isNormaliseSequenceLogo()); applyToAllGroups.setState(viewport.getColourAppliesToAllGroups()); annotationPanelMenuItem.setState(viewport.isShowAnnotation()); showAlignmentAnnotations.setState(viewport.isShowAnnotation()); showSequenceAnnotations.setState(viewport.isShowAnnotation()); seqLimits.setState(viewport.getShowJVSuffix()); if (applet != null) { String param = applet.sortBy; if (param != null) { if (param.equalsIgnoreCase("Id")) { sortIDMenuItem_actionPerformed(); } else if (param.equalsIgnoreCase("Pairwise Identity")) { sortPairwiseMenuItem_actionPerformed(); } else if (param.equalsIgnoreCase("Length")) { sortLengthMenuItem_actionPerformed(); } } param = applet.wrap; if (param != null) { if (param.equalsIgnoreCase("true")) { wrapMenuItem.setState(true); wrapMenuItem_actionPerformed(); } } param = applet.centrecolumnlabels; if (param != null) { centreColumnLabelFlag.setState(true); centreColumnLabelFlag_stateChanged(); } } if (viewport.getAlignment().isNucleotide()) { viewport.updateStrucConsensus(alignPanel); if (viewport.getAlignment().hasRNAStructure()) { RNAHelixColour.setEnabled(true); } else { RNAHelixColour.setEnabled(false); } } else { RNAHelixColour.setEnabled(false); purinePyrimidineColour.setEnabled(false); } // Some JVMS send keyevents to Top frame or lowest panel, // Havent worked out why yet. So add to both this frame and seqCanvas for // now this.addKeyListener(this); alignPanel.seqPanel.seqCanvas.addKeyListener(this); alignPanel.idPanel.idCanvas.addKeyListener(this); alignPanel.scalePanel.addKeyListener(this); alignPanel.annotationPanel.addKeyListener(this); alignPanel.annotationPanelHolder.addKeyListener(this); alignPanel.annotationSpaceFillerHolder.addKeyListener(this); alignPanel.alabels.addKeyListener(this); if (addToDisplay) { addToDisplay(embedded); } } /** * @param embedded */ public void addToDisplay(boolean embedded) { createAlignFrameWindow(embedded); validate(); alignPanel.adjustAnnotationHeight(); alignPanel.paintAlignment(true); } public AlignViewport getAlignViewport() { return viewport; } public SeqCanvas getSeqcanvas() { return alignPanel.seqPanel.seqCanvas; } /** * Load a features file onto the alignment * * @param file * file URL, content, or other resolvable path * @param type * is protocol for accessing data referred to by file */ public boolean parseFeaturesFile(String file, String type) { return parseFeaturesFile(file, type, true); } /** * Load a features file onto the alignment * * @param file * file URL, content, or other resolvable path * @param type * is protocol for accessing data referred to by file * @param autoenabledisplay * when true, display features flag will be automatically enabled if * features are loaded * @return true if data parsed as a features file */ public boolean parseFeaturesFile(String file, String type, boolean autoenabledisplay) { // TODO: test if importing a features file onto an alignment which already // has features with links overwrites the original links. Hashtable featureLinks = new Hashtable(); boolean featuresFile = false; try { featuresFile = new FeaturesFile(file, type) .parse(viewport.getAlignment(), alignPanel.seqPanel.seqCanvas .getFeatureRenderer().getFeatureColours(), featureLinks, true, viewport.applet.getDefaultParameter( "relaxedidmatch", false)); } catch (Exception ex) { ex.printStackTrace(); } if (featuresFile) { if (featureLinks.size() > 0) { alignPanel.seqPanel.seqCanvas.getFeatureRenderer().featureLinks = featureLinks; } if (autoenabledisplay) { viewport.setShowSequenceFeatures(true); sequenceFeatures.setState(true); } if (alignPanel.seqPanel.seqCanvas.fr != null) { // update the min/max ranges where necessary alignPanel.seqPanel.seqCanvas.fr.findAllFeatures(true); } if (viewport.featureSettings != null) { viewport.featureSettings.refreshTable(); } alignPanel.paintAlignment(true); setStatus(MessageManager .getString("label.successfully_added_features_alignment")); } return featuresFile; } @Override public void keyPressed(KeyEvent evt) { if (viewport.cursorMode && ((evt.getKeyCode() >= KeyEvent.VK_0 && evt.getKeyCode() <= KeyEvent.VK_9) || (evt .getKeyCode() >= KeyEvent.VK_NUMPAD0 && evt .getKeyCode() <= KeyEvent.VK_NUMPAD9)) && Character.isDigit(evt.getKeyChar())) { alignPanel.seqPanel.numberPressed(evt.getKeyChar()); } switch (evt.getKeyCode()) { case 27: // escape key deselectAllSequenceMenuItem_actionPerformed(); alignPanel.alabels.cancelDrag(); break; case KeyEvent.VK_X: if (evt.isControlDown() || evt.isMetaDown()) { cut_actionPerformed(); } break; case KeyEvent.VK_C: if (viewport.cursorMode && !evt.isControlDown()) { alignPanel.seqPanel.setCursorColumn(); } if (evt.isControlDown() || evt.isMetaDown()) { copy_actionPerformed(); } break; case KeyEvent.VK_V: if (evt.isControlDown()) { paste(evt.isShiftDown()); } break; case KeyEvent.VK_A: if (evt.isControlDown() || evt.isMetaDown()) { selectAllSequenceMenuItem_actionPerformed(); } break; case KeyEvent.VK_DOWN: if (viewport.cursorMode) { alignPanel.seqPanel.moveCursor(0, 1); } else { moveSelectedSequences(false); } break; case KeyEvent.VK_UP: if (viewport.cursorMode) { alignPanel.seqPanel.moveCursor(0, -1); } else { moveSelectedSequences(true); } break; case KeyEvent.VK_LEFT: if (evt.isAltDown() || !viewport.cursorMode) { slideSequences(false, alignPanel.seqPanel.getKeyboardNo1()); } else { alignPanel.seqPanel.moveCursor(-1, 0); } break; case KeyEvent.VK_RIGHT: if (evt.isAltDown() || !viewport.cursorMode) { slideSequences(true, alignPanel.seqPanel.getKeyboardNo1()); } else { alignPanel.seqPanel.moveCursor(1, 0); } break; case KeyEvent.VK_SPACE: if (viewport.cursorMode) { alignPanel.seqPanel.insertGapAtCursor(evt.isControlDown() || evt.isShiftDown() || evt.isAltDown()); } break; case KeyEvent.VK_DELETE: case KeyEvent.VK_BACK_SPACE: if (viewport.cursorMode) { alignPanel.seqPanel.deleteGapAtCursor(evt.isControlDown() || evt.isShiftDown() || evt.isAltDown()); } else { cut_actionPerformed(); alignPanel.seqPanel.seqCanvas.repaint(); } break; case KeyEvent.VK_S: if (viewport.cursorMode) { alignPanel.seqPanel.setCursorRow(); } break; case KeyEvent.VK_P: if (viewport.cursorMode) { alignPanel.seqPanel.setCursorPosition(); } break; case KeyEvent.VK_ENTER: case KeyEvent.VK_COMMA: if (viewport.cursorMode) { alignPanel.seqPanel.setCursorRowAndColumn(); } break; case KeyEvent.VK_Q: if (viewport.cursorMode) { alignPanel.seqPanel.setSelectionAreaAtCursor(true); } break; case KeyEvent.VK_M: if (viewport.cursorMode) { alignPanel.seqPanel.setSelectionAreaAtCursor(false); } break; case KeyEvent.VK_F2: viewport.cursorMode = !viewport.cursorMode; setStatus(MessageManager.formatMessage( "label.keyboard_editing_mode", new String[] { (viewport.cursorMode ? "on" : "off") })); if (viewport.cursorMode) { alignPanel.seqPanel.seqCanvas.cursorX = viewport.startRes; alignPanel.seqPanel.seqCanvas.cursorY = viewport.startSeq; } break; case KeyEvent.VK_F: if (evt.isControlDown()) { findMenuItem_actionPerformed(); } break; case KeyEvent.VK_H: { boolean toggleSeqs = !evt.isControlDown(); boolean toggleCols = !evt.isShiftDown(); toggleHiddenRegions(toggleSeqs, toggleCols); break; } case KeyEvent.VK_PAGE_UP: if (viewport.getWrapAlignment()) { alignPanel.scrollUp(true); } else { alignPanel.setScrollValues(viewport.startRes, viewport.startSeq - viewport.endSeq + viewport.startSeq); } break; case KeyEvent.VK_PAGE_DOWN: if (viewport.getWrapAlignment()) { alignPanel.scrollUp(false); } else { alignPanel.setScrollValues(viewport.startRes, viewport.startSeq + viewport.endSeq - viewport.startSeq); } break; case KeyEvent.VK_Z: if (evt.isControlDown()) { undoMenuItem_actionPerformed(); } break; case KeyEvent.VK_Y: if (evt.isControlDown()) { redoMenuItem_actionPerformed(); } break; case KeyEvent.VK_L: if (evt.isControlDown()) { trimAlignment(true); } break; case KeyEvent.VK_R: if (evt.isControlDown()) { trimAlignment(false); } break; case KeyEvent.VK_E: if (evt.isControlDown()) { if (evt.isShiftDown()) { this.removeAllGapsMenuItem_actionPerformed(); } else { removeGappedColumnMenuItem_actionPerformed(); } } break; case KeyEvent.VK_I: if (evt.isControlDown()) { if (evt.isAltDown()) { invertColSel_actionPerformed(); } else { invertSequenceMenuItem_actionPerformed(); } } break; case KeyEvent.VK_G: if (evt.isControlDown()) { if (evt.isShiftDown()) { this.unGroup_actionPerformed(); } else { this.createGroup_actionPerformed(); } } break; case KeyEvent.VK_U: if (evt.isControlDown()) { this.deleteGroups_actionPerformed(); } break; case KeyEvent.VK_T: if (evt.isControlDown()) { newView(null); } break; } alignPanel.paintAlignment(true); } /** * called by key handler and the hide all/show all menu items * * @param toggleSeqs * @param toggleCols */ private void toggleHiddenRegions(boolean toggleSeqs, boolean toggleCols) { boolean hide = false; SequenceGroup sg = viewport.getSelectionGroup(); if (!toggleSeqs && !toggleCols) { // Hide everything by the current selection - this is a hack - we do the // invert and then hide // first check that there will be visible columns after the invert. if ((viewport.getColumnSelection() != null && viewport.getColumnSelection().getSelected() != null && viewport .getColumnSelection().getSelected().size() > 0) || (sg != null && sg.getSize() > 0 && sg.getStartRes() <= sg .getEndRes())) { // now invert the sequence set, if required - empty selection implies // that no hiding is required. if (sg != null) { invertSequenceMenuItem_actionPerformed(); sg = viewport.getSelectionGroup(); toggleSeqs = true; } viewport.expandColSelection(sg, true); // finally invert the column selection and get the new sequence // selection and indicate it should be hidden. invertColSel_actionPerformed(); toggleCols = true; } } if (toggleSeqs) { if (sg != null && sg.getSize() != viewport.getAlignment().getHeight()) { hide = true; viewport.hideAllSelectedSeqs(); } else if (!(toggleCols && viewport.getColumnSelection().getSelected() .size() > 0)) { viewport.showAllHiddenSeqs(); } } if (toggleCols) { if (viewport.getColumnSelection().getSelected().size() > 0) { viewport.hideSelectedColumns(); if (!toggleSeqs) { viewport.setSelectionGroup(sg); } } else if (!hide) { viewport.showAllHiddenColumns(); } } } @Override public void keyReleased(KeyEvent evt) { } @Override public void keyTyped(KeyEvent evt) { } @Override public void itemStateChanged(ItemEvent evt) { final Object source = evt.getSource(); if (source == displayNonconservedMenuItem) { displayNonconservedMenuItem_actionPerformed(); } else if (source == colourTextMenuItem) { colourTextMenuItem_actionPerformed(); } else if (source == wrapMenuItem) { wrapMenuItem_actionPerformed(); } else if (source == scaleAbove) { viewport.setScaleAboveWrapped(scaleAbove.getState()); } else if (source == scaleLeft) { viewport.setScaleLeftWrapped(scaleLeft.getState()); } else if (source == scaleRight) { viewport.setScaleRightWrapped(scaleRight.getState()); } else if (source == seqLimits) { seqLimits_itemStateChanged(); } else if (source == viewBoxesMenuItem) { viewport.setShowBoxes(viewBoxesMenuItem.getState()); } else if (source == viewTextMenuItem) { viewport.setShowText(viewTextMenuItem.getState()); } else if (source == renderGapsMenuItem) { viewport.setRenderGaps(renderGapsMenuItem.getState()); } else if (source == annotationPanelMenuItem) { viewport.setShowAnnotation(annotationPanelMenuItem.getState()); alignPanel.setAnnotationVisible(annotationPanelMenuItem.getState()); } else if (source == sequenceFeatures) { viewport.setShowSequenceFeatures(sequenceFeatures.getState()); alignPanel.seqPanel.seqCanvas.repaint(); } else if (source == showAlignmentAnnotations) { setAnnotationsVisibility(); } else if (source == showSequenceAnnotations) { setAnnotationsVisibility(); } else if (source == sortAnnBySequence) { boolean newState = sortAnnBySequence.getState(); sortAnnByLabel.setState(false); setAnnotationSortOrder(newState ? SequenceAnnotationOrder.SEQUENCE_AND_LABEL : SequenceAnnotationOrder.NONE); setViewportAnnotationOrder(); } else if (source == sortAnnByLabel) { boolean newState = sortAnnByLabel.getState(); sortAnnBySequence.setState(false); setAnnotationSortOrder(newState ? SequenceAnnotationOrder.LABEL_AND_SEQUENCE : SequenceAnnotationOrder.NONE); setViewportAnnotationOrder(); } else if (source == showAutoFirst) { showAutoLast.setState(!showAutoFirst.getState()); setShowAutoCalculatedAbove(showAutoFirst.getState()); setViewportAnnotationOrder(); } else if (source == showAutoLast) { showAutoFirst.setState(!showAutoLast.getState()); setShowAutoCalculatedAbove(showAutoFirst.getState()); setViewportAnnotationOrder(); } else if (source == conservationMenuItem) { conservationMenuItem_actionPerformed(); } else if (source == abovePIDThreshold) { abovePIDThreshold_actionPerformed(); } else if (source == applyToAllGroups) { viewport.setColourAppliesToAllGroups(applyToAllGroups.getState()); } else if (source == autoCalculate) { viewport.autoCalculateConsensus = autoCalculate.getState(); } else if (source == sortByTree) { viewport.sortByTree = sortByTree.getState(); } else if (source == this.centreColumnLabelFlag) { centreColumnLabelFlag_stateChanged(); } else if (source == this.followMouseOverFlag) { mouseOverFlag_stateChanged(); } else if (source == showGroupConsensus) { showGroupConsensus_actionPerformed(); } else if (source == showGroupConservation) { showGroupConservation_actionPerformed(); } else if (source == showSequenceLogo) { showSequenceLogo_actionPerformed(); } else if (source == normSequenceLogo) { normSequenceLogo_actionPerformed(); } else if (source == showConsensusHistogram) { showConsensusHistogram_actionPerformed(); } else if (source == applyAutoAnnotationSettings) { applyAutoAnnotationSettings_actionPerformed(); } alignPanel.paintAlignment(true); } /** * Set the visibility state of sequence-related and/or alignment-related * annotations depending on checkbox selections. Repaint after calling. * * @param visible */ private void setAnnotationsVisibility() { boolean showForAlignment = showAlignmentAnnotations.getState(); boolean showForSequences = showSequenceAnnotations.getState(); for (AlignmentAnnotation aa : alignPanel.getAlignment() .getAlignmentAnnotation()) { boolean visible = (aa.sequenceRef == null ? showForAlignment : showForSequences); aa.visible = visible; } alignPanel.validateAnnotationDimensions(true); validate(); repaint(); } private void setAnnotationSortOrder(SequenceAnnotationOrder order) { this.annotationSortOrder = order; } /** * Set flags on the viewport that control annotation ordering */ private void setViewportAnnotationOrder() { this.alignPanel.av.setSortAnnotationsBy(this.annotationSortOrder); this.alignPanel.av .setShowAutocalculatedAbove(this.showAutoCalculatedAbove); } private void setShowAutoCalculatedAbove(boolean showAbove) { this.showAutoCalculatedAbove = showAbove; } private void mouseOverFlag_stateChanged() { viewport.setFollowHighlight(followMouseOverFlag.getState()); // TODO: could kick the scrollTo mechanism to reset view for current // searchresults. } private void centreColumnLabelFlag_stateChanged() { viewport.centreColumnLabels = centreColumnLabelFlag.getState(); this.alignPanel.annotationPanel.repaint(); } @Override public void actionPerformed(ActionEvent evt) { Object source = evt.getSource(); if (source == inputText) { inputText_actionPerformed(); } else if (source == loadTree) { loadTree_actionPerformed(); } else if (source == loadApplication) { launchFullApplication(); } else if (source == loadAnnotations) { loadAnnotations(); } else if (source == outputAnnotations) { outputAnnotations(true); } else if (source == outputFeatures) { outputFeatures(true, "Jalview"); } else if (source == closeMenuItem) { closeMenuItem_actionPerformed(); } else if (source == copy) { copy_actionPerformed(); } else if (source == undoMenuItem) { undoMenuItem_actionPerformed(); } else if (source == redoMenuItem) { redoMenuItem_actionPerformed(); } else if (source == inputText) { inputText_actionPerformed(); } else if (source == closeMenuItem) { closeMenuItem_actionPerformed(); } else if (source == undoMenuItem) { undoMenuItem_actionPerformed(); } else if (source == redoMenuItem) { redoMenuItem_actionPerformed(); } else if (source == copy) { copy_actionPerformed(); } else if (source == pasteNew) { pasteNew_actionPerformed(); } else if (source == pasteThis) { pasteThis_actionPerformed(); } else if (source == cut) { cut_actionPerformed(); } else if (source == delete) { delete_actionPerformed(); } else if (source == grpsFromSelection) { makeGrpsFromSelection_actionPerformed(); } else if (source == deleteGroups) { deleteGroups_actionPerformed(); } else if (source == selectAllSequenceMenuItem) { selectAllSequenceMenuItem_actionPerformed(); } else if (source == deselectAllSequenceMenuItem) { deselectAllSequenceMenuItem_actionPerformed(); } else if (source == invertSequenceMenuItem) { invertSequenceMenuItem_actionPerformed(); } else if (source == invertColSel) { viewport.invertColumnSelection(); alignPanel.paintAlignment(true); } else if (source == remove2LeftMenuItem) { trimAlignment(true); } else if (source == remove2RightMenuItem) { trimAlignment(false); } else if (source == removeGappedColumnMenuItem) { removeGappedColumnMenuItem_actionPerformed(); } else if (source == removeAllGapsMenuItem) { removeAllGapsMenuItem_actionPerformed(); } else if (source == findMenuItem) { findMenuItem_actionPerformed(); } else if (source == font) { new FontChooser(alignPanel); } else if (source == newView) { newView(null); } else if (source == showColumns) { viewport.showAllHiddenColumns(); alignPanel.paintAlignment(true); } else if (source == showSeqs) { viewport.showAllHiddenSeqs(); alignPanel.paintAlignment(true); } else if (source == hideColumns) { viewport.hideSelectedColumns(); alignPanel.paintAlignment(true); } else if (source == hideSequences && viewport.getSelectionGroup() != null) { viewport.hideAllSelectedSeqs(); alignPanel.paintAlignment(true); } else if (source == hideAllButSelection) { toggleHiddenRegions(false, false); alignPanel.paintAlignment(true); } else if (source == hideAllSelection) { SequenceGroup sg = viewport.getSelectionGroup(); viewport.expandColSelection(sg, false); viewport.hideAllSelectedSeqs(); viewport.hideSelectedColumns(); alignPanel.paintAlignment(true); } else if (source == showAllHidden) { viewport.showAllHiddenColumns(); viewport.showAllHiddenSeqs(); alignPanel.paintAlignment(true); } else if (source == showGroupConsensus) { showGroupConsensus_actionPerformed(); } else if (source == showGroupConservation) { showGroupConservation_actionPerformed(); } else if (source == showSequenceLogo) { showSequenceLogo_actionPerformed(); } else if (source == normSequenceLogo) { normSequenceLogo_actionPerformed(); } else if (source == showConsensusHistogram) { showConsensusHistogram_actionPerformed(); } else if (source == applyAutoAnnotationSettings) { applyAutoAnnotationSettings_actionPerformed(); } else if (source == featureSettings) { new FeatureSettings(alignPanel); } else if (source == alProperties) { StringBuffer contents = new AlignmentProperties( viewport.getAlignment()).formatAsString(); CutAndPasteTransfer cap = new CutAndPasteTransfer(false, this); cap.setText(contents.toString()); Frame frame = new Frame(); frame.add(cap); JalviewLite.addFrame(frame, MessageManager.formatMessage( "label.alignment_properties", new String[] { getTitle() }), 400, 250); } else if (source == overviewMenuItem) { overviewMenuItem_actionPerformed(); } else if (source == noColourmenuItem) { changeColour(null); } else if (source == clustalColour) { abovePIDThreshold.setState(false); changeColour(new ClustalxColourScheme(viewport.getAlignment(), null)); } else if (source == zappoColour) { changeColour(new ZappoColourScheme()); } else if (source == taylorColour) { changeColour(new TaylorColourScheme()); } else if (source == hydrophobicityColour) { changeColour(new HydrophobicColourScheme()); } else if (source == helixColour) { changeColour(new HelixColourScheme()); } else if (source == strandColour) { changeColour(new StrandColourScheme()); } else if (source == turnColour) { changeColour(new TurnColourScheme()); } else if (source == buriedColour) { changeColour(new BuriedColourScheme()); } else if (source == nucleotideColour) { changeColour(new NucleotideColourScheme()); } else if (source == purinePyrimidineColour) { changeColour(new PurinePyrimidineColourScheme()); } else if (source == RNAInteractionColour) { changeColour(new RNAInteractionColourScheme()); } else if (source == RNAHelixColour) { new RNAHelicesColourChooser(viewport, alignPanel); } else if (source == modifyPID) { modifyPID_actionPerformed(); } else if (source == modifyConservation) { modifyConservation_actionPerformed(); } else if (source == userDefinedColour) { new UserDefinedColours(alignPanel, null); } else if (source == PIDColour) { changeColour(new PIDColourScheme()); } else if (source == BLOSUM62Colour) { changeColour(new Blosum62ColourScheme()); } else if (source == tcoffeeColour) { changeColour(new TCoffeeColourScheme(alignPanel.getAlignment())); } else if (source == annotationColour) { new AnnotationColourChooser(viewport, alignPanel); } else if (source == annotationColumnSelection) { new AnnotationColumnChooser(viewport, alignPanel); } else if (source == sortPairwiseMenuItem) { sortPairwiseMenuItem_actionPerformed(); } else if (source == sortIDMenuItem) { sortIDMenuItem_actionPerformed(); } else if (source == sortLengthMenuItem) { sortLengthMenuItem_actionPerformed(); } else if (source == sortGroupMenuItem) { sortGroupMenuItem_actionPerformed(); } else if (source == removeRedundancyMenuItem) { removeRedundancyMenuItem_actionPerformed(); } else if (source == pairwiseAlignmentMenuItem) { pairwiseAlignmentMenuItem_actionPerformed(); } else if (source == PCAMenuItem) { PCAMenuItem_actionPerformed(); } else if (source == averageDistanceTreeMenuItem) { averageDistanceTreeMenuItem_actionPerformed(); } else if (source == neighbourTreeMenuItem) { neighbourTreeMenuItem_actionPerformed(); } else if (source == njTreeBlosumMenuItem) { njTreeBlosumMenuItem_actionPerformed(); } else if (source == avDistanceTreeBlosumMenuItem) { avTreeBlosumMenuItem_actionPerformed(); } else if (source == documentation) { documentation_actionPerformed(); } else if (source == about) { about_actionPerformed(); } } public void inputText_actionPerformed() { CutAndPasteTransfer cap = new CutAndPasteTransfer(true, this); Frame frame = new Frame(); frame.add(cap); JalviewLite.addFrame(frame, MessageManager.getString("label.input_cut_paste"), 500, 500); } protected void outputText_actionPerformed(ActionEvent e) { CutAndPasteTransfer cap = new CutAndPasteTransfer(true, this); Frame frame = new Frame(); frame.add(cap); JalviewLite.addFrame(frame, MessageManager.formatMessage( "label.alignment_output_command", new Object[] { e.getActionCommand() }), 600, 500); FeatureRenderer fr = this.alignPanel.cloneFeatureRenderer(); cap.setText(new AppletFormatAdapter(alignPanel).formatSequences( e.getActionCommand(), viewport.getAlignment(), viewport.getShowJVSuffix())); } public void loadAnnotations() { CutAndPasteTransfer cap = new CutAndPasteTransfer(true, this); cap.setText(MessageManager .getString("label.paste_features_annotations_Tcoffee_here")); cap.setAnnotationImport(); Frame frame = new Frame(); frame.add(cap); JalviewLite.addFrame(frame, MessageManager.getString("action.paste_annotations"), 400, 300); } public String outputAnnotations(boolean displayTextbox) { String annotation = new AnnotationFile() .printAnnotationsForView(viewport); if (displayTextbox) { CutAndPasteTransfer cap = new CutAndPasteTransfer(false, this); Frame frame = new Frame(); frame.add(cap); JalviewLite.addFrame(frame, MessageManager.getString("label.annotations"), 600, 500); cap.setText(annotation); } return annotation; } private Map getDisplayedFeatureCols() { if (alignPanel.getFeatureRenderer() != null && viewport.getFeaturesDisplayed()!= null) { return alignPanel.getFeatureRenderer().getDisplayedFeatureCols(); } return null; } public String outputFeatures(boolean displayTextbox, String format) { String features; if (format.equalsIgnoreCase("Jalview")) { features = new FeaturesFile().printJalviewFormat(viewport .getAlignment().getSequencesArray(), getDisplayedFeatureCols()); } else { features = new FeaturesFile().printGFFFormat(viewport.getAlignment() .getSequencesArray(), getDisplayedFeatureCols()); } if (displayTextbox) { boolean frimport = false; if (features == null || features.equals("No Features Visible")) { features = "# No features visible - paste some and import them here."; frimport = true; } CutAndPasteTransfer cap = new CutAndPasteTransfer(frimport, this); if (frimport) { cap.setAnnotationImport(); } Frame frame = new Frame(); frame.add(cap); JalviewLite.addFrame(frame, MessageManager.getString("label.features"), 600, 500); cap.setText(features); } else { if (features == null) { features = ""; } } return features; } void launchFullApplication() { StringBuffer url = new StringBuffer(jalviewServletURL); // allow servlet parameters to be passed in applet parameter String firstSep = url.lastIndexOf("?") > url.lastIndexOf("/") ? "&" : "?"; url.append(firstSep); JalviewLite applet = viewport.applet; String s = applet.startupFile; url.append("open=" + appendProtocol(s)); if (viewport.applet.features != null) { url.append("&features="); url.append(appendProtocol(applet.features)); } if (applet.annotations != null) { url.append("&annotations="); url.append(appendProtocol(applet.annotations)); } if (applet.jnetFile != null) { url.append("&annotations="); url.append(appendProtocol(applet.jnetFile)); } if (applet.defaultColour != null) { url.append("&colour=" + removeWhiteSpace(applet.defaultColour)); } if (applet.userDefinedColour != null) { url.append("&colour=" + removeWhiteSpace(applet .userDefinedColour)); } if (applet.treeFile != null) { url.append("&tree=" + appendProtocol(applet.treeFile)); } showURL(url.toString(), "FULL_APP"); } String removeWhiteSpace(String colour) { StringBuffer sb = new StringBuffer(); for (int i = 0; i < colour.length(); i++) { if (Character.isWhitespace(colour.charAt(i))) { sb.append("%20"); } else { sb.append(colour.charAt(i)); } } return sb.toString(); } String appendProtocol(String url) { try { new URL(url); url = URLEncoder.encode(url); } /* * When we finally deprecate 1.1 compatibility, we can start to use * URLEncoder.encode(url,"UTF-8") and then we'll need this catch: catch * (UnsupportedEncodingException ex) { System.err.println("WARNING - * IMPLEMENTATION ERROR - UNSUPPORTED ENCODING EXCEPTION FOR "+url); * ex.printStackTrace(); } */ catch (java.net.MalformedURLException ex) { url = viewport.applet.getCodeBase() + url; } return url; } public void closeMenuItem_actionPerformed() { PaintRefresher.RemoveComponent(alignPanel); if (alignPanel.seqPanel != null && alignPanel.seqPanel.seqCanvas != null) { PaintRefresher.RemoveComponent(alignPanel.seqPanel.seqCanvas); } if (alignPanel.idPanel != null && alignPanel.idPanel.idCanvas != null) { PaintRefresher.RemoveComponent(alignPanel.idPanel.idCanvas); } if (PaintRefresher.components.size() == 0 && viewport.applet == null) { System.exit(0); } else { } viewport = null; alignPanel = null; this.dispose(); } /** * TODO: JAL-1104 */ void updateEditMenuBar() { if (viewport.getHistoryList().size() > 0) { undoMenuItem.setEnabled(true); CommandI command = viewport.getHistoryList().peek(); undoMenuItem.setLabel(MessageManager.formatMessage( "label.undo_command", new Object[] { command.getDescription() })); } else { undoMenuItem.setEnabled(false); undoMenuItem.setLabel(MessageManager.getString("action.undo")); } if (viewport.getRedoList().size() > 0) { redoMenuItem.setEnabled(true); CommandI command = viewport.getRedoList().peek(); redoMenuItem.setLabel(MessageManager.formatMessage( "label.redo_command", new Object[] { command.getDescription() })); } else { redoMenuItem.setEnabled(false); redoMenuItem.setLabel(MessageManager.getString("action.redo")); } } /** * TODO: JAL-1104 */ @Override public void addHistoryItem(CommandI command) { if (command.getSize() > 0) { viewport.addToHistoryList(command); viewport.clearRedoList(); updateEditMenuBar(); viewport.updateHiddenColumns(); } } /** * TODO: JAL-1104 DOCUMENT ME! * * @param e * DOCUMENT ME! */ protected void undoMenuItem_actionPerformed() { if (viewport.getHistoryList().isEmpty()) { return; } CommandI command = viewport.getHistoryList().pop(); viewport.addToRedoList(command); command.undoCommand(null); AlignmentViewport originalSource = getOriginatingSource(command); // JBPNote Test if (originalSource != viewport) { System.err .println("Warning: Viewport object mismatch whilst undoing"); } originalSource.updateHiddenColumns(); // originalSource.hasHiddenColumns = // viewport.getColumnSelection().getHiddenColumns() // != null; updateEditMenuBar(); originalSource.firePropertyChange("alignment", null, originalSource .getAlignment().getSequences()); } /** * TODO: JAL-1104 DOCUMENT ME! * * @param e * DOCUMENT ME! */ protected void redoMenuItem_actionPerformed() { if (viewport.getRedoList().isEmpty()) { return; } CommandI command = viewport.getRedoList().pop(); viewport.addToHistoryList(command); command.doCommand(null); AlignmentViewport originalSource = getOriginatingSource(command); // JBPNote Test if (originalSource != viewport) { System.err .println("Warning: Viewport object mismatch whilst re-doing"); } originalSource.updateHiddenColumns(); // sethasHiddenColumns(); = // viewport.getColumnSelection().getHiddenColumns() // != null; updateEditMenuBar(); originalSource.firePropertyChange("alignment", null, originalSource .getAlignment().getSequences()); } AlignmentViewport getOriginatingSource(CommandI command) { AlignmentViewport originalSource = null; // For sequence removal and addition, we need to fire // the property change event FROM the viewport where the // original alignment was altered AlignmentI al = null; if (command instanceof EditCommand) { EditCommand editCommand = (EditCommand) command; al = editCommand.getAlignment(); Vector comps = (Vector) PaintRefresher.components.get(viewport .getSequenceSetId()); for (int i = 0; i < comps.size(); i++) { if (comps.elementAt(i) instanceof AlignmentPanel) { if (al == ((AlignmentPanel) comps.elementAt(i)).av.getAlignment()) { originalSource = ((AlignmentPanel) comps.elementAt(i)).av; break; } } } } if (originalSource == null) { // The original view is closed, we must validate // the current view against the closed view first if (al != null) { PaintRefresher.validateSequences(al, viewport.getAlignment()); } originalSource = viewport; } return originalSource; } /** * Move the currently selected sequences up or down one position in the * alignment * * @param up */ public void moveSelectedSequences(boolean up) { SequenceGroup sg = viewport.getSelectionGroup(); if (sg == null) { return; } viewport.getAlignment().moveSelectedSequencesByOne(sg, up ? null : viewport.getHiddenRepSequences(), up); alignPanel.paintAlignment(true); /* * Also move cDNA/protein complement sequences */ AlignViewportI complement = viewport.getCodingComplement(); if (complement != null) { SequenceGroup mappedSelection = MappingUtils.mapSequenceGroup(sg, viewport, complement); complement.getAlignment().moveSelectedSequencesByOne(mappedSelection, up ? null : complement.getHiddenRepSequences(), up); // TODO need to trigger a repaint of the complementary panel - how? // would prefer to handle in SplitFrame but it is not overriding key // listener chiz } } synchronized void slideSequences(boolean right, int size) { List sg = new Vector(); if (viewport.cursorMode) { sg.add(viewport.getAlignment().getSequenceAt( alignPanel.seqPanel.seqCanvas.cursorY)); } else if (viewport.getSelectionGroup() != null && viewport.getSelectionGroup().getSize() != viewport .getAlignment().getHeight()) { sg = viewport.getSelectionGroup().getSequences( viewport.getHiddenRepSequences()); } if (sg.size() < 1) { return; } Vector invertGroup = new Vector(); for (int i = 0; i < viewport.getAlignment().getHeight(); i++) { if (!sg.contains(viewport.getAlignment().getSequenceAt(i))) { invertGroup.addElement(viewport.getAlignment().getSequenceAt(i)); } } SequenceI[] seqs1 = sg.toArray(new SequenceI[sg.size()]); SequenceI[] seqs2 = invertGroup.toArray(new SequenceI[invertGroup .size()]); for (int i = 0; i < invertGroup.size(); i++) { seqs2[i] = invertGroup.elementAt(i); } SlideSequencesCommand ssc; if (right) { ssc = new SlideSequencesCommand("Slide Sequences", seqs2, seqs1, size, viewport.getGapCharacter()); } else { ssc = new SlideSequencesCommand("Slide Sequences", seqs1, seqs2, size, viewport.getGapCharacter()); } int groupAdjustment = 0; if (ssc.getGapsInsertedBegin() && right) { if (viewport.cursorMode) { alignPanel.seqPanel.moveCursor(size, 0); } else { groupAdjustment = size; } } else if (!ssc.getGapsInsertedBegin() && !right) { if (viewport.cursorMode) { alignPanel.seqPanel.moveCursor(-size, 0); } else { groupAdjustment = -size; } } if (groupAdjustment != 0) { viewport.getSelectionGroup().setStartRes( viewport.getSelectionGroup().getStartRes() + groupAdjustment); viewport.getSelectionGroup().setEndRes( viewport.getSelectionGroup().getEndRes() + groupAdjustment); } boolean appendHistoryItem = false; Deque historyList = viewport.getHistoryList(); if (historyList != null && historyList.size() > 0 && historyList.peek() instanceof SlideSequencesCommand) { appendHistoryItem = ssc .appendSlideCommand((SlideSequencesCommand) historyList .peek()); } if (!appendHistoryItem) { addHistoryItem(ssc); } repaint(); } static StringBuffer copiedSequences; static Vector copiedHiddenColumns; protected void copy_actionPerformed() { if (viewport.getSelectionGroup() == null) { return; } SequenceGroup sg = viewport.getSelectionGroup(); copiedSequences = new StringBuffer(); Map orderedSeqs = new HashMap(); for (int i = 0; i < sg.getSize(); i++) { SequenceI seq = sg.getSequenceAt(i); int index = viewport.getAlignment().findIndex(seq); orderedSeqs.put(index, seq); } int index = 0, startRes, endRes; char ch; if (viewport.hasHiddenColumns() && viewport.getSelectionGroup() != null) { copiedHiddenColumns = new Vector(); int hiddenOffset = viewport.getSelectionGroup().getStartRes(); for (int[] region : viewport.getColumnSelection().getHiddenColumns()) { copiedHiddenColumns.addElement(new int[] { region[0] - hiddenOffset, region[1] - hiddenOffset }); } } else { copiedHiddenColumns = null; } for (int i = 0; i < sg.getSize(); i++) { SequenceI seq = null; while (seq == null) { if (orderedSeqs.containsKey(index)) { seq = orderedSeqs.get(index); index++; break; } else { index++; } } // FIND START RES // Returns residue following index if gap startRes = seq.findPosition(sg.getStartRes()); // FIND END RES // Need to find the residue preceeding index if gap endRes = 0; for (int j = 0; j < sg.getEndRes() + 1 && j < seq.getLength(); j++) { ch = seq.getCharAt(j); if (!Comparison.isGap((ch))) { endRes++; } } if (endRes > 0) { endRes += seq.getStart() - 1; } copiedSequences.append(seq.getName() + "\t" + startRes + "\t" + endRes + "\t" + seq.getSequenceAsString(sg.getStartRes(), sg.getEndRes() + 1) + "\n"); } } protected void pasteNew_actionPerformed() { paste(true); } protected void pasteThis_actionPerformed() { paste(false); } void paste(boolean newAlignment) { try { if (copiedSequences == null) { return; } StringTokenizer st = new StringTokenizer(copiedSequences.toString()); Vector seqs = new Vector(); while (st.hasMoreElements()) { String name = st.nextToken(); int start = Integer.parseInt(st.nextToken()); int end = Integer.parseInt(st.nextToken()); seqs.addElement(new Sequence(name, st.nextToken(), start, end)); } SequenceI[] newSeqs = new SequenceI[seqs.size()]; for (int i = 0; i < seqs.size(); i++) { newSeqs[i] = (SequenceI) seqs.elementAt(i); } if (newAlignment) { String newtitle = MessageManager.getString("label.copied_sequences"); if (getTitle().startsWith(MessageManager.getString("label.copied_sequences"))) { newtitle = getTitle(); } else { newtitle = newtitle.concat(MessageManager.formatMessage("label.from_msname", new String[]{getTitle()})); } AlignFrame af = new AlignFrame(new Alignment(newSeqs), viewport.applet, newtitle, false); if (copiedHiddenColumns != null) { for (int i = 0; i < copiedHiddenColumns.size(); i++) { int[] region = (int[]) copiedHiddenColumns.elementAt(i); af.viewport.hideColumns(region[0], region[1]); } } JalviewLite.addFrame(af, newtitle, frameWidth, frameHeight); } else { addSequences(newSeqs); } } catch (Exception ex) { } // could be anything being pasted in here } void addSequences(SequenceI[] seqs) { for (int i = 0; i < seqs.length; i++) { viewport.getAlignment().addSequence(seqs[i]); } // !newAlignment addHistoryItem(new EditCommand( MessageManager.getString("label.add_sequences"), Action.PASTE, seqs, 0, viewport.getAlignment().getWidth(), viewport.getAlignment())); viewport.setEndSeq(viewport.getAlignment().getHeight()); viewport.getAlignment().getWidth(); viewport.firePropertyChange("alignment", null, viewport.getAlignment() .getSequences()); } protected void cut_actionPerformed() { copy_actionPerformed(); delete_actionPerformed(); } protected void delete_actionPerformed() { SequenceGroup sg = viewport.getSelectionGroup(); if (sg == null) { return; } Vector seqs = new Vector(); SequenceI seq; for (int i = 0; i < sg.getSize(); i++) { seq = sg.getSequenceAt(i); seqs.addElement(seq); } // If the cut affects all sequences, remove highlighted columns if (sg.getSize() == viewport.getAlignment().getHeight()) { viewport.getColumnSelection().removeElements(sg.getStartRes(), sg.getEndRes() + 1); } SequenceI[] cut = new SequenceI[seqs.size()]; for (int i = 0; i < seqs.size(); i++) { cut[i] = (SequenceI) seqs.elementAt(i); } /* * //ADD HISTORY ITEM */ addHistoryItem(new EditCommand( MessageManager.getString("label.cut_sequences"), Action.CUT, cut, sg.getStartRes(), sg.getEndRes() - sg.getStartRes() + 1, viewport.getAlignment())); viewport.setSelectionGroup(null); viewport.getAlignment().deleteGroup(sg); viewport.firePropertyChange("alignment", null, viewport.getAlignment() .getSequences()); if (viewport.getAlignment().getHeight() < 1) { this.setVisible(false); } viewport.sendSelection(); } /** * group consensus toggled * */ protected void showGroupConsensus_actionPerformed() { viewport.setShowGroupConsensus(showGroupConsensus.getState()); alignPanel.updateAnnotation(applyAutoAnnotationSettings.getState()); } /** * group conservation toggled. */ protected void showGroupConservation_actionPerformed() { viewport.setShowGroupConservation(showGroupConservation.getState()); alignPanel.updateAnnotation(applyAutoAnnotationSettings.getState()); } /* * (non-Javadoc) * * @see * jalview.jbgui.GAlignFrame#showConsensusHistogram_actionPerformed(java.awt * .event.ActionEvent) */ protected void showConsensusHistogram_actionPerformed() { viewport.setShowConsensusHistogram(showConsensusHistogram.getState()); alignPanel.updateAnnotation(applyAutoAnnotationSettings.getState()); } /* * (non-Javadoc) * * @see * jalview.jbgui.GAlignFrame#showConsensusProfile_actionPerformed(java.awt * .event.ActionEvent) */ protected void showSequenceLogo_actionPerformed() { viewport.setShowSequenceLogo(showSequenceLogo.getState()); alignPanel.updateAnnotation(applyAutoAnnotationSettings.getState()); } protected void normSequenceLogo_actionPerformed() { showSequenceLogo.setState(true); viewport.setShowSequenceLogo(true); viewport.setNormaliseSequenceLogo(normSequenceLogo.getState()); alignPanel.updateAnnotation(applyAutoAnnotationSettings.getState()); } protected void applyAutoAnnotationSettings_actionPerformed() { alignPanel.updateAnnotation(applyAutoAnnotationSettings.getState()); } protected void makeGrpsFromSelection_actionPerformed() { if (avc.makeGroupsFromSelection()) { PaintRefresher.Refresh(this, viewport.getSequenceSetId()); alignPanel.updateAnnotation(); alignPanel.paintAlignment(true); } } protected void createGroup_actionPerformed() { avc.createGroup(); } protected void unGroup_actionPerformed() { if (avc.unGroup()) { alignPanel.alignmentChanged(); } } protected void deleteGroups_actionPerformed() { if (avc.deleteGroups()) { alignPanel.alignmentChanged(); } } public void selectAllSequenceMenuItem_actionPerformed() { SequenceGroup sg = new SequenceGroup(); for (int i = 0; i < viewport.getAlignment().getSequences().size(); i++) { sg.addSequence(viewport.getAlignment().getSequenceAt(i), false); } sg.setEndRes(viewport.getAlignment().getWidth() - 1); viewport.setSelectionGroup(sg); alignPanel.paintAlignment(true); PaintRefresher.Refresh(alignPanel, viewport.getSequenceSetId()); viewport.sendSelection(); } public void deselectAllSequenceMenuItem_actionPerformed() { if (viewport.cursorMode) { alignPanel.seqPanel.keyboardNo1 = null; alignPanel.seqPanel.keyboardNo2 = null; } viewport.setSelectionGroup(null); viewport.getColumnSelection().clear(); viewport.setSelectionGroup(null); alignPanel.idPanel.idCanvas.searchResults = null; alignPanel.seqPanel.seqCanvas.highlightSearchResults(null); alignPanel.paintAlignment(true); PaintRefresher.Refresh(alignPanel, viewport.getSequenceSetId()); viewport.sendSelection(); } public void invertSequenceMenuItem_actionPerformed() { SequenceGroup sg = viewport.getSelectionGroup(); for (int i = 0; i < viewport.getAlignment().getSequences().size(); i++) { sg.addOrRemove(viewport.getAlignment().getSequenceAt(i), false); } PaintRefresher.Refresh(alignPanel, viewport.getSequenceSetId()); viewport.sendSelection(); } public void invertColSel_actionPerformed() { viewport.invertColumnSelection(); alignPanel.paintAlignment(true); PaintRefresher.Refresh(alignPanel, viewport.getSequenceSetId()); viewport.sendSelection(); } void trimAlignment(boolean trimLeft) { ColumnSelection colSel = viewport.getColumnSelection(); int column; if (colSel.size() > 0) { if (trimLeft) { column = colSel.getMin(); } else { column = colSel.getMax(); } SequenceI[] seqs; if (viewport.getSelectionGroup() != null) { seqs = viewport.getSelectionGroup().getSequencesAsArray( viewport.getHiddenRepSequences()); } else { seqs = viewport.getAlignment().getSequencesArray(); } TrimRegionCommand trimRegion; if (trimLeft) { trimRegion = new TrimRegionCommand("Remove Left", TrimRegionCommand.TRIM_LEFT, seqs, column, viewport.getAlignment(), viewport.getColumnSelection(), viewport.getSelectionGroup()); viewport.setStartRes(0); } else { trimRegion = new TrimRegionCommand("Remove Right", TrimRegionCommand.TRIM_RIGHT, seqs, column, viewport.getAlignment(), viewport.getColumnSelection(), viewport.getSelectionGroup()); } setStatus(MessageManager.formatMessage( "label.removed_columns", new String[] { Integer.valueOf(trimRegion.getSize()).toString() })); addHistoryItem(trimRegion); for (SequenceGroup sg : viewport.getAlignment().getGroups()) { if ((trimLeft && !sg.adjustForRemoveLeft(column)) || (!trimLeft && !sg.adjustForRemoveRight(column))) { viewport.getAlignment().deleteGroup(sg); } } viewport.firePropertyChange("alignment", null, viewport .getAlignment().getSequences()); } } public void removeGappedColumnMenuItem_actionPerformed() { int start = 0, end = viewport.getAlignment().getWidth() - 1; SequenceI[] seqs; if (viewport.getSelectionGroup() != null) { seqs = viewport.getSelectionGroup().getSequencesAsArray( viewport.getHiddenRepSequences()); start = viewport.getSelectionGroup().getStartRes(); end = viewport.getSelectionGroup().getEndRes(); } else { seqs = viewport.getAlignment().getSequencesArray(); } RemoveGapColCommand removeGapCols = new RemoveGapColCommand( "Remove Gapped Columns", seqs, start, end, viewport.getAlignment()); addHistoryItem(removeGapCols); setStatus(MessageManager.formatMessage( "label.removed_empty_columns", new String[] { Integer.valueOf(removeGapCols.getSize()).toString() })); // This is to maintain viewport position on first residue // of first sequence SequenceI seq = viewport.getAlignment().getSequenceAt(0); int startRes = seq.findPosition(viewport.startRes); // ShiftList shifts; // viewport.getAlignment().removeGaps(shifts=new ShiftList()); // edit.alColumnChanges=shifts.getInverse(); // if (viewport.hasHiddenColumns) // viewport.getColumnSelection().compensateForEdits(shifts); viewport.setStartRes(seq.findIndex(startRes) - 1); viewport.firePropertyChange("alignment", null, viewport.getAlignment() .getSequences()); } public void removeAllGapsMenuItem_actionPerformed() { int start = 0, end = viewport.getAlignment().getWidth() - 1; SequenceI[] seqs; if (viewport.getSelectionGroup() != null) { seqs = viewport.getSelectionGroup().getSequencesAsArray( viewport.getHiddenRepSequences()); start = viewport.getSelectionGroup().getStartRes(); end = viewport.getSelectionGroup().getEndRes(); } else { seqs = viewport.getAlignment().getSequencesArray(); } // This is to maintain viewport position on first residue // of first sequence SequenceI seq = viewport.getAlignment().getSequenceAt(0); int startRes = seq.findPosition(viewport.startRes); addHistoryItem(new RemoveGapsCommand("Remove Gaps", seqs, start, end, viewport.getAlignment())); viewport.setStartRes(seq.findIndex(startRes) - 1); viewport.firePropertyChange("alignment", null, viewport.getAlignment() .getSequences()); } public void findMenuItem_actionPerformed() { new Finder(alignPanel); } /** * create a new view derived from the current view * * @param viewtitle * @return frame for the new view */ public AlignFrame newView(String viewtitle) { AlignmentI newal; if (viewport.hasHiddenRows()) { newal = new Alignment(viewport.getAlignment().getHiddenSequences() .getFullAlignment().getSequencesArray()); } else { newal = new Alignment(viewport.getAlignment().getSequencesArray()); } if (viewport.getAlignment().getAlignmentAnnotation() != null) { for (int i = 0; i < viewport.getAlignment().getAlignmentAnnotation().length; i++) { if (!viewport.getAlignment().getAlignmentAnnotation()[i].autoCalculated) { newal.addAnnotation(viewport.getAlignment() .getAlignmentAnnotation()[i]); } } } AlignFrame newaf = new AlignFrame(newal, viewport.applet, "", false); newaf.viewport.setSequenceSetId(alignPanel.av.getSequenceSetId()); PaintRefresher.Register(alignPanel, alignPanel.av.getSequenceSetId()); PaintRefresher.Register(newaf.alignPanel, newaf.alignPanel.av.getSequenceSetId()); PaintRefresher.Register(newaf.alignPanel.idPanel.idCanvas, newaf.alignPanel.av.getSequenceSetId()); PaintRefresher.Register(newaf.alignPanel.seqPanel.seqCanvas, newaf.alignPanel.av.getSequenceSetId()); Vector comps = (Vector) PaintRefresher.components.get(viewport .getSequenceSetId()); int viewSize = -1; for (int i = 0; i < comps.size(); i++) { if (comps.elementAt(i) instanceof AlignmentPanel) { viewSize++; } } String title = new String(this.getTitle()); if (viewtitle != null) { title = viewtitle + " ( " + title + ")"; } else { if (title.indexOf("(View") > -1) { title = title.substring(0, title.indexOf("(View")); } title += "(View " + viewSize + ")"; } newaf.setTitle(title.toString()); newaf.viewport.setHistoryList(viewport.getHistoryList()); newaf.viewport.setRedoList(viewport.getRedoList()); return newaf; } /** * * @return list of feature groups on the view */ public String[] getFeatureGroups() { FeatureRenderer fr = null; if (alignPanel != null && (fr = alignPanel.getFeatureRenderer()) != null) { List gps = fr.getFeatureGroups(); String[] _gps = gps.toArray(new String[gps.size()]); return _gps; } return null; } /** * get sequence feature groups that are hidden or shown * * @param visible * true is visible * @return list */ public String[] getFeatureGroupsOfState(boolean visible) { FeatureRenderer fr = null; if (alignPanel != null && (fr = alignPanel.getFeatureRenderer()) != null) { List gps = fr.getGroups(visible); String[] _gps = gps.toArray(new String[gps.size()]); return _gps; } return null; } /** * Change the display state for the given feature groups * * @param groups * list of group strings * @param state * visible or invisible */ public void setFeatureGroupState(String[] groups, boolean state) { FeatureRenderer fr = null; this.sequenceFeatures.setState(true); viewport.setShowSequenceFeatures(true); if (alignPanel != null && (fr = alignPanel.getFeatureRenderer()) != null) { fr.setGroupVisibility(Arrays.asList(groups), state); alignPanel.seqPanel.seqCanvas.repaint(); if (alignPanel.overviewPanel != null) { alignPanel.overviewPanel.updateOverviewImage(); } } } public void seqLimits_itemStateChanged() { viewport.setShowJVSuffix(seqLimits.getState()); alignPanel.fontChanged(); alignPanel.paintAlignment(true); } protected void colourTextMenuItem_actionPerformed() { viewport.setColourText(colourTextMenuItem.getState()); alignPanel.paintAlignment(true); } protected void displayNonconservedMenuItem_actionPerformed() { viewport.setShowUnconserved(displayNonconservedMenuItem.getState()); alignPanel.paintAlignment(true); } protected void wrapMenuItem_actionPerformed() { viewport.setWrapAlignment(wrapMenuItem.getState()); alignPanel.setWrapAlignment(wrapMenuItem.getState()); scaleAbove.setEnabled(wrapMenuItem.getState()); scaleLeft.setEnabled(wrapMenuItem.getState()); scaleRight.setEnabled(wrapMenuItem.getState()); alignPanel.paintAlignment(true); } public void overviewMenuItem_actionPerformed() { if (alignPanel.overviewPanel != null) { return; } Frame frame = new Frame(); OverviewPanel overview = new OverviewPanel(alignPanel); frame.add(overview); // +50 must allow for applet frame window JalviewLite.addFrame(frame, MessageManager.formatMessage( "label.overview_params", new String[] { this.getTitle() }), overview.getPreferredSize().width, overview.getPreferredSize().height + 50); frame.pack(); final AlignmentPanel ap = alignPanel; frame.addWindowListener(new WindowAdapter() { @Override public void windowClosing(WindowEvent e) { if (ap != null) { ap.setOverviewPanel(null); } }; }); alignPanel.setOverviewPanel(overview); } public void changeColour(ColourSchemeI cs) { int threshold = 0; if (cs != null) { if (viewport.getAbovePIDThreshold()) { viewport.setThreshold(SliderPanel.setPIDSliderSource(alignPanel, cs, "Background")); } if (viewport.getConservationSelected()) { cs.setConservationApplied(true); viewport.setIncrement(SliderPanel.setConservationSlider(alignPanel, cs, "Background")); } else { cs.setConservationApplied(false); } } viewport.setGlobalColourScheme(cs); if (alignPanel.getOverviewPanel() != null) { alignPanel.getOverviewPanel().updateOverviewImage(); } StructureSelectionManager.getStructureSelectionManager(viewport.applet) .sequenceColoursChanged(alignPanel); alignPanel.paintAlignment(true); } protected void modifyPID_actionPerformed() { if (viewport.getAbovePIDThreshold() && viewport.getGlobalColourScheme() != null) { SliderPanel.setPIDSliderSource(alignPanel, viewport.getGlobalColourScheme(), "Background"); SliderPanel.showPIDSlider(); } } protected void modifyConservation_actionPerformed() { if (viewport.getConservationSelected() && viewport.getGlobalColourScheme() != null) { SliderPanel.setConservationSlider(alignPanel, viewport.getGlobalColourScheme(), "Background"); SliderPanel.showConservationSlider(); } } protected void conservationMenuItem_actionPerformed() { viewport.setConservationSelected(conservationMenuItem.getState()); viewport.setAbovePIDThreshold(false); abovePIDThreshold.setState(false); changeColour(viewport.getGlobalColourScheme()); modifyConservation_actionPerformed(); } public void abovePIDThreshold_actionPerformed() { viewport.setAbovePIDThreshold(abovePIDThreshold.getState()); conservationMenuItem.setState(false); viewport.setConservationSelected(false); changeColour(viewport.getGlobalColourScheme()); modifyPID_actionPerformed(); } public void sortPairwiseMenuItem_actionPerformed() { SequenceI[] oldOrder = viewport.getAlignment().getSequencesArray(); AlignmentSorter.sortByPID(viewport.getAlignment(), viewport .getAlignment().getSequenceAt(0), null); addHistoryItem(new OrderCommand("Pairwise Sort", oldOrder, viewport.getAlignment())); alignPanel.paintAlignment(true); } public void sortIDMenuItem_actionPerformed() { SequenceI[] oldOrder = viewport.getAlignment().getSequencesArray(); AlignmentSorter.sortByID(viewport.getAlignment()); addHistoryItem(new OrderCommand("ID Sort", oldOrder, viewport.getAlignment())); alignPanel.paintAlignment(true); } public void sortLengthMenuItem_actionPerformed() { SequenceI[] oldOrder = viewport.getAlignment().getSequencesArray(); AlignmentSorter.sortByLength(viewport.getAlignment()); addHistoryItem(new OrderCommand("Length Sort", oldOrder, viewport.getAlignment())); alignPanel.paintAlignment(true); } public void sortGroupMenuItem_actionPerformed() { SequenceI[] oldOrder = viewport.getAlignment().getSequencesArray(); AlignmentSorter.sortByGroup(viewport.getAlignment()); addHistoryItem(new OrderCommand("Group Sort", oldOrder, viewport.getAlignment())); alignPanel.paintAlignment(true); } public void removeRedundancyMenuItem_actionPerformed() { new RedundancyPanel(alignPanel); } public void pairwiseAlignmentMenuItem_actionPerformed() { if (viewport.getSelectionGroup() != null && viewport.getSelectionGroup().getSize() > 1) { Frame frame = new Frame(); frame.add(new PairwiseAlignPanel(alignPanel)); JalviewLite.addFrame(frame, MessageManager.getString("action.pairwise_alignment"), 600, 500); } } public void PCAMenuItem_actionPerformed() { // are the sequences aligned? if (!viewport.getAlignment().isAligned(false)) { SequenceI current; int Width = viewport.getAlignment().getWidth(); for (int i = 0; i < viewport.getAlignment().getSequences().size(); i++) { current = viewport.getAlignment().getSequenceAt(i); if (current.getLength() < Width) { current.insertCharAt(Width - 1, viewport.getGapCharacter()); } } alignPanel.paintAlignment(true); } if ((viewport.getSelectionGroup() != null && viewport.getSelectionGroup().getSize() < 4 && viewport .getSelectionGroup().getSize() > 0) || viewport.getAlignment().getHeight() < 4) { return; } try { new PCAPanel(viewport); } catch (java.lang.OutOfMemoryError ex) { } } public void averageDistanceTreeMenuItem_actionPerformed() { NewTreePanel("AV", "PID", "Average distance tree using PID"); } public void neighbourTreeMenuItem_actionPerformed() { NewTreePanel("NJ", "PID", "Neighbour joining tree using PID"); } protected void njTreeBlosumMenuItem_actionPerformed() { NewTreePanel("NJ", "BL", "Neighbour joining tree using BLOSUM62"); } protected void avTreeBlosumMenuItem_actionPerformed() { NewTreePanel("AV", "BL", "Average distance tree using BLOSUM62"); } void NewTreePanel(String type, String pwType, String title) { // are the sequences aligned? if (!viewport.getAlignment().isAligned(false)) { SequenceI current; int Width = viewport.getAlignment().getWidth(); for (int i = 0; i < viewport.getAlignment().getSequences().size(); i++) { current = viewport.getAlignment().getSequenceAt(i); if (current.getLength() < Width) { current.insertCharAt(Width - 1, viewport.getGapCharacter()); } } alignPanel.paintAlignment(true); } if ((viewport.getSelectionGroup() != null && viewport .getSelectionGroup().getSize() > 1) || (viewport.getAlignment().getHeight() > 1)) { final TreePanel tp = new TreePanel(alignPanel, type, pwType); addTreeMenuItem(tp, title); JalviewLite.addFrame(tp, title, 600, 500); } } void loadTree_actionPerformed() { CutAndPasteTransfer cap = new CutAndPasteTransfer(true, this); cap.setText(MessageManager.getString("label.paste_newick_tree_file")); cap.setTreeImport(); Frame frame = new Frame(); frame.add(cap); JalviewLite.addFrame(frame, MessageManager.getString("label.paste_newick_file"), 400, 300); } public void loadTree(NewickFile tree, String treeFile) { TreePanel tp = new TreePanel(alignPanel, treeFile, MessageManager.getString("label.load_tree_from_file"), tree); JalviewLite.addFrame(tp, treeFile, 600, 500); addTreeMenuItem(tp, treeFile); } /** * sort the alignment using the given treePanel * * @param treePanel * tree used to sort view * @param title * string used for undo event name */ public void sortByTree(TreePanel treePanel, String title) { SequenceI[] oldOrder = viewport.getAlignment().getSequencesArray(); AlignmentSorter .sortByTree(viewport.getAlignment(), treePanel.getTree()); // addHistoryItem(new HistoryItem("Sort", viewport.alignment, // HistoryItem.SORT)); addHistoryItem(new OrderCommand(MessageManager.formatMessage( "label.order_by_params", new String[] { title }), oldOrder, viewport.getAlignment())); alignPanel.paintAlignment(true); } /** * Do any automatic reordering of the alignment and add the necessary bits to * the menu structure for the new tree * * @param treePanel * @param title */ protected void addTreeMenuItem(final TreePanel treePanel, final String title) { final MenuItem item = new MenuItem(title); sortByTreeMenu.add(item); item.addActionListener(new java.awt.event.ActionListener() { @Override public void actionPerformed(ActionEvent evt) { sortByTree(treePanel, title); // treePanel.getTitle()); } }); treePanel.addWindowListener(new WindowAdapter() { @Override public void windowOpened(WindowEvent e) { if (viewport.sortByTree) { sortByTree(treePanel, title); } super.windowOpened(e); } @Override public void windowClosing(WindowEvent e) { sortByTreeMenu.remove(item); }; }); } public boolean sortBy(AlignmentOrder alorder, String undoname) { SequenceI[] oldOrder = viewport.getAlignment().getSequencesArray(); if (viewport.applet.debug) { System.err.println("Sorting " + alorder.getOrder().size() + " in alignment '" + getTitle() + "'"); } AlignmentSorter.sortBy(viewport.getAlignment(), alorder); if (undoname != null) { addHistoryItem(new OrderCommand(undoname, oldOrder, viewport.getAlignment())); } alignPanel.paintAlignment(true); return true; } protected void documentation_actionPerformed() { alignPanel.av.applet.openJalviewHelpUrl(); } protected void about_actionPerformed() { class AboutPanel extends Canvas { String version; String builddate; public AboutPanel(String version, String builddate) { this.version = version; this.builddate = builddate; } @Override public void paintComponent(Graphics g) { g.setColor(Color.white); g.fillRect(0, 0, getSize().width, getSize().height); g.setFont(new Font("Helvetica", Font.PLAIN, 12)); FontMetrics fm = g.getFontMetrics(); int fh = fm.getHeight(); int y = 5, x = 7; g.setColor(Color.black); // TODO: update this text for each release or centrally store it for // lite and application g.setFont(new Font("Helvetica", Font.BOLD, 14)); awt2swing.Util.drawString(g, MessageManager.formatMessage( "label.jalviewLite_release", new String[] { version }), x, y += fh); g.setFont(new Font("Helvetica", Font.BOLD, 12)); awt2swing.Util.drawString(g, MessageManager.formatMessage( "label.jaview_build_date", new String[] { builddate }), x, y += fh); g.setFont(new Font("Helvetica", Font.PLAIN, 12)); awt2swing.Util.drawString(g, MessageManager.getString("label.jalview_authors_1"), x, y += fh * 1.5); awt2swing.Util.drawString(g, MessageManager.getString("label.jalview_authors_2"), x + 50, y += fh + 8); awt2swing.Util.drawString(g, MessageManager.getString("label.jalview_dev_managers"), x, y += fh); awt2swing.Util.drawString(g, MessageManager .getString("label.jalview_distribution_lists"), x, y += fh); awt2swing.Util.drawString(g, MessageManager.getString("label.jalview_please_cite"), x, y += fh + 8); awt2swing.Util.drawString(g, MessageManager.getString("label.jalview_cite_1_authors"), x, y += fh); awt2swing.Util.drawString(g, MessageManager.getString("label.jalview_cite_1_title"), x, y += fh); awt2swing.Util.drawString(g, MessageManager.getString("label.jalview_cite_1_ref"), x, y += fh); } } Frame frame = new Frame(); frame.add(new AboutPanel(JalviewLite.getVersion(), JalviewLite .getBuildDate())); JalviewLite.addFrame(frame, MessageManager.getString("label.jalview"), 580, 220); } public void showURL(String url, String target) { if (viewport.applet == null) { System.out.println("Not running as applet - no browser available."); } else { viewport.applet.showURL(url, target); } } // //////////////////////////////////////////////////////////////////////////////// // JBuilder Graphics here MenuBar alignFrameMenuBar = new MenuBar(); Menu fileMenu = new Menu(MessageManager.getString("action.file")); MenuItem loadApplication = new MenuItem( MessageManager.getString("label.view_full_application")); MenuItem loadTree = new MenuItem( MessageManager.getString("label.load_associated_tree")); MenuItem loadAnnotations = new MenuItem( MessageManager.getString("label.load_features_annotations")); MenuItem outputFeatures = new MenuItem( MessageManager.getString("label.export_features").concat("...")); MenuItem outputAnnotations = new MenuItem( MessageManager.getString("label.export_annotations").concat("...")); MenuItem closeMenuItem = new MenuItem( MessageManager.getString("action.close")); MenuItem selectAllSequenceMenuItem = new MenuItem( MessageManager.getString("action.select_all")); MenuItem deselectAllSequenceMenuItem = new MenuItem( MessageManager.getString("action.deselect_all")); MenuItem invertSequenceMenuItem = new MenuItem( MessageManager.getString("action.invert_selection")); MenuItem remove2LeftMenuItem = new MenuItem(); MenuItem remove2RightMenuItem = new MenuItem(); MenuItem removeGappedColumnMenuItem = new MenuItem(); MenuItem removeAllGapsMenuItem = new MenuItem(); CheckboxMenuItem viewBoxesMenuItem = new CheckboxMenuItem(); CheckboxMenuItem viewTextMenuItem = new CheckboxMenuItem(); MenuItem sortPairwiseMenuItem = new MenuItem(); MenuItem sortIDMenuItem = new MenuItem(); MenuItem sortLengthMenuItem = new MenuItem(); MenuItem sortGroupMenuItem = new MenuItem(); MenuItem removeRedundancyMenuItem = new MenuItem(); MenuItem pairwiseAlignmentMenuItem = new MenuItem(); MenuItem PCAMenuItem = new MenuItem(); MenuItem averageDistanceTreeMenuItem = new MenuItem(); MenuItem neighbourTreeMenuItem = new MenuItem(); BorderLayout borderLayout1 = new BorderLayout(); Label statusBar = new Label(); MenuItem clustalColour = new MenuItem(); MenuItem zappoColour = new MenuItem(); MenuItem taylorColour = new MenuItem(); MenuItem hydrophobicityColour = new MenuItem(); MenuItem helixColour = new MenuItem(); MenuItem strandColour = new MenuItem(); MenuItem turnColour = new MenuItem(); MenuItem buriedColour = new MenuItem(); MenuItem purinePyrimidineColour = new MenuItem(); MenuItem RNAInteractionColour = new MenuItem(); MenuItem RNAHelixColour = new MenuItem(); MenuItem userDefinedColour = new MenuItem(); MenuItem PIDColour = new MenuItem(); MenuItem BLOSUM62Colour = new MenuItem(); MenuItem tcoffeeColour = new MenuItem(); MenuItem njTreeBlosumMenuItem = new MenuItem(); MenuItem avDistanceTreeBlosumMenuItem = new MenuItem(); CheckboxMenuItem annotationPanelMenuItem = new CheckboxMenuItem(); CheckboxMenuItem colourTextMenuItem = new CheckboxMenuItem(); CheckboxMenuItem displayNonconservedMenuItem = new CheckboxMenuItem(); MenuItem alProperties = new MenuItem( MessageManager.getString("label.alignment_props")); MenuItem overviewMenuItem = new MenuItem(); MenuItem undoMenuItem = new MenuItem(); MenuItem redoMenuItem = new MenuItem(); CheckboxMenuItem conservationMenuItem = new CheckboxMenuItem(); MenuItem noColourmenuItem = new MenuItem(); CheckboxMenuItem wrapMenuItem = new CheckboxMenuItem(); CheckboxMenuItem renderGapsMenuItem = new CheckboxMenuItem(); MenuItem findMenuItem = new MenuItem(); CheckboxMenuItem abovePIDThreshold = new CheckboxMenuItem(); MenuItem nucleotideColour = new MenuItem(); MenuItem deleteGroups = new MenuItem(); MenuItem grpsFromSelection = new MenuItem(); MenuItem createGroup = new MenuItem(); MenuItem unGroup = new MenuItem(); MenuItem delete = new MenuItem(); MenuItem copy = new MenuItem(); MenuItem cut = new MenuItem(); Menu pasteMenu = new Menu(); MenuItem pasteNew = new MenuItem(); MenuItem pasteThis = new MenuItem(); CheckboxMenuItem applyToAllGroups = new CheckboxMenuItem(); MenuItem font = new MenuItem(); CheckboxMenuItem scaleAbove = new CheckboxMenuItem(); CheckboxMenuItem scaleLeft = new CheckboxMenuItem(); CheckboxMenuItem scaleRight = new CheckboxMenuItem(); MenuItem modifyPID = new MenuItem(); MenuItem modifyConservation = new MenuItem(); CheckboxMenuItem autoCalculate = null; CheckboxMenuItem sortByTree = new CheckboxMenuItem( "Sort Alignment With New Tree", true); Menu sortByTreeMenu = new Menu(); MenuItem inputText = new MenuItem(); MenuItem documentation = new MenuItem(); MenuItem about = new MenuItem(); CheckboxMenuItem seqLimits = new CheckboxMenuItem(); CheckboxMenuItem centreColumnLabelFlag = new CheckboxMenuItem(); CheckboxMenuItem followMouseOverFlag = new CheckboxMenuItem(); CheckboxMenuItem showSequenceLogo = new CheckboxMenuItem(); CheckboxMenuItem applyAutoAnnotationSettings = new CheckboxMenuItem(); CheckboxMenuItem showConsensusHistogram = new CheckboxMenuItem(); CheckboxMenuItem showGroupConsensus = new CheckboxMenuItem(); CheckboxMenuItem showGroupConservation = new CheckboxMenuItem(); CheckboxMenuItem normSequenceLogo = new CheckboxMenuItem(); /** * Initialise menus and other items * * @throws Exception */ private void jbInit() throws Exception { setMenuBar(alignFrameMenuBar); /* * Configure File menu items and actions */ inputText .setLabel(MessageManager.getString("label.input_from_textbox")); inputText.addActionListener(this); Menu outputTextboxMenu = new Menu( MessageManager.getString("label.out_to_textbox")); for (int i = 0; i < AppletFormatAdapter.WRITEABLE_FORMATS.length; i++) { MenuItem item = new MenuItem(AppletFormatAdapter.WRITEABLE_FORMATS[i]); item.addActionListener(new java.awt.event.ActionListener() { @Override public void actionPerformed(ActionEvent e) { outputText_actionPerformed(e); } }); outputTextboxMenu.add(item); } closeMenuItem.addActionListener(this); loadApplication.addActionListener(this); loadTree.addActionListener(this); loadAnnotations.addActionListener(this); outputFeatures.addActionListener(this); outputAnnotations.addActionListener(this); /* * Configure Edit menu items and actions */ undoMenuItem.setEnabled(false); undoMenuItem.setLabel(MessageManager.getString("action.undo")); undoMenuItem.addActionListener(this); redoMenuItem.setEnabled(false); redoMenuItem.setLabel(MessageManager.getString("action.redo")); redoMenuItem.addActionListener(this); copy.setLabel(MessageManager.getString("action.copy")); copy.addActionListener(this); cut.setLabel(MessageManager.getString("action.cut")); cut.addActionListener(this); delete.setLabel(MessageManager.getString("action.delete")); delete.addActionListener(this); pasteMenu.setLabel(MessageManager.getString("action.paste")); pasteNew.setLabel(MessageManager.getString("label.to_new_alignment")); pasteNew.addActionListener(this); pasteThis.setLabel(MessageManager.getString("label.to_this_alignment")); pasteThis.addActionListener(this); remove2LeftMenuItem.setLabel(MessageManager .getString("action.remove_left")); remove2LeftMenuItem.addActionListener(this); remove2RightMenuItem.setLabel(MessageManager .getString("action.remove_right")); remove2RightMenuItem.addActionListener(this); removeGappedColumnMenuItem.setLabel(MessageManager .getString("action.remove_empty_columns")); removeGappedColumnMenuItem.addActionListener(this); removeAllGapsMenuItem.setLabel(MessageManager .getString("action.remove_all_gaps")); removeAllGapsMenuItem.addActionListener(this); removeRedundancyMenuItem.setLabel(MessageManager.getString( "action.remove_redundancy").concat("...")); removeRedundancyMenuItem.addActionListener(this); /* * Configure Select menu items and actions */ findMenuItem.setLabel(MessageManager.getString("action.find")); findMenuItem.addActionListener(this); selectAllSequenceMenuItem.addActionListener(this); deselectAllSequenceMenuItem.addActionListener(this); invertSequenceMenuItem.setLabel(MessageManager .getString("action.invert_sequence_selection")); invertSequenceMenuItem.addActionListener(this); invertColSel.setLabel(MessageManager .getString("action.invert_column_selection")); invertColSel.addActionListener(this); deleteGroups.setLabel(MessageManager .getString("action.undefine_groups")); deleteGroups.addActionListener(this); grpsFromSelection.setLabel(MessageManager .getString("action.make_groups_selection")); grpsFromSelection.addActionListener(this); createGroup.setLabel(MessageManager.getString("action.create_group")); unGroup.setLabel(MessageManager.getString("action.remove_group")); annotationColumnSelection.setLabel("Select by Annotation"); annotationColumnSelection.addActionListener(this); /* * Configure View menu items and actions */ newView.setLabel(MessageManager.getString("action.new_view")); newView.addActionListener(this); Menu showMenu = new Menu(MessageManager.getString("action.show")); showColumns.setLabel(MessageManager.getString("label.all_columns")); showSeqs.setLabel(MessageManager.getString("label.all_sequences")); Menu hideMenu = new Menu(MessageManager.getString("action.hide")); hideColumns .setLabel(MessageManager.getString("label.selected_columns")); hideSequences.setLabel(MessageManager .getString("label.selected_sequences")); hideAllButSelection.setLabel(MessageManager .getString("label.all_but_selected_region")); hideAllSelection.setLabel(MessageManager .getString("label.selected_region")); showAllHidden.setLabel(MessageManager .getString("label.all_sequences_columns")); showColumns.addActionListener(this); showSeqs.addActionListener(this); hideColumns.addActionListener(this); hideSequences.addActionListener(this); hideAllButSelection.addActionListener(this); hideAllSelection.addActionListener(this); showAllHidden.addActionListener(this); featureSettings.setLabel(MessageManager .getString("label.feature_settings")); featureSettings.addActionListener(this); sequenceFeatures.setLabel(MessageManager .getString("label.show_sequence_features")); sequenceFeatures.addItemListener(this); sequenceFeatures.setState(false); followMouseOverFlag.setLabel(MessageManager .getString("label.automatic_scrolling")); followMouseOverFlag.addItemListener(this); alProperties.addActionListener(this); overviewMenuItem.setLabel(MessageManager .getString("label.overview_window")); overviewMenuItem.addActionListener(this); /* * Configure Annotations menu items and actions */ annotationPanelMenuItem.setLabel(MessageManager .getString("label.show_annotations")); annotationPanelMenuItem.addItemListener(this); showGroupConsensus.setLabel(MessageManager .getString("label.group_consensus")); showGroupConservation.setLabel(MessageManager .getString("label.group_conservation")); showConsensusHistogram.setLabel(MessageManager .getString("label.show_consensus_histogram")); showSequenceLogo.setLabel(MessageManager .getString("label.show_consensus_logo")); normSequenceLogo.setLabel(MessageManager .getString("label.norm_consensus_logo")); applyAutoAnnotationSettings.setLabel(MessageManager .getString("label.apply_all_groups")); applyAutoAnnotationSettings.setState(true); Menu autoAnnMenu = new Menu( MessageManager.getString("label.autocalculated_annotation")); showGroupConsensus.addItemListener(this); showGroupConservation.addItemListener(this); showConsensusHistogram.addItemListener(this); showSequenceLogo.addItemListener(this); normSequenceLogo.addItemListener(this); applyAutoAnnotationSettings.addItemListener(this); showAlignmentAnnotations = new CheckboxMenuItem( MessageManager.getString("label.show_all_al_annotations")); showSequenceAnnotations = new CheckboxMenuItem( MessageManager.getString("label.show_all_seq_annotations")); sortAnnBySequence = new CheckboxMenuItem( MessageManager.getString("label.sort_annotations_by_sequence")); sortAnnByLabel = new CheckboxMenuItem( MessageManager.getString("label.sort_annotations_by_label")); showAutoFirst = new CheckboxMenuItem( MessageManager.getString("label.show_first")); showAutoLast = new CheckboxMenuItem( MessageManager.getString("label.show_last")); showAlignmentAnnotations.addItemListener(this); showSequenceAnnotations.addItemListener(this); sortAnnBySequence.addItemListener(this); sortAnnByLabel.addItemListener(this); showAutoFirst.addItemListener(this); showAutoLast.addItemListener(this); /* * Configure Format menu items and actions */ font.setLabel(MessageManager.getString("action.font")); font.addActionListener(this); scaleAbove.setLabel(MessageManager.getString("action.scale_above")); scaleAbove.setState(true); scaleAbove.setEnabled(false); scaleAbove.addItemListener(this); scaleLeft.setEnabled(false); scaleLeft.setState(true); scaleLeft.setLabel(MessageManager.getString("action.scale_left")); scaleLeft.addItemListener(this); scaleRight.setEnabled(false); scaleRight.setState(true); scaleRight.setLabel(MessageManager.getString("action.scale_right")); scaleRight.addItemListener(this); viewBoxesMenuItem.setLabel(MessageManager.getString("action.boxes")); viewBoxesMenuItem.setState(true); viewBoxesMenuItem.addItemListener(this); viewTextMenuItem.setLabel(MessageManager.getString("action.text")); viewTextMenuItem.setState(true); viewTextMenuItem.addItemListener(this); colourTextMenuItem.setLabel(MessageManager .getString("label.colour_text")); colourTextMenuItem.addItemListener(this); displayNonconservedMenuItem.setLabel(MessageManager .getString("label.show_non_conversed")); displayNonconservedMenuItem.addItemListener(this); wrapMenuItem.setLabel(MessageManager.getString("action.wrap")); wrapMenuItem.addItemListener(this); renderGapsMenuItem.setLabel(MessageManager .getString("action.show_gaps")); renderGapsMenuItem.setState(true); renderGapsMenuItem.addItemListener(this); centreColumnLabelFlag.setLabel(MessageManager .getString("label.centre_column_labels")); centreColumnLabelFlag.addItemListener(this); seqLimits.setState(true); seqLimits.setLabel(MessageManager .getString("label.show_sequence_limits")); seqLimits.addItemListener(this); /* * Configure Colour menu items and actions */ applyToAllGroups.setLabel(MessageManager .getString("label.apply_colour_to_all_groups")); applyToAllGroups.setState(true); applyToAllGroups.addItemListener(this); clustalColour.setLabel(MessageManager.getString("label.clustalx")); clustalColour.addActionListener(this); zappoColour.setLabel(MessageManager.getString("label.zappo")); zappoColour.addActionListener(this); taylorColour.setLabel(MessageManager.getString("label.taylor")); taylorColour.addActionListener(this); hydrophobicityColour.setLabel(MessageManager .getString("label.hydrophobicity")); hydrophobicityColour.addActionListener(this); helixColour .setLabel(MessageManager.getString("label.helix_propensity")); helixColour.addActionListener(this); strandColour.setLabel(MessageManager .getString("label.strand_propensity")); strandColour.addActionListener(this); turnColour.setLabel(MessageManager.getString("label.turn_propensity")); turnColour.addActionListener(this); buriedColour.setLabel(MessageManager.getString("label.buried_index")); buriedColour.addActionListener(this); purinePyrimidineColour.setLabel(MessageManager .getString("label.purine_pyrimidine")); purinePyrimidineColour.addActionListener(this); RNAInteractionColour.setLabel(MessageManager .getString("label.rna_interaction")); RNAInteractionColour.addActionListener(this); RNAHelixColour.setLabel(MessageManager .getString("action.by_rna_helixes")); RNAHelixColour.addActionListener(this); userDefinedColour.setLabel(MessageManager .getString("action.user_defined")); userDefinedColour.addActionListener(this); PIDColour.setLabel(MessageManager .getString("label.percentage_identity")); PIDColour.addActionListener(this); BLOSUM62Colour.setLabel(MessageManager .getString("label.blosum62_score")); BLOSUM62Colour.addActionListener(this); tcoffeeColour .setLabel(MessageManager.getString("label.tcoffee_scores")); // it will be enabled only if a score file is provided tcoffeeColour.setEnabled(false); tcoffeeColour.addActionListener(this); conservationMenuItem.setLabel(MessageManager .getString("action.by_conservation")); conservationMenuItem.addItemListener(this); noColourmenuItem.setLabel(MessageManager.getString("label.none")); noColourmenuItem.addActionListener(this); abovePIDThreshold.setLabel(MessageManager .getString("label.above_identity_threshold")); abovePIDThreshold.addItemListener(this); nucleotideColour.setLabel(MessageManager.getString("label.nucleotide")); nucleotideColour.addActionListener(this); modifyPID.setLabel(MessageManager .getString("label.modify_identity_thereshold")); modifyPID.addActionListener(this); modifyConservation.setLabel(MessageManager .getString("label.modify_conservation_thereshold")); modifyConservation.addActionListener(this); annotationColour.setLabel(MessageManager .getString("action.by_annotation")); annotationColour.addActionListener(this); /* * Configure Calculate menu items and actions */ sortPairwiseMenuItem.setLabel(MessageManager .getString("action.by_pairwise_id")); sortPairwiseMenuItem.addActionListener(this); sortIDMenuItem.setLabel(MessageManager.getString("action.by_id")); sortIDMenuItem.addActionListener(this); sortLengthMenuItem.setLabel(MessageManager .getString("action.by_length")); sortLengthMenuItem.addActionListener(this); sortGroupMenuItem.setLabel(MessageManager.getString("action.by_group")); sortGroupMenuItem.addActionListener(this); pairwiseAlignmentMenuItem.setLabel(MessageManager .getString("action.pairwise_alignment")); pairwiseAlignmentMenuItem.addActionListener(this); PCAMenuItem.setLabel(MessageManager .getString("label.principal_component_analysis")); PCAMenuItem.addActionListener(this); autoCalculate = new CheckboxMenuItem( MessageManager.getString("label.autocalculate_consensus"), true); averageDistanceTreeMenuItem.setLabel(MessageManager .getString("label.average_distance_identity")); averageDistanceTreeMenuItem.addActionListener(this); neighbourTreeMenuItem.setLabel(MessageManager .getString("label.neighbour_joining_identity")); neighbourTreeMenuItem.addActionListener(this); avDistanceTreeBlosumMenuItem.setLabel(MessageManager .getString("label.average_distance_bloslum62")); avDistanceTreeBlosumMenuItem.addActionListener(this); njTreeBlosumMenuItem.setLabel(MessageManager .getString("label.neighbour_blosum62")); njTreeBlosumMenuItem.addActionListener(this); sortByTreeMenu.setLabel(MessageManager .getString("action.by_tree_order")); Menu sortMenu = new Menu(MessageManager.getString("action.sort")); Menu calculateTreeMenu = new Menu( MessageManager.getString("action.calculate_tree")); autoCalculate.addItemListener(this); sortByTree.addItemListener(this); /* * Configure Help menu items and actions */ Menu helpMenu = new Menu(MessageManager.getString("action.help")); documentation.setLabel(MessageManager.getString("label.documentation")); documentation.addActionListener(this); about.setLabel(MessageManager.getString("label.about")); about.addActionListener(this); /* * Add top level menus to frame */ alignFrameMenuBar.add(fileMenu); Menu editMenu = new Menu(MessageManager.getString("action.edit")); alignFrameMenuBar.add(editMenu); Menu selectMenu = new Menu(MessageManager.getString("action.select")); alignFrameMenuBar.add(selectMenu); Menu viewMenu = new Menu(MessageManager.getString("action.view")); alignFrameMenuBar.add(viewMenu); Menu annotationsMenu = new Menu( MessageManager.getString("action.annotations")); alignFrameMenuBar.add(annotationsMenu); Menu formatMenu = new Menu(MessageManager.getString("action.format")); alignFrameMenuBar.add(formatMenu); Menu colourMenu = new Menu(MessageManager.getString("action.colour")); alignFrameMenuBar.add(colourMenu); Menu calculateMenu = new Menu( MessageManager.getString("action.calculate")); alignFrameMenuBar.add(calculateMenu); alignFrameMenuBar.add(helpMenu); /* * File menu */ fileMenu.add(inputText); fileMenu.add(loadTree); fileMenu.add(loadAnnotations); fileMenu.addSeparator(); fileMenu.add(outputTextboxMenu); fileMenu.add(outputFeatures); fileMenu.add(outputAnnotations); if (jalviewServletURL != null) { fileMenu.add(loadApplication); } fileMenu.addSeparator(); fileMenu.add(closeMenuItem); /* * Edit menu */ editMenu.add(undoMenuItem); editMenu.add(redoMenuItem); editMenu.add(cut); editMenu.add(copy); pasteMenu.add(pasteNew); pasteMenu.add(pasteThis); editMenu.add(pasteMenu); editMenu.add(delete); editMenu.addSeparator(); editMenu.add(remove2LeftMenuItem); editMenu.add(remove2RightMenuItem); editMenu.add(removeGappedColumnMenuItem); editMenu.add(removeAllGapsMenuItem); editMenu.add(removeRedundancyMenuItem); /* * Select menu */ selectMenu.add(findMenuItem); selectMenu.addSeparator(); selectMenu.add(selectAllSequenceMenuItem); selectMenu.add(deselectAllSequenceMenuItem); selectMenu.add(invertSequenceMenuItem); selectMenu.add(invertColSel); selectMenu.add(createGroup); selectMenu.add(unGroup); selectMenu.add(grpsFromSelection); selectMenu.add(deleteGroups); selectMenu.add(annotationColumnSelection); /* * View menu */ viewMenu.add(newView); viewMenu.addSeparator(); showMenu.add(showColumns); showMenu.add(showSeqs); showMenu.add(showAllHidden); viewMenu.add(showMenu); hideMenu.add(hideColumns); hideMenu.add(hideSequences); hideMenu.add(hideAllSelection); hideMenu.add(hideAllButSelection); viewMenu.add(hideMenu); viewMenu.addSeparator(); viewMenu.add(followMouseOverFlag); viewMenu.addSeparator(); viewMenu.add(sequenceFeatures); viewMenu.add(featureSettings); viewMenu.addSeparator(); viewMenu.add(alProperties); viewMenu.addSeparator(); viewMenu.add(overviewMenuItem); /* * Annotations menu */ annotationsMenu.add(annotationPanelMenuItem); annotationsMenu.addSeparator(); annotationsMenu.add(showAlignmentAnnotations); annotationsMenu.add(showSequenceAnnotations); annotationsMenu.add(sortAnnBySequence); annotationsMenu.add(sortAnnByLabel); annotationsMenu.addSeparator(); autoAnnMenu.add(showAutoFirst); autoAnnMenu.add(showAutoLast); autoAnnMenu.addSeparator(); autoAnnMenu.add(applyAutoAnnotationSettings); autoAnnMenu.add(showConsensusHistogram); autoAnnMenu.add(showSequenceLogo); autoAnnMenu.add(normSequenceLogo); autoAnnMenu.addSeparator(); autoAnnMenu.add(showGroupConservation); autoAnnMenu.add(showGroupConsensus); annotationsMenu.add(autoAnnMenu); /* * Format menu */ formatMenu.add(font); formatMenu.add(seqLimits); formatMenu.add(wrapMenuItem); formatMenu.add(scaleAbove); formatMenu.add(scaleLeft); formatMenu.add(scaleRight); formatMenu.add(viewBoxesMenuItem); formatMenu.add(viewTextMenuItem); formatMenu.add(colourTextMenuItem); formatMenu.add(displayNonconservedMenuItem); formatMenu.add(renderGapsMenuItem); formatMenu.add(centreColumnLabelFlag); /* * Colour menu */ colourMenu.add(applyToAllGroups); colourMenu.addSeparator(); colourMenu.add(noColourmenuItem); colourMenu.add(clustalColour); colourMenu.add(BLOSUM62Colour); colourMenu.add(PIDColour); colourMenu.add(zappoColour); colourMenu.add(taylorColour); colourMenu.add(hydrophobicityColour); colourMenu.add(helixColour); colourMenu.add(strandColour); colourMenu.add(turnColour); colourMenu.add(buriedColour); colourMenu.add(nucleotideColour); colourMenu.add(purinePyrimidineColour); // colourMenu.add(RNAInteractionColour); colourMenu.add(tcoffeeColour); colourMenu.add(userDefinedColour); colourMenu.addSeparator(); colourMenu.add(conservationMenuItem); colourMenu.add(modifyConservation); colourMenu.add(abovePIDThreshold); colourMenu.add(modifyPID); colourMenu.add(annotationColour); colourMenu.add(RNAHelixColour); /* * Calculate menu */ sortMenu.add(sortIDMenuItem); sortMenu.add(sortLengthMenuItem); sortMenu.add(sortByTreeMenu); sortMenu.add(sortGroupMenuItem); sortMenu.add(sortPairwiseMenuItem); calculateMenu.add(sortMenu); calculateTreeMenu.add(averageDistanceTreeMenuItem); calculateTreeMenu.add(neighbourTreeMenuItem); calculateTreeMenu.add(avDistanceTreeBlosumMenuItem); calculateTreeMenu.add(njTreeBlosumMenuItem); calculateMenu.add(calculateTreeMenu); calculateMenu.addSeparator(); calculateMenu.add(pairwiseAlignmentMenuItem); calculateMenu.add(PCAMenuItem); calculateMenu.add(autoCalculate); calculateMenu.add(sortByTree); /* * Help menu */ helpMenu.add(documentation); helpMenu.add(about); /* * Status bar */ statusBar.setBackground(Color.white); statusBar.setFont(new java.awt.Font("Verdana", 0, 11)); setStatus(MessageManager.getString("label.status_bar")); this.add(statusBar, BorderLayout.SOUTH); } public void setStatus(String string) { statusBar.setText(string); }; MenuItem featureSettings = new MenuItem(); CheckboxMenuItem sequenceFeatures = new CheckboxMenuItem(); MenuItem annotationColour = new MenuItem(); MenuItem annotationColumnSelection = new MenuItem(); MenuItem invertColSel = new MenuItem(); MenuItem showColumns = new MenuItem(); MenuItem showSeqs = new MenuItem(); MenuItem hideColumns = new MenuItem(); MenuItem hideSequences = new MenuItem(); MenuItem hideAllButSelection = new MenuItem(); MenuItem hideAllSelection = new MenuItem(); MenuItem showAllHidden = new MenuItem(); MenuItem newView = new MenuItem(); private CheckboxMenuItem showAlignmentAnnotations; private CheckboxMenuItem showSequenceAnnotations; private CheckboxMenuItem sortAnnBySequence; private CheckboxMenuItem sortAnnByLabel; private CheckboxMenuItem showAutoFirst; private CheckboxMenuItem showAutoLast; private SplitFrame splitFrame; /** * Attach the alignFrame panels after embedding menus, if necessary. This used * to be called setEmbedded, but is now creates the dropdown menus in a * platform independent manner to avoid OSX/Mac menu appendage daftness. * * @param reallyEmbedded * true to attach the view to the applet area on the page rather than * in a new window */ public void createAlignFrameWindow(boolean reallyEmbedded) { if (reallyEmbedded) { embedAlignFrameInApplet(viewport.applet); } else { // ////// // test and embed menu bar if necessary. // if (embedMenuIfNeeded(alignPanel)) { /* * adjust for status bar height too. ? pointless as overridden by layout * manager */ alignPanel.setSize(getSize().width, getSize().height - statusBar.getHeight()); } add(statusBar, BorderLayout.SOUTH); add(alignPanel, BorderLayout.CENTER); // and register with the applet so it can pass external API calls to us JalviewLite.addFrame(this, this.getTitle(), frameWidth, frameHeight); } } /** * Add the components of this AlignFrame to the applet container. * * @param theApplet */ public void embedAlignFrameInApplet(final JalviewLite theApplet) { // //// // Explicitly build the embedded menu panel for the on-page applet // // view cannot be closed if its actually on the page fileMenu.remove(closeMenuItem); fileMenu.remove(3); // Remove Separator // construct embedded menu, using default font embeddedMenu = makeEmbeddedPopupMenu(alignFrameMenuBar, false, false); // and actually add the components to the applet area theApplet.setLayout(new BorderLayout()); theApplet.add(embeddedMenu, BorderLayout.NORTH); theApplet.add(statusBar, BorderLayout.SOUTH); // TODO should size be left to the layout manager? alignPanel.setSize(theApplet.getSize().width, theApplet.getSize().height - embeddedMenu.getHeight() - statusBar.getHeight()); theApplet.add(alignPanel, BorderLayout.CENTER); final AlignFrame me = this; theApplet.addFocusListener(new FocusListener() { @Override public void focusLost(FocusEvent e) { if (theApplet.currentAlignFrame == me) { theApplet.currentAlignFrame = null; } } @Override public void focusGained(FocusEvent e) { theApplet.currentAlignFrame = me; } }); theApplet.validate(); } /** * create a new binding between structures in an existing jmol viewer instance * and an alignpanel with sequences that have existing PDBFile entries. Note, * this does not open a new Jmol window, or modify the display of the * structures in the original jmol window. Note This method doesn't work * without an additional javascript library to exchange messages between the * distinct applets. See http://issues.jalview.org/browse/JAL-621 * * @param viewer * JmolViewer instance * @param sequenceIds * - sequence Ids to search for associations */ public SequenceStructureBinding addStructureViewInstance(Object jmolviewer, String[] sequenceIds) { return null; // Viewer viewer = null; // try // { // viewer = (Viewer) jmolviewer; // } catch (ClassCastException ex) // { // System.err.println("Unsupported viewer object :" // + jmolviewer.getClass()); // } // if (viewer == null) // { // System.err.println("Can't use this object as a structure viewer:" // + jmolviewer.getClass()); // return null; // } // SequenceI[] seqs = null; // if (sequenceIds == null || sequenceIds.length == 0) // { // seqs = viewport.getAlignment().getSequencesArray(); // } // else // { // Vector sqi = new Vector(); // AlignmentI al = viewport.getAlignment(); // for (int sid = 0; sid < sequenceIds.length; sid++) // { // SequenceI sq = al.findName(sequenceIds[sid]); // if (sq != null) // { // sqi.addElement(sq); // } // } // if (sqi.size() > 0) // { // seqs = new SequenceI[sqi.size()]; // for (int sid = 0, sSize = sqi.size(); sid < sSize; sid++) // { // seqs[sid] = (SequenceI) sqi.elementAt(sid); // } // } // else // { // return null; // } // } // AAStructureBindingModel jmv = null; // // TODO: search for a jmv that involves viewer // if (jmv == null) // { // create a new viewer/jalview binding. // jmv = new ExtJmol(viewer, alignPanel, new SequenceI[][] // { seqs }); // } // return jmv; // } /** * bind a pdb file to a sequence in the current view * * @param sequenceId * - sequenceId within the dataset. * @param pdbEntryString * - the short name for the PDB file * @param pdbFile * - pdb file - either a URL or a valid PDB file. * @return true if binding was as success TODO: consider making an exception * structure for indicating when PDB parsing or sequenceId location * fails. */ public boolean addPdbFile(String sequenceId, String pdbEntryString, String pdbFile) { SequenceI toaddpdb = viewport.getAlignment().findName(sequenceId); boolean needtoadd = false; if (toaddpdb != null) { Vector pdbe = toaddpdb.getPDBId(); PDBEntry pdbentry = null; if (pdbe != null && pdbe.size() > 0) { for (int pe = 0, peSize = pdbe.size(); pe < peSize; pe++) { pdbentry = (PDBEntry) pdbe.elementAt(pe); if (!pdbentry.getId().equals(pdbEntryString) && !pdbentry.getFile().equals(pdbFile)) { pdbentry = null; } else { continue; } } } if (pdbentry == null) { pdbentry = new PDBEntry(); pdbentry.setId(pdbEntryString); pdbentry.setFile(pdbFile); needtoadd = true; // add this new entry to sequence. } // resolve data source // TODO: this code should be a refactored to an io package String protocol = AppletFormatAdapter.resolveProtocol(pdbFile, "PDB"); if (protocol == null) { return false; } if (needtoadd) { // make a note of the access mode and add if (pdbentry.getProperty() == null) { pdbentry.setProperty(new Hashtable()); } pdbentry.getProperty().put("protocol", protocol); toaddpdb.addPDBId(pdbentry); alignPanel.getStructureSelectionManager() .registerPDBEntry(pdbentry); } } return true; } private Object[] cleanSeqChainArrays(SequenceI[] seqs, String[] chains) { if (seqs != null) { Vector sequences = new Vector(); for (int i = 0; i < seqs.length; i++) { if (seqs[i] != null) { sequences.addElement(new Object[] { seqs[i], (chains != null) ? chains[i] : null }); } } seqs = new SequenceI[sequences.size()]; chains = new String[sequences.size()]; for (int i = 0, isize = sequences.size(); i < isize; i++) { Object[] oj = (Object[]) sequences.elementAt(i); seqs[i] = (SequenceI) oj[0]; chains[i] = (String) oj[1]; } } return new Object[] { seqs, chains }; } public void newStructureView(JalviewLite applet, PDBEntry pdb, SequenceI[] seqs, String[] chains, String protocol) { // Scrub any null sequences from the array Object[] sqch = cleanSeqChainArrays(seqs, chains); seqs = (SequenceI[]) sqch[0]; chains = (String[]) sqch[1]; if (seqs == null || seqs.length == 0) { System.err .println("JalviewLite.AlignFrame:newStructureView: No sequence to bind structure to."); } if (protocol == null || protocol.trim().length() == 0 || protocol.equals("null")) { protocol = (String) pdb.getProperty().get("protocol"); if (protocol == null) { System.err.println("Couldn't work out protocol to open structure: " + pdb.getId()); return; } } if (applet.useXtrnalSviewer) { // register the association(s) and quit, don't create any windows. if (StructureSelectionManager.getStructureSelectionManager(applet) .setMapping(seqs, chains, pdb.getFile(), protocol) == null) { System.err.println("Failed to map " + pdb.getFile() + " (" + protocol + ") to any sequences"); } return; } if (applet.isAlignPdbStructures() && applet.jmolAvailable) { // can only do alignments with Jmol // find the last jmol window assigned to this alignment AppletJmol ajm = null, tajm; Vector jmols = applet.getAppletWindow(AppletJmol.class); for (int i = 0, iSize = jmols.size(); i < iSize; i++) { tajm = (AppletJmol) jmols.elementAt(i); if (tajm.ap.alignFrame == this) { ajm = tajm; break; } } if (ajm != null) { System.err .println("Incremental adding and aligning structure to existing Jmol view not yet implemented."); // try and add the pdb structure // ajm.addS ajm = null; } } // otherwise, create a new window // if (applet.jmolAvailable) // { new AppletJmol(pdb, seqs, chains, alignPanel, protocol); applet.lastFrameX += 40; applet.lastFrameY += 40; // } // else // { // new MCview.AppletPDBViewer(pdb, seqs, chains, alignPanel, protocol); // } } public void alignedStructureView(JalviewLite applet, PDBEntry[] pdb, SequenceI[][] seqs, String[][] chains, String[] protocols) { // TODO Auto-generated method stub System.err.println("Aligned Structure View: Not yet implemented."); } /** * modify the current selection, providing the user has not made a selection * already. * * @param sel * - sequences from this alignment * @param csel * - columns to be selected on the alignment */ public void select(SequenceGroup sel, ColumnSelection csel) { alignPanel.seqPanel.selection(sel, csel, null); } public void scrollTo(int row, int column) { alignPanel.seqPanel.scrollTo(row, column); } public void scrollToRow(int row) { alignPanel.seqPanel.scrollToRow(row); } public void scrollToColumn(int column) { alignPanel.seqPanel.scrollToColumn(column); } /** * @return the alignments unique ID. */ public String getSequenceSetId() { return viewport.getSequenceSetId(); } /** * Load the (T-Coffee) score file from the specified url * * @param inFile * File/URL/T-COFFEE score file contents * @throws IOException * @return true if alignment was annotated with data from source */ public boolean loadScoreFile(String inFile) throws IOException { TCoffeeScoreFile file = (TCoffeeScoreFile) GenericFileAdapter.getFile("TCoffeeScoreFile", inFile, AppletFormatAdapter.checkProtocol(inFile)); if (!file.isValid()) { // TODO: raise dialog for gui System.err.println("Problems parsing T-Coffee scores: " + file.getWarningMessage()); System.err.println("Origin was:\n" + inFile); return false; } /* * check that the score matrix matches the alignment dimensions */ AlignmentI aln; if ((aln = viewport.getAlignment()) != null && (aln.getHeight() != file.getHeight() || aln.getWidth() != file .getWidth())) { // TODO: raise a dialog box here rather than bomb out. System.err .println("The scores matrix does not match the alignment dimensions"); } // TODO add parameter to indicate if matching should be done if (file.annotateAlignment(alignPanel.getAlignment(), false)) { alignPanel.fontChanged(); tcoffeeColour.setEnabled(true); // switch to this color changeColour(new TCoffeeColourScheme(alignPanel.getAlignment())); return true; } else { System.err.println("Problems resolving T-Coffee scores:"); if (file.getWarningMessage() != null) { System.err.println(file.getWarningMessage()); } } return false; } public SplitFrame getSplitFrame() { return this.splitFrame; } public void setSplitFrame(SplitFrame sf) { this.splitFrame = sf; } // may not need this @Override public void setShowSeqFeatures(boolean b) { // showSeqFeatures.setSelected(b); viewport.setShowSequenceFeatures(b); } @Override public void setMenusForViewport() { // setMenusFromViewport(viewport); } @Override public void refreshFeatureUI(boolean enableIfNecessary) { if (enableIfNecessary) { sequenceFeatures.setState(true); alignPanel.av.setShowSequenceFeatures(true); } } @Override public FeatureSettingsControllerI getFeatureSettingsUI() { return alignPanel.av.featureSettings; } }