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(av.groupDefiningMode)
\r
47 doMouseDraggedDefineMode(evt);
\r
49 doMouseDragged(evt);
\r
53 addMouseListener( new MouseAdapter()
\r
55 public void mouseReleased(MouseEvent evt)
\r
57 if(av.groupDefiningMode)
\r
58 doMouseReleasedDefineMode(evt);
\r
60 doMouseReleased(evt);
\r
62 public void mousePressed(MouseEvent evt)
\r
64 if(av.groupDefiningMode)
\r
65 doMousePressedDefineMode(evt);
\r
67 doMousePressed(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
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
327 ccs.conserve = c;*/
\r
332 public void doMousePressedDefineMode(MouseEvent evt)
\r
334 int res = evt.getX()/av.getCharWidth() + av.getStartRes();
\r
335 int seq = evt.getY()/av.getCharHeight() + av.getStartSeq();
\r
338 stretchGroup = av.getRubberbandGroup();
\r
340 if(stretchGroup == null)
\r
341 stretchGroup = av.alignment.findGroup((Sequence)av.getAlignment().getSequenceAt(seq));
\r
343 else if(!stretchGroup.sequences.contains((Sequence)av.getAlignment().getSequenceAt(seq))
\r
344 || stretchGroup.getStartRes()>res
\r
345 || stretchGroup.getEndRes()<res)
\r
347 stretchGroup = null;
\r
350 if(stretchGroup==null)
\r
352 // define a new group here
\r
353 SequenceGroup sg = new SequenceGroup();
\r
354 sg.setStartRes(res);
\r
356 sg.addSequence( (Sequence)av.getAlignment().getSequenceAt(seq) );
\r
357 av.setRubberbandGroup( sg );
\r
360 else if( javax.swing.SwingUtilities.isRightMouseButton(evt))
\r
362 jalview.gui.PopupMenu pop = new jalview.gui.PopupMenu( av , this);
\r
363 pop.show(this, evt.getX(), evt.getY());
\r
365 // edit the properties of existing group
\r
368 if(stretchGroup!=null && stretchGroup.getEndRes()==res)
\r
369 // Edit end res position of selected group
\r
370 changeEndRes = true;
\r
372 else if(stretchGroup!=null && stretchGroup.getStartRes()==res)
\r
373 // Edit end res position of selected group
\r
374 changeStartRes = true;
\r
377 seqCanvas.paintFlag = true;
\r
383 boolean changeEndSeq = false;
\r
384 boolean changeStartSeq = false;
\r
385 boolean changeEndRes = false;
\r
386 boolean changeStartRes = false;
\r
387 SequenceGroup stretchGroup = null;
\r
389 public void doMouseReleasedDefineMode(MouseEvent evt)
\r
391 changeEndRes = false;
\r
392 changeStartRes = false;
\r
393 stretchGroup = null;
\r
397 boolean remove = false;
\r
398 public void doMouseDraggedDefineMode(MouseEvent evt)
\r
400 int res = evt.getX()/av.getCharWidth() + av.getStartRes();
\r
401 int y = evt.getY()/av.getCharHeight() + av.getStartSeq();
\r
404 if(stretchGroup.getEndRes()==res)
\r
405 // Edit end res position of selected group
\r
406 changeEndRes = true;
\r
408 else if(stretchGroup.getStartRes()==res)
\r
409 // Edit end res position of selected group
\r
410 changeStartRes = true;
\r
413 if(res<av.getStartRes())
\r
414 res = av.getStartRes();
\r
415 else if(res>av.getEndRes())
\r
416 res = av.getEndRes();
\r
420 if(res>stretchGroup.getStartRes()-1)
\r
421 stretchGroup.setEndRes( res );
\r
423 else if(changeStartRes)
\r
425 if(res<stretchGroup.getEndRes()+1)
\r
426 stretchGroup.setStartRes( res );
\r
430 int dragDirection = 0;
\r
433 else if (y < oldSeq)
\r
434 dragDirection = -1;
\r
436 while (y != oldSeq)
\r
438 // This routine ensures we don't skip any sequences, as the
\r
439 // selection is quite slow.
\r
440 Sequence seq = (Sequence) av.getAlignment().getSequenceAt(oldSeq);
\r
442 oldSeq += dragDirection;
\r
443 Sequence nextSeq = (Sequence) av.getAlignment().getSequenceAt(oldSeq);
\r
445 if (stretchGroup.sequences.contains(nextSeq))
\r
447 stretchGroup.deleteSequence(seq);
\r
448 stretchGroup.deleteSequence(nextSeq);
\r
452 stretchGroup.addSequence(seq);
\r
453 stretchGroup.addSequence(nextSeq);
\r
458 seqCanvas.paintFlag = true;
\r