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
11 public class SeqPanel extends JPanel
\r
14 public SeqCanvas seqCanvas;
\r
15 public AlignmentPanel parent;
\r
17 protected int startres;
\r
18 protected int lastres;
\r
19 protected int endres;
\r
21 protected int startseq;
\r
22 protected int padseq;
\r
24 public boolean editFlag;
\r
25 protected AlignViewport av;
\r
27 // if character is inserted or deleted, we will need to recalculate the conservation
\r
28 int seqEditOccurred = -1;
\r
30 public SeqPanel(AlignViewport av, AlignmentPanel p) {
\r
33 seqCanvas = new SeqCanvas(av);
\r
34 setLayout(new BorderLayout());
\r
35 add(seqCanvas, BorderLayout.CENTER);
\r
39 addMouseMotionListener( new MouseMotionAdapter()
\r
41 public void mouseMoved(MouseEvent evt)
\r
42 { doMouseMoved(evt); }
\r
43 public void mouseDragged(MouseEvent evt)
\r
44 { doMouseDragged(evt); }
\r
47 addMouseListener( new MouseAdapter()
\r
49 public void mouseReleased(MouseEvent evt)
\r
50 { doMouseReleased(evt); }
\r
51 public void mousePressed(MouseEvent evt)
\r
52 { doMousePressed(evt); }
\r
59 public void doMouseReleased(MouseEvent evt) {
\r
62 int res = (int)(x/av.getCharWidth()) + av.getStartRes();
\r
66 // This is to detect edits - we're at the end of an edit if mouse is up
\r
71 if(seqEditOccurred>-1)
\r
72 updateConservation(seqEditOccurred);
\r
74 seqEditOccurred = -1;
\r
76 parent.RefreshPanels();
\r
81 public void doMousePressed(MouseEvent evt) {
\r
82 parent.alignFrame.addHistoryItem("sequence edit");
\r
89 res = (int)(x/av.getCharWidth()) + av.getStartRes();
\r
90 seq = (y)/av.getCharHeight() + av.getStartSeq();
\r
92 if (seq < av.getAlignment().getHeight() && res < av.getAlignment().getSequenceAt(seq).getLength())
\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
100 if (startseq == (av.getAlignment().getHeight()-1)) {
\r
118 public void doMouseMoved(MouseEvent evt)
\r
121 int x = evt.getX();
\r
122 int y = evt.getY();
\r
123 if(av.wrapAlignment)
\r
125 y -= 2*av.charHeight;
\r
126 int chunkHeight = (av.getAlignment().getHeight()+2)*av.charHeight;
\r
129 res = (int)((y/chunkHeight)*(getWidth()/av.charWidth)) + (int)(x/av.getCharWidth()) + av.getStartRes();
\r
131 System.out.println( ((y/chunkHeight)*(getWidth()/av.charWidth)) +" "+((x / av.getCharWidth()) + av.getStartRes()) );
\r
133 seq = y / av.getCharHeight() + av.getStartSeq();
\r
135 // chunkHeight = (da.getHeight() + 2)*charHeight;
\r
136 // startx += chunkWidth;
\r
140 res = (int) (x / av.getCharWidth()) + av.getStartRes();
\r
141 seq = y / av.getCharHeight() + av.getStartSeq();
\r
145 if(seq>=av.getAlignment().getHeight())
\r
148 Object obj = ResidueProperties.aa2Triplet.get( av.getAlignment().getSequenceAt(seq).getCharAt(res)+"" ) ;
\r
151 aa = obj.toString();
\r
153 StringBuffer text = new StringBuffer("Sequence " +(seq+1)+" ID: "+av.getAlignment().getSequenceAt(seq).getName());
\r
155 text.append(" Residue: "+aa+" ("+ av.getAlignment().getSequenceAt(seq).findPosition(res)+")");
\r
157 parent.alignFrame.statusBar.setText(text.toString());
\r
161 public void doMouseDragged(MouseEvent evt) {
\r
162 // If we're dragging we're editing
\r
164 int x = evt.getX();
\r
166 int res = (int)(x/av.getCharWidth()) + av.getStartRes();
\r
167 if (res < 0) {res = 0;}
\r
169 if (res != lastres) {
\r
170 if (startseq != -1) {
\r
173 if (av.getGroupEdit()) {
\r
174 SequenceGroup sg = av.getAlignment().findGroup(startseq);
\r
177 if (res < av.getAlignment().getWidth() && res < lastres)
\r
179 boolean flag = false;
\r
180 for (int i= 0 ; i < sg.getSize(); i++)
\r
182 SequenceI s = (SequenceI)sg.getSequenceAt(i);
\r
183 for (int j=lastres-1; j >= res; j--)
\r
187 if (s.getSequence().charAt(j)!=av.getAlignment().getGapCharacter() &&
\r
188 s.getSequence().charAt(j)==' ')
\r
199 for (int i= 0 ; i < sg.getSize(); i++)
\r
201 SequenceI s = (SequenceI)sg.getSequenceAt(i);
\r
202 boolean found = false;
\r
204 for (int k = 0; k < av.getAlignment().getHeight(); k++)
\r
206 if (av.getAlignment().getSequenceAt(k) == s)
\r
213 if (found && sno != -1) {
\r
214 if (res < av.getAlignment().getWidth() && res > lastres)
\r
216 for (int j = lastres; j < res; j++)
\r
219 int index = av.getAlignment().findIndex(s);
\r
221 drawChars(index,index+1,lastres);
\r
224 } else if (res < av.getAlignment().getWidth() && res < lastres)
\r
226 for (int j = res; j < lastres; j++)
\r
228 deleteChar(j,res,sno);
\r
231 int index = av.getAlignment().findIndex(s);
\r
233 drawChars(index,index+1,res);
\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
248 drawChars(startseq,startseq+1,lastres);
\r
250 } else if (res < av.getAlignment().getWidth() && res < lastres)
\r
253 // dragging to the left
\r
254 for (int j = res; j < lastres; j++) {
\r
255 deleteChar(j,res,startseq);
\r
258 drawChars(startseq,startseq+1,res);
\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
274 public void insertChar(int j, int seq)
\r
276 av.getAlignment().getSequenceAt(seq).insertCharAt(j, av.getGapCharacter());
\r
277 seqEditOccurred=seq;
\r
280 public void deleteChar(int j, int res, int seq)
\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
287 av.getAlignment().getSequenceAt(seq).deleteCharAt(j);
\r
290 av.getAlignment().getWidth();
\r
292 seqEditOccurred=seq;
\r
296 void updateConservation(int i)
\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
303 Conservation c = sg.getConservation();
\r
305 c = new Conservation("All", al.cons,
\r
306 ResidueProperties.propHash, 3, sg.sequences, 0,
\r
309 c.verdict(false, 100);
\r
310 sg.setConservation(c);
\r
311 ConservationColourScheme ccs = (ConservationColourScheme)sg.cs;
\r
316 public void setColourScheme(ColourSchemeI cs, boolean showConservation)
\r
318 seqCanvas.paintFlag = true;
\r
319 if (av.getSelection().size() == 0)
\r
322 for (int i = 0; i < av.alignment.getGroups().size();i++)
\r
324 SequenceGroup sg = (SequenceGroup)av.alignment.getGroups().elementAt(i);
\r
326 if(!showConservation
\r
327 && !(sg.cs instanceof Blosum62ColourScheme)
\r
328 && sg.cs instanceof ConservationColourScheme)
\r
330 // remove ConservationColouring from existing Conservation group
\r
331 ConservationColourScheme ccs = (ConservationColourScheme)sg.cs;
\r
334 else if(showConservation && !(sg.cs instanceof ConservationColourScheme))
\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
343 c.verdict(false, 100);
\r
344 sg.setConservation(c);
\r
345 sg.cs = new ConservationColourScheme(sg);
\r
351 SequenceGroup sg = av.alignment.findGroup((Sequence)av.sel.sequenceAt(0));
\r
353 if( isNewSelection(sg) )
\r
355 sg = av.getAlignment().addGroup();
\r
356 for (int i=0; i < av.getSelection().size(); i++)
\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
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
373 Conservation c = sg.getConservation();
\r
374 Alignment al = (Alignment) av.getAlignment();
\r
376 c = new Conservation("All", al.cons,
\r
377 ResidueProperties.propHash, 3, sg.sequences, 0,
\r
380 c.verdict(false, 100);
\r
381 sg.setConservation(c);
\r
382 sg.cs = new ConservationColourScheme(sg);
\r
384 else if( !showConservation && sg.cs instanceof ConservationColourScheme)
\r
386 ConservationColourScheme ccs = (ConservationColourScheme)sg.cs;
\r
393 boolean isNewSelection(SequenceGroup sg)
\r
395 if(sg.getSize()!=av.getSelection().size())
\r
398 for(int i=0; i<sg.getSize(); i++)
\r
399 if( !av.getSelection().contains( sg.getSequenceAt(i) ))
\r
406 public ColourSchemeI getColourScheme()
\r
408 if(av.getSelection().size()>0)
\r
409 return av.alignment.findGroup((Sequence)av.sel.sequenceAt(0)).cs;
\r
411 return seqCanvas.cs;
\r