JAL-2759 rationalise visible contigs iteration
[jalview.git] / src / jalview / gui / StructureViewer.java
index df5a6c4..e58b378 100644 (file)
@@ -1,6 +1,6 @@
 /*
- * Jalview - A Sequence Alignment Editor and Viewer (Version 2.9)
- * Copyright (C) 2015 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.
  * 
@@ -61,7 +61,8 @@ public class StructureViewer
     Cache.setProperty(Preferences.STRUCTURE_DISPLAY, type.name());
   }
 
-  public StructureViewer(StructureSelectionManager structureSelectionManager)
+  public StructureViewer(
+          StructureSelectionManager structureSelectionManager)
   {
     ssm = structureSelectionManager;
   }
@@ -123,8 +124,8 @@ public class StructureViewer
         }
       }
     }
-    return viewStructures(pdbs[0],
-            seqs.toArray(new SequenceI[seqs.size()]), ap);
+    return viewStructures(pdbs[0], seqs.toArray(new SequenceI[seqs.size()]),
+            ap);
   }
 
   public JalviewStructureDisplayI viewStructures(PDBEntry pdb,
@@ -136,14 +137,17 @@ public class StructureViewer
   protected JalviewStructureDisplayI viewStructures(ViewerType viewerType,
           PDBEntry[] pdbs, SequenceI[][] seqsForPdbs, AlignmentPanel ap)
   {
+    PDBEntry[] pdbsForFile = getUniquePdbFiles(pdbs);
     JalviewStructureDisplayI sview = null;
     if (viewerType.equals(ViewerType.JMOL))
     {
-      sview = new AppJmol(ap, pdbs, ap.av.collateForPDB(pdbs));
+      sview = new AppJmol(ap, pdbsForFile,
+              ap.av.collateForPDB(pdbsForFile));
     }
     else if (viewerType.equals(ViewerType.CHIMERA))
     {
-      sview = new ChimeraViewFrame(pdbs, ap.av.collateForPDB(pdbs), ap);
+      sview = new ChimeraViewFrame(pdbsForFile,
+              ap.av.collateForPDB(pdbsForFile), ap);
     }
     else
     {
@@ -153,6 +157,36 @@ public class StructureViewer
     return sview;
   }
 
+  /**
+   * 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)
   {
@@ -187,10 +221,10 @@ public class StructureViewer
    * @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 JalviewStructureDisplayI createView(ViewerType type, String[] pdbf,
+          String[] id, SequenceI[][] sq, AlignmentPanel alignPanel,
+          StructureViewerModel viewerData, String fileloc, Rectangle rect,
+          String vid)
   {
     final boolean useinViewerSuperpos = viewerData.isAlignWithPanel();
     final boolean usetoColourbyseq = viewerData.isColourWithAlignPanel();
@@ -204,8 +238,8 @@ public class StructureViewer
               useinViewerSuperpos, viewerColouring, fileloc, rect, vid);
       break;
     case CHIMERA:
-      Cache.log.error("Unsupported structure viewer type "
-              + type.toString());
+      Cache.log.error(
+              "Unsupported structure viewer type " + type.toString());
       break;
     default:
       Cache.log.error("Unknown structure viewer type " + type.toString());