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