SuperGroup added
[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 import java.util.regex.*;\r
10 import java.awt.*;\r
11 \r
12 public class Finder extends GFinder\r
13 {\r
14   AlignViewport av;\r
15   AlignmentPanel ap;\r
16   JInternalFrame frame;\r
17   String searchString;\r
18   SuperGroup searchGroup;\r
19 \r
20   int seqIndex = 0;\r
21   int resIndex = 0;\r
22   public Finder(AlignViewport av, AlignmentPanel ap, JInternalFrame f)\r
23   {\r
24     this.av = av;\r
25     this.ap = ap;\r
26     frame = f;\r
27 \r
28     // all a big pain, but we need to wait until the frame is visible before the textfield can\r
29     // obtain the focus/////////////////////////\r
30     frame.addInternalFrameListener(new InternalFrameAdapter()\r
31     {\r
32       public void internalFrameOpened(InternalFrameEvent evt)\r
33       {\r
34         SwingUtilities.invokeLater(new Runnable()\r
35         {\r
36           public void run()\r
37           {   textfield.requestFocus();      }\r
38        });\r
39      }\r
40 \r
41      public void internalFrameClosing(InternalFrameEvent evt)\r
42      {\r
43        cancel_actionPerformed(null);\r
44      }\r
45 });\r
46 \r
47   }\r
48 \r
49   public void textfield_actionPerformed(ActionEvent e)\r
50   {\r
51     doSearch(false);\r
52   }\r
53 \r
54   public void findNext_actionPerformed(ActionEvent e)\r
55   {\r
56     doSearch(false);\r
57   }\r
58 \r
59   public void findAll_actionPerformed(ActionEvent e)\r
60   {\r
61     resIndex=0;\r
62     seqIndex=0;\r
63     doSearch(true);\r
64   }\r
65 \r
66   public void cancel_actionPerformed(ActionEvent e)\r
67   {\r
68     try{\r
69       // if allResults is null, this effectively switches displaySearch flag in seqCanvas\r
70       ap.highlightSearchResults( null );\r
71      // frame.setClosed(true);\r
72     }catch(Exception ex){ }\r
73   }\r
74 \r
75 \r
76   public void createNewGroup_actionPerformed(ActionEvent e)\r
77   {\r
78     for(int i=0; i<searchGroup.getSize(); i++)\r
79       av.alignment.addGroup( searchGroup.getGroupeAt(i));\r
80 \r
81     ap.av.alignment.addSuperGroup(searchGroup);\r
82     ap.highlightSearchResults( null );\r
83   }\r
84 \r
85 \r
86   void doSearch(boolean findAll)\r
87   {\r
88     createNewGroup.setEnabled(false);\r
89     searchString = textfield.getText().toUpperCase();\r
90 \r
91     ArrayList searchResults = new ArrayList();\r
92     int [] allResults = null;\r
93 \r
94     Sequence seq;\r
95     String item;\r
96     boolean found = false;\r
97 \r
98     /// is the searchString a residue number?\r
99     try{\r
100       int res = Integer.parseInt(searchString);\r
101       found = true;\r
102 \r
103       if(av.getSelection().size()>0)\r
104         seq = (Sequence)(av.getSelection().sequenceAt(0));\r
105       else\r
106         seq = (Sequence)av.getAlignment().getSequenceAt(0);\r
107 \r
108       searchResults.add( Integer.toString( av.getAlignment().findIndex(seq) ) );\r
109       searchResults.add( Integer.toString( seq.findIndex(res)-1 ) );\r
110       searchResults.add( Integer.toString( seq.findIndex(res)-1 ) );\r
111 \r
112 \r
113       //av.getAlignment().getSequenceAt(seq).findPosition(res)\r
114     }catch(NumberFormatException ex){}\r
115 \r
116     jalview.schemes.UserColourScheme ucs = new jalview.schemes.UserColourScheme();\r
117     Color [] newColors = new Color[24];\r
118     for(int i=0; i<24; i++)\r
119       newColors[i] = new Color(60,160,115);\r
120 \r
121     ucs.setColourScheme(newColors);\r
122 \r
123     searchGroup = new SuperGroup(searchString, ucs , true, true, false);\r
124 \r
125     while( !found && seqIndex<av.getAlignment().getHeight())\r
126     {\r
127       seq = (Sequence)av.getAlignment().getSequenceAt(seqIndex);\r
128       if(av.getSelection().size()>0 && !av.getSelection().contains(seq))\r
129       {\r
130         // if a selection has been made, only search within that selection\r
131         seqIndex++;\r
132         resIndex=0;\r
133         continue;\r
134       }\r
135 \r
136       item = seq.getSequence();\r
137 \r
138       ///Shall we ignore gaps????\r
139       StringBuffer noGaps = new StringBuffer();\r
140       int insertCount=0;\r
141       ArrayList spaces = new ArrayList();\r
142 \r
143       for (int j=0; j < item.length(); j++)\r
144       {\r
145 \r
146         if(!jalview.util.Comparison.isGap(item.charAt(j)))\r
147          {\r
148            noGaps.append(item.charAt(j));\r
149            spaces.add(new Integer(insertCount));\r
150          }\r
151         else\r
152            insertCount++;\r
153       }\r
154 \r
155 \r
156       Pattern pattern = Pattern.compile(searchString);\r
157       Matcher matcher = pattern.matcher(noGaps);\r
158 \r
159       for(int r = resIndex; r<noGaps.length(); r++)\r
160       {\r
161 \r
162        if( matcher.find( r ) )\r
163        {\r
164          resIndex = matcher.start();\r
165 \r
166          searchResults.add( Integer.toString( seqIndex) );\r
167          searchResults.add( Integer.toString( resIndex+ Integer.parseInt(spaces.get(resIndex).toString()) ) );\r
168          searchResults.add( Integer.toString( matcher.end()-1 + Integer.parseInt(spaces.get(matcher.end()-1).toString()) ) );\r
169 \r
170          SequenceGroup sg = new SequenceGroup(searchString, ucs, true, true, false,\r
171                                              resIndex+ Integer.parseInt(spaces.get(resIndex).toString()) ,\r
172                                       matcher.end()-1 + Integer.parseInt(spaces.get(matcher.end()-1).toString())\r
173             );\r
174          sg.addSequence((Sequence)av.getAlignment().getSequenceAt(seqIndex));\r
175          searchGroup.addGroup( sg );\r
176 \r
177          if(!findAll)\r
178          {\r
179            // thats enough, break and display the result\r
180            found = true;\r
181            resIndex++;\r
182            break;\r
183          }\r
184 \r
185          r=resIndex+1;\r
186        }\r
187       }\r
188       if(!found)\r
189       {\r
190         seqIndex++;\r
191         resIndex = 0;\r
192       }\r
193           }\r
194 \r
195     if(searchResults.size()>0)\r
196     {\r
197       allResults = new int[searchResults.size()];\r
198       for(int i=0; i<searchResults.size(); i++)\r
199         allResults[i] = Integer.parseInt(searchResults.get(i).toString());\r
200 \r
201       createNewGroup.setEnabled(true);\r
202     }\r
203     else\r
204     {\r
205       JOptionPane.showInternalMessageDialog(this, "Finished searching", null, JOptionPane.INFORMATION_MESSAGE);\r
206       resIndex=0;\r
207       seqIndex=0;\r
208     }\r
209 \r
210     // if allResults is null, this effectively switches displaySearch flag in seqCanvas\r
211     ap.highlightSearchResults( allResults );\r
212 \r
213     if (findAll)\r
214     {\r
215       String message =  (searchResults.size()/3) + " matches found.";\r
216       JOptionPane.showInternalMessageDialog(this, message, null,\r
217                                             JOptionPane.INFORMATION_MESSAGE);\r
218     }\r
219 \r
220   }\r
221 \r
222 }\r