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.*;
}
}
String[] selcom = new String[files.length];
+ 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)
+ {
+ nmatched++;
+ }
if (lpos != commonrpositions[pdbfnum][r] - 1)
{
// discontinuity
}
}
}
-
+ // 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)
// /StructureListener
public synchronized String[] getPdbFile()
{
+ if (viewer == null)
+ {
+ return new String[0];
+ }
if (modelFileNames == null)
{
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;
+
+ public long getLoadNotifiesHandled()
+ {
+ return loadNotifiesHandled;
+ }
+
public void notifyFileLoaded(String fullPathName, String fileName2,
String modelName, String errorMsg, int modelParts)
{
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)
}
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)
fr.featuresAdded();
}
refreshGUI();
+ loadNotifiesHandled++;
}
}
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
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(Component 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 (console != null)
+ {
+ viewer.setConsole(new JmolAppConsoleInterface()
+ {
+
+ @Override
+ public JmolScriptEditorInterface getScriptEditor()
+ {
+ return console.getScriptEditor();
+ }
+
+ @Override
+ public JmolAppConsoleInterface getAppConsole(Viewer viewer,
+ Component display)
+ {
+ return console;
+ }
+
+ public String getText()
+ {
+ return console.getText();
+ }
+
+ @Override
+ public Object getMyMenuBar()
+ {
+ return console.getMyMenuBar();
+ }
+
+ @Override
+ public void setVisible(boolean b)
+ {
+ showConsole(b);
+ }
+
+ @Override
+ public void sendConsoleEcho(String strEcho)
+ {
+ console.sendConsoleEcho(strEcho);
+
+ }
+
+ @Override
+ public void sendConsoleMessage(String strInfo)
+ {
+ console.sendConsoleMessage(strInfo);
+ }
+
+ @Override
+ public void zap()
+ {
+ console.zap();
+ }
+
+ @Override
+ public void dispose()
+ {
+ console.dispose();
+ }
+
+ });
+ }
+
}
+ protected abstract JmolAppConsoleInterface createJmolConsole(
+ JmolViewer viewer2, Container consolePanel, String buttonsToShow);
+
+ protected org.jmol.api.JmolAppConsoleInterface console = null;
+
public void setLoadingFromArchive(boolean loadingFromArchive)
{
this.loadingFromArchive = loadingFromArchive;