JAL-1705 (new preference option to) hide introns when fetching genomic
[jalview.git] / src / jalview / gui / SequenceFetcher.java
index 6a0d010..b6ee041 100755 (executable)
  */
 package jalview.gui;
 
+import jalview.api.FeatureSettingsModelI;
+import jalview.bin.Cache;
 import jalview.datamodel.AlignmentI;
 import jalview.datamodel.DBRefEntry;
-import jalview.datamodel.DBRefSource;
 import jalview.datamodel.SequenceFeature;
 import jalview.datamodel.SequenceI;
-import jalview.io.FormatAdapter;
-import jalview.io.IdentifyFile;
+import jalview.io.gff.SequenceOntologyI;
 import jalview.util.DBRefUtils;
 import jalview.util.MessageManager;
 import jalview.ws.dbsources.das.api.DasSourceRegistryI;
@@ -54,8 +54,6 @@ import javax.swing.JTextArea;
 import javax.swing.SwingConstants;
 import javax.swing.tree.DefaultMutableTreeNode;
 
-import com.stevesoft.pat.Regex;
-
 public class SequenceFetcher extends JPanel implements Runnable
 {
   JLabel dbeg = new JLabel();
@@ -115,6 +113,7 @@ public class SequenceFetcher extends JPanel implements Runnable
   private static Thread initingThread = null;
 
   int debounceTrap = 0;
+
   /**
    * Blocking method that initialises and returns the shared instance of the
    * SequenceFetcher client
@@ -130,9 +129,11 @@ public class SequenceFetcher extends JPanel implements Runnable
     {
       if (guiWindow != null)
       {
-        guiWindow.setProgressBar(
-                MessageManager.getString("status.waiting_sequence_database_fetchers_init"),
-                Thread.currentThread().hashCode());
+        guiWindow
+                .setProgressBar(
+                        MessageManager
+                                .getString("status.waiting_sequence_database_fetchers_init"),
+                        Thread.currentThread().hashCode());
       }
       // initting happening on another thread - so wait around to see if it
       // finishes.
@@ -149,15 +150,17 @@ public class SequenceFetcher extends JPanel implements Runnable
       }
       if (guiWindow != null)
       {
-        guiWindow.setProgressBar(
-                       MessageManager.getString("status.waiting_sequence_database_fetchers_init"),
-                Thread.currentThread().hashCode());
+        guiWindow
+                .setProgressBar(
+                        MessageManager
+                                .getString("status.waiting_sequence_database_fetchers_init"),
+                        Thread.currentThread().hashCode());
       }
     }
     if (sfetch == null
-            || dasRegistry != jalview.bin.Cache.getDasSourceRegistry()
-            || lastDasSourceRegistry != (jalview.bin.Cache
-                    .getDasSourceRegistry().getDasRegistryURL() + jalview.bin.Cache
+            || dasRegistry != Cache.getDasSourceRegistry()
+            || lastDasSourceRegistry != (Cache.getDasSourceRegistry()
+                    .getDasRegistryURL() + Cache
                     .getDasSourceRegistry().getLocalSourceString())
                     .hashCode())
     {
@@ -168,10 +171,11 @@ public class SequenceFetcher extends JPanel implements Runnable
        */
       if (guiWindow != null)
       {
-        guiWindow.setProgressBar(MessageManager.getString("status.init_sequence_database_fetchers"),
+        guiWindow.setProgressBar(MessageManager
+                .getString("status.init_sequence_database_fetchers"),
                 Thread.currentThread().hashCode());
       }
-      dasRegistry = jalview.bin.Cache.getDasSourceRegistry();
+      dasRegistry = Cache.getDasSourceRegistry();
       dasRegistry.refreshSources();
 
       jalview.ws.SequenceFetcher sf = new jalview.ws.SequenceFetcher();
@@ -189,6 +193,7 @@ public class SequenceFetcher extends JPanel implements Runnable
   }
 
   private IProgressIndicator progressIndicator;
+
   public SequenceFetcher(IProgressIndicator guiIndic)
   {
     this.progressIndicator = guiIndic;
@@ -214,8 +219,10 @@ public class SequenceFetcher extends JPanel implements Runnable
               JOptionPane
                       .showInternalMessageDialog(
                               Desktop.desktop,
-                              MessageManager.getString("warn.couldnt_create_sequence_fetcher_client"),
-                              MessageManager.getString("label.couldnt_create_sequence_fetcher"),
+                              MessageManager
+                                      .getString("warn.couldnt_create_sequence_fetcher_client"),
+                              MessageManager
+                                      .getString("label.couldnt_create_sequence_fetcher"),
                               JOptionPane.ERROR_MESSAGE);
             }
           });
