JAL-1668 added validation for manual entry of pdb structures
[jalview.git] / src / jalview / gui / StructureChooser.java
index 4b3f5de..a01c1b8 100644 (file)
@@ -40,7 +40,7 @@ import java.util.List;
 import java.util.Vector;
 
 import javax.swing.JCheckBox;
-import javax.swing.JOptionPane;
+import javax.swing.JComboBox;
 import javax.swing.ListSelectionModel;
 
 /**
@@ -66,6 +66,9 @@ public class StructureChooser extends GStructureChooser
 
   private PDBRestClient pdbRestCleint;
 
+  private String selectedPdbFileName;
+
+  private boolean isValidPBDEntry;
 
   public StructureChooser(SequenceI[] selectedSeqs, SequenceI selectedSeq,
           AlignmentPanel ap)
@@ -152,11 +155,8 @@ public class StructureChooser extends GStructureChooser
     if (discoveredStructuresSet != null
             && !discoveredStructuresSet.isEmpty())
     {
-      jList_FoundStructures.setModel(PDBRestResponse
-              .getListModel(discoveredStructuresSet));
       tbl_summary.setModel(PDBRestResponse.getTableModel(pdbRequest,
               discoveredStructuresSet));
-      // resizeColumnWidth(summaryTable);
       structuresDiscovered = true;
       noOfStructuresFound = discoveredStructuresSet.size();
     }
@@ -225,7 +225,6 @@ public class StructureChooser extends GStructureChooser
       int endIndex = queryBuilder.lastIndexOf(" OR ");
       query = queryBuilder.toString().substring(5, endIndex);
     }
-    // System.out.println("Query -----> " + query);
     return query;
   }
 
@@ -242,6 +241,7 @@ public class StructureChooser extends GStructureChooser
       @Override
       public void run()
       {
+        long startTime = System.currentTimeMillis();
         try
         {
           lbl_loading.setVisible(true);
@@ -271,22 +271,17 @@ public class StructureChooser extends GStructureChooser
             List<PDBResponseSummary> originalDiscoveredStructuresList = new ArrayList<PDBResponseSummary>(
                     discoveredStructuresSet);
             originalDiscoveredStructuresList.removeAll(filteredResponse);
-
             Collection<PDBResponseSummary> reorderedStructuresSet = new ArrayList<PDBResponseSummary>();
             reorderedStructuresSet.addAll(filteredResponse);
             reorderedStructuresSet.addAll(originalDiscoveredStructuresList);
 
-            jList_FoundStructures.setModel(PDBRestResponse
-                    .getListModel(reorderedStructuresSet));
             tbl_summary.setModel(PDBRestResponse.getTableModel(pdbRequest,
                     reorderedStructuresSet));
 
-            // int[] filterIndice = new int[filterResponseCount];
             ListSelectionModel model = tbl_summary.getSelectionModel();
             model.clearSelection();
             for (int x = 0; x < filterResponseCount; x++)
             {
-              // filterIndice[x] = x;
               model.addSelectionInterval(x, x);
             }
 
@@ -294,8 +289,6 @@ public class StructureChooser extends GStructureChooser
             // collection
             originalDiscoveredStructuresList = null;
             reorderedStructuresSet = null;
-
-            // jListFoundStructures.setSelectedIndices(filterIndice);
           }
 
           lbl_loading.setVisible(false);
@@ -303,6 +296,12 @@ public class StructureChooser extends GStructureChooser
         {
           e.printStackTrace();
         }
+        String totalTime = (System.currentTimeMillis() - startTime)
+                + " milli secs";
+        mainFrame.setTitle("Structure Chooser - Filter time (" + totalTime
+                + ")");
+
+        validateSelections();
       }
     });
     filterThread.start();
@@ -348,51 +347,9 @@ public class StructureChooser extends GStructureChooser
     int value = chooser.showOpenDialog(null);
     if (value == jalview.io.JalviewFileChooser.APPROVE_OPTION)
     {
-      String choice = chooser.getSelectedFile().getPath();
-      jalview.bin.Cache.setProperty("LAST_DIRECTORY", choice);
-      new AssociatePdbFileWithSeq().associatePdbWithSeq(choice,
-              jalview.io.AppletFormatAdapter.FILE, selectedSequence, true,
-              Desktop.instance);
-    }
-  }
-
-  /**
-   * Handles action event for btn_ok
-   */
-  @Override
-  public void ok_ActionPerformed()
-  {
-    int pdbIdCol = getPDBIdColumIndex(pdbRequest.getWantedFields());
-    int[] selectedRows = tbl_summary.getSelectedRows();
-    PDBEntry[] pdbEntriesToView = new PDBEntry[selectedRows.length];
-    int count = 0;
-    for (int summaryRow : selectedRows)
-    {
-      String pdbIdStr = tbl_summary.getValueAt(summaryRow, pdbIdCol)
-              .toString();
-      PDBEntry pdbEntry = new PDBEntry();
-      pdbEntry.setId(pdbIdStr);
-      pdbEntry.setType("PDB");
-      pdbEntriesToView[count++] = pdbEntry;
-    }
-    new StructureViewer(ap.getStructureSelectionManager()).viewStructures(
-            ap, pdbEntriesToView, ap.av.collateForPDB(pdbEntriesToView));
-  }
-
-  /**
-   * Handles action event for manual entry of pdb ids
-   */
-  public void enterPDB_actionPerformed()
-  {
-    String id = JOptionPane.showInternalInputDialog(Desktop.desktop,
-            MessageManager.getString("label.enter_pdb_id"),
-            MessageManager.getString("label.enter_pdb_id"),
-            JOptionPane.QUESTION_MESSAGE);
-    if (id != null && id.length() > 0)
-    {
-      PDBEntry entry = new PDBEntry();
-      entry.setId(id.toUpperCase());
-      selectedSequence.getDatasetSequence().addPDBId(entry);
+      selectedPdbFileName = chooser.getSelectedFile().getPath();
+      jalview.bin.Cache.setProperty("LAST_DIRECTORY", selectedPdbFileName);
+      validateSelections();
     }
   }
 
