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
44 public void mouseDragged(MouseEvent evt)
\r
46 if(evt.isShiftDown() || evt.isControlDown())
\r
47 doMouseDragged(evt);
\r
49 doMouseDraggedDefineMode(evt);
\r
53 addMouseListener( new MouseAdapter()
\r
55 public void mouseReleased(MouseEvent evt)
\r
57 if(evt.isShiftDown() || evt.isControlDown())
\r
58 doMouseReleased(evt);
\r
60 doMouseReleasedDefineMode(evt);
\r
62 public void mousePressed(MouseEvent evt)
\r
64 if(evt.isShiftDown() || evt.isControlDown())
\r
65 doMousePressed(evt);
\r
67 doMousePressedDefineMode(evt);
\r
75 public void doMouseReleased(MouseEvent evt) {
\r
78 int res = x/av.getCharWidth() + av.getStartRes();
\r
82 // This is to detect edits - we're at the end of an edit if mouse is up
\r
87 if(seqEditOccurred>-1)
\r
88 updateConservation(seqEditOccurred);
\r
90 seqEditOccurred = -1;
\r
92 parent.RefreshPanels();
\r
97 public void doMousePressed(MouseEvent evt) {
\r
98 parent.alignFrame.addHistoryItem("sequence edit");
\r
102 int x = evt.getX();
\r
103 int y = evt.getY();
\r
105 res = x/av.getCharWidth() + av.getStartRes();
\r
106 seq = y/av.getCharHeight() + av.getStartSeq();
\r
108 if (seq < av.getAlignment().getHeight() && res < av.getAlignment().getSequenceAt(seq).getLength())
\r
110 //char resstr = align.getSequenceAt(seq).getSequence().charAt(res);
\r
111 // Find the residue's position in the sequence (res is the position
\r
112 // in the alignment
\r
116 if (startseq == (av.getAlignment().getHeight()-1)) {
\r
134 public void doMouseMoved(MouseEvent evt)
\r
137 int x = evt.getX();
\r
138 int y = evt.getY();
\r
139 if(av.wrapAlignment)
\r
141 y -= 2*av.charHeight;
\r
142 int chunkHeight = (av.getAlignment().getHeight()+2)*av.charHeight;
\r
145 res = (int)((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
180 int x = evt.getX();
\r
182 int res = x/av.getCharWidth() + av.getStartRes();
\r
183 if (res < 0) {res = 0;}
\r
185 if (res != lastres) {
\r
186 if (startseq != -1) {
\r
189 if (evt.isControlDown()) {
\r
190 SequenceGroup sg = av.getAlignment().findGroup(startseq);
\r
193 if (res < av.getAlignment().getWidth() && res < lastres)
\r
195 boolean flag = false;
\r
196 for (int i= 0 ; i < sg.getSize(); i++)
\r
198 SequenceI s = (SequenceI)sg.getSequenceAt(i);
\r
199 for (int j=lastres-1; j >= res; j--)
\r
203 if (s.getSequence().charAt(j)!=av.getAlignment().getGapCharacter() &&
\r
204 s.getSequence().charAt(j)==' ')
\r
215 for (int i= 0 ; i < sg.getSize(); i++)
\r
217 SequenceI s = (SequenceI)sg.getSequenceAt(i);
\r
218 boolean found = false;
\r
220 for (int k = 0; k < av.getAlignment().getHeight(); k++)
\r
222 if (av.getAlignment().getSequenceAt(k) == s)
\r
229 if (found && sno != -1) {
\r
230 if (res < av.getAlignment().getWidth() && res > lastres)
\r
232 for (int j = lastres; j < res; j++)
\r
235 int index = av.getAlignment().findIndex(s);
\r
237 drawChars(index,index+1,lastres);
\r
240 } else if (res < av.getAlignment().getWidth() && res < lastres)
\r
242 for (int j = res; j < lastres; j++)
\r
244 deleteChar(j,res,sno);
\r
247 int index = av.getAlignment().findIndex(s);
\r
249 drawChars(index,index+1,res);
\r
259 if (res < av.getAlignment().getWidth() && res > lastres) {
\r
260 // dragging to the right
\r
261 for (int j = lastres; j < res; j++)
\r
262 insertChar(j,startseq);
\r
264 drawChars(startseq,startseq+1,lastres);
\r
266 } else if (res < av.getAlignment().getWidth() && res < lastres)
\r
269 // dragging to the left
\r
270 for (int j = res; j < lastres; j++) {
\r
271 deleteChar(j,res,startseq);
\r
274 drawChars(startseq,startseq+1,res);
\r
285 public void drawChars(int seqstart, int seqend, int start) {
\r
286 seqCanvas.drawPanel(seqCanvas.gg, start,av.getEndRes(),seqstart,seqend,av.getStartRes(),av.getStartSeq(),0);
\r
290 public void insertChar(int j, int seq)
\r
292 av.getAlignment().getSequenceAt(seq).insertCharAt(j, av.getGapCharacter());
\r
293 seqEditOccurred=seq;
\r
296 public void deleteChar(int j, int res, int seq)
\r
299 if (av.getAlignment().getSequenceAt(seq).getSequence().charAt(j)=='.' ||
\r
300 av.getAlignment().getSequenceAt(seq).getSequence().charAt(j)=='-' ||
\r
301 av.getAlignment().getSequenceAt(seq).getSequence().charAt(j)==' ' )
\r
303 av.getAlignment().getSequenceAt(seq).deleteCharAt(j);
\r
306 av.getAlignment().getWidth();
\r
308 seqEditOccurred=seq;
\r
312 void updateConservation(int i)
\r
314 /* Alignment al = (Alignment) av.getAlignment();
\r
315 SequenceGroup sg = av.alignment.findGroup( al.getSequenceAt(i));
\r
316 if(sg==null || !(sg.cs instanceof ConservationColourScheme))
\r
319 Conservation c = sg.getConservation();
\r
321 c = new Conservation("All", al.cons,
\r
322 ResidueProperties.propHash, 3, sg.sequences, 0,
\r
325 c.verdict(false, 100);
\r
326 sg.setConservation(c);
\r
327 ConservationColourScheme ccs = (ConservationColourScheme)sg.cs;
\r
328 ccs.conserve = c;*/
\r
333 public void doMousePressedDefineMode(MouseEvent evt)
\r
335 int res = evt.getX()/av.getCharWidth() + av.getStartRes();
\r
336 int seq = evt.getY()/av.getCharHeight() + av.getStartSeq();
\r
339 stretchGroup = av.getRubberbandGroup();
\r
341 if(stretchGroup == null)
\r
342 stretchGroup = av.alignment.findGroup((Sequence)av.getAlignment().getSequenceAt(seq));
\r
344 else if(!stretchGroup.sequences.contains((Sequence)av.getAlignment().getSequenceAt(seq))
\r
345 || stretchGroup.getStartRes()>res
\r
346 || stretchGroup.getEndRes()<res)
\r
348 stretchGroup = null;
\r
351 if(stretchGroup==null)
\r
353 // define a new group here
\r
354 SequenceGroup sg = new SequenceGroup();
\r
355 sg.setStartRes(res);
\r
357 sg.addSequence( (Sequence)av.getAlignment().getSequenceAt(seq) );
\r
358 av.setRubberbandGroup( sg );
\r
361 else if( javax.swing.SwingUtilities.isRightMouseButton(evt))
\r
363 jalview.gui.PopupMenu pop = new jalview.gui.PopupMenu( parent , null);
\r
364 pop.show(this, evt.getX(), evt.getY());
\r
366 // edit the properties of existing group
\r
369 if(stretchGroup!=null && stretchGroup.getEndRes()==res)
\r
370 // Edit end res position of selected group
\r
371 changeEndRes = true;
\r
373 else if(stretchGroup!=null && stretchGroup.getStartRes()==res)
\r
374 // Edit end res position of selected group
\r
375 changeStartRes = true;
\r
378 seqCanvas.paintFlag = true;
\r
384 boolean changeEndSeq = false;
\r
385 boolean changeStartSeq = false;
\r
386 boolean changeEndRes = false;
\r
387 boolean changeStartRes = false;
\r
388 SequenceGroup stretchGroup = null;
\r
390 public void doMouseReleasedDefineMode(MouseEvent evt)
\r
392 changeEndRes = false;
\r
393 changeStartRes = false;
\r
394 stretchGroup = null;
\r
398 boolean remove = false;
\r
399 public void doMouseDraggedDefineMode(MouseEvent evt)
\r
401 int res = evt.getX()/av.getCharWidth() + av.getStartRes();
\r
402 int y = evt.getY()/av.getCharHeight() + av.getStartSeq();
\r
405 if(stretchGroup.getEndRes()==res)
\r
406 // Edit end res position of selected group
\r
407 changeEndRes = true;
\r
409 else if(stretchGroup.getStartRes()==res)
\r
410 // Edit end res position of selected group
\r
411 changeStartRes = true;
\r
414 if(res<av.getStartRes())
\r
415 res = av.getStartRes();
\r
416 else if(res>av.getEndRes())
\r
417 res = av.getEndRes();
\r
421 if(res>stretchGroup.getStartRes()-1)
\r
422 stretchGroup.setEndRes( res );
\r
424 else if(changeStartRes)
\r
426 if(res<stretchGroup.getEndRes()+1)
\r
427 stretchGroup.setStartRes( res );
\r
431 int dragDirection = 0;
\r
434 else if (y < oldSeq)
\r
435 dragDirection = -1;
\r
437 while (y != oldSeq)
\r
439 // This routine ensures we don't skip any sequences, as the
\r
440 // selection is quite slow.
\r
441 Sequence seq = (Sequence) av.getAlignment().getSequenceAt(oldSeq);
\r
443 oldSeq += dragDirection;
\r
444 Sequence nextSeq = (Sequence) av.getAlignment().getSequenceAt(oldSeq);
\r
446 if (stretchGroup.sequences.contains(nextSeq))
\r
448 stretchGroup.deleteSequence(seq);
\r
449 stretchGroup.deleteSequence(nextSeq);
\r
453 stretchGroup.addSequence(seq);
\r
454 stretchGroup.addSequence(nextSeq);
\r
459 seqCanvas.paintFlag = true;
\r