Merge branch 'releases/Release_2_11_3_Branch'
[jalview.git] / src / jalview / gui / StructureChooser.java
index d00b1c2..0e834d4 100644 (file)
@@ -140,6 +140,12 @@ public class StructureChooser extends GStructureChooser
 
   private boolean showChooserGUI = true;
 
+  /**
+   * when true, queries to external services are supressed (no SIFTs, no PDBe,
+   * no 3D-Beacons, etc)
+   */
+  private boolean dontQueryServices = false;
+
   private static StructureViewer lastTargetedView = null;
 
   public StructureChooser(SequenceI[] selectedSeqs, SequenceI selectedSeq,
@@ -151,6 +157,13 @@ public class StructureChooser extends GStructureChooser
   public StructureChooser(SequenceI[] selectedSeqs, SequenceI selectedSeq,
           AlignmentPanel ap, boolean showGUI)
   {
+    this(selectedSeqs, selectedSeq, ap, showGUI, false);
+  }
+
+  public StructureChooser(SequenceI[] selectedSeqs, SequenceI selectedSeq,
+          AlignmentPanel ap, boolean showGUI, boolean dontQueryServices)
+  {
+
     // which FTS engine to use
     data = StructureChooserQuerySource.getQuerySourceFor(selectedSeqs);
     initDialog();
@@ -160,6 +173,7 @@ public class StructureChooser extends GStructureChooser
     this.selectedSequences = selectedSeqs;
     this.progressIndicator = (ap == null) ? null : ap.alignFrame;
     this.showChooserGUI = showGUI;
+    this.dontQueryServices = dontQueryServices;
     init();
 
   }
@@ -231,17 +245,24 @@ public class StructureChooser extends GStructureChooser
       }
     });
 
-    Executors.defaultThreadFactory().newThread(new Runnable()
+    if (!dontQueryServices)
     {
-      @Override
-      public void run()
+      Executors.defaultThreadFactory().newThread(new Runnable()
       {
-        populateSeqsWithoutSourceDBRef();
-        initialStructureDiscovery();
-      }
-
-    }).start();
+        @Override
+        public void run()
+        {
+          populateSeqsWithoutSourceDBRef();
+          initialStructureDiscovery();
+        }
 
+      }).start();
+    }
+    else
+    {
+      Console.debug(
+              "Structure chooser not querying services to discover metadata.");
+    }
   }
 
   // called by init
@@ -506,7 +527,7 @@ public class StructureChooser extends GStructureChooser
         }
       } catch (Exception e)
       {
-        e.printStackTrace();
+        Console.printStackTrace(e);
         errors.add(e.getMessage());
         continue;
       }
@@ -543,9 +564,18 @@ public class StructureChooser extends GStructureChooser
         {
           errorMsg.append(error).append("\n");
         }
-        JvOptionPane.showMessageDialog(this, errorMsg.toString(),
-                MessageManager.getString("label.pdb_web-service_error"),
-                JvOptionPane.ERROR_MESSAGE);
+        if (!Jalview.isHeadlessMode())
+        {
+          JvOptionPane.showMessageDialog(this, errorMsg.toString(),
+                  MessageManager.getString("label.pdb_web-service_error"),
+                  JvOptionPane.ERROR_MESSAGE);
+        }
+        else
+        {
+          Console.error(
+                  MessageManager.getString("label.pdb_web-service_error"));
+          Console.debug(errorMsg.toString());
+        }
       }
     }
   }
@@ -606,7 +636,7 @@ public class StructureChooser extends GStructureChooser
 
           } catch (Exception e)
           {
-            e.printStackTrace();
+            Console.debugPrintStackTrace(e);
             errors.add(e.getMessage());
             continue;
           }
@@ -983,8 +1013,14 @@ public class StructureChooser extends GStructureChooser
               .getFTSDataFor(getResultTable(), selectedRow,
                       discoveredStructuresSet);
       String pageUrl = row.getModelViewUrl();
+
       JPopupMenu popup = new JPopupMenu("3D Beacons");
       JMenuItem viewUrl = new JMenuItem("View model web page");
