JAL-1807 still testing
[jalviewjs.git] / unused / appletgui / Finder.java
1 /*\r
2  * Jalview - A Sequence Alignment Editor and Viewer ($$Version-Rel$$)\r
3  * Copyright (C) $$Year-Rel$$ The Jalview Authors\r
4  * \r
5  * This file is part of Jalview.\r
6  * \r
7  * Jalview is free software: you can redistribute it and/or\r
8  * modify it under the terms of the GNU General Public License \r
9  * as published by the Free Software Foundation, either version 3\r
10  * of the License, or (at your option) any later version.\r
11  *  \r
12  * Jalview is distributed in the hope that it will be useful, but \r
13  * WITHOUT ANY WARRANTY; without even the implied warranty \r
14  * of MERCHANTABILITY or FITNESS FOR A PARTICULAR \r
15  * PURPOSE.  See the GNU General Public License for more details.\r
16  * \r
17  * You should have received a copy of the GNU General Public License\r
18  * along with Jalview.  If not, see <http://www.gnu.org/licenses/>.\r
19  * The Jalview Authors are detailed in the 'AUTHORS' file.\r
20  */\r
21 package jalview.appletgui;\r
22 \r
23 import jalview.bin.JalviewLite;\r
24 import jalview.datamodel.SearchResults;\r
25 import jalview.datamodel.SequenceFeature;\r
26 import jalview.datamodel.SequenceI;\r
27 import jalview.util.MessageManager;\r
28 import jalview.viewmodel.AlignmentViewport;\r
29 \r
30 import javax.swing.JButton;\r
31 import javax.swing.JCheckBox;\r
32 import java.awt.Font;\r
33 import javax.swing.JFrame;\r
34 import java.awt.GridLayout;\r
35 import javax.swing.JLabel;\r
36 import javax.swing.JPanel;\r
37 import java.awt.Rectangle;\r
38 import javax.swing.JTextField;\r
39 import java.awt.event.ActionEvent;\r
40 import java.awt.event.ActionListener;\r
41 import java.awt.event.KeyEvent;\r
42 import java.awt.event.WindowAdapter;\r
43 import java.awt.event.WindowEvent;\r
44 import java.util.Vector;\r
45 \r
46 public class Finder extends JPanel implements ActionListener\r
47 {\r
48   AlignmentViewport av;\r
49 \r
50   AlignmentPanel ap;\r
51 \r
52   JFrame frame;\r
53 \r
54   SearchResults searchResults;\r
55 \r
56   int seqIndex = 0;\r
57 \r
58   int resIndex = -1;\r
59 \r
60   public Finder(final AlignmentPanel ap)\r
61   {\r
62     try\r
63     {\r
64       jbInit();\r
65 \r
66     } catch (Exception e)\r
67     {\r
68       e.printStackTrace();\r
69     }\r
70 \r
71     this.av = ap.av;\r
72     this.ap = ap;\r
73     frame = new JFrame();\r
74     frame.add(this);\r
75     JalviewLite.addFrame(frame,\r
76             MessageManager.getString("action.find"), 340, 120);\r
77     frame.repaint();\r
78     frame.addWindowListener(new WindowAdapter()\r
79     {\r
80       public void windowClosing(WindowEvent evt)\r
81       {\r
82         ap.highlightSearchResults(null);\r
83       }\r
84     });\r
85     textfield.requestFocus();\r
86   }\r
87 \r
88   public void actionPerformed(ActionEvent evt)\r
89   {\r
90     if (evt.getSource() == textfield)\r
91     {\r
92       doSearch(false);\r
93     }\r
94 \r
95     else if (evt.getSource() == findNext)\r
96     {\r
97       doSearch(false);\r
98     }\r
99 \r
100     else if (evt.getSource() == findAll)\r
101     {\r
102       resIndex = -1;\r
103       seqIndex = 0;\r
104       doSearch(true);\r
105     }\r
106     else if (evt.getSource() == createNewGroup)\r
107     {\r
108       createNewGroup_actionPerformed();\r
109     }\r
110   }\r
111 \r
112   public void createNewGroup_actionPerformed()\r
113   {\r
114     SequenceI[] seqs = new SequenceI[searchResults.getSize()];\r
115     SequenceFeature[] features = new SequenceFeature[searchResults\r
116             .getSize()];\r
117 \r
118     for (int i = 0; i < searchResults.getSize(); i++)\r
119     {\r
120       seqs[i] = searchResults.getResultSequence(i);\r
121 \r
122       features[i] = new SequenceFeature(textfield.getText().trim(),\r
123               "Search Results", null, searchResults.getResultStart(i),\r
124               searchResults.getResultEnd(i), "Search Results");\r
125     }\r
126 \r
127     if (ap.seqPanel.seqCanvas.getFeatureRenderer().amendFeatures(seqs,\r
128             features, true, ap))\r
129     {\r
130       ap.alignFrame.sequenceFeatures.setState(true);\r
131       av.setShowSequenceFeatures(true);\r
132       ap.highlightSearchResults(null);\r
133     }\r
134   }\r
135 \r
136   void doSearch(boolean findAll)\r
137   {\r
138     if (ap.av.applet.currentAlignFrame != null)\r
139     {\r
140       ap = ap.av.applet.currentAlignFrame.alignPanel;\r
141       av = ap.av;\r
142     }\r
143     createNewGroup.setEnabled(false);\r
144     jalview.analysis.Finder finder = new jalview.analysis.Finder(\r
145             av.getAlignment(), av.getSelectionGroup(), seqIndex, resIndex);\r
146     finder.setCaseSensitive(caseSensitive.isSelected());\r
147     finder.setIncludeDescription(searchDescription.isSelected());\r
148     finder.setFindAll(findAll);\r
149 \r
150     String searchString = textfield.getText();\r
151 \r
152     finder.find(searchString);\r
153     seqIndex = finder.getSeqIndex();\r
154     resIndex = finder.getResIndex();\r
155     searchResults = finder.getSearchResults();\r
156     Vector idMatch = finder.getIdMatch();\r
157     boolean haveResults = false;\r
158     // set or reset the GUI\r
159     if ((idMatch.size() > 0))\r
160     {\r
161       haveResults = true;\r
162       ap.idPanel.highlightSearchResults(idMatch);\r
163     }\r
164     else\r
165     {\r
166       ap.idPanel.highlightSearchResults(null);\r
167     }\r
168 \r
169     if (searchResults.getSize() > 0)\r
170     {\r
171       haveResults = true;\r
172       createNewGroup.setEnabled(true);\r
173 \r
174     }\r
175     else\r
176     {\r
177       searchResults = null;\r
178     }\r
179 \r
180     // if allResults is null, this effectively switches displaySearch flag in\r
181     // seqCanvas\r
182     ap.highlightSearchResults(searchResults);\r
183     // TODO: add enablers for 'SelectSequences' or 'SelectColumns' or\r
184     // 'SelectRegion' selection\r
185     if (!haveResults)\r
186     {\r
187       ap.alignFrame.statusBar.setText(MessageManager\r
188               .getString("label.finished_searching"));\r
189       resIndex = -1;\r
190       seqIndex = 0;\r
191     }\r
192     else\r
193     {\r
194       if (findAll)\r
195       {\r
196         String message = (idMatch.size() > 0) ? "" + idMatch.size()\r
197                 + " IDs" : "";\r
198         if (idMatch.size() > 0 && searchResults != null\r
199                 && searchResults.getSize() > 0)\r
200         {\r
201           message += " and ";\r
202         }\r
203         if (searchResults != null)\r
204         {\r
205           message += searchResults.getSize() + " subsequence matches.";\r
206         }\r
207         ap.alignFrame.statusBar.setText(MessageManager.formatMessage(\r
208                 "label.search_results", new String[]\r
209                 { searchString, message }));\r
210 \r
211       }\r
212       else\r
213       {\r
214         // TODO: indicate sequence and matching position in status bar\r
215         ap.alignFrame.statusBar.setText(MessageManager.formatMessage(\r
216                 "label.found_match_for", new String[]\r
217                 { searchString }));\r
218       }\r
219     }\r
220   }\r
221 \r
222   JLabel jLabel1 = new JLabel();\r
223 \r
224   protected JTextField textfield = new JTextField();\r
225 \r
226   protected JButton findAll = new JButton();\r
227 \r
228   protected JButton findNext = new JButton();\r
229 \r
230   JPanel actionsPanel = new JPanel();\r
231 \r
232   GridLayout gridLayout1 = new GridLayout();\r
233 \r
234   protected JButton createNewGroup = new JButton();\r
235 \r
236   JCheckBox caseSensitive = new JCheckBox();\r
237 \r
238   JCheckBox searchDescription = new JCheckBox();\r
239 \r
240   private void jbInit() throws Exception\r
241   {\r
242     jLabel1.setFont(new Font("Verdana", 0, 12));\r
243     jLabel1.setText(MessageManager.getString("action.find"));\r
244     jLabel1.setBounds(new Rectangle(3, 30, 34, 15));\r
245     this.setLayout(null);\r
246     textfield.setFont(new java.awt.Font("Verdana", Font.PLAIN, 10));\r
247     textfield.setText("");\r
248     textfield.setBounds(new Rectangle(40, 17, 133, 21));\r
249     textfield.addKeyListener(new java.awt.event.KeyAdapter()\r
250     {\r
251       public void keyTyped(KeyEvent e)\r
252       {\r
253         textfield_keyTyped(e);\r
254       }\r
255     });\r
256     textfield.addActionListener(this);\r
257     findAll.setFont(new java.awt.Font("Verdana", Font.PLAIN, 10));\r
258     findAll.setLabel(MessageManager.getString("action.find_all"));\r
259     findAll.addActionListener(this);\r
260     findNext.setEnabled(false);\r
261     findNext.setFont(new java.awt.Font("Verdana", Font.PLAIN, 10));\r
262     findNext.setLabel(MessageManager.getString("action.find_next"));\r
263     findNext.addActionListener(this);\r
264     actionsPanel.setBounds(new Rectangle(195, 5, 141, 64));\r
265     actionsPanel.setLayout(gridLayout1);\r
266     gridLayout1.setHgap(0);\r
267     gridLayout1.setRows(3);\r
268     gridLayout1.setVgap(2);\r
269     createNewGroup.setEnabled(false);\r
270     createNewGroup.setFont(new java.awt.Font("Verdana", Font.PLAIN, 10));\r
271     createNewGroup.setLabel(MessageManager.getString("label.new_feature"));\r
272     createNewGroup.addActionListener(this);\r
273     caseSensitive.setLabel(MessageManager.getString("label.match_case"));\r
274     caseSensitive.setBounds(new Rectangle(30, 39, 126, 23));\r
275 \r
276     searchDescription.setLabel(MessageManager\r
277             .getString("label.include_description"));\r
278     searchDescription.setBounds(new Rectangle(30, 59, 170, 23));\r
279     actionsPanel.add(findNext, null);\r
280     actionsPanel.add(findAll, null);\r
281     actionsPanel.add(createNewGroup, null);\r
282     this.add(caseSensitive);\r
283     this.add(textfield, null);\r
284     this.add(jLabel1, null);\r
285     this.add(actionsPanel, null);\r
286     this.add(searchDescription);\r
287   }\r
288 \r
289   void textfield_keyTyped(KeyEvent e)\r
290   {\r
291     findNext.setEnabled(true);\r
292   }\r
293 \r
294 }\r