/*
- * Jalview - A Sequence Alignment Editor and Viewer (Version 2.5)
+ * Jalview - A Sequence Alignment Editor and Viewer (Version 2.6)
* Copyright (C) 2010 J Procter, AM Waterhouse, G Barton, M Clamp, S Searle
*
* This file is part of Jalview.
import java.awt.*;
import java.awt.event.*;
+import javax.swing.JPanel;
+
import jalview.api.FeatureRenderer;
import jalview.api.SequenceRenderer;
import jalview.api.SequenceStructureBinding;
import org.jmol.popup.*;
import org.jmol.viewer.JmolConstants;
+import org.jmol.viewer.Viewer;
import jalview.schemes.*;
public abstract class JalviewJmolBinding implements StructureListener,
- JmolStatusListener, SequenceStructureBinding, JmolSelectionListener
+ JmolStatusListener, SequenceStructureBinding,
+ JmolSelectionListener, ComponentListener
{
/**
public Vector chainNames;
+ Hashtable chainFile;
+
/**
* array of target chains for seuqences - tied to pdbentry and sequence[]
*/
public PDBEntry[] pdbentry;
/**
- * datasource protocol for access to PDBEntry
+ * datasource protocol for access to PDBEntrylatest
*/
String protocol = null;
p = mlength;
mlength = lbl.indexOf(":", p);
} while (p < mlength && mlength < (lbl.length() - 2));
+ // TODO: lookup each pdb id and recover proper model number for it.
cmd.append(":" + lbl.substring(mlength + 1) + " /"
- + getModelNum(lbl.substring(0, mlength)) + " or ");
+ + (1 + getModelNum((String) chainFile.get(lbl))) + " or ");
}
if (cmd.length() > 0)
cmd.setLength(cmd.length() - 4);
viewer.setJmolStatusListener(null);
lastCommand = null;
viewer = null;
+ releaseUIResources();
}
+ /**
+ * called by JalviewJmolbinding after closeViewer is called - release any
+ * resources and references so they can be garbage collected.
+ */
+ protected abstract void releaseUIResources();
+
public void colourByChain()
{
colourBySequence = false;
String isel[] = new String[files.length];
// reference structure - all others are superposed in it
String[] targetC = new String[files.length];
+ String[] chainNames = new String[files.length];
for (int pdbfnum = 0; pdbfnum < files.length; pdbfnum++)
{
StructureMapping[] mapping = ssm.getMapping(files[pdbfnum]);
{
targetC[pdbfnum] = ":" + mapping[m].getChain();
}
+ chainNames[pdbfnum] = mapping[m].getPdbId()+targetC[pdbfnum];
// move on to next pdb file
s = sequence[pdbfnum].length;
break;
}
}
String[] selcom = new String[files.length];
- int nmatched=0;
+ int nmatched = 0;
// generate select statements to select regions to superimpose structures
{
for (int pdbfnum = 0; pdbfnum < files.length; pdbfnum++)
{
if (matched[r])
{
- if (pdbfnum==0) {
+ if (pdbfnum == 0)
+ {
nmatched++;
}
if (lpos != commonrpositions[pdbfnum][r] - 1)
}
}
}
- // TODO: consider bailing if nmatched less than 4 because superposition not well defined.
- // TODO: refactor superposable position search (above) from jmol selection construction (below)
+ // TODO: consider bailing if nmatched less than 4 because superposition not
+ // well defined.
+ // TODO: refactor superposable position search (above) from jmol selection
+ // construction (below)
for (int pdbfnum = 0; pdbfnum < files.length; pdbfnum++)
{
if (pdbfnum == refStructure)
{
continue;
}
- command.append("compare ");
+ command.append("echo ");
+ command.append("\"Superposing (");
+ command.append(chainNames[pdbfnum]);
+ command.append(") against reference (");
+ command.append(chainNames[refStructure]);
+ command.append(")\";\ncompare ");
command.append("{");
command.append(1 + pdbfnum);
command.append(".1} {");
Color col = sr.getResidueBoxColour(sequence[pdbfnum][s], r);
- if (showFeatures)
+ if (showFeatures && fr != null)
col = fr.findFeatureColour(col, sequence[pdbfnum][s], r);
String newSelcom = (mapping[m].getChain() != " " ? ":"
+ mapping[m].getChain() : "")
// /StructureListener
public synchronized String[] getPdbFile()
{
- if (viewer==null)
+ if (viewer == null)
{
return new String[0];
}
mset[j] = viewer.getModelFileName(i);
_modelFileNameMap[j] = i; // record the model index for the filename
// skip any additional models in the same file (NMR structures)
- if ((mset[j] == null ? mset[j] != mset[j - 1] : (mset[j - 1] == null
- || !mset[j].equals(mset[j - 1]))))
+ if ((mset[j] == null ? mset[j] != mset[j - 1]
+ : (mset[j - 1] == null || !mset[j].equals(mset[j - 1]))))
{
j++;
}
case JmolConstants.CALLBACK_MEASURE:
case JmolConstants.CALLBACK_CLICK:
-
default:
System.err.println("Unhandled callback " + type + " "
+ data[1].toString());
return false;
}
- // incremented every time a load notification is successfully handled - lightweight mechanism for other threads to detect when they can start referrring to new structures.
- private long loadNotifiesHandled=0;
+ // incremented every time a load notification is successfully handled -
+ // lightweight mechanism for other threads to detect when they can start
+ // referrring to new structures.
+ private long loadNotifiesHandled = 0;
+
public long getLoadNotifiesHandled()
{
return loadNotifiesHandled;
}
+
public void notifyFileLoaded(String fullPathName, String fileName2,
String modelName, String errorMsg, int modelParts)
{
String[] oldmodels = modelFileNames;
modelFileNames = null;
chainNames = new Vector();
+ chainFile = new Hashtable();
boolean notifyLoaded = false;
String[] modelfilenames = getPdbFile();
ssm = StructureSelectionManager.getStructureSelectionManager();
if (loadedInline)
{
// calculate essential attributes for the pdb data imported inline.
- // prolly need to resolve modelnumber properly - for now just use our 'best guess'
- pdbfile = viewer.getData(""+(1+_modelFileNameMap[modelnum])+".0",
- "PDB");
+ // prolly need to resolve modelnumber properly - for now just use our
+ // 'best guess'
+ pdbfile = viewer.getData("" + (1 + _modelFileNameMap[modelnum])
+ + ".0", "PDB");
pdbfhash = "" + pdbfile.hashCode();
}
if (pdbentry != null)
boolean matches = false;
if (fileName == null)
{
- if (false)
- // see JAL-623 - need method of matching pasted data up
+ if (false)
+ // see JAL-623 - need method of matching pasted data up
{
pdb = ssm.setMapping(sequence[pe], chains[pe], pdbfile,
AppletFormatAdapter.PASTE);
pdb = ssm.setMapping(sequence[pe], chains[pe],
pdbentry[pe].getFile(), protocol);
-
}
}
if (matches)
// add an entry for every chain in the model
for (int i = 0; i < pdb.chains.size(); i++)
{
- chainNames.addElement(new String(pdb.id + ":"
- + ((MCview.PDBChain) pdb.chains.elementAt(i)).id));
+ String chid = new String(pdb.id + ":"
+ + ((MCview.PDBChain) pdb.chains.elementAt(i)).id);
+ chainFile.put(chid, pdbentry[pe].getFile());
+ chainNames.addElement(chid);
}
notifyLoaded = true;
}
}
if (!foundEntry && associateNewStructs)
{
- // this is a foreign pdb file that jalview doesn't know about - add
- // it to the dataset and try to find a home - either on a matching
- // sequence or as a new sequence.
- String pdbcontent = viewer.getData("/" + (modelnum + 1) + ".1",
- "PDB");
- // parse pdb file into a chain, etc.
- // locate best match for pdb in associated views and add mapping to
- // ssm
- // if properly registered then
- notifyLoaded = true;
+ // this is a foreign pdb file that jalview doesn't know about - add
+ // it to the dataset and try to find a home - either on a matching
+ // sequence or as a new sequence.
+ String pdbcontent = viewer.getData("/" + (modelnum + 1) + ".1",
+ "PDB");
+ // parse pdb file into a chain, etc.
+ // locate best match for pdb in associated views and add mapping to
+ // ssm
+ // if properly registered then
+ notifyLoaded = true;
- }
}
+ }
// FILE LOADED OK
// so finally, update the jmol bits and pieces
if (jmolpopup != null)
public abstract void refreshGUI();
/**
+ * called to show or hide the associated console window container.
+ *
+ * @param show
+ */
+ public abstract void showConsole(boolean show);
+
+ /**
* @param renderPanel
* @param jmolfileio
* - when true will initialise jmol's file IO system (should be false
* @param codeBase
* @param commandOptions
*/
- public void allocateViewer(Component renderPanel, boolean jmolfileio,
+ public void allocateViewer(Container renderPanel, boolean jmolfileio,
String htmlName, URL documentBase, URL codeBase,
String commandOptions)
{
+ allocateViewer(renderPanel, jmolfileio, htmlName, documentBase,
+ codeBase, commandOptions, null, null);
+ }
+
+ /**
+ *
+ * @param renderPanel
+ * @param jmolfileio
+ * - when true will initialise jmol's file IO system (should be false
+ * in applet context)
+ * @param htmlName
+ * @param documentBase
+ * @param codeBase
+ * @param commandOptions
+ * @param consolePanel
+ * - panel to contain Jmol console
+ * @param buttonsToShow
+ * - buttons to show on the console, in ordr
+ */
+ public void allocateViewer(Container renderPanel, boolean jmolfileio,
+ String htmlName, URL documentBase, URL codeBase,
+ String commandOptions, final Container consolePanel,
+ String buttonsToShow)
+ {
viewer = JmolViewer.allocateViewer(renderPanel,
(jmolfileio ? new SmarterJmolAdapter() : null), htmlName
+ ((Object) this).toString(), documentBase, codeBase,
commandOptions, this);
+
+ console = createJmolConsole(viewer, consolePanel, buttonsToShow);
+ if (consolePanel != null)
+ {
+ consolePanel.addComponentListener(this);
+
+ }
+
+ }
+
+ protected abstract JmolAppConsoleInterface createJmolConsole(
+ JmolViewer viewer2, Container consolePanel, String buttonsToShow);
+
+ protected org.jmol.api.JmolAppConsoleInterface console = null;
+
+ public void componentResized(ComponentEvent e)
+ {
+
+ }
+
+ public void componentMoved(ComponentEvent e)
+ {
+
+ }
+
+ public void componentShown(ComponentEvent e)
+ {
+ showConsole(true);
+ }
+
+ public void componentHidden(ComponentEvent e)
+ {
+ showConsole(false);
}
public void setLoadingFromArchive(boolean loadingFromArchive)