JAL-3851 merged to develop 2022-03-22
[jalview.git] / src / jalview / gui / SequenceFetcher.java
index 9052413..7d74f82 100755 (executable)
@@ -31,6 +31,7 @@ import java.util.Arrays;
 import java.util.HashSet;
 import java.util.Iterator;
 import java.util.List;
+import java.util.concurrent.CompletableFuture;
 
 import javax.swing.JButton;
 import javax.swing.JCheckBox;
@@ -44,6 +45,7 @@ import javax.swing.SwingConstants;
 
 import jalview.api.FeatureSettingsModelI;
 import jalview.bin.Cache;
+import jalview.bin.Console;
 import jalview.datamodel.AlignmentI;
 import jalview.datamodel.DBRefEntry;
 import jalview.datamodel.SequenceI;
@@ -167,10 +169,18 @@ public class SequenceFetcher extends JPanel implements Runnable
    * @param guiIndic
    * @param selectedDb
    * @param queryString
+   * @param interactive
    */
   public SequenceFetcher(IProgressIndicator guiIndic,
           final String selectedDb, final String queryString)
   {
+    this(guiIndic, selectedDb, queryString, true);
+  }
+
+  public SequenceFetcher(IProgressIndicator guiIndic,
+          final String selectedDb, final String queryString,
+          boolean interactive)
+  {
     this.progressIndicator = guiIndic;
     getSequenceFetcherSingleton();
     this.guiWindow = progressIndicator;
@@ -180,7 +190,7 @@ public class SequenceFetcher extends JPanel implements Runnable
       alignFrame = (AlignFrame) progressIndicator;
     }
 
-    jbInit(selectedDb);
+    jbInit(selectedDb, interactive);
     textArea.setText(queryString);
 
     frame = new JInternalFrame();
@@ -197,7 +207,7 @@ public class SequenceFetcher extends JPanel implements Runnable
                     .getString("label.additional_sequence_fetcher"));
   }
 
-  private void jbInit(String selectedDb)
+  private void jbInit(String selectedDb, boolean interactive)
   {
     this.setLayout(new BorderLayout());
 
@@ -355,6 +365,18 @@ public class SequenceFetcher extends JPanel implements Runnable
     jScrollPane1.getViewport().add(textArea);
     idsPanel.add(jScrollPane1, BorderLayout.CENTER);
 
+    // En/disable or show/hide interactive elements
+    database.setEnabled(interactive);
+    exampleAccession.setVisible(interactive);
+    replacePunctuation.setVisible(interactive);
+    okBtn.setVisible(interactive);
+    exampleBtn.setVisible(interactive);
+    closeBtn.setVisible(interactive);
+    backBtn.setVisible(interactive);
+    jLabel1.setVisible(interactive);
+    clear.setVisible(interactive);
+    textArea.setEnabled(interactive);
+
     this.add(actionPanel, BorderLayout.SOUTH);
     this.add(idsPanel, BorderLayout.CENTER);
     this.add(databasePanel, BorderLayout.NORTH);
@@ -465,7 +487,7 @@ public class SequenceFetcher extends JPanel implements Runnable
    * 
    * @param e
    */
-  protected void close_actionPerformed(ActionEvent e)
+  public void close_actionPerformed(ActionEvent e)
   {
     try
     {
@@ -484,6 +506,12 @@ public class SequenceFetcher extends JPanel implements Runnable
    */
   public void ok_actionPerformed()
   {
+    ok_actionPerformed(false, null);
+  }
+
+  public CompletableFuture<Void> ok_actionPerformed(boolean returnFuture,
+          String id)
+  {
     /*
      * tidy inputs and check there is something to search for
      */
@@ -504,14 +532,14 @@ public class SequenceFetcher extends JPanel implements Runnable
       showErrorMessage(
               "Please enter a (semi-colon separated list of) database id(s)");
       resetDialog();
-      return;
+      return null;
     }
     if (database.getSelectedIndex() == 0)
     {
       // todo i18n
       showErrorMessage("Please choose a database");
       resetDialog();
-      return;
+      return null;
     }
 
     exampleBtn.setEnabled(false);
@@ -520,8 +548,17 @@ public class SequenceFetcher extends JPanel implements Runnable
     closeBtn.setEnabled(false);
     backBtn.setEnabled(false);
 
-    Thread worker = new Thread(this);
-    worker.start();
+    CompletableFuture<Void> worker = CompletableFuture
+            .runAsync(() -> runAndCacheAlignFrame(returnFuture, id));
+
+    return returnFuture ? worker : null;
+  }
+
+  private void runAndCacheAlignFrame(boolean cacheAlignFrame, String id)
+  {
+    AlignFrame af = this.run(cacheAlignFrame);
+    if (cacheAlignFrame && id != null && af != null)
+      af.cacheAlignFrameFromRestId(id);
   }
 
   private void resetDialog()
@@ -536,6 +573,11 @@ public class SequenceFetcher extends JPanel implements Runnable
   @Override
   public void run()
   {
+    run(false);
+  }
+
+  public AlignFrame run(boolean returnAlignFrame)
+  {
     boolean addToLast = false;
     List<String> aresultq = new ArrayList<>();
     List<String> presultTitle = new ArrayList<>();
@@ -675,9 +717,10 @@ public class SequenceFetcher extends JPanel implements Runnable
                             : MessageManager.getString("status.processing"),
                     Thread.currentThread().hashCode());
     // process results
+    AlignFrame af = null;
     while (presult.size() > 0)
     {
-      parseResult(presult.remove(0), presultTitle.remove(0), null,
+      af = parseResult(presult.remove(0), presultTitle.remove(0), null,
               preferredFeatureColours);
     }
     // only remove visual delay after we finished parsing.
@@ -705,6 +748,7 @@ public class SequenceFetcher extends JPanel implements Runnable
       showErrorMessage(sb.toString());
     }
     resetDialog();
+    return returnAlignFrame ? af : null;
   }
 
   /**
@@ -811,7 +855,7 @@ public class SequenceFetcher extends JPanel implements Runnable
       }
     } catch (Exception e)
     {
-      Cache.info("Error retrieving " + accession + " from "
+      Console.info("Error retrieving " + accession + " from "
               + proxy.getDbName(), e);
     }
     return success;
@@ -881,20 +925,21 @@ public class SequenceFetcher extends JPanel implements Runnable
    * @param preferredFeatureColours
    * @return the alignment
    */
-  public AlignmentI parseResult(AlignmentI al, String title,
+  public AlignFrame parseResult(AlignmentI al, String title,
           FileFormatI currentFileFormat,
           FeatureSettingsModelI preferredFeatureColours)
   {
 
+    AlignFrame af = alignFrame;
     if (al != null && al.getHeight() > 0)
     {
       if (title == null)
       {
         title = getDefaultRetrievalTitle();
       }
-      if (alignFrame == null)
+      if (af == null)
       {
-        AlignFrame af = new AlignFrame(al, AlignFrame.DEFAULT_WIDTH,
+        af = new AlignFrame(al, AlignFrame.DEFAULT_WIDTH,
                 AlignFrame.DEFAULT_HEIGHT);
         if (currentFileFormat != null)
         {
@@ -934,10 +979,10 @@ public class SequenceFetcher extends JPanel implements Runnable
       }
       else
       {
-        alignFrame.viewport.addAlignment(al, title);
+        af.viewport.addAlignment(al, title);
       }
     }
-    return al;
+    return af;
   }
 
   void showErrorMessage(final String error)