Merge commit 'alpha/update_2_12_for_2_11_2_series_merge^2' into HEAD
[jalview.git] / src / jalview / gui / StructureViewer.java
index e7a30f9..4db6140 100644 (file)
  */
 package jalview.gui;
 
+import java.util.ArrayList;
+import java.util.HashMap;
+import java.util.LinkedHashMap;
+import java.util.List;
+import java.util.Map;
+import java.util.Map.Entry;
 import jalview.api.structures.JalviewStructureDisplayI;
 import jalview.bin.Cache;
 import jalview.datamodel.PDBEntry;
 import jalview.datamodel.SequenceI;
 import jalview.datamodel.StructureViewerModel;
-import jalview.structure.StructureMapping;
 import jalview.structure.StructureSelectionManager;
-import jalview.util.MessageManager;
-import jalview.util.Platform;
-import jalview.ws.DBRefFetcher;
-import jalview.ws.sifts.SiftsSettings;
 
-import java.awt.Rectangle;
-import java.util.ArrayList;
-import java.util.HashMap;
-import java.util.LinkedHashMap;
-import java.util.List;
-import java.util.Map;
-import java.util.Map.Entry;
 
 /**
  * A proxy for handling structure viewers, that orchestrates adding selected
@@ -71,7 +65,7 @@ public class StructureViewer
 
   public enum ViewerType
   {
-    JMOL, CHIMERA
+    JMOL, CHIMERA, CHIMERAX, PYMOL
   };
 
   /**
@@ -96,6 +90,7 @@ public class StructureViewer
     return sv;
   }
 
+  
   @Override
   public String toString()
   {
@@ -105,7 +100,11 @@ public class StructureViewer
     }
     return "New View";
   }
-  public ViewerType getViewerType()
+  /**
+   * 
+   * @return ViewerType for currently configured structure viewer 
+   */
+  public static ViewerType getViewerType()
   {
     String viewType = Cache.getDefault(Preferences.STRUCTURE_DISPLAY,
             ViewerType.JMOL.name());
@@ -180,6 +179,15 @@ public class StructureViewer
       sview = new ChimeraViewFrame(pdbsForFile, superposeAdded, theSeqs,
               ap);
     }
+    else if (viewerType.equals(ViewerType.CHIMERAX))
+    {
+      sview = new ChimeraXViewFrame(pdbsForFile, superposeAdded, theSeqs,
+              ap);
+    }
+    else if (viewerType.equals(ViewerType.PYMOL))
+    {
+      sview = new PymolViewer(pdbsForFile, superposeAdded, theSeqs, ap);
+    }
     else
     {
       Cache.log.error(UNKNOWN_VIEWER_TYPE + getViewerType().toString());
@@ -320,6 +328,14 @@ public class StructureViewer
     {
       sview = new ChimeraViewFrame(pdb, seqsForPdb, null, ap);
     }
+    else if (viewerType.equals(ViewerType.CHIMERAX))
+    {
+      sview = new ChimeraXViewFrame(pdb, seqsForPdb, null, ap);
+    }
+    else if (viewerType.equals(ViewerType.PYMOL))
+    {
+      sview = new PymolViewer(pdb, seqsForPdb, null, ap);
+    }
     else
     {
       Cache.log.error(UNKNOWN_VIEWER_TYPE + getViewerType().toString());
@@ -328,7 +344,7 @@ public class StructureViewer
   }
 
   /**
-   * Create a new panel controlling a structure viewer.
+   * Creates a new panel controlling a structure viewer
    * 
    * @param type
    * @param pdbf
@@ -336,34 +352,37 @@ public class StructureViewer
    * @param sq
    * @param alignPanel
    * @param viewerData
-   * @param fileloc
-   * @param rect
+   * @param sessionFile
    * @param vid
    * @return
    */
-  public JalviewStructureDisplayI createView(ViewerType type, String[] pdbf,
-          String[] id, SequenceI[][] sq, AlignmentPanel alignPanel,
-          StructureViewerModel viewerData, String fileloc, Rectangle rect,
-          String vid)
+  public static JalviewStructureDisplayI createView(ViewerType type,
+          AlignmentPanel alignPanel, StructureViewerModel viewerData,
+          String sessionFile, String vid)
   {
-    final boolean useinViewerSuperpos = viewerData.isAlignWithPanel();
-    final boolean usetoColourbyseq = viewerData.isColourWithAlignPanel();
-    final boolean viewerColouring = viewerData.isColourByViewer();
+    JalviewStructureDisplayI viewer = null;
 
     switch (type)
     {
     case JMOL:
-      sview = new AppJmol(pdbf, id, sq, alignPanel, usetoColourbyseq,
-              useinViewerSuperpos, viewerColouring, fileloc, rect, vid);
+      viewer = new AppJmol(viewerData, alignPanel, sessionFile, vid);
+      // todo or construct and then openSession(sessionFile)?
       break;
     case CHIMERA:
-      Cache.log.error(
-              "Unsupported structure viewer type " + type.toString());
+      viewer = new ChimeraViewFrame(viewerData, alignPanel, sessionFile,
+              vid);
+      break;
+    case CHIMERAX:
+      viewer = new ChimeraXViewFrame(viewerData, alignPanel, sessionFile,
+              vid);
+      break;
+    case PYMOL:
+      viewer = new PymolViewer(viewerData, alignPanel, sessionFile, vid);
       break;
     default:
       Cache.log.error(UNKNOWN_VIEWER_TYPE + type.toString());
     }
-    return sview;
+    return viewer;
   }
 
   public boolean isBusy()
@@ -403,119 +422,4 @@ public class StructureViewer
     superposeAdded = alignAddedStructures;
   }
 
