Use paintAlignment
[jalview.git] / src / jalview / appletgui / AnnotationLabels.java
1 /*\r
2  * Jalview - A Sequence Alignment Editor and Viewer\r
3  * Copyright (C) 2007 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 \r
20 package jalview.appletgui;\r
21 \r
22 import java.util.*;\r
23 \r
24 import java.awt.*;\r
25 import java.awt.event.*;\r
26 \r
27 import jalview.datamodel.*;\r
28 \r
29 public class AnnotationLabels\r
30     extends Panel implements ActionListener, MouseListener, MouseMotionListener\r
31 {\r
32   Image image;\r
33   boolean active = false;\r
34   AlignmentPanel ap;\r
35   AlignViewport av;\r
36   boolean resizing = false;\r
37   int oldY, mouseX;\r
38   static String EDITNAME = "Edit label/description";\r
39   static String HIDE = "Hide this row";\r
40   static String DELETE = "Delete this row";\r
41   static String SHOWALL = "Show all hidden rows";\r
42   static String OUTPUT_TEXT = "Show Values In Textbox";\r
43   static String COPYCONS_SEQ = "Copy Consensus Sequence";\r
44 \r
45   int selectedRow = 0;\r
46   int scrollOffset = 0;\r
47 \r
48   Tooltip tooltip;\r
49 \r
50   public AnnotationLabels(AlignmentPanel ap)\r
51   {\r
52     this.ap = ap;\r
53     this.av = ap.av;\r
54     setLayout(null);\r
55     addMouseListener(this);\r
56     addMouseMotionListener(this);\r
57   }\r
58 \r
59   public AnnotationLabels(AlignViewport av)\r
60   {\r
61     this.av = av;\r
62   }\r
63 \r
64   public void setScrollOffset(int y)\r
65   {\r
66     scrollOffset = y;\r
67     repaint();\r
68   }\r
69 \r
70   void getSelectedRow(int y)\r
71   {\r
72     selectedRow = -1;\r
73     AlignmentAnnotation[] aa = ap.av.alignment.getAlignmentAnnotation();\r
74 \r
75     if (aa == null)\r
76     {\r
77       return;\r
78     }\r
79 \r
80     int height = 0;\r
81     for (int i = 0; i < aa.length; i++)\r
82     {\r
83       if (!aa[i].visible)\r
84       {\r
85         continue;\r
86       }\r
87 \r
88       height += aa[i].height;\r
89       if (y < height)\r
90       {\r
91         selectedRow = i;\r
92         break;\r
93       }\r
94     }\r
95   }\r
96 \r
97   public void actionPerformed(ActionEvent evt)\r
98   {\r
99     AlignmentAnnotation[] aa = av.alignment.getAlignmentAnnotation();\r
100 \r
101     if (evt.getActionCommand().equals(EDITNAME))\r
102     {\r
103       EditNameDialog dialog = new EditNameDialog(\r
104           aa[selectedRow].label,\r
105           aa[selectedRow].description,\r
106           "       Annotation Label",\r
107           "Annotation Description",\r
108           ap,\r
109           "Edit Annotation Name / Description");\r
110 \r
111       if (dialog.accept)\r
112       {\r
113         aa[selectedRow].label = dialog.getName();\r
114         aa[selectedRow].description = dialog.getDescription();\r
115         repaint();\r
116       }\r
117     }\r
118     if (evt.getActionCommand().equals(HIDE))\r
119     {\r
120       aa[selectedRow].visible = false;\r
121     }\r
122     else if (evt.getActionCommand().equals(SHOWALL))\r
123     {\r
124       for (int i = 0; i < aa.length; i++)\r
125       {\r
126         aa[i].visible = true;\r
127       }\r
128     }\r
129     else if (evt.getActionCommand().equals(OUTPUT_TEXT))\r
130     {\r
131       CutAndPasteTransfer cap = new CutAndPasteTransfer(false, ap.alignFrame);\r
132       Frame frame = new Frame();\r
133       frame.add(cap);\r
134       jalview.bin.JalviewLite.addFrame(frame,\r
135                                        ap.alignFrame.getTitle() + " - " +\r
136                                        aa[selectedRow].label, 500, 100);\r
137       cap.setText(aa[selectedRow].toString());\r
138     }\r
139     else if (evt.getActionCommand().equals(COPYCONS_SEQ))\r
140     {\r
141       SequenceI cons = av.getConsensusSeq();\r
142       if (cons != null)\r
143       {\r
144         copy_annotseqtoclipboard(cons);\r
145       }\r
146 \r
147     }\r
148     ap.annotationPanel.adjustPanelHeight();\r
149     setSize(getSize().width, ap.annotationPanel.getSize().height);\r
150     ap.validate();\r
151     ap.paintAlignment(true);\r
152   }\r
153 \r
154   public void mouseMoved(MouseEvent evt)\r
155   {\r
156     getSelectedRow(evt.getY() - scrollOffset);\r
157 \r
158     if (selectedRow > -1)\r
159     {\r
160       if (tooltip == null)\r
161       {\r
162         tooltip = new Tooltip(ap.av.alignment.\r
163                               getAlignmentAnnotation()[selectedRow].\r
164                               description,\r
165                               this);\r
166       }\r
167       else\r
168       {\r
169         tooltip.setTip(ap.av.alignment.\r
170                        getAlignmentAnnotation()[selectedRow].description);\r
171       }\r
172     }\r
173     else if (tooltip != null)\r
174     {\r
175       tooltip.setTip("");\r
176     }\r
177 \r
178   }\r
179 \r
180   public void mouseDragged(MouseEvent evt)\r
181   {}\r
182 \r
183   public void mouseClicked(MouseEvent evt)\r
184   {}\r
185 \r
186   public void mouseReleased(MouseEvent evt)\r
187   {}\r
188 \r
189   public void mouseEntered(MouseEvent evt)\r
190   {}\r
191 \r
192   public void mouseExited(MouseEvent evt)\r
193   {}\r
194 \r
195   public void mousePressed(MouseEvent evt)\r
196   {\r
197     AlignmentAnnotation[] aa = ap.av.alignment.getAlignmentAnnotation();\r
198 \r
199     PopupMenu pop = new PopupMenu("Annotations");\r
200 \r
201     MenuItem item = new MenuItem(EDITNAME);\r
202     item.addActionListener(this);\r
203     pop.add(item);\r
204     item = new MenuItem(HIDE);\r
205     item.addActionListener(this);\r
206     pop.add(item);\r
207     item = new MenuItem(SHOWALL);\r
208     item.addActionListener(this);\r
209     pop.add(item);\r
210     this.add(pop);\r
211     item = new MenuItem(OUTPUT_TEXT);\r
212     item.addActionListener(this);\r
213     pop.add(item);\r
214 \r
215     if (aa[selectedRow] == ap.av.consensus)\r
216     {\r
217       pop.addSeparator();\r
218       final CheckboxMenuItem cbmi = new CheckboxMenuItem(\r
219           "Ignore Gaps In Consensus",\r
220           ap.av.getIgnoreGapsConsensus());\r
221 \r
222       cbmi.addItemListener(new ItemListener()\r
223       {\r
224         public void itemStateChanged(ItemEvent e)\r
225         {\r
226           ap.av.setIgnoreGapsConsensus(cbmi.getState());\r
227           ap.paintAlignment(true);\r
228         }\r
229       });\r
230       pop.add(cbmi);\r
231       final MenuItem cpcons = new MenuItem(COPYCONS_SEQ);\r
232       cpcons.addActionListener(this);\r
233       pop.add(cpcons);\r
234     }\r
235 \r
236     pop.show(this, evt.getX(), evt.getY());\r
237 \r
238   }\r
239 \r
240   /**\r
241    * DOCUMENT ME!\r
242    *\r
243    * @param e DOCUMENT ME!\r
244    */\r
245   protected void copy_annotseqtoclipboard(SequenceI sq)\r
246   {\r
247     if (sq == null || sq.getLength() < 1)\r
248     {\r
249       return;\r
250     }\r
251     jalview.appletgui.AlignFrame.copiedSequences = new StringBuffer();\r
252     jalview.appletgui.AlignFrame.copiedSequences.append(sq.getName() + "\t" +\r
253         sq.getStart() + "\t" +\r
254         sq.getEnd() + "\t" +\r
255         sq.getSequenceAsString() + "\n");\r
256     if (av.hasHiddenColumns)\r
257     {\r
258       jalview.appletgui.AlignFrame.copiedHiddenColumns = new Vector();\r
259       for (int i = 0; i < av.getColumnSelection().getHiddenColumns().size(); i++)\r
260       {\r
261         int[] region = (int[])\r
262             av.getColumnSelection().getHiddenColumns().elementAt(i);\r
263 \r
264         jalview.appletgui.AlignFrame.copiedHiddenColumns.addElement(new int[]\r
265             {region[0],\r
266             region[1]});\r
267       }\r
268     }\r
269   }\r
270 \r
271   public void update(Graphics g)\r
272   {\r
273     paint(g);\r
274   }\r
275 \r
276   public void paint(Graphics g)\r
277   {\r
278     int w = getSize().width;\r
279     if (image == null || w != image.getWidth(this))\r
280     {\r
281       image = createImage(w, ap.annotationPanel.getSize().height);\r
282     }\r
283 \r
284     drawComponent(image.getGraphics(), w);\r
285     g.drawImage(image, 0, 0, this);\r
286   }\r
287 \r
288   public void drawComponent(Graphics g, int width)\r
289   {\r
290     g.setFont(av.getFont());\r
291     FontMetrics fm = g.getFontMetrics(av.getFont());\r
292     g.setColor(Color.white);\r
293     g.fillRect(0, 0, getSize().width, getSize().height);\r
294 \r
295     g.translate(0, scrollOffset);\r
296     g.setColor(Color.black);\r
297 \r
298     AlignmentAnnotation[] aa = av.alignment.getAlignmentAnnotation();\r
299     int y = g.getFont().getSize();\r
300     int x = 0;\r
301 \r
302     if (aa != null)\r
303     {\r
304       for (int i = 0; i < aa.length; i++)\r
305       {\r
306         if (!aa[i].visible)\r
307         {\r
308           continue;\r
309         }\r
310 \r
311         x = width - fm.stringWidth(aa[i].label) - 3;\r
312 \r
313         if (aa[i].graph > 0)\r
314         {\r
315           y += (aa[i].height / 3);\r
316         }\r
317 \r
318         g.drawString(aa[i].label, x, y);\r
319 \r
320         if (aa[i].graph > 0)\r
321         {\r
322           y += (2 * aa[i].height / 3);\r
323         }\r
324         else\r
325         {\r
326           y += aa[i].height;\r
327         }\r
328       }\r
329     }\r
330   }\r
331 \r
332 }\r