/*
- * Jalview - A Sequence Alignment Editor and Viewer (Version 2.7)
- * Copyright (C) 2011 J Procter, AM Waterhouse, J Engelhardt, LM Lui, G Barton, M Clamp, S Searle
+ * Jalview - A Sequence Alignment Editor and Viewer ($$Version-Rel$$)
+ * Copyright (C) $$Year-Rel$$ The Jalview Authors
*
* This file is part of Jalview.
*
* Jalview is free software: you can redistribute it and/or
* modify it under the terms of the GNU General Public License
- * as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version.
- *
+ * 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 <http://www.gnu.org/licenses/>.
+ * You should have received a copy of the GNU General Public License
+ * along with Jalview. If not, see <http://www.gnu.org/licenses/>.
+ * The Jalview Authors are detailed in the 'AUTHORS' file.
*/
package jalview.appletgui;
-import java.util.*;
-
-import java.awt.*;
-
-import jalview.analysis.*;
-import jalview.api.AlignCalcManagerI;
import jalview.api.AlignViewportI;
-import jalview.bin.*;
-import jalview.datamodel.*;
-import jalview.schemes.*;
+import jalview.api.FeatureSettingsModelI;
+import jalview.bin.JalviewLite;
+import jalview.commands.CommandI;
+import jalview.datamodel.AlignmentI;
+import jalview.datamodel.Annotation;
+import jalview.datamodel.ColumnSelection;
+import jalview.datamodel.HiddenColumns;
+import jalview.datamodel.SearchResults;
+import jalview.datamodel.SearchResultsI;
+import jalview.datamodel.Sequence;
+import jalview.datamodel.SequenceGroup;
+import jalview.datamodel.SequenceI;
+import jalview.renderer.ResidueShader;
+import jalview.schemes.ColourSchemeProperty;
+import jalview.schemes.UserColourScheme;
import jalview.structure.SelectionSource;
+import jalview.structure.StructureSelectionManager;
import jalview.structure.VamsasSource;
import jalview.viewmodel.AlignmentViewport;
-import jalview.workers.ConservationThread;
-import jalview.workers.ConsensusThread;
-
-public class AlignViewport extends AlignmentViewport implements AlignViewportI, SelectionSource, VamsasSource
-{
- int startRes;
- int endRes;
-
- int startSeq;
-
- int endSeq;
+import java.awt.Font;
+import java.awt.FontMetrics;
+public class AlignViewport extends AlignmentViewport
+ implements SelectionSource
+{
boolean cursorMode = false;
- boolean showJVSuffix = true;
-
- boolean showText = true;
-
- boolean showColourText = false;
-
- boolean showBoxes = true;
-
- boolean wrapAlignment = false;
-
- boolean renderGaps = true;
-
- boolean showSequenceFeatures = false;
-
- boolean showAnnotation = true;
-
- boolean upperCasebold = false;
-
- boolean colourAppliesToAllGroups = true;
-
- boolean conservationColourSelected = false;
-
- boolean abovePIDThreshold = 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;
-
- // The following vector holds the features which are
- // currently visible, in the correct order or rendering
- public Hashtable featuresDisplayed;
-
-
- boolean showHiddenMarkers = true;
-
public jalview.bin.JalviewLite applet;
- Hashtable sequenceColours;
-
boolean MAC = false;
- Stack historyList = new Stack();
-
- Stack redoList = new Stack();
-
- public void finalize() {
- applet=null;
- quality=null;
- alignment=null;
- colSel=null;
- }
+ private AnnotationColumnChooser annotationColumnSelectionState;
public AlignViewport(AlignmentI al, JalviewLite applet)
{
+ super(al);
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
}
if (widthScale <= 1.0)
{
- System.err
- .println("Invalid alignment character width scaling factor ("
+ System.err.println(
+ "Invalid alignment character width scaling factor ("
+ widthScale + "). Ignoring.");
widthScale = 1;
}
- if (applet.debug)
+ if (JalviewLite.debug)
{
- System.err
- .println("Alignment character width scaling factor is now "
+ System.err.println(
+ "Alignment character width scaling factor is now "
+ widthScale);
}
}
}
if (heightScale <= 1.0)
{
- System.err
- .println("Invalid alignment character height scaling factor ("
+ System.err.println(
+ "Invalid alignment character height scaling factor ("
+ heightScale + "). Ignoring.");
heightScale = 1;
}
- if (applet.debug)
+ if (JalviewLite.debug)
{
- System.err
- .println("Alignment character height scaling factor is now "
+ System.err.println(
+ "Alignment character height scaling factor is now "
+ heightScale);
}
}
}
- setFont(font);
+ setFont(font, true);
MAC = new jalview.util.Platform().isAMac();
if (applet != null)
{
- showJVSuffix = applet.getDefaultParameter("showFullId", showJVSuffix);
+ setShowJVSuffix(
+ applet.getDefaultParameter("showFullId", getShowJVSuffix()));
+
+ setShowAnnotation(applet.getDefaultParameter("showAnnotation",
+ isShowAnnotation()));
+
+ showConservation = applet.getDefaultParameter("showConservation",
+ showConservation);
- showAnnotation = applet.getDefaultParameter("showAnnotation", showAnnotation);
-
- showConservation = applet.getDefaultParameter("showConservation", showConservation);
-
showQuality = applet.getDefaultParameter("showQuality", showQuality);
- showConsensus = applet.getDefaultParameter("showConsensus", showConsensus);
+ showConsensus = applet.getDefaultParameter("showConsensus",
+ showConsensus);
+
+ showOccupancy = applet.getDefaultParameter("showOccupancy",
+ showOccupancy);
- showUnconserved = applet.getDefaultParameter("showUnconserved", showUnconserved);
+ setShowUnconserved(applet.getDefaultParameter("showUnconserved",
+ getShowUnconserved()));
+
+ setScaleProteinAsCdna(applet.getDefaultParameter("scaleProteinAsCdna",
+ isScaleProteinAsCdna()));
String param = applet.getParameter("upperCase");
if (param != null)
{
if (param.equalsIgnoreCase("bold"))
{
- upperCasebold = true;
+ setUpperCasebold(true);
}
}
sortByTree = applet.getDefaultParameter("sortByTree", sortByTree);
- followHighlight = applet.getDefaultParameter("automaticScrolling",followHighlight);
- followSelection = followHighlight;
+ setFollowHighlight(applet.getDefaultParameter("automaticScrolling",
+ isFollowHighlight()));
+ followSelection = isFollowHighlight();
+
+ showSequenceLogo = applet.getDefaultParameter("showSequenceLogo",
+ showSequenceLogo);
+
+ normaliseSequenceLogo = applet.getDefaultParameter(
+ "normaliseSequenceLogo", applet.getDefaultParameter(
+ "normaliseLogo", normaliseSequenceLogo));
- showSequenceLogo = applet.getDefaultParameter("showSequenceLogo", showSequenceLogo);
+ showGroupConsensus = applet.getDefaultParameter("showGroupConsensus",
+ showGroupConsensus);
- normaliseSequenceLogo = applet.getDefaultParameter("normaliseSequenceLogo", normaliseSequenceLogo);
+ showGroupConservation = applet.getDefaultParameter(
+ "showGroupConservation", showGroupConservation);
+
+ showConsensusHistogram = applet.getDefaultParameter(
+ "showConsensusHistogram", showConsensusHistogram);
- showGroupConsensus = applet.getDefaultParameter("showGroupConsensus", showGroupConsensus);
-
- showGroupConservation = applet.getDefaultParameter("showGroupConservation", showGroupConservation);
-
- showConsensusHistogram = applet.getDefaultParameter("showConsensusHistogram", showConsensusHistogram);
-
}
if (applet != null)
{
- String colour = applet.getParameter("defaultColour");
-
+ String colour = al.isNucleotide()
+ ? applet.getParameter("defaultColourNuc")
+ : applet.getParameter("defaultColourProt");
+ if (colour == null)
+ {
+ colour = applet.getParameter("defaultColour");
+ }
if (colour == null)
{
colour = applet.getParameter("userDefinedColour");
if (colour != null)
{
- globalColourScheme = ColourSchemeProperty.getColour(alignment,
- colour);
- if (globalColourScheme != null)
+ residueShading = new ResidueShader(
+ ColourSchemeProperty.getColourScheme(alignment, colour));
+ if (residueShading != null)
{
- globalColourScheme.setConsensus(hconsensus);
+ residueShading.setConsensus(hconsensus);
}
}
if (applet.getParameter("userDefinedColour") != null)
{
- ((UserColourScheme) globalColourScheme).parseAppletParameter(applet
- .getParameter("userDefinedColour"));
+ residueShading = new ResidueShader(new UserColourScheme(
+ applet.getParameter("userDefinedColour")));
}
}
initAutoAnnotation();
}
- public void showSequenceFeatures(boolean b)
- {
- showSequenceFeatures = b;
- }
-
- public boolean getShowSequenceFeatures()
- {
- return showSequenceFeatures;
- }
-
-
- /**
- * 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 boolean getConservationSelected()
- {
- return conservationColourSelected;
- }
-
- public void setConservationSelected(boolean b)
- {
- conservationColourSelected = b;
- }
-
- public boolean getAbovePIDThreshold()
- {
- return abovePIDThreshold;
- }
-
- public void setAbovePIDThreshold(boolean b)
- {
- abovePIDThreshold = b;
- }
-
- 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)
+ /**
+ * {@inheritDoc}
+ */
+ @Override
+ public void setFont(Font f, boolean setGrid)
{
font = f;
if (nullFrame == null)
nullFrame.addNotify();
}
- java.awt.FontMetrics fm = nullFrame.getGraphics().getFontMetrics(font);
- setCharHeight((int) (heightScale * fm.getHeight()));
- charWidth = (int) (widthScale * fm.charWidth('M'));
+ if (setGrid)
+ {
+ FontMetrics fm = nullFrame.getGraphics().getFontMetrics(font);
+ setCharHeight((int) (heightScale * fm.getHeight()));
+ setCharWidth((int) (widthScale * fm.charWidth('M')));
+ }
- if (upperCasebold)
+ if (isUpperCasebold())
{
Font f2 = new Font(f.getName(), Font.BOLD, f.getSize());
- fm = nullFrame.getGraphics().getFontMetrics(f2);
- charWidth = (int) (widthScale * (fm.stringWidth("MMMMMMMMMMM") / 10));
+ FontMetrics fm = nullFrame.getGraphics().getFontMetrics(f2);
+ setCharWidth(
+ (int) (widthScale * (fm.stringWidth("MMMMMMMMMMM") / 10)));
}
}
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 setThreshold(int thresh)
- {
- threshold = thresh;
- }
-
- public int getThreshold()
- {
- return threshold;
- }
-
- public void setIncrement(int inc)
- {
- increment = inc;
- }
-
- public int getIncrement()
- {
- return increment;
- }
-
public void resetSeqLimits(int height)
{
- setEndSeq(height / getCharHeight());
- }
-
- public void setCurrentTree(NJTree tree)
- {
- currentTree = tree;
- }
-
- public NJTree getCurrentTree()
- {
- return currentTree;
+ ranges.setEndSeq(height / getCharHeight());
}
- public void setColourAppliesToAllGroups(boolean b)
- {
- colourAppliesToAllGroups = b;
- }
-
- public boolean getColourAppliesToAllGroups()
- {
- return colourAppliesToAllGroups;
- }
-
- public boolean getShowJVSuffix()
- {
- return showJVSuffix;
- }
-
- public void setShowJVSuffix(boolean b)
- {
- showJVSuffix = b;
- }
-
- public boolean getShowAnnotation()
- {
- return showAnnotation;
- }
+ boolean centreColumnLabels;
- public void setShowAnnotation(boolean b)
+ public boolean getCentreColumnLabels()
{
- showAnnotation = b;
+ return centreColumnLabels;
}
- public boolean getScaleAboveWrapped()
- {
- return scaleAboveWrapped;
- }
+ public boolean followSelection = true;
- public boolean getScaleLeftWrapped()
+ /**
+ * @return true if view selection should always follow the selections
+ * broadcast by other selection sources
+ */
+ public boolean getFollowSelection()
{
- return scaleLeftWrapped;
+ return followSelection;
}
- public boolean getScaleRightWrapped()
+ @Override
+ public void sendSelection()
{
- return scaleRightWrapped;
+ getStructureSelectionManager().sendSelection(
+ new SequenceGroup(getSelectionGroup()),
+ new ColumnSelection(getColumnSelection()),
+ new HiddenColumns(getAlignment().getHiddenColumns()), this);
}
- public void setScaleAboveWrapped(boolean b)
+ /**
+ * Returns an instance of the StructureSelectionManager scoped to this applet
+ * instance.
+ *
+ * @return
+ */
+ @Override
+ public StructureSelectionManager getStructureSelectionManager()
{
- scaleAboveWrapped = b;
+ return jalview.structure.StructureSelectionManager
+ .getStructureSelectionManager(applet);
}
- public void setScaleLeftWrapped(boolean b)
+ @Override
+ public boolean isNormaliseSequenceLogo()
{
- scaleLeftWrapped = b;
+ return normaliseSequenceLogo;
}
- public void setScaleRightWrapped(boolean b)
+ public void setNormaliseSequenceLogo(boolean state)
{
- scaleRightWrapped = b;
+ normaliseSequenceLogo = state;
}
- public void setIgnoreGapsConsensus(boolean b)
+ /**
+ *
+ * @return true if alignment characters should be displayed
+ */
+ @Override
+ public boolean isValidCharWidth()
{
- ignoreGapsInConsensusCalculation = b;
- updateConsensus(null);
- if (globalColourScheme != null)
- {
- globalColourScheme.setThreshold(globalColourScheme.getThreshold(),
- ignoreGapsInConsensusCalculation);
-
- }
+ return validCharWidth;
}
-
-
-
-
- public boolean getShowHiddenMarkers()
+ public AnnotationColumnChooser getAnnotationColumnSelectionState()
{
- return showHiddenMarkers;
+ return annotationColumnSelectionState;
}
- public void setShowHiddenMarkers(boolean show)
+ public void setAnnotationColumnSelectionState(
+ AnnotationColumnChooser annotationColumnSelectionState)
{
- showHiddenMarkers = show;
+ this.annotationColumnSelectionState = annotationColumnSelectionState;
}
- public Color getSequenceColour(SequenceI seq)
- {
- if (sequenceColours == null || !sequenceColours.containsKey(seq))
+ @Override
+ public void mirrorCommand(CommandI command, boolean undo,
+ StructureSelectionManager ssm, VamsasSource source)
+ {
+ // TODO refactor so this can be pulled up to superclass or controller
+ /*
+ * Do nothing unless we are a 'complement' of the source. May replace this
+ * with direct calls not via SSM.
+ */
+ if (source instanceof AlignViewportI
+ && ((AlignViewportI) source).getCodingComplement() == this)
{
- return Color.white;
+ // ok to continue;
}
else
{
- return (Color) sequenceColours.get(seq);
+ return;
}
- }
- public void setSequenceColour(SequenceI seq, Color col)
- {
- if (sequenceColours == null)
+ CommandI mappedCommand = ssm.mapCommand(command, undo, getAlignment(),
+ getGapCharacter());
+ if (mappedCommand != null)
{
- sequenceColours = new Hashtable();
- }
+ mappedCommand.doCommand(null);
+ firePropertyChange("alignment", null, getAlignment().getSequences());
- if (col == null)
- {
- sequenceColours.remove(seq);
+ // ap.scalePanelHolder.repaint();
+ // ap.repaint();
}
- else
- {
- sequenceColours.put(seq, col);
- }
- }
-
- boolean centreColumnLabels;
-
- public boolean getCentreColumnLabels()
- {
- return centreColumnLabels;
- }
-
- public void updateSequenceIdColours()
- {
-
- for (SequenceGroup sg:alignment.getGroups())
- {
- if (sg.idColour != null)
- {
- for (SequenceI s:sg.getSequences(getHiddenRepSequences()))
- {
- this.setSequenceColour(s, sg.idColour);
- }
- }
- }
- }
-
- 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()
+ @Override
+ public VamsasSource getVamsasSource()
{
- jalview.structure.StructureSelectionManager
- .getStructureSelectionManager(applet).sendSelection(
- new SequenceGroup(getSelectionGroup()),
- new ColumnSelection(getColumnSelection()), this);
+ return 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
+ * If this viewport has a (Protein/cDNA) complement, then scroll the
+ * complementary alignment to match this one.
*/
- public void expandColSelection(SequenceGroup sg, boolean wholewidth)
+ public void scrollComplementaryAlignment(AlignmentPanel complementPanel)
{
- 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 (complementPanel == null)
{
- 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);
- }
+ return;
}
- }
- @Override
- public boolean hasHiddenColumns()
- {
- return hasHiddenColumns;
- }
-
- public boolean isNormaliseSequenceLogo()
- {
- return normaliseSequenceLogo;
- }
-
- public void setNormaliseSequenceLogo(boolean state)
- {
- normaliseSequenceLogo = state;
+ /*
+ * Populate a SearchResults object with the mapped location to scroll to. If
+ * there is no complement, or it is not following highlights, or no mapping
+ * is found, the result will be empty.
+ */
+ SearchResultsI sr = new SearchResults();
+ int seqOffset = findComplementScrollTarget(sr);
+ if (!sr.isEmpty())
+ {
+ complementPanel.setToScrollComplementPanel(false);
+ complementPanel.scrollToCentre(sr, seqOffset);
+ complementPanel.setToScrollComplementPanel(true);
+ }
}
/**
+ * Applies the supplied feature settings descriptor to currently known
+ * features. This supports an 'initial configuration' of feature colouring
+ * based on a preset or user favourite. This may then be modified in the usual
+ * way using the Feature Settings dialogue.
*
- * @return true if alignment characters should be displayed
+ * @param featureSettings
*/
- public boolean isValidCharWidth()
+ @Override
+ public void applyFeaturesStyle(FeatureSettingsModelI featureSettings)
{
- return validCharWidth;
+ // TODO implement for applet
}
}