/* * Jalview - A Sequence Alignment Editor and Viewer (Version 2.8.2b1) * 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.NJTree; import jalview.api.AlignViewportI; import jalview.bin.JalviewLite; import jalview.datamodel.AlignmentI; import jalview.datamodel.ColumnSelection; import jalview.datamodel.Sequence; import jalview.datamodel.SequenceGroup; import jalview.datamodel.SequenceI; import jalview.schemes.ColourSchemeProperty; import jalview.schemes.UserColourScheme; import jalview.structure.SelectionSource; import jalview.structure.VamsasSource; import jalview.viewmodel.AlignmentViewport; import java.awt.Font; import java.util.Stack; public class AlignViewport extends AlignmentViewport implements AlignViewportI, SelectionSource, VamsasSource { int startRes; int endRes; int startSeq; int endSeq; boolean cursorMode = false; boolean showJVSuffix = true; boolean showText = true; boolean showColourText = false; boolean showBoxes = true; boolean wrapAlignment = false; boolean renderGaps = true; boolean showAnnotation = true; boolean upperCasebold = false; int charHeight; int charWidth; int wrappedWidth; Font font = new Font("SansSerif", Font.PLAIN, 10); boolean validCharWidth = true; int threshold; int increment; NJTree currentTree = null; boolean scaleAboveWrapped = true; boolean scaleLeftWrapped = true; boolean scaleRightWrapped = true; boolean showHiddenMarkers = true; public jalview.bin.JalviewLite applet; boolean MAC = false; Stack historyList = new Stack(); Stack redoList = new Stack(); private AnnotationColumnChooser annotationColumnSelectionState; public void finalize() { applet = null; quality = null; alignment = null; colSel = null; } public AlignViewport(AlignmentI al, JalviewLite applet) { calculator = new jalview.workers.AlignCalcManager(); this.applet = applet; setAlignment(al); // we always pad gaps this.setPadGaps(true); this.startRes = 0; this.endRes = al.getWidth() - 1; this.startSeq = 0; this.endSeq = al.getHeight() - 1; if (applet != null) { // get the width and height scaling factors if they were specified String param = applet.getParameter("widthScale"); if (param != null) { try { widthScale = new Float(param).floatValue(); } catch (Exception e) { } if (widthScale <= 1.0) { System.err .println("Invalid alignment character width scaling factor (" + widthScale + "). Ignoring."); widthScale = 1; } if (applet.debug) { System.err .println("Alignment character width scaling factor is now " + widthScale); } } param = applet.getParameter("heightScale"); if (param != null) { try { heightScale = new Float(param).floatValue(); } catch (Exception e) { } if (heightScale <= 1.0) { System.err .println("Invalid alignment character height scaling factor (" + heightScale + "). Ignoring."); heightScale = 1; } if (applet.debug) { System.err .println("Alignment character height scaling factor is now " + heightScale); } } } setFont(font); MAC = new jalview.util.Platform().isAMac(); if (applet != null) { showJVSuffix = applet.getDefaultParameter("showFullId", showJVSuffix); showAnnotation = applet.getDefaultParameter("showAnnotation", showAnnotation); showConservation = applet.getDefaultParameter("showConservation", showConservation); showQuality = applet.getDefaultParameter("showQuality", showQuality); showConsensus = applet.getDefaultParameter("showConsensus", showConsensus); showUnconserved = applet.getDefaultParameter("showUnconserved", showUnconserved); String param = applet.getParameter("upperCase"); if (param != null) { if (param.equalsIgnoreCase("bold")) { upperCasebold = true; } } sortByTree = applet.getDefaultParameter("sortByTree", sortByTree); followHighlight = applet.getDefaultParameter("automaticScrolling", followHighlight); followSelection = followHighlight; showSequenceLogo = applet.getDefaultParameter("showSequenceLogo", showSequenceLogo); normaliseSequenceLogo = applet.getDefaultParameter( "normaliseSequenceLogo", applet.getDefaultParameter( "normaliseLogo", normaliseSequenceLogo)); showGroupConsensus = applet.getDefaultParameter("showGroupConsensus", showGroupConsensus); showGroupConservation = applet.getDefaultParameter( "showGroupConservation", showGroupConservation); showConsensusHistogram = applet.getDefaultParameter( "showConsensusHistogram", showConsensusHistogram); } if (applet != null) { String colour = applet.getParameter("defaultColour"); if (colour == null) { colour = applet.getParameter("userDefinedColour"); if (colour != null) { colour = "User Defined"; } } if (colour != null) { globalColourScheme = ColourSchemeProperty.getColour(alignment, colour); if (globalColourScheme != null) { globalColourScheme.setConsensus(hconsensus); } } if (applet.getParameter("userDefinedColour") != null) { ((UserColourScheme) globalColourScheme).parseAppletParameter(applet .getParameter("userDefinedColour")); } } initAutoAnnotation(); } /** * get the consensus sequence as displayed under the PID consensus annotation * row. * * @return consensus sequence as a new sequence object */ public SequenceI getConsensusSeq() { if (consensus == null) { updateConsensus(null); } if (consensus == null) { return null; } StringBuffer seqs = new StringBuffer(); for (int i = 0; i < consensus.annotations.length; i++) { if (consensus.annotations[i] != null) { if (consensus.annotations[i].description.charAt(0) == '[') { seqs.append(consensus.annotations[i].description.charAt(1)); } else { seqs.append(consensus.annotations[i].displayCharacter); } } } SequenceI sq = new Sequence("Consensus", seqs.toString()); sq.setDescription("Percentage Identity Consensus " + ((ignoreGapsInConsensusCalculation) ? " without gaps" : "")); return sq; } public int getStartRes() { return startRes; } public int getEndRes() { return endRes; } public int getStartSeq() { return startSeq; } public void setStartRes(int res) { this.startRes = res; } public void setStartSeq(int seq) { this.startSeq = seq; } public void setEndRes(int res) { if (res > alignment.getWidth() - 1) { // log.System.out.println(" Corrected res from " + res + " to maximum " + // (alignment.getWidth()-1)); res = alignment.getWidth() - 1; } if (res < 0) { res = 0; } this.endRes = res; } public void setEndSeq(int seq) { if (seq > alignment.getHeight()) { seq = alignment.getHeight(); } if (seq < 0) { seq = 0; } this.endSeq = seq; } public int getEndSeq() { return endSeq; } java.awt.Frame nullFrame; protected FeatureSettings featureSettings = null; private float heightScale = 1, widthScale = 1; public void setFont(Font f) { font = f; if (nullFrame == null) { nullFrame = new java.awt.Frame(); nullFrame.addNotify(); } java.awt.FontMetrics fm = nullFrame.getGraphics().getFontMetrics(font); setCharHeight((int) (heightScale * fm.getHeight())); charWidth = (int) (widthScale * fm.charWidth('M')); if (upperCasebold) { Font f2 = new Font(f.getName(), Font.BOLD, f.getSize()); fm = nullFrame.getGraphics().getFontMetrics(f2); charWidth = (int) (widthScale * (fm.stringWidth("MMMMMMMMMMM") / 10)); } } public Font getFont() { return font; } public int getCharWidth() { return charWidth; } public void setCharHeight(int h) { this.charHeight = h; } public int getCharHeight() { return charHeight; } public void setWrappedWidth(int w) { this.wrappedWidth = w; } public int getwrappedWidth() { return wrappedWidth; } public AlignmentI getAlignment() { return alignment; } public void setAlignment(AlignmentI align) { this.alignment = align; } public void setWrapAlignment(boolean state) { wrapAlignment = state; } public void setShowText(boolean state) { showText = state; } public void setRenderGaps(boolean state) { renderGaps = state; } public boolean getColourText() { return showColourText; } public void setColourText(boolean state) { showColourText = state; } public void setShowBoxes(boolean state) { showBoxes = state; } public boolean getWrapAlignment() { return wrapAlignment; } public boolean getShowText() { return showText; } public boolean getShowBoxes() { return showBoxes; } public char getGapCharacter() { return getAlignment().getGapCharacter(); } public void setGapCharacter(char gap) { if (getAlignment() != null) { getAlignment().setGapCharacter(gap); } } public void resetSeqLimits(int height) { setEndSeq(height / getCharHeight()); } public void setCurrentTree(NJTree tree) { currentTree = tree; } public NJTree getCurrentTree() { return currentTree; } public boolean getShowJVSuffix() { return showJVSuffix; } public void setShowJVSuffix(boolean b) { showJVSuffix = b; } public boolean getShowAnnotation() { return showAnnotation; } public void setShowAnnotation(boolean b) { showAnnotation = b; } public boolean getScaleAboveWrapped() { return scaleAboveWrapped; } public boolean getScaleLeftWrapped() { return scaleLeftWrapped; } public boolean getScaleRightWrapped() { return scaleRightWrapped; } public void setScaleAboveWrapped(boolean b) { scaleAboveWrapped = b; } public void setScaleLeftWrapped(boolean b) { scaleLeftWrapped = b; } public void setScaleRightWrapped(boolean b) { scaleRightWrapped = b; } public void setIgnoreGapsConsensus(boolean b) { ignoreGapsInConsensusCalculation = b; updateConsensus(null); if (globalColourScheme != null) { globalColourScheme.setThreshold(globalColourScheme.getThreshold(), ignoreGapsInConsensusCalculation); } } public boolean getShowHiddenMarkers() { return showHiddenMarkers; } public void setShowHiddenMarkers(boolean show) { showHiddenMarkers = show; } boolean centreColumnLabels; public boolean getCentreColumnLabels() { return centreColumnLabels; } public boolean followHighlight = true; public boolean getFollowHighlight() { return followHighlight; } public boolean followSelection = true; /** * @return true if view selection should always follow the selections * broadcast by other selection sources */ public boolean getFollowSelection() { return followSelection; } public void sendSelection() { jalview.structure.StructureSelectionManager .getStructureSelectionManager(applet).sendSelection( new SequenceGroup(getSelectionGroup()), new ColumnSelection(getColumnSelection()), this); } /** * synthesize a column selection if none exists so it covers the given * selection group. if wholewidth is false, no column selection is made if the * selection group covers the whole alignment width. * * @param sg * @param wholewidth */ public void expandColSelection(SequenceGroup sg, boolean wholewidth) { int sgs, sge; if (sg != null && (sgs = sg.getStartRes()) >= 0 && sg.getStartRes() <= (sge = sg.getEndRes()) && (colSel == null || colSel.getSelected() == null || colSel .getSelected().size() == 0)) { if (!wholewidth && alignment.getWidth() == (1 + sge - sgs)) { // do nothing return; } if (colSel == null) { colSel = new ColumnSelection(); } for (int cspos = sg.getStartRes(); cspos <= sg.getEndRes(); cspos++) { colSel.addElement(cspos); } } } public boolean isNormaliseSequenceLogo() { return normaliseSequenceLogo; } public void setNormaliseSequenceLogo(boolean state) { normaliseSequenceLogo = state; } /** * * @return true if alignment characters should be displayed */ public boolean isValidCharWidth() { return validCharWidth; } public AnnotationColumnChooser getAnnotationColumnSelectionState() { return annotationColumnSelectionState; } public void setAnnotationColumnSelectionState( AnnotationColumnChooser annotationColumnSelectionState) { this.annotationColumnSelectionState = annotationColumnSelectionState; } }