/*\r
* Jalview - A Sequence Alignment Editor and Viewer\r
- * Copyright (C) 2005 AM Waterhouse, J Procter, G Barton, M Clamp, S Searle\r
+ * Copyright (C) 2006 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
boolean showConservation = true;\r
boolean showQuality = true;\r
boolean showConsensus = true;\r
+ boolean upperCasebold = false;\r
\r
boolean colourAppliesToAllGroups = true;\r
ColourSchemeI globalColourScheme = null;\r
boolean conservationColourSelected = false;\r
boolean abovePIDThreshold = false;\r
\r
- SequenceGroup selectionGroup = new SequenceGroup();\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
// The following vector holds the features which are\r
// currently visible, in the correct order or rendering\r
- Hashtable featuresDisplayed = null;\r
+ public Hashtable featuresDisplayed;\r
+\r
+ boolean hasHiddenColumns = false;\r
+ boolean hasHiddenRows = false;\r
+ boolean showHiddenMarkers = true;\r
\r
\r
public Vector vconsensus;\r
\r
boolean ignoreGapsInConsensusCalculation = false;\r
\r
+ jalview.bin.JalviewLite applet;\r
+\r
+ boolean MAC = false;\r
+\r
public AlignViewport(AlignmentI al, JalviewLite applet)\r
{\r
+ this.applet = applet;\r
setAlignment(al);\r
this.startRes = 0;\r
this.endRes = al.getWidth() - 1;\r
this.endSeq = al.getHeight() - 1;\r
setFont(font);\r
\r
+ if(System.getProperty("os.name").startsWith("Mac"))\r
+ MAC = true;\r
+\r
if (applet != null)\r
{\r
String param = applet.getParameter("showFullId");\r
{\r
showConsensus = Boolean.valueOf(param).booleanValue();\r
}\r
+\r
+ param = applet.getParameter("upperCase");\r
+ if (param != null)\r
+ {\r
+ if(param.equalsIgnoreCase("bold"))\r
+ upperCasebold = true;\r
+ }\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
- if (applet != null && applet.getParameter("defaultColour") != null)\r
+\r
+ if (applet != null)\r
{\r
- globalColourScheme = ColourSchemeProperty.getColour(alignment,\r
- applet.getParameter("defaultColour"));\r
- if (globalColourScheme != null)\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
- globalColourScheme.setConsensus(vconsensus);\r
+ ((UserColourScheme)globalColourScheme).parseAppletParameter(\r
+ applet.getParameter("userDefinedColour"));\r
}\r
+\r
+\r
}\r
}\r
\r
globalColourScheme.setConsensus(vconsensus);\r
\r
}\r
-\r
+ /**\r
+ * get the consensus sequence as displayed under the PID consensus annotation row.\r
+ * @return consensus sequence as a new sequence object\r
+ */\r
+ /**\r
+ * get the consensus sequence as displayed under the PID consensus annotation row.\r
+ * @return consensus sequence as a new sequence object\r
+ */\r
+ public SequenceI getConsensusSeq() {\r
+ if (consensus==null)\r
+ updateConsensus();\r
+ if (consensus==null)\r
+ return null;\r
+ StringBuffer seqs=new StringBuffer();\r
+ for (int i=0; i<consensus.annotations.length; i++) {\r
+ if (consensus.annotations[i]!=null) {\r
+ if (consensus.annotations[i].description.charAt(0) == '[')\r
+ seqs.append(consensus.annotations[i].description.charAt(1));\r
+ else\r
+ seqs.append(consensus.annotations[i].displayCharacter);\r
+ }\r
+ }\r
+ SequenceI sq = new Sequence("Consensus", seqs.toString());\r
+ sq.setDescription("Percentage Identity Consensus "+((ignoreGapsInConsensusCalculation) ? " without gaps" : ""));\r
+ return sq;\r
+ }\r
public SequenceGroup getSelectionGroup()\r
{\r
return selectionGroup;\r
return endSeq;\r
}\r
\r
+ java.awt.Frame nullFrame;\r
public void setFont(Font f)\r
{\r
font = f;\r
- java.awt.Frame temp = new java.awt.Frame();\r
- temp.addNotify();\r
- java.awt.FontMetrics fm = temp.getGraphics().getFontMetrics(font);\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
+ charWidth = fm.charWidth('M');\r
+\r
+ if(upperCasebold)\r
+ {\r
+ Font f2 = new Font(f.getName(), Font.BOLD, f.getSize());\r
+ fm = nullFrame.getGraphics().getFontMetrics(f2);\r
+ charWidth = fm.stringWidth("MMMMMMMMMMM") / 10;\r
+ }\r
}\r
\r
public Font getFont()\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
return increment;\r
}\r
\r
- public int getIndex(int y)\r
+ public void setHiddenColumns(ColumnSelection colsel)\r
{\r
- int y1 = 0;\r
- int starty = getStartSeq();\r
- int endy = getEndSeq();\r
-\r
- for (int i = starty; i <= endy; i++)\r
- {\r
- if (i < alignment.getHeight() && alignment.getSequenceAt(i) != null)\r
- {\r
- int y2 = y1 + getCharHeight();\r
-\r
- if (y >= y1 && y <= y2)\r
- {\r
- return i;\r
- }\r
- y1 = y2;\r
- }\r
- else\r
- {\r
- return -1;\r
- }\r
- }\r
- return -1;\r
+ this.colSel = colsel;\r
+ if(colSel.getHiddenColumns()!=null)\r
+ hasHiddenColumns = true;\r
}\r
\r
public ColumnSelection getColumnSelection()\r
{\r
return ignoreGapsInConsensusCalculation;\r
}\r
+ public void hideSelectedColumns()\r
+ {\r
+ if (colSel.size() < 1)\r
+ return;\r
+\r
+ colSel.hideSelectedColumns();\r
+ setSelectionGroup(null);\r
+\r
+ hasHiddenColumns = true;\r
+ }\r
+\r
+ public void invertColumnSelection()\r
+ {\r
+ int column;\r
+ for (int i = 0; i < alignment.getWidth(); i++)\r
+ {\r
+ column = i;\r
+\r
+ if (colSel.contains(column))\r
+ colSel.removeElement(column);\r
+ else\r
+ colSel.addElement(column);\r
+\r
+ }\r
+ }\r
+\r
+\r
+ public void hideColumns(int start, int end)\r
+ {\r
+ if(start==end)\r
+ colSel.hideColumns(start);\r
+ else\r
+ colSel.hideColumns(start, end);\r
+\r
+ hasHiddenColumns = true;\r
+ }\r
+\r
+ public void hideAllSelectedSeqs()\r
+ {\r
+ if (selectionGroup == null)\r
+ return;\r
+\r
+ SequenceI[] seqs = selectionGroup.getSequencesInOrder(alignment);\r
+\r
+ hideSequence(seqs);\r
+\r
+ setSelectionGroup(null);\r
+ }\r
+\r
+ public void hideSequence(SequenceI [] seq)\r
+ {\r
+ if(seq!=null)\r
+ {\r
+ for (int i = 0; i < seq.length; i++)\r
+ alignment.getHiddenSequences().hideSequence(seq[i]);\r
+\r
+ hasHiddenRows = true;\r
+ firePropertyChange("alignment", null, alignment.getSequences());\r
+ }\r
+ }\r
+\r
+ public void showColumn(int col)\r
+ {\r
+ colSel.revealHiddenColumns(col);\r
+ if(colSel.getHiddenColumns()==null)\r
+ hasHiddenColumns = false;\r
+ }\r
+\r
+ public void showAllHiddenColumns()\r
+ {\r
+ colSel.revealAllHiddenColumns();\r
+ hasHiddenColumns = false;\r
+ }\r
+\r
+ public void showAllHiddenSeqs()\r
+ {\r
+ if(alignment.getHiddenSequences().getSize()>0)\r
+ {\r
+ if(selectionGroup==null)\r
+ {\r
+ selectionGroup = new SequenceGroup();\r
+ selectionGroup.setEndRes(alignment.getWidth()-1);\r
+ }\r
+ Vector tmp = alignment.getHiddenSequences().showAll();\r
+ for(int t=0; t<tmp.size(); t++)\r
+ {\r
+ selectionGroup.addSequence(\r
+ (SequenceI)tmp.elementAt(t), false\r
+ );\r
+ }\r
+ firePropertyChange("alignment", null, alignment.getSequences());\r
+ hasHiddenRows = false;\r
+ }\r
+ }\r
+\r
+ public int adjustForHiddenSeqs(int alignmentIndex)\r
+ {\r
+ return alignment.getHiddenSequences().adjustForHiddenSeqs(alignmentIndex);\r
+ }\r
+\r
+ /**\r
+ * This method returns the a new SequenceI [] with\r
+ * the selection sequence and start and end points adjusted\r
+ * @return String[]\r
+ */\r
+ public SequenceI[] getSelectionAsNewSequence()\r
+ {\r
+ SequenceI[] sequences;\r
+\r
+ if (selectionGroup == null)\r
+ sequences = alignment.getSequencesArray();\r
+ else\r
+ sequences = selectionGroup.getSelectionAsNewSequences(alignment);\r
+\r
+ return sequences;\r
+ }\r
+\r
+ /**\r
+ * This method returns the visible alignment as text, as\r
+ * seen on the GUI, ie if columns are hidden they will not\r
+ * be returned in the result.\r
+ * Use this for calculating trees, PCA, redundancy etc on views\r
+ * which contain hidden columns.\r
+ * @return String[]\r
+ */\r
+ public jalview.datamodel.CigarArray getViewAsCigars(boolean selectedRegionOnly)\r
+ {\r
+ CigarArray selection=null;\r
+ SequenceI [] seqs= null;\r
+ int i, iSize;\r
+ int start = 0, end = 0;\r
+ if(selectedRegionOnly && selectionGroup!=null)\r
+ {\r
+ iSize = selectionGroup.getSize(false);\r
+ seqs = selectionGroup.getSequencesInOrder(alignment);\r
+ start = selectionGroup.getStartRes();\r
+ end = selectionGroup.getEndRes(); // inclusive for start and end in SeqCigar constructor\r
+ }\r
+ else\r
+ {\r
+ iSize = alignment.getHeight();\r
+ seqs = alignment.getSequencesArray();\r
+ end = alignment.getWidth()-1;\r
+ }\r
+ SeqCigar[] selseqs = new SeqCigar[iSize];\r
+ for(i=0; i<iSize; i++)\r
+ {\r
+ selseqs[i] = new SeqCigar(seqs[i], start, end);\r
+ }\r
+ selection=new CigarArray(selseqs);\r
+ // now construct the CigarArray operations\r
+ if (hasHiddenColumns) {\r
+ Vector regions = colSel.getHiddenColumns();\r
+ int [] region;\r
+ int hideStart, hideEnd;\r
+ int last=start;\r
+ for (int j = 0; last<end & j < regions.size(); j++)\r
+ {\r
+ region = (int[]) regions.elementAt(j);\r
+ hideStart = region[0];\r
+ hideEnd = region[1];\r
+ // edit hidden regions to selection range\r
+ if(hideStart<last) {\r
+ if (hideEnd > last)\r
+ {\r
+ hideStart = last;\r
+ } else\r
+ continue;\r
+ }\r
+\r
+ if (hideStart>end)\r
+ break;\r
+\r
+ if (hideEnd>end)\r
+ hideEnd=end;\r
+\r
+ if (hideStart>hideEnd)\r
+ break;\r
+ /**\r
+ * form operations...\r
+ */\r
+ if (last<hideStart)\r
+ selection.addOperation(CigarArray.M, hideStart-last);\r
+ selection.addOperation(CigarArray.D, 1+hideEnd-hideStart);\r
+ last = hideEnd+1;\r
+ }\r
+ // Final match if necessary.\r
+ if (last<end)\r
+ selection.addOperation(CigarArray.M, end-last+1);\r
+ } else {\r
+ selection.addOperation(CigarArray.M, end-start+1);\r
+ }\r
+ return selection;\r
+ }\r
+ /**\r
+ * return a compact representation of the current alignment selection to\r
+ * pass to an analysis function\r
+ * @param selectedOnly boolean true to just return the selected view\r
+ * @return AlignmentView\r
+ */\r
+ jalview.datamodel.AlignmentView getAlignmentView(boolean selectedOnly) {\r
+ // JBPNote:\r
+ // this is here because the AlignmentView constructor modifies the CigarArray\r
+ // object. Refactoring of Cigar and alignment view representation should\r
+ // be done to remove redundancy.\r
+ CigarArray aligview = getViewAsCigars(selectedOnly);\r
+ if (aligview!=null)\r
+ return new AlignmentView(aligview);\r
+ return null;\r
+ }\r
+ /**\r
+ * This method returns the visible alignment as text, as\r
+ * seen on the GUI, ie if columns are hidden they will not\r
+ * be returned in the result.\r
+ * Use this for calculating trees, PCA, redundancy etc on views\r
+ * which contain hidden columns.\r
+ * @return String[]\r
+ */\r
+ public String [] getViewAsString(boolean selectedRegionOnly)\r
+ {\r
+ String [] selection = null;\r
+ SequenceI [] seqs= null;\r
+ int i, iSize;\r
+ int start = 0, end = 0;\r
+ if(selectedRegionOnly && selectionGroup!=null)\r
+ {\r
+ iSize = selectionGroup.getSize(false);\r
+ seqs = selectionGroup.getSequencesInOrder(alignment);\r
+ start = selectionGroup.getStartRes();\r
+ end = selectionGroup.getEndRes()+1;\r
+ }\r
+ else\r
+ {\r
+ iSize = alignment.getHeight();\r
+ seqs = alignment.getSequencesArray();\r
+ end = alignment.getWidth();\r
+ }\r
+\r
+ selection = new String[iSize];\r
+\r
+\r
+ for(i=0; i<iSize; i++)\r
+ {\r
+ if (hasHiddenColumns)\r
+ {\r
+ StringBuffer visibleSeq = new StringBuffer();\r
+ Vector regions = colSel.getHiddenColumns();\r
+\r
+ int blockStart = start, blockEnd=end;\r
+ int [] region;\r
+ int hideStart, hideEnd;\r
+\r
+ for (int j = 0; j < regions.size(); j++)\r
+ {\r
+ region = (int[]) regions.elementAt(j);\r
+ hideStart = region[0];\r
+ hideEnd = region[1];\r
+\r
+ if(hideStart < start)\r
+ {\r
+ continue;\r
+ }\r
+\r
+ blockStart = Math.min(blockStart, hideEnd+1);\r
+ blockEnd = Math.min(blockEnd, hideStart);\r
+\r
+ if(blockStart>blockEnd)\r
+ {\r
+ break;\r
+ }\r
+\r
+\r
+ visibleSeq.append(seqs[i].getSequence(blockStart, blockEnd));\r
+\r
+ blockStart = hideEnd+1;\r
+ blockEnd = end;\r
+ }\r
+\r
+ if(end>blockStart)\r
+ visibleSeq.append(seqs[i].getSequence(blockStart, end));\r
+\r
+ selection[i] = visibleSeq.toString();\r
+ }\r
+ else\r
+ {\r
+ selection[i] = seqs[i].getSequence(start, end);\r
+ }\r
+ }\r
+\r
+ return selection;\r
+ }\r
+\r
+ public boolean getShowHiddenMarkers()\r
+ {\r
+ return showHiddenMarkers;\r
+ }\r
+\r
+ public void setShowHiddenMarkers(boolean show)\r
+ {\r
+ showHiddenMarkers = show;\r
+ }\r
\r
\r
}\r