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