@@ -272,7 +279,9 @@ public class SequenceFetcher extends JPanel implements Runnable
 
   private String getFrameTitle()
   {
-    return ((alignFrame == null) ? MessageManager.getString("label.new_sequence_fetcher") : MessageManager.getString("label.additional_sequence_fetcher"));
+    return ((alignFrame == null) ? MessageManager
+            .getString("label.new_sequence_fetcher") : MessageManager
+            .getString("label.additional_sequence_fetcher"));
   }
 
   private void jbInit() throws Exception
@@ -360,7 +369,7 @@ public class SequenceFetcher extends JPanel implements Runnable
         String currentSelection = database.getSelectedItem();
         if (!currentSelection.equalsIgnoreCase("pdb"))
         {
-            otherSourceAction();
+          otherSourceAction();
         }
         if (currentSelection.equalsIgnoreCase("pdb")
                 && (database.action == KeyEvent.VK_ENTER || ((debounceTrap % 2) == 0)))
@@ -404,8 +413,7 @@ public class SequenceFetcher extends JPanel implements Runnable
                       : ""));
       String eq = database.getExampleQueries();
       dbeg.setText(MessageManager.formatMessage(
-              "label.example_query_param", new String[]
-              { eq }));
+              "label.example_query_param", new String[] { eq }));
       boolean enablePunct = !(eq != null && eq.indexOf(",") > -1);
       for (DbSourceProxy dbs : database.getSelectedSources())
       {
@@ -443,8 +451,6 @@ public class SequenceFetcher extends JPanel implements Runnable
     jPanel3.repaint();
   }
 
-
-
   public void close_actionPerformed(ActionEvent e)
   {
     try
@@ -510,6 +516,7 @@ public class SequenceFetcher extends JPanel implements Runnable
       resetDialog();
       return;
     }
+    // TODO: Refactor to GUI independent code and write tests.
     // indicate if successive sources should be merged into one alignment.
     boolean addToLast = false;
     ArrayList<String> aresultq = new ArrayList<String>(), presultTitle = new ArrayList<String>();
@@ -521,6 +528,8 @@ public class SequenceFetcher extends JPanel implements Runnable
             .split(";"));
     Iterator<String> en = Arrays.asList(new String[0]).iterator();
     int nqueries = qries.length;
