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