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 doMousePressedDefineMode(MouseEvent evt)
\r
333 int res = evt.getX()/av.getCharWidth() + av.getStartRes();
\r
334 int seq = evt.getY()/av.getCharHeight() + av.getStartSeq();
\r
336 stretchGroup = av.getRubberbandGroup();
\r
337 if(stretchGroup == null)
\r
338 stretchGroup = av.alignment.findGroup((Sequence)av.getAlignment().getSequenceAt(seq));
\r
339 else if(!stretchGroup.sequences.contains((Sequence)av.getAlignment().getSequenceAt(seq))
\r
340 || stretchGroup.getStartRes()<res
\r
341 || stretchGroup.getEndRes()>res)
\r
343 System.out.println(stretchGroup.getStartRes()+" "+stretchGroup.getEndRes()+" "+res);
\r
344 stretchGroup = null;
\r
349 if(stretchGroup==null)
\r
351 // define a new group here
\r
352 SequenceGroup sg = new SequenceGroup();
\r
353 sg.setStartRes(res);
\r
355 sg.addSequence( (Sequence)av.getAlignment().getSequenceAt(seq) );
\r
356 av.setRubberbandGroup( sg );
\r
358 System.out.println("new rubberband group");
\r
360 else if( javax.swing.SwingUtilities.isRightMouseButton(evt))
\r
362 // edit the properties of existing group
\r
365 if(stretchGroup!=null && stretchGroup.getEndRes()==res)
\r
367 // Edit end res position of selected group
\r
368 changeEndRes = true;
\r
370 if(stretchGroup!=null && stretchGroup.getStartRes()==res)
\r
372 // Edit end res position of selected group
\r
373 changeStartRes = true;
\r
376 seqCanvas.paintFlag = true;
\r
382 boolean changeEndSeq = false;
\r
383 boolean changeStartSeq = false;
\r
384 boolean changeEndRes = false;
\r
385 boolean changeStartRes = false;
\r
386 SequenceGroup stretchGroup = null;
\r
389 public void doMouseReleasedDefineMode(MouseEvent evt)
\r
391 changeEndRes = false;
\r
392 changeStartRes = false;
\r
393 stretchGroup = null;
\r
396 public void doMouseDraggedDefineMode(MouseEvent evt)
\r
398 int res = evt.getX()/av.getCharWidth() + av.getStartRes();
\r
399 Sequence seq = (Sequence)av.getAlignment().getSequenceAt(
\r
400 evt.getY()/av.getCharHeight() + av.getStartSeq());
\r
402 // SequenceGroup newSeqGroup = av.alignment.findGroup(seq);
\r
404 if(res<av.getStartRes())
\r
405 res = av.getStartRes();
\r
406 else if(res>av.getEndRes())
\r
407 res = av.getEndRes();
\r
411 if(res>stretchGroup.getStartRes()-1)
\r
412 stretchGroup.setEndRes( res );
\r
414 else if(changeStartRes)
\r
416 if(res<stretchGroup.getEndRes()+1)
\r
417 stretchGroup.setStartRes( res );
\r
420 /* if(newSeqGroup != stretchGroup)
\r
422 if(newSeqGroup !=null)
\r
423 av.getAlignment().removeFromGroup(newSeqGroup, seq );
\r
425 if(stretchGroup!=null)
\r
426 stretchGroup.addSequence( seq );
\r
429 seqCanvas.paintFlag = true;
\r