+
+    FeatureSettingsModelI preferredFeatureColours = null;
     while (proxies.hasNext() && (en.hasNext() || nextfetch.size() > 0))
     {
       if (!en.hasNext() && nextfetch.size() > 0)
@@ -537,9 +546,14 @@ public class SequenceFetcher extends JPanel implements Runnable
       try
       {
         // update status
-        guiWindow.setProgressBar(MessageManager.formatMessage("status.fetching_sequence_queries_from", new String[]{Integer.valueOf(nqueries).toString(),proxy.getDbName()}), Thread
-                .currentThread().hashCode());
-        isAliSource = proxy.isA(DBRefSource.ALIGNMENTDB);
+        guiWindow
+                .setProgressBar(MessageManager.formatMessage(
+                        "status.fetching_sequence_queries_from",
+                        new String[] {
+                            Integer.valueOf(nqueries).toString(),
+                            proxy.getDbName() }), Thread.currentThread()
+                        .hashCode());
+        isAliSource = proxy.isAlignmentSource();
         if (proxy.getAccessionSeparator() == null)
         {
           while (en.hasNext())
@@ -580,7 +594,8 @@ public class SequenceFetcher extends JPanel implements Runnable
               }
             } catch (Exception e)
             {
-              jalview.bin.Cache.log.info("Error retrieving " + item
+              Cache.log.info(
+                      "Error retrieving " + item
                       + " from " + proxy.getDbName(), e);
               nextfetch.add(item);
             }
@@ -626,34 +641,19 @@ public class SequenceFetcher extends JPanel implements Runnable
                 DBRefEntry dbr = new DBRefEntry(), found[] = null;
                 dbr.setSource(proxy.getDbSource());
                 dbr.setVersion(null);
-                if (proxy.getAccessionValidator() != null)
-                {
-                  Regex vgr = proxy.getAccessionValidator();
-                  vgr.search(q);
-                  if (vgr.numSubs() > 0)
-                  {
-                    dbr.setAccessionId(vgr.stringMatched(1));
-                  }
-                  else
-                  {
-                    dbr.setAccessionId(vgr.stringMatched());
-                  }
-                }
-                else
-                {
-                  dbr.setAccessionId(q);
-                }
+                String accId = proxy.getAccessionIdFromQuery(q);
+                dbr.setAccessionId(accId);
                 boolean rfound = false;
                 for (int r = 0; r < rs.length; r++)
                 {
-                  if (rs[r] != null
-                          && (found = DBRefUtils.searchRefs(
-                                  rs[r].getDBRef(), dbr)) != null
-                          && found.length > 0)
+                  if (rs[r] != null)
                   {
-                    rfound = true;
-                    rs[r] = null;
-                    continue;
+                    found = DBRefUtils.searchRefs(rs[r].getDBRefs(), accId);
+                    if (found != null && found.length > 0)
+                    {
+                      rfound = true;
+                      rs[r] = null;
+                    }
                   }
                 }
                 if (!rfound)
@@ -697,6 +697,13 @@ public class SequenceFetcher extends JPanel implements Runnable
       // Stack results ready for opening in alignment windows
       if (aresult != null && aresult.size() > 0)
       {
+        FeatureSettingsModelI proxyColourScheme = proxy
+                .getFeatureColourScheme();
+        if (proxyColourScheme != null)
+        {
+          preferredFeatureColours = proxyColourScheme;
+        }
+
         AlignmentI ar = null;
         if (isAliSource)
         {
@@ -735,15 +742,20 @@ public class SequenceFetcher extends JPanel implements Runnable
           presultTitle.add(titl);
         }
       }
-      guiWindow.setProgressBar(MessageManager.getString("status.finshed_querying"), Thread.currentThread()
+      guiWindow.setProgressBar(MessageManager
+              .getString("status.finshed_querying"), Thread.currentThread()
               .hashCode());
     }
-    guiWindow.setProgressBar((presult.size() > 0) ? MessageManager.getString("status.parsing_results")
-            : MessageManager.getString("status.processing"), Thread.currentThread().hashCode());
+    guiWindow.setProgressBar(
+            (presult.size() > 0) ? MessageManager
+                    .getString("status.parsing_results") : MessageManager
+                    .getString("status.processing"), Thread.currentThread()
+                    .hashCode());
     // process results
     while (presult.size() > 0)
     {
-      parseResult(presult.remove(0), presultTitle.remove(0), null);
+      parseResult(presult.remove(0), presultTitle.remove(0), null,
+              preferredFeatureColours);
     }
     // only remove visual delay after we finished parsing.
     guiWindow.setProgressBar(null, Thread.currentThread().hashCode());
@@ -771,35 +783,6 @@ public class SequenceFetcher extends JPanel implements Runnable
     resetDialog();
   }
 
-  AlignmentI parseResult(String result, String title)
-  {
-    String format = new IdentifyFile().Identify(result, "Paste");
-    AlignmentI sequences = null;
-    if (FormatAdapter.isValidFormat(format))
-    {
-      sequences = null;
-      try
-      {
-        sequences = new FormatAdapter().readFile(result.toString(),
-                "Paste", format);
-      } catch (Exception ex)
-      {
-      }
-
-      if (sequences != null)
-      {
-        return parseResult(sequences, title, format);
-      }
-    }
-    else
-    {
-      showErrorMessage("Error retrieving " + textArea.getText() + " from "
-              + database.getSelectedItem());
-    }
-
-    return null;
-  }
-
   /**
    * 
    * @return a standard title for any results retrieved using the currently
@@ -811,7 +794,8 @@ public class SequenceFetcher extends JPanel implements Runnable
   }
 
   AlignmentI parseResult(AlignmentI al, String title,
-          String currentFileFormat)
+          String currentFileFormat,
+          FeatureSettingsModelI preferredFeatureColours)
   {
 
     if (al != null && al.getHeight() > 0)
@@ -849,6 +833,18 @@ public class SequenceFetcher extends JPanel implements Runnable
 
           }
         }
+
+        if (preferredFeatureColours != null)
+        {
+          af.getViewport().applyFeaturesStyle(preferredFeatureColours);
+        }
+        if (Cache.getDefault("HIDE_INTRONS", true))
+        {
+          af.avc.markColumnsContainingFeatures(true, false, false,
+                  SequenceOntologyI.EXON);
+          af.getViewport().hideSelectedColumns();
+        }
+
         Desktop.addInternalFrame(af, title, AlignFrame.DEFAULT_WIDTH,
                 AlignFrame.DEFAULT_HEIGHT);
 
@@ -857,7 +853,7 @@ public class SequenceFetcher extends JPanel implements Runnable
 
         try
         {
-          af.setMaximum(jalview.bin.Cache.getDefault("SHOW_FULLSCREEN",
+          af.setMaximum(Cache.getDefault("SHOW_FULLSCREEN",
                   false));
         } catch (Exception ex)
         {
@@ -891,8 +887,6 @@ public class SequenceFetcher extends JPanel implements Runnable
     return progressIndicator;
   }
 
-
-
   public void setProgressIndicator(IProgressIndicator progressIndicator)
   {
     this.progressIndicator = progressIndicator;