Char to string comparison
[jalview.git] / src / jalview / gui / SeqPanel.java
1 package jalview.gui;\r
2 \r
3 import java.awt.*;\r
4 import java.awt.event.*;\r
5 import jalview.datamodel.*;\r
6 import javax.swing.*;\r
7 import jalview.schemes.*;\r
8 import jalview.analysis.*;\r
9 \r
10 \r
11 public class SeqPanel extends JPanel\r
12 {\r
13 \r
14   public    SeqCanvas         seqCanvas;\r
15   public    AlignmentPanel    parent;\r
16 \r
17   protected int startres;\r
18   protected int lastres;\r
19   protected int endres;\r
20 \r
21   protected int startseq;\r
22   protected int padseq;\r
23 \r
24   public    boolean editFlag;\r
25   protected AlignViewport av;\r
26 \r
27   // if character is inserted or deleted, we will need to recalculate the conservation\r
28   int seqEditOccurred = -1;\r
29 \r
30   public SeqPanel(AlignViewport av, AlignmentPanel p) {\r
31     this.av         = av;\r
32 \r
33     seqCanvas  = new SeqCanvas(av);\r
34     setLayout(new BorderLayout());\r
35     add(seqCanvas, BorderLayout.CENTER);\r
36 \r
37     parent = p;\r
38 \r
39     addMouseMotionListener( new MouseMotionAdapter()\r
40     {\r
41       public void mouseMoved(MouseEvent evt)\r
42       {  doMouseMoved(evt);   }\r
43       public void mouseDragged(MouseEvent evt)\r
44       {      doMouseDragged(evt);  }\r
45     });\r
46 \r
47     addMouseListener( new MouseAdapter()\r
48     {\r
49       public void mouseReleased(MouseEvent evt)\r
50       {  doMouseReleased(evt);  }\r
51       public void mousePressed(MouseEvent evt)\r
52       {  doMousePressed(evt);   }\r
53 \r
54     });\r
55     repaint();\r
56   }\r
57 \r
58 \r
59   public void doMouseReleased(MouseEvent evt) {\r
60 \r
61     int x = evt.getX();\r
62     int res = (int)(x/av.getCharWidth()) + av.getStartRes();\r
63 \r
64     endres = res;\r
65 \r
66       // This is to detect edits - we're at the end of an edit if mouse is up\r
67     editFlag = false;\r
68     startseq = -1;\r
69     startres = -1;\r
70     lastres  = -1;\r
71     if(seqEditOccurred>-1)\r
72       updateConservation(seqEditOccurred);\r
73 \r
74     seqEditOccurred = -1;\r
75 \r
76     parent.RefreshPanels();\r
77     repaint();\r
78 \r
79   }\r
80 \r
81   public void doMousePressed(MouseEvent evt) {\r
82   parent.alignFrame.addHistoryItem("sequence edit");\r
83     int seq;\r
84     int res;\r
85 \r
86     int x = evt.getX();\r
87     int y = evt.getY();\r
88 \r
89     res = (int)(x/av.getCharWidth()) + av.getStartRes();\r
90     seq = (y)/av.getCharHeight() + av.getStartSeq();\r
91 \r
92     if (seq < av.getAlignment().getHeight() && res < av.getAlignment().getSequenceAt(seq).getLength())\r
93     {\r
94       //char resstr = align.getSequenceAt(seq).getSequence().charAt(res);\r
95       // Find the residue's position in the sequence (res is the position\r
96       // in the alignment\r
97 \r
98       startseq = seq;\r
99 \r
100       if (startseq == (av.getAlignment().getHeight()-1)) {\r
101         padseq = 1;\r
102       } else {\r
103         padseq = 1;\r
104       }\r
105 \r
106       startres = res;\r
107       lastres = res;\r
108 \r
109       } else {\r
110       startseq = -1;\r
111       startres = -1;\r
112       lastres = -1;\r
113     }\r
114 \r
115     return;\r
116   }\r
117 \r
118   public void doMouseMoved(MouseEvent evt)\r
119   {\r
120     int res=0, seq=0;\r
121     int x = evt.getX();\r
122     int y = evt.getY();\r
123     if(av.wrapAlignment)\r
124     {\r
125       y -= 2*av.charHeight;\r
126       int chunkHeight = (av.getAlignment().getHeight()+2)*av.charHeight;\r
127 \r
128 \r
129       res =   (int)((y/chunkHeight)*(getWidth()/av.charWidth)) +  (int)(x/av.getCharWidth()) + av.getStartRes();\r
130 \r
131       System.out.println( ((y/chunkHeight)*(getWidth()/av.charWidth)) +" "+((x / av.getCharWidth()) + av.getStartRes()) );\r
132       y %= chunkHeight;\r
133       seq =     y / av.getCharHeight() + av.getStartSeq();\r
134 \r
135       //   chunkHeight =  (da.getHeight() + 2)*charHeight;\r
136       //  startx += chunkWidth;\r
137     }\r
138     else\r
139     {\r
140       res = (int) (x / av.getCharWidth()) + av.getStartRes();\r
141       seq = y / av.getCharHeight() + av.getStartSeq();\r
142     }\r
143 \r
144 \r
145     if(seq>=av.getAlignment().getHeight())\r
146       return;\r
147 \r
148     Object obj = ResidueProperties.aa2Triplet.get( av.getAlignment().getSequenceAt(seq).getCharAt(res)+"" ) ;\r
149     String aa = "";\r
150     if(obj!=null)\r
151          aa = obj.toString();\r
152 \r
153     StringBuffer text = new StringBuffer("Sequence " +(seq+1)+" ID: "+av.getAlignment().getSequenceAt(seq).getName());\r
154     if(aa!="")\r
155       text.append("  Residue: "+aa+" ("+  av.getAlignment().getSequenceAt(seq).findPosition(res)+")");\r
156 \r
157     parent.alignFrame.statusBar.setText(text.toString());\r
158 \r
159   }\r
160 \r
161   public void doMouseDragged(MouseEvent evt) {\r
162     // If we're dragging we're editing\r
163     editFlag = true;\r
164     int x = evt.getX();\r
165 \r
166     int res = (int)(x/av.getCharWidth()) + av.getStartRes();\r
167     if (res < 0) {res = 0;}\r
168 \r
169     if (res  != lastres) {\r
170       if (startseq != -1) {\r
171 \r
172         // Group editing\r
173         if (av.getGroupEdit()) {\r
174           SequenceGroup sg = av.getAlignment().findGroup(startseq);\r
175 \r
176           if(sg!=null)\r
177           if (res < av.getAlignment().getWidth() && res < lastres)\r
178           {\r
179             boolean flag = false;\r
180             for (int i= 0 ; i < sg.getSize(); i++)\r
181             {\r
182               SequenceI s = (SequenceI)sg.getSequenceAt(i);\r
183               for (int j=lastres-1; j >= res; j--)\r
184               {\r
185                 if (!flag)\r
186                 {\r
187                   if (s.getSequence().charAt(j)!=av.getAlignment().getGapCharacter() &&\r
188                       s.getSequence().charAt(j)==' ')\r
189                   {\r
190                     res = j+1;\r
191                     flag = true;\r
192                   }\r
193                 }\r
194               }\r
195             }\r
196           }\r
197 \r
198           if(sg!=null)\r
199           for (int i= 0 ; i < sg.getSize(); i++)\r
200           {\r
201             SequenceI s = (SequenceI)sg.getSequenceAt(i);\r
202             boolean found = false;\r
203             int sno = -1;\r
204             for (int k = 0; k < av.getAlignment().getHeight(); k++)\r
205             {\r
206               if (av.getAlignment().getSequenceAt(k) == s)\r
207               {\r
208                 found = true;\r
209                 sno = k;\r
210                 break;\r
211               }\r
212             }\r
213             if (found && sno != -1) {\r
214               if (res < av.getAlignment().getWidth() && res > lastres)\r
215               {\r
216                 for (int j = lastres; j < res; j++)\r
217                   insertChar(j,sno);\r
218 \r
219                 int index = av.getAlignment().findIndex(s);\r
220                 if (index != -1)\r
221                   drawChars(index,index+1,lastres);\r
222 \r
223 \r
224               } else if (res < av.getAlignment().getWidth() && res < lastres)\r
225               {\r
226                 for (int j = res; j < lastres; j++)\r
227                 {\r
228                   deleteChar(j,res,sno);\r
229                   startres = res;\r
230                 }\r
231                 int index = av.getAlignment().findIndex(s);\r
232                 if (index != -1)\r
233                   drawChars(index,index+1,res);\r
234 \r
235               }\r
236             }\r
237 \r
238           }\r
239           lastres = res;\r
240         } else {\r
241 \r
242 \r
243           if (res < av.getAlignment().getWidth() && res > lastres) {\r
244             // dragging to the right\r
245             for (int j = lastres; j < res; j++)\r
246               insertChar(j,startseq);\r
247 \r
248             drawChars(startseq,startseq+1,lastres);\r
249 \r
250           } else if (res < av.getAlignment().getWidth() && res < lastres)\r
251           {\r
252 \r
253             // dragging to the left\r
254             for (int j = res; j < lastres; j++) {\r
255               deleteChar(j,res,startseq);\r
256               startres = res;\r
257             }\r
258             drawChars(startseq,startseq+1,res);\r
259           }\r
260         }\r
261       }\r
262       lastres = res;\r
263     }\r
264 \r
265     repaint();\r
266     return;\r
267   }\r
268 \r
269   public void drawChars(int seqstart, int seqend, int start) {\r
270     seqCanvas.drawPanel(seqCanvas.gg, start,av.getEndRes(),seqstart,seqend,av.getStartRes(),av.getStartSeq(),0);\r
271     repaint();\r
272   }\r
273 \r
274   public void insertChar(int j, int seq)\r
275   {\r
276     av.getAlignment().getSequenceAt(seq).insertCharAt(j, av.getGapCharacter());\r
277     seqEditOccurred=seq;\r
278   }\r
279 \r
280   public void deleteChar(int j, int res, int seq)\r
281   {\r
282 \r
283     if (av.getAlignment().getSequenceAt(seq).getSequence().charAt(j)=='.' ||\r
284         av.getAlignment().getSequenceAt(seq).getSequence().charAt(j)=='-' ||\r
285         av.getAlignment().getSequenceAt(seq).getSequence().charAt(j)==' ' )\r
286     {\r
287         av.getAlignment().getSequenceAt(seq).deleteCharAt(j);\r
288     }\r
289 \r
290     av.getAlignment().getWidth();\r
291     repaint();\r
292     seqEditOccurred=seq;\r
293   }\r
294 \r
295 \r
296   void updateConservation(int i)\r
297   {\r
298     Alignment al = (Alignment) av.getAlignment();\r
299     SequenceGroup sg = av.alignment.findGroup( al.getSequenceAt(i));\r
300     if(sg==null || !(sg.cs instanceof ConservationColourScheme))\r
301       return;\r
302 \r
303     Conservation c = sg.getConservation();\r
304 \r
305     c = new Conservation("All", al.cons,\r
306                          ResidueProperties.propHash, 3, sg.sequences, 0,\r
307                          al.getWidth());\r
308     c.calculate();\r
309     c.verdict(false, 100);\r
310     sg.setConservation(c);\r
311     ConservationColourScheme ccs = (ConservationColourScheme)sg.cs;\r
312     ccs.conserve = c;\r
313   }\r
314 \r
315 \r
316   public void setColourScheme(ColourSchemeI cs, boolean showConservation)\r
317   {\r
318     seqCanvas.paintFlag = true;\r
319     if (av.getSelection().size() == 0)\r
320     {\r
321       seqCanvas.cs = cs;\r
322       for (int i = 0; i < av.alignment.getGroups().size();i++)\r
323       {\r
324         SequenceGroup sg = (SequenceGroup)av.alignment.getGroups().elementAt(i);\r
325         sg.cs = cs;\r
326         if(!showConservation\r
327             && !(sg.cs instanceof Blosum62ColourScheme)\r
328             && sg.cs instanceof ConservationColourScheme)\r
329          {\r
330            // remove ConservationColouring from existing Conservation group\r
331            ConservationColourScheme ccs = (ConservationColourScheme)sg.cs;\r
332            sg.cs = ccs.cs;\r
333          }\r
334          else if(showConservation && !(sg.cs instanceof ConservationColourScheme))\r
335          {\r
336            // add ConservationColouring to new group\r
337            Conservation c = sg.getConservation();\r
338            Alignment al = (Alignment) av.getAlignment();\r
339            c = new Conservation("All", al.cons,\r
340                                 ResidueProperties.propHash, 3, sg.sequences, 0,\r
341                                 al.getWidth() );\r
342            c.calculate();\r
343            c.verdict(false, 100);\r
344            sg.setConservation(c);\r
345            sg.cs = new ConservationColourScheme(sg);\r
346          }\r
347       }\r
348     }\r
349     else\r
350     {\r
351       SequenceGroup sg = av.alignment.findGroup((Sequence)av.sel.sequenceAt(0));\r
352 \r
353       if( isNewSelection(sg) )\r
354       {\r
355         sg = av.getAlignment().addGroup();\r
356         for (int i=0; i < av.getSelection().size(); i++)\r
357         {\r
358           av.alignment.removeFromGroup(av.alignment.findGroup( (Sequence) av.\r
359               sel.sequenceAt(i)),\r
360                                        (Sequence) av.sel.sequenceAt(i));\r
361           av.alignment.addToGroup(sg, (Sequence) av.sel.sequenceAt(i));\r
362         }\r
363       }\r
364 \r
365 \r
366       sg.cs = cs;\r
367 \r
368       // Selection is made, we only want to change the conservationColour for selected group\r
369       if(  showConservation\r
370            && !(sg.cs instanceof ConservationColourScheme)\r
371            && !(sg.cs instanceof Blosum62ColourScheme))\r
372       {\r
373         Conservation c = sg.getConservation();\r
374         Alignment al = (Alignment) av.getAlignment();\r
375 \r
376         c = new Conservation("All", al.cons,\r
377                              ResidueProperties.propHash, 3, sg.sequences, 0,\r
378                              al.getWidth() );\r
379         c.calculate();\r
380         c.verdict(false, 100);\r
381         sg.setConservation(c);\r
382         sg.cs = new ConservationColourScheme(sg);\r
383     }\r
384     else  if( !showConservation && sg.cs instanceof ConservationColourScheme)\r
385     {\r
386       ConservationColourScheme ccs = (ConservationColourScheme)sg.cs;\r
387       sg.cs = ccs.cs;\r
388     }\r
389    }\r
390    repaint();\r
391   }\r
392 \r
393   boolean isNewSelection(SequenceGroup sg)\r
394   {\r
395     if(sg.getSize()!=av.getSelection().size())\r
396       return true;\r
397 \r
398     for(int i=0; i<sg.getSize(); i++)\r
399      if( !av.getSelection().contains( sg.getSequenceAt(i) ))\r
400        return true;\r
401 \r
402     return false;\r
403   }\r
404 \r
405 \r
406   public ColourSchemeI getColourScheme()\r
407   {\r
408     if(av.getSelection().size()>0)\r
409        return av.alignment.findGroup((Sequence)av.sel.sequenceAt(0)).cs;\r
410     else\r
411       return seqCanvas.cs;\r
412   }\r
413 }\r
414 \r
415 \r
416 \r
417 \r