Capitalise menus
[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 \r
175         ap.annotationPanel.adjustPanelHeight();\r
176 \r
177         Dimension d = ap.annotationScroller.getPreferredSize();\r
178         ap.annotationScroller.setPreferredSize(new Dimension(d.width,\r
179                 d.height + dif));\r
180         d = ap.annotationSpaceFillerHolder.getPreferredSize();\r
181         ap.annotationSpaceFillerHolder.setPreferredSize(new Dimension(d.width,\r
182                 d.height + dif));\r
183 \r
184         ap.addNotify();\r
185     }\r
186 \r
187     /**\r
188      * DOCUMENT ME!\r
189      *\r
190      * @param evt DOCUMENT ME!\r
191      */\r
192     public void mousePressed(MouseEvent evt)\r
193     {\r
194         oldY = evt.getY();\r
195     }\r
196 \r
197     /**\r
198      * DOCUMENT ME!\r
199      *\r
200      * @param evt DOCUMENT ME!\r
201      */\r
202     public void mouseReleased(MouseEvent evt)\r
203     {\r
204         active = false;\r
205         repaint();\r
206     }\r
207 \r
208     /**\r
209      * DOCUMENT ME!\r
210      *\r
211      * @param evt DOCUMENT ME!\r
212      */\r
213     public void mouseEntered(MouseEvent evt)\r
214     {\r
215         active = true;\r
216         repaint();\r
217     }\r
218 \r
219     /**\r
220      * DOCUMENT ME!\r
221      *\r
222      * @param evt DOCUMENT ME!\r
223      */\r
224     public void mouseExited(MouseEvent evt)\r
225     {\r
226         active = false;\r
227         repaint();\r
228     }\r
229 \r
230     /**\r
231      * DOCUMENT ME!\r
232      *\r
233      * @param evt DOCUMENT ME!\r
234      */\r
235     public void mouseDragged(MouseEvent evt)\r
236     {\r
237         active = true;\r
238 \r
239         Dimension d = ap.annotationScroller.getPreferredSize();\r
240         int dif = evt.getY() - oldY;\r
241 \r
242         dif /= ap.av.charHeight;\r
243         dif *= ap.av.charHeight;\r
244 \r
245         if ((d.height - dif) > 20)\r
246         {\r
247             ap.annotationScroller.setPreferredSize(new Dimension(d.width,\r
248                     d.height - dif));\r
249             d = ap.annotationSpaceFillerHolder.getPreferredSize();\r
250             ap.annotationSpaceFillerHolder.setPreferredSize(new Dimension(\r
251                     d.width, d.height - dif));\r
252             ap.repaint();\r
253         }\r
254 \r
255         ap.addNotify();\r
256     }\r
257 \r
258     /**\r
259      * DOCUMENT ME!\r
260      *\r
261      * @param evt DOCUMENT ME!\r
262      */\r
263     public void mouseMoved(MouseEvent evt)\r
264     {\r
265     }\r
266 \r
267     /**\r
268      * DOCUMENT ME!\r
269      *\r
270      * @param evt DOCUMENT ME!\r
271      */\r
272     public void mouseClicked(MouseEvent evt)\r
273     {\r
274         int y = evt.getY() - scrollOffset;\r
275         AlignmentAnnotation[] aa = ap.av.alignment.getAlignmentAnnotation();\r
276 \r
277         if ((aa == null) || (aa.length == 0))\r
278         {\r
279             JPopupMenu pop = new JPopupMenu("Annotations");\r
280             JMenuItem item = new JMenuItem(ADDNEW);\r
281             item.addActionListener(this);\r
282             pop.add(item);\r
283             pop.show(this, evt.getX(), evt.getY());\r
284 \r
285             return;\r
286         }\r
287 \r
288         int height = 0;\r
289 \r
290         for (int i = 0; i < aa.length; i++)\r
291         {\r
292             if (!aa[i].visible)\r
293             {\r
294                 continue;\r
295             }\r
296 \r
297             height += aa[i].height;\r
298 \r
299             if (y < height)\r
300             {\r
301                 selectedRow = i;\r
302 \r
303                 break;\r
304             }\r
305         }\r
306 \r
307         JPopupMenu pop = new JPopupMenu("Annotations");\r
308         JMenuItem item = new JMenuItem(ADDNEW);\r
309         item.addActionListener(this);\r
310         pop.add(item);\r
311         item = new JMenuItem(HIDE);\r
312         item.addActionListener(this);\r
313         pop.add(item);\r
314         item = new JMenuItem(DELETE);\r
315         item.addActionListener(this);\r
316         pop.add(item);\r
317         item = new JMenuItem(SHOWALL);\r
318         item.addActionListener(this);\r
319         pop.add(item);\r
320         item = new JMenuItem(OUTPUT_TEXT);\r
321         item.addActionListener(this);\r
322         pop.add(item);\r
323 \r
324         if (aa[selectedRow].label.equals("Consensus"))\r
325         {\r
326           pop.addSeparator();\r
327           final JCheckBoxMenuItem cbmi = new JCheckBoxMenuItem(\r
328               "Ignore Gaps In Consensus",\r
329               ap.av.getIgnoreGapsConsensus());\r
330           cbmi.addActionListener(new ActionListener()\r
331               {public void actionPerformed(ActionEvent e)\r
332                {\r
333                  ap.av.setIgnoreGapsConsensus(cbmi.getState());\r
334                  ap.repaint();\r
335                }\r
336               });\r
337           pop.add(cbmi);\r
338 \r
339         }\r
340 \r
341         pop.show(this, evt.getX(), evt.getY());\r
342     }\r
343 \r
344     /**\r
345      * DOCUMENT ME!\r
346      *\r
347      * @param g1 DOCUMENT ME!\r
348      */\r
349     public void paintComponent(Graphics g1)\r
350     {\r
351         Graphics2D g = (Graphics2D) g1;\r
352         g.setRenderingHint(RenderingHints.KEY_ANTIALIASING,\r
353             RenderingHints.VALUE_ANTIALIAS_ON);\r
354 \r
355         drawComponent(g);\r
356     }\r
357 \r
358     /**\r
359      * DOCUMENT ME!\r
360      *\r
361      * @param g DOCUMENT ME!\r
362      */\r
363     public void drawComponent(Graphics2D g)\r
364     {\r
365         FontMetrics fm = g.getFontMetrics(g.getFont());\r
366         g.setColor(Color.white);\r
367         g.fillRect(0, 0, getWidth(), getHeight());\r
368 \r
369         g.translate(0, scrollOffset);\r
370         g.setColor(Color.black);\r
371 \r
372         AlignmentAnnotation[] aa = ap.av.alignment.getAlignmentAnnotation();\r
373         int y = g.getFont().getSize();\r
374         int x = 0;\r
375         int width = getWidth();\r
376         if(width==0)\r
377          width = ap.calculateIdWidth().width + 4;\r
378 \r
379         if (aa != null)\r
380         {\r
381             for (int i = 0; i < aa.length; i++)\r
382             {\r
383                 if (!aa[i].visible)\r
384                 {\r
385                     continue;\r
386                 }\r
387 \r
388                 x = width - fm.stringWidth(aa[i].label) - 3;\r
389 \r
390                 if (aa[i].isGraph)\r
391                 {\r
392                     y += (aa[i].height / 3);\r
393                 }\r
394 \r
395                 g.drawString(aa[i].label, x, y);\r
396 \r
397                 if (aa[i].isGraph)\r
398                 {\r
399                     y += ((2 * aa[i].height) / 3);\r
400                 }\r
401                 else\r
402                 {\r
403                     y += aa[i].height;\r
404                 }\r
405             }\r
406         }\r
407 \r
408         if (active)\r
409         {\r
410             if (image != null)\r
411             {\r
412                 g.drawImage(image, 2, 0, this);\r
413             }\r
414         }\r
415 \r
416         if ((aa == null) || (aa.length < 1))\r
417         {\r
418             g.drawString("Right click", 2, 8);\r
419             g.drawString("to add annotation", 2, 18);\r
420         }\r
421     }\r
422 }\r