Merge branch 'Tcoffee_JAL-1065' of https://source.jalview.org/git/jalview into test_p...
authorjprocter <jprocter@compbio.dundee.ac.uk>
Tue, 10 Apr 2012 07:48:29 +0000 (08:48 +0100)
committerjprocter <jprocter@compbio.dundee.ac.uk>
Tue, 10 Apr 2012 07:48:29 +0000 (08:48 +0100)
17 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/bin/Cache.java
src/jalview/ext/jmol/JalviewJmolBinding.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/jbgui/GPreferences.java
src/jalview/util/Platform.java
src/jalview/ws/rest/RestServiceDescription.java

index 0c39740..cbb8f6b 100644 (file)
@@ -41,6 +41,7 @@
        <classpathentry kind="lib" path="lib/min-jaba-client.jar"/>
        <classpathentry kind="lib" path="lib/commons-codec-1.3.jar"/>
        <classpathentry kind="lib" path="lib/Jmol-12.2.4.jar"/>
+       <classpathentry kind="lib" path="appletlib/JmolApplet-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"/>
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 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 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 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 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 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
 {