JAL-3904 failing test
[jalview.git] / src / jalview / gui / StructureViewerBase.java
index 1bbc397..f5d350c 100644 (file)
@@ -39,7 +39,6 @@ import java.util.Vector;
 
 import javax.swing.ButtonGroup;
 import javax.swing.JCheckBoxMenuItem;
-import javax.swing.JColorChooser;
 import javax.swing.JMenu;
 import javax.swing.JMenuItem;
 import javax.swing.JRadioButtonMenuItem;
@@ -51,6 +50,7 @@ import jalview.bin.Cache;
 import jalview.datamodel.AlignmentI;
 import jalview.datamodel.PDBEntry;
 import jalview.datamodel.SequenceI;
+import jalview.gui.JalviewColourChooser.ColourChooserListener;
 import jalview.gui.StructureViewer.ViewerType;
 import jalview.gui.ViewSelectionMenu.ViewSetProvider;
 import jalview.io.DataSourceType;
@@ -61,8 +61,11 @@ import jalview.schemes.ColourSchemeI;
 import jalview.schemes.ColourSchemes;
 import jalview.structure.StructureMapping;
 import jalview.structures.models.AAStructureBindingModel;
+import jalview.util.BrowserLauncher;
 import jalview.util.MessageManager;
+import jalview.ws.dbsources.EBIAlfaFold;
 import jalview.ws.dbsources.Pdb;
+import jalview.ws.utils.UrlDownloadClient;
 
 /**
  * Base class with common functionality for JMol, Chimera or other structure
@@ -152,6 +155,15 @@ public abstract class StructureViewerBase extends GStructureViewer
   {
     alignAddedStructures = alignAdded;
   }
+  
+  /**
+   * called by the binding model to indicate when adding structures is happening or has been completed
+   * @param addingStructures
+   */
+  public synchronized void setAddingStructures(boolean addingStructures)
+  {
+    this.addingStructures = addingStructures;
+  }
 
   /**
    * 
@@ -706,7 +718,7 @@ public abstract class StructureViewerBase extends GStructureViewer
                 }
                 else
                 {
-                  // update the Chimera display now.
+                  // update the viewer display now.
                   seqColour_actionPerformed();
                 }
               }
@@ -756,6 +768,10 @@ public abstract class StructureViewerBase extends GStructureViewer
       }
     });
 
+    viewerActionMenu.setText(getViewerName());
+    helpItem.setText(MessageManager.formatMessage("label.viewer_help",
+            getViewerName()));
+
     buildColourMenu();
   }
 
@@ -800,16 +816,23 @@ public abstract class StructureViewerBase extends GStructureViewer
     return reply;
   }
 
+  /**
+   * Opens a colour chooser dialog, and applies the chosen colour to the
+   * background of the structure viewer
+   */
   @Override
   public void background_actionPerformed()
   {
-    Color col = JColorChooser.showDialog(this,
-            MessageManager.getString("label.select_background_colour"),
-            null);
-    if (col != null)
+    String ttl = MessageManager.getString("label.select_background_colour");
+    ColourChooserListener listener = new ColourChooserListener()
     {
-      getBinding().setBackgroundColour(col);
-    }
+      @Override
+      public void colourSelected(Color c)
+      {
+        getBinding().setBackgroundColour(c);
+      }
+    };
+    JalviewColourChooser.showColourChooser(this, ttl, null, listener);
   }
 
   @Override
