added help and documentation for annotation editing.
[jalview.git] / src / jalview / gui / ScalePanel.java
1 /*\r
2  * Jalview - A Sequence Alignment Editor and Viewer\r
3  * Copyright (C) 2005 AM Waterhouse, J Procter, G Barton, M Clamp, S Searle\r
4  *\r
5  * This program is free software; you can redistribute it and/or\r
6  * modify it under the terms of the GNU General Public License\r
7  * as published by the Free Software Foundation; either version 2\r
8  * of the License, or (at your option) any later version.\r
9  *\r
10  * This program is distributed in the hope that it will be useful,\r
11  * but WITHOUT ANY WARRANTY; without even the implied warranty of\r
12  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\r
13  * GNU General Public License for more details.\r
14  *\r
15  * You should have received a copy of the GNU General Public License\r
16  * along with this program; if not, write to the Free Software\r
17  * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA\r
18  */\r
19 package jalview.gui;\r
20 \r
21 import jalview.datamodel.*;\r
22 \r
23 import java.awt.*;\r
24 import java.awt.event.*;\r
25 \r
26 import javax.swing.*;\r
27 \r
28 \r
29 /**\r
30  * DOCUMENT ME!\r
31  *\r
32  * @author $author$\r
33  * @version $Revision$\r
34  */\r
35 public class ScalePanel extends JPanel\r
36 {\r
37     protected int offy = 4;\r
38 \r
39     /** DOCUMENT ME!! */\r
40     public int width;\r
41     protected AlignViewport av;\r
42     AlignmentPanel ap;\r
43     boolean stretchingGroup = false;\r
44     int min; //used by mouseDragged to see if user\r
45     int max; //used by mouseDragged to see if user\r
46 \r
47     // wants to delete columns\r
48     public ScalePanel(AlignViewport av, AlignmentPanel ap)\r
49     {\r
50         this.av = av;\r
51         this.ap = ap;\r
52 \r
53         addMouseListener(new MouseAdapter()\r
54             {\r
55                 public void mousePressed(MouseEvent evt)\r
56                 {\r
57                     doMousePressed(evt);\r
58                 }\r
59 \r
60                 public void mouseReleased(MouseEvent evt)\r
61                 {\r
62                     doMouseReleased(evt);\r
63                 }\r
64             });\r
65         addMouseMotionListener(new MouseMotionAdapter()\r
66             {\r
67                 public void mouseDragged(MouseEvent evt)\r
68                 {\r
69                     doMouseDragged(evt);\r
70                 }\r
71             });\r
72     }\r
73 \r
74     /**\r
75      * DOCUMENT ME!\r
76      *\r
77      * @param evt DOCUMENT ME!\r
78      */\r
79     public void doMousePressed(MouseEvent evt)\r
80     {\r
81         int x = evt.getX();\r
82         int res = (x / av.getCharWidth()) + av.getStartRes();\r
83         SequenceGroup sg = null;\r
84 \r
85         min = res;\r
86         max = res;\r
87 \r
88         if (av.getColumnSelection().contains(res))\r
89         {\r
90             av.getColumnSelection().removeElement(res);\r
91             ap.annotationPanel.removeEditableColumn(res);\r
92         }\r
93         else\r
94         {\r
95             av.getColumnSelection().addElement(res);\r
96             sg = new SequenceGroup();\r
97 \r
98             for (int i = 0; i < av.alignment.getSequences().size(); i++)\r
99             {\r
100                 sg.addSequence(av.alignment.getSequenceAt(i), false);\r
101             }\r
102 \r
103             sg.setStartRes(res);\r
104             sg.setEndRes(res);\r
105         }\r
106 \r
107         av.setSelectionGroup(sg);\r
108         ap.repaint();\r
109     }\r
110 \r
111     /**\r
112      * DOCUMENT ME!\r
113      *\r
114      * @param evt DOCUMENT ME!\r
115      */\r
116     public void doMouseReleased(MouseEvent evt)\r
117     {\r
118         int x = evt.getX();\r
119         int res = (x / av.getCharWidth()) + av.getStartRes();\r
120 \r
121         if (av.getColumnSelection() != null)\r
122         {\r
123             for (int i = 0; i < av.getColumnSelection().size(); i++)\r
124             {\r
125                 ap.annotationPanel.addEditableColumn(av.getColumnSelection()\r
126                                                        .columnAt(i));\r
127             }\r
128         }\r
129 \r
130         if (!stretchingGroup)\r
131         {\r
132             ap.repaint();\r
133 \r
134             return;\r
135         }\r
136 \r
137         SequenceGroup sg = av.getSelectionGroup();\r
138 \r
139         if (res > sg.getStartRes())\r
140         {\r
141             sg.setEndRes(res);\r
142         }\r
143         else if (res < sg.getStartRes())\r
144         {\r
145             sg.setStartRes(res);\r
146         }\r
147 \r
148         stretchingGroup = false;\r
149         ap.repaint();\r
150     }\r
151 \r
152     /**\r
153      * DOCUMENT ME!\r
154      *\r
155      * @param evt DOCUMENT ME!\r
156      */\r
157     public void doMouseDragged(MouseEvent evt)\r
158     {\r
159         int x = evt.getX();\r
160         int res = (x / av.getCharWidth()) + av.getStartRes();\r
161 \r
162         if (res < min)\r
163         {\r
164             min = res;\r
165         }\r
166 \r
167         if (res > max)\r
168         {\r
169             max = res;\r
170         }\r
171 \r
172         SequenceGroup sg = av.getSelectionGroup();\r
173 \r
174         if (sg != null)\r
175         {\r
176             stretchingGroup = true;\r
177 \r
178             if (!av.getColumnSelection().contains(res))\r
179             {\r
180                 av.getColumnSelection().addElement(res);\r
181             }\r
182 \r
183             if (res > sg.getStartRes())\r
184             {\r
185                 sg.setEndRes(res);\r
186             }\r
187             else if (res < sg.getStartRes())\r
188             {\r
189                 sg.setStartRes(res);\r
190             }\r
191 \r
192             for (int i = min; i <= max; i++)\r
193             {\r
194                 if ((i < sg.getStartRes()) || (i > sg.getEndRes()))\r
195                 {\r
196                     av.getColumnSelection().removeElement(i);\r
197                     ap.annotationPanel.removeEditableColumn(res);\r
198                 }\r
199                 else\r
200                 {\r
201                     av.getColumnSelection().addElement(i);\r
202                 }\r
203             }\r
204 \r
205             ap.repaint();\r
206         }\r
207     }\r
208 \r
209     /**\r
210      * DOCUMENT ME!\r
211      *\r
212      * @param g DOCUMENT ME!\r
213      */\r
214     public void paintComponent(Graphics g)\r
215     {\r
216         drawScale(g, av.getStartRes(), av.getEndRes(), getWidth(), getHeight());\r
217     }\r
218 \r
219     // scalewidth will normally be screenwidth,\r
220     public void drawScale(Graphics g, int startx, int endx, int width,\r
221         int height)\r
222     {\r
223         Graphics2D gg = (Graphics2D) g;\r
224         gg.setFont(av.getFont());\r
225         gg.setRenderingHint(RenderingHints.KEY_ANTIALIASING,\r
226             RenderingHints.VALUE_ANTIALIAS_ON);\r
227 \r
228         //Fill in the background\r
229         gg.setColor(Color.white);\r
230         gg.fillRect(0, 0, width, height);\r
231         gg.setColor(Color.black);\r
232 \r
233         //Fill the selected columns\r
234         ColumnSelection cs = av.getColumnSelection();\r
235         gg.setColor(new Color(220, 0, 0));\r
236 \r
237         for (int i = 0; i < cs.size(); i++)\r
238         {\r
239             int sel = cs.columnAt(i);\r
240 \r
241             if ((sel >= startx) && (sel <= endx))\r
242             {\r
243                 gg.fillRect((sel - startx) * av.charWidth, 0, av.charWidth,\r
244                     getHeight());\r
245             }\r
246         }\r
247 \r
248         // Draw the scale numbers\r
249         gg.setColor(Color.black);\r
250 \r
251         int scalestartx = (startx / 10) * 10;\r
252 \r
253         FontMetrics fm = gg.getFontMetrics(av.getFont());\r
254         int y = av.charHeight - fm.getDescent();\r
255 \r
256         if ((scalestartx % 10) == 0)\r
257         {\r
258             scalestartx += 5;\r
259         }\r
260 \r
261         for (int i = scalestartx; i < endx; i += 5)\r
262         {\r
263             if ((i % 10) == 0)\r
264             {\r
265                 gg.drawString(String.valueOf(i),\r
266                     (i - startx - 1) * av.charWidth, y);\r
267                 gg.drawLine((int) (((i - startx - 1) * av.charWidth) +\r
268                     (av.charWidth / 2)), y + 2,\r
269                     (int) (((i - startx - 1) * av.charWidth) +\r
270                     (av.charWidth / 2)), y + (fm.getDescent() * 2));\r
271             }\r
272             else\r
273             {\r
274                 gg.drawLine((int) (((i - startx - 1) * av.charWidth) +\r
275                     (av.charWidth / 2)), y + fm.getDescent(),\r
276                     (int) (((i - startx - 1) * av.charWidth) +\r
277                     (av.charWidth / 2)), y + (fm.getDescent() * 2));\r
278             }\r
279         }\r
280     }\r
281 }\r