Merge branch 'test_paolo_JAL-1065' into Tcoffee_JAL-1065
authorjprocter <jprocter@compbio.dundee.ac.uk>
Fri, 4 May 2012 16:08:21 +0000 (17:08 +0100)
committerjprocter <jprocter@compbio.dundee.ac.uk>
Fri, 4 May 2012 16:08:21 +0000 (17:08 +0100)
Conflicts:
src/jalview/appletgui/AlignFrame.java
src/jalview/gui/AlignFrame.java
updated handler methods for creating colourscheme for new 'jalviewish' approach to storing tcoffee scores.

41 files changed:
.classpath
help/html/features/preferences.html
lib/castor-1.1-cycle-xml.jar
lib/jaxrpc.jar
lib/log4j-1.2.8.jar
lib/saaj.jar
src/jalview/appletgui/AlignFrame.java
src/jalview/appletgui/AlignViewport.java
src/jalview/appletgui/SequenceRenderer.java
src/jalview/appletgui/UserDefinedColours.java
src/jalview/bin/Cache.java
src/jalview/datamodel/Alignment.java
src/jalview/datamodel/AlignmentI.java
src/jalview/datamodel/AnnotatedCollectionI.java [new file with mode: 0644]
src/jalview/datamodel/SequenceGroup.java
src/jalview/ext/jmol/JalviewJmolBinding.java
src/jalview/gui/AlignFrame.java
src/jalview/gui/AlignViewport.java
src/jalview/gui/AlignmentPanel.java
src/jalview/gui/AppJmol.java
src/jalview/gui/Desktop.java
src/jalview/gui/Jalview2XML.java
src/jalview/gui/Preferences.java
src/jalview/gui/RestInputParamEditDialog.java
src/jalview/gui/SequenceRenderer.java
src/jalview/gui/UserDefinedColours.java
src/jalview/io/TCoffeeScoreFile.java
src/jalview/jbgui/GPreferences.java
src/jalview/schemes/AnnotationColourGradient.java
src/jalview/schemes/Blosum62ColourScheme.java
src/jalview/schemes/ClustalxColourScheme.java
src/jalview/schemes/ColourSchemeI.java
src/jalview/schemes/ColourSchemeProperty.java
src/jalview/schemes/NucleotideColourScheme.java
src/jalview/schemes/PIDColourScheme.java
src/jalview/schemes/ResidueColourScheme.java
src/jalview/schemes/ScoreColourScheme.java
src/jalview/schemes/TCoffeeColourScheme.java
src/jalview/schemes/UserColourScheme.java
src/jalview/util/Platform.java
src/jalview/ws/rest/RestServiceDescription.java

index 0c39740..00ac7f2 100644 (file)
@@ -3,7 +3,6 @@
        <classpathentry kind="src" path="src"/>
        <classpathentry kind="src" path="test"/>
        <classpathentry kind="con" path="org.eclipse.jdt.launching.JRE_CONTAINER"/>
-       <classpathentry kind="lib" path="/Library/Java/JavaVirtualMachines/1.6.0_29-b11-402.jdk/Contents/Home/lib/plugin.jar"/>
        <classpathentry kind="lib" path="lib/activation.jar"/>
        <classpathentry kind="lib" path="lib/axis.jar" sourcepath="D:/axis-1_2RC2-src/axis-1_2RC2"/>
        <classpathentry kind="lib" path="lib/commons-discovery.jar"/>
@@ -42,7 +41,6 @@
        <classpathentry kind="lib" path="lib/commons-codec-1.3.jar"/>
        <classpathentry kind="lib" path="lib/Jmol-12.2.4.jar"/>
        <classpathentry kind="con" path="org.eclipse.jdt.USER_LIBRARY/plugin.jar"/>
-       <classpathentry kind="lib" path="appletlib/JmolApplet-12.2.4.jar"/>
        <classpathentry kind="con" path="org.eclipse.jdt.junit.JUNIT_CONTAINER/4"/>
        <classpathentry kind="output" path="classes"/>
 </classpath>
index 61e3eb0..7bc2a61 100755 (executable)
@@ -143,6 +143,11 @@ style for EPS export:
        make an EPS file.</li>
 </ul>
 </p>
+<p><em>Automatically set ID width</em><br>
+When enabled, the column containing sequence and annotation labels at the left hand side of an exported figure will be made large enough to display each sequence ID and annotation label in its own line. Enable this if you have particularly long sequence IDs and need to generate EPS or PNG figures or web pages.</p>
+<p><em>Figure ID column width</em><br>
+Manually specify the width of the left hand column where sequence IDs and annotation labels will be rendered in exported alignment figures. This setting will be ignored if <em>&quot;Automatically set ID width&quot;</em> is set.
+</p>
 <p><em>Sequence//Start-End Numbering</em><br>
 The output tab also has a group of checkboxes for each file format. If
 these are ticked, then Jalview will write files with the start and end
index 2c9332e..1cfc700 100644 (file)
Binary files a/lib/castor-1.1-cycle-xml.jar and b/lib/castor-1.1-cycle-xml.jar differ
index 17f7559..ebd457b 100755 (executable)
Binary files a/lib/jaxrpc.jar and b/lib/jaxrpc.jar differ
index 493a3cc..05f8702 100755 (executable)
Binary files a/lib/log4j-1.2.8.jar and b/lib/log4j-1.2.8.jar differ
index 465dd55..fcdd67d 100755 (executable)
Binary files a/lib/saaj.jar and b/lib/saaj.jar differ
index 15904df..90b1a05 100644 (file)
@@ -100,7 +100,6 @@ public class AlignFrame extends EmbmenuFrame implements ActionListener,  ItemLis
 \r
   String jalviewServletURL;\r
   \r
-  TCoffeeScoreFile tcoffeeScoreFile;\r
 \r
   public AlignFrame(AlignmentI al, jalview.bin.JalviewLite applet, String title, boolean embedded)\r
   {\r
@@ -998,7 +997,7 @@ public class AlignFrame extends EmbmenuFrame implements ActionListener,  ItemLis
       changeColour(new Blosum62ColourScheme());\r
     }\r
     else if (source == tcoffeeColour) {\r
-        changeColour(new TCoffeeColourScheme(tcoffeeScoreFile));\r
+        changeColour(new TCoffeeColourScheme(alignPanel.getAlignment()));\r
     }\r
     else if (source == annotationColour)\r
     {\r
@@ -3682,6 +3681,8 @@ public class AlignFrame extends EmbmenuFrame implements ActionListener,  ItemLis
          \r
          TCoffeeScoreFile file = TCoffeeScoreFile.load( new InputStreamReader( url.openStream() ) );\r
          if( file == null ) {\r
+        // TODO: raise a dialog box here rather than bomb out.\r
+            \r
                  throw new RuntimeException("The file provided does not match the T-Coffee scores file format");\r
          }\r
          \r
@@ -3690,14 +3691,18 @@ public class AlignFrame extends EmbmenuFrame implements ActionListener,  ItemLis
           */\r
          AlignmentI aln; \r
          if( (aln=viewport.alignment) != null && (aln.getHeight() != file.getHeight() || aln.getWidth() != file.getWidth()) ) {\r
-                 throw new RuntimeException("The scores matrix does not match the alignment dimensions");\r
+           // TODO: raise a dialog box here rather than bomb out.\r
+           throw new RuntimeException("The scores matrix does not match the alignment dimensions");\r
+                 \r
          }\r
          \r
-         tcoffeeColour.setEnabled(true);\r
-         tcoffeeScoreFile = file;\r
-         \r
-         // switch to this color\r
-         changeColour(new TCoffeeColourScheme(tcoffeeScoreFile));\r
+          // TODO add parameter to indicate if matching should be done\r
+         if (file.annotateAlignment(alignPanel.getAlignment(), false))\r
+         {\r
+                 tcoffeeColour.setEnabled(true);\r
+                 // switch to this color\r
+                 changeColour(new TCoffeeColourScheme(alignPanel.getAlignment()));\r
+          }\r
   }\r
   \r
   \r
