/*
- * Jalview - A Sequence Alignment Editor and Viewer (Version 2.5)
+ * Jalview - A Sequence Alignment Editor and Viewer (Version 2.6)
* Copyright (C) 2010 J Procter, AM Waterhouse, G Barton, M Clamp, S Searle
*
* This file is part of Jalview.
import java.awt.*;
import java.awt.event.*;
+import java.awt.image.BufferedImage;
import jalview.datamodel.*;
Tooltip tooltip;
+ private boolean hasHiddenRows;
+
public AnnotationLabels(AlignmentPanel ap)
{
this.ap = ap;
this.av = ap.av;
setLayout(null);
+
+ java.net.URL url = getClass().getResource("/images/idwidth.gif");
+ Image temp = null;
+
+ if (url != null)
+ {
+ temp = java.awt.Toolkit.getDefaultToolkit().createImage(url);
+ }
+
+ try
+ {
+ MediaTracker mt = new MediaTracker(this);
+ mt.addImage(temp, 0);
+ mt.waitForID(0);
+ } catch (Exception ex)
+ {
+ }
+
+ BufferedImage bi = new BufferedImage(temp.getHeight(this),
+ temp.getWidth(this), BufferedImage.TYPE_INT_RGB);
+ Graphics2D g = (Graphics2D) bi.getGraphics();
+ g.rotate(Math.toRadians(90));
+ g.drawImage(temp, 0, -bi.getWidth(this), this);
+ image = (Image) bi;
+
addMouseListener(this);
addMouseMotionListener(this);
}
repaint();
}
+ /**
+ *
+ * @param y
+ * @return -2 if no rows are visible at all, -1 if no visible rows were
+ * selected
+ */
int getSelectedRow(int y)
{
- int row = -1;
+ int row = -2;
AlignmentAnnotation[] aa = ap.av.alignment.getAlignmentAnnotation();
if (aa == null)
{
return row;
}
-
int height = 0;
for (int i = 0; i < aa.length; i++)
{
+ row = -1;
if (!aa[i].visible)
{
continue;
}
-
height += aa[i].height;
if (y < height)
{
}
+ boolean resizePanel = false;
+
public void mouseMoved(MouseEvent evt)
{
- int row = getSelectedRow(evt.getY() - scrollOffset);
+ resizePanel = evt.getY() < 10;
+
+ int row = getSelectedRow(evt.getY() + scrollOffset);
if (row > -1)
{
if (tooltip == null)
{
- tooltip = new Tooltip(ap.av.alignment.getAlignmentAnnotation()[row]
- .getDescription(true), this);
+ tooltip = new Tooltip(
+ ap.av.alignment.getAlignmentAnnotation()[row]
+ .getDescription(true),
+ this);
}
else
{
}
+ MouseEvent dragEvent = null;
+
public void mouseDragged(MouseEvent evt)
{
+ dragEvent = evt;
+
+ if (resizePanel)
+ {
+ Dimension d = ap.annotationPanelHolder.getSize(),e = ap.annotationSpaceFillerHolder.getSize();;
+ int dif = evt.getY() - oldY;
+
+ dif /= ap.av.charHeight;
+ dif *= ap.av.charHeight;
+
+ if ((d.height - dif) > 20)
+ {
+
+ setPreferredSize(new Dimension(e.width,d.height-dif));
+ ap.annotationSpaceFillerHolder.setPreferredSize(new Dimension(e.width, d.height - dif));
+ ap.annotationPanelHolder.setPreferredSize(new Dimension(d.width, d.height - dif));
+ ap.apvscroll.setValues(ap.apvscroll.getValue(), d.height-dif, 0, ap.annotationPanel.adjustPanelHeight(false));
+
+ ap.validate();
+ //ap.paintAlignment(true);
+ }
+
+ ap.addNotify();
+ }
+ else
+ {
+ repaint();
+ }
}
public void mouseClicked(MouseEvent evt)
public void mouseReleased(MouseEvent evt)
{
+ resizePanel = false;
+ dragEvent = null;
+ repaint();
+ ap.annotationPanel.repaint();
}
public void mouseEntered(MouseEvent evt)
{
+ if (evt.getY() < 10)
+ {
+ resizePanel = true;
+ repaint();
+ }
}
public void mouseExited(MouseEvent evt)
{
+
+ if (dragEvent == null)
+ {
+ resizePanel = false;
+ }
+ else
+ {
+ if (!resizePanel)
+ {
+ dragEvent = null;
+ }
+ }
+ repaint();
}
public void mousePressed(MouseEvent evt)
{
- selectedRow = getSelectedRow(evt.getY() - scrollOffset);
+ oldY = evt.getY();
+ // todo: move below to mouseClicked ?
+ selectedRow = getSelectedRow(evt.getY() + scrollOffset);
AlignmentAnnotation[] aa = ap.av.alignment.getAlignmentAnnotation();
- PopupMenu popup = new PopupMenu("Annotations");
-
- MenuItem item = new MenuItem(ADDNEW);
- item.addActionListener(this);
- popup.add(item);
- if (aa == null)
+ // DETECT RIGHT MOUSE BUTTON IN AWT
+ if ((evt.getModifiers() & InputEvent.BUTTON3_MASK) == InputEvent.BUTTON3_MASK)
{
- popup.show(this, evt.getX(), evt.getY());
- return;
- }
- // add the rest if there are actually rows to show
- item = new MenuItem(EDITNAME);
- item.addActionListener(this);
- popup.add(item);
- item = new MenuItem(HIDE);
- item.addActionListener(this);
- popup.add(item);
- item = new MenuItem(SHOWALL);
- item.addActionListener(this);
- popup.add(item);
- this.add(popup);
- item = new MenuItem(OUTPUT_TEXT);
- item.addActionListener(this);
- popup.add(item);
-
- if (aa[selectedRow] == ap.av.consensus)
- {
- popup.addSeparator();
- final CheckboxMenuItem cbmi = new CheckboxMenuItem(
- "Ignore Gaps In Consensus", ap.av.getIgnoreGapsConsensus());
+ PopupMenu popup = new PopupMenu("Annotations");
- cbmi.addItemListener(new ItemListener()
+ MenuItem item = new MenuItem(ADDNEW);
+ item.addActionListener(this);
+ popup.add(item);
+ if (selectedRow < 0)
{
- public void itemStateChanged(ItemEvent e)
+ // this never happens at moment: - see comment on JAL-563
+ if (hasHiddenRows)
{
- ap.av.setIgnoreGapsConsensus(cbmi.getState());
- ap.paintAlignment(true);
+ item = new MenuItem(SHOWALL);
+ item.addActionListener(this);
+ popup.add(item);
}
- });
- popup.add(cbmi);
- item = new MenuItem(COPYCONS_SEQ);
+ this.add(popup);
+ popup.show(this, evt.getX(), evt.getY());
+ return;
+ }
+ // add the rest if there are actually rows to show
+ item = new MenuItem(EDITNAME);
item.addActionListener(this);
popup.add(item);
+ item = new MenuItem(HIDE);
+ item.addActionListener(this);
+ popup.add(item);
+ if (hasHiddenRows)
+ {
+ item = new MenuItem(SHOWALL);
+ item.addActionListener(this);
+ popup.add(item);
+ }
+ this.add(popup);
+ item = new MenuItem(OUTPUT_TEXT);
+ item.addActionListener(this);
+ popup.add(item);
+
+ if (aa[selectedRow] == ap.av.consensus)
+ {
+ popup.addSeparator();
+ final CheckboxMenuItem cbmi = new CheckboxMenuItem(
+ "Ignore Gaps In Consensus", ap.av.getIgnoreGapsConsensus());
+
+ cbmi.addItemListener(new ItemListener()
+ {
+ public void itemStateChanged(ItemEvent e)
+ {
+ ap.av.setIgnoreGapsConsensus(cbmi.getState());
+ ap.paintAlignment(true);
+ }
+ });
+ popup.add(cbmi);
+ item = new MenuItem(COPYCONS_SEQ);
+ item.addActionListener(this);
+ popup.add(item);
+ }
+
+ popup.show(this, evt.getX(), evt.getY());
}
+ else
+ {
+ // selection action.
+ if (selectedRow > -1 && selectedRow < aa.length)
+ {
+ if (aa[selectedRow].groupRef != null)
+ {
+ if (evt.getClickCount() >= 2)
+ {
+ // todo: make the ap scroll to the selection - not necessary, first
+ // click highlights/scrolls, second selects
+ ap.seqPanel.ap.idPanel.highlightSearchResults(null);
+ ap.av.setSelectionGroup(// new SequenceGroup(
+ aa[selectedRow].groupRef); // );
+ ap.av.sendSelection();
+ ap.paintAlignment(false);
+ PaintRefresher.Refresh(ap, ap.av.getSequenceSetId());
+ }
+ else
+ {
+ ap.seqPanel.ap.idPanel
+ .highlightSearchResults(aa[selectedRow].groupRef
+ .getSequences(null));
+ }
+ return;
+ }
+ else if (aa[selectedRow].sequenceRef != null)
+ {
+ Vector sr = new Vector();
+ sr.addElement(aa[selectedRow].sequenceRef);
+ if (evt.getClickCount() == 1)
+ {
+ ap.seqPanel.ap.idPanel.highlightSearchResults(sr);
+ }
+ else if (evt.getClickCount() >= 2)
+ {
+ ap.seqPanel.ap.idPanel.highlightSearchResults(null);
+ SequenceGroup sg = new SequenceGroup();
+ sg.addSequence(aa[selectedRow].sequenceRef, false);
+ ap.av.setSelectionGroup(sg);
+ ap.paintAlignment(false);
+ PaintRefresher.Refresh(ap, ap.av.getSequenceSetId());
+ ap.av.sendSelection();
+ }
- popup.show(this, evt.getX(), evt.getY());
+ }
+ }
+ }
}
/**
g.setColor(Color.white);
g.fillRect(0, 0, getSize().width, getSize().height);
- g.translate(0, scrollOffset);
+ g.translate(0, -scrollOffset);
g.setColor(Color.black);
AlignmentAnnotation[] aa = av.alignment.getAlignmentAnnotation();
- int y = g.getFont().getSize();
- int x = 0;
+ int y = 0, fy = g.getFont().getSize();
+ int x = 0, offset;
if (aa != null)
{
+ hasHiddenRows = false;
for (int i = 0; i < aa.length; i++)
{
if (!aa[i].visible)
{
+ hasHiddenRows = true;
continue;
}
x = width - fm.stringWidth(aa[i].label) - 3;
- if (aa[i].graph > 0)
- {
- y += (aa[i].height / 3);
- }
-
- g.drawString(aa[i].label, x, y);
+ y += aa[i].height;
+ offset = -(aa[i].height - fy) / 2;
- if (aa[i].graph > 0)
- {
- y += (2 * aa[i].height / 3);
- }
- else
- {
- y += aa[i].height;
- }
+ g.drawString(aa[i].label, x, y + offset);
}
}
+ g.translate(0, +scrollOffset);
+ if (resizePanel)
+ {
+ g.setColor(Color.red);
+ g.setPaintMode();
+ g.drawLine(2, 8, 5, 2);
+ g.drawLine(5, 2, 8, 8);
+ }
+ else if (dragEvent != null && aa != null)
+ {
+ g.setColor(Color.lightGray);
+ g.drawString(aa[selectedRow].label, dragEvent.getX(),
+ dragEvent.getY());
+ }
+
+ if ((aa == null) || (aa.length < 1))
+ {
+ g.setColor(Color.black);
+ g.drawString("Right click", 2, 8);
+ g.drawString("to add annotation", 2, 18);
+ }
}
}