/*
- * Jalview - A Sequence Alignment Editor and Viewer (Version 2.8.2)
- * Copyright (C) 2014 The Jalview Authors
+ * Jalview - A Sequence Alignment Editor and Viewer ($$Version-Rel$$)
+ * Copyright (C) $$Year-Rel$$ The Jalview Authors
*
* This file is part of Jalview.
*
*/
package jalview.gui;
-import java.awt.Rectangle;
-
import jalview.api.structures.JalviewStructureDisplayI;
import jalview.bin.Cache;
import jalview.datamodel.PDBEntry;
import jalview.datamodel.SequenceI;
-import jalview.gui.StructureViewer.Viewer;
+import jalview.datamodel.StructureViewerModel;
import jalview.structure.StructureSelectionManager;
+import java.awt.Rectangle;
+import java.util.ArrayList;
+import java.util.List;
+
/**
* proxy for handling structure viewers.
*
{
StructureSelectionManager ssm;
- public enum Viewer
+ public enum ViewerType
{
JMOL, CHIMERA
};
- public Viewer getViewerType()
+ public ViewerType getViewerType()
{
- String viewType = Cache.getDefault("STRUCTURE_DISPLAY", "JMOL");
- return Viewer.valueOf(viewType);
+ String viewType = Cache.getDefault(Preferences.STRUCTURE_DISPLAY,
+ ViewerType.JMOL.name());
+ return ViewerType.valueOf(viewType);
}
- public void setViewerType(Viewer type)
+ public void setViewerType(ViewerType type)
{
- Cache.setProperty("STRUCTURE_DISPLAY", type.toString());
+ Cache.setProperty(Preferences.STRUCTURE_DISPLAY, type.name());
}
public StructureViewer(StructureSelectionManager structureSelectionManager)
ssm = structureSelectionManager;
}
- public JalviewStructureDisplayI viewStructures(AlignmentPanel ap,
- PDBEntry[] pr, SequenceI[][] collateForPDB)
+ /**
+ * View multiple PDB entries, each with associated sequences
+ *
+ * @param pdbs
+ * @param seqsForPdbs
+ * @param ap
+ * @return
+ */
+ public JalviewStructureDisplayI viewStructures(PDBEntry[] pdbs,
+ SequenceI[][] seqsForPdbs, AlignmentPanel ap)
+ {
+ JalviewStructureDisplayI viewer = onlyOnePdb(pdbs, seqsForPdbs, ap);
+ if (viewer != null)
+ {
+ return viewer;
+ }
+ return viewStructures(getViewerType(), pdbs, seqsForPdbs, ap);
+ }
+
+ /**
+ * A strictly temporary method pending JAL-1761 refactoring. Determines if all
+ * the passed PDB entries are the same (this is the case if selected sequences
+ * to view structure for are chains of the same structure). If so, calls the
+ * single-pdb version of viewStructures and returns the viewer, else returns
+ * null.
+ *
+ * @param pdbs
+ * @param seqsForPdbs
+ * @param ap
+ * @return
+ */
+ private JalviewStructureDisplayI onlyOnePdb(PDBEntry[] pdbs,
+ SequenceI[][] seqsForPdbs, AlignmentPanel ap)
{
- return viewStructures(getViewerType(), ap, pr, collateForPDB);
+ List<SequenceI> seqs = new ArrayList<SequenceI>();
+ if (pdbs == null || pdbs.length == 0)
+ {
+ return null;
+ }
+ int i = 0;
+ String firstFile = pdbs[0].getFile();
+ for (PDBEntry pdb : pdbs)
+ {
+ String pdbFile = pdb.getFile();
+ if (pdbFile == null || !pdbFile.equals(firstFile))
+ {
+ return null;
+ }
+ SequenceI[] pdbseqs = seqsForPdbs[i++];
+ if (pdbseqs != null)
+ {
+ for (SequenceI sq : pdbseqs)
+ {
+ seqs.add(sq);
+ }
+ }
+ }
+ return viewStructures(pdbs[0],
+ seqs.toArray(new SequenceI[seqs.size()]), ap);
}
- public JalviewStructureDisplayI viewStructures(Viewer viewerType,
- AlignmentPanel ap, PDBEntry[] pr, SequenceI[][] collateForPDB)
+ public JalviewStructureDisplayI viewStructures(PDBEntry pdb,
+ SequenceI[] seqsForPdb, AlignmentPanel ap)
{
+ return viewStructures(getViewerType(), pdb, seqsForPdb, ap);
+ }
+
+ protected JalviewStructureDisplayI viewStructures(ViewerType viewerType,
+ PDBEntry[] pdbs, SequenceI[][] seqsForPdbs, AlignmentPanel ap)
+ {
+ PDBEntry[] pdbsForFile = getUniquePdbFiles(pdbs);
JalviewStructureDisplayI sview = null;
- if (viewerType.equals(Viewer.JMOL))
+ if (viewerType.equals(ViewerType.JMOL))
{
- sview = new AppJmol(ap, pr, ap.av.collateForPDB(pr));
+ sview = new AppJmol(ap, pdbsForFile, ap.av.collateForPDB(pdbsForFile));
}
- else if (viewerType.equals(Viewer.CHIMERA))
+ else if (viewerType.equals(ViewerType.CHIMERA))
{
- sview = new ChimeraViewFrame(ap, pr, ap.av.collateForPDB(pr));
+ sview = new ChimeraViewFrame(pdbsForFile,
+ ap.av.collateForPDB(pdbsForFile), ap);
}
else
{
return sview;
}
- public JalviewStructureDisplayI viewStructures(Viewer viewerType,
- AlignmentPanel ap, PDBEntry pr, SequenceI[] collateForPDB)
+ /**
+ * Convert the array of PDBEntry into an array with no filename repeated
+ *
+ * @param pdbs
+ * @return
+ */
+ static PDBEntry[] getUniquePdbFiles(PDBEntry[] pdbs)
+ {
+ if (pdbs == null)
+ {
+ return null;
+ }
+ List<PDBEntry> uniques = new ArrayList<PDBEntry>();
+ List<String> filesSeen = new ArrayList<String>();
+ for (PDBEntry entry : pdbs)
+ {
+ String file = entry.getFile();
+ if (file == null)
+ {
+ uniques.add(entry);
+ }
+ else if (!filesSeen.contains(file))
+ {
+ uniques.add(entry);
+ filesSeen.add(file);
+ }
+ }
+ return uniques.toArray(new PDBEntry[uniques.size()]);
+ }
+
+ protected JalviewStructureDisplayI viewStructures(ViewerType viewerType,
+ PDBEntry pdb, SequenceI[] seqsForPdb, AlignmentPanel ap)
{
JalviewStructureDisplayI sview = null;
- if (viewerType.equals(Viewer.JMOL))
+ if (viewerType.equals(ViewerType.JMOL))
{
- sview = new AppJmol(pr, collateForPDB, null, ap);
+ sview = new AppJmol(pdb, seqsForPdb, null, ap);
}
- else if (viewerType.equals(Viewer.CHIMERA))
+ else if (viewerType.equals(ViewerType.CHIMERA))
{
- sview = new ChimeraViewFrame(pr, collateForPDB, null, ap);
+ sview = new ChimeraViewFrame(pdb, seqsForPdb, null, ap);
}
else
{
return sview;
}
- public JalviewStructureDisplayI viewStructures(PDBEntry pdb,
- SequenceI[] sequenceIs, Object object, AlignmentPanel ap)
+ /**
+ * Create a new panel controlling a structure viewer.
+ *
+ * @param type
+ * @param pdbf
+ * @param id
+ * @param sq
+ * @param alignPanel
+ * @param viewerData
+ * @param fileloc
+ * @param rect
+ * @param vid
+ * @return
+ */
+ public JalviewStructureDisplayI createView(ViewerType type,
+ String[] pdbf, String[] id, SequenceI[][] sq,
+ AlignmentPanel alignPanel, StructureViewerModel viewerData,
+ String fileloc, Rectangle rect, String vid)
{
- return viewStructures(getViewerType(), ap, pdb, sequenceIs);
- }
+ final boolean useinViewerSuperpos = viewerData.isAlignWithPanel();
+ final boolean usetoColourbyseq = viewerData.isColourWithAlignPanel();
+ final boolean viewerColouring = viewerData.isColourByViewer();
- public JalviewStructureDisplayI createView(Viewer jmol, String[] pdbf,
- String[] id, SequenceI[][] sq, AlignmentPanel alignPanel,
- boolean useinJmolsuperpos, boolean usetoColourbyseq,
- boolean jmolColouring, String fileloc, Rectangle rect, String vid)
- {
JalviewStructureDisplayI sview = null;
- switch (getViewerType())
+ switch (type)
{
case JMOL:
-
- sview = new AppJmol(pdbf, id, sq, alignPanel, useinJmolsuperpos,
- usetoColourbyseq, jmolColouring, fileloc, rect, vid);
-
+ sview = new AppJmol(pdbf, id, sq, alignPanel, usetoColourbyseq,
+ useinViewerSuperpos, viewerColouring, fileloc, rect, vid);
break;
case CHIMERA:
+ Cache.log.error("Unsupported structure viewer type "
+ + type.toString());
break;
default:
- Cache.log.error("Unknown structure viewer type "
- + getViewerType().toString());
+ Cache.log.error("Unknown structure viewer type " + type.toString());
}
return sview;
}