/* * Jalview - A Sequence Alignment Editor and Viewer (Version 2.8.1) * Copyright (C) 2014 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.Conservation; import jalview.api.AlignViewControllerGuiI; import jalview.api.AlignViewControllerI; import jalview.api.SequenceStructureBinding; import jalview.bin.JalviewLite; import jalview.commands.CommandI; import jalview.commands.EditCommand; import jalview.commands.OrderCommand; import jalview.commands.RemoveGapColCommand; import jalview.commands.RemoveGapsCommand; import jalview.commands.SlideSequencesCommand; import jalview.commands.TrimRegionCommand; import jalview.datamodel.Alignment; 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.AnnotationFile; import jalview.io.AppletFormatAdapter; import jalview.io.FeaturesFile; import jalview.io.TCoffeeScoreFile; 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.ResidueProperties; 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.util.MessageManager; import java.awt.BorderLayout; import java.awt.Canvas; import java.awt.CheckboxMenuItem; import java.awt.Color; import java.awt.Font; import java.awt.FontMetrics; import java.awt.Frame; import java.awt.Graphics; import java.awt.Label; import java.awt.Menu; import java.awt.MenuBar; import java.awt.MenuItem; 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.Enumeration; import java.util.Hashtable; import java.util.List; import java.util.StringTokenizer; import java.util.Vector; public class AlignFrame extends EmbmenuFrame implements ActionListener, ItemListener, KeyListener, AlignViewControllerGuiI { public AlignViewControllerI avc; public AlignmentPanel alignPanel; public AlignViewport viewport; int DEFAULT_WIDTH = 700; int DEFAULT_HEIGHT = 500; String jalviewServletURL; public AlignFrame(AlignmentI al, jalview.bin.JalviewLite applet, String title, boolean embedded) { if (applet != null) { jalviewServletURL = applet.getParameter("APPLICATION_URL"); } 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.getParameter("windowWidth"); if (param != null) { int width = Integer.parseInt(param); DEFAULT_WIDTH = width; } param = applet.getParameter("windowHeight"); if (param != null) { int height = Integer.parseInt(param); DEFAULT_HEIGHT = height; } } catch (Exception ex) { } } viewport = new AlignViewport(al, applet); alignPanel = new AlignmentPanel(this, viewport); avc = new jalview.controller.AlignViewController(this, viewport, alignPanel); viewport.updateConservation(alignPanel); viewport.updateConsensus(alignPanel); annotationPanelMenuItem.setState(viewport.showAnnotation); displayNonconservedMenuItem.setState(viewport.getShowUnconserved()); followMouseOverFlag.setState(viewport.getFollowHighlight()); showGroupConsensus.setState(viewport.isShowGroupConsensus()); showGroupConservation.setState(viewport.isShowGroupConservation()); showConsensusHistogram.setState(viewport.isShowConsensusHistogram()); showSequenceLogo.setState(viewport.isShowSequenceLogo()); normSequenceLogo.setState(viewport.isNormaliseSequenceLogo()); applyToAllGroups.setState(viewport.getColourAppliesToAllGroups()); seqLimits.setState(viewport.showJVSuffix); if (applet != null) { String param = applet.getParameter("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.getParameter("wrap"); if (param != null) { if (param.equalsIgnoreCase("true")) { wrapMenuItem.setState(true); wrapMenuItem_actionPerformed(); } } param = applet.getParameter("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); createAlignFrameWindow(embedded, title); 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 jalview.io.FeaturesFile(file, type) .parse(viewport.getAlignment(), alignPanel.seqPanel.seqCanvas .getFeatureRenderer().featureColours, 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.showSequenceFeatures = true; sequenceFeatures.setState(true); } if (viewport.featureSettings != null) { viewport.featureSettings.refreshTable(); } alignPanel.paintAlignment(true); statusBar.setText(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; statusBar.setText(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.wrapAlignment) { alignPanel.scrollUp(true); } else { alignPanel.setScrollValues(viewport.startRes, viewport.startSeq - viewport.endSeq + viewport.startSeq); } break; case KeyEvent.VK_PAGE_DOWN: if (viewport.wrapAlignment) { 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) { if (evt.getSource() == displayNonconservedMenuItem) { displayNonconservedMenuItem_actionPerformed(); } else if (evt.getSource() == colourTextMenuItem) { colourTextMenuItem_actionPerformed(); } else if (evt.getSource() == wrapMenuItem) { wrapMenuItem_actionPerformed(); } else if (evt.getSource() == scaleAbove) { viewport.setScaleAboveWrapped(scaleAbove.getState()); } else if (evt.getSource() == scaleLeft) { viewport.setScaleLeftWrapped(scaleLeft.getState()); } else if (evt.getSource() == scaleRight) { viewport.setScaleRightWrapped(scaleRight.getState()); } else if (evt.getSource() == seqLimits) { seqLimits_itemStateChanged(); } else if (evt.getSource() == viewBoxesMenuItem) { viewport.setShowBoxes(viewBoxesMenuItem.getState()); } else if (evt.getSource() == viewTextMenuItem) { viewport.setShowText(viewTextMenuItem.getState()); } else if (evt.getSource() == renderGapsMenuItem) { viewport.setRenderGaps(renderGapsMenuItem.getState()); } else if (evt.getSource() == annotationPanelMenuItem) { viewport.setShowAnnotation(annotationPanelMenuItem.getState()); alignPanel.setAnnotationVisible(annotationPanelMenuItem.getState()); } else if (evt.getSource() == sequenceFeatures) { viewport.showSequenceFeatures(sequenceFeatures.getState()); alignPanel.seqPanel.seqCanvas.repaint(); } else if (evt.getSource() == conservationMenuItem) { conservationMenuItem_actionPerformed(); } else if (evt.getSource() == abovePIDThreshold) { abovePIDThreshold_actionPerformed(); } else if (evt.getSource() == applyToAllGroups) { viewport.setColourAppliesToAllGroups(applyToAllGroups.getState()); } else if (evt.getSource() == autoCalculate) { viewport.autoCalculateConsensus = autoCalculate.getState(); } else if (evt.getSource() == sortByTree) { viewport.sortByTree = sortByTree.getState(); } else if (evt.getSource() == this.centreColumnLabelFlag) { centreColumnLabelFlag_stateChanged(); } else if (evt.getSource() == this.followMouseOverFlag) { mouseOverFlag_stateChanged(); } else if (evt.getSource() == showGroupConsensus) { showGroupConsensus_actionPerformed(); } else if (evt.getSource() == showGroupConservation) { showGroupConservation_actionPerformed(); } else if (evt.getSource() == showSequenceLogo) { showSequenceLogo_actionPerformed(); } else if (evt.getSource() == normSequenceLogo) { normSequenceLogo_actionPerformed(); } else if (evt.getSource() == showConsensusHistogram) { showConsensusHistogram_actionPerformed(); } else if (evt.getSource() == applyAutoAnnotationSettings) { applyAutoAnnotationSettings_actionPerformed(); } alignPanel.paintAlignment(true); } private void mouseOverFlag_stateChanged() { viewport.followHighlight = 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 jalview.io.AlignmentProperties( viewport.getAlignment()).formatAsString(); CutAndPasteTransfer cap = new CutAndPasteTransfer(false, this); cap.setText(contents.toString()); Frame frame = new Frame(); frame.add(cap); jalview.bin.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 == 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 == 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); jalview.bin.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); jalview.bin.JalviewLite.addFrame(frame, MessageManager.formatMessage("label.alignment_output_command", new String[]{e.getActionCommand()}),600, 500); cap.setText(new AppletFormatAdapter().formatSequences( e.getActionCommand(), viewport.getAlignment(), viewport.showJVSuffix)); } 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); jalview.bin.JalviewLite.addFrame(frame, MessageManager.getString("action.paste_annotations"), 400, 300); } public String outputAnnotations(boolean displayTextbox) { String annotation = new AnnotationFile().printAnnotations( viewport.showAnnotation ? viewport.getAlignment() .getAlignmentAnnotation() : null, viewport .getAlignment().getGroups(), ((Alignment) viewport .getAlignment()).alignmentProperties); if (displayTextbox) { CutAndPasteTransfer cap = new CutAndPasteTransfer(false, this); Frame frame = new Frame(); frame.add(cap); jalview.bin.JalviewLite.addFrame(frame, MessageManager.getString("label.annotations"), 600, 500); cap.setText(annotation); } return annotation; } private Hashtable getDisplayedFeatureCols() { if (alignPanel.getFeatureRenderer() != null && viewport.featuresDisplayed != null) { FeatureRenderer fr = alignPanel.getFeatureRenderer(); Hashtable fcols = new Hashtable(); Enumeration en = viewport.featuresDisplayed.keys(); while (en.hasMoreElements()) { Object col = en.nextElement(); fcols.put(col, fr.featureColours.get(col)); } return fcols; } 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); jalview.bin.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); url.append("?open=" + appendProtocol(viewport.applet.getParameter("file"))); if (viewport.applet.getParameter("features") != null) { url.append("&features="); url.append(appendProtocol(viewport.applet.getParameter("features"))); } if (viewport.applet.getParameter("annotations") != null) { url.append("&annotations="); url.append(appendProtocol(viewport.applet.getParameter("annotations"))); } if (viewport.applet.getParameter("jnetfile") != null) { url.append("&annotations="); url.append(appendProtocol(viewport.applet.getParameter("jnetfile"))); } if (viewport.applet.getParameter("defaultColour") != null) { url.append("&colour=" + removeWhiteSpace(viewport.applet .getParameter("defaultColour"))); } if (viewport.applet.getParameter("userDefinedColour") != null) { url.append("&colour=" + removeWhiteSpace(viewport.applet .getParameter("userDefinedColour"))); } if (viewport.applet.getParameter("tree") != null) { url.append("&tree=" + appendProtocol(viewport.applet.getParameter("tree"))); } if (viewport.applet.getParameter("treeFile") != null) { url.append("&tree=" + appendProtocol(viewport.applet.getParameter("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.historyList.size() > 0) { undoMenuItem.setEnabled(true); CommandI command = (CommandI) viewport.historyList.peek(); undoMenuItem.setLabel(MessageManager.formatMessage("label.undo_command", new String[]{command.getDescription()})); } else { undoMenuItem.setEnabled(false); undoMenuItem.setLabel(MessageManager.getString("action.undo")); } if (viewport.redoList.size() > 0) { redoMenuItem.setEnabled(true); CommandI command = (CommandI) viewport.redoList.peek(); redoMenuItem.setLabel(MessageManager.formatMessage("label.redo_command", new String[]{command.getDescription()})); } else { redoMenuItem.setEnabled(false); redoMenuItem.setLabel(MessageManager.getString("action.redo")); } } /** * TODO: JAL-1104 */ public void addHistoryItem(CommandI command) { if (command.getSize() > 0) { viewport.historyList.push(command); viewport.redoList.removeAllElements(); updateEditMenuBar(); viewport.updateHiddenColumns(); } } /** * TODO: JAL-1104 DOCUMENT ME! * * @param e * DOCUMENT ME! */ protected void undoMenuItem_actionPerformed() { if (viewport.historyList.size() < 1) { return; } CommandI command = (CommandI) viewport.historyList.pop(); viewport.redoList.push(command); command.undoCommand(null); AlignViewport 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.redoList.size() < 1) { return; } CommandI command = (CommandI) viewport.redoList.pop(); viewport.historyList.push(command); command.doCommand(null); AlignViewport 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()); } AlignViewport getOriginatingSource(CommandI command) { AlignViewport 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; } 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); } 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; if (viewport.historyList != null && viewport.historyList.size() > 0 && viewport.historyList.peek() instanceof SlideSequencesCommand) { appendHistoryItem = ssc .appendSlideCommand((SlideSequencesCommand) viewport.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(); Hashtable orderedSeqs = new Hashtable(); 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 i = 0; i < viewport.getColumnSelection().getHiddenColumns() .size(); i++) { int[] region = (int[]) viewport.getColumnSelection() .getHiddenColumns().elementAt(i); 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 = (SequenceI) 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 (!jalview.util.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 = new String("Copied sequences"); if (getTitle().startsWith("Copied sequences")) { newtitle = getTitle(); } else { newtitle = newtitle.concat("- from " + 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]); } } jalview.bin.JalviewLite.addFrame(af, newtitle, DEFAULT_WIDTH, DEFAULT_HEIGHT); } 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("Add sequences", EditCommand.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("Cut Sequences", EditCommand.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()); } statusBar.setText(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); statusBar.setText(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.historyList = viewport.historyList; newaf.viewport.redoList = viewport.redoList; return newaf; } /** * * @return list of feature groups on the view */ public String[] getFeatureGroups() { FeatureRenderer fr = null; if (alignPanel != null && (fr = alignPanel.getFeatureRenderer()) != null) { return fr.getGroups(); } 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) { return fr.getGroups(visible); } 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.showSequenceFeatures(true); if (alignPanel != null && (fr = alignPanel.getFeatureRenderer()) != null) { fr.setGroupState(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 jalview.bin.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); } 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(); } jalview.structure.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)); jalview.bin.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); jalview.bin.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); jalview.bin.JalviewLite.addFrame(frame, MessageManager.getString("label.paste_newick_file"), 400, 300); } public void loadTree(jalview.io.NewickFile tree, String treeFile) { TreePanel tp = new TreePanel(alignPanel, treeFile, MessageManager.getString("label.load_tree_from_file"), tree); jalview.bin.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 paint(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)); g.drawString(MessageManager.formatMessage("label.jalviewLite_release", new String[]{version}), x, y += fh); g.setFont(new Font("Helvetica", Font.BOLD, 12)); g.drawString(MessageManager.formatMessage("label.jaview_build_date", new String[]{builddate}), x, y += fh); g.setFont(new Font("Helvetica", Font.PLAIN, 12)); g.drawString( MessageManager.getString("label.jalview_authors_1"), x, y += fh * 1.5); g.drawString(MessageManager.getString("label.jalview_authors_2"), x + 50, y += fh+8); g.drawString( MessageManager.getString("label.jalview_dev_managers"), x, y += fh); g.drawString( MessageManager.getString("label.jalview_distribution_lists"), x, y += fh); g.drawString(MessageManager.getString("label.jalview_please_cite"), x, y += fh + 8); g.drawString( MessageManager.getString("label.jalview_cite_1_authors"), x, y += fh); g.drawString( MessageManager.getString("label.jalview_cite_1_title"), x, y += fh); g.drawString(MessageManager.getString("label.jalview_cite_1_ref"), x, y += fh); } } Frame frame = new Frame(); frame.add(new AboutPanel(JalviewLite.getVersion(), JalviewLite .getBuildDate())); jalview.bin.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")); MenuItem outputAnnotations = new MenuItem(MessageManager.getString("label.export_annotations")); MenuItem closeMenuItem = new MenuItem(MessageManager.getString("action.close")); Menu editMenu = new Menu(MessageManager.getString("action.edit")); Menu viewMenu = new Menu(MessageManager.getString("action.view")); Menu colourMenu = new Menu(MessageManager.getString("action.colour")); Menu calculateMenu = new Menu(MessageManager.getString("action.calculate")); 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(); public Label statusBar = new Label(); Menu outputTextboxMenu = new Menu(); 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 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 = new CheckboxMenuItem( "Autocalculate Consensus", true); CheckboxMenuItem sortByTree = new CheckboxMenuItem( "Sort Alignment With New Tree", true); Menu sortByTreeMenu = new Menu(); Menu sort = new Menu(); Menu calculate = new Menu(); MenuItem inputText = new MenuItem(); Menu helpMenu = new Menu(); MenuItem documentation = new MenuItem(); MenuItem about = new MenuItem(); CheckboxMenuItem seqLimits = new CheckboxMenuItem(); CheckboxMenuItem centreColumnLabelFlag = new CheckboxMenuItem(); CheckboxMenuItem followMouseOverFlag = new CheckboxMenuItem(); Menu autoAnnMenu = new Menu(); CheckboxMenuItem showSequenceLogo = new CheckboxMenuItem(); CheckboxMenuItem applyAutoAnnotationSettings = new CheckboxMenuItem(); CheckboxMenuItem showConsensusHistogram = new CheckboxMenuItem(); CheckboxMenuItem showGroupConsensus = new CheckboxMenuItem(); CheckboxMenuItem showGroupConservation = new CheckboxMenuItem(); CheckboxMenuItem normSequenceLogo = new CheckboxMenuItem(); private void jbInit() throws Exception { setMenuBar(alignFrameMenuBar); MenuItem item; // dynamically fill save as menu with available formats for (int i = 0; i < jalview.io.AppletFormatAdapter.WRITEABLE_FORMATS.length; i++) { item = new MenuItem( jalview.io.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); selectAllSequenceMenuItem.addActionListener(this); deselectAllSequenceMenuItem.addActionListener(this); invertSequenceMenuItem.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); viewBoxesMenuItem.setLabel(MessageManager.getString("action.boxes")); viewBoxesMenuItem.setState(true); viewBoxesMenuItem.addItemListener(this); viewTextMenuItem.setLabel(MessageManager.getString("action.text")); viewTextMenuItem.setState(true); viewTextMenuItem.addItemListener(this); 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); removeRedundancyMenuItem.setLabel(MessageManager.getString("action.remove_redundancy")); removeRedundancyMenuItem.addActionListener(this); pairwiseAlignmentMenuItem.setLabel(MessageManager.getString("action.pairwise_alignment")); pairwiseAlignmentMenuItem.addActionListener(this); PCAMenuItem.setLabel(MessageManager.getString("label.principal_component_analysis")); PCAMenuItem.addActionListener(this); averageDistanceTreeMenuItem .setLabel(MessageManager.getString("label.average_distance_identity")); averageDistanceTreeMenuItem.addActionListener(this); neighbourTreeMenuItem.setLabel(MessageManager.getString("label.neighbour_joining_identity")); neighbourTreeMenuItem.addActionListener(this); statusBar.setBackground(Color.white); statusBar.setFont(new java.awt.Font("Verdana", 0, 11)); statusBar.setText(MessageManager.getString("label.status_bar")); outputTextboxMenu.setLabel(MessageManager.getString("label.out_to_textbox")); 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); 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")); tcoffeeColour.setEnabled(false); // it will enabled only if a score file is // provided tcoffeeColour.addActionListener(this); avDistanceTreeBlosumMenuItem .setLabel(MessageManager.getString("label.average_distance_bloslum62")); avDistanceTreeBlosumMenuItem.addActionListener(this); njTreeBlosumMenuItem.setLabel(MessageManager.getString("label.neighbour_blosum62")); njTreeBlosumMenuItem.addActionListener(this); annotationPanelMenuItem.setLabel(MessageManager.getString("label.show_annotations")); annotationPanelMenuItem.addItemListener(this); colourTextMenuItem.setLabel(MessageManager.getString("label.colour_text")); colourTextMenuItem.addItemListener(this); displayNonconservedMenuItem.setLabel(MessageManager.getString("label.show_non_conversed")); displayNonconservedMenuItem.addItemListener(this); alProperties.addActionListener(this); overviewMenuItem.setLabel(MessageManager.getString("label.overview_window")); overviewMenuItem.addActionListener(this); undoMenuItem.setEnabled(false); undoMenuItem.setLabel(MessageManager.getString("action.undo")); undoMenuItem.addActionListener(this); redoMenuItem.setEnabled(false); redoMenuItem.setLabel(MessageManager.getString("action.redo")); redoMenuItem.addActionListener(this); conservationMenuItem.setLabel(MessageManager.getString("action.by_conservation")); conservationMenuItem.addItemListener(this); noColourmenuItem.setLabel(MessageManager.getString("label.none")); noColourmenuItem.addActionListener(this); wrapMenuItem.setLabel(MessageManager.getString("action.wrap")); wrapMenuItem.addItemListener(this); renderGapsMenuItem.setLabel(MessageManager.getString("action.show_gaps")); renderGapsMenuItem.setState(true); renderGapsMenuItem.addItemListener(this); findMenuItem.setLabel(MessageManager.getString("action.find")); findMenuItem.addActionListener(this); abovePIDThreshold.setLabel(MessageManager.getString("label.above_identity_threshold")); abovePIDThreshold.addItemListener(this); nucleotideColour.setLabel(MessageManager.getString("label.nucleotide")); nucleotideColour.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")); 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); applyToAllGroups.setLabel(MessageManager.getString("label.apply_colour_to_all_groups")); applyToAllGroups.setState(true); applyToAllGroups.addItemListener(this); 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); modifyPID.setLabel(MessageManager.getString("label.modify_identity_thereshold")); modifyPID.addActionListener(this); modifyConservation.setLabel(MessageManager.getString("label.modify_conservation_thereshold")); modifyConservation.addActionListener(this); sortByTreeMenu.setLabel(MessageManager.getString("action.by_tree_order")); sort.setLabel(MessageManager.getString("action.sort")); calculate.setLabel(MessageManager.getString("action.calculate_tree")); autoCalculate.addItemListener(this); sortByTree.addItemListener(this); inputText.setLabel(MessageManager.getString("label.input_from_textbox")); inputText.addActionListener(this); centreColumnLabelFlag.setLabel(MessageManager.getString("label.centre_column_labels")); centreColumnLabelFlag.addItemListener(this); followMouseOverFlag.setLabel(MessageManager.getString("label.automatic_scrolling")); followMouseOverFlag.addItemListener(this); helpMenu.setLabel(MessageManager.getString("action.help")); documentation.setLabel(MessageManager.getString("label.documentation")); documentation.addActionListener(this); about.setLabel(MessageManager.getString("label.about")); about.addActionListener(this); seqLimits.setState(true); seqLimits.setLabel(MessageManager.getString("label.show_sequence_limits")); seqLimits.addItemListener(this); featureSettings.setLabel(MessageManager.getString("label.feature_settings")); featureSettings.addActionListener(this); sequenceFeatures.setLabel(MessageManager.getString("label.sequence_features")); sequenceFeatures.addItemListener(this); sequenceFeatures.setState(false); annotationColour.setLabel(MessageManager.getString("action.by_annotation")); annotationColour.addActionListener(this); invertSequenceMenuItem.setLabel(MessageManager.getString("action.invert_sequence_selection")); invertColSel.setLabel(MessageManager.getString("action.invert_column_selection")); menu1.setLabel(MessageManager.getString("action.show")); showColumns.setLabel(MessageManager.getString("label.all_columns")); showSeqs.setLabel(MessageManager.getString("label.all_sequences")); menu2.setLabel(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")); 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); autoAnnMenu.setLabel(MessageManager.getString("label.autocalculated_annotation")); invertColSel.addActionListener(this); showColumns.addActionListener(this); showSeqs.addActionListener(this); hideColumns.addActionListener(this); hideSequences.addActionListener(this); hideAllButSelection.addActionListener(this); hideAllSelection.addActionListener(this); showAllHidden.addActionListener(this); showGroupConsensus.addItemListener(this); showGroupConservation.addItemListener(this); showConsensusHistogram.addItemListener(this); showSequenceLogo.addItemListener(this); normSequenceLogo.addItemListener(this); applyAutoAnnotationSettings.addItemListener(this); formatMenu.setLabel(MessageManager.getString("action.format")); selectMenu.setLabel(MessageManager.getString("action.select")); newView.setLabel(MessageManager.getString("action.new_view")); newView.addActionListener(this); alignFrameMenuBar.add(fileMenu); alignFrameMenuBar.add(editMenu); alignFrameMenuBar.add(selectMenu); alignFrameMenuBar.add(viewMenu); alignFrameMenuBar.add(formatMenu); alignFrameMenuBar.add(colourMenu); alignFrameMenuBar.add(calculateMenu); alignFrameMenuBar.add(helpMenu); 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); editMenu.add(undoMenuItem); editMenu.add(redoMenuItem); editMenu.add(cut); editMenu.add(copy); editMenu.add(pasteMenu); editMenu.add(delete); editMenu.addSeparator(); editMenu.add(remove2LeftMenuItem); editMenu.add(remove2RightMenuItem); editMenu.add(removeGappedColumnMenuItem); editMenu.add(removeAllGapsMenuItem); editMenu.add(removeRedundancyMenuItem); viewMenu.add(newView); viewMenu.addSeparator(); viewMenu.add(menu1); viewMenu.add(menu2); viewMenu.addSeparator(); viewMenu.add(followMouseOverFlag); viewMenu.add(annotationPanelMenuItem); autoAnnMenu.add(applyAutoAnnotationSettings); autoAnnMenu.add(showConsensusHistogram); autoAnnMenu.add(showSequenceLogo); autoAnnMenu.add(normSequenceLogo); autoAnnMenu.addSeparator(); autoAnnMenu.add(showGroupConservation); autoAnnMenu.add(showGroupConsensus); viewMenu.add(autoAnnMenu); viewMenu.addSeparator(); viewMenu.add(sequenceFeatures); viewMenu.add(featureSettings); viewMenu.addSeparator(); viewMenu.add(alProperties); viewMenu.addSeparator(); viewMenu.add(overviewMenuItem); 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(tcoffeeColour); colourMenu.add(userDefinedColour); colourMenu.addSeparator(); colourMenu.add(conservationMenuItem); colourMenu.add(modifyConservation); colourMenu.add(abovePIDThreshold); colourMenu.add(modifyPID); colourMenu.add(annotationColour); colourMenu.add(RNAHelixColour); calculateMenu.add(sort); calculateMenu.add(calculate); calculateMenu.addSeparator(); calculateMenu.add(pairwiseAlignmentMenuItem); calculateMenu.add(PCAMenuItem); calculateMenu.add(autoCalculate); calculateMenu.add(sortByTree); this.add(statusBar, BorderLayout.SOUTH); pasteMenu.add(pasteNew); pasteMenu.add(pasteThis); sort.add(sortIDMenuItem); sort.add(sortLengthMenuItem); sort.add(sortByTreeMenu); sort.add(sortGroupMenuItem); sort.add(sortPairwiseMenuItem); calculate.add(averageDistanceTreeMenuItem); calculate.add(neighbourTreeMenuItem); calculate.add(avDistanceTreeBlosumMenuItem); calculate.add(njTreeBlosumMenuItem); helpMenu.add(documentation); helpMenu.add(about); menu1.add(showColumns); menu1.add(showSeqs); menu1.add(showAllHidden); menu2.add(hideColumns); menu2.add(hideSequences); menu2.add(hideAllSelection); menu2.add(hideAllButSelection); 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); 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); } public void setStatus(String string) { statusBar.setText(string); }; MenuItem featureSettings = new MenuItem(); CheckboxMenuItem sequenceFeatures = new CheckboxMenuItem(); MenuItem annotationColour = new MenuItem(); MenuItem invertColSel = new MenuItem(); Menu menu1 = new Menu(); MenuItem showColumns = new MenuItem(); MenuItem showSeqs = new MenuItem(); Menu menu2 = new Menu(); MenuItem hideColumns = new MenuItem(); MenuItem hideSequences = new MenuItem(); MenuItem hideAllButSelection = new MenuItem(); MenuItem hideAllSelection = new MenuItem(); MenuItem showAllHidden = new MenuItem(); Menu formatMenu = new Menu(); Menu selectMenu = new Menu(); MenuItem newView = new MenuItem(); /** * 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, String title) { if (reallyEmbedded) { // //// // Explicly 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 Seperator embeddedMenu = makeEmbeddedPopupMenu(alignFrameMenuBar, "Arial", Font.PLAIN, 10, false); // use our own fonts. // and actually add the components to the applet area viewport.applet.setLayout(new BorderLayout()); viewport.applet.add(embeddedMenu, BorderLayout.NORTH); viewport.applet.add(statusBar, BorderLayout.SOUTH); alignPanel.setSize(viewport.applet.getSize().width, viewport.applet.getSize().height - embeddedMenu.HEIGHT - statusBar.HEIGHT); viewport.applet.add(alignPanel, BorderLayout.CENTER); final AlignFrame me = this; viewport.applet.addFocusListener(new FocusListener() { @Override public void focusLost(FocusEvent e) { if (me.viewport.applet.currentAlignFrame == me) { me.viewport.applet.currentAlignFrame = null; } } @Override public void focusGained(FocusEvent e) { me.viewport.applet.currentAlignFrame = me; } }); viewport.applet.validate(); } else { // ////// // test and embed menu bar if necessary. // if (embedMenuIfNeeded(alignPanel)) { // adjust for status bar height too alignPanel.setSize(getSize().width, getSize().height - statusBar.HEIGHT); } add(statusBar, BorderLayout.SOUTH); add(alignPanel, BorderLayout.CENTER); // and register with the applet so it can pass external API calls to us jalview.bin.JalviewLite.addFrame(this, title, DEFAULT_WIDTH, DEFAULT_HEIGHT); } } /** * 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) { org.jmol.api.JmolViewer viewer = null; try { viewer = (org.jmol.api.JmolViewer) 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; } } ExtJmol 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); } } 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 jalview.appletgui.AppletJmol ajm = null, tajm; Vector jmols = applet .getAppletWindow(jalview.appletgui.AppletJmol.class); for (int i = 0, iSize = jmols.size(); i < iSize; i++) { tajm = (jalview.appletgui.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 jalview.appletgui.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 source * File/URL/T-COFFEE score file contents * @throws IOException * @return true if alignment was annotated with data from source */ public boolean loadScoreFile(String source) throws IOException { TCoffeeScoreFile file = new TCoffeeScoreFile(source, AppletFormatAdapter.checkProtocol(source)); if (!file.isValid()) { // TODO: raise dialog for gui System.err.println("Problems parsing T-Coffee scores: " + file.getWarningMessage()); System.err.println("Origin was:\n" + source); 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; } }