New classes
[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       frame.setClosed(true);\r
65     }catch(Exception ex){}\r
66 \r
67   }\r
68 \r
69   void doSearch(boolean findAll)\r
70   {\r
71     searchString = textfield.getText().toUpperCase();\r
72 \r
73     ArrayList searchResults = new ArrayList();\r
74     int [] allResults = null;\r
75 \r
76     Sequence seq;\r
77     String item;\r
78     boolean found = false;\r
79     while( !found && seqIndex<av.getAlignment().getHeight())\r
80     {\r
81       seq = (Sequence)av.getAlignment().getSequenceAt(seqIndex);\r
82       item = seq.getSequence();\r
83 \r
84       for(int r = resIndex; r<item.length(); r++)\r
85       {\r
86        if(item.indexOf(searchString,r)>-1)\r
87        {\r
88          resIndex = item.indexOf(searchString,r);\r
89          searchResults.add( Integer.toString(seqIndex) );\r
90          searchResults.add( Integer.toString( resIndex) );\r
91          searchResults.add( Integer.toString( (resIndex+searchString.length()-1) ) );\r
92          if(!findAll)\r
93          {\r
94            // thats enough, break and display the result\r
95            found = true;\r
96            resIndex++;\r
97            break;\r
98          }\r
99        }\r
100       }\r
101       if(!found)\r
102       {\r
103         seqIndex++;\r
104         resIndex = 0;\r
105       }\r
106     }\r
107 \r
108     if(searchResults.size()>0)\r
109     {\r
110 \r
111       allResults = new int[searchResults.size()];\r
112       for(int i=0; i<searchResults.size(); i++)\r
113         allResults[i] = Integer.parseInt(searchResults.get(i).toString());\r
114 \r
115 \r
116       ap.highlightSearchResults( allResults );\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 \r
127   }\r
128 \r
129 }\r