added help and documentation for annotation editing.
[jalview.git] / src / jalview / gui / AnnotationLabels.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 import java.awt.image.*;\r
26 \r
27 import javax.swing.*;\r
28 \r
29 \r
30 /**\r
31  * DOCUMENT ME!\r
32  *\r
33  * @author $author$\r
34  * @version $Revision$\r
35  */\r
36 public class AnnotationLabels extends JPanel implements MouseListener,\r
37     MouseMotionListener, ActionListener\r
38 {\r
39     static String ADDNEW = "Add New Row";\r
40     static String HIDE = "Hide This Row";\r
41     static String DELETE = "Delete This Row";\r
42     static String SHOWALL = "Show All Hidden Rows";\r
43     static String OUTPUT_TEXT = "Show Values In Textbox";\r
44     boolean active = false;\r
45     Image image;\r
46     AlignmentPanel ap;\r
47     boolean resizing = false;\r
48     int oldY;\r
49     int mouseX;\r
50     int selectedRow = 0;\r
51     int scrollOffset = 0;\r
52 \r
53     /**\r
54      * Creates a new AnnotationLabels object.\r
55      *\r
56      * @param ap DOCUMENT ME!\r
57      */\r
58     public AnnotationLabels(AlignmentPanel ap)\r
59     {\r
60         this.ap = ap;\r
61 \r
62         java.net.URL url = getClass().getResource("/images/idwidth.gif");\r
63         Image temp = null;\r
64 \r
65         if (url != null)\r
66         {\r
67             temp = java.awt.Toolkit.getDefaultToolkit().createImage(url);\r
68         }\r
69 \r
70         try\r
71         {\r
72             MediaTracker mt = new MediaTracker(this);\r
73             mt.addImage(temp, 0);\r
74             mt.waitForID(0);\r
75         }\r
76         catch (Exception ex)\r
77         {\r
78         }\r
79 \r
80         BufferedImage bi = new BufferedImage(temp.getHeight(this),\r
81                 temp.getWidth(this), BufferedImage.TYPE_INT_RGB);\r
82         Graphics2D g = (Graphics2D) bi.getGraphics();\r
83         g.rotate(Math.toRadians(90));\r
84         g.drawImage(temp, 0, -bi.getWidth(this), this);\r
85         image = (Image) bi;\r
86 \r
87         addMouseListener(this);\r
88         addMouseMotionListener(this);\r
89     }\r
90 \r
91     /**\r
92      * DOCUMENT ME!\r
93      *\r
94      * @param y DOCUMENT ME!\r
95      */\r
96     public void setScrollOffset(int y)\r
97     {\r
98         scrollOffset = y;\r
99         repaint();\r
100     }\r
101 \r
102     /**\r
103      * DOCUMENT ME!\r
104      *\r
105      * @param evt DOCUMENT ME!\r
106      */\r
107     public void actionPerformed(ActionEvent evt)\r
108     {\r
109         int dif = 0;\r
110         AlignmentAnnotation[] aa = ap.av.alignment.getAlignmentAnnotation();\r
111 \r
112         if (evt.getActionCommand().equals(ADDNEW))\r
113         {\r
114             String label = JOptionPane.showInputDialog(this,\r
115                     "Label for annotation");\r
116 \r
117             if (label == null)\r
118             {\r
119                 label = "";\r
120             }\r
121 \r
122             ap.av.alignment.addAnnotation(new AlignmentAnnotation(label,\r
123                     "New description",\r
124                     new Annotation[ap.av.alignment.getWidth()]));\r
125 \r
126             dif = aa[aa.length - 1].height;\r
127         }\r
128         else if (evt.getActionCommand().equals(HIDE))\r
129         {\r
130             aa[selectedRow].visible = false;\r
131 \r
132             if (aa[selectedRow].label.equals("Conservation"))\r
133             {\r
134                 ap.av.showConservation = false;\r
135             }\r
136 \r
137             if (aa[selectedRow].label.equals("Quality"))\r
138             {\r
139                 ap.av.showQuality = false;\r
140             }\r
141 \r
142             if (aa[selectedRow].label.equals("Consensus"))\r
143             {\r
144                 ap.av.showIdentity = false;\r
145             }\r
146 \r
147             dif = aa[selectedRow].height * -1;\r
148         }\r
149         else if (evt.getActionCommand().equals(DELETE))\r
150         {\r
151             ap.av.alignment.deleteAnnotation(aa[selectedRow]);\r
152             dif = aa[selectedRow].height * -1;\r
153         }\r
154         else if (evt.getActionCommand().equals(SHOWALL))\r
155         {\r
156             for (int i = 0; i < aa.length; i++)\r
157             {\r
158                 if (!aa[i].visible)\r
159                 {\r
160                     dif += aa[i].height;\r
161                     aa[i].visible = true;\r
162                 }\r
163             }\r
164         }\r
165         else if (evt.getActionCommand().equals(OUTPUT_TEXT))\r
166         {\r
167             CutAndPasteTransfer cap = new CutAndPasteTransfer();\r
168             Desktop.addInternalFrame(cap,\r
169                 ap.alignFrame.getTitle() + " - " + aa[selectedRow].label, 500,\r
170                 100);\r
171             cap.setText(aa[selectedRow].toString());\r
172         }\r
173 \r
174         ap.annotationPanel.adjustPanelHeight();\r
175 \r
176         Dimension d = ap.annotationScroller.getPreferredSize();\r
177         ap.annotationScroller.setPreferredSize(new Dimension(d.width,\r
178                 d.height + dif));\r
179         d = ap.annotationSpaceFillerHolder.getPreferredSize();\r
180         ap.annotationSpaceFillerHolder.setPreferredSize(new Dimension(d.width,\r
181                 d.height + dif));\r
182 \r
183         ap.addNotify();\r
184     }\r
185 \r
186     /**\r
187      * DOCUMENT ME!\r
188      *\r
189      * @param evt DOCUMENT ME!\r
190      */\r
191     public void mousePressed(MouseEvent evt)\r
192     {\r
193         oldY = evt.getY();\r
194     }\r
195 \r
196     /**\r
197      * DOCUMENT ME!\r
198      *\r
199      * @param evt DOCUMENT ME!\r
200      */\r
201     public void mouseReleased(MouseEvent evt)\r
202     {\r
203         active = false;\r
204         repaint();\r
205     }\r
206 \r
207     /**\r
208      * DOCUMENT ME!\r
209      *\r
210      * @param evt DOCUMENT ME!\r
211      */\r
212     public void mouseEntered(MouseEvent evt)\r
213     {\r
214         active = true;\r
215         repaint();\r
216     }\r
217 \r
218     /**\r
219      * DOCUMENT ME!\r
220      *\r
221      * @param evt DOCUMENT ME!\r
222      */\r
223     public void mouseExited(MouseEvent evt)\r
224     {\r
225         active = false;\r
226         repaint();\r
227     }\r
228 \r
229     /**\r
230      * DOCUMENT ME!\r
231      *\r
232      * @param evt DOCUMENT ME!\r
233      */\r
234     public void mouseDragged(MouseEvent evt)\r
235     {\r
236         active = true;\r
237 \r
238         Dimension d = ap.annotationScroller.getPreferredSize();\r
239         int dif = evt.getY() - oldY;\r
240 \r
241         dif /= ap.av.charHeight;\r
242         dif *= ap.av.charHeight;\r
243 \r
244         if ((d.height - dif) > 20)\r
245         {\r
246             ap.annotationScroller.setPreferredSize(new Dimension(d.width,\r
247                     d.height - dif));\r
248             d = ap.annotationSpaceFillerHolder.getPreferredSize();\r
249             ap.annotationSpaceFillerHolder.setPreferredSize(new Dimension(\r
250                     d.width, d.height - dif));\r
251             ap.repaint();\r
252         }\r
253 \r
254         ap.addNotify();\r
255     }\r
256 \r
257     /**\r
258      * DOCUMENT ME!\r
259      *\r
260      * @param evt DOCUMENT ME!\r
261      */\r
262     public void mouseMoved(MouseEvent evt)\r
263     {\r
264     }\r
265 \r
266     /**\r
267      * DOCUMENT ME!\r
268      *\r
269      * @param evt DOCUMENT ME!\r
270      */\r
271     public void mouseClicked(MouseEvent evt)\r
272     {\r
273         int y = evt.getY() - scrollOffset;\r
274         AlignmentAnnotation[] aa = ap.av.alignment.getAlignmentAnnotation();\r
275 \r
276         if ((aa == null) || (aa.length == 0))\r
277         {\r
278             JPopupMenu pop = new JPopupMenu("Annotations");\r
279             JMenuItem item = new JMenuItem(ADDNEW);\r
280             item.addActionListener(this);\r
281             pop.add(item);\r
282             pop.show(this, evt.getX(), evt.getY());\r
283 \r
284             return;\r
285         }\r
286 \r
287         int height = 0;\r
288 \r
289         for (int i = 0; i < aa.length; i++)\r
290         {\r
291             if (!aa[i].visible)\r
292             {\r
293                 continue;\r
294             }\r
295 \r
296             height += aa[i].height;\r
297 \r
298             if (y < height)\r
299             {\r
300                 selectedRow = i;\r
301 \r
302                 break;\r
303             }\r
304         }\r
305 \r
306         JPopupMenu pop = new JPopupMenu("Annotations");\r
307         JMenuItem item = new JMenuItem(ADDNEW);\r
308         item.addActionListener(this);\r
309         pop.add(item);\r
310         item = new JMenuItem(HIDE);\r
311         item.addActionListener(this);\r
312         pop.add(item);\r
313         item = new JMenuItem(DELETE);\r
314         item.addActionListener(this);\r
315         pop.add(item);\r
316         item = new JMenuItem(SHOWALL);\r
317         item.addActionListener(this);\r
318         pop.add(item);\r
319         item = new JMenuItem(OUTPUT_TEXT);\r
320         item.addActionListener(this);\r
321         pop.add(item);\r
322         pop.show(this, evt.getX(), evt.getY());\r
323     }\r
324 \r
325     /**\r
326      * DOCUMENT ME!\r
327      *\r
328      * @param g1 DOCUMENT ME!\r
329      */\r
330     public void paintComponent(Graphics g1)\r
331     {\r
332         Graphics2D g = (Graphics2D) g1;\r
333         g.setRenderingHint(RenderingHints.KEY_ANTIALIASING,\r
334             RenderingHints.VALUE_ANTIALIAS_ON);\r
335 \r
336         drawComponent(g);\r
337     }\r
338 \r
339     /**\r
340      * DOCUMENT ME!\r
341      *\r
342      * @param g DOCUMENT ME!\r
343      */\r
344     public void drawComponent(Graphics2D g)\r
345     {\r
346         FontMetrics fm = g.getFontMetrics(g.getFont());\r
347         g.setColor(Color.white);\r
348         g.fillRect(0, 0, getWidth(), getHeight());\r
349 \r
350         g.translate(0, scrollOffset);\r
351         g.setColor(Color.black);\r
352 \r
353         AlignmentAnnotation[] aa = ap.av.alignment.getAlignmentAnnotation();\r
354         int y = g.getFont().getSize();\r
355         int x = 0;\r
356         int width = getWidth();\r
357         if(width==0)\r
358          width = ap.calculateIdWidth().width + 4;\r
359 \r
360         if (aa != null)\r
361         {\r
362             for (int i = 0; i < aa.length; i++)\r
363             {\r
364                 if (!aa[i].visible)\r
365                 {\r
366                     continue;\r
367                 }\r
368 \r
369                 x = width - fm.stringWidth(aa[i].label) - 3;\r
370 \r
371                 if (aa[i].isGraph)\r
372                 {\r
373                     y += (aa[i].height / 3);\r
374                 }\r
375 \r
376                 g.drawString(aa[i].label, x, y);\r
377 \r
378                 if (aa[i].isGraph)\r
379                 {\r
380                     y += ((2 * aa[i].height) / 3);\r
381                 }\r
382                 else\r
383                 {\r
384                     y += aa[i].height;\r
385                 }\r
386             }\r
387         }\r
388 \r
389         if (active)\r
390         {\r
391             if (image != null)\r
392             {\r
393                 g.drawImage(image, 2, 0, this);\r
394             }\r
395         }\r
396 \r
397         if ((aa == null) || (aa.length < 1))\r
398         {\r
399             g.drawString("Right click", 2, 8);\r
400             g.drawString("to add annotation", 2, 18);\r
401         }\r
402     }\r
403 }\r