+      if (pageUrl == null || "".equals(pageUrl.trim()))
+      {
+        viewUrl.setEnabled(false);
+        viewUrl.setText("No model page available.");
+      }
       viewUrl.addActionListener(new ActionListener()
       {
         @Override
@@ -1308,10 +1344,10 @@ public class StructureChooser extends GStructureChooser
             selectedSequence = userSelectedSeq;
           }
           String pdbFilename = selectedPdbFileName;
-
+          // TODO - tidy up this ugly hack so we call launchStructureViewer too
           StructureChooser.openStructureFileForSequence(ssm, sc, ap,
-                  selectedSequence, true, pdbFilename, tft, paeFilename,
-                  true);
+                  selectedSequence, true, pdbFilename, tft, paeFilename,false,
+                  true,false,getTargetedStructureViewer(ssm).getViewerType());
         }
         SwingUtilities.invokeLater(new Runnable()
         {
@@ -1387,6 +1423,12 @@ public class StructureChooser extends GStructureChooser
     boolean superimpose = chk_superpose.isSelected();
     theViewer.setSuperpose(superimpose);
 
+    // if we're running in --headless mode make this viewer synchronous
+    if (Jalview.isHeadlessMode())
+    {
+      theViewer.setAsync(false);
+    }
+
     /*
      * remember user's choice of superimpose or not
      */
@@ -1523,7 +1565,8 @@ public class StructureChooser extends GStructureChooser
             // for moment, it will work fine as is because it is self-contained
             String searchTerm = text.toLowerCase(Locale.ROOT);
             searchTerm = searchTerm.split(":")[0];
-            // jalview.bin.Console.outPrintln(">>>>> search term : " + searchTerm);
+            // jalview.bin.Console.outPrintln(">>>>> search term : " +
+            // searchTerm);
             List<FTSDataColumnI> wantedFields = new ArrayList<>();
             FTSRestRequest pdbRequest = new FTSRestRequest();
             pdbRequest.setAllowEmptySeq(false);
@@ -1763,6 +1806,22 @@ public class StructureChooser extends GStructureChooser
             paeFilename, false, true, doXferSettings, null);
   }
 
+  /**
+   * 
+   * @param ssm
+   * @param sc
+   * @param ap
+   * @param seq
+   * @param prompt
+   * @param sFilename
+   * @param tft
+   * @param paeFilename
+   * @param forceHeadless
+   * @param showRefAnnotations
+   * @param doXferSettings
+   * @param viewerType - when not null means the viewer will be opened, providing forceHeadless/headless is not true
+   * @return
+   */
   public static StructureViewer openStructureFileForSequence(
           StructureSelectionManager ssm, StructureChooser sc,
           AlignmentPanel ap, SequenceI seq, boolean prompt,
@@ -1776,13 +1835,16 @@ public class StructureChooser extends GStructureChooser
     {
       // headless = true;
       prompt = false;
-      sc = new StructureChooser(new SequenceI[] { seq }, seq, ap, false);
+      // suppress structure viewer's external service queries
+      sc = new StructureChooser(new SequenceI[] { seq }, seq, ap, false,
+              true);
     }
     if (ssm == null)
     {
       ssm = ap.getStructureSelectionManager();
+      StructureSelectionManager.doConfigureStructurePrefs(ssm);
     }
-
+    
     PDBEntry fileEntry = new AssociatePdbFileWithSeq().associatePdbWithSeq(
             sFilename, DataSourceType.FILE, seq, prompt, Desktop.instance,
             tft, paeFilename, doXferSettings);
@@ -1794,10 +1856,13 @@ public class StructureChooser extends GStructureChooser
       sv = sc.launchStructureViewer(ssm, new PDBEntry[] { fileEntry }, ap,
               new SequenceI[]
               { seq }, viewerType);
+      // foo
+      sv.getJalviewStructureDisplay().raiseViewer();
     }
 
     sc.mainFrame.dispose();
 
+    // TODO should honor preferences - only show reference annotation that is requested - JAL-4415 JAL-3124
     if (showRefAnnotations)
     {
       showReferenceAnnotationsForSequence(ap.alignFrame, seq);