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 public SeqPanel(AlignViewport av, AlignmentPanel p) {
\r
30 seqCanvas = new SeqCanvas(av);
\r
31 setLayout(new BorderLayout());
\r
32 add(seqCanvas, BorderLayout.CENTER);
\r
36 addMouseMotionListener( new MouseMotionAdapter()
\r
38 public void mouseMoved(MouseEvent evt)
\r
39 { doMouseMoved(evt); }
\r
40 public void mouseDragged(MouseEvent evt)
\r
41 { doMouseDragged(evt); }
\r
44 addMouseListener( new MouseAdapter()
\r
46 public void mouseReleased(MouseEvent evt)
\r
47 { doMouseReleased(evt); }
\r
48 public void mousePressed(MouseEvent evt)
\r
49 { doMousePressed(evt); }
\r
56 public void doMouseReleased(MouseEvent evt) {
\r
59 int res = (int)(x/av.getCharWidth()) + av.getStartRes();
\r
63 // This is to detect edits - we're at the end of an edit if mouse is up
\r
69 parent.RefreshPanels();
\r
74 public void doMousePressed(MouseEvent evt) {
\r
75 parent.alignFrame.addHistoryItem("sequence edit");
\r
82 res = (int)(x/av.getCharWidth()) + av.getStartRes();
\r
83 seq = (y)/av.getCharHeight() + av.getStartSeq();
\r
85 if (seq < av.getAlignment().getHeight() && res < av.getAlignment().getSequenceAt(seq).getLength())
\r
87 //char resstr = align.getSequenceAt(seq).getSequence().charAt(res);
\r
88 // Find the residue's position in the sequence (res is the position
\r
93 if (startseq == (av.getAlignment().getHeight()-1)) {
\r
111 public void doMouseMoved(MouseEvent evt)
\r
114 int x = evt.getX();
\r
115 int y = evt.getY();
\r
116 if(av.wrapAlignment)
\r
118 y -= 2*av.charHeight;
\r
119 int chunkHeight = (av.getAlignment().getHeight()+2)*av.charHeight;
\r
122 res = (int)((y/chunkHeight)*(getWidth()/av.charWidth)) + (int)(x/av.getCharWidth()) + av.getStartRes();
\r
124 System.out.println( ((y/chunkHeight)*(getWidth()/av.charWidth)) +" "+((x / av.getCharWidth()) + av.getStartRes()) );
\r
126 seq = y / av.getCharHeight() + av.getStartSeq();
\r
128 // chunkHeight = (da.getHeight() + 2)*charHeight;
\r
129 // startx += chunkWidth;
\r
133 res = (int) (x / av.getCharWidth()) + av.getStartRes();
\r
134 seq = y / av.getCharHeight() + av.getStartSeq();
\r
138 if(seq>=av.getAlignment().getHeight())
\r
141 Object obj = ResidueProperties.aa2Triplet.get( av.getAlignment().getSequenceAt(seq).getCharAt(res)+"" ) ;
\r
144 aa = obj.toString();
\r
146 StringBuffer text = new StringBuffer("Sequence " +(seq+1)+" ID: "+av.getAlignment().getSequenceAt(seq).getName());
\r
148 text.append(" Residue: "+aa+" ("+ av.getAlignment().getSequenceAt(seq).findPosition(res)+")");
\r
150 parent.alignFrame.statusBar.setText(text.toString());
\r
154 public void doMouseDragged(MouseEvent evt) {
\r
155 // If we're dragging we're editing
\r
157 int x = evt.getX();
\r
159 int res = (int)(x/av.getCharWidth()) + av.getStartRes();
\r
160 if (res < 0) {res = 0;}
\r
162 if (res != lastres) {
\r
163 if (startseq != -1) {
\r
166 if (av.getGroupEdit()) {
\r
167 SequenceGroup sg = av.getAlignment().findGroup(startseq);
\r
170 if (res < av.getAlignment().getWidth() && res < lastres)
\r
172 boolean flag = false;
\r
173 for (int i= 0 ; i < sg.getSize(); i++)
\r
175 SequenceI s = (SequenceI)sg.getSequenceAt(i);
\r
176 for (int j=lastres-1; j >= res; j--)
\r
180 if (!s.getSequence().substring(j,j+1).equals(av.getAlignment().getGapCharacter()) &&
\r
181 !s.getSequence().substring(j,j+1).equals(" "))
\r
192 for (int i= 0 ; i < sg.getSize(); i++)
\r
194 SequenceI s = (SequenceI)sg.getSequenceAt(i);
\r
195 boolean found = false;
\r
197 for (int k = 0; k < av.getAlignment().getHeight(); k++)
\r
199 if (av.getAlignment().getSequenceAt(k) == s)
\r
206 if (found && sno != -1) {
\r
207 if (res < av.getAlignment().getWidth() && res > lastres)
\r
209 for (int j = lastres; j < res; j++)
\r
212 int index = av.getAlignment().findIndex(s);
\r
214 drawChars(index,index+1,lastres);
\r
217 } else if (res < av.getAlignment().getWidth() && res < lastres)
\r
219 for (int j = res; j < lastres; j++)
\r
221 deleteChar(j,res,sno);
\r
224 int index = av.getAlignment().findIndex(s);
\r
226 drawChars(index,index+1,res);
\r
236 if (res < av.getAlignment().getWidth() && res > lastres) {
\r
237 // dragging to the right
\r
238 for (int j = lastres; j < res; j++)
\r
239 insertChar(j,startseq);
\r
241 drawChars(startseq,startseq+1,lastres);
\r
243 } else if (res < av.getAlignment().getWidth() && res < lastres)
\r
246 // dragging to the left
\r
247 for (int j = res; j < lastres; j++) {
\r
248 deleteChar(j,res,startseq);
\r
251 drawChars(startseq,startseq+1,res);
\r
262 public void drawChars(int seqstart, int seqend, int start) {
\r
263 seqCanvas.drawPanel(seqCanvas.gg, start,av.getEndRes(),seqstart,seqend,av.getStartRes(),av.getStartSeq(),0);
\r
267 public void insertChar(int j, int seq)
\r
269 av.getAlignment().getSequenceAt(seq).insertCharAt(j, av.getGapCharacter().charAt(0));
\r
270 updateConservation(seq);
\r
273 public void deleteChar(int j, int res, int sno)
\r
276 if (av.getAlignment().getSequenceAt(sno).getSequence().substring(j,j+1).equals(".") ||
\r
277 av.getAlignment().getSequenceAt(sno).getSequence().substring(j,j+1).equals("-") ||
\r
278 av.getAlignment().getSequenceAt(sno).getSequence().substring(j,j+1).equals(" ") )
\r
280 av.getAlignment().getSequenceAt(sno).deleteCharAt(j);
\r
282 updateConservation(sno);
\r
283 av.getAlignment().getWidth();
\r
288 void updateConservation(int i)
\r
291 Alignment al = (Alignment) av.getAlignment();
\r
292 SequenceGroup sg = av.alignment.findGroup( al.getSequenceAt(i));
\r
293 if(sg==null || !(sg.cs instanceof ConservationColourScheme))
\r
296 Conservation c = sg.getConservation();
\r
298 c = new Conservation("All", al.cons,
\r
299 ResidueProperties.propHash, 3, sg.sequences, 0,
\r
302 c.verdict(false, 100);
\r
303 sg.setConservation(c);
\r
304 ConservationColourScheme ccs = (ConservationColourScheme)sg.cs;
\r
306 // sg.cs = new ConservationColourScheme(sg);
\r
309 public void setColourScheme(ColourSchemeI cs, boolean showConservation)
\r
311 if (av.getSelection().size() == 0)
\r
314 for (int i = 0; i < av.alignment.getGroups().size();i++)
\r
316 SequenceGroup sg = (SequenceGroup)av.alignment.getGroups().elementAt(i);
\r
318 if(!showConservation
\r
319 && !(sg.cs instanceof Blosum62ColourScheme)
\r
320 && sg.cs instanceof ConservationColourScheme)
\r
322 // remove ConservationColouring from existing Conservation group
\r
323 ConservationColourScheme ccs = (ConservationColourScheme)sg.cs;
\r
326 else if(showConservation && !(sg.cs instanceof ConservationColourScheme))
\r
328 // add ConservationColouring to new group
\r
329 Conservation c = sg.getConservation();
\r
330 Alignment al = (Alignment) av.getAlignment();
\r
331 c = new Conservation("All", al.cons,
\r
332 ResidueProperties.propHash, 3, sg.sequences, 0,
\r
335 c.verdict(false, 100);
\r
336 sg.setConservation(c);
\r
337 sg.cs = new ConservationColourScheme(sg);
\r
345 SequenceGroup sg = av.alignment.addGroup();
\r
348 for (int i=0; i < av.getSelection().size(); i++)
\r
350 av.alignment.removeFromGroup(av.alignment.findGroup((Sequence)av.sel.sequenceAt(i)),
\r
351 (Sequence)av.sel.sequenceAt(i));
\r
352 av.alignment.addToGroup(sg,(Sequence)av.sel.sequenceAt(i));
\r
355 // Selection is made, we only want to change the conservationColour for selected group
\r
356 if( showConservation
\r
357 && !(sg.cs instanceof ConservationColourScheme)
\r
358 && !(sg.cs instanceof Blosum62ColourScheme))
\r
360 Conservation c = sg.getConservation();
\r
361 Alignment al = (Alignment) av.getAlignment();
\r
363 c = new Conservation("All", al.cons,
\r
364 ResidueProperties.propHash, 3, sg.sequences, 0,
\r
367 c.verdict(false, 100);
\r
368 sg.setConservation(c);
\r
369 sg.cs = new ConservationColourScheme(sg);
\r
371 else if( !showConservation && sg.cs instanceof ConservationColourScheme)
\r
373 ConservationColourScheme ccs = (ConservationColourScheme)sg.cs;
\r
380 seqCanvas.paintFlag = true;
\r
385 public ColourSchemeI getColourScheme()
\r
387 if(av.getSelection().size()>0)
\r
388 return av.alignment.findGroup((Sequence)av.sel.sequenceAt(0)).cs;
\r
390 return seqCanvas.cs;
\r