usercolours changed
[jalview.git] / src / jalview / appletgui / Finder.java
1 package jalview.appletgui;\r
2 \r
3 import jalview.jbappletgui.GFinder;\r
4 import jalview.datamodel.*;\r
5 import java.awt.event.*;\r
6 import java.util.*;\r
7 import java.awt.*;\r
8 \r
9 public class Finder extends GFinder\r
10 {\r
11   AlignViewport av;\r
12   AlignmentPanel ap;\r
13   Frame frame;\r
14   SuperGroup searchGroup;\r
15   Vector searchResults;\r
16 \r
17   int seqIndex = 0;\r
18   int resIndex = 0;\r
19   public Finder(final AlignmentPanel ap)\r
20   {\r
21     this.av = ap.av;\r
22     this.ap = ap;\r
23     frame = new Frame();\r
24     frame.add(this);\r
25     jalview.bin.JalviewLite.addFrame(frame, "Find", 340,120);\r
26     frame.repaint();\r
27     frame.addWindowListener(new WindowAdapter()\r
28         {public void windowClosing(WindowEvent evt)\r
29               { ap.highlightSearchResults( null ); }\r
30         });\r
31   }\r
32 \r
33   public void textfield_actionPerformed(ActionEvent e)\r
34   {\r
35     doSearch(false);\r
36   }\r
37 \r
38   public void findNext_actionPerformed(ActionEvent e)\r
39   {\r
40     doSearch(false);\r
41   }\r
42 \r
43   public void findAll_actionPerformed(ActionEvent e)\r
44   {\r
45     resIndex=0;\r
46     seqIndex=0;\r
47     doSearch(true);\r
48   }\r
49 \r
50   public void cancel_actionPerformed(ActionEvent e)\r
51   {\r
52     try{\r
53       // if allResults is null, this effectively switches displaySearch flag in seqCanvas\r
54       ap.highlightSearchResults( null );\r
55       ap.idPanel.highlightSearchResults( null );\r
56      // frame.setClosed(true);\r
57     }catch(Exception ex){ }\r
58   }\r
59 \r
60 \r
61   public void createNewGroup_actionPerformed(ActionEvent e)\r
62   {\r
63    Color [] newColors = new Color[24];\r
64    for(int i=0; i<24; i++)\r
65      newColors[i] = new Color(60,160,115);\r
66 \r
67    jalview.schemes.UserColourScheme ucs = new jalview.schemes.UserColourScheme(newColors);\r
68    String searchString = textfield.getText();\r
69 \r
70    searchGroup = new SuperGroup(searchString, ucs , true, true, false);\r
71 \r
72 \r
73     for(int i=0; i<searchResults.size(); i+=3)\r
74     {\r
75       // its possible edits may have occurred since search was performed\r
76       // account for this here\r
77 \r
78       SequenceI seq = av.alignment.getSequenceAt( Integer.parseInt(searchResults.elementAt(i).toString()) );\r
79       int startRes = seq.findIndex( Integer.parseInt(searchResults.elementAt(i+1).toString()) )-1;\r
80       int endRes = seq.findIndex(   Integer.parseInt(searchResults.elementAt(i+2).toString()) )-1;\r
81 \r
82       SequenceGroup sg = new SequenceGroup(searchString, ucs, true, true, false, startRes , endRes  );\r
83       sg.addSequence(seq);\r
84       av.alignment.addGroup(sg);\r
85       searchGroup.addGroup( sg );\r
86 \r
87     }\r
88 \r
89     ap.av.alignment.addSuperGroup(searchGroup);\r
90     ap.highlightSearchResults( null );\r
91   }\r
92 \r
93 \r
94   void doSearch(boolean findAll)\r
95   {\r
96     createNewGroup.setEnabled(false);\r
97 \r
98     String searchString = textfield.getText().toUpperCase();\r
99 \r
100     com.stevesoft.pat.Regex regex = new  com.stevesoft.pat.Regex(searchString);\r
101 \r
102     searchResults = new Vector();\r
103     int [] allResults = null;\r
104 \r
105     Sequence seq;\r
106     String item=null;\r
107     boolean found = false;\r
108 \r
109     ////// is the searchString a residue number?\r
110     try{\r
111       int res = Integer.parseInt(searchString);\r
112       found = true;\r
113 \r
114       if(av.getSelectionGroup().getSize()>0)\r
115         seq = (Sequence)(av.getSelectionGroup().getSequenceAt(0));\r
116       else\r
117         seq = (Sequence)av.getAlignment().getSequenceAt(0);\r
118 \r
119       searchResults.addElement( Integer.toString( av.getAlignment().findIndex(seq) ) );\r
120       searchResults.addElement( Integer.toString( seq.findIndex(res)-1 ) );\r
121       searchResults.addElement( Integer.toString( seq.findIndex(res)-1 ) );\r
122 \r
123     }catch(NumberFormatException ex){}\r
124     ///////////////////////////////////////////////\r
125 \r
126 \r
127     int end = av.alignment.getHeight();\r
128 \r
129     SequenceGroup selection = av.getSelectionGroup();\r
130     if(selection!=null)\r
131      if(selection.getSize()<1 || (selection.getEndRes()-selection.getStartRes()<2))\r
132       selection = null;\r
133 \r
134     while( !found && seqIndex<end)\r
135     {\r
136       seq = (Sequence)av.alignment.getSequenceAt(seqIndex);\r
137 \r
138 \r
139       if(selection!=null && !selection.sequences.contains(seq))\r
140       {\r
141         seqIndex++;\r
142         resIndex=0;\r
143         continue;\r
144       }\r
145 \r
146       item = seq.getSequence().toUpperCase();\r
147 \r
148       if(selection!=null && selection.getEndRes()<av.alignment.getWidth())\r
149           item = item.substring(0, selection.getEndRes()+1);\r
150 \r
151       ///Shall we ignore gaps????\r
152       StringBuffer noGaps = new StringBuffer();\r
153       int insertCount=0;\r
154       Vector spaces = new Vector();\r
155 \r
156       for (int j=0; j < item.length(); j++)\r
157       {\r
158 \r
159         if(!jalview.util.Comparison.isGap(item.charAt(j)))\r
160          {\r
161            noGaps.append(item.charAt(j));\r
162            spaces.addElement(new Integer(insertCount));\r
163          }\r
164         else\r
165            insertCount++;\r
166       }\r
167 \r
168 \r
169 \r
170       for(int r = resIndex; r<noGaps.length(); r++)\r
171       {\r
172 \r
173        if( regex.searchFrom( noGaps.toString(), r ) )\r
174        {\r
175          resIndex = regex.matchedFrom();\r
176          if(selection!=null && ( resIndex+ Integer.parseInt(spaces.elementAt(resIndex).toString()) )<selection.getStartRes())\r
177            continue;\r
178 \r
179          searchResults.addElement( Integer.toString( seqIndex) );\r
180          int sres = seq.findPosition( resIndex+ Integer.parseInt(spaces.elementAt(resIndex).toString()) );\r
181          int eres = seq.findPosition( regex.matchedTo()-1 + Integer.parseInt(spaces.elementAt(regex.matchedTo()-1).toString()) );\r
182           searchResults.addElement( sres+"" );\r
183           searchResults.addElement( eres+"" );\r
184 \r
185 \r
186          if(!findAll)\r
187          {\r
188            // thats enough, break and display the result\r
189            found = true;\r
190            resIndex++;\r
191            break;\r
192          }\r
193 \r
194          r=resIndex;\r
195        }\r
196       }\r
197       if(!found)\r
198       {\r
199         seqIndex++;\r
200         resIndex = 0;\r
201       }\r
202     }\r
203 \r
204 \r
205     Vector idMatch = new Vector();\r
206     for(int id = 0; id<av.alignment.getHeight(); id++)\r
207     {\r
208       if(   regex.search( av.alignment.getSequenceAt(id).getName() ) )\r
209         idMatch.addElement( av.alignment.getSequenceAt(id) );\r
210     }\r
211 \r
212     if(searchResults.size()==0 && idMatch.size()>0)\r
213       ap.idPanel.highlightSearchResults( idMatch );\r
214 \r
215 \r
216     if(searchResults.size()>0)\r
217     {\r
218       allResults = new int[searchResults.size()];\r
219       for(int i=0; i<searchResults.size(); i++)\r
220         allResults[i] = Integer.parseInt(searchResults.elementAt(i).toString());\r
221 \r
222       createNewGroup.setEnabled(true);\r
223     }\r
224     else\r
225     {\r
226       resIndex=0;\r
227       seqIndex=0;\r
228     }\r
229 \r
230     // if allResults is null, this effectively switches displaySearch flag in seqCanvas\r
231     ap.highlightSearchResults( allResults );\r
232 \r
233     if (findAll)\r
234     {\r
235       String message =  (searchResults.size()/3) + " matches found.";\r
236       System.out.println(message);\r
237     }\r
238 \r
239   }\r
240 \r
241 }\r