a819a181999b34a048bcbf177aed7af781001685
[jalview.git] / src / jalview / gui / Finder.java
1 package jalview.gui;\r
2 \r
3 import jalview.jbgui.GFinder;\r
4 import jalview.datamodel.*;\r
5 import java.awt.event.*;\r
6 import javax.swing.*;\r
7 import javax.swing.event.*;\r
8 import java.util.*;\r
9 \r
10 \r
11 public class Finder extends GFinder\r
12 {\r
13   AlignViewport av;\r
14   AlignmentPanel ap;\r
15   JInternalFrame frame;\r
16   String searchString;\r
17 \r
18   int seqIndex = 0;\r
19   int resIndex = 0;\r
20   public Finder(AlignViewport av, AlignmentPanel ap, JInternalFrame f)\r
21   {\r
22     this.av = av;\r
23     this.ap = ap;\r
24     frame = f;\r
25 \r
26     // all a big pain, but we need to wait until the frame is visible before the textfield can\r
27     // obtain the focus/////////////////////////\r
28     frame.addInternalFrameListener(new InternalFrameAdapter()\r
29     {\r
30       public void internalFrameOpened(InternalFrameEvent evt)\r
31       {\r
32         SwingUtilities.invokeLater(new Runnable()\r
33         {\r
34           public void run()\r
35           {\r
36             textfield.requestFocus();\r
37           }\r
38        });\r
39    }\r
40 });\r
41 \r
42   }\r
43 \r
44   public void textfield_actionPerformed(ActionEvent e)\r
45   {\r
46     doSearch(false);\r
47   }\r
48 \r
49   public void findNext_actionPerformed(ActionEvent e)\r
50   {\r
51     doSearch(false);\r
52   }\r
53 \r
54   public void findAll_actionPerformed(ActionEvent e)\r
55   {\r
56     resIndex=0;\r
57     seqIndex=0;\r
58     doSearch(true);\r
59   }\r
60 \r
61   public void cancel_actionPerformed(ActionEvent e)\r
62   {\r
63     try{\r
64       // if allResults is null, this effectively switches displaySearch flag in seqCanvas\r
65       ap.highlightSearchResults( null );\r
66       frame.setClosed(true);\r
67     }catch(Exception ex){ }\r
68 \r
69   }\r
70 \r
71   void doSearch(boolean findAll)\r
72   {\r
73     searchString = textfield.getText().toUpperCase();\r
74 \r
75     ArrayList searchResults = new ArrayList();\r
76     int [] allResults = null;\r
77 \r
78     Sequence seq;\r
79     String item;\r
80     boolean found = false;\r
81     while( !found && seqIndex<av.getAlignment().getHeight())\r
82     {\r
83       seq = (Sequence)av.getAlignment().getSequenceAt(seqIndex);\r
84       item = seq.getSequence();\r
85 \r
86       for(int r = resIndex; r<item.length(); r++)\r
87       {\r
88        if(item.indexOf(searchString,r)>-1)\r
89        {\r
90          resIndex = item.indexOf(searchString,r);\r
91          searchResults.add( Integer.toString(seqIndex) );\r
92          searchResults.add( Integer.toString( resIndex) );\r
93          searchResults.add( Integer.toString( (resIndex+searchString.length()-1) ) );\r
94          if(!findAll)\r
95          {\r
96            // thats enough, break and display the result\r
97            found = true;\r
98            resIndex++;\r
99            break;\r
100          }\r
101        }\r
102       }\r
103       if(!found)\r
104       {\r
105         seqIndex++;\r
106         resIndex = 0;\r
107       }\r
108     }\r
109 \r
110     if(searchResults.size()>0)\r
111     {\r
112 \r
113       allResults = new int[searchResults.size()];\r
114       for(int i=0; i<searchResults.size(); i++)\r
115         allResults[i] = Integer.parseInt(searchResults.get(i).toString());\r
116 \r
117     }\r
118     else\r
119     {\r
120       JOptionPane.showInternalMessageDialog(this, "Finished searching", null,\r
121                                             JOptionPane.INFORMATION_MESSAGE);\r
122       resIndex=0;\r
123       seqIndex=0;\r
124     }\r
125 \r
126     // if allResults is null, this effectively switches displaySearch flag in seqCanvas\r
127     ap.highlightSearchResults( allResults );\r
128 \r
129 \r
130   }\r
131 \r
132 }\r