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