2 * Jalview - A Sequence Alignment Editor and Viewer (Version 2.5.1)
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 selected
87 int getSelectedRow(int y)
90 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(ap.av.alignment.getAlignmentAnnotation()[row]
212 .getDescription(true), this);
216 tooltip.setTip(ap.av.alignment.getAlignmentAnnotation()[row]
217 .getDescription(true));
220 else if (tooltip != null)
227 public void mouseDragged(MouseEvent evt)
231 public void mouseClicked(MouseEvent evt)
235 public void mouseReleased(MouseEvent evt)
239 public void mouseEntered(MouseEvent evt)
243 public void mouseExited(MouseEvent evt)
247 public void mousePressed(MouseEvent evt)
249 selectedRow = getSelectedRow(evt.getY() - scrollOffset);
251 AlignmentAnnotation[] aa = ap.av.alignment.getAlignmentAnnotation();
253 PopupMenu popup = new PopupMenu("Annotations");
255 MenuItem item = new MenuItem(ADDNEW);
256 item.addActionListener(this);
260 // this never happens at moment: - see comment on JAL-563
263 item = new MenuItem(SHOWALL);
264 item.addActionListener(this);
268 popup.show(this, evt.getX(), evt.getY());
271 // add the rest if there are actually rows to show
272 item = new MenuItem(EDITNAME);
273 item.addActionListener(this);
275 item = new MenuItem(HIDE);
276 item.addActionListener(this);
279 item = new MenuItem(SHOWALL);
280 item.addActionListener(this);
284 item = new MenuItem(OUTPUT_TEXT);
285 item.addActionListener(this);
288 if (aa[selectedRow] == ap.av.consensus)
290 popup.addSeparator();
291 final CheckboxMenuItem cbmi = new CheckboxMenuItem(
292 "Ignore Gaps In Consensus", ap.av.getIgnoreGapsConsensus());
294 cbmi.addItemListener(new ItemListener()
296 public void itemStateChanged(ItemEvent e)
298 ap.av.setIgnoreGapsConsensus(cbmi.getState());
299 ap.paintAlignment(true);
303 item = new MenuItem(COPYCONS_SEQ);
304 item.addActionListener(this);
308 popup.show(this, evt.getX(), evt.getY());
318 protected void copy_annotseqtoclipboard(SequenceI sq)
320 if (sq == null || sq.getLength() < 1)
324 jalview.appletgui.AlignFrame.copiedSequences = new StringBuffer();
325 jalview.appletgui.AlignFrame.copiedSequences.append(sq.getName() + "\t"
326 + sq.getStart() + "\t" + sq.getEnd() + "\t"
327 + sq.getSequenceAsString() + "\n");
328 if (av.hasHiddenColumns)
330 jalview.appletgui.AlignFrame.copiedHiddenColumns = new Vector();
331 for (int i = 0; i < av.getColumnSelection().getHiddenColumns().size(); i++)
333 int[] region = (int[]) av.getColumnSelection().getHiddenColumns()
336 jalview.appletgui.AlignFrame.copiedHiddenColumns
337 .addElement(new int[]
338 { region[0], region[1] });
343 public void update(Graphics g)
348 public void paint(Graphics g)
350 int w = getSize().width;
351 if (image == null || w != image.getWidth(this))
353 image = createImage(w, ap.annotationPanel.getSize().height);
356 drawComponent(image.getGraphics(), w);
357 g.drawImage(image, 0, 0, this);
360 public void drawComponent(Graphics g, int width)
362 g.setFont(av.getFont());
363 FontMetrics fm = g.getFontMetrics(av.getFont());
364 g.setColor(Color.white);
365 g.fillRect(0, 0, getSize().width, getSize().height);
367 g.translate(0, scrollOffset);
368 g.setColor(Color.black);
370 AlignmentAnnotation[] aa = av.alignment.getAlignmentAnnotation();
371 int y = 0, fy=g.getFont().getSize();
377 for (int i = 0; i < aa.length; i++)
385 x = width - fm.stringWidth(aa[i].label) - 3;
388 offset = -(aa[i].height-fy)/2;
390 g.drawString(aa[i].label, x, y+offset);