JAL-1834 added tooltip to the PDB sequence fetcher and structure chooser summary...
[jalview.git] / src / jalview / gui / PDBSearchPanel.java
index 7aa0bb3..63c3761 100644 (file)
 package jalview.gui;
 
 import jalview.jbgui.GPDBSearchPanel;
+import jalview.jbgui.PDBDocFieldPreferences;
 import jalview.util.MessageManager;
 import jalview.ws.dbsources.PDBRestClient;
 import jalview.ws.dbsources.PDBRestClient.PDBDocField;
 import jalview.ws.uimodel.PDBRestRequest;
 import jalview.ws.uimodel.PDBRestResponse;
-import jalview.ws.uimodel.PDBRestResponse.PDBResponseSummary;
 
 import java.util.ArrayList;
+import java.util.Collection;
 import java.util.Collections;
 import java.util.Comparator;
+import java.util.HashSet;
 import java.util.List;
 
-import javax.swing.DefaultListModel;
+import javax.swing.table.DefaultTableModel;
 
 @SuppressWarnings("serial")
 public class PDBSearchPanel extends GPDBSearchPanel
@@ -43,6 +45,8 @@ public class PDBSearchPanel extends GPDBSearchPanel
 
   private IProgressIndicator progressIdicator;
 
+  private Collection<PDBDocField> wantedFields;
+
   public PDBSearchPanel(SequenceFetcher seqFetcher)
   {
     this.seqFetcher = seqFetcher;
@@ -51,13 +55,19 @@ public class PDBSearchPanel extends GPDBSearchPanel
   }
 
 
+  /**
+   * Action performed when an input is detected on txt_search field.
+   */
   @Override
   public void txt_search_ActionPerformed()
   {
+    errorWarning.setLength(0);
+    lbl_warning.setVisible(false);
+    btn_ok.setEnabled(false);
     boolean allowEmptySequence = false;
-    lst_searchResult.setModel(new DefaultListModel<PDBResponseSummary>());
     mainFrame.setTitle(MessageManager
             .getString("label.pdb_sequence_getcher"));
+    tbl_summary.setModel(new DefaultTableModel());
     if (txt_search.getText().trim().length() > 0)
     {
       long startTime = System.currentTimeMillis();
@@ -65,28 +75,37 @@ public class PDBSearchPanel extends GPDBSearchPanel
       String searchTarget = ((PDBDocField) cmb_searchTarget
               .getSelectedItem()).getCode();
 
-      List<PDBDocField> wantedFields = new ArrayList<PDBDocField>();
-      wantedFields.add(PDBDocField.MOLECULE_TYPE);
-      wantedFields.add(PDBDocField.PDB_ID);
-      // wantedFields.add(PDBDocField.GENUS);
-      wantedFields.add(PDBDocField.GENE_NAME);
-      wantedFields.add(PDBDocField.TITLE);
-      // wantedFields.add(PDBDocField.RESOLUTION);
-      // wantedFields.add(PDBDocField.EXPERIMENTAL_METHOD);
+      wantedFields = PDBDocFieldPreferences
+              .getSearchSummaryFields();
+
+      String searchTerm = decodeSearchTerm(txt_search.getText(),
+              searchTarget);
 
       PDBRestRequest request = new PDBRestRequest();
       request.setAllowEmptySeq(allowEmptySequence);
       request.setResponseSize(100);
-      request.setFieldToSearchBy(searchTarget + ":");
-      request.setSearchTerm(txt_search.getText());
+      request.setFieldToSearchBy("(" + searchTarget + ":");
+      request.setSearchTerm(searchTerm + ")");
       request.setWantedFields(wantedFields);
-
+      // System.out.println(">>>>>>>>>>>>>> " + request.getQuery());
       PDBRestClient pdbRestCleint = new PDBRestClient();
-      PDBRestResponse resultList = pdbRestCleint.executeRequest(request);
+      PDBRestResponse resultList;
+      try
+      {
+        resultList = pdbRestCleint.executeRequest(request);
+      } catch (Exception e)
+      {
+        // System.out.println(">>>>>>>>>>>>>>>" + e.getMessage());
+        e.printStackTrace();
+        errorWarning.append(e.getMessage());
+        checkForErrors();
+        return;
+      }
+
       if (resultList.getSearchSummary() != null)
       {
-        lst_searchResult.setModel(PDBRestResponse
-                .getListModel(resultList.getSearchSummary()));
+        tbl_summary.setModel(PDBRestResponse.getTableModel(request,
+                resultList.getSearchSummary()));
       }
 
       long endTime = System.currentTimeMillis();
@@ -99,6 +118,43 @@ public class PDBSearchPanel extends GPDBSearchPanel
     }
   }
 
