Merge branch 'develop' into features/JAL-4134_use_annotation_row_for_colours_and_groups
[jalview.git] / src / jalview / gui / StructureChooser.java
index 7d2d907..6fce984 100644 (file)
@@ -33,7 +33,6 @@ import java.util.LinkedHashSet;
 import java.util.List;
 import java.util.Locale;
 import java.util.Map;
 import java.util.List;
 import java.util.Locale;
 import java.util.Map;
-import java.util.concurrent.Callable;
 import java.util.concurrent.Executors;
 
 import javax.swing.JCheckBox;
 import java.util.concurrent.Executors;
 
 import javax.swing.JCheckBox;
@@ -67,10 +66,12 @@ import jalview.fts.core.FTSRestRequest;
 import jalview.fts.core.FTSRestResponse;
 import jalview.fts.service.pdb.PDBFTSRestClient;
 import jalview.fts.service.threedbeacons.TDB_FTSData;
 import jalview.fts.core.FTSRestResponse;
 import jalview.fts.service.pdb.PDBFTSRestClient;
 import jalview.fts.service.threedbeacons.TDB_FTSData;
+import jalview.gui.StructureViewer.ViewerType;
 import jalview.gui.structurechooser.PDBStructureChooserQuerySource;
 import jalview.gui.structurechooser.StructureChooserQuerySource;
 import jalview.gui.structurechooser.ThreeDBStructureChooserQuerySource;
 import jalview.io.DataSourceType;
 import jalview.gui.structurechooser.PDBStructureChooserQuerySource;
 import jalview.gui.structurechooser.StructureChooserQuerySource;
 import jalview.gui.structurechooser.ThreeDBStructureChooserQuerySource;
 import jalview.io.DataSourceType;
+import jalview.io.FileFormatException;
 import jalview.io.JalviewFileChooser;
 import jalview.io.JalviewFileView;
 import jalview.jbgui.FilterOption;
 import jalview.io.JalviewFileChooser;
 import jalview.io.JalviewFileView;
 import jalview.jbgui.FilterOption;
@@ -83,6 +84,8 @@ import jalview.util.Platform;
 import jalview.util.StringUtils;
 import jalview.ws.DBRefFetcher;
 import jalview.ws.DBRefFetcher.FetchFinishedListenerI;
 import jalview.util.StringUtils;
 import jalview.ws.DBRefFetcher;
 import jalview.ws.DBRefFetcher.FetchFinishedListenerI;
+import jalview.ws.datamodel.alphafold.PAEContactMatrix;
+import jalview.ws.dbsources.EBIAlfaFold;
 import jalview.ws.seqfetcher.DbSourceProxy;
 import jalview.ws.sifts.SiftsSettings;
 
 import jalview.ws.seqfetcher.DbSourceProxy;
 import jalview.ws.sifts.SiftsSettings;
 
@@ -346,7 +349,7 @@ public class StructureChooser extends GStructureChooser
     };
 
     // fetch db refs if OK pressed
     };
 
     // fetch db refs if OK pressed
-    final Callable discoverCanonicalDBrefs = () -> {
+    final Runnable discoverCanonicalDBrefs = () -> {
       btn_queryTDB.setEnabled(false);
       populateSeqsWithoutSourceDBRef();
 
       btn_queryTDB.setEnabled(false);
       populateSeqsWithoutSourceDBRef();
 
@@ -368,14 +371,12 @@ public class StructureChooser extends GStructureChooser
         // call finished action directly
         afterDbRefFetch.finished();
       }
         // call finished action directly
         afterDbRefFetch.finished();
       }
-      return null;
     };
     };
-    final Callable revertview = () -> {
+    final Runnable revertview = () -> {
       if (lastSelected != null)
       {
         cmb_filterOption.setSelectedItem(lastSelected);
       }
       if (lastSelected != null)
       {
         cmb_filterOption.setSelectedItem(lastSelected);
       }
-      return null;
     };
     int threshold = Cache.getDefault("UNIPROT_AUTOFETCH_THRESHOLD",
             THRESHOLD_WARN_UNIPROT_FETCH_NEEDED);
     };
     int threshold = Cache.getDefault("UNIPROT_AUTOFETCH_THRESHOLD",
             THRESHOLD_WARN_UNIPROT_FETCH_NEEDED);
