bb754132e2860f3b0aebb479029fedc83a187c79
[jalview.git] / src / jalview / gui / PDBSearchPanel.java
1 /*
2  * Jalview - A Sequence Alignment Editor and Viewer (Version 2.8.2)
3  * Copyright (C) 2014 The Jalview Authors
4  * 
5  * This file is part of Jalview.
6  * 
7  * Jalview is free software: you can redistribute it and/or
8  * modify it under the terms of the GNU General Public License 
9  * as published by the Free Software Foundation, either version 3
10  * of the License, or (at your option) any later version.
11  *  
12  * Jalview is distributed in the hope that it will be useful, but 
13  * WITHOUT ANY WARRANTY; without even the implied warranty 
14  * of MERCHANTABILITY or FITNESS FOR A PARTICULAR 
15  * PURPOSE.  See the GNU General Public License for more details.
16  * 
17  * You should have received a copy of the GNU General Public License
18  * along with Jalview.  If not, see <http://www.gnu.org/licenses/>.
19  * The Jalview Authors are detailed in the 'AUTHORS' file.
20  */
21
22 package jalview.gui;
23
24 import jalview.jbgui.GPDBSearchPanel;
25 import jalview.jbgui.PDBDocFieldPreferences;
26 import jalview.util.MessageManager;
27 import jalview.ws.dbsources.PDBRestClient;
28 import jalview.ws.dbsources.PDBRestClient.PDBDocField;
29 import jalview.ws.uimodel.PDBRestRequest;
30 import jalview.ws.uimodel.PDBRestResponse;
31
32 import java.util.ArrayList;
33 import java.util.Collection;
34 import java.util.Collections;
35 import java.util.Comparator;
36 import java.util.List;
37
38 @SuppressWarnings("serial")
39 public class PDBSearchPanel extends GPDBSearchPanel
40 {
41   private SequenceFetcher seqFetcher;
42
43   private IProgressIndicator progressIdicator;
44
45   private Collection<PDBDocField> wantedFields;
46
47   public PDBSearchPanel(SequenceFetcher seqFetcher)
48   {
49     this.seqFetcher = seqFetcher;
50     this.progressIdicator = (seqFetcher == null) ? null : seqFetcher
51             .getProgressIndicator();
52   }
53
54
55   /**
56    * Action performed when an input is detected on txt_search field.
57    */
58   @Override
59   public void txt_search_ActionPerformed()
60   {
61     boolean allowEmptySequence = false;
62     mainFrame.setTitle(MessageManager
63             .getString("label.pdb_sequence_getcher"));
64     if (txt_search.getText().trim().length() > 0)
65     {
66       long startTime = System.currentTimeMillis();
67
68       String searchTarget = ((PDBDocField) cmb_searchTarget
69               .getSelectedItem()).getCode();
70
71       wantedFields = PDBDocFieldPreferences
72               .getSearchSummaryFields();
73
74       PDBRestRequest request = new PDBRestRequest();
75       request.setAllowEmptySeq(allowEmptySequence);
76       request.setResponseSize(100);
77       request.setFieldToSearchBy(searchTarget + ":");
78       request.setSearchTerm(txt_search.getText());
79       request.setWantedFields(wantedFields);
80
81       PDBRestClient pdbRestCleint = new PDBRestClient();
82       PDBRestResponse resultList = pdbRestCleint.executeRequest(request);
83       if (resultList.getSearchSummary() != null)
84       {
85         tbl_summary.setModel(PDBRestResponse.getTableModel(request,
86                 resultList.getSearchSummary()));
87       }
88
89       long endTime = System.currentTimeMillis();
90       int resultSetCount = resultList.getNumberOfItemsFound();
91       String result = (resultSetCount > 1) ? MessageManager
92               .getString("label.results") : MessageManager
93               .getString("label.result");
94       mainFrame.setTitle(frameTitle + " - " + resultSetCount + " " + result
95               + " (" + (endTime - startTime) + " milli secs)");
96     }
97   }
98
99   @Override
100   public void btn_ok_ActionPerformed()
101   {
102     loadSelectedPDBSequencesToAlignment();
103   }
104
105   @Override
106   public void btn_back_ActionPerformed()
107   {
108     mainFrame.dispose();
109     new SequenceFetcher(progressIdicator);
110   }
111
112   @Override
113   public void btn_cancel_ActionPerformed()
114   {
115     mainFrame.dispose();
116   }
117
118   /**
119    * Add the discovered/selected sequences to a target alignment window
120    */
121   public void loadSelectedPDBSequencesToAlignment()
122   {
123     mainFrame.dispose();
124     StringBuilder selectedIds = new StringBuilder();
125     int pdbIdCol = PDBRestClient.getPDBIdColumIndex(wantedFields, false);
126     int[] selectedRows = tbl_summary.getSelectedRows();
127     for (int summaryRow : selectedRows)
128     {
129       String pdbIdStr = tbl_summary.getValueAt(summaryRow, pdbIdCol)
130               .toString();
131       selectedIds.append(";").append(pdbIdStr);
132     }
133
134     String ids = selectedIds.deleteCharAt(0).toString();
135     seqFetcher.textArea.setText(ids);
136     Thread worker = new Thread(seqFetcher);
137     worker.start();
138   }
139
140   /**
141    * Populates search target combo-box options
142    */
143   public void populateCmbSearchTargetOptions()
144   {
145     List<PDBDocField> searchableTargets = new ArrayList<PDBDocField>();
146     searchableTargets.add(PDBDocField.PDB_ID);
147     searchableTargets.add(PDBDocField.PFAM_ACCESSION);
148     searchableTargets.add(PDBDocField.MOLECULE_TYPE);
149     searchableTargets.add(PDBDocField.MOLECULE_NAME);
150     searchableTargets.add(PDBDocField.UNIPROT_ACCESSION);
151     searchableTargets.add(PDBDocField.GENE_NAME);
152     searchableTargets.add(PDBDocField.GENUS);
153     searchableTargets.add(PDBDocField.ALL);
154
155     Collections.sort(searchableTargets, new Comparator<PDBDocField>()
156     {
157       @Override
158       public int compare(PDBDocField o1, PDBDocField o2)
159       {
160         return o1.getName().compareTo(o2.getName());
161       }
162     });
163
164     for (PDBDocField searchTarget : searchableTargets)
165     {
166       cmb_searchTarget.addItem(searchTarget);
167     }
168   }
169
170 }