+  public static String decodeSearchTerm(String enteredText,
+          String targetField)
+  {
+    String foundSearchTerms = enteredText;
+    StringBuilder foundSearchTermsBuilder = new StringBuilder();
+    if (enteredText.contains(";"))
+    {
+      String[] searchTerms = enteredText.split(";");
+      for (String searchTerm : searchTerms)
+      {
+        if (searchTerm.contains(":"))
+        {
+          foundSearchTermsBuilder.append(targetField).append(":")
+                  .append(searchTerm.split(":")[0]).append(" OR ");
+        }
+        else
+        {
+          foundSearchTermsBuilder.append(targetField).append(":")
+                  .append(searchTerm).append(" OR ");
+        }
+      }
+      int endIndex = foundSearchTermsBuilder.lastIndexOf(" OR ");
+      foundSearchTerms = foundSearchTermsBuilder.toString();
+      if (foundSearchTerms.contains(" OR "))
+      {
+        foundSearchTerms = foundSearchTerms.substring(
+                targetField.length() + 1, endIndex);
+      }
+    }
+    else if (enteredText.contains(":"))
+    {
+      foundSearchTerms = foundSearchTerms.split(":")[0];
+    }
+    return foundSearchTerms;
+  }
+
+
   @Override
   public void btn_ok_ActionPerformed()
   {
@@ -118,24 +174,70 @@ public class PDBSearchPanel extends GPDBSearchPanel
     mainFrame.dispose();
   }
 
+  public void transferToSequenceFetcher(String ids)
+  {
+    // mainFrame.dispose();
+    seqFetcher.textArea.setText(ids);
+    Thread worker = new Thread(seqFetcher);
+    worker.start();
+  }
+
   /**
    * Add the discovered/selected sequences to a target alignment window
    */
   public void loadSelectedPDBSequencesToAlignment()
   {
-    mainFrame.dispose();
+    // mainFrame.dispose();
     StringBuilder selectedIds = new StringBuilder();
-    for (PDBResponseSummary dataSelected : lst_searchResult
-            .getSelectedValuesList())
+    HashSet<String> selectedIdsSet = new HashSet<String>();
+    int pdbIdCol = PDBRestClient.getPDBIdColumIndex(wantedFields, false);
+    int[] selectedRows = tbl_summary.getSelectedRows();
+    for (int summaryRow : selectedRows)
+    {
+      String pdbIdStr = tbl_summary.getValueAt(summaryRow, pdbIdCol)
+              .toString();
+      String searchTerm = txt_search.getText();
+      selectedIdsSet.add(getPDBIdwithSpecifiedChain(pdbIdStr, searchTerm));
+    }
+
+    for (String selectedId : selectedIdsSet)
     {
-      selectedIds.append(";").append(dataSelected.getPdbId());
+      selectedIds.append(selectedId).append(";");
     }
-    String ids = selectedIds.deleteCharAt(0).toString();
+
+    String ids = selectedIds.toString();
+    // System.out.println(">>>>>>>>>>>>>>>> selected Ids: " + ids);
     seqFetcher.textArea.setText(ids);
     Thread worker = new Thread(seqFetcher);
     worker.start();
   }
 
+  public static String getPDBIdwithSpecifiedChain(String pdbId,
+          String searchTerm)
+  {
+    String pdbIdWithChainCode = "";
+    if (searchTerm.contains(";"))
+    {
+      String[] foundTerms = searchTerm.split(";");
+      for (String foundTerm : foundTerms)
+      {
+        if (foundTerm.contains(pdbId))
+        {
+          pdbIdWithChainCode = foundTerm;
+        }
+      }
+    }
+    else if (searchTerm.contains(pdbId))
+    {
+      pdbIdWithChainCode = searchTerm;
+    }
+    else
+    {
+      pdbIdWithChainCode = pdbId;
+    }
+    return pdbIdWithChainCode;
+  }
+
   /**
    * Populates search target combo-box options
    */
@@ -166,4 +268,14 @@ public class PDBSearchPanel extends GPDBSearchPanel
     }
   }
 
+  public void checkForErrors()
+  {
+    lbl_warning.setVisible(false);
+    if (errorWarning.length() > 0)
+    {
+      lbl_warning.setToolTipText(JvSwingUtils.wrapTooltip(true,
+              errorWarning.toString()));
+      lbl_warning.setVisible(true);
+    }
+  }
 }