@@ -706,7 +707,7 @@ public class StructureChooser extends GStructureChooser
   }
 
   /**
   }
 
   /**
-   * Handles action event for btn_pdbFromFile
+   * Handles action event for btn_paeMatrixFile
    */
   @Override
   protected void paeMatrixFile_actionPerformed()
    */
   @Override
   protected void paeMatrixFile_actionPerformed()
@@ -735,10 +736,26 @@ public class StructureChooser extends GStructureChooser
             "label.load_pae_matrix_file_associate_with_structure",
             pdbFile.getName()));
 
             "label.load_pae_matrix_file_associate_with_structure",
             pdbFile.getName()));
 
+    // TODO convert to Callable/Promise
     int value = chooser.showOpenDialog(null);
     if (value == JalviewFileChooser.APPROVE_OPTION)
     {
     int value = chooser.showOpenDialog(null);
     if (value == JalviewFileChooser.APPROVE_OPTION)
     {
-      localPdbPaeMatrixFileName = chooser.getSelectedFile().getPath();
+      String fileName = chooser.getSelectedFile().getPath();
+      try
+      {
+        PAEContactMatrix.validateContactMatrixFile(fileName);
+      } catch (Exception thr)
+      {
+        JvOptionPane.showInternalMessageDialog(this, MessageManager
+                .formatMessage("label.couldnt_load_file", new Object[]
+                { fileName }) + "<br>" + thr.getLocalizedMessage(),
+                MessageManager.getString("label.error_loading_file"),
+                JvOptionPane.WARNING_MESSAGE);
+        Console.error("Couldn't import " + fileName + " as a PAE matrix",
+                thr);
+        return;
+      }
+      localPdbPaeMatrixFileName = fileName;
       Cache.setProperty("LAST_DIRECTORY", localPdbPaeMatrixFileName);
     }
     validateAssociationFromFile();
       Cache.setProperty("LAST_DIRECTORY", localPdbPaeMatrixFileName);
     }
     validateAssociationFromFile();
