/* * Licensed Materials - Property of Perforce Software, Inc. * © Copyright Perforce Software, Inc. 2014, 2021 * © Copyright IBM Corp. 2009, 2014 * © Copyright ILOG 1996, 2009 * All Rights Reserved. * * Note to U.S. Government Users Restricted Rights: * The Software and Documentation were developed at private expense and * are "Commercial Items" as that term is defined at 48 CFR 2.101, * consisting of "Commercial Computer Software" and * "Commercial Computer Software Documentation", as such terms are * used in 48 CFR 12.212 or 48 CFR 227.7202-1 through 227.7202-4, * as applicable. */ package interactor; import java.awt.AWTEvent; import java.awt.event.*; import java.util.Locale; import ilog.views.chart.IlvChartInteractor; import ilog.views.chart.IlvDisplayPoint; import ilog.views.chart.event.ChartHighlightInteractionEvent; import ilog.views.util.IlvResourceUtil; /** * An interactor that notifies the listeners when the mouse cursor is * over a point. * <p> The registered name of this interactor is "Highlight". * @see ilog.views.chart.IlvChartInteractor */ public class IlvChartHighlightInteractor extends IlvChartDataInteractor { // ============================ Metainformation ============================ static { IlvChartInteractor.register("Highlight", IlvChartHighlightInteractor.class); } /** * Returns a localized name for this interactor class. */ public static String getLocalizedName(Locale locale) { return IlvResourceUtil.getBundle("messages", IlvChartHighlightInteractor.class, locale) .getString("IlvChartHighlightInteractor"); } // ===================== Customization, Bean Properties ===================== /** * Highlight mode used to highlight points. * @see #setHighlightMode */ public static final int HIGHLIGHT_POINT = 0; /** * Highlight mode used to highlight data sets. * @see #setHighlightMode */ public static final int HIGHLIGHT_SERIES = 1; private int _highlightMode = HIGHLIGHT_POINT; /** * Returns the highlight mode. * @see #setHighlightMode */ public int getHighlightMode() { return _highlightMode; } /** * Sets the highlight mode. * @param highlightMode The highlight mode. If set to * {@link #HIGHLIGHT_POINT}, a pair of highlight and unhighlight events is * sent whenever the mouse enters and leaves a display point. If set to * {@link #HIGHLIGHT_SERIES}, the highlight and unhighlight events * are sent only if the new display point does not belong to the * same data set as the previously highlighted point. The default mode is * <code>HIGHLIGHT_POINT</code>. * @see #getHighlightMode * @throws IllegalArgumentException The mode is invalid. */ public void setHighlightMode(int highlightMode) { if (highlightMode != HIGHLIGHT_POINT && highlightMode != HIGHLIGHT_SERIES) throw new IllegalArgumentException("Bad Highlight Mode"); _highlightMode = highlightMode; } // ============================ State Variables ============================ private transient IlvDisplayPoint _highlightedPoint; /** * Returns the current highlighted point. */ public IlvDisplayPoint getHighlightedPoint() { return (_highlightedPoint != null ? (IlvDisplayPoint)_highlightedPoint.clone() : null); } /** * Sets the current highlighted point. */ public void setHighlightedPoint(IlvDisplayPoint point) { _highlightedPoint = (point != null ? (IlvDisplayPoint)point.clone() : null); } // ========================= Mouse event handling ========================= /** * Returns whether the mouse event occurred at the specified * location should be handled by the interactor. * By default, returns <code>true</code>. */ Override public boolean isHandling(int x, int y) { // required to take into account the cases when the cursor // leaves the plotrect return true; } /** * Processes a mouse event. */ Override public void processMouseEvent(MouseEvent event) { switch (event.getID()) { case MouseEvent.MOUSE_ENTERED: if (event.getButton() == MouseEvent.NOBUTTON) processMouseMovedEvent(event); break; case MouseEvent.MOUSE_EXITED: // Just to remove the existing tooltip. But do // not consume the event. if (_highlightedPoint != null) { doIt(_highlightedPoint, false, event); } // reinit for oldPoint _highlightedPoint = null; break; } } /** * Processes a mouse motion event. */ Override public void processMouseMotionEvent(MouseEvent event) { switch (event.getID()) { case MouseEvent.MOUSE_MOVED: processMouseMovedEvent(event); break; } } /** * Processes a mouse motion event with no button pressed. * @param event An event of type <code>MOUSE_MOVED</code> or * <code>MOUSE_ENTERED</code>. * */ public void processMouseMovedEvent(MouseEvent event) { IlvDisplayPoint oldPoint = _highlightedPoint; _highlightedPoint = pickData(createDataPicker(event)); if (_highlightedPoint != null) { // if new point, notify changes if (oldPoint != null) { if (!checkEqual(_highlightedPoint, oldPoint)) { // turn off old point doIt(oldPoint, false, event); // highlight new point doIt(_highlightedPoint, true, event); } else return; } else { // highlight new point doIt(_highlightedPoint, true, event); } if (isConsumeEvents()) event.consume(); } else if (oldPoint != null) { // nomore point... leaving oldpoint doIt(oldPoint, false, event); } } /** * Checks whether the two points are considered equal for (un)highlight * purposes. */ private boolean checkEqual(IlvDisplayPoint oldPoint, IlvDisplayPoint newPoint) { if (getHighlightMode()==HIGHLIGHT_SERIES) return (oldPoint.getDataSet() == newPoint.getDataSet()); else // HIGHLIGHT_POINT return oldPoint.equals(newPoint); } // ========================== Overridable behavior ========================== /** * Called by the <code>processXXXEvent()</code> methods when the highlight * state of the given point has changed. By default, fires a * {@link ilog.views.chart.event.ChartHighlightInteractionEvent}. * @param highlightedPoint The display point. * @param isHighlighted The type of notification that occurred. * @param event The <code>mouseEvent</code> that leads to this notification. * @see ilog.views.chart.IlvChartInteractor#addChartInteractionListener * @see ilog.views.chart.event.ChartInteractionEvent */ protected void doIt(IlvDisplayPoint highlightedPoint, boolean isHighlighted, MouseEvent event) { IlvDisplayPoint pt = (IlvDisplayPoint)highlightedPoint.clone(); fireChartInteractionEvent( new ChartHighlightInteractionEvent(this, pt, isHighlighted)); } // ============================= Constructors ============================= /** * Creates a new <code>IlvChartHighlightInteractor</code> object linked to * the first Y-axis index. */ public IlvChartHighlightInteractor() { this(0); } /** * Creates a new <code>IlvChartHighlightInteractor</code> object linked to * the given axis. */ public IlvChartHighlightInteractor(int yAxisIndex) { super(yAxisIndex,0); enableEvents(AWTEvent.MOUSE_MOTION_EVENT_MASK | AWTEvent.MOUSE_EVENT_MASK); setXORGhost(false); } }