JAL-1668 First version JAL-1668
[jalview.git] / src / jalview / gui / StructureChooser.java
diff --git a/src/jalview/gui/StructureChooser.java b/src/jalview/gui/StructureChooser.java
new file mode 100644 (file)
index 0000000..07e36ec
--- /dev/null
@@ -0,0 +1,273 @@
+package jalview.gui;
+
+import jalview.datamodel.DBRefEntry;
+import jalview.datamodel.PDBEntry;
+import jalview.datamodel.SequenceI;
+import jalview.jbgui.GStructureChooser;
+import jalview.util.MessageManager;
+import jalview.ws.dbsources.PDBRestClient;
+import jalview.ws.uimodel.PDBSearchRequest;
+import jalview.ws.uimodel.PDBSearchResponse;
+import jalview.ws.uimodel.PDBSummaryListModel;
+import jalview.ws.uimodel.PDBSummaryListModel.PDBDocField;
+
+import java.util.ArrayList;
+import java.util.Collection;
+import java.util.HashSet;
+import java.util.List;
+
+import javax.swing.JOptionPane;
+import javax.swing.SwingUtilities;
+
+@SuppressWarnings("serial")
+public class StructureChooser extends GStructureChooser
+{
+
+
+  private SequenceI sequence;
+
+
+  public StructureChooser(AlignmentPanel ap, final SequenceI sequence)
+  {
+    this.ap = ap;
+    this.sequence = sequence;
+    fetchStructures();
+  }
+
+  @Override
+  public void ok_ActionPerformed()
+  {
+    jListFoundStructures.setSelectedValue("op1x", true);
+  }
+
+  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()
+  {
+    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());
+      sequence.getDatasetSequence().addPDBId(entry);
+    }
+  }
+
+  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);
+  }
+
+  private void fetchStructures()
+  {
+    long startTime = System.currentTimeMillis();
+    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);
+    request.setWantedFields(wantedFields);
+    
+    Collection<PDBSummaryListModel> searchSummaries = new HashSet<PDBSummaryListModel>();
+    // searchSummaries.
+    for (SequenceI seq : sequences)
+    {
+      // System.out.println("Selected : " + seq.getName());
+      request.setSearchTerm(buildQuery(seq) + ")");
+
+      PDBRestClient pdbRestCleint = new PDBRestClient();
+
+      PDBSearchResponse resultList = pdbRestCleint
+              .executeRequest(request);
+      if (resultList.getSearchSummary() != null
+              && !resultList.getSearchSummary().isEmpty())
+      {
+        searchSummaries.addAll(resultList.getSearchSummary());
+      }
+    }
+
+    foundStructures = searchSummaries.size();
+    if (searchSummaries != null)
+    {
+      jListFoundStructures.setModel(PDBSearchResponse
+              .getListModel(searchSummaries));
+    }
+
+    String totalTime = (System.currentTimeMillis() - startTime)
+            + " milli secs";
+    mainFrame.setTitle("Structure Chooser - " + foundStructures
+            + " Found (" + totalTime + ")");
+  }
+
+  private String buildQuery(SequenceI seq)
+  {
+    String query = seq.getName();
+    StringBuilder queryBuilder = new StringBuilder();
+    int count = 0;
+    if (seq.getDBRef() != null && seq.getDBRef().length != 0)
+    {
+      for (DBRefEntry dbRef : seq.getDBRef())
+      {
+        System.out.println("dbref : " + dbRef.getAccessionId());
+        queryBuilder.append("text:").append(dbRef.getAccessionId())
+                .append(" OR ");
+        ++count;
+        if (count > 10)
+        {
+          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
+  {
+    private String name;
+
+    private String value;
+
+    private String view;
+
+    public FilterOptions(String name, String value, String view)
+    {
+      this.name = name;
+      this.value = value;
+      this.view = view;
+    }
+
+    public String getName()
+    {
+      return name;
+    }
+
+    public void setName(String name)
+    {
+      this.name = name;
+    }
+
+    public String getValue()
+    {
+      return value;
+    }
+
+    public void setValue(String value)
+    {
+      this.value = value;
+    }
+
+    public String getView()
+    {
+      return view;
+    }
+
+    public void setView(String view)
+    {
+      this.view = view;
+    }
+
+    public String toString()
+    {
+      return this.name;
+    }
+  }
+}