@@ -1060,11 +1077,13 @@ public class StructureChooser extends GStructureChooser
       {
         pdbFileString = MessageManager.getString("label.none");
         pdbFileTooltip = MessageManager.getString("label.nothing_selected");
       {
         pdbFileString = MessageManager.getString("label.none");
         pdbFileTooltip = MessageManager.getString("label.nothing_selected");
+        setPdbOptionsEnabled(false);
       }
     }
     else
     {
       btn_pdbFromFile.setEnabled(false);
       }
     }
     else
     {
       btn_pdbFromFile.setEnabled(false);
+      setPdbOptionsEnabled(false);
       // lbl_fromFileStatus.setIcon(errorImage);
       pdbFileString = MessageManager.getString("label.none");
       pdbFileTooltip = MessageManager.getString("label.nothing_selected");
       // lbl_fromFileStatus.setIcon(errorImage);
       pdbFileString = MessageManager.getString("label.none");
       pdbFileTooltip = MessageManager.getString("label.nothing_selected");
@@ -1189,7 +1208,14 @@ public class StructureChooser extends GStructureChooser
     final StructureSelectionManager ssm = ap.getStructureSelectionManager();
 
     final int preferredHeight = pnl_filter.getHeight();
     final StructureSelectionManager ssm = ap.getStructureSelectionManager();
 
     final int preferredHeight = pnl_filter.getHeight();
+    btn_add.setEnabled(false);
+    btn_newView.setEnabled(false);
+    btn_cancel.setEnabled(false);
+    actionsPanel.setEnabled(false);
 
 
+    final String progress = MessageManager
+            .getString("label.working_ellipsis");
+    setProgressBar(progress, progress.hashCode());
     Runnable viewStruc = new Runnable()
     {
       @Override
     Runnable viewStruc = new Runnable()
     {
       @Override
@@ -1280,7 +1306,9 @@ public class StructureChooser extends GStructureChooser
                   .getCmb_assSeq().getSelectedItem();
           SequenceI userSelectedSeq = assSeqOpt.getSequence();
           if (userSelectedSeq != null)
                   .getCmb_assSeq().getSelectedItem();
           SequenceI userSelectedSeq = assSeqOpt.getSequence();
           if (userSelectedSeq != null)
+          {
             selectedSequence = userSelectedSeq;
             selectedSequence = userSelectedSeq;
+          }
           String pdbFilename = selectedPdbFileName;
 
           StructureChooser.openStructureFileForSequence(ssm, sc, ap,
           String pdbFilename = selectedPdbFileName;
 
           StructureChooser.openStructureFileForSequence(ssm, sc, ap,
@@ -1292,6 +1320,7 @@ public class StructureChooser extends GStructureChooser
           @Override
           public void run()
           {
           @Override
           public void run()
           {
+            setProgressBar("Complete.", progress.hashCode());
             closeAction(preferredHeight);
             mainFrame.dispose();
           }
             closeAction(preferredHeight);
             mainFrame.dispose();
           }
@@ -1344,6 +1373,15 @@ public class StructureChooser extends GStructureChooser
           StructureSelectionManager ssm, final PDBEntry[] pdbEntriesToView,
           final AlignmentPanel alignPanel, SequenceI[] sequences)
   {
           StructureSelectionManager ssm, final PDBEntry[] pdbEntriesToView,
           final AlignmentPanel alignPanel, SequenceI[] sequences)
   {
+    return launchStructureViewer(ssm, pdbEntriesToView, alignPanel,
+            sequences, null);
+  }
+
+  private StructureViewer launchStructureViewer(
+          StructureSelectionManager ssm, final PDBEntry[] pdbEntriesToView,
+          final AlignmentPanel alignPanel, SequenceI[] sequences,
+          ViewerType viewerType)
+  {
     long progressId = sequences.hashCode();
     setProgressBar(MessageManager
             .getString("status.launching_3d_structure_viewer"), progressId);
     long progressId = sequences.hashCode();
     setProgressBar(MessageManager
             .getString("status.launching_3d_structure_viewer"), progressId);
@@ -1408,7 +1446,8 @@ public class StructureChooser extends GStructureChooser
               MessageManager.getString(
                       "status.fetching_3d_structures_for_selected_entries"),
               progressId);
               MessageManager.getString(
                       "status.fetching_3d_structures_for_selected_entries"),
               progressId);
-      theViewer.viewStructures(pdbEntriesToView, sequences, alignPanel);
+      theViewer.viewStructures(pdbEntriesToView, sequences, alignPanel,
+              viewerType);
     }
     else
     {
     }
     else
     {
@@ -1416,7 +1455,8 @@ public class StructureChooser extends GStructureChooser
               "status.fetching_3d_structures_for",
               pdbEntriesToView[0].getId()), progressId);
       // Can we pass a pre-computeMappinged pdbFile?
               "status.fetching_3d_structures_for",
               pdbEntriesToView[0].getId()), progressId);
       // Can we pass a pre-computeMappinged pdbFile?
-      theViewer.viewStructures(pdbEntriesToView[0], sequences, alignPanel);
+      theViewer.viewStructures(pdbEntriesToView[0], sequences, alignPanel,
+              viewerType);
     }
     setProgressBar(null, progressId);
     // remember the last viewer we used...
     }
     setProgressBar(null, progressId);
     // remember the last viewer we used...