@@ -428,16 +385,112 @@ public class StructureChooser extends GStructureChooser
    */
   protected void updateCurrentView()
   {
-    FilterOption selectedOption = ((FilterOption) cmb_filterOption
+    FilterOption selectedFilterOpt = ((FilterOption) cmb_filterOption
             .getSelectedItem());
     layout_switchableViews.show(pnl_switchableViews,
-            selectedOption.getView());
-    chk_invertFilter.setEnabled(false);
-    if (selectedOption.getView() == VIEWS_FILTER)
+            selectedFilterOpt.getView());
+    String filterTitle = mainFrame.getTitle();
+    mainFrame.setTitle(frameTitle);
+    chk_invertFilter.setVisible(false);
+    if (selectedFilterOpt.getView() == VIEWS_FILTER)
     {
-      chk_invertFilter.setEnabled(true);
-      filterResultSet(selectedOption.getValue());
+      mainFrame.setTitle(filterTitle);
+      chk_invertFilter.setVisible(true);
+      filterResultSet(selectedFilterOpt.getValue());
     }
+    else
+    {
+      idInputAssSeqPanel.loadCmbAssSeq();
+      fileChooserAssSeqPanel.loadCmbAssSeq();
+    }
+    validateSelections();
+  }
+
+  /**
+   * Validates user selection and activates the view button if all parameters
+   * are correct
+   */
+  public void validateSelections()
+  {
+    FilterOption selectedFilterOpt = ((FilterOption) cmb_filterOption
+            .getSelectedItem());
+    btn_view.setEnabled(false);
+    String currentView = selectedFilterOpt.getView();
+    if (currentView == VIEWS_FILTER)
+    {
+      if (tbl_summary.getSelectedRows().length > 0)
+      {
+        btn_view.setEnabled(true);
+      }
+    }
+    else if (currentView == VIEWS_ENTER_ID)
+    {
+      validateAssociationEnterPdb();
+    }
+    else if (currentView == VIEWS_FROM_FILE)
+    {
+      validateAssociationFromFile();
+    }
+
+  }
+
+  /**
+   * Validates inputs from the Manual PDB entry panel
+   */
+  public void validateAssociationEnterPdb()
+  {
+    AssociateSeqOptions assSeqOpt = (AssociateSeqOptions) idInputAssSeqPanel
+            .getCmb_assSeq().getSelectedItem();
+    lbl_pdbManualFetchStatus.setIcon(errorImage);
+    if (selectedSequences.length == 1
+            || !assSeqOpt.getName().equalsIgnoreCase(
+                    "-Select Associated Seq-"))
+    {
+      txt_search.setEnabled(true);
+      if (isValidPBDEntry)
+      {
+        btn_view.setEnabled(true);
+        lbl_pdbManualFetchStatus.setIcon(goodImage);
+      }
+    }
+    else
+    {
+      txt_search.setEnabled(false);
+      lbl_pdbManualFetchStatus.setIcon(errorImage);
+    }
+  }
+
+  /**
+   * Validates inputs for the manual PDB file selection options
+   */
+  public void validateAssociationFromFile()
+  {
+    AssociateSeqOptions assSeqOpt = (AssociateSeqOptions) fileChooserAssSeqPanel
+            .getCmb_assSeq().getSelectedItem();
+    lbl_fromFileStatus.setIcon(errorImage);
+    if (selectedSequences.length == 1
+            || (assSeqOpt != null
+            && !assSeqOpt.getName().equalsIgnoreCase(
+                    "-Select Associated Seq-")))
+    {
+      btn_pdbFromFile.setEnabled(true);
+      if (selectedPdbFileName != null && selectedPdbFileName.length() > 0)
+      {
+        btn_view.setEnabled(true);
+        lbl_fromFileStatus.setIcon(goodImage);
+      }
+    }
+    else
+    {
+      btn_pdbFromFile.setEnabled(false);
+      lbl_fromFileStatus.setIcon(errorImage);
+    }
+  }
+
+  @Override
+  public void cmbAssSeqStateChanged()
+  {
+    validateSelections();
   }
 
   /**
@@ -461,6 +514,82 @@ public class StructureChooser extends GStructureChooser
 
   }
 
+  /**
+   * Handles action event for btn_ok
+   */
+  @Override
+  public void ok_ActionPerformed()
+  {
+    FilterOption selectedFilterOpt = ((FilterOption) cmb_filterOption
+            .getSelectedItem());
+    String currentView = selectedFilterOpt.getView();
+    if (currentView == VIEWS_FILTER)
+    {
+      int pdbIdCol = getPDBIdColumIndex(pdbRequest.getWantedFields());
+      int[] selectedRows = tbl_summary.getSelectedRows();
+      PDBEntry[] pdbEntriesToView = new PDBEntry[selectedRows.length];
+      int count = 0;
+      for (int summaryRow : selectedRows)
+      {
+        String pdbIdStr = tbl_summary.getValueAt(summaryRow, pdbIdCol)
+                .toString();
+        PDBEntry pdbEntry = new PDBEntry();
+        pdbEntry.setId(pdbIdStr);
+        pdbEntry.setType("PDB");
+        pdbEntriesToView[count++] = pdbEntry;
+      }
+      new StructureViewer(ap.getStructureSelectionManager())
+              .viewStructures(ap, pdbEntriesToView,
+                      ap.av.collateForPDB(pdbEntriesToView));
+    }
+    else if (currentView == VIEWS_ENTER_ID)
+    {
+      selectedSequence = ((AssociateSeqOptions) idInputAssSeqPanel
+              .getCmb_assSeq().getSelectedItem()).getSequence();
+      PDBEntry pdbEntry = new PDBEntry();
+      pdbEntry.setId(txt_search.getText());
+      pdbEntry.setType("PDB");
+      selectedSequence.getDatasetSequence().addPDBId(pdbEntry);
+      PDBEntry[] pdbEntriesToView = new PDBEntry[]
+      { pdbEntry };
+      new StructureViewer(ap.getStructureSelectionManager())
+              .viewStructures(ap, pdbEntriesToView,
+                      ap.av.collateForPDB(pdbEntriesToView));
+    }
+    else if (currentView == VIEWS_FROM_FILE)
+    {
+      selectedSequence = ((AssociateSeqOptions) fileChooserAssSeqPanel
+              .getCmb_assSeq().getSelectedItem()).getSequence();
+      new AssociatePdbFileWithSeq().associatePdbWithSeq(
+              selectedPdbFileName, jalview.io.AppletFormatAdapter.FILE,
+              selectedSequence, true, Desktop.instance);
+    }
+    mainFrame.dispose();
+  }
+
+  /**
+   * Populates the combo-box used in associating manually fetched structures to
+   * a unique sequence when more than one sequence selection is made.
+   */
+  public void populateCmbAssociateSeqOptions(
+          JComboBox<AssociateSeqOptions> cmb_assSeq)
+  {
+    cmb_assSeq.removeAllItems();
+    cmb_assSeq.addItem(new AssociateSeqOptions("-Select Associated Seq-",
+            null));
+    // cmb_assSeq.addItem(new AssociateSeqOptions("Auto Detect", null));
+    if (selectedSequences.length > 1)
+    {
+      for (SequenceI seq : selectedSequences)
+      {
+        cmb_assSeq.addItem(new AssociateSeqOptions(seq));
+      }
+    }
+    else
+    {
+      cmb_assSeq.setVisible(false);
+    }
+  }
 
   public boolean isStructuresDiscovered()
   {
@@ -476,4 +605,31 @@ public class StructureChooser extends GStructureChooser
   {
     return discoveredStructuresSet;
   }
+
+  @Override
+  protected void txt_search_ActionPerformed()
+  {
+    isValidPBDEntry = false;
+    if (txt_search.getText().length() > 0)
+    {
+      List<PDBDocField> wantedFields = new ArrayList<PDBDocField>();
+      wantedFields.add(PDBDocField.PDB_ID);
+      pdbRequest = new PDBRestRequest();
+      pdbRequest.setAllowEmptySeq(false);
+      pdbRequest.setResponseSize(1);
+      pdbRequest.setFieldToSearchBy("(pdb_id:");
+      pdbRequest.setWantedFields(wantedFields);
+      pdbRequest.setSearchTerm(txt_search.getText() + ")");
+      pdbRequest.setAssociatedSequence(selectedSequence.getName());
+      pdbRestCleint = new PDBRestClient();
+      PDBRestResponse resultList = pdbRestCleint.executeRequest(pdbRequest);
+      if (resultList.getSearchSummary() != null
+              && resultList.getSearchSummary().size() > 0)
+      {
+        isValidPBDEntry = true;
+      }
+    }
+    validateSelections();
+  }
+
 }