import java.io.*;
import jalview.jbgui.GStructureViewer;
+import jalview.api.AlignmentViewPanel;
import jalview.api.SequenceStructureBinding;
import jalview.bin.Cache;
import jalview.datamodel.*;
}
IProgressIndicator progressBar = null;
+ /**
+ * add a single PDB structure to a new or existing Jmol view
+ * @param pdbentry
+ * @param seq
+ * @param chains
+ * @param ap
+ */
public AppJmol(PDBEntry pdbentry, SequenceI[] seq, String[] chains,
AlignmentPanel ap)
{
}
}
// /////////////////////////////////
-
- jmb = new AppJmolBinding(this, ap.getStructureSelectionManager(), new PDBEntry[]
- { pdbentry }, new SequenceI[][]
- { seq }, null, null);
+ 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);
useAlignmentPanelForColourbyseq(ap);
+ if (pdbentrys.length>1)
+ {
+ alignAddedStructures=true;
+ useAlignmentPanelForSuperposition(ap);
+ }
jmb.setColourBySequence(true);
setSize(400, 400); // probably should be a configurable/dynamic default here
initMenus();
-
- if (pdbentry.getFile() != null)
- {
- initJmol("load \"" + pdbentry.getFile() + "\"");
- }
- else
+ 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)
{
- addingStructures = false;
- worker = new Thread(this);
- worker.start();
+ initJmol("load"+(pdbentrys.length>1 ? " APPEND" : "") + filelist);
}
-
+*/
this.addInternalFrameListener(new InternalFrameAdapter()
{
public void internalFrameClosing(InternalFrameEvent internalFrameEvent)
}
/**
+ * create a new Jmol containing several structures superimposed using the given alignPanel.
+ * @param ap
+ * @param pe
+ * @param seqs
+ */
+ public AppJmol(AlignmentPanel ap, PDBEntry[] pe, SequenceI[][] seqs)
+ {
+ openNewJmol(ap, pe, seqs);
+ }
+
+ /**
* list of sequenceSet ids associated with the view
*/
ArrayList<String> _aps = new ArrayList();
"Couldn't load file", JOptionPane.ERROR_MESSAGE);
}
+ long lastnotify = jmb.getLoadNotifiesHandled();
if (files.length() > 0)
{
if (!addingStructures)
cmd.append("\nloadingJalviewdata=null");
final String command = cmd.toString();
cmd = null;
- long lastnotify = jmb.getLoadNotifiesHandled();
+ lastnotify = jmb.getLoadNotifiesHandled();
+
try
{
jmb.evalStateCommand(command);
{
Cache.log.error("Couldn't add files to Jmol viewer!", ex);
}
- // need to wait around until script has finished
- while (lastnotify >= jmb.getLoadNotifiesHandled())
- ;
+ }
+
+ // need to wait around until script has finished
+ while (addingStructures ? lastnotify >= jmb.getLoadNotifiesHandled()
+ : (jmb.isFinishedInit() && jmb.getPdbFile().length!=jmb.pdbentry.length))
+ {
+ try
{
- try
- {
- Thread.sleep(35);
- } catch (Exception e)
- {
- }
- }
- // refresh the sequence colours for the new structure(s)
- for (AlignmentPanel ap : _colourwith)
+ Cache.log.debug("Waiting around for jmb notify.");
+ Thread.sleep(35);
+ } catch (Exception e)
{
- jmb.updateColours(ap);
}
- // do superposition if asked to
- if (alignAddedStructures)
+ }
+ // refresh the sequence colours for the new structure(s)
+ for (AlignmentPanel ap : _colourwith)
+ {
+ jmb.updateColours(ap);
+ }
+ // do superposition if asked to
+ if (alignAddedStructures)
+ {
+ javax.swing.SwingUtilities.invokeLater(new Runnable()
{
- javax.swing.SwingUtilities.invokeLater(new Runnable()
+ public void run()
{
- public void run()
- {
- alignStructs_withAllAlignPanels();
- // jmb.superposeStructures(ap.av.getAlignment(), -1, null);
- }
- });
- alignAddedStructures = false;
- }
- addingStructures = false;
+ alignStructs_withAllAlignPanels();
+ // jmb.superposeStructures(ap.av.getAlignment(), -1, null);
+ }
+ });
+ alignAddedStructures = false;
}
+ addingStructures = false;
+
}
_started = false;
worker = null;
import java.awt.*;
import java.awt.event.*;
+
import javax.swing.*;
import MCview.*;
{
public void actionPerformed(ActionEvent e)
{
- Vector seqs = new Vector();
- for (int i = 0; i < ap.av.alignment.getHeight(); i++)
- {
- Vector pdbs = ap.av.alignment.getSequenceAt(i)
- .getDatasetSequence().getPDBId();
- if (pdbs == null)
- continue;
-
- for (int p = 0; p < pdbs.size(); p++)
- {
- PDBEntry p1 = (PDBEntry) pdbs.elementAt(p);
- if (p1.getId().equals(pdb.getId()))
- {
- if (!seqs.contains(ap.av.alignment.getSequenceAt(i)))
- seqs.addElement(ap.av.alignment.getSequenceAt(i));
-
- continue;
- }
- }
- }
-
- SequenceI[] seqs2 = new SequenceI[seqs.size()];
- seqs.toArray(seqs2);
-
- new AppJmol(pdb, seqs2, null, ap);
+ // TODO re JAL-860: optionally open dialog or provide a menu entry allowing user to open just one structure per sequence
+ new AppJmol(pdb, ap.av.collateForPDB(new PDBEntry[] { pdb })[0], null, ap);
// new PDBViewer(pdb, seqs2, null, ap, AppletFormatAdapter.FILE);
}
+
});
viewStructureMenu.add(menuItem);
{
buildGroupURLMenu(sg, groupLinks);
}
+ // Add a 'show all structures' for the current selection
+ Hashtable<String, PDBEntry> pdbe=new Hashtable<String,PDBEntry>();
+ for (SequenceI sq: ap.av.getSequenceSelection())
+ {
+ Vector<PDBEntry> pes = (Vector<PDBEntry>) sq.getDatasetSequence().getPDBId();
+ if (pes!=null) {
+ for (PDBEntry pe: pes)
+ {
+ pdbe.put(pe.getId(), pe);
+ }
+ }
+ }
+ if (pdbe.size()>0)
+ {
+ final PDBEntry[] pe = pdbe.values().toArray(new PDBEntry[pdbe.size()]);
+ final JMenuItem gpdbview;
+ structureMenu.add(gpdbview=new JMenuItem("View "+pdbe.size()+" structures."));
+ gpdbview.addActionListener(new ActionListener()
+ {
+
+ @Override
+ public void actionPerformed(ActionEvent e)
+ {
+ new AppJmol(ap, pe, ap.av.collateForPDB(pe));
+ }
+ });
+ }
}
else
{