@@ -1657,20 +1697,21 @@ public class StructureChooser extends GStructureChooser
   @Override
   public void setProgressBar(String message, long id)
   {
   @Override
   public void setProgressBar(String message, long id)
   {
-    if (!Platform.isHeadless())
+    if (!Platform.isHeadless() && progressBar != null)
       progressBar.setProgressBar(message, id);
   }
 
   @Override
   public void registerHandler(long id, IProgressIndicatorHandler handler)
   {
       progressBar.setProgressBar(message, id);
   }
 
   @Override
   public void registerHandler(long id, IProgressIndicatorHandler handler)
   {
-    progressBar.registerHandler(id, handler);
+    if (progressBar != null)
+      progressBar.registerHandler(id, handler);
   }
 
   @Override
   public boolean operationInProgress()
   {
   }
 
   @Override
   public boolean operationInProgress()
   {
-    return progressBar.operationInProgress();
+    return progressBar == null ? false : progressBar.operationInProgress();
   }
 
   public JalviewStructureDisplayI getOpenedStructureViewer()
   }
 
   public JalviewStructureDisplayI getOpenedStructureViewer()
@@ -1721,25 +1762,28 @@ public class StructureChooser extends GStructureChooser
           boolean doXferSettings)
   {
     openStructureFileForSequence(ssm, sc, ap, seq, prompt, sFilename, tft,
           boolean doXferSettings)
   {
     openStructureFileForSequence(ssm, sc, ap, seq, prompt, sFilename, tft,
-            paeFilename, false, true, doXferSettings);
+            paeFilename, false, true, doXferSettings, null);
   }
 
   }
 
-  public static void openStructureFileForSequence(
+  public static StructureViewer openStructureFileForSequence(
           StructureSelectionManager ssm, StructureChooser sc,
           AlignmentPanel ap, SequenceI seq, boolean prompt,
           String sFilename, TFType tft, String paeFilename,
           StructureSelectionManager ssm, StructureChooser sc,
           AlignmentPanel ap, SequenceI seq, boolean prompt,
           String sFilename, TFType tft, String paeFilename,
-          boolean forceHeadless, boolean showAnnotations,
-          boolean doXferSettings)
+          boolean forceHeadless, boolean showRefAnnotations,
+          boolean doXferSettings, ViewerType viewerType)
   {
   {
+    StructureViewer sv = null;
     boolean headless = forceHeadless;
     if (sc == null)
     {
     boolean headless = forceHeadless;
     if (sc == null)
     {
-      headless = true;
+      // headless = true;
       prompt = false;
       sc = new StructureChooser(new SequenceI[] { seq }, seq, ap, false);
     }
     if (ssm == null)
       prompt = false;
       sc = new StructureChooser(new SequenceI[] { seq }, seq, ap, false);
     }
     if (ssm == null)
+    {
       ssm = ap.getStructureSelectionManager();
       ssm = ap.getStructureSelectionManager();
+    }
 
     PDBEntry fileEntry = new AssociatePdbFileWithSeq().associatePdbWithSeq(
             sFilename, DataSourceType.FILE, seq, prompt, Desktop.instance,
 
     PDBEntry fileEntry = new AssociatePdbFileWithSeq().associatePdbWithSeq(
             sFilename, DataSourceType.FILE, seq, prompt, Desktop.instance,
@@ -1747,15 +1791,19 @@ public class StructureChooser extends GStructureChooser
 
     // if headless, "false" in the sc constructor above will avoid GUI behaviour
     // in sc.launchStructureViewer()
 
     // if headless, "false" in the sc constructor above will avoid GUI behaviour
     // in sc.launchStructureViewer()
-    sc.launchStructureViewer(ssm, new PDBEntry[] { fileEntry }, ap,
-            new SequenceI[]
-            { seq });
+    if (!headless && !(viewerType == null))
+    {
+      sv = sc.launchStructureViewer(ssm, new PDBEntry[] { fileEntry }, ap,
+              new SequenceI[]
+              { seq }, viewerType);
+    }
 
 
-    if (headless)
-      sc.mainFrame.dispose();
+    sc.mainFrame.dispose();
 
 
-    if (showAnnotations)
+    if (showRefAnnotations)
       showReferenceAnnotationsForSequence(ap.alignFrame, seq);
       showReferenceAnnotationsForSequence(ap.alignFrame, seq);
+
+    return sv;
   }
 
   public static void showReferenceAnnotationsForSequence(AlignFrame af,
   }
 
   public static void showReferenceAnnotationsForSequence(AlignFrame af,