mouse pressed moved to mouseclicked
[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     int dif = 0;\r
89     AlignmentAnnotation[] aa = ap.av.alignment.getAlignmentAnnotation();\r
90 \r
91     if (evt.getActionCommand().equals(ADDNEW))\r
92     {\r
93       String label = JOptionPane.showInputDialog(this,\r
94                                                  "Label for annotation");\r
95       if (label == null)\r
96         label = "";\r
97 \r
98       ap.av.alignment.addAnnotation(new AlignmentAnnotation(label,\r
99           "New description",\r
100           new Annotation[ap.av.alignment.getWidth()]));\r
101 \r
102       dif = aa[aa.length-1].height;\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       dif = aa[selectedRow].height*-1;\r
124     }\r
125     else if (evt.getActionCommand().equals(DELETE))\r
126     {\r
127       ap.av.alignment.deleteAnnotation(aa[selectedRow]);\r
128       dif = aa[selectedRow].height*-1;\r
129     }\r
130     else if (evt.getActionCommand().equals(SHOWALL))\r
131     {\r
132       for (int i = 0; i < aa.length; i++)\r
133       {\r
134         if(!aa[i].visible)\r
135          {\r
136            dif+=aa[i].height;\r
137            aa[i].visible = true;\r
138          }\r
139       }\r
140     }\r
141     else if (evt.getActionCommand().equals(OUTPUT_TEXT))\r
142     {\r
143       CutAndPasteTransfer cap = new CutAndPasteTransfer();\r
144       Desktop.addInternalFrame(cap,\r
145                                ap.alignFrame.getTitle() + " - " +\r
146                                aa[selectedRow].label, 500,\r
147                                100);\r
148       cap.setText(aa[selectedRow].toString());\r
149     }\r
150 \r
151     ap.annotationPanel.adjustPanelHeight();\r
152 \r
153     Dimension d = ap.annotationScroller.getPreferredSize();\r
154     ap.annotationScroller.setPreferredSize(new Dimension(d.width, d.height+dif));\r
155     d = ap.annotationSpaceFillerHolder.getPreferredSize();\r
156     ap.annotationSpaceFillerHolder.setPreferredSize(new Dimension(\r
157         d.width, d.height+dif));\r
158 \r
159       ap.addNotify();\r
160 \r
161 \r
162   }\r
163 \r
164   public void mousePressed(MouseEvent evt)\r
165   {\r
166     oldY = evt.getY();\r
167   }\r
168 \r
169   public void mouseReleased(MouseEvent evt)\r
170   {\r
171     active = false;\r
172     repaint();\r
173   }\r
174 \r
175   public void mouseEntered(MouseEvent evt)\r
176   {\r
177     active = true;\r
178     repaint();\r
179   }\r
180 \r
181   public void mouseExited(MouseEvent evt)\r
182   {\r
183     active = false;\r
184     repaint();\r
185   }\r
186 \r
187   public void mouseDragged(MouseEvent evt)\r
188   {\r
189     active = true;\r
190 \r
191     Dimension d = ap.annotationScroller.getPreferredSize();\r
192     int dif = evt.getY() - oldY;\r
193 \r
194     dif /= ap.av.charHeight;\r
195     dif *= ap.av.charHeight;\r
196 \r
197     if ( (d.height - dif) > 20)\r
198     {\r
199       ap.annotationScroller.setPreferredSize(new Dimension(d.width,\r
200           d.height - dif));\r
201       d = ap.annotationSpaceFillerHolder.getPreferredSize();\r
202       ap.annotationSpaceFillerHolder.setPreferredSize(new Dimension(\r
203           d.width, d.height - dif));\r
204       ap.repaint();\r
205     }\r
206 \r
207     ap.addNotify();\r
208   }\r
209 \r
210   public void mouseMoved(MouseEvent evt)\r
211   {\r
212   }\r
213 \r
214   public void mouseClicked(MouseEvent evt)\r
215   {\r
216     int y = evt.getY() - scrollOffset;\r
217     AlignmentAnnotation[] aa = ap.av.alignment.getAlignmentAnnotation();\r
218 \r
219     if ( (aa == null) || (aa.length == 0))\r
220     {\r
221       JPopupMenu pop = new JPopupMenu("Annotations");\r
222       JMenuItem item = new JMenuItem(ADDNEW);\r
223       item.addActionListener(this);\r
224       pop.add(item);\r
225       pop.show(this, evt.getX(), evt.getY());\r
226 \r
227       return;\r
228     }\r
229 \r
230     int height = 0;\r
231 \r
232     for (int i = 0; i < aa.length; i++)\r
233     {\r
234       if (!aa[i].visible)\r
235       {\r
236         continue;\r
237       }\r
238 \r
239       height += aa[i].height;\r
240 \r
241       if (y < height)\r
242       {\r
243         selectedRow = i;\r
244 \r
245         break;\r
246       }\r
247     }\r
248 \r
249     JPopupMenu pop = new JPopupMenu("Annotations");\r
250     JMenuItem item = new JMenuItem(ADDNEW);\r
251     item.addActionListener(this);\r
252     pop.add(item);\r
253     item = new JMenuItem(HIDE);\r
254     item.addActionListener(this);\r
255     pop.add(item);\r
256     item = new JMenuItem(DELETE);\r
257     item.addActionListener(this);\r
258     pop.add(item);\r
259     item = new JMenuItem(SHOWALL);\r
260     item.addActionListener(this);\r
261     pop.add(item);\r
262     item = new JMenuItem(OUTPUT_TEXT);\r
263     item.addActionListener(this);\r
264     pop.add(item);\r
265     pop.show(this, evt.getX(), evt.getY());\r
266   }\r
267 \r
268   public void paintComponent(Graphics g1)\r
269   {\r
270     Graphics2D g = (Graphics2D) g1;\r
271     g.setRenderingHint(RenderingHints.KEY_ANTIALIASING,\r
272                        RenderingHints.VALUE_ANTIALIAS_ON);\r
273 \r
274     drawComponent(g);\r
275   }\r
276 \r
277   public void drawComponent(Graphics2D g)\r
278   {\r
279     FontMetrics fm = g.getFontMetrics(g.getFont());\r
280     g.setColor(Color.white);\r
281     g.fillRect(0, 0, getWidth(), getHeight());\r
282 \r
283     g.translate(0, scrollOffset);\r
284     g.setColor(Color.black);\r
285 \r
286     AlignmentAnnotation[] aa = ap.av.alignment.getAlignmentAnnotation();\r
287     int y = g.getFont().getSize();\r
288     int x = 0;\r
289 \r
290     if (aa != null)\r
291     {\r
292       for (int i = 0; i < aa.length; i++)\r
293       {\r
294         if (!aa[i].visible)\r
295         {\r
296           continue;\r
297         }\r
298 \r
299         x = getWidth() - fm.stringWidth(aa[i].label) - 3;\r
300 \r
301         if (aa[i].isGraph)\r
302         {\r
303           y += (aa[i].height / 3);\r
304         }\r
305 \r
306         g.drawString(aa[i].label, x, y);\r
307 \r
308         if (aa[i].isGraph)\r
309         {\r
310           y += ( (2 * aa[i].height) / 3);\r
311         }\r
312         else\r
313         {\r
314           y += aa[i].height;\r
315         }\r
316       }\r
317     }\r
318 \r
319     if (active)\r
320     {\r
321       if (image != null)\r
322       {\r
323         g.drawImage(image, 2, 0, this);\r
324       }\r
325     }\r
326 \r
327     if ( (aa == null) || (aa.length < 1))\r
328     {\r
329       g.drawString("Right click", 2, 8);\r
330       g.drawString("to add annotation", 2, 18);\r
331     }\r
332   }\r
333 }\r