-  /**
-   * Launch a minimal implementation of a StructureViewer.
-   * 
-   * @param alignPanel
-   * @param pdb
-   * @param seqs
-   * @return
-   */
-  public static StructureViewer launchStructureViewer(
-          AlignmentPanel alignPanel, PDBEntry pdb, SequenceI[] seqs)
-  {
-    return launchStructureViewer(alignPanel, new PDBEntry[] { pdb }, seqs,
-            false, null, null);
-  }
-
-  /**
-   * Adds PDB structures to a new or existing structure viewer
-   * 
-   * @param ssm
-   * @param pdbEntriesToView
-   * @param alignPanel
-   * @param sequences
-   * @return
-   */
-  protected static StructureViewer launchStructureViewer(
-          final AlignmentPanel ap, final PDBEntry[] pdbEntriesToView,
-          SequenceI[] sequences, boolean superimpose,
-          StructureViewer theViewer, IProgressIndicator pb)
-  {
-    final StructureSelectionManager ssm = ap.getStructureSelectionManager();
-    if (theViewer == null)
-      theViewer = new StructureViewer(ssm);
-    long progressId = sequences.hashCode();
-    if (pb != null)
-      pb.setProgressBar(MessageManager.getString(
-              "status.launching_3d_structure_viewer"), progressId);
-    theViewer.setSuperpose(superimpose);
-  
-    /*
-     * remember user's choice of superimpose or not
-     */
-    Cache.setProperty(StructureChooser.AUTOSUPERIMPOSE,
-            Boolean.valueOf(superimpose).toString());
-  
-    if (pb != null)
-      pb.setProgressBar(null, progressId);
-    if (SiftsSettings.isMapWithSifts())
-    {
-      List<SequenceI> seqsWithoutSourceDBRef = new ArrayList<>();
-      int p = 0;
-      // TODO: skip PDBEntry:Sequence pairs where PDBEntry doesn't look like a
-      // real PDB ID. For moment, we can also safely do this if there is already
-      // a known mapping between the PDBEntry and the sequence.
-      for (SequenceI seq : sequences)
-      {
-        PDBEntry pdbe = pdbEntriesToView[p++];
-        if (pdbe != null && pdbe.getFile() != null)
-        {
-          StructureMapping[] smm = ssm.getMapping(pdbe.getFile());
-          if (smm != null && smm.length > 0)
-          {
-            for (StructureMapping sm : smm)
-            {
-              if (sm.getSequence() == seq)
-              {
-                continue;
-              }
-            }
-          }
-        }
-        if (seq.getPrimaryDBRefs().isEmpty())
-        {
-          seqsWithoutSourceDBRef.add(seq);
-          continue;
-        }
-      }
-      if (!seqsWithoutSourceDBRef.isEmpty())
-      {
-        int y = seqsWithoutSourceDBRef.size();
-        if (pb != null)
-          pb.setProgressBar(MessageManager.formatMessage(
-                  "status.fetching_dbrefs_for_sequences_without_valid_refs",
-                  y), progressId);
-        SequenceI[] seqWithoutSrcDBRef = seqsWithoutSourceDBRef
-                .toArray(new SequenceI[y]);
-        DBRefFetcher dbRefFetcher = new DBRefFetcher(seqWithoutSrcDBRef);
-        dbRefFetcher.fetchDBRefs(true);
-  
-        if (pb != null)
-          pb.setProgressBar("Fetch complete.", progressId); // todo i18n
-      }
-    }
-    if (pdbEntriesToView.length > 1)
-    {
-      if (pb != null)
-        pb.setProgressBar(MessageManager.getString(
-                "status.fetching_3d_structures_for_selected_entries"),
-                progressId);
-      theViewer.viewStructures(pdbEntriesToView, sequences, ap);
-    }
-    else
-    {
-      if (pb != null)
-        pb.setProgressBar(MessageManager.formatMessage(
-                "status.fetching_3d_structures_for",
-                pdbEntriesToView[0].getId()), progressId);
-      theViewer.viewStructures(pdbEntriesToView[0], sequences, ap);
-    }
-    if (pb != null)
-      pb.setProgressBar(null, progressId);
-    // remember the last viewer we used...
-    StructureChooser.lastTargetedView = theViewer;
-    return theViewer;
-  }
-
 }