JAL-1990 added a progress indicator for Structure Chooser interface
[jalview.git] / src / jalview / gui / StructureChooser.java
index 720dc9e..cf58322 100644 (file)
@@ -21,6 +21,7 @@
 
 package jalview.gui;
 
+import jalview.bin.Jalview;
 import jalview.datamodel.DBRefEntry;
 import jalview.datamodel.DBRefSource;
 import jalview.datamodel.PDBEntry;
@@ -31,6 +32,7 @@ import jalview.structure.StructureSelectionManager;
 import jalview.util.MessageManager;
 import jalview.ws.dbsources.PDBRestClient;
 import jalview.ws.dbsources.PDBRestClient.PDBDocField;
+import jalview.ws.sifts.SiftsSettings;
 import jalview.ws.uimodel.PDBRestRequest;
 import jalview.ws.uimodel.PDBRestResponse;
 import jalview.ws.uimodel.PDBRestResponse.PDBResponseSummary;
@@ -55,7 +57,8 @@ import javax.swing.table.AbstractTableModel;
  *
  */
 @SuppressWarnings("serial")
-public class StructureChooser extends GStructureChooser
+public class StructureChooser extends GStructureChooser implements
+        IProgressIndicator
 {
   private boolean structuresDiscovered = false;
 
@@ -90,6 +93,11 @@ public class StructureChooser extends GStructureChooser
    */
   public void init()
   {
+    if (!Jalview.isHeadlessMode())
+    {
+      progressBar = new ProgressBar(this.statusPanel, this.statusBar);
+    }
+
     Thread discoverPDBStructuresThread = new Thread(new Runnable()
     {
       @Override
@@ -669,6 +677,15 @@ public class StructureChooser extends GStructureChooser
   @Override
   public void ok_ActionPerformed()
   {
+    final long progressSessionId = System.currentTimeMillis();
+    final StructureSelectionManager ssm = ap.getStructureSelectionManager();
+    ssm.setProgressIndicator(this);
+    ssm.setProgressSessionId(progressSessionId);
+    new Thread(new Runnable()
+    {
+      @Override
+      public void run()
+      {
     FilterOption selectedFilterOpt = ((FilterOption) cmb_filterOption
             .getSelectedItem());
     String currentView = selectedFilterOpt.getView();
@@ -701,8 +718,7 @@ public class StructureChooser extends GStructureChooser
       }
       SequenceI[] selectedSeqs = selectedSeqsToView
               .toArray(new SequenceI[selectedSeqsToView.size()]);
-      launchStructureViewer(ap.getStructureSelectionManager(),
-              pdbEntriesToView, ap, selectedSeqs);
+          launchStructureViewer(ssm, pdbEntriesToView, ap, selectedSeqs);
     }
     else if (currentView == VIEWS_LOCAL_PDB)
     {
@@ -725,8 +741,7 @@ public class StructureChooser extends GStructureChooser
       }
       SequenceI[] selectedSeqs = selectedSeqsToView
               .toArray(new SequenceI[selectedSeqsToView.size()]);
-      launchStructureViewer(ap.getStructureSelectionManager(),
-              pdbEntriesToView, ap, selectedSeqs);
+          launchStructureViewer(ssm, pdbEntriesToView, ap, selectedSeqs);
     }
     else if (currentView == VIEWS_ENTER_ID)
     {
@@ -748,8 +763,8 @@ public class StructureChooser extends GStructureChooser
       }
 
       PDBEntry[] pdbEntriesToView = new PDBEntry[] { pdbEntry };
-      launchStructureViewer(ap.getStructureSelectionManager(),
-              pdbEntriesToView, ap, new SequenceI[] { selectedSequence });
+          launchStructureViewer(ssm, pdbEntriesToView, ap,
+                  new SequenceI[] { selectedSequence });
     }
     else if (currentView == VIEWS_FROM_FILE)
     {
@@ -764,26 +779,35 @@ public class StructureChooser extends GStructureChooser
                       jalview.io.AppletFormatAdapter.FILE,
                       selectedSequence, true, Desktop.instance);
 
-      launchStructureViewer(ap.getStructureSelectionManager(),
-              new PDBEntry[] { fileEntry }, ap,
-              new SequenceI[] { selectedSequence });
+          launchStructureViewer(ssm, new PDBEntry[] { fileEntry }, ap,
+                  new SequenceI[] { selectedSequence });
     }
     mainFrame.dispose();
+      }
+    }).start();
   }
 
-  private void launchStructureViewer(final StructureSelectionManager ssm,
+  private void launchStructureViewer(StructureSelectionManager ssm,
           final PDBEntry[] pdbEntriesToView,
-          final AlignmentPanel alignPanel, final SequenceI[] sequences)
+          final AlignmentPanel alignPanel, SequenceI[] sequences)
   {
+    ssm.setProgressBar("Launching PDB structure viewer..");
     final StructureViewer sViewer = new StructureViewer(ssm);
 
-    new jalview.ws.DBRefFetcher(sequences, null, null, null, false)
-            .fetchDBRefs(true);
-    new Thread(new Runnable()
+    if (SiftsSettings.isMapWithSifts())
     {
-      @Override
-      public void run()
+      for (SequenceI seq : sequences)
       {
+        if (seq.getSourceDBRef() == null)
+        {
+          ssm.setProgressBar(null);
+          ssm.setProgressBar("Fetching Database refs..");
+          new jalview.ws.DBRefFetcher(sequences, null, null, null, false)
+                  .fetchDBRefs(true);
+          break;
+        }
+      }
+    }
         if (pdbEntriesToView.length > 1)
         {
           ArrayList<SequenceI[]> seqsMap = new ArrayList<SequenceI[]>();
@@ -792,14 +816,17 @@ public class StructureChooser extends GStructureChooser
             seqsMap.add(new SequenceI[] { seq });
           }
           SequenceI[][] collatedSeqs = seqsMap.toArray(new SequenceI[0][0]);
+      ssm.setProgressBar(null);
+      ssm.setProgressBar("Fetching PDB Structures for selected entries..");
           sViewer.viewStructures(pdbEntriesToView, collatedSeqs, alignPanel);
         }
         else
         {
+      ssm.setProgressBar(null);
+      ssm.setProgressBar("Fetching PDB Structure for "
+              + pdbEntriesToView[0].getId());
           sViewer.viewStructures(pdbEntriesToView[0], sequences, alignPanel);
         }
-      }
-    }).start();
   }
 
   /**
@@ -1008,4 +1035,24 @@ public class StructureChooser extends GStructureChooser
     }
 
   }
+
+  private IProgressIndicator progressBar;
+
+  @Override
+  public void setProgressBar(String message, long id)
+  {
+    progressBar.setProgressBar(message, id);
+  }
+
+  @Override
+  public void registerHandler(long id, IProgressIndicatorHandler handler)
+  {
+    progressBar.registerHandler(id, handler);
+  }
+
+  @Override
+  public boolean operationInProgress()
+  {
+    return progressBar.operationInProgress();
+  }
 }