import jalview.renderer.AwtRenderPanelI;
/**
- * DOCUMENT ME!
- *
+ * AnnotationPanel displays visible portion of annotation rows below unwrapped alignment
* @author $author$
* @version $Revision$
*/
public class AnnotationPanel extends JPanel implements AwtRenderPanelI,
- MouseListener, MouseMotionListener, ActionListener,
- AdjustmentListener
+ MouseListener, MouseWheelListener, MouseMotionListener,
+ ActionListener, AdjustmentListener, Scrollable
{
final String HELIX = "Helix";
public final AnnotationRenderer renderer;
+ private MouseWheelListener[] _mwl;
+
/**
* Creates a new AnnotationPanel object.
*
addMouseMotionListener(this);
ap.annotationScroller.getVerticalScrollBar()
.addAdjustmentListener(this);
+ // save any wheel listeners on the scroller, so we can propagate scroll events to them.
+ _mwl = ap.annotationScroller.getMouseWheelListeners();
+ // and then set our own listener to consume all mousewheel events
+ ap.annotationScroller.addMouseWheelListener(this);
renderer = new AnnotationRenderer();
}
renderer = new AnnotationRenderer();
}
- /**
- * DOCUMENT ME!
- *
- * @param evt
- * DOCUMENT ME!
+ @Override
+ public void mouseWheelMoved(MouseWheelEvent e)
+ {
+ if (e.isShiftDown())
+ {
+ e.consume();
+ if (e.getWheelRotation() > 0)
+ {
+ ap.scrollRight(true);
+ }
+ else
+ {
+ ap.scrollRight(false);
+ }
+ }
+ else
+ {
+ // TODO: find the correct way to let the event bubble up to ap.annotationScroller
+ for (MouseWheelListener mwl : _mwl)
+ {
+ if (mwl != null)
+ {
+ mwl.mouseWheelMoved(e);
+ }
+ if (e.isConsumed())
+ {
+ break;
+ }
+ }
+ }
+ }
+
+ @Override
+ public Dimension getPreferredScrollableViewportSize()
+ {
+ return getPreferredSize();
+ }
+
+ @Override
+ public int getScrollableBlockIncrement(Rectangle visibleRect,
+ int orientation, int direction)
+ {
+ return 30;
+ }
+
+ @Override
+ public boolean getScrollableTracksViewportHeight()
+ {
+ return false;
+ }
+
+ @Override
+ public boolean getScrollableTracksViewportWidth()
+ {
+ return true;
+ }
+
+ @Override
+ public int getScrollableUnitIncrement(Rectangle visibleRect,
+ int orientation, int direction)
+ {
+ return 30;
+ }
+
+ /*
+ * (non-Javadoc)
+ * @see java.awt.event.AdjustmentListener#adjustmentValueChanged(java.awt.event.AdjustmentEvent)
*/
@Override
public void adjustmentValueChanged(AdjustmentEvent evt)
{
+ // update annotation label display
ap.alabels.setScrollOffset(-evt.getValue());
}
*/
public int adjustPanelHeight()
{
- int height = calcPanelHeight();
+ int height = av.calcPanelHeight();
this.setPreferredSize(new Dimension(1, height));
if (ap != null)
{
}
/**
- * calculate the height for visible annotation, revalidating bounds where
- * necessary ABSTRACT GUI METHOD
- *
- * @return total height of annotation
- */
- public int calcPanelHeight()
- {
- // setHeight of panels
- AlignmentAnnotation[] aa = av.getAlignment().getAlignmentAnnotation();
- int height = 0;
-
- if (aa != null)
- {
- for (int i = 0; i < aa.length; i++)
- {
- if (aa[i] == null)
- {
- System.err.println("Null annotation row: ignoring.");
- continue;
- }
- if (!aa[i].visible)
- {
- continue;
- }
-
- aa[i].height = 0;
-
- if (aa[i].hasText)
- {
- aa[i].height += av.charHeight;
- }
-
- if (aa[i].hasIcons)
- {
- aa[i].height += 16;
- }
-
- if (aa[i].graph > 0)
- {
- aa[i].height += aa[i].graphHeight;
- }
-
- if (aa[i].height == 0)
- {
- aa[i].height = 20;
- }
-
- height += aa[i].height;
- }
- }
- if (height == 0)
- {
- // set minimum
- height = 20;
- }
- return height;
- }
-
- /**
* DOCUMENT ME!
*
* @param evt