@@ -867,6 +890,7 @@ public abstract class StructureViewerBase extends GStructureViewer
   @Override
   public void pdbFile_actionPerformed()
   {
+    // TODO: JAL-3048 not needed for Jalview-JS - save PDB file
     JalviewFileChooser chooser = new JalviewFileChooser(
             Cache.getProperty("LAST_DIRECTORY"));
 
@@ -957,7 +981,7 @@ public abstract class StructureViewerBase extends GStructureViewer
      * enable 'Superpose with' if more than one mapped structure
      */
     viewSelectionMenu.setEnabled(false);
-    if (getBinding().getStructureFiles().length > 1
+    if (getBinding().getMappedStructureCount() > 1
             && getBinding().getSequence().length > 1)
     {
       viewSelectionMenu.setEnabled(true);
@@ -1063,7 +1087,7 @@ public abstract class StructureViewerBase extends GStructureViewer
     progressBar = pi;
   }
 
-  protected void setProgressMessage(String message, long id)
+  public void setProgressMessage(String message, long id)
   {
     if (progressBar != null)
     {
@@ -1108,6 +1132,7 @@ public abstract class StructureViewerBase extends GStructureViewer
   {
     String filePath = null;
     Pdb pdbclient = new Pdb();
+    EBIAlfaFold afclient =  new EBIAlfaFold();
     AlignmentI pdbseq = null;
     String pdbid = processingEntry.getId();
     long handle = System.currentTimeMillis()
@@ -1125,7 +1150,30 @@ public abstract class StructureViewerBase extends GStructureViewer
     // { pdbid }));
     try
     {
-      pdbseq = pdbclient.getSequenceRecords(pdbid);
+      if (afclient.isValidReference(pdbid))
+      {
+        pdbseq = afclient.getSequenceRecords(pdbid);
+      } else {
+          if (processingEntry.hasRetrievalUrl())
+          {
+            // retrieve from URL to new local tmpfile
+            File tmpFile = File.createTempFile(pdbid,
+                    "." + (PDBEntry.Type.MMCIF.toString().equals(
+                            processingEntry.getType().toString()) ? "cif"
+                                    : "pdb"));
+            String fromUrl = processingEntry.getRetrievalUrl();
+            UrlDownloadClient.download(fromUrl, tmpFile);
+            
+            // may not need this check ?
+            String file = tmpFile.getAbsolutePath();
+            if (file != null)
+            {
+              pdbseq = EBIAlfaFold.importDownloadedStructureFromUrl(fromUrl,tmpFile,pdbid,null,null,null);
+            }
+          } else {
+            pdbseq = pdbclient.getSequenceRecords(pdbid);
+          }
+      }
     } catch (Exception e)
     {
       System.err.println(
@@ -1162,4 +1210,75 @@ public abstract class StructureViewerBase extends GStructureViewer
     return getBinding() == null ? null : getBinding().saveSession();
   }
 
+  /**
+   * Close down this instance of Jalview's Chimera viewer, giving the user the
+   * option to close the associated Chimera window (process). They may wish to
+   * keep it open until they have had an opportunity to save any work.
+   * 
+   * @param forceClose
+   *          if true, close any linked Chimera process; if false, prompt first
+   */
+  @Override
+  public void closeViewer(boolean forceClose)
+  {
+    AAStructureBindingModel binding = getBinding();
+    if (binding != null && binding.isViewerRunning())
+    {
+      if (!forceClose)
+      {
+        String viewerName = getViewerName();
+        String prompt = MessageManager
+                .formatMessage("label.confirm_close_viewer", new Object[]
+                { binding.getViewerTitle(viewerName, false), viewerName });
+        prompt = JvSwingUtils.wrapTooltip(true, prompt);
+        int confirm = JvOptionPane.showConfirmDialog(this, prompt,
+                MessageManager.getString("label.close_viewer"),
+                JvOptionPane.YES_NO_CANCEL_OPTION);
+        /*
+         * abort closure if user hits escape or Cancel
+         */
+        if (confirm == JvOptionPane.CANCEL_OPTION
+                || confirm == JvOptionPane.CLOSED_OPTION)
+        {
+          return;
+        }
+        forceClose = confirm == JvOptionPane.YES_OPTION;
+      }
+    }
+    if (binding != null)
+    {
+      binding.closeViewer(forceClose);
+    }
+    setAlignmentPanel(null);
+    _aps.clear();
+    _alignwith.clear();
+    _colourwith.clear();
+    // TODO: check for memory leaks where instance isn't finalised because jmb
+    // holds a reference to the window
+    // jmb = null;
+    dispose();
+  }
+
+  @Override
+  public void showHelp_actionPerformed()
+  {
+    try
+    {
+      String url = getBinding().getHelpURL();
+      if (url != null)
+      {
+        BrowserLauncher.openURL(url);
+      }
+    } catch (IOException ex)
+    {
+      System.err
+              .println("Show " + getViewerName() + " failed with: "
+                      + ex.getMessage());
+    }
+  }
+  @Override
+  public boolean hasViewerActionsMenu()
+  {
+    return viewerActionMenu!=null && viewerActionMenu.isEnabled() && viewerActionMenu.getItemCount()>0 && viewerActionMenu.isVisible();
+  }
 }