JAL-1667 refactoring to support JAL-1668
[jalview.git] / src / jalview / gui / StructureChooser.java
index 07e36ec..11fb943 100644 (file)
@@ -6,10 +6,10 @@ import jalview.datamodel.SequenceI;
 import jalview.jbgui.GStructureChooser;
 import jalview.util.MessageManager;
 import jalview.ws.dbsources.PDBRestClient;
+import jalview.ws.dbsources.PDBRestClient.PDBDocField;
 import jalview.ws.uimodel.PDBSearchRequest;
 import jalview.ws.uimodel.PDBSearchResponse;
-import jalview.ws.uimodel.PDBSummaryListModel;
-import jalview.ws.uimodel.PDBSummaryListModel.PDBDocField;
+import jalview.ws.uimodel.PDBSearchResponse.PDBResponseSummary;
 
 import java.util.ArrayList;
 import java.util.Collection;
@@ -17,161 +17,94 @@ import java.util.HashSet;
 import java.util.List;
 
 import javax.swing.JOptionPane;
-import javax.swing.SwingUtilities;
 
 @SuppressWarnings("serial")
 public class StructureChooser extends GStructureChooser
 {
 
+  private boolean structuresWereFound = false;
 
-  private SequenceI sequence;
+  private SequenceI selectedSequence;
 
+  private SequenceI[] selectedSequences;
 
   public StructureChooser(AlignmentPanel ap, final SequenceI sequence)
   {
     this.ap = ap;
-    this.sequence = sequence;
+    this.selectedSequence = sequence;
+    selectedSequences = ((ap.av.getSelectionGroup() == null) ? new SequenceI[]
+    { sequence } : ap.av.getSequenceSelection());
     fetchStructures();
+    populateFilterOptions();
+    updateCurrentView();
   }
 
   @Override
   public void ok_ActionPerformed()
   {
-    jListFoundStructures.setSelectedValue("op1x", true);
+    // TODO code to load selected structures to jmol or chimera
   }
 
-  public void pdbFromFile_actionPerformed()
-  {
-    jalview.io.JalviewFileChooser chooser = new jalview.io.JalviewFileChooser(
-            jalview.bin.Cache.getProperty("LAST_DIRECTORY"));
-    chooser.setFileView(new jalview.io.JalviewFileView());
-    chooser.setDialogTitle(MessageManager.formatMessage(
-            "label.select_pdb_file_for", new String[]
-            { sequence.getDisplayId(false) }));
-    chooser.setToolTipText(MessageManager.formatMessage(
-            "label.load_pdb_file_associate_with_sequence", new String[]
-            { sequence.getDisplayId(false) }));
-
-    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, sequence, true,
-              Desktop.instance);
-    }
-
-  }
-
-  public void discoverPDB_actionPerformed()
-  {
-
-    final SequenceI[] sequences = ((ap.av.getSelectionGroup() == null) ? new SequenceI[]
-    { sequence }
-            : ap.av.getSequenceSelection());
-    Thread discpdb = new Thread(new Runnable()
-    {
-      @Override
-      public void run()
-      {
-
-        new jalview.ws.DBRefFetcher(sequences, ap.alignFrame)
-                .fetchDBRefs(false);
-      }
-
-    });
-    discpdb.start();
-  }
-
-  // rpdbview.addActionListener(new ActionListener()
-  // {
-  //
-  // @Override
-  // public void actionPerformed(ActionEvent e)
-  // {
-  // new StructureViewer(ap.getStructureSelectionManager())
-  // .viewStructures(ap, pr, ap.av.collateForPDB(pr));
-  // }
-  // });
-
-  public void enterPDB_actionPerformed()
+  protected void populateFilterOptions()
   {
-    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)
+    if (structuresWereFound)
     {
-      PDBEntry entry = new PDBEntry();
-      entry.setId(id.toUpperCase());
-      sequence.getDatasetSequence().addPDBId(entry);
+      filterOptionsComboBox.addItem(new FilterOptions(
+              "- Filter Criteria -", "",
+              VIEWS_FILTER));
+      filterOptionsComboBox.addItem(new FilterOptions("All", "all",
+              VIEWS_FILTER));
+      filterOptionsComboBox.addItem(new FilterOptions("Best Coverage",
+              "coverage",
+              VIEWS_FILTER));
+      filterOptionsComboBox.addItem(new FilterOptions("Best Resolution",
+              PDBDocField.RESOLUTION.getCode(),
+              VIEWS_FILTER));
+      filterOptionsComboBox.addItem(new FilterOptions("Best Quality",
+              PDBDocField.OVERALL_QUALITY.getCode(),
+              VIEWS_FILTER));
+
+      // "number_of_polymers"), PROTEIN_CHAIN_COUNT(
+      // "Protein Chain Count", "number_of_protein_chains"),
+      // BOUND_MOLECULE_COUNT(
+      // "Bound Molecule Count", "number_of_bound_molecules"),
+      // POLYMER_RESIDUE_COUNT(
+      // "Polymer Residue Count", "number_of_polymer_residues"),
+      // UNIPROT_COVERAGE(
     }
