2 * Jalview - A Sequence Alignment Editor and Viewer (Version 2.5)
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();
97 for (int i = 0; i < aa.length; i++)
104 height += aa[i].height;
115 public void actionPerformed(ActionEvent evt)
117 AlignmentAnnotation[] aa = av.alignment.getAlignmentAnnotation();
119 if (evt.getActionCommand().equals(ADDNEW))
121 AlignmentAnnotation newAnnotation = new AlignmentAnnotation("", null,
122 new Annotation[ap.av.alignment.getWidth()]);
124 if (!editLabelDescription(newAnnotation))
129 ap.av.alignment.addAnnotation(newAnnotation);
130 ap.av.alignment.setAnnotationIndex(newAnnotation, 0);
132 else if (evt.getActionCommand().equals(EDITNAME))
134 editLabelDescription(aa[selectedRow]);
136 else if (evt.getActionCommand().equals(HIDE))
138 aa[selectedRow].visible = false;
140 else if (evt.getActionCommand().equals(SHOWALL))
142 for (int i = 0; i < aa.length; i++)
144 aa[i].visible = (aa[i].annotations == null) ? false : true;
147 else if (evt.getActionCommand().equals(OUTPUT_TEXT))
149 CutAndPasteTransfer cap = new CutAndPasteTransfer(false,
151 Frame frame = new Frame();
153 jalview.bin.JalviewLite.addFrame(frame, ap.alignFrame.getTitle()
154 + " - " + aa[selectedRow].label, 500, 100);
155 cap.setText(aa[selectedRow].toString());
157 else if (evt.getActionCommand().equals(COPYCONS_SEQ))
159 SequenceI cons = av.getConsensusSeq();
162 copy_annotseqtoclipboard(cons);
166 ap.annotationPanel.adjustPanelHeight();
167 setSize(getSize().width, ap.annotationPanel.getSize().height);
169 ap.paintAlignment(true);
172 boolean editLabelDescription(AlignmentAnnotation annotation)
174 Checkbox padGaps = new Checkbox("Fill Empty Gaps With \""
175 + ap.av.getGapCharacter() + "\"", annotation.padGaps);
177 EditNameDialog dialog = new EditNameDialog(annotation.label,
178 annotation.description, " Annotation Label",
179 "Annotation Description", ap.alignFrame,
180 "Edit Annotation Name / Description", 500, 180, false);
182 Panel empty = new Panel(new FlowLayout());
187 dialog.setVisible(true);
191 annotation.label = dialog.getName();
192 annotation.description = dialog.getDescription();
193 annotation.setPadGaps(padGaps.getState(), av.getGapCharacter());
202 public void mouseMoved(MouseEvent evt)
204 int row = getSelectedRow(evt.getY() - scrollOffset);
210 tooltip = new Tooltip(ap.av.alignment.getAlignmentAnnotation()[row]
211 .getDescription(true), this);
215 tooltip.setTip(ap.av.alignment.getAlignmentAnnotation()[row]
216 .getDescription(true));
219 else if (tooltip != null)
226 public void mouseDragged(MouseEvent evt)
230 public void mouseClicked(MouseEvent evt)
234 public void mouseReleased(MouseEvent evt)
238 public void mouseEntered(MouseEvent evt)
242 public void mouseExited(MouseEvent evt)
246 public void mousePressed(MouseEvent evt)
248 selectedRow = getSelectedRow(evt.getY() - scrollOffset);
250 AlignmentAnnotation[] aa = ap.av.alignment.getAlignmentAnnotation();
252 PopupMenu popup = new PopupMenu("Annotations");
254 MenuItem item = new MenuItem(ADDNEW);
255 item.addActionListener(this);
259 // this never happens at moment: - see comment on JAL-563
262 item = new MenuItem(SHOWALL);
263 item.addActionListener(this);
267 popup.show(this, evt.getX(), evt.getY());
270 // add the rest if there are actually rows to show
271 item = new MenuItem(EDITNAME);
272 item.addActionListener(this);
274 item = new MenuItem(HIDE);
275 item.addActionListener(this);
278 item = new MenuItem(SHOWALL);
279 item.addActionListener(this);
283 item = new MenuItem(OUTPUT_TEXT);
284 item.addActionListener(this);
287 if (aa[selectedRow] == ap.av.consensus)
289 popup.addSeparator();
290 final CheckboxMenuItem cbmi = new CheckboxMenuItem(
291 "Ignore Gaps In Consensus", ap.av.getIgnoreGapsConsensus());
293 cbmi.addItemListener(new ItemListener()
295 public void itemStateChanged(ItemEvent e)
297 ap.av.setIgnoreGapsConsensus(cbmi.getState());
298 ap.paintAlignment(true);
302 item = new MenuItem(COPYCONS_SEQ);
303 item.addActionListener(this);
307 popup.show(this, evt.getX(), evt.getY());
317 protected void copy_annotseqtoclipboard(SequenceI sq)
319 if (sq == null || sq.getLength() < 1)
323 jalview.appletgui.AlignFrame.copiedSequences = new StringBuffer();
324 jalview.appletgui.AlignFrame.copiedSequences.append(sq.getName() + "\t"
325 + sq.getStart() + "\t" + sq.getEnd() + "\t"
326 + sq.getSequenceAsString() + "\n");
327 if (av.hasHiddenColumns)
329 jalview.appletgui.AlignFrame.copiedHiddenColumns = new Vector();
330 for (int i = 0; i < av.getColumnSelection().getHiddenColumns().size(); i++)
332 int[] region = (int[]) av.getColumnSelection().getHiddenColumns()
335 jalview.appletgui.AlignFrame.copiedHiddenColumns
336 .addElement(new int[]
337 { region[0], region[1] });
342 public void update(Graphics g)
347 public void paint(Graphics g)
349 int w = getSize().width;
350 if (image == null || w != image.getWidth(this))
352 image = createImage(w, ap.annotationPanel.getSize().height);
355 drawComponent(image.getGraphics(), w);
356 g.drawImage(image, 0, 0, this);
359 public void drawComponent(Graphics g, int width)
361 g.setFont(av.getFont());
362 FontMetrics fm = g.getFontMetrics(av.getFont());
363 g.setColor(Color.white);
364 g.fillRect(0, 0, getSize().width, getSize().height);
366 g.translate(0, scrollOffset);
367 g.setColor(Color.black);
369 AlignmentAnnotation[] aa = av.alignment.getAlignmentAnnotation();
370 int y = 0, fy=g.getFont().getSize();
376 for (int i = 0; i < aa.length; i++)
384 x = width - fm.stringWidth(aa[i].label) - 3;
387 offset = -(aa[i].height-fy)/2;
389 g.drawString(aa[i].label, x, y+offset);