-/*\r
- * Jalview - A Sequence Alignment Editor and Viewer\r
- * Copyright (C) 2005 AM Waterhouse, J Procter, G Barton, M Clamp, S Searle\r
- *\r
- * This program is free software; you can redistribute it and/or\r
- * modify it under the terms of the GNU General Public License\r
- * as published by the Free Software Foundation; either version 2\r
- * of the License, or (at your option) any later version.\r
- *\r
- * This program is distributed in the hope that it will be useful,\r
- * but WITHOUT ANY WARRANTY; without even the implied warranty of\r
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\r
- * GNU General Public License for more details.\r
- *\r
- * You should have received a copy of the GNU General Public License\r
- * along with this program; if not, write to the Free Software\r
- * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA\r
- */\r
-\r
-package jalview.appletgui;\r
-\r
-import java.util.*;\r
-\r
-import java.awt.*;\r
-\r
-import jalview.analysis.*;\r
-import jalview.bin.*;\r
-import jalview.datamodel.*;\r
-import jalview.schemes.*;\r
-\r
-public class AlignViewport\r
-{\r
- int startRes;\r
- int endRes;\r
-\r
- int startSeq;\r
- int endSeq;\r
-\r
-\r
- boolean cursorMode = false;\r
-\r
- boolean showJVSuffix = true;\r
- boolean showText = true;\r
- boolean showColourText = false;\r
- boolean showBoxes = true;\r
- boolean wrapAlignment = false;\r
- boolean renderGaps = true;\r
- boolean showSequenceFeatures = false;\r
- boolean showAnnotation = true;\r
- boolean showConservation = true;\r
- boolean showQuality = true;\r
- boolean showConsensus = true;\r
-\r
- boolean colourAppliesToAllGroups = true;\r
- ColourSchemeI globalColourScheme = null;\r
- boolean conservationColourSelected = false;\r
- boolean abovePIDThreshold = false;\r
-\r
- SequenceGroup selectionGroup;\r
-\r
- int charHeight;\r
- int charWidth;\r
- int wrappedWidth;\r
-\r
- Font font = new Font("SansSerif", Font.PLAIN, 10);\r
- boolean validCharWidth = true;\r
- AlignmentI alignment;\r
-\r
- ColumnSelection colSel = new ColumnSelection();\r
-\r
- int threshold;\r
- int increment;\r
-\r
- NJTree currentTree = null;\r
-\r
- boolean scaleAboveWrapped = true;\r
- boolean scaleLeftWrapped = true;\r
- boolean scaleRightWrapped = true;\r
-\r
- // The following vector holds the features which are\r
- // currently visible, in the correct order or rendering\r
- Hashtable featuresDisplayed;\r
-\r
-\r
- public Vector vconsensus;\r
- AlignmentAnnotation consensus;\r
- AlignmentAnnotation conservation;\r
- AlignmentAnnotation quality;\r
-\r
- boolean autocalculateConsensus = true;\r
-\r
- public int ConsPercGaps = 25; // JBPNote : This should be a scalable property!\r
-\r
- private java.beans.PropertyChangeSupport changeSupport = new java.beans.PropertyChangeSupport(this);\r
-\r
- boolean ignoreGapsInConsensusCalculation = false;\r
-\r
- public AlignViewport(AlignmentI al, JalviewLite applet)\r
- {\r
- setAlignment(al);\r
- this.startRes = 0;\r
- this.endRes = al.getWidth() - 1;\r
- this.startSeq = 0;\r
- this.endSeq = al.getHeight() - 1;\r
- setFont(font);\r
-\r
- if (applet != null)\r
- {\r
- String param = applet.getParameter("showFullId");\r
- if (param != null)\r
- {\r
- showJVSuffix = Boolean.valueOf(param).booleanValue();\r
- }\r
-\r
- param = applet.getParameter("showAnnotation");\r
- if (param != null)\r
- {\r
- showAnnotation = Boolean.valueOf(param).booleanValue();\r
- }\r
-\r
- param = applet.getParameter("showConservation");\r
- if (param != null)\r
- {\r
- showConservation = Boolean.valueOf(param).booleanValue();\r
- }\r
-\r
- param = applet.getParameter("showQuality");\r
- if (param != null)\r
- {\r
- showQuality = Boolean.valueOf(param).booleanValue();\r
- }\r
-\r
- param = applet.getParameter("showConsensus");\r
- if (param != null)\r
- {\r
- showConsensus = Boolean.valueOf(param).booleanValue();\r
- }\r
- }\r
- // We must set conservation and consensus before setting colour,\r
- // as Blosum and Clustal require this to be done\r
- updateConservation();\r
- updateConsensus();\r
-\r
-\r
- if (applet != null)\r
- {\r
- String colour = applet.getParameter("defaultColour");\r
-\r
- if(colour == null)\r
- {\r
- colour = applet.getParameter("userDefinedColour");\r
- if(colour !=null)\r
- colour = "User Defined";\r
- }\r
-\r
- if(colour != null)\r
- {\r
- globalColourScheme = ColourSchemeProperty.getColour(alignment, colour);\r
- if (globalColourScheme != null)\r
- {\r
- globalColourScheme.setConsensus(vconsensus);\r
- }\r
- }\r
-\r
- if(applet.getParameter("userDefinedColour")!=null)\r
- {\r
- ((UserColourScheme)globalColourScheme).parseAppletParameter(\r
- applet.getParameter("userDefinedColour"));\r
- }\r
-\r
-\r
- }\r
- }\r
-\r
- public void showSequenceFeatures(boolean b)\r
- {\r
- showSequenceFeatures = b;\r
- }\r
-\r
- public boolean getShowSequenceFeatures()\r
- {\r
- return showSequenceFeatures;\r
- }\r
-\r
-\r
- public void updateConservation()\r
- {\r
- if(alignment.isNucleotide())\r
- return;\r
-\r
- Conservation cons = new jalview.analysis.Conservation("All",\r
- jalview.schemes.ResidueProperties.propHash, 3,\r
- alignment.getSequences(), 0,\r
- alignment.getWidth() - 1);\r
- cons.calculate();\r
- cons.verdict(false, ConsPercGaps);\r
- cons.findQuality();\r
- int alWidth = alignment.getWidth();\r
- Annotation[] annotations = new Annotation[alWidth];\r
- Annotation[] qannotations = new Annotation[alWidth];\r
- String sequence = cons.getConsSequence().getSequence();\r
- float minR, minG, minB, maxR, maxG, maxB;\r
- minR = 0.3f;\r
- minG = 0.0f;\r
- minB = 0f;\r
- maxR = 1.0f - minR;\r
- maxG = 0.9f - minG;\r
- maxB = 0f - minB; // scalable range for colouring both Conservation and Quality\r
- float min = 0f;\r
- float max = 11f;\r
- float qmin = cons.qualityRange[0].floatValue();\r
- float qmax = cons.qualityRange[1].floatValue();\r
-\r
- for (int i = 0; i < alWidth; i++)\r
- {\r
- float value = 0;\r
- try\r
- {\r
- value = Integer.parseInt(sequence.charAt(i) + "");\r
- }\r
- catch (Exception ex)\r
- {\r
- if (sequence.charAt(i) == '*')\r
- {\r
- value = 11;\r
- }\r
- if (sequence.charAt(i) == '+')\r
- {\r
- value = 10;\r
- }\r
- }\r
- float vprop = value - min;\r
- vprop /= max;\r
-\r
- annotations[i] = new Annotation(sequence.charAt(i) + "",\r
- "", ' ', value,\r
- new Color(minR + maxR * vprop,\r
- minG + maxG * vprop,\r
- minB + maxB * vprop));\r
- // Quality calc\r
- value = ( (Double) cons.quality.elementAt(i)).floatValue();\r
- vprop = value - qmin;\r
- vprop /= qmax;\r
- qannotations[i] = new Annotation(" ",\r
- String.valueOf(value), ' ', value,\r
- new\r
- Color(minR + maxR * vprop,\r
- minG + maxG * vprop,\r
- minB + maxB * vprop));\r
- }\r
-\r
- if (conservation == null)\r
- {\r
- conservation = new AlignmentAnnotation("Conservation",\r
- "Conservation of total alignment less than " +\r
- ConsPercGaps + "% gaps",\r
- annotations,\r
- 0f, // cons.qualityRange[0].floatValue(),\r
- 11f, // cons.qualityRange[1].floatValue()\r
- AlignmentAnnotation.BAR_GRAPH);\r
- if (showConservation)\r
- {\r
- alignment.addAnnotation(conservation);\r
- }\r
- quality = new AlignmentAnnotation("Quality",\r
- "Alignment Quality based on Blosum62 scores",\r
- qannotations,\r
- cons.qualityRange[0].floatValue(),\r
- cons.qualityRange[1].floatValue(),\r
- AlignmentAnnotation.BAR_GRAPH);\r
- if (showQuality)\r
- {\r
- alignment.addAnnotation(quality);\r
- }\r
- }\r
- else\r
- {\r
- conservation.annotations = annotations;\r
- quality.annotations = qannotations;\r
- quality.graphMax = cons.qualityRange[1].floatValue();\r
- }\r
-\r
- }\r
-\r
- public void updateConsensus()\r
- {\r
- Annotation[] annotations = new Annotation[alignment.getWidth()];\r
-\r
- // this routine prevents vconsensus becoming a new object each time\r
- // consenus is calculated. Important for speed of Blosum62\r
- // and PID colouring of alignment\r
- if (vconsensus == null)\r
- {\r
- vconsensus = alignment.getAAFrequency();\r
- }\r
- else\r
- {\r
- Vector temp = alignment.getAAFrequency();\r
- vconsensus.removeAllElements();\r
- Enumeration e = temp.elements();\r
- while (e.hasMoreElements())\r
- {\r
- vconsensus.addElement(e.nextElement());\r
- }\r
- }\r
- Hashtable hash = null;\r
- for (int i = 0; i < alignment.getWidth(); i++)\r
- {\r
- hash = (Hashtable) vconsensus.elementAt(i);\r
- float value = 0;\r
- if(ignoreGapsInConsensusCalculation)\r
- value = ((Float)hash.get("pid_nogaps")).floatValue();\r
- else\r
- value = ((Float)hash.get("pid_gaps")).floatValue();\r
-\r
- String maxRes = hash.get("maxResidue").toString();\r
- String mouseOver = hash.get("maxResidue") + " ";\r
- if (maxRes.length() > 1)\r
- {\r
- mouseOver = "[" + maxRes + "] ";\r
- maxRes = "+";\r
- }\r
-\r
-\r
- mouseOver += (int) value + "%";\r
- annotations[i] = new Annotation(maxRes, mouseOver, ' ', value);\r
-\r
- }\r
-\r
- if (consensus == null)\r
- {\r
- consensus = new AlignmentAnnotation("Consensus",\r
- "PID", annotations, 0f, 100f, AlignmentAnnotation.BAR_GRAPH);\r
- if (showConsensus)\r
- {\r
- alignment.addAnnotation(consensus);\r
- }\r
- }\r
- else\r
- {\r
- consensus.annotations = annotations;\r
- }\r
-\r
- if(globalColourScheme!=null)\r
- globalColourScheme.setConsensus(vconsensus);\r
-\r
- }\r
-\r
- public SequenceGroup getSelectionGroup()\r
- {\r
- return selectionGroup;\r
- }\r
-\r
- public void setSelectionGroup(SequenceGroup sg)\r
- {\r
- selectionGroup = sg;\r
- }\r
-\r
- public boolean getConservationSelected()\r
- {\r
- return conservationColourSelected;\r
- }\r
-\r
- public void setConservationSelected(boolean b)\r
- {\r
- conservationColourSelected = b;\r
- }\r
-\r
- public boolean getAbovePIDThreshold()\r
- {\r
- return abovePIDThreshold;\r
- }\r
-\r
- public void setAbovePIDThreshold(boolean b)\r
- {\r
- abovePIDThreshold = b;\r
- }\r
-\r
- public int getStartRes()\r
- {\r
- return startRes;\r
- }\r
-\r
- public int getEndRes()\r
- {\r
- return endRes;\r
- }\r
-\r
- public int getStartSeq()\r
- {\r
- return startSeq;\r
- }\r
-\r
- public void setGlobalColourScheme(ColourSchemeI cs)\r
- {\r
- globalColourScheme = cs;\r
- }\r
-\r
- public ColourSchemeI getGlobalColourScheme()\r
- {\r
- return globalColourScheme;\r
- }\r
-\r
- public void setStartRes(int res)\r
- {\r
- this.startRes = res;\r
- }\r
-\r
- public void setStartSeq(int seq)\r
- {\r
- this.startSeq = seq;\r
- }\r
-\r
- public void setEndRes(int res)\r
- {\r
- if (res > alignment.getWidth() - 1)\r
- {\r
- // log.System.out.println(" Corrected res from " + res + " to maximum " + (alignment.getWidth()-1));\r
- res = alignment.getWidth() - 1;\r
- }\r
- if (res < 0)\r
- {\r
- res = 0;\r
- }\r
- this.endRes = res;\r
- }\r
-\r
- public void setEndSeq(int seq)\r
- {\r
- if (seq > alignment.getHeight())\r
- {\r
- seq = alignment.getHeight();\r
- }\r
- if (seq < 0)\r
- {\r
- seq = 0;\r
- }\r
- this.endSeq = seq;\r
- }\r
-\r
- public int getEndSeq()\r
- {\r
- return endSeq;\r
- }\r
-\r
- java.awt.Frame nullFrame;\r
- public void setFont(Font f)\r
- {\r
- font = f;\r
- if(nullFrame == null)\r
- {\r
- nullFrame = new java.awt.Frame();\r
- nullFrame.addNotify();\r
- }\r
-\r
- java.awt.FontMetrics fm = nullFrame.getGraphics().getFontMetrics(font);\r
- setCharHeight(fm.getHeight());\r
- setCharWidth(fm.charWidth('M'));\r
- }\r
-\r
- public Font getFont()\r
- {\r
- return font;\r
- }\r
-\r
- public void setCharWidth(int w)\r
- {\r
- this.charWidth = w;\r
- }\r
-\r
- public int getCharWidth()\r
- {\r
- return charWidth;\r
- }\r
-\r
- public void setCharHeight(int h)\r
- {\r
- this.charHeight = h;\r
- }\r
-\r
- public int getCharHeight()\r
- {\r
- return charHeight;\r
- }\r
-\r
- public void setWrappedWidth(int w)\r
- {\r
- this.wrappedWidth = w;\r
- }\r
-\r
- public int getwrappedWidth()\r
- {\r
- return wrappedWidth;\r
- }\r
-\r
- public AlignmentI getAlignment()\r
- {\r
- return alignment;\r
- }\r
-\r
- public void setAlignment(AlignmentI align)\r
- {\r
- this.alignment = align;\r
- }\r
-\r
- public void setWrapAlignment(boolean state)\r
- {\r
- wrapAlignment = state;\r
- }\r
-\r
- public void setShowText(boolean state)\r
- {\r
- showText = state;\r
- }\r
-\r
- public void setRenderGaps(boolean state)\r
- {\r
- renderGaps = state;\r
- }\r
-\r
- public boolean getColourText()\r
- {\r
- return showColourText;\r
- }\r
-\r
- public void setColourText(boolean state)\r
- {\r
- showColourText = state;\r
- }\r
-\r
- public void setShowBoxes(boolean state)\r
- {\r
- showBoxes = state;\r
- }\r
-\r
- public boolean getWrapAlignment()\r
- {\r
- return wrapAlignment;\r
- }\r
-\r
- public boolean getShowText()\r
- {\r
- return showText;\r
- }\r
-\r
- public boolean getShowBoxes()\r
- {\r
- return showBoxes;\r
- }\r
-\r
- public char getGapCharacter()\r
- {\r
- return getAlignment().getGapCharacter();\r
- }\r
-\r
- public void setGapCharacter(char gap)\r
- {\r
- if (getAlignment() != null)\r
- {\r
- getAlignment().setGapCharacter(gap);\r
- }\r
- }\r
-\r
- public void setThreshold(int thresh)\r
- {\r
- threshold = thresh;\r
- }\r
-\r
- public int getThreshold()\r
- {\r
- return threshold;\r
- }\r
-\r
- public void setIncrement(int inc)\r
- {\r
- increment = inc;\r
- }\r
-\r
- public int getIncrement()\r
- {\r
- return increment;\r
- }\r
-\r
- public ColumnSelection getColumnSelection()\r
- {\r
- return colSel;\r
- }\r
-\r
- public void resetSeqLimits(int height)\r
- {\r
- setEndSeq(height / getCharHeight());\r
- }\r
-\r
- public void setCurrentTree(NJTree tree)\r
- {\r
- currentTree = tree;\r
- }\r
-\r
- public NJTree getCurrentTree()\r
- {\r
- return currentTree;\r
- }\r
-\r
- public void setColourAppliesToAllGroups(boolean b)\r
- {\r
- colourAppliesToAllGroups = b;\r
- }\r
-\r
- public boolean getColourAppliesToAllGroups()\r
- {\r
- return colourAppliesToAllGroups;\r
- }\r
-\r
- public boolean getShowJVSuffix()\r
- {\r
- return showJVSuffix;\r
- }\r
-\r
- public void setShowJVSuffix(boolean b)\r
- {\r
- showJVSuffix = b;\r
- }\r
-\r
- public boolean getShowAnnotation()\r
- {\r
- return showAnnotation;\r
- }\r
-\r
- public void setShowAnnotation(boolean b)\r
- {\r
- showAnnotation = b;\r
- }\r
-\r
- public boolean getScaleAboveWrapped()\r
- {\r
- return scaleAboveWrapped;\r
- }\r
-\r
- public boolean getScaleLeftWrapped()\r
- {\r
- return scaleLeftWrapped;\r
- }\r
-\r
- public boolean getScaleRightWrapped()\r
- {\r
- return scaleRightWrapped;\r
- }\r
-\r
- public void setScaleAboveWrapped(boolean b)\r
- {\r
- scaleAboveWrapped = b;\r
- }\r
-\r
- public void setScaleLeftWrapped(boolean b)\r
- {\r
- scaleLeftWrapped = b;\r
- }\r
-\r
- public void setScaleRightWrapped(boolean b)\r
- {\r
- scaleRightWrapped = b;\r
- }\r
-\r
- public void setIgnoreGapsConsensus(boolean b)\r
- {\r
- ignoreGapsInConsensusCalculation = b;\r
- updateConsensus();\r
- if (globalColourScheme!=null)\r
- {\r
- globalColourScheme.setThreshold(globalColourScheme.getThreshold(),\r
- ignoreGapsInConsensusCalculation);\r
-\r
- }\r
- }\r
-\r
- /**\r
- * Property change listener for changes in alignment\r
- *\r
- * @param listener DOCUMENT ME!\r
- */\r
- public void addPropertyChangeListener(\r
- java.beans.PropertyChangeListener listener)\r
- {\r
- changeSupport.addPropertyChangeListener(listener);\r
- }\r
-\r
- /**\r
- * DOCUMENT ME!\r
- *\r
- * @param listener DOCUMENT ME!\r
- */\r
- public void removePropertyChangeListener(\r
- java.beans.PropertyChangeListener listener)\r
- {\r
- changeSupport.removePropertyChangeListener(listener);\r
- }\r
-\r
- /**\r
- * Property change listener for changes in alignment\r
- *\r
- * @param prop DOCUMENT ME!\r
- * @param oldvalue DOCUMENT ME!\r
- * @param newvalue DOCUMENT ME!\r
- */\r
- public void firePropertyChange(String prop, Object oldvalue, Object newvalue)\r
- {\r
- changeSupport.firePropertyChange(prop, oldvalue, newvalue);\r
- }\r
-\r
-\r
-\r
- public boolean getIgnoreGapsConsensus()\r
- {\r
- return ignoreGapsInConsensusCalculation;\r
- }\r
-\r
-\r
-}\r
+/*
+ * Jalview - A Sequence Alignment Editor and Viewer ($$Version-Rel$$)
+ * Copyright (C) $$Year-Rel$$ The Jalview Authors
+ *
+ * This file is part of Jalview.
+ *
+ * Jalview is free software: you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License
+ * as published by the Free Software Foundation, either version 3
+ * of the License, or (at your option) any later version.
+ *
+ * Jalview is distributed in the hope that it will be useful, but
+ * WITHOUT ANY WARRANTY; without even the implied warranty
+ * of MERCHANTABILITY or FITNESS FOR A PARTICULAR
+ * PURPOSE. See the GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with Jalview. If not, see <http://www.gnu.org/licenses/>.
+ * 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.commands.CommandI;
+import jalview.datamodel.AlignmentI;
+import jalview.datamodel.ColumnSelection;
+import jalview.datamodel.SearchResults;
+import jalview.datamodel.Sequence;
+import jalview.datamodel.SequenceGroup;
+import jalview.datamodel.SequenceI;
+import jalview.schemes.ColourSchemeProperty;
+import jalview.schemes.UserColourScheme;
+import jalview.structure.CommandListener;
+import jalview.structure.SelectionSource;
+import jalview.structure.StructureSelectionManager;
+import jalview.structure.VamsasSource;
+import jalview.util.Platform;
+import jalview.viewmodel.AlignmentViewport;
+import jalview.workers.AlignCalcManager;
+
+import java.awt.Font;
+
+public class AlignViewport extends AlignmentViewport implements
+ SelectionSource, VamsasSource, CommandListener
+{
+ boolean cursorMode = false;
+
+ Font font = new Font("SansSerif", Font.PLAIN, 10);
+
+ boolean validCharWidth = true;
+
+ NJTree currentTree = null;
+
+ public JalviewLite applet;
+
+ boolean MAC = false;
+
+ private AnnotationColumnChooser annotationColumnSelectionState;
+
+ public void finalize()
+ {
+ applet = null;
+ quality = null;
+ alignment = null;
+ colSel = null;
+ }
+
+ public AlignViewport(AlignmentI al, JalviewLite applet)
+ {
+ super();
+ calculator = new AlignCalcManager();
+ this.applet = applet;
+ alignment = 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 (JalviewLite.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 (JalviewLite.debug)
+ {
+ System.err
+ .println("Alignment character height scaling factor is now "
+ + heightScale);
+ }
+ }
+ }
+ setFont(font);
+
+ MAC = Platform.isAMac();
+
+ if (applet != null)
+ {
+ setShowJVSuffix(applet.getDefaultParameter("showFullId",
+ getShowJVSuffix()));
+
+ setShowAnnotation(applet.getDefaultParameter("showAnnotation",
+ isShowAnnotation()));
+
+ showConservation = applet.getDefaultParameter("showConservation",
+ showConservation);
+
+ showQuality = applet.getDefaultParameter("showQuality", showQuality);
+
+ showConsensus = applet.getDefaultParameter("showConsensus",
+ showConsensus);
+
+ setShowUnconserved(applet.getDefaultParameter("showUnconserved",
+ getShowUnconserved()));
+
+ setScaleProteinAsCdna(applet.getDefaultParameter(
+ "scaleProteinAsCdna", isScaleProteinAsCdna()));
+
+ String param = applet.getParameter("upperCase");
+ if (param != null)
+ {
+ if (param.equalsIgnoreCase("bold"))
+ {
+ setUpperCasebold(true);
+ }
+ }
+ sortByTree = applet.getDefaultParameter("sortByTree", sortByTree);
+
+ setFollowHighlight(applet.getDefaultParameter("automaticScrolling",
+ isFollowHighlight()));
+ followSelection = isFollowHighlight();
+
+ 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;
+ }
+ StringBuilder seqs = new StringBuilder(consensus.annotations.length);
+ 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;
+ }
+
+ 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()));
+ setCharWidth((int) (widthScale * fm.charWidth('M')));
+
+ if (isUpperCasebold())
+ {
+ Font f2 = new Font(f.getName(), Font.BOLD, f.getSize());
+ fm = nullFrame.getGraphics().getFontMetrics(f2);
+ setCharWidth((int) (widthScale * (fm.stringWidth("MMMMMMMMMMM") / 10)));
+ }
+ }
+
+ public Font getFont()
+ {
+ return font;
+ }
+
+
+ public void resetSeqLimits(int height)
+ {
+ setEndSeq(height / getCharHeight());
+ }
+
+ public void setCurrentTree(NJTree tree)
+ {
+ currentTree = tree;
+ }
+
+ public NJTree getCurrentTree()
+ {
+ return currentTree;
+ }
+
+
+ boolean centreColumnLabels;
+
+ public boolean getCentreColumnLabels()
+ {
+ return centreColumnLabels;
+ }
+
+ 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()
+ {
+ getStructureSelectionManager().sendSelection(
+ new SequenceGroup(getSelectionGroup()),
+ new ColumnSelection(getColumnSelection()), this);
+ }
+
+ /**
+ * Returns an instance of the StructureSelectionManager scoped to this applet
+ * instance.
+ *
+ * @return
+ */
+ @Override
+ public StructureSelectionManager getStructureSelectionManager()
+ {
+ return StructureSelectionManager.getStructureSelectionManager(applet);
+ }
+
+ /**
+ * 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;
+ }
+
+ @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)
+ {
+ // ok to continue;
+ }
+ else
+ {
+ return;
+ }
+
+ CommandI mappedCommand = ssm.mapCommand(command, undo, getAlignment(),
+ getGapCharacter());
+ if (mappedCommand != null)
+ {
+ mappedCommand.doCommand(null);
+ firePropertyChange("alignment", null, getAlignment().getSequences());
+
+ // ap.scalePanelHolder.repaint();
+ // ap.repaint();
+ }
+ }
+
+ @Override
+ public VamsasSource getVamsasSource()
+ {
+ return this;
+ }
+
+ /**
+ * If this viewport has a (Protein/cDNA) complement, then scroll the
+ * complementary alignment to match this one.
+ */
+ public void scrollComplementaryAlignment(AlignmentPanel complementPanel)
+ {
+ if (complementPanel == null)
+ {
+ return;
+ }
+
+ /*
+ * 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.
+ */
+ SearchResults sr = new SearchResults();
+ int seqOffset = findComplementScrollTarget(sr);
+ if (!sr.isEmpty())
+ {
+ complementPanel.setFollowingComplementScroll(true);
+ complementPanel.scrollToCentre(sr, seqOffset);
+ }
+ }
+
+
+}