5a8407a412b93f483cb882c30dc9ee68615eed47
[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 import javax.swing.table.DefaultTableModel;
39
40 @SuppressWarnings("serial")
41 public class PDBSearchPanel extends GPDBSearchPanel
42 {
43   private SequenceFetcher seqFetcher;
44
45   private IProgressIndicator progressIdicator;
46
47   private Collection<PDBDocField> wantedFields;
48
49   public PDBSearchPanel(SequenceFetcher seqFetcher)
50   {
51     this.seqFetcher = seqFetcher;
52     this.progressIdicator = (seqFetcher == null) ? null : seqFetcher
53             .getProgressIndicator();
54   }
55
56
57   /**
58    * Action performed when an input is detected on txt_search field.
59    */
60   @Override
61   public void txt_search_ActionPerformed()
62   {
63     boolean allowEmptySequence = false;
64     mainFrame.setTitle(MessageManager
65             .getString("label.pdb_sequence_getcher"));
66     tbl_summary.setModel(new DefaultTableModel());
67     if (txt_search.getText().trim().length() > 0)
68     {
69       long startTime = System.currentTimeMillis();
70
71       String searchTarget = ((PDBDocField) cmb_searchTarget
72               .getSelectedItem()).getCode();
73
74       wantedFields = PDBDocFieldPreferences
75               .getSearchSummaryFields();
76
77       String searchTerm = txt_search.getText();
78       if (searchTerm.contains(":"))
79       {
80         searchTerm = searchTerm.split(":")[0];
81       }
82
83       PDBRestRequest request = new PDBRestRequest();
84       request.setAllowEmptySeq(allowEmptySequence);
85       request.setResponseSize(100);
86       request.setFieldToSearchBy(searchTarget + ":");
87       request.setSearchTerm(searchTerm);
88       request.setWantedFields(wantedFields);
89
90       PDBRestClient pdbRestCleint = new PDBRestClient();
91       PDBRestResponse resultList = pdbRestCleint.executeRequest(request);
92       if (resultList.getSearchSummary() != null)
93       {
94         tbl_summary.setModel(PDBRestResponse.getTableModel(request,
95                 resultList.getSearchSummary()));
96       }
97
98       long endTime = System.currentTimeMillis();
99       int resultSetCount = resultList.getNumberOfItemsFound();
100       String result = (resultSetCount > 1) ? MessageManager
101               .getString("label.results") : MessageManager
102               .getString("label.result");
103       mainFrame.setTitle(frameTitle + " - " + resultSetCount + " " + result
104               + " (" + (endTime - startTime) + " milli secs)");
105     }
106   }
107
108   @Override
109   public void btn_ok_ActionPerformed()
110   {
111     loadSelectedPDBSequencesToAlignment();
112   }
113
114   @Override
115   public void btn_back_ActionPerformed()
116   {
117     mainFrame.dispose();
118     new SequenceFetcher(progressIdicator);
119   }
120
121   @Override
122   public void btn_cancel_ActionPerformed()
123   {
124     mainFrame.dispose();
125   }
126
127   /**
128    * Add the discovered/selected sequences to a target alignment window
129    */
130   public void loadSelectedPDBSequencesToAlignment()
131   {
132     mainFrame.dispose();
133     StringBuilder selectedIds = new StringBuilder();
134     int pdbIdCol = PDBRestClient.getPDBIdColumIndex(wantedFields, false);
135     int[] selectedRows = tbl_summary.getSelectedRows();
136     for (int summaryRow : selectedRows)
137     {
138       String pdbIdStr = tbl_summary.getValueAt(summaryRow, pdbIdCol)
139               .toString();
140
141       String searchTerm = txt_search.getText();
142       if (searchTerm.contains(":"))
143       {
144         selectedIds.append(";").append(pdbIdStr).append(":")
145                 .append(searchTerm.split(":")[1].toUpperCase());
146       }
147       else
148       {
149         selectedIds.append(";").append(pdbIdStr);
150       }
151     }
152
153     String ids = selectedIds.deleteCharAt(0).toString();
154     seqFetcher.textArea.setText(ids);
155     Thread worker = new Thread(seqFetcher);
156     worker.start();
157   }
158
159   /**
160    * Populates search target combo-box options
161    */
162   public void populateCmbSearchTargetOptions()
163   {
164     List<PDBDocField> searchableTargets = new ArrayList<PDBDocField>();
165     searchableTargets.add(PDBDocField.PDB_ID);
166     searchableTargets.add(PDBDocField.PFAM_ACCESSION);
167     searchableTargets.add(PDBDocField.MOLECULE_TYPE);
168     searchableTargets.add(PDBDocField.MOLECULE_NAME);
169     searchableTargets.add(PDBDocField.UNIPROT_ACCESSION);
170     searchableTargets.add(PDBDocField.GENE_NAME);
171     searchableTargets.add(PDBDocField.GENUS);
172     searchableTargets.add(PDBDocField.ALL);
173
174     Collections.sort(searchableTargets, new Comparator<PDBDocField>()
175     {
176       @Override
177       public int compare(PDBDocField o1, PDBDocField o2)
178       {
179         return o1.getName().compareTo(o2.getName());
180       }
181     });
182
183     for (PDBDocField searchTarget : searchableTargets)
184     {
185       cmb_searchTarget.addItem(searchTarget);
186     }
187   }
188
189 }