-  }
-
-  public static void main(String[] args)
-  {
-    SwingUtilities.invokeLater(new Runnable()
-    {
-      public void run()
-      {
-        new StructureChooser(null, null);
-      }
-    });
-  }
-
-  @SuppressWarnings("unchecked")
-  protected void populateFilterOptions()
-  {
-    filterOptions.addItem(new FilterOptions("- Filter Criteria -", "",
-            VIEWS_AUTO));
-    filterOptions.addItem(new FilterOptions("All", "all", VIEWS_AUTO));
-    filterOptions
-            .addItem(new FilterOptions("Best Coverage", "", VIEWS_AUTO));
-    filterOptions.addItem(new FilterOptions("Best Resolution", "",
-            VIEWS_AUTO));
-    filterOptions
-            .addItem(new FilterOptions("Best Quality", "", VIEWS_AUTO));
-    filterOptions.addItem(new FilterOptions("Enter PDB Id", "", VIEWS_ID));
-    filterOptions.addItem(new FilterOptions("From File", "", VIEWS_FILE));
-  }
-
-  protected void updateCurrentView()
-  {
-    String currentView = ((FilterOptions) filterOptions.getSelectedItem())
-            .getView();
-    switchableViewsLayout.show(switchableViewsPanel, currentView);
+    filterOptionsComboBox.addItem(new FilterOptions("Enter PDB Id", "-",
+            VIEWS_ENTER_ID));
+    filterOptionsComboBox.addItem(new FilterOptions("From File", "-",
+            VIEWS_FROM_FILE));
   }
 
   private void fetchStructures()
   {
     long startTime = System.currentTimeMillis();
-    final SequenceI[] sequences = ((ap.av.getSelectionGroup() == null) ? new SequenceI[]
-    { sequence }
-            : ap.av.getSequenceSelection());
+    // final SequenceI[] sequences = ((ap.av.getSelectionGroup() == null) ? new
+    // SequenceI[]
+    // { sequence }
+    // : ap.av.getSequenceSelection());
+
     int foundStructures = 0;
-    PDBSearchRequest request = new PDBSearchRequest();
-    request.setAllowEmptySeq(false);
-    request.setResponseSize(500);
-    request.setSearchTarget("(text:");
     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);
+
+    PDBSearchRequest request = new PDBSearchRequest();
+    request.setAllowEmptySeq(false);
+    request.setResponseSize(500);
+    request.setSearchTarget("(text:");
     request.setWantedFields(wantedFields);
     
