2 * Jalview - A Sequence Alignment Editor and Viewer (Version 2.6)
3 * Copyright (C) 2010 J Procter, AM Waterhouse, G Barton, M Clamp, S Searle
5 * This file is part of Jalview.
7 * Jalview is free software: you can redistribute it and/or
8 * modify it under the terms of the GNU General Public License
9 * as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version.
11 * Jalview is distributed in the hope that it will be useful, but
12 * WITHOUT ANY WARRANTY; without even the implied warranty
13 * of MERCHANTABILITY or FITNESS FOR A PARTICULAR
14 * PURPOSE. See the GNU General Public License for more details.
16 * You should have received a copy of the GNU General Public License along with Jalview. If not, see <http://www.gnu.org/licenses/>.
18 package jalview.appletgui;
23 import java.awt.event.*;
25 import jalview.datamodel.*;
27 public class AnnotationLabels extends Panel implements ActionListener,
28 MouseListener, MouseMotionListener
32 boolean active = false;
38 boolean resizing = false;
42 static String ADDNEW = "Add New Row";
44 static String EDITNAME = "Edit Label/Description";
46 static String HIDE = "Hide This Row";
48 static String SHOWALL = "Show All Hidden Rows";
50 static String OUTPUT_TEXT = "Show Values In Textbox";
52 static String COPYCONS_SEQ = "Copy Consensus Sequence";
60 private boolean hasHiddenRows;
62 public AnnotationLabels(AlignmentPanel ap)
67 addMouseListener(this);
68 addMouseMotionListener(this);
71 public AnnotationLabels(AlignViewport av)
76 public void setScrollOffset(int y)
85 * @return -2 if no rows are visible at all, -1 if no visible rows were
88 int getSelectedRow(int y)
91 AlignmentAnnotation[] aa = ap.av.alignment.getAlignmentAnnotation();
98 for (int i = 0; i < aa.length; i++)
105 height += aa[i].height;
116 public void actionPerformed(ActionEvent evt)
118 AlignmentAnnotation[] aa = av.alignment.getAlignmentAnnotation();
120 if (evt.getActionCommand().equals(ADDNEW))
122 AlignmentAnnotation newAnnotation = new AlignmentAnnotation("", null,
123 new Annotation[ap.av.alignment.getWidth()]);
125 if (!editLabelDescription(newAnnotation))
130 ap.av.alignment.addAnnotation(newAnnotation);
131 ap.av.alignment.setAnnotationIndex(newAnnotation, 0);
133 else if (evt.getActionCommand().equals(EDITNAME))
135 editLabelDescription(aa[selectedRow]);
137 else if (evt.getActionCommand().equals(HIDE))
139 aa[selectedRow].visible = false;
141 else if (evt.getActionCommand().equals(SHOWALL))
143 for (int i = 0; i < aa.length; i++)
145 aa[i].visible = (aa[i].annotations == null) ? false : true;
148 else if (evt.getActionCommand().equals(OUTPUT_TEXT))
150 CutAndPasteTransfer cap = new CutAndPasteTransfer(false,
152 Frame frame = new Frame();
154 jalview.bin.JalviewLite.addFrame(frame, ap.alignFrame.getTitle()
155 + " - " + aa[selectedRow].label, 500, 100);
156 cap.setText(aa[selectedRow].toString());
158 else if (evt.getActionCommand().equals(COPYCONS_SEQ))
160 SequenceI cons = av.getConsensusSeq();
163 copy_annotseqtoclipboard(cons);
167 ap.annotationPanel.adjustPanelHeight();
168 setSize(getSize().width, ap.annotationPanel.getSize().height);
170 ap.paintAlignment(true);
173 boolean editLabelDescription(AlignmentAnnotation annotation)
175 Checkbox padGaps = new Checkbox("Fill Empty Gaps With \""
176 + ap.av.getGapCharacter() + "\"", annotation.padGaps);
178 EditNameDialog dialog = new EditNameDialog(annotation.label,
179 annotation.description, " Annotation Label",
180 "Annotation Description", ap.alignFrame,
181 "Edit Annotation Name / Description", 500, 180, false);
183 Panel empty = new Panel(new FlowLayout());
188 dialog.setVisible(true);
192 annotation.label = dialog.getName();
193 annotation.description = dialog.getDescription();
194 annotation.setPadGaps(padGaps.getState(), av.getGapCharacter());
203 public void mouseMoved(MouseEvent evt)
205 int row = getSelectedRow(evt.getY() - scrollOffset);
211 tooltip = new Tooltip(
212 ap.av.alignment.getAlignmentAnnotation()[row]
213 .getDescription(true),
218 tooltip.setTip(ap.av.alignment.getAlignmentAnnotation()[row]
219 .getDescription(true));
222 else if (tooltip != null)
229 public void mouseDragged(MouseEvent evt)
233 public void mouseClicked(MouseEvent evt)
237 public void mouseReleased(MouseEvent evt)
241 public void mouseEntered(MouseEvent evt)
245 public void mouseExited(MouseEvent evt)
249 public void mousePressed(MouseEvent evt)
251 selectedRow = getSelectedRow(evt.getY() - scrollOffset);
253 AlignmentAnnotation[] aa = ap.av.alignment.getAlignmentAnnotation();
255 PopupMenu popup = new PopupMenu("Annotations");
257 MenuItem item = new MenuItem(ADDNEW);
258 item.addActionListener(this);
262 // this never happens at moment: - see comment on JAL-563
265 item = new MenuItem(SHOWALL);
266 item.addActionListener(this);
270 popup.show(this, evt.getX(), evt.getY());
273 // add the rest if there are actually rows to show
274 item = new MenuItem(EDITNAME);
275 item.addActionListener(this);
277 item = new MenuItem(HIDE);
278 item.addActionListener(this);
282 item = new MenuItem(SHOWALL);
283 item.addActionListener(this);
287 item = new MenuItem(OUTPUT_TEXT);
288 item.addActionListener(this);
291 if (aa[selectedRow] == ap.av.consensus)
293 popup.addSeparator();
294 final CheckboxMenuItem cbmi = new CheckboxMenuItem(
295 "Ignore Gaps In Consensus", ap.av.getIgnoreGapsConsensus());
297 cbmi.addItemListener(new ItemListener()
299 public void itemStateChanged(ItemEvent e)
301 ap.av.setIgnoreGapsConsensus(cbmi.getState());
302 ap.paintAlignment(true);
306 item = new MenuItem(COPYCONS_SEQ);
307 item.addActionListener(this);
311 popup.show(this, evt.getX(), evt.getY());
321 protected void copy_annotseqtoclipboard(SequenceI sq)
323 if (sq == null || sq.getLength() < 1)
327 jalview.appletgui.AlignFrame.copiedSequences = new StringBuffer();
328 jalview.appletgui.AlignFrame.copiedSequences.append(sq.getName() + "\t"
329 + sq.getStart() + "\t" + sq.getEnd() + "\t"
330 + sq.getSequenceAsString() + "\n");
331 if (av.hasHiddenColumns)
333 jalview.appletgui.AlignFrame.copiedHiddenColumns = new Vector();
334 for (int i = 0; i < av.getColumnSelection().getHiddenColumns().size(); i++)
336 int[] region = (int[]) av.getColumnSelection().getHiddenColumns()
339 jalview.appletgui.AlignFrame.copiedHiddenColumns
340 .addElement(new int[]
341 { region[0], region[1] });
346 public void update(Graphics g)
351 public void paint(Graphics g)
353 int w = getSize().width;
354 if (image == null || w != image.getWidth(this))
356 image = createImage(w, ap.annotationPanel.getSize().height);
359 drawComponent(image.getGraphics(), w);
360 g.drawImage(image, 0, 0, this);
363 public void drawComponent(Graphics g, int width)
365 g.setFont(av.getFont());
366 FontMetrics fm = g.getFontMetrics(av.getFont());
367 g.setColor(Color.white);
368 g.fillRect(0, 0, getSize().width, getSize().height);
370 g.translate(0, scrollOffset);
371 g.setColor(Color.black);
373 AlignmentAnnotation[] aa = av.alignment.getAlignmentAnnotation();
374 int y = 0, fy = g.getFont().getSize();
379 hasHiddenRows = false;
380 for (int i = 0; i < aa.length; i++)
384 hasHiddenRows = true;
388 x = width - fm.stringWidth(aa[i].label) - 3;
391 offset = -(aa[i].height - fy) / 2;
393 g.drawString(aa[i].label, x, y + offset);