index ff8f7df..46945b6 100644 (file)
@@ -1478,6 +1478,7 @@ public class AlignViewport implements SelectionSource, VamsasSource
     ColourSchemeI cs = globalColourScheme;
     if (cs != null)
     {
+      cs.alignmentChanged(alignment);
       if (cs instanceof ClustalxColourScheme)
       {
         ((ClustalxColourScheme) cs).resetClustalX(alignment.getSequences(),
index 32ff59a..2bd3a9e 100755 (executable)
@@ -87,7 +87,7 @@ public class SequenceRenderer implements jalview.api.SequenceRenderer
   {
     if (cs != null)
     {
-      resBoxColour = cs.findColour(seq.getCharAt(i), i, seq.getIndex());
+      resBoxColour = cs.findColour(seq.getCharAt(i), i, seq);
     }
     else if (forOverview
             && !jalview.util.Comparison.isGap(seq.getCharAt(i)))
index 4ebe3b7..19ca45d 100755 (executable)
@@ -397,7 +397,7 @@ public class UserDefinedColours extends Panel implements ActionListener,
     {
       try
       {
-        col = oldColourScheme.findColour(aa.charAt(0), -1, -1);
+        col = oldColourScheme.findColour(aa.charAt(0), -1, null);
       } catch (Exception ex)
       {
       }
index ba1d0a8..069589e 100755 (executable)
@@ -133,6 +133,8 @@ import org.biojava.dasobert.dasregistry.Das1Source;
  * <li>ANNOTATIONCOLOUR_MAX (red) Shade used for maximum value of annotation when shading by annotation</li>
  * <li>www.jalview.org (http://www.jalview.org) a property enabling all HTTP requests to be redirected to a mirror of http://www.jalview.org</li>
  * 
+ * <li>FIGURE_AUTOIDWIDTH (false) Expand the left hand column of an exported alignment figure to accommodate even the longest sequence ID or annotation label.</li>
+ * <li>FIGURE_FIXEDIDWIDTH Specifies the width to use for the left-hand column when exporting an alignment as a figure (setting FIGURE_AUTOIDWIDTH to true will override this).</li>
  * <li></li>
  * 
  * </ul>
@@ -802,4 +804,24 @@ public class Cache
     }
     return null;
   }
+
+  /**
+   * get and parse a property as an integer. send any parsing problems to System.err
+   * @param property
+   * @return null or Integer
+   */
+  public static Integer getIntegerProperty(String property)
+  {
+    String val=getProperty(property);
+    if (val!=null && (val=val.trim()).length()>0)
+    {
+      try {
+        return Integer.valueOf(val);
+      } catch (NumberFormatException x)
+      {
+        System.err.println("Invalid integer in property '"+property+"' (value was '"+val+"')");
+      }
+    }
+    return null;
+  }
 }
index 707eee8..8080fb4 100755 (executable)
@@ -799,10 +799,9 @@ public class Alignment implements AlignmentI
     annotations = temp;
   }
 
+  @Override
   /**
-   * DOCUMENT ME!
-   * 
-   * @return DOCUMENT ME!
+   * returns all annotation on the alignment
    */
   public AlignmentAnnotation[] getAlignmentAnnotation()
   {
index be1bff7..714cf45 100755 (executable)
@@ -22,7 +22,7 @@ import java.util.*;
 /**
  * Data structure to hold and manipulate a multiple sequence alignment
  */
-public interface AlignmentI
+public interface AlignmentI extends AnnotatedCollectionI
 {
   /**
    * Calculates the number of sequences in an alignment
diff --git a/src/jalview/datamodel/AnnotatedCollectionI.java b/src/jalview/datamodel/AnnotatedCollectionI.java
new file mode 100644 (file)
index 0000000..d7a0339
--- /dev/null
@@ -0,0 +1,14 @@
+package jalview.datamodel;
+
+import java.util.List;
+
+public interface AnnotatedCollectionI
+{
+
+  /**
+   * TODO: decide if null is a valid response if there is no annotation on the object
+   * @return null
+   */
+  AlignmentAnnotation[] getAlignmentAnnotation();
+
+}
index 01bf677..b0eabff 100755 (executable)
@@ -30,7 +30,7 @@ import jalview.schemes.*;
  * @author $author$
  * @version $Revision$
  */
-public class SequenceGroup
+public class SequenceGroup implements AnnotatedCollectionI
 {
   String groupName;
 
@@ -477,7 +477,10 @@ public class SequenceGroup
     {
       return;
     }
-
+    if (cs!=null)
+    {
+      cs.alignmentChanged(this);
+    }
     try
     {
       Hashtable cnsns[] = AAFrequency.calculate(sequences, startRes,
@@ -1167,4 +1170,33 @@ public class SequenceGroup
   {
     return showConsensusHistogram;
   }
+
+  @Override
+  /**
+   * returns a new array with all annotation involving this group
+   */
+  public AlignmentAnnotation[] getAlignmentAnnotation()
+  {
+    // TODO add in other methods like 'getAlignmentAnnotation(String label), etc'
+    ArrayList<AlignmentAnnotation> annot = new ArrayList<AlignmentAnnotation>();
+    for (SequenceI seq:(Vector<SequenceI>)sequences)
+    {
+      for (AlignmentAnnotation al: seq.getAnnotation())
+      {
+        if (al.groupRef==this)
+        {
+          annot.add(al);
+        }
+      }
+    }
+    if (consensus!=null)
+    {
+      annot.add(consensus);
+    }
+    if (conservation!=null)
+    {
+      annot.add(conservation);
+    }
+    return annot.toArray(new AlignmentAnnotation[0]);
+  }
 }
index 0640b8c..a625fd7 100644 (file)
@@ -357,7 +357,7 @@ public abstract class JalviewJmolBinding implements StructureListener,
       for (int pdbfnum = 0; pdbfnum < files.length; pdbfnum++)\r
       {\r
         StructureMapping[] mapping = ssm.getMapping(files[pdbfnum]);\r
-\r
+        // RACE CONDITION - getMapping only returns Jmol loaded filenames once Jmol callback has completed. \r
         if (mapping == null || mapping.length < 1)\r
           continue;\r
 \r
@@ -690,10 +690,17 @@ public abstract class JalviewJmolBinding implements StructureListener,
       String mset[] = new String[viewer.getModelCount()];\r
       _modelFileNameMap = new int[mset.length];\r
       int j = 1;\r
-      mset[0] = viewer.getModelFileName(0);\r
+      String m=viewer.getModelFileName(0);\r
+      if (m!=null)\r
+      {\r
+        mset[0] = new File(m).getAbsolutePath();\r
+      }\r
       for (int i = 1; i < mset.length; i++)\r
       {\r
-        mset[j] = viewer.getModelFileName(i);\r
+        m=viewer.getModelFileName(i);\r
+        if (m!=null) {\r
+          mset[j] = new File(m).getAbsolutePath();\r
+        }\r
         _modelFileNameMap[j] = i; // record the model index for the filename\r
         // skip any additional models in the same file (NMR structures)\r
         if ((mset[j] == null ? mset[j] != mset[j - 1]\r
@@ -869,8 +876,17 @@ public abstract class JalviewJmolBinding implements StructureListener,
       try\r
       {\r
         // recover PDB filename for the model hovered over.\r
-        pdbfilename = viewer\r
-                .getModelFileName(new Integer(mdlId).intValue() - 1);\r
+        int _mp=_modelFileNameMap.length-1,\r
+                mnumber=new Integer(mdlId).intValue() - 1;\r
+        while(mnumber<_modelFileNameMap[_mp])\r
+        {\r
+          _mp--;\r
+        }\r
+        pdbfilename = modelFileNames[_mp];\r
+        if (pdbfilename==null) {pdbfilename=new File(viewer\r
+                .getModelFileName(mnumber)).getAbsolutePath();\r
+        }\r
+        \r
       } catch (Exception e)\r
       {\r
       }\r
@@ -1130,7 +1146,8 @@ public abstract class JalviewJmolBinding implements StructureListener,
           }\r
           else\r
           {\r
-            if (matches = pdbentry[pe].getFile().equals(fileName))\r
+            File fl;\r
+            if (matches = (fl=new File(pdbentry[pe].getFile())).equals(new File(fileName)))\r
             {\r
               foundEntry = true;\r
               // TODO: Jmol can in principle retrieve from CLASSLOADER but\r
@@ -1141,7 +1158,6 @@ public abstract class JalviewJmolBinding implements StructureListener,
               String protocol = AppletFormatAdapter.URL;\r
               try\r
               {\r
-                File fl = new java.io.File(pdbentry[pe].getFile());\r
                 if (fl.exists())\r
                 {\r
                   protocol = AppletFormatAdapter.FILE;\r
@@ -1151,9 +1167,10 @@ public abstract class JalviewJmolBinding implements StructureListener,
               } catch (Error e)\r
               {\r
               }\r
-              ;\r
+              //Explicitly map to the filename used by Jmol ;\r
               pdb = ssm.setMapping(sequence[pe], chains[pe],\r
-                      pdbentry[pe].getFile(), protocol);\r
+                      fileName, protocol);\r
+                      //pdbentry[pe].getFile(), protocol);\r
 \r
             }\r
           }\r
@@ -1164,7 +1181,7 @@ public abstract class JalviewJmolBinding implements StructureListener,
             {\r
               String chid = new String(pdb.id + ":"\r
                       + ((MCview.PDBChain) pdb.chains.elementAt(i)).id);\r
-              chainFile.put(chid, pdbentry[pe].getFile());\r
+              chainFile.put(chid, fileName);\r
               chainNames.addElement(chid);\r
             }\r
             notifyLoaded = true;\r
index 3ba7319..221d52c 100755 (executable)
@@ -143,8 +143,6 @@ public class AlignFrame extends GAlignFrame implements DropTargetListener,
 
   Vector alignPanels = new Vector();
   
-  TCoffeeScoreFile tcoffeeScoreFile;
-
   /**
    * Last format used to load or save alignments in this window
    */
@@ -3884,6 +3882,8 @@ public class AlignFrame extends GAlignFrame implements DropTargetListener,
              {
                  TCoffeeScoreFile result = TCoffeeScoreFile.load(new File(sFilePath));
                  if( result == null ) { 
+                      // TODO: raise a dialog box here rather than bomb out.
+                 
                          throw new RuntimeException("The file provided does not match the T-Coffee scores file format"); 
                  }
 
@@ -3892,14 +3892,19 @@ public class AlignFrame extends GAlignFrame implements DropTargetListener,
                   */
                  AlignmentI aln; 
                  if( (aln=viewport.alignment) != null && (aln.getHeight() != result.getHeight() || aln.getWidth() != result.getWidth()) ) {
-                         throw new RuntimeException("The scores matrix does not match the alignment dimensions");
+                     // TODO: raise a dialog box here rather than bomb out.
+                   throw new RuntimeException("The scores matrix does not match the alignment dimensions");
                  }
-
-                 changeColour( new TCoffeeColourScheme(result) );
-                 tcoffeeScoreFile = result;
-                 tcoffeeColour.setEnabled(true);
-                 tcoffeeColour.setSelected(true);
-                 
+                 if (result.annotateAlignment(alignPanel.getAlignment(), true))
+                 {
+                         tcoffeeColour.setEnabled(true);
+                         tcoffeeColour.setSelected(true);
+                         // switch to this color
+                         changeColour(new TCoffeeColourScheme(alignPanel.getAlignment()));
+                 } else {
+                   tcoffeeColour.setEnabled(false);
+                   tcoffeeColour.setSelected(false);
+                 }
              } 
              catch (Exception ex) {
                JOptionPane.showMessageDialog(
@@ -3917,9 +3922,7 @@ public class AlignFrame extends GAlignFrame implements DropTargetListener,
   
   @Override
   protected void tcoffeeColorScheme_actionPerformed(ActionEvent e) {
-         if( tcoffeeScoreFile != null ) {
-         changeColour( new TCoffeeColourScheme(tcoffeeScoreFile) );
-         }
+         changeColour( new TCoffeeColourScheme(alignPanel.getAlignment()) );
   }
   
 //  /**
index 13f66d9..ac364b9 100644 (file)
@@ -1763,6 +1763,7 @@ public class AlignViewport implements SelectionSource, VamsasSource
     ColourSchemeI cs = globalColourScheme;
     if (cs != null)
     {
+      cs.alignmentChanged(alignment);
       if (cs instanceof ClustalxColourScheme)
       {
         ((ClustalxColourScheme) cs).resetClustalX(alignment.getSequences(),
index b7028ac..95ef295 100644 (file)
@@ -174,15 +174,28 @@ public class AlignmentPanel extends GAlignmentPanel implements
    */
   public Dimension calculateIdWidth()
   {
+    // calculate sensible default width when no preference is available
+    
+    int afwidth = (alignFrame != null ? alignFrame.getWidth() : 300);
+    int maxwidth = Math.max(20,
+            Math.min(afwidth - 200, (int) 2 * afwidth / 3));
+    return calculateIdWidth(maxwidth);
+  }
+  /**
+   * Calculate the width of the alignment labels based on the displayed names
+   * and any bounds on label width set in preferences.
+   * @param maxwidth -1 or maximum width allowed for IdWidth
+   * @return Dimension giving the maximum width of the alignment label panel
+   *         that should be used.
+   */
+  public Dimension calculateIdWidth(int maxwidth)
+  {
     Container c = new Container();
 
     FontMetrics fm = c.getFontMetrics(new Font(av.font.getName(),
             Font.ITALIC, av.font.getSize()));
 
     AlignmentI al = av.getAlignment();
-    int afwidth = (alignFrame != null ? alignFrame.getWidth() : 300);
-    int maxwidth = Math.max(20,
-            Math.min(afwidth - 200, (int) 2 * afwidth / 3));
     int i = 0;
     int idWidth = 0;
     String id;
@@ -221,7 +234,7 @@ public class AlignmentPanel extends GAlignmentPanel implements
       }
     }
 
-    return new Dimension(Math.min(maxwidth, idWidth), 12);
+    return new Dimension(maxwidth<0 ? idWidth : Math.min(maxwidth, idWidth), 12);
   }
 
   /**
@@ -789,7 +802,7 @@ public class AlignmentPanel extends GAlignmentPanel implements
   public int printUnwrapped(Graphics pg, int pwidth, int pheight, int pi)
           throws PrinterException
   {
-    int idWidth = getVisibleIdWidth();
+    int idWidth = getVisibleIdWidth(false);
     FontMetrics fm = getFontMetrics(av.getFont());
     int scaleHeight = av.charHeight + fm.getDescent();
 
@@ -956,7 +969,7 @@ public class AlignmentPanel extends GAlignmentPanel implements
     int cHeight = av.getAlignment().getHeight() * av.charHeight + hgap
             + annotationHeight;
 
-    int idWidth = getVisibleIdWidth();
+    int idWidth = getVisibleIdWidth(false);
 
     int maxwidth = av.alignment.getWidth();
     if (av.hasHiddenColumns)
@@ -1029,11 +1042,33 @@ public class AlignmentPanel extends GAlignmentPanel implements
       return Printable.NO_SUCH_PAGE;
     }
   }
-
+  /**
+   * get current sequence ID panel width, or nominal value if panel were to be displayed using default settings
+   * @return
+   */
   int getVisibleIdWidth()
   {
-    return idPanel.getWidth() > 0 ? idPanel.getWidth()
-            : calculateIdWidth().width + 4;
+    return getVisibleIdWidth(true);
+  }
+
+  /**
+   * get current sequence ID panel width, or nominal value if panel were to be displayed using default settings
+   * @param onscreen indicate if the Id width for onscreen or offscreen display should be returned
+   * @return
+   */
+  int getVisibleIdWidth(boolean onscreen)
+  {
+    // see if rendering offscreen - check preferences and calc width accordingly
+    if (!onscreen && Cache.getDefault("FIGURE_AUTOIDWIDTH", false))
+    {
+      return calculateIdWidth(-1).width+4;
+    }
+    Integer idwidth=null;
+    if (onscreen || (idwidth=Cache.getIntegerProperty("FIGURE_FIXEDIDWIDTH"))==null) {
+      return (idPanel.getWidth() > 0 ? idPanel.getWidth()
+            : calculateIdWidth().width + 4);
+    }
+    return idwidth.intValue()+4;
   }
 
   void makeAlignmentImage(int type, File file)
@@ -1046,7 +1081,7 @@ public class AlignmentPanel extends GAlignmentPanel implements
 
     int height = ((av.alignment.getHeight() + 1) * av.charHeight)
             + scalePanel.getHeight();
-    int width = getVisibleIdWidth() + (maxwidth * av.charWidth);
+    int width = getVisibleIdWidth(false) + (maxwidth * av.charWidth);
 
     if (av.getWrapAlignment())
     {
@@ -1054,14 +1089,16 @@ public class AlignmentPanel extends GAlignmentPanel implements
       if (System.getProperty("java.awt.headless") != null
               && System.getProperty("java.awt.headless").equals("true"))
       {
-        // TODO: JAL-244
+        // need to obtain default alignment width and then add in any additional allowance for id margin
+        // this duplicates the calculation in getWrappedHeight but adjusts for offscreen idWith
         width = alignFrame.getWidth() - vscroll.getPreferredSize().width
                 - alignFrame.getInsets().left
-                - alignFrame.getInsets().right;
+                - alignFrame.getInsets().right
+                - getVisibleIdWidth()+getVisibleIdWidth(false);
       }
       else
       {
-        width = seqPanel.getWidth() + getVisibleIdWidth();
+        width = seqPanel.getWidth() + getVisibleIdWidth(false);
       }
 
     }
@@ -1136,7 +1173,7 @@ public class AlignmentPanel extends GAlignmentPanel implements
   {
     // /////ONLY WORKS WITH NONE WRAPPED ALIGNMENTS
     // ////////////////////////////////////////////
-    int idWidth = getVisibleIdWidth();
+    int idWidth = getVisibleIdWidth(false);
     FontMetrics fm = getFontMetrics(av.getFont());
     int scaleHeight = av.charHeight + fm.getDescent();
 
index 2c0d7d6..93a2994 100644 (file)
@@ -35,6 +35,7 @@ import jalview.structure.*;
 import jalview.datamodel.PDBEntry;
 import jalview.io.*;
 import jalview.schemes.*;
+import jalview.util.Platform;
 
 public class AppJmol extends GStructureViewer implements Runnable,
         SequenceStructureBinding, ViewSetProvider
@@ -321,7 +322,6 @@ public class AppJmol extends GStructureViewer implements Runnable,
     openNewJmol(ap, new PDBEntry[] { pdbentry }, new SequenceI[][] { seq });
   }
   private void openNewJmol(AlignmentPanel ap, PDBEntry[] pdbentrys, SequenceI[][] seqs) {
-    boolean promptUser=pdbentrys.length==1;
     progressBar = ap.alignFrame;
     jmb = new AppJmolBinding(this, ap.getStructureSelectionManager(), pdbentrys, seqs, null, null);
     addAlignmentPanel(ap);
@@ -335,24 +335,11 @@ public class AppJmol extends GStructureViewer implements Runnable,
     setSize(400, 400); // probably should be a configurable/dynamic default here
     initMenus();
     worker=null;
-    String filelist="";
-//    for (PDBEntry pe: pdbentrys)
-//    {
-//      if (pe.getFile()==null)
       {
         addingStructures = false;
         worker = new Thread(this);
         worker.start();
-//        break;
       }
-//      filelist+=" \""+pe.getFile()+"\"";
-              
-/*    }
-    if (worker==null)
-    {
-      initJmol("load"+(pdbentrys.length>1 ? " APPEND" : "") + filelist);
-    }
-*/
     this.addInternalFrameListener(new InternalFrameAdapter()
     {
       public void internalFrameClosing(InternalFrameEvent internalFrameEvent)
@@ -736,9 +723,11 @@ public class AppJmol extends GStructureViewer implements Runnable,
           {
             // just transfer the file name from the first sequence's first
             // PDBEntry
-            jmb.pdbentry[pi].setFile(file = ((PDBEntry) pdbseq
-                    .getSequenceAt(0).getPDBId().elementAt(0)).getFile());
-            files.append(" \"" + file + "\"");
+            file = new File(((PDBEntry) pdbseq
+                    .getSequenceAt(0).getPDBId().elementAt(0)).getFile()).getAbsolutePath();
+            jmb.pdbentry[pi].setFile(file);
+            
+            files.append(" \"" + Platform.escapeString(file) + "\"");
           }
           else
           {
@@ -761,7 +750,7 @@ public class AppJmol extends GStructureViewer implements Runnable,
           }
           if (file != null)
           {
-            files.append(" \"" + file + "\"");
+            files.append(" \"" + Platform.escapeString(file) + "\"");
           }
         }
       }
index 2a72e44..b6cbea3 100644 (file)
@@ -204,6 +204,10 @@ public class Desktop extends jalview.jbgui.GDesktop implements
 
     public void dragFrame(JComponent f, int newX, int newY)
     {
+      if (newY<0)
+      {
+        newY=0;
+      }
       delegate.dragFrame(f, newX, newY);
     }
 
@@ -240,6 +244,11 @@ public class Desktop extends jalview.jbgui.GDesktop implements
     public void resizeFrame(JComponent f, int newX, int newY, int newWidth,
             int newHeight)
     {
+      Rectangle b=desktop.getBounds();
+      if (newY<0)
+      {
+        newY=0;
+      }
       delegate.resizeFrame(f, newX, newY, newWidth, newHeight);
     }
 
@@ -282,12 +291,14 @@ public class Desktop extends jalview.jbgui.GDesktop implements
     //sp.getViewport().setView(desktop);
     //getContentPane().add(sp, BorderLayout.CENTER);
     getContentPane().add(desktop, BorderLayout.CENTER);
-      desktop.setDragMode(JDesktopPane.OUTLINE_DRAG_MODE);
+    desktop.setDragMode(JDesktopPane.OUTLINE_DRAG_MODE);
+    
       
     // This line prevents Windows Look&Feel resizing all new windows to maximum
     // if previous window was maximised
     desktop.setDesktopManager(new MyDesktopManager(
             new DefaultDesktopManager()));
+    
     Rectangle dims = getLastKnownDimensions("");
     if (dims != null)
     {
@@ -335,7 +346,8 @@ public class Desktop extends jalview.jbgui.GDesktop implements
       }
     });
 
-    this.addMouseListener(new MouseAdapter()
+    MouseAdapter ma;
+    this.addMouseListener(ma=new MouseAdapter()
     {
       public void mousePressed(MouseEvent evt)
       {
@@ -345,6 +357,8 @@ public class Desktop extends jalview.jbgui.GDesktop implements
         }
       }
     });
+    desktop.addMouseListener(ma);
+   
     this.addFocusListener(new FocusListener()
     {
       
@@ -2052,7 +2066,6 @@ public class Desktop extends jalview.jbgui.GDesktop implements
         }
       }
     }
-
   }
 
   /**
index cb29ab5..b1b1f55 100644 (file)
@@ -38,6 +38,7 @@ import jalview.datamodel.SequenceI;
 import jalview.schemabinding.version2.*;
 import jalview.schemes.*;
 import jalview.structure.StructureSelectionManager;
+import jalview.util.Platform;
 import jalview.util.jarInputStreamProvider;
 
 /**
@@ -612,7 +613,8 @@ public class Jalview2XML
 
                 for (int smap = 0; smap < jmol.jmb.sequence[peid].length; smap++)
                 {
-                  if (jal.findIndex(jmol.jmb.sequence[peid][smap]) > -1)
+//                  if (jal.findIndex(jmol.jmb.sequence[peid][smap]) > -1)
+                  if (jds==jmol.jmb.sequence[peid][smap])
                   {
                     StructureState state = new StructureState();
                     state.setVisible(true);
@@ -1822,9 +1824,9 @@ public class Jalview2XML
         }
         ;
         out.close();
-
-        alreadyLoadedPDB.put(pdbId, outFile.getAbsolutePath());
-        return outFile.getAbsolutePath();
+        String t=outFile.getAbsolutePath();
+        alreadyLoadedPDB.put(pdbId, t);
+        return t;
       }
       else
       {
@@ -2626,12 +2628,13 @@ public class Jalview2XML
               }
               if (ids[p].getFile() != null)
               {
+                File mapkey=new File(ids[p].getFile());
                 Object[] seqstrmaps = (Object[]) ((Hashtable) jmoldat[2])
-                        .get(ids[p].getFile());
+                        .get(mapkey);
                 if (seqstrmaps == null)
                 {
                   ((Hashtable) jmoldat[2]).put(
-                          new File(ids[p].getFile()).toString(),
+                          mapkey,
                           seqstrmaps = new Object[]
                           { pdbFile, ids[p].getId(), new Vector(),
                               new Vector() });
@@ -2664,7 +2667,7 @@ public class Jalview2XML
           Object[] svattrib = entry.getValue();
           int[] geom = (int[]) svattrib[0];
           String state = (String) svattrib[1];
-          Hashtable<String, Object[]> oldFiles = (Hashtable<String, Object[]>) svattrib[2];
+          Hashtable<File, Object[]> oldFiles = (Hashtable<File, Object[]>) svattrib[2];
           final boolean useinJmolsuperpos = ((boolean[]) svattrib[3])[0], usetoColourbyseq = ((boolean[]) svattrib[3])[1], jmolColouring = ((boolean[]) svattrib[3])[2];
           int x = geom[0], y = geom[1], width = geom[2], height = geom[3];
           // collate the pdbfile -> sequence mappings from this view
@@ -2728,6 +2731,8 @@ public class Jalview2XML
               {
                 newFileLoc = new StringBuffer();
               }
+              do {
+                // look for next filename in load statement
               newFileLoc.append(state.substring(cp,
                       ncp = (state.indexOf("\"", ncp + 1) + 1)));
               String oldfilenam = state.substring(ncp,
@@ -2735,9 +2740,8 @@ public class Jalview2XML
               // recover the new mapping data for this old filename
               // have to normalize filename - since Jmol and jalview do filename
               // translation differently.
-              Object[] filedat = oldFiles.get(new File(oldfilenam)
-                      .toString());
-              newFileLoc.append(((String) filedat[0]));
+              Object[] filedat = oldFiles.get(new File(oldfilenam));
+              newFileLoc.append(Platform.escapeString((String) filedat[0]));
               pdbfilenames.addElement((String) filedat[0]);
               pdbids.addElement((String) filedat[1]);
               seqmaps.addElement((SequenceI[]) ((Vector<SequenceI>) filedat[2])
@@ -2745,6 +2749,7 @@ public class Jalview2XML
               newFileLoc.append("\"");
               cp = ecp + 1; // advance beyond last \" and set cursor so we can
                             // look for next file statement.
+              } while ((ncp=state.indexOf("/*file*/",cp))>-1);
             }
             if (cp > 0)
             {
@@ -2757,7 +2762,7 @@ public class Jalview2XML
                       .print("Ignoring incomplete Jmol state for PDB ids: ");
               newFileLoc = new StringBuffer(state);
               newFileLoc.append("; load append ");
-              for (String id : oldFiles.keySet())
+              for (File id : oldFiles.keySet())
               {
                 // add this and any other pdb files that should be present in
                 // the viewer
@@ -2855,7 +2860,7 @@ public class Jalview2XML
 
             // add mapping for sequences in this view to an already open Jmol
             // instance
-            for (String id : oldFiles.keySet())
+            for (File id : oldFiles.keySet())
             {
               // add this and any other pdb files that should be present in the
               // viewer
index 27c455e..789799e 100755 (executable)
@@ -201,7 +201,11 @@ public class Preferences extends GPreferences
     epsRendering.addItem("Text");
     epsRendering.setSelectedItem(Cache.getDefault("EPS_RENDERING",
             "Prompt each time"));
-
+    autoIdWidth.setSelected(Cache.getDefault("FIGURE_AUTOIDWIDTH", false));
+    userIdWidth.setEnabled(autoIdWidth.isSelected());
+    userIdWidthlabel.setEnabled(autoIdWidth.isSelected());
+    Integer wi = Cache.getIntegerProperty("FIGURE_USERIDWIDTH");
+    userIdWidth.setText(wi == null ? "" : wi.toString());
     blcjv.setSelected(Cache.getDefault("BLC_JVSUFFIX", true));
     clustaljv.setSelected(Cache.getDefault("CLUSTAL_JVSUFFIX", true));
     fastajv.setSelected(Cache.getDefault("FASTA_JVSUFFIX", true));
@@ -450,6 +454,12 @@ public class Preferences extends GPreferences
             Boolean.toString(modellerOutput.isSelected()));
     jalview.io.PIRFile.useModellerOutput = modellerOutput.isSelected();
 
+    Cache.applicationProperties.setProperty("FIGURE_AUTOIDWIDTH",
+            Boolean.toString(autoIdWidth.isSelected()));
+    userIdWidth_actionPerformed();
+    Cache.applicationProperties.setProperty("FIGURE_USERIDWIDTH",
+                userIdWidth.getText());
+
     Cache.applicationProperties.setProperty("AUTO_CALC_CONSENSUS",
             Boolean.toString(autoCalculateConsCheck.isSelected()));
     Cache.applicationProperties.setProperty("SORT_BY_TREE",
@@ -675,4 +685,38 @@ public class Preferences extends GPreferences
     maxColour.repaint();
   }
 
+  @Override
+  protected void userIdWidth_actionPerformed()
+  {
+    try
+    {
+      String val = userIdWidth.getText().trim();
+      if (val.length() > 0)
+      {
+        Integer iw = Integer.parseInt(val);
+        if (iw.intValue() < 12)
+        {
+          throw new NumberFormatException();
+        }
+        userIdWidth.setText(iw.toString());
+      }
+    } catch (NumberFormatException x)
+    {
+      JOptionPane
+              .showInternalMessageDialog(
+                      Desktop.desktop,
+                      "The user defined width for the\nannotation and sequence ID columns\nin exported figures must be\nat least 12 pixels wide.",
+                      "Invalid ID Column width",
+                      JOptionPane.WARNING_MESSAGE);
+      userIdWidth.setText("");
+    }
+  }
+
+  @Override
+  protected void autoIdWidth_actionPerformed()
+  {
+    userIdWidth.setEnabled(!autoIdWidth.isSelected());
+    userIdWidthlabel.setEnabled(!autoIdWidth.isSelected());
+  }
+
 }
index fcff86d..c085e8c 100644 (file)
@@ -26,8 +26,6 @@ import javax.swing.JOptionPane;
 import javax.swing.JPanel;
 import javax.swing.event.ListSelectionEvent;
 
-import com.sun.tools.corba.se.idl.InvalidArgument;
-
 import net.miginfocom.swing.MigLayout;
 
 import jalview.jbgui.GRestInputParamEditDialog;
index 15f1928..9c25e0d 100755 (executable)
@@ -115,7 +115,7 @@ public class SequenceRenderer implements jalview.api.SequenceRenderer
   {
     if (cs != null)
     {
-      resBoxColour = cs.findColour(seq.getCharAt(i), i, seq.getIndex());
+      resBoxColour = cs.findColour(seq.getCharAt(i), i, seq);
     }
     else if (forOverview
             && !jalview.util.Comparison.isGap(seq.getCharAt(i)))
index 8566e82..ca60354 100755 (executable)
@@ -386,7 +386,7 @@ public class UserDefinedColours extends GUserDefinedColours implements
       {
         try
         {
-          col = oldColourScheme.findColour(aa.charAt(0), -1, -1);
+          col = oldColourScheme.findColour(aa.charAt(0), -1, null);
         } catch (Exception ex)
         {
         }
index 2de4573..6cab3ae 100644 (file)
@@ -1,5 +1,12 @@
 package jalview.io;
 
+import jalview.analysis.SequenceIdMatcher;
+import jalview.datamodel.AlignmentAnnotation;
+import jalview.datamodel.AlignmentI;
+import jalview.datamodel.Annotation;
+import jalview.datamodel.SequenceI;
+
+import java.awt.Color;
 import java.io.BufferedReader;
 import java.io.File;
 import java.io.FileNotFoundException;
@@ -391,7 +398,77 @@ public class TCoffeeScoreFile {
                        return items.get("cons");
                }
        }
-       
-       
+       /**
+        * TCOFFEE score colourscheme
+        */
+       static final Color[] colors = {
+                       new Color( 102, 102, 255 ),     // #6666FF
+                       new Color( 0, 255, 0),          // #00FF00
+                       new Color( 102, 255, 0),        // #66FF00
+                       new Color( 204, 255, 0),        // #CCFF00
+                       new Color( 255, 255, 0),        // #FFFF00
+                       new Color( 255, 204, 0),        // #FFCC00
+                       new Color( 255, 153, 0),        // #FF9900
+                       new Color( 255, 102, 0),        // #FF6600
+                       new Color( 255, 51, 0),         // #FF3300
+                       new Color( 255, 34, 0)          // #FF2000
+               };
+       public final static String TCOFFEE_SCORE="TCoffeeScore";
+       /**
+        * generate annotation for this TCoffee score set on the given alignment
+        * @param al alignment to annotate
+        * @param matchids if true, annotate sequences based on matching sequence names
+        * @return true if alignment annotation was modified, false otherwise.
+        */
+       public boolean annotateAlignment(AlignmentI al, boolean matchids)
+       {
+         boolean added=false;
+         int i=0;
+         SequenceIdMatcher sidmatcher = new SequenceIdMatcher(al.getSequencesArray());
+         byte[][] scoreMatrix=getScoresArray();
+         // for 2.8 - we locate any existing TCoffee annotation and remove it first before adding this.
+         for (Map.Entry<String,StringBuilder> id:scores.entrySet())
+         {
+           byte[] srow=scoreMatrix[i];
+           SequenceI s;
+           if (matchids)
+           {
+             s=sidmatcher.findIdMatch(id.getKey());
+           } else {
+             s=al.getSequenceAt(i);
+           }
+           i++;
+            if (s==null && i!=scores.size() && !id.getKey().equals("cons"))
+            {
+              System.err.println("No "+(matchids ? "match ":" sequences left ")+" for TCoffee score set : "+id.getKey());
+              continue;
+            }
+            int jSize=al.getWidth()< srow.length ? al.getWidth() : srow.length;
+           Annotation[] annotations=new Annotation[al.getWidth()];
+           for (int j=0;j<jSize;j++) {
+             byte val = srow[j];
+             annotations[j]=new Annotation(s==null ? ""+val:null,s==null ? ""+val:null,(char) val,val*1f,val >= 0 && val < colors.length ? colors[val] : Color.white);
+           }
+           AlignmentAnnotation aa=null;
+           if (s!=null)
+           {
+             // TODO - set per sequence score
+             aa=new AlignmentAnnotation(TCOFFEE_SCORE, "Score for "+id.getKey(), annotations);
+             
+             aa.setSequenceRef(s);
+             aa.visible=false;
+             aa.belowAlignment=false;
+           } else {
+             aa=new AlignmentAnnotation("T-COFFEE", "TCoffee column reliability score", annotations);
+              aa.belowAlignment=true;
+             aa.visible=true;
+             
+           }
+           al.addAnnotation(aa);
+           added=true;
+         }
+         return added;
+       }
+         
 
 }
index 6cad0b5..29e11ce 100755 (executable)
@@ -160,6 +160,11 @@ public class GPreferences extends JPanel
   JLabel epsLabel = new JLabel();
 
   protected JComboBox epsRendering = new JComboBox();
+  
+  protected JLabel userIdWidthlabel = new JLabel();
+  protected JCheckBox autoIdWidth = new JCheckBox();
+  protected JTextField userIdWidth = new JTextField();
+
 
   JLabel jLabel1 = new JLabel();
 
@@ -635,9 +640,45 @@ public class GPreferences extends JPanel
     sortByTree.setText("Sort With New Tree");
     sortByTree.setToolTipText("When selected, any trees calculated or loaded onto the alignment will automatically sort the alignment.");
     sortByTree.setBounds(new Rectangle(22, 136, 168, 23));
+    
+    autoIdWidth.setFont(JvSwingUtils.getLabelFont());
+    autoIdWidth.setText("Automatically set ID width");
+    autoIdWidth.setToolTipText("<html>"+JvSwingUtils.wrapTooltip("Adjusts the width of the generated EPS or PNG file to ensure even the longest sequence ID or annotation label is displayed")+"</html>");
+    autoIdWidth.setBounds(new Rectangle(228, 96,188,23));
+    autoIdWidth.addActionListener(new ActionListener()
+    {
+      
+      @Override
+      public void actionPerformed(ActionEvent e)
+      {
+        autoIdWidth_actionPerformed();
+      }
+    });
+    userIdWidthlabel.setFont(JvSwingUtils.getLabelFont());
+    userIdWidthlabel.setText("Figure ID column width");
+    userIdWidth
+            .setToolTipText("<html>"+JvSwingUtils
+                    .wrapTooltip("Manually specify the width of the left hand column where sequence IDs and annotation labels will be rendered in exported alignment figures. This setting will be ignored if 'Automatically set ID width' is set")+"</html>");
+    userIdWidthlabel
+            .setToolTipText("<html>"+JvSwingUtils
+                    .wrapTooltip("Manually specify the width of the left hand column where sequence IDs and annotation labels will be rendered in exported alignment figures. This setting will be ignored if 'Automatically set ID width' is set")+"</html>");
+    userIdWidthlabel.setBounds(new Rectangle(236, 120,168,23));
+    userIdWidth.setFont(JvSwingUtils.getTextAreaFont());
+    userIdWidth.setText("");
+    userIdWidth.setBounds(new Rectangle(232,144,84,23));
+    userIdWidth.addActionListener(new ActionListener()
+    {
+      
+      @Override
+      public void actionPerformed(ActionEvent e)
+      {
+        userIdWidth_actionPerformed();
+      }
+    });
     modellerOutput.setFont(JvSwingUtils.getLabelFont());
     modellerOutput.setText("Use Modeller Output");
     modellerOutput.setBounds(new Rectangle(228, 226, 168, 23));
+
     dasPanel.setLayout(borderLayout4);
     wsPanel.setLayout(borderLayout5);
     wrap.setFont(JvSwingUtils.getLabelFont());
@@ -793,6 +834,9 @@ public class GPreferences extends JPanel
     jPanel11.add(pfamjv);
     jPanel11.add(pileupjv);
     jPanel11.add(pirjv);
+    exportTab.add(autoIdWidth);
+    exportTab.add(userIdWidth);
+    exportTab.add(userIdWidthlabel);
     exportTab.add(modellerOutput);
     tabbedPane.add(calcTab, "Editing");
     calcTab.add(autoCalculateConsCheck);
@@ -807,6 +851,18 @@ public class GPreferences extends JPanel
     exportTab.add(jPanel11);
   }
 
+  protected void autoIdWidth_actionPerformed()
+  {
+    // TODO Auto-generated method stub
+    
+  }
+
+  protected void userIdWidth_actionPerformed()
+  {
+    // TODO Auto-generated method stub
+    
+  }
+
   protected void maxColour_actionPerformed()
   {
     // TODO Auto-generated method stub
index 5d12cce..b0365ce 100755 (executable)
@@ -19,6 +19,7 @@ package jalview.schemes;
 
 import jalview.datamodel.AlignmentAnnotation;
 import jalview.datamodel.GraphLine;
+import jalview.datamodel.SequenceI;
 
 import java.awt.Color;
 
@@ -154,7 +155,7 @@ public class AnnotationColourGradient extends ResidueColourScheme
    * @return DOCUMENT ME!
    */
   @Override
-  public Color findColour(char c, int j, int sequenceIndex)
+  public Color findColour(char c, int j, SequenceI seq)
   {
     Color currentColour = Color.white;
 
@@ -204,7 +205,7 @@ public class AnnotationColourGradient extends ResidueColourScheme
 
           if (colourScheme != null)
           {
-            currentColour = colourScheme.findColour(c, j, sequenceIndex);
+            currentColour = colourScheme.findColour(c, j, seq);
           }
           else if (range != 0)
           {
index c511ded..27b8996 100755 (executable)
@@ -20,7 +20,7 @@ package jalview.schemes;
 import jalview.analysis.AAFrequency;
 
 import java.awt.Color;
-
+import jalview.datamodel.SequenceI;
 public class Blosum62ColourScheme extends ResidueColourScheme
 {
   public Blosum62ColourScheme()
@@ -29,7 +29,7 @@ public class Blosum62ColourScheme extends ResidueColourScheme
   }
 
   @Override
-  public Color findColour(char res, int j, int sequenceIndex)
+  public Color findColour(char res, int j, SequenceI seq)
   {
     if ('a' <= res && res <= 'z')
     {
index ad6d37f..7258605 100755 (executable)
@@ -258,7 +258,7 @@ public class ClustalxColourScheme extends ResidueColourScheme // implements
   }
 
   @Override
-  public Color findColour(char c, int j, int sequenceIndex)
+  public Color findColour(char c, int j, SequenceI seq)
   {
     Color currentColour;
 
index e8e5828..273273f 100755 (executable)
@@ -19,11 +19,14 @@ package jalview.schemes;
 
 import java.awt.Color;
 
+import jalview.datamodel.AnnotatedCollectionI;
+import jalview.datamodel.SequenceI;
+
 public interface ColourSchemeI
 {
   public Color findColour(char c);
 
-  public Color findColour(char c, int j, int sequenceIndex);
+  public Color findColour(char c, int j, SequenceI seq);
 
   public void setConsensus(java.util.Hashtable[] h);
 
@@ -39,4 +42,6 @@ public interface ColourSchemeI
 
   public void setThreshold(int ct, boolean ignoreGaps);
 
+  public void alignmentChanged(AnnotatedCollectionI alignment);
+
 }
index 3738f61..a7f2311 100755 (executable)
@@ -383,20 +383,21 @@ public class ColourSchemeProperty
   }
 
   /**
-   * DOCUMENT ME!
+   * Construct an instance of ColourSchemeI corresponding to the given colourscheme index
    * 
    * @param seqs
-   *          DOCUMENT ME!
+   *          sequences to be coloured by colourscheme
    * @param width
-   *          DOCUMENT ME!
+   *          geometry of alignment
    * @param index
-   *          DOCUMENT ME!
+   *          colourscheme number 
    * 
-   * @return DOCUMENT ME!
+   * @return null or an instance of the colourscheme configured to colour given sequence set
    */
   public static ColourSchemeI getColour(java.util.Vector seqs, int width,
           int index)
   {
+    // TODO 3.0 2.8 refactor signature to take an alignmentI like container so colourschemes based on annotation can be initialised
     ColourSchemeI cs = null;
 
     switch (index)
index df4d9a9..1de5764 100755 (executable)
@@ -17,6 +17,8 @@
  */
 package jalview.schemes;
 
+import jalview.datamodel.SequenceI;
+
 import java.awt.Color;
 
 /**
@@ -61,7 +63,7 @@ public class NucleotideColourScheme extends ResidueColourScheme
    * @return DOCUMENT ME!
    */
   @Override
-  public Color findColour(char c, int j, int sequenceIndex)
+  public Color findColour(char c, int j, SequenceI seq)
   {
     Color currentColour;
     if ((threshold == 0) || aboveThreshold(c, j))
index c4f7eb5..a64bf20 100755 (executable)
@@ -19,6 +19,7 @@ package jalview.schemes;
 
 import jalview.analysis.AAFrequency;
 import jalview.datamodel.SequenceGroup;
+import jalview.datamodel.SequenceI;
 
 import java.awt.Color;
 
@@ -38,7 +39,7 @@ public class PIDColourScheme extends ResidueColourScheme
 
   
   @Override
-  public Color findColour(char c, int j, int sequenceIndex)
+  public Color findColour(char c, int j, SequenceI seq)
   {
     if ('a' <= c && c <= 'z')
     {
index cc7f0d8..ea9e44b 100755 (executable)
@@ -19,6 +19,8 @@ package jalview.schemes;
 
 import jalview.analysis.AAFrequency;
 import jalview.analysis.Conservation;
+import jalview.datamodel.AnnotatedCollectionI;
+import jalview.datamodel.SequenceI;
 
 import java.awt.Color;
 import java.util.Hashtable;
@@ -83,7 +85,7 @@ public class ResidueColourScheme implements ColourSchemeI
   }
 
   @Override
-  public Color findColour(char c, int j, int sequenceIndex)
+  public Color findColour(char c, int j, SequenceI seq)
   {
     Color currentColour;
 
@@ -103,6 +105,7 @@ public class ResidueColourScheme implements ColourSchemeI
 
     return currentColour;
   }
+  @Override public void alignmentChanged(AnnotatedCollectionI alignment) {};
 
   /**
    * Get the percentage threshold for this colour scheme
index 49aeeeb..7cd5cb6 100755 (executable)
@@ -17,6 +17,8 @@
  */
 package jalview.schemes;
 
+import jalview.datamodel.SequenceI;
+
 import java.awt.Color;
 
 /**
@@ -86,7 +88,7 @@ public class ScoreColourScheme extends ResidueColourScheme
    * @return DOCUMENT ME!
    */
   @Override
-  public Color findColour(char c, int j, int sequenceIndex)
+  public Color findColour(char c, int j, SequenceI seq)
   {
     if (threshold > 0)
     {
index 740c15e..bbd2a23 100644 (file)
@@ -1,8 +1,17 @@
 package jalview.schemes;
 
+import jalview.analysis.SequenceIdMatcher;
+import jalview.datamodel.AlignmentAnnotation;
+import jalview.datamodel.AlignmentI;
+import jalview.datamodel.AnnotatedCollectionI;
+import jalview.datamodel.Annotation;
+import jalview.datamodel.SequenceI;
 import jalview.io.TCoffeeScoreFile;
 
 import java.awt.Color;
+import java.util.ArrayList;
+import java.util.IdentityHashMap;
+import java.util.TreeMap;
 
 /**
  * Defines the color score for T-Coffee MSA 
@@ -29,38 +38,47 @@ public class TCoffeeColourScheme extends ResidueColourScheme {
        };
 
 
-       byte[][] scoreMatrix = null;
-
+       IdentityHashMap<SequenceI, Color[]> seqMap;
        /**
-        * Initialize the color sheme based on the content of the T-Coffee score file 
+        * the color scheme needs to look at the alignment to get and cache T-COFFEE scores 
         * 
-        * @param scoreFile
+        * @param alignment - annotated sequences to be searched
         */
-       public TCoffeeColourScheme(TCoffeeScoreFile scoreFile) {
-
-               scoreMatrix = scoreFile != null ? scoreFile.getScoresArray() : null;
-
+       public TCoffeeColourScheme(AnnotatedCollectionI alignment) {
+         alignmentChanged(alignment);
+       }
+       @Override public void alignmentChanged(AnnotatedCollectionI alignment)
+       {
+          // assume only one set of TCOFFEE scores - but could have more than one potentially.
+          ArrayList<AlignmentAnnotation> annots = new ArrayList<AlignmentAnnotation>();
+          // Search alignment to get all tcoffee annotation and pick one set of annotation to use to colour seqs.
+          seqMap = new IdentityHashMap<SequenceI, Color[]>();
+          for (AlignmentAnnotation al:alignment.getAlignmentAnnotation())
+          {
+            if (al.sequenceRef!=null && !al.belowAlignment && al.label!=null && (al.label==TCoffeeScoreFile.TCOFFEE_SCORE || al.label.equals(TCoffeeScoreFile.TCOFFEE_SCORE)))
+            {
+              annots.add(al);
+              Color[] scores=new Color[al.annotations.length];
+              int i=0;
+              for (Annotation an:al.annotations)
+              {
+                scores[i++]=(an!=null) ? an.colour : Color.white;
+              }
+              seqMap.put(al.sequenceRef, scores);
+            }
+          }
        }
-
        @Override
-       public Color findColour(char c, int j, int sequenceIndex) {
-
-               if( scoreMatrix == null ) {
-                       return Color.white;
-               }
-               
-               if( sequenceIndex<0  || sequenceIndex >= scoreMatrix.length ) {
-                       System.out.printf("Sequence index out of range for the T-Coffee color scheme. Index:  %s\n", sequenceIndex);
-                       return Color.white;
-               }
+       public Color findColour(char c, int j, SequenceI seq) {
+          Color[] cols;
 
-               byte[] seqScores = scoreMatrix[sequenceIndex]; 
-               if( j < 0 || j>= seqScores.length ) {
-                       System.out.printf("Residue index out of range for the T-Coffee color scheme. Sequence %s - residue: %s\n", sequenceIndex, j);
-                       return Color.white;
-               }
-               
-               byte val = seqScores[j];
-               return val >= 0 && val < colors.length ? colors[val] : Color.white;
+         if( seqMap==null || (cols=seqMap.get(seq))==null) {
+           return Color.white;
+         }
+         
+         if( j < 0 || j>= cols.length ) {
+           return Color.white;
+         }
+         return cols[j];
        }
 }
index 0c1e688..62dfec5 100755 (executable)
@@ -19,6 +19,7 @@ package jalview.schemes;
 
 import java.awt.Color;
 import java.util.StringTokenizer;
+import jalview.datamodel.SequenceI;
 
 public class UserColourScheme extends ResidueColourScheme
 {
@@ -201,7 +202,7 @@ public class UserColourScheme extends ResidueColourScheme
   }
 
   @Override
-  public Color findColour(char c, int j, int sequenceIndex)
+  public Color findColour(char c, int j, SequenceI seq)
   {
     Color currentColour;
     int index = ResidueProperties.aaIndex[c];
index 392f1f9..ad9a9b7 100644 (file)
@@ -51,4 +51,23 @@ public class Platform
     // TODO: determine nominal limits for most platforms.\r
     return 2046; // this is the max length for a windows NT system.\r
   }\r
+\r
+  /**\r
+   * escape a string according to the local platform's escape character\r
+   * @param file\r
+   * @return escaped file\r
+   */\r
+  public static String escapeString(String file)\r
+  {\r
+    StringBuffer f=new StringBuffer();\r
+    int p=0,lastp=0;\r
+    while ((p=file.indexOf('\\',lastp))>-1)\r
+    {\r
+      f.append(file.subSequence(lastp,p));\r
+      f.append("\\\\");\r
+      lastp=p+1;\r
+    }\r
+    f.append(file.substring(lastp));\r
+    return f.toString();\r
+  }\r
 }\r
index 0ea68b1..d5df528 100644 (file)
@@ -44,7 +44,6 @@ import javax.swing.JViewport;
 
 import com.stevesoft.pat.Regex;
 import com.sun.org.apache.xml.internal.serialize.OutputFormat.DTD;
-import com.sun.tools.doclets.internal.toolkit.util.DocFinder.Output;
 
 public class RestServiceDescription
 {