-    Collection<PDBSummaryListModel> searchSummaries = new HashSet<PDBSummaryListModel>();
-    // searchSummaries.
-    for (SequenceI seq : sequences)
+    Collection<PDBResponseSummary> searchSummaries = new HashSet<PDBResponseSummary>();
+    for (SequenceI seq : selectedSequences)
     {
-      // System.out.println("Selected : " + seq.getName());
       request.setSearchTerm(buildQuery(seq) + ")");
-
       PDBRestClient pdbRestCleint = new PDBRestClient();
-
       PDBSearchResponse resultList = pdbRestCleint
               .executeRequest(request);
       if (resultList.getSearchSummary() != null
@@ -186,8 +119,8 @@ public class StructureChooser extends GStructureChooser
     {
       jListFoundStructures.setModel(PDBSearchResponse
               .getListModel(searchSummaries));
+      structuresWereFound = true;
     }
-
     String totalTime = (System.currentTimeMillis() - startTime)
             + " milli secs";
     mainFrame.setTitle("Structure Chooser - " + foundStructures
@@ -203,7 +136,6 @@ public class StructureChooser extends GStructureChooser
     {
       for (DBRefEntry dbRef : seq.getDBRef())
       {
-        System.out.println("dbref : " + dbRef.getAccessionId());
         queryBuilder.append("text:").append(dbRef.getAccessionId())
                 .append(" OR ");
         ++count;
@@ -212,62 +144,135 @@ public class StructureChooser extends GStructureChooser
           break;
         }
       }
-      // int beginIndex = queryBuilder. firstIndexOf("text");
       int endIndex = queryBuilder.lastIndexOf(" OR ");
       query = queryBuilder.toString().substring(5, endIndex);
     }
-    System.out.println("------------> " + query);
     return query;
   }
 
-  public class FilterOptions
+  @Override
+  protected void stateChanged()
   {
-    private String name;
-
-    private String value;
-
-    private String view;
+    updateCurrentView();
+  }
 
-    public FilterOptions(String name, String value, String view)
+  int debounceCount = 0;
+  protected void updateCurrentView()
+  {
+    FilterOptions currentOption = ((FilterOptions) filterOptionsComboBox
+            .getSelectedItem());
+    switchableViewsLayout.show(switchableViewsPanel,
+            currentOption.getView());
+    ++debounceCount;
+    if (currentOption.getView() == VIEWS_FILTER && debounceCount % 2 == 0)
     {
-      this.name = name;
-      this.value = value;
-      this.view = view;
+      filterResultSet(currentOption.getValue());
     }
+  }
 
-    public String getName()
-    {
-      return name;
-    }
+  public void filterResultSet(String filterTarget)
+  {
+    System.out.println("-----------------> Filter by : " + filterTarget);
 
-    public void setName(String name)
-    {
-      this.name = name;
-    }
+    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);
 
-    public String getValue()
-    {
-      return value;
-    }
+    PDBSearchRequest request = new PDBSearchRequest();
+    request.setAllowEmptySeq(false);
+    request.setResponseSize(1);
+    request.setSearchTarget("(text:");
+    request.setSortTarget(filterTarget, true);
 
-    public void setValue(String value)
+    request.setWantedFields(wantedFields);
+
+    Collection<PDBResponseSummary> searchSummaries = new HashSet<PDBResponseSummary>();
+    for (SequenceI seq : selectedSequences)
     {
-      this.value = value;
+      request.setSearchTerm(buildQuery(seq) + ")");
+      PDBRestClient pdbRestCleint = new PDBRestClient();
+      PDBSearchResponse resultList = pdbRestCleint.executeRequest(request);
+      if (resultList.getSearchSummary() != null
+              && !resultList.getSearchSummary().isEmpty())
+      {
+        searchSummaries.addAll(resultList.getSearchSummary());
+
+      }
     }
 
-    public String getView()
+    for (PDBResponseSummary summary : searchSummaries)
     {
-      return view;
+      jListFoundStructures.setSelectedValue(summary, true);
+      // jListFoundStructures.
+      break;
     }
+    System.out.println("Found item count : " + searchSummaries.size());
+  }
+
+  public void pdbFromFile_actionPerformed()
+  {
+    jalview.io.JalviewFileChooser chooser = new jalview.io.JalviewFileChooser(
+            jalview.bin.Cache.getProperty("LAST_DIRECTORY"));
+    chooser.setFileView(new jalview.io.JalviewFileView());
+    chooser.setDialogTitle(MessageManager.formatMessage(
+            "label.select_pdb_file_for", new String[]
+            { selectedSequence.getDisplayId(false) }));
+    chooser.setToolTipText(MessageManager.formatMessage(
+            "label.load_pdb_file_associate_with_sequence", new String[]
+            { selectedSequence.getDisplayId(false) }));
+
+    int value = chooser.showOpenDialog(null);
 
-    public void setView(String view)
+    if (value == jalview.io.JalviewFileChooser.APPROVE_OPTION)
     {
-      this.view = view;
+      String choice = chooser.getSelectedFile().getPath();
+      jalview.bin.Cache.setProperty("LAST_DIRECTORY", choice);
+      new AssociatePdbFileWithSeq().associatePdbWithSeq(choice,
+              jalview.io.AppletFormatAdapter.FILE, selectedSequence, true,
+              Desktop.instance);
     }
 
-    public String toString()
+  }
+
+
+  // rpdbview.addActionListener(new ActionListener()
+  // {
+  //
+  // @Override
+  // public void actionPerformed(ActionEvent e)
+  // {
+  // new StructureViewer(ap.getStructureSelectionManager())
+  // .viewStructures(ap, pr, ap.av.collateForPDB(pr));
+  // }
+  // });
+
+  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)
     {
-      return this.name;
+      PDBEntry entry = new PDBEntry();
+      entry.setId(id.toUpperCase());
+      selectedSequence.getDatasetSequence().addPDBId(entry);
     }
   }
+
+  // public static void main(String[] args)
+  // {
+  // SwingUtilities.invokeLater(new Runnable()
+  // {
+  // public void run()
+  // {
+  // new StructureChooser(null, null);
+  // }
+  // });
+  // }
+
+
 }