Jalview Imported Sources
[jalview.git] / src / jalview / gui / SeqPanel.java
1 package jalview.gui;\r
2 \r
3 import java.awt.*;\r
4 import java.awt.event.*;\r
5 import jalview.datamodel.*;\r
6 import javax.swing.*;\r
7 import jalview.schemes.*;\r
8 \r
9 \r
10 public class SeqPanel extends JPanel\r
11 {\r
12 \r
13   public    AlignmentI        align;\r
14   public    SeqCanvas         seqCanvas;\r
15   public    AlignmentPanel    parent;\r
16 \r
17   protected int startres;\r
18   protected int lastres;\r
19   protected int endres;\r
20 \r
21   protected int startseq;\r
22   protected int padseq;\r
23 \r
24   public    boolean editFlag;\r
25   protected AlignViewport av;\r
26 \r
27   public SeqPanel(AlignViewport av, AlignmentPanel p) {\r
28     this.av         = av;\r
29     this.align      = av.getAlignment();\r
30 \r
31     seqCanvas  = new SeqCanvas(av);\r
32     setLayout(new BorderLayout());\r
33     add(seqCanvas, BorderLayout.CENTER);\r
34 \r
35     parent = p;\r
36 \r
37     addMouseMotionListener( new MouseMotionAdapter()\r
38     {\r
39       public void mouseMoved(MouseEvent evt)\r
40       {  doMouseMoved(evt);   }\r
41       public void mouseDragged(MouseEvent evt)\r
42       { doMouseDragged(evt);  }\r
43     });\r
44 \r
45     addMouseListener( new MouseAdapter()\r
46     {\r
47       public void mouseReleased(MouseEvent evt)\r
48       { doMouseReleased(evt);  }\r
49       public void mousePressed(MouseEvent evt)\r
50       { doMousePressed(evt);   }\r
51 \r
52     });\r
53     repaint();\r
54   }\r
55 \r
56 \r
57   public void doMouseReleased(MouseEvent evt) {\r
58 \r
59     int x = evt.getX();\r
60       int res = (int)(x/av.getCharWidth()) + av.getStartRes();\r
61 \r
62       endres = res;\r
63 \r
64       // This is to detect edits - we're at the end of an edit if mouse is up\r
65       editFlag = false;\r
66       startseq = -1;\r
67       startres = -1;\r
68       lastres  = -1;\r
69 \r
70     parent.RefreshPanels();\r
71     repaint();\r
72 \r
73   }\r
74 \r
75   public void doMousePressed(MouseEvent evt) {\r
76     int seq;\r
77     int res;\r
78 \r
79     int x = evt.getX();\r
80     int y = evt.getY();\r
81 \r
82     res = (int)(x/av.getCharWidth()) + av.getStartRes();\r
83     seq = (y)/av.getCharHeight() + av.getStartSeq();\r
84 \r
85     if (seq < align.getHeight() && res < align.getSequenceAt(seq).getLength())\r
86     {\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
89       // in the alignment\r
90 \r
91       startseq = seq;\r
92 \r
93       if (startseq == (align.getHeight()-1)) {\r
94         padseq = 1;\r
95       } else {\r
96         padseq = 1;\r
97       }\r
98 \r
99       startres = res;\r
100       lastres = res;\r
101 \r
102       } else {\r
103       startseq = -1;\r
104       startres = -1;\r
105       lastres = -1;\r
106     }\r
107 \r
108     return;\r
109   }\r
110 \r
111   public void doMouseMoved(MouseEvent evt)\r
112   {\r
113 \r
114     int res = (int)(evt.getX()/av.getCharWidth()) + av.getStartRes();\r
115     int seq = (evt.getY())/av.getCharHeight() + av.getStartSeq();\r
116     if(seq>=av.getAlignment().getHeight())\r
117       return;\r
118 \r
119     Object obj = ResidueProperties.aa2Triplet.get( av.getAlignment().getSequenceAt(seq).getCharAt(res)+"" ) ;\r
120     String aa = "";\r
121     if(obj!=null)\r
122          aa = obj.toString();\r
123 \r
124     StringBuffer text = new StringBuffer("Sequence ID: "+av.getAlignment().getSequenceAt(seq).getName());\r
125     if(aa!="")\r
126       text.append("  Residue: "+aa+" ("+  av.getAlignment().getSequenceAt(seq).findPosition(res)+")");\r
127 \r
128     parent.alignFrame.statusBar.setText(text.toString());\r
129 \r
130   }\r
131 \r
132   public void doMouseDragged(MouseEvent evt) {\r
133     // If we're dragging we're editing\r
134     editFlag = true;\r
135 \r
136     int x = evt.getX();\r
137 \r
138     int res = (int)(x/av.getCharWidth()) + av.getStartRes();\r
139     if (res < 0) {res = 0;}\r
140 \r
141     if (res  != lastres) {\r
142       if (startseq != -1) {\r
143 \r
144         // Group editing\r
145         if (av.getGroupEdit()) {\r
146           SequenceGroup sg = align.findGroup(startseq);\r
147 \r
148           if (res < align.getWidth() && res < lastres) {\r
149             boolean flag = false;\r
150             for (int i= 0 ; i < sg.getSize(); i++) {\r
151               SequenceI s = (SequenceI)sg.getSequenceAt(i);\r
152               for (int j=lastres-1; j >= res; j--) {\r
153                 if (!flag) {\r
154                   if (!s.getSequence().substring(j,j+1).equals(align.getGapCharacter()) &&\r
155                       !s.getSequence().substring(j,j+1).equals(" ")) {\r
156                     res = j+1;\r
157                     System.out.print("\07");\r
158                     System.out.flush();\r
159                     flag = true;\r
160                   }\r
161                 }\r
162               }\r
163             }\r
164           }\r
165 \r
166           for (int i= 0 ; i < sg.getSize(); i++)\r
167           {\r
168             SequenceI s = (SequenceI)sg.getSequenceAt(i);\r
169             boolean found = false;\r
170             int sno = -1;\r
171             for (int k = 0; k < align.getHeight(); k++)\r
172             {\r
173               if (align.getSequenceAt(k) == s)\r
174               {\r
175                 found = true;\r
176                 sno = k;\r
177                 break;\r
178               }\r
179             }\r
180             if (found && sno != -1) {\r
181               if (res < align.getWidth() && res > lastres)\r
182               {\r
183                 for (int j = lastres; j < res; j++)\r
184                   insertChar(j,sno);\r
185 \r
186                 int index = align.findIndex(s);\r
187                 if (index != -1)\r
188                   drawChars(index,index+1,lastres);\r
189 \r
190 \r
191               } else if (res < align.getWidth() && res < lastres)\r
192               {\r
193                 for (int j = res; j < lastres; j++)\r
194                 {\r
195                   deleteChar(j,res,sno);\r
196                   startres = res;\r
197                 }\r
198                 int index = align.findIndex(s);\r
199                 if (index != -1)\r
200                   drawChars(index,index+1,res);\r
201 \r
202               }\r
203             }\r
204 \r
205           }\r
206           lastres = res;\r
207         } else {\r
208 \r
209 \r
210           if (res < align.getWidth() && res > lastres) {\r
211             // dragging to the right\r
212             for (int j = lastres; j < res; j++)\r
213             {\r
214               insertChar(j,startseq);\r
215             }\r
216             drawChars(startseq,startseq+1,lastres);\r
217 \r
218           } else if (res < align.getWidth() && res < lastres) {\r
219 \r
220             // dragging to the left\r
221             for (int j = res; j < lastres; j++) {\r
222               deleteChar(j,res,startseq);\r
223               startres = res;\r
224             }\r
225             drawChars(startseq,startseq+1,res);\r
226           }\r
227         }\r
228       }\r
229       lastres = res;\r
230     }\r
231 \r
232     repaint();\r
233     return;\r
234   }\r
235 \r
236   public void drawChars(int seqstart, int seqend, int start) {\r
237     seqCanvas.drawPanel(seqCanvas.gg, start,av.getEndRes(),seqstart,seqend,av.getStartRes(),av.getStartSeq(),0);\r
238     repaint();\r
239   }\r
240 \r
241   public void insertChar(int j, int seq)\r
242   {\r
243     align.getSequenceAt(seq).insertCharAt(j, av.getGapCharacter().charAt(0));\r
244   }\r
245 \r
246   public void deleteChar(int j, int res, int sno)\r
247   {\r
248 \r
249     if (align.getSequenceAt(sno).getSequence().substring(j,j+1).equals(".") ||\r
250         align.getSequenceAt(sno).getSequence().substring(j,j+1).equals("-") ||\r
251         align.getSequenceAt(sno).getSequence().substring(j,j+1).equals(" ") )\r
252     {\r
253         align.getSequenceAt(sno).deleteCharAt(j);\r
254     }\r
255 \r
256     align.getWidth();\r
257     repaint();\r
258   }\r
259 \r
260   public void setColourScheme(ColourSchemeI cs)\r
261   {\r
262    seqCanvas.cs = cs;\r
263    seqCanvas.paintFlag = true;\r
264    repaint();\r
265   }\r
266 \r
267   public ColourSchemeI getColourScheme()\r
268   {\r
269     return seqCanvas.cs;\r
270   }\r
271 \r
272 \r
273 }\r
274 \r
275 \r
276 \r
277 \r