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 avp, AlignmentPanel p) {
\r
33 seqCanvas = new SeqCanvas(avp);
\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
45 if(av.groupDefiningMode)
\r
46 doMouseDraggedDefineMode(evt);
\r
48 doMouseDragged(evt);
\r
52 addMouseListener( new MouseAdapter()
\r
54 public void mouseReleased(MouseEvent evt)
\r
56 if(av.groupDefiningMode)
\r
57 doMouseReleasedDefineMode(evt);
\r
59 doMouseReleased(evt);
\r
61 public void mousePressed(MouseEvent evt)
\r
63 if(av.groupDefiningMode)
\r
64 doMousePressedDefineMode(evt);
\r
66 doMousePressed(evt);
\r
74 public void doMouseReleased(MouseEvent evt) {
\r
77 int res = x/av.getCharWidth() + av.getStartRes();
\r
81 // This is to detect edits - we're at the end of an edit if mouse is up
\r
86 if(seqEditOccurred>-1)
\r
87 updateConservation(seqEditOccurred);
\r
89 seqEditOccurred = -1;
\r
91 parent.RefreshPanels();
\r
96 public void doMousePressed(MouseEvent evt) {
\r
97 parent.alignFrame.addHistoryItem("sequence edit");
\r
101 int x = evt.getX();
\r
102 int y = evt.getY();
\r
104 res = x/av.getCharWidth() + av.getStartRes();
\r
105 seq = y/av.getCharHeight() + av.getStartSeq();
\r
107 if (seq < av.getAlignment().getHeight() && res < av.getAlignment().getSequenceAt(seq).getLength())
\r
109 //char resstr = align.getSequenceAt(seq).getSequence().charAt(res);
\r
110 // Find the residue's position in the sequence (res is the position
\r
111 // in the alignment
\r
115 if (startseq == (av.getAlignment().getHeight()-1)) {
\r
133 public void doMouseMoved(MouseEvent evt)
\r
136 int x = evt.getX();
\r
137 int y = evt.getY();
\r
138 if(av.wrapAlignment)
\r
140 y -= 2*av.charHeight;
\r
141 int chunkHeight = (av.getAlignment().getHeight()+2)*av.charHeight;
\r
144 res = (int)((y/chunkHeight)*(getWidth()/av.charWidth)) + x/av.getCharWidth() + av.getStartRes();
\r
146 System.out.println( ((y/chunkHeight)*(getWidth()/av.charWidth)) +" "+((x / av.getCharWidth()) + av.getStartRes()) );
\r
148 seq = y / av.getCharHeight() + av.getStartSeq();
\r
150 // chunkHeight = (da.getHeight() + 2)*charHeight;
\r
151 // startx += chunkWidth;
\r
155 res = x / av.getCharWidth() + av.getStartRes();
\r
156 seq = y / av.getCharHeight() + av.getStartSeq();
\r
160 if(seq>=av.getAlignment().getHeight())
\r
163 Object obj = ResidueProperties.aa2Triplet.get( av.getAlignment().getSequenceAt(seq).getCharAt(res)+"" ) ;
\r
166 aa = obj.toString();
\r
168 StringBuffer text = new StringBuffer("Sequence " +(seq+1)+" ID: "+av.getAlignment().getSequenceAt(seq).getName());
\r
170 text.append(" Residue: "+aa+" ("+ av.getAlignment().getSequenceAt(seq).findPosition(res)+")");
\r
172 parent.alignFrame.statusBar.setText(text.toString());
\r
176 public void doMouseDragged(MouseEvent evt) {
\r
177 // If we're dragging we're editing
\r
179 int x = evt.getX();
\r
181 int res = x/av.getCharWidth() + av.getStartRes();
\r
182 if (res < 0) {res = 0;}
\r
184 if (res != lastres) {
\r
185 if (startseq != -1) {
\r
188 if (av.getGroupEdit()) {
\r
189 SequenceGroup sg = av.getAlignment().findGroup(startseq);
\r
192 if (res < av.getAlignment().getWidth() && res < lastres)
\r
194 boolean flag = false;
\r
195 for (int i= 0 ; i < sg.getSize(); i++)
\r
197 SequenceI s = (SequenceI)sg.getSequenceAt(i);
\r
198 for (int j=lastres-1; j >= res; j--)
\r
202 if (s.getSequence().charAt(j)!=av.getAlignment().getGapCharacter() &&
\r
203 s.getSequence().charAt(j)==' ')
\r
214 for (int i= 0 ; i < sg.getSize(); i++)
\r
216 SequenceI s = (SequenceI)sg.getSequenceAt(i);
\r
217 boolean found = false;
\r
219 for (int k = 0; k < av.getAlignment().getHeight(); k++)
\r
221 if (av.getAlignment().getSequenceAt(k) == s)
\r
228 if (found && sno != -1) {
\r
229 if (res < av.getAlignment().getWidth() && res > lastres)
\r
231 for (int j = lastres; j < res; j++)
\r
234 int index = av.getAlignment().findIndex(s);
\r
236 drawChars(index,index+1,lastres);
\r
239 } else if (res < av.getAlignment().getWidth() && res < lastres)
\r
241 for (int j = res; j < lastres; j++)
\r
243 deleteChar(j,res,sno);
\r
246 int index = av.getAlignment().findIndex(s);
\r
248 drawChars(index,index+1,res);
\r
258 if (res < av.getAlignment().getWidth() && res > lastres) {
\r
259 // dragging to the right
\r
260 for (int j = lastres; j < res; j++)
\r
261 insertChar(j,startseq);
\r
263 drawChars(startseq,startseq+1,lastres);
\r
265 } else if (res < av.getAlignment().getWidth() && res < lastres)
\r
268 // dragging to the left
\r
269 for (int j = res; j < lastres; j++) {
\r
270 deleteChar(j,res,startseq);
\r
273 drawChars(startseq,startseq+1,res);
\r
284 public void drawChars(int seqstart, int seqend, int start) {
\r
285 seqCanvas.drawPanel(seqCanvas.gg, start,av.getEndRes(),seqstart,seqend,av.getStartRes(),av.getStartSeq(),0);
\r
289 public void insertChar(int j, int seq)
\r
291 av.getAlignment().getSequenceAt(seq).insertCharAt(j, av.getGapCharacter());
\r
292 seqEditOccurred=seq;
\r
295 public void deleteChar(int j, int res, int seq)
\r
298 if (av.getAlignment().getSequenceAt(seq).getSequence().charAt(j)=='.' ||
\r
299 av.getAlignment().getSequenceAt(seq).getSequence().charAt(j)=='-' ||
\r
300 av.getAlignment().getSequenceAt(seq).getSequence().charAt(j)==' ' )
\r
302 av.getAlignment().getSequenceAt(seq).deleteCharAt(j);
\r
305 av.getAlignment().getWidth();
\r
307 seqEditOccurred=seq;
\r
311 void updateConservation(int i)
\r
313 Alignment al = (Alignment) av.getAlignment();
\r
314 SequenceGroup sg = av.alignment.findGroup( al.getSequenceAt(i));
\r
315 if(sg==null || !(sg.cs instanceof ConservationColourScheme))
\r
318 Conservation c = sg.getConservation();
\r
320 c = new Conservation("All", al.cons,
\r
321 ResidueProperties.propHash, 3, sg.sequences, 0,
\r
324 c.verdict(false, 100);
\r
325 sg.setConservation(c);
\r
326 ConservationColourScheme ccs = (ConservationColourScheme)sg.cs;
\r
331 public void setColourScheme(ColourSchemeI cs, boolean showConservation)
\r
333 seqCanvas.paintFlag = true;
\r
334 if (av.getSelection().size() == 0)
\r
336 seqCanvas.globalColorScheme = cs;
\r
337 for (int i = 0; i < av.alignment.getGroups().size();i++)
\r
339 SequenceGroup sg = (SequenceGroup)av.alignment.getGroups().elementAt(i);
\r
341 if(!showConservation
\r
342 && !(sg.cs instanceof Blosum62ColourScheme)
\r
343 && sg.cs instanceof ConservationColourScheme)
\r
345 // remove ConservationColouring from existing Conservation group
\r
346 ConservationColourScheme ccs = (ConservationColourScheme)sg.cs;
\r
349 else if(showConservation && !(sg.cs instanceof ConservationColourScheme))
\r
351 // add ConservationColouring to new group
\r
352 Conservation c = sg.getConservation();
\r
353 Alignment al = (Alignment) av.getAlignment();
\r
354 c = new Conservation("All", al.cons,
\r
355 ResidueProperties.propHash, 3, sg.sequences, 0,
\r
358 c.verdict(false, 100);
\r
359 sg.setConservation(c);
\r
360 sg.cs = new ConservationColourScheme(sg);
\r
366 SequenceGroup sg = av.alignment.findGroup((Sequence)av.sel.sequenceAt(0));
\r
368 if( isNewSelection(sg) )
\r
370 sg = av.getAlignment().addGroup();
\r
371 for (int i=0; i < av.getSelection().size(); i++)
\r
373 av.alignment.removeFromGroup(av.alignment.findGroup( (Sequence) av.
\r
374 sel.sequenceAt(i)),
\r
375 (Sequence) av.sel.sequenceAt(i));
\r
376 av.alignment.addToGroup(sg, (Sequence) av.sel.sequenceAt(i));
\r
383 // Selection is made, we only want to change the conservationColour for selected group
\r
384 if( showConservation
\r
385 && !(sg.cs instanceof ConservationColourScheme)
\r
386 && !(sg.cs instanceof Blosum62ColourScheme))
\r
388 Conservation c = sg.getConservation();
\r
389 Alignment al = (Alignment) av.getAlignment();
\r
391 c = new Conservation("All", al.cons,
\r
392 ResidueProperties.propHash, 3, sg.sequences, 0,
\r
395 c.verdict(false, 100);
\r
396 sg.setConservation(c);
\r
397 sg.cs = new ConservationColourScheme(sg);
\r
399 else if( !showConservation && sg.cs instanceof ConservationColourScheme)
\r
401 ConservationColourScheme ccs = (ConservationColourScheme)sg.cs;
\r
408 boolean isNewSelection(SequenceGroup sg)
\r
413 if(sg.getSize()!=av.getSelection().size())
\r
416 for(int i=0; i<sg.getSize(); i++)
\r
417 if( !av.getSelection().contains( sg.getSequenceAt(i) ))
\r
424 public ColourSchemeI getColourScheme()
\r
426 if(av.getSelection().size()>0)
\r
427 return av.alignment.findGroup((Sequence)av.sel.sequenceAt(0)).cs;
\r
429 return seqCanvas.globalColorScheme;
\r
432 public void doMousePressedDefineMode(MouseEvent evt)
\r
434 int res = evt.getX()/av.getCharWidth() + av.getStartRes();
\r
435 int seq = evt.getY()/av.getCharHeight() + av.getStartSeq();
\r
437 stretchGroup = av.alignment.findGroup((Sequence)av.getAlignment().getSequenceAt(seq));
\r
439 if(stretchGroup!=null && stretchGroup.getEndRes()==res)
\r
441 // Edit end res position of selected group
\r
442 changeEndRes = true;
\r
444 else if(stretchGroup!=null && stretchGroup.getStartRes()==res)
\r
446 // Edit end res position of selected group
\r
447 changeStartRes = true;
\r
453 boolean changeEndRes = false;
\r
454 boolean changeStartRes = false;
\r
455 SequenceGroup stretchGroup = null;
\r
457 public void doMouseReleasedDefineMode(MouseEvent evt)
\r
459 changeEndRes = false;
\r
460 changeStartRes = false;
\r
463 public void doMouseDraggedDefineMode(MouseEvent evt)
\r
465 int res = evt.getX()/av.getCharWidth() + av.getStartRes();
\r
466 int seq = evt.getY()/av.getCharHeight() + av.getStartSeq();
\r
468 if(res<av.getStartRes())
\r
469 res = av.getStartRes();
\r
470 else if(res>av.getEndRes())
\r
471 res = av.getEndRes();
\r
475 if(res>stretchGroup.getStartRes()-1)
\r
476 stretchGroup.setEndRes( res );
\r
478 else if(changeStartRes)
\r
480 if(res<stretchGroup.getEndRes()+1)
\r
481 stretchGroup.setStartRes( res );
\r
483 seqCanvas.paintFlag = true;
\r