refactored to use jalview.analysis.Finder for searching alignment.
[jalview.git] / src / jalview / appletgui / Finder.java
1 /*
2  * Jalview - A Sequence Alignment Editor and Viewer
3  * Copyright (C) 2006 AM Waterhouse, J Procter, G Barton, M Clamp, S Searle
4  *
5  * This program is free software; you can redistribute it and/or
6  * modify it under the terms of the GNU General Public License
7  * as published by the Free Software Foundation; either version 2
8  * of the License, or (at your option) any later version.
9  *
10  * This program is distributed in the hope that it will be useful,
11  * but WITHOUT ANY WARRANTY; without even the implied warranty of
12  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
13  * GNU General Public License for more details.
14  *
15  * You should have received a copy of the GNU General Public License
16  * along with this program; if not, write to the Free Software
17  * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA
18  */
19
20 package jalview.appletgui;
21
22 import java.util.*;
23
24 import java.awt.*;
25 import java.awt.event.*;
26
27 import jalview.datamodel.*;
28 import java.awt.Rectangle;
29
30 public class Finder extends Panel implements ActionListener
31 {
32   AlignViewport av;
33   AlignmentPanel ap;
34   Frame frame;
35
36   SearchResults searchResults;
37
38   int seqIndex = 0;
39   int resIndex = 0;
40   public Finder(final AlignmentPanel ap)
41   {
42     try
43     {
44       jbInit();
45     }
46     catch (Exception e)
47     {
48       e.printStackTrace();
49     }
50
51     this.av = ap.av;
52     this.ap = ap;
53     frame = new Frame();
54     frame.add(this);
55     jalview.bin.JalviewLite.addFrame(frame, "Find", 340, 120);
56     frame.repaint();
57     frame.addWindowListener(new WindowAdapter()
58     {
59       public void windowClosing(WindowEvent evt)
60       {
61         ap.highlightSearchResults(null);
62       }
63     });
64   }
65
66   public void actionPerformed(ActionEvent evt)
67   {
68     if (evt.getSource() == textfield)
69       doSearch(false);
70
71     else if (evt.getSource() == findNext)
72       doSearch(false);
73
74     else if (evt.getSource() == findAll)
75     {
76       resIndex = 0;
77       seqIndex = 0;
78       doSearch(true);
79     }
80     else if(evt.getSource() == createNewGroup)
81       createNewGroup_actionPerformed();
82   }
83
84
85   public void createNewGroup_actionPerformed()
86   {
87
88     CutAndPasteTransfer cap = new CutAndPasteTransfer(true, null);
89     cap.accept.setLabel("Accept");
90     Dialog dialog = new Dialog(ap.alignFrame, "Enter New Feature Name", true);
91     dialog.add(cap);
92
93     cap.setText(textfield.getText());
94
95     dialog.setBounds( frame.getLocation().x+frame.getSize().width+5,
96                       frame.getLocation().y+20,300,100);
97     dialog.show();
98
99
100     String featureName = cap.getText().trim();
101     if(featureName.length()<1)
102       return;
103
104
105     for (int i = 0; i < searchResults.getSize(); i ++ )
106     {
107         SequenceI seq = searchResults.getResultSequence(i);
108
109         SequenceFeature sf = new SequenceFeature(featureName,
110             null, null,
111             searchResults.getResultStart(i),
112            searchResults.getResultEnd(i), "Search Results");
113
114         ap.seqPanel.seqCanvas.getFeatureRenderer().addNewFeature(
115             featureName, new Color(60,160,115));
116         seq.addSequenceFeature(sf);
117     }
118
119     ap.seqPanel.seqCanvas.getFeatureRenderer().findAllFeatures();
120     ap.alignFrame.sequenceFeatures.setState(true);
121     av.showSequenceFeatures(true);
122     ap.highlightSearchResults(null);
123   }
124
125   void doSearch(boolean findAll)
126   {
127     if(jalview.bin.JalviewLite.currentAlignFrame!=null)
128     {
129       ap = jalview.bin.JalviewLite.currentAlignFrame.alignPanel;
130       av = ap.av;
131     }
132     createNewGroup.setEnabled(false);
133     jalview.analysis.Finder finder=new jalview.analysis.Finder(av.getAlignment(), av.getSelectionGroup(), seqIndex, resIndex);
134     finder.setCaseSensitive(caseSensitive.getState());
135     finder.setFindAll(findAll);
136     
137     String searchString = textfield.getText();
138     
139     finder.find(searchString);
140     seqIndex=finder.getSeqIndex();
141     resIndex=finder.getResIndex();
142     searchResults = finder.getSearchResults();
143     Vector idMatch = finder.getIdMatch();
144     
145     if (searchResults.getSize() == 0 && idMatch.size() > 0)
146     {
147       ap.idPanel.highlightSearchResults(idMatch);
148     }
149
150     if (searchResults.getSize() > 0)
151     {
152       createNewGroup.setEnabled(true);
153       
154     }
155     else
156     {
157       searchResults = null;
158       resIndex = 0;
159       seqIndex = 0;
160     }
161
162     // if allResults is null, this effectively switches displaySearch flag in seqCanvas
163     ap.highlightSearchResults(searchResults);
164
165     if (findAll)
166     {
167       String message = (searchResults==null?0 : searchResults.getSize()) + " matches found.";
168       ap.alignFrame.statusBar.setText("Search results: "+searchString+" : "+message);
169     }
170
171   }
172
173   Label jLabel1 = new Label();
174   protected TextField textfield = new TextField();
175   protected Button findAll = new Button();
176   protected Button findNext = new Button();
177   Panel jPanel1 = new Panel();
178   GridLayout gridLayout1 = new GridLayout();
179   protected Button createNewGroup = new Button();
180   Checkbox caseSensitive = new Checkbox();
181
182   private void jbInit() throws Exception {
183       jLabel1.setFont(new java.awt.Font("Verdana", 0, 12));
184       jLabel1.setText("Find");
185       jLabel1.setBounds(new Rectangle(3, 30, 34, 15));
186       this.setLayout(null);
187       textfield.setFont(new java.awt.Font("Verdana", Font.PLAIN, 10));
188       textfield.setText("");
189       textfield.setBounds(new Rectangle(40, 27, 133, 21));
190       textfield.addKeyListener(new java.awt.event.KeyAdapter() {
191               public void keyTyped(KeyEvent e) {
192                   textfield_keyTyped(e);
193               }
194           });
195       textfield.addActionListener(this);
196       findAll.setFont(new java.awt.Font("Verdana", Font.PLAIN, 10));
197       findAll.setLabel("Find all");
198       findAll.addActionListener(this);
199       findNext.setEnabled(false);
200       findNext.setFont(new java.awt.Font("Verdana", Font.PLAIN, 10));
201       findNext.setLabel("Find Next");
202       findNext.addActionListener(this);
203       jPanel1.setBounds(new Rectangle(180, 5, 141, 64));
204       jPanel1.setLayout(gridLayout1);
205       gridLayout1.setHgap(0);
206       gridLayout1.setRows(3);
207       gridLayout1.setVgap(2);
208       createNewGroup.setEnabled(false);
209       createNewGroup.setFont(new java.awt.Font("Verdana", Font.PLAIN, 10));
210       createNewGroup.setLabel("New Feature");
211       createNewGroup.addActionListener(this);
212     caseSensitive.setLabel("Match Case");
213     caseSensitive.setBounds(new Rectangle(40, 49, 126, 23));
214     jPanel1.add(findNext, null);
215       jPanel1.add(findAll, null);
216       jPanel1.add(createNewGroup, null);
217     this.add(caseSensitive);
218     this.add(textfield, null);
219       this.add(jLabel1, null);
220       this.add(jPanel1, null);
221   }
222
223   void textfield_keyTyped(KeyEvent e) {
224       findNext.setEnabled(true);
225   }
226
227 }