JAL-1847 superpose checkbox in structure chooser
[jalview.git] / src / jalview / gui / StructureChooser.java
index 5de3082..1b69989 100644 (file)
@@ -22,6 +22,7 @@
 package jalview.gui;
 
 import jalview.api.structures.JalviewStructureDisplayI;
+import jalview.bin.Cache;
 import jalview.bin.Jalview;
 import jalview.datamodel.DBRefEntry;
 import jalview.datamodel.DBRefSource;
@@ -55,6 +56,7 @@ import javax.swing.JCheckBox;
 import javax.swing.JComboBox;
 import javax.swing.JLabel;
 import javax.swing.JTable;
+import javax.swing.SwingUtilities;
 import javax.swing.table.AbstractTableModel;
 
 /**
@@ -107,6 +109,8 @@ public class StructureChooser extends GStructureChooser
       progressBar = new ProgressBar(this.statusPanel, this.statusBar);
     }
 
+    chk_superpose.setSelected(Cache.getDefault("AUTOSUPERIMPOSE", true));
+
     // ensure a filter option is in force for search
     populateFilterComboBox(true, cachedPDBExists);
     Thread discoverPDBStructuresThread = new Thread(new Runnable()
@@ -124,6 +128,7 @@ public class StructureChooser extends GStructureChooser
         fetchStructuresMetaData();
         // revise filter options if no results were found
         populateFilterComboBox(isStructuresDiscovered(), cachedPDBExists);
+        discoverStructureViews();
         updateProgressIndicator(null, startTime);
         mainFrame.setVisible(true);
         updateCurrentView();
@@ -132,6 +137,47 @@ public class StructureChooser extends GStructureChooser
     discoverPDBStructuresThread.start();
   }
 
+  private void discoverStructureViews()
+  {
+    if (Desktop.instance != null)
+    {
+      targetView.removeAllItems();
+      targetView.addItem(
+              new StructureViewer(ap.getStructureSelectionManager()));
+      if (lastTargetedView != null && !lastTargetedView.isVisible())
+      {
+        lastTargetedView = null;
+      }
+      int linkedViewsAt = 1;
+      for (StructureViewerBase view : Desktop.instance
+              .getStructureViewers(null, null))
+      {
+        StructureViewer viewHandler = (lastTargetedView != null
+                && lastTargetedView.sview == view) ? lastTargetedView
+                        : StructureViewer.reconfigure(view);
+
+        if (view.isLinkedWith(ap))
+        {
+          targetView.insertItemAt(viewHandler,
+                  linkedViewsAt++);
+        }
+        else
+        {
+          targetView.addItem(viewHandler);
+        }
+      }
+      targetView.setVisible(targetView.getItemCount() > 1);
+
+      // finally, restore last targeted view by default.
+      if (lastTargetedView != null)
+      {
+        targetView.setSelectedItem(lastTargetedView);
+      }
+    }
+  }
+
+  private static StructureViewer lastTargetedView = null;
+
   /**
    * Updates the progress indicator with the specified message
    * 
@@ -911,8 +957,15 @@ public class StructureChooser extends GStructureChooser
                   new SequenceI[]
                   { selectedSequence });
         }
-        closeAction(preferredHeight);
-        mainFrame.dispose();
+        SwingUtilities.invokeLater(new Runnable()
+        {
+          @Override
+          public void run()
+          {
+            closeAction(preferredHeight);
+            mainFrame.dispose();
+          }
+        });
       }
     };
     Thread runner = new Thread(viewStruc);
@@ -949,6 +1002,25 @@ public class StructureChooser extends GStructureChooser
     return foundEntry;
   }
 
+  /**
+   * @param ssm
+   * @return targetted structure view (new or existing) configured according to
+   *         superpose checkbox
+   */
+  public StructureViewer getTargetedStructureViewer(
+          StructureSelectionManager ssm)
+  {
+    Object _sv = targetView.getSelectedItem();
+    StructureViewer sv;
+    if (_sv == null)
+    {
+      sv = new StructureViewer(ssm);
+    } else {
+      sv = (StructureViewer) _sv;
+    }
+    sv.setSuperpose(chk_superpose.isSelected());
+    return sv;
+  }
   private StructureViewer launchStructureViewer(
           StructureSelectionManager ssm,
           final PDBEntry[] pdbEntriesToView,
@@ -957,9 +1029,10 @@ public class StructureChooser extends GStructureChooser
     long progressId = sequences.hashCode();
     setProgressBar(MessageManager
             .getString("status.launching_3d_structure_viewer"), progressId);
-    final StructureViewer sViewer = new StructureViewer(ssm);
-    setProgressBar(null, progressId);
+    final StructureViewer sViewer = getTargetedStructureViewer(ssm);
+    sViewer.setSuperpose(chk_superpose.isSelected());
 
+    setProgressBar(null, progressId);
     if (SiftsSettings.isMapWithSifts())
     {
       List<SequenceI> seqsWithoutSourceDBRef = new ArrayList<>();
@@ -1024,6 +1097,8 @@ public class StructureChooser extends GStructureChooser
       sViewer.viewStructures(pdbEntriesToView[0], sequences, alignPanel);
     }
     setProgressBar(null, progressId);
+    // remember the last viewer we used...
+    lastTargetedView = sViewer;
     return sViewer;
   }