<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"/>
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>"Automatically set ID width"</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
* <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>
}
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;
+ }
}
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
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
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
}\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
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
} 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
{\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
*/
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;
}
}
- return new Dimension(Math.min(maxwidth, idWidth), 12);
+ return new Dimension(maxwidth<0 ? idWidth : Math.min(maxwidth, idWidth), 12);
}
/**
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();
int cHeight = av.getAlignment().getHeight() * av.charHeight + hgap
+ annotationHeight;
- int idWidth = getVisibleIdWidth();
+ int idWidth = getVisibleIdWidth(false);
int maxwidth = av.alignment.getWidth();
if (av.hasHiddenColumns)
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)
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())
{
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);
}
}
{
// /////ONLY WORKS WITH NONE WRAPPED ALIGNMENTS
// ////////////////////////////////////////////
- int idWidth = getVisibleIdWidth();
+ int idWidth = getVisibleIdWidth(false);
FontMetrics fm = getFontMetrics(av.getFont());
int scaleHeight = av.charHeight + fm.getDescent();
import jalview.datamodel.PDBEntry;
import jalview.io.*;
import jalview.schemes.*;
+import jalview.util.Platform;
public class AppJmol extends GStructureViewer implements Runnable,
SequenceStructureBinding, ViewSetProvider
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);
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)
{
// 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
{
}
if (file != null)
{
- files.append(" \"" + file + "\"");
+ files.append(" \"" + Platform.escapeString(file) + "\"");
}
}
}
public void dragFrame(JComponent f, int newX, int newY)
{
+ if (newY<0)
+ {
+ newY=0;
+ }
delegate.dragFrame(f, newX, newY);
}
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);
}
//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)
{
}
});
- this.addMouseListener(new MouseAdapter()
+ MouseAdapter ma;
+ this.addMouseListener(ma=new MouseAdapter()
{
public void mousePressed(MouseEvent evt)
{
}
}
});
+ desktop.addMouseListener(ma);
+
this.addFocusListener(new FocusListener()
{
}
}
}
-
}
/**
import jalview.schemabinding.version2.*;
import jalview.schemes.*;
import jalview.structure.StructureSelectionManager;
+import jalview.util.Platform;
import jalview.util.jarInputStreamProvider;
/**
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);
}
;
out.close();
-
- alreadyLoadedPDB.put(pdbId, outFile.getAbsolutePath());
- return outFile.getAbsolutePath();
+ String t=outFile.getAbsolutePath();
+ alreadyLoadedPDB.put(pdbId, t);
+ return t;
}
else
{
}
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() });
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
{
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,
// 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])
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)
{
.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
// 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
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));
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",
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());
+ }
+
}
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;
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();
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());
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);
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
// 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
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
{