/*
* Licensed Materials - Property of Rogue Wave Software, Inc.
* © Copyright Rogue Wave Software, Inc. 2014, 2017
* © 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 stock;
import java.awt.BasicStroke;
import java.awt.Color;
import ilog.views.chart.IlvAxis;
import ilog.views.chart.IlvChart;
import ilog.views.chart.IlvColor;
import ilog.views.chart.IlvDataInterval;
import ilog.views.chart.IlvLocalZoomAxisTransformer;
import ilog.views.chart.IlvScale;
import ilog.views.chart.IlvScaleAnnotation;
import ilog.views.chart.IlvStyle;
import ilog.views.chart.event.AxisChangeEvent;
import ilog.views.chart.event.AxisListener;
import ilog.views.chart.event.AxisRangeEvent;
import ilog.views.chart.graphic.IlvDataIndicator;
/**
* A handler class for local zoom functionality.
*/
public class LocalZoomHandler implements AxisListener {
private IlvScaleAnnotation _startAnnotation;
private IlvScaleAnnotation _endAnnotation;
private IlvLocalZoomAxisTransformer _t;
private IlvChart _chart;
private IlvChart[] _charts;
private IlvDataIndicator[] _indicators;
/**
* Creates a new <code>LocalZoomHandler</code> object.
*
* @param chart
* The chart to handle.
* @param t
* The transformer to handle.
* @param useScaleAnnotation
* A Boolean value indicating whether annotations should be set on
* the scales to display the values of the local zoom interval.
* @param useIndicator
* A Boolean value indicating whether a data indicator should be used
* to display the zoom window.
*/
private LocalZoomHandler(IlvChart chart, IlvChart[] auxCharts, IlvLocalZoomAxisTransformer t,
boolean useScaleAnnotation, boolean useIndicator) {
_t = t;
_chart = chart;
int count = (auxCharts == null ? 0 : auxCharts.length);
_charts = new IlvChart[count + 1];
_charts[0] = chart;
if (count > 0)
System.arraycopy(auxCharts, 0, _charts, 1, count);
IlvScale scale = _chart.getScale(t.getAxis());
if (scale != null && useScaleAnnotation) {
IlvDataInterval zw = t.getZoomRange();
_startAnnotation = new IlvScaleAnnotation(zw.getMin());
_endAnnotation = new IlvScaleAnnotation(zw.getMax());
scale.addAnnotation(_startAnnotation);
scale.addAnnotation(_endAnnotation);
}
setUsingIndicator(useIndicator);
t.getAxis().addAxisListener(this);
}
/**
* Returns the chart associated with this object.
*/
public final IlvChart getChart() {
return _chart;
}
/**
* Returns the transformer associated with this object.
*/
public final IlvLocalZoomAxisTransformer getTransformer() {
return _t;
}
/**
* Returns the scale annotation that displays the start of the zoomed
* interval, or <code>null</code> if no annotation is used.
*
* @see #setStartAnnotation
*/
public final IlvScaleAnnotation getStartAnnotation() {
return _startAnnotation;
}
/**
* Sets the scale annotation that displays the start of the zoomed interval.
*
* @param anno
* The new annotation, or <code>null</code> to remove the previous
* one.
* @see #getStartAnnotation
*/
public void setStartAnnotation(IlvScaleAnnotation anno) {
IlvScale scale = _chart.getScale(_t.getAxis());
if (scale != null && _startAnnotation != null)
scale.removeAnnotation(_startAnnotation);
_startAnnotation = anno;
if (scale != null && anno != null)
scale.addAnnotation(anno);
}
/**
* Returns the scale annotation that displays the end of the zoomed interval,
* or <code>null</code> if no annotation is used.
*
* @see #setEndAnnotation
*/
public final IlvScaleAnnotation getEndAnnotation() {
return _endAnnotation;
}
/**
* Sets the scale annotation that displays the end of the zoomed interval.
*
* @param anno
* The new annotation, or <code>null</code> to remove the previous
* one.
* @see #getEndAnnotation
*/
public void setEndAnnotation(IlvScaleAnnotation cursor) {
IlvScale scale = _chart.getScale(_t.getAxis());
if (scale != null && _endAnnotation != null)
scale.removeAnnotation(_endAnnotation);
_endAnnotation = cursor;
if (scale != null && cursor != null)
scale.addAnnotation(cursor);
}
/**
* Returns the graphical indicator of the zoom window.
*
* @see #useIndicator
*/
public IlvDataIndicator[] getIndicators() {
return _indicators;
}
/**
* Specifies whether an indicator must be used to display the zoom window.
*
* @param b
* A Boolean value indicating whether an indicator must be used.
* @see #getIndicator
*/
public void setUsingIndicator(boolean b) {
if (_indicators != null && !b) {
for (int i = 0; i < _charts.length; ++i) {
if (_indicators[i] != null)
_charts[i].removeDecoration(_indicators[i]);
}
}
if (!b) {
_indicators = null;
} else {
_indicators = createIndicators();
for (int i = 0; i < _charts.length; ++i) {
if (_indicators[i] != null)
_charts[i].addDecoration(_indicators[i]);
}
}
}
protected IlvDataIndicator[] createIndicators() {
int count = _charts.length;
IlvDataIndicator[] indicators = new IlvDataIndicator[count];
for (int i = 0; i < count; ++i) {
if (_t.getAxis().getType() == IlvAxis.X_AXIS)
indicators[i] = new IlvDataIndicator(-1, _t.getZoomRange(), null);
else
indicators[i] = new IlvDataIndicator(0, _t.getZoomRange(), null);
IlvStyle style = new IlvStyle(new BasicStroke(2.f, BasicStroke.CAP_BUTT, BasicStroke.JOIN_ROUND),
IlvColor.setAlpha(Color.white, .6f), IlvColor.setAlpha(IlvColor.darkSlateGray, .2f));
indicators[i].setStyle(style);
indicators[i].setDrawOrder(IlvChart.DRAW_ABOVE);
}
return indicators;
}
/**
* Invoked when the visible range of the associated axis changes.
*/
Override
public void axisRangeChanged(AxisRangeEvent ev) {
}
/**
* Invoked when a change occurs on the associated axis. This method handles
* <code>AxisChangeEvent.TRANSFORMER_CHANGE</code> events to update the scale
* annotations and the data indicator.
*
* @see #getIndicator
* @see #getStartAnnotation
* @see #getEndAnnotation
*/
Override
public void axisChanged(AxisChangeEvent evt) {
if (evt.getType() == AxisChangeEvent.TRANSFORMER_CHANGE) {
IlvDataInterval zw = _t.getZoomRange();
if (_startAnnotation != null)
_startAnnotation.setValue(zw.getMin());
if (_endAnnotation != null)
_endAnnotation.setValue(zw.getMax());
if (_indicators != null) {
for (int i = 0; i < _indicators.length; ++i) {
if (_indicators[i] != null)
_indicators[i].setRange(zw);
}
}
}
}
/**
* Associates the given chart and transformer through a
* <code>LocalZoomHandler</code>.
*
* @return The created <code>LocalZoomHandler</code>.
*/
public static LocalZoomHandler set(IlvChart chart, IlvChart[] auxCharts, IlvLocalZoomAxisTransformer t) {
LocalZoomHandler handler = new LocalZoomHandler(chart, auxCharts, t, false, true);
chart.putClientProperty(new Key(t.getAxis()), handler);
return handler;
}
/**
* Creates an <code>IlvLocalZoomAxisTransformer</code> and associates it with
* the given chart through a <code>LocalZoomHandler</code>.
*
* @param chart
* The chart on which the transformer will be set.
* @param axisIdx
* The index of the transformer axis. This parameter value should be
* <code>-1</code> to reference the x-axis, or a valid y-axis index
* value.
* @param useScaleAnnotation
* A Boolean value indicating whether annotations should be set on
* the scales to display the values of the local zoom interval.
* @param useIndicator
* A Boolean value indicating whether a data indicator should be used
* to display the zoom window.
* @param zoomFactor
* The transformer zoom factor.
* @param continuous
* The transformer <i>continuous</i> property.
* @param min
* The minimum of the zoom interval.
* @param max
* The maximum of the zoom interval.
*/
public static LocalZoomHandler set(IlvChart chart, int axisIdx, boolean useScaleAnnotation, boolean useIndicator,
double zoomFactor, boolean continuous, double min, double max) {
IlvLocalZoomAxisTransformer t = new IlvLocalZoomAxisTransformer(min, max, zoomFactor, continuous);
IlvAxis axis = (axisIdx == -1) ? chart.getXAxis() : chart.getYAxis(axisIdx);
axis.setTransformer(t);
LocalZoomHandler handler = new LocalZoomHandler(chart, null, t, useScaleAnnotation, useIndicator);
chart.putClientProperty(new Key(axis), handler);
return handler;
}
/**
* Returns the <code>LocalZoomHandler</code> associated with the specified
* chart and the given axis.
*/
public static LocalZoomHandler get(IlvChart chart, int axisIdx) {
IlvAxis axis = (axisIdx == -1) ? chart.getXAxis() : chart.getYAxis(axisIdx);
return (LocalZoomHandler) chart.getClientProperty(new Key(axis));
}
/**
* Removes the <code>LocalZoomHandler</code> associated with the specified
* chart and the given axis.
*/
public static void unset(IlvChart chart, int axisIdx) {
LocalZoomHandler h = get(chart, axisIdx);
if (h != null) {
h.detach(chart);
}
}
private void detach(IlvChart chart) {
IlvAxis axis = _t.getAxis();
IlvScale scale = chart.getScale(axis);
axis.setTransformer(null);
if (_startAnnotation != null)
scale.removeAnnotation(_startAnnotation);
if (_endAnnotation != null)
scale.removeAnnotation(_endAnnotation);
for (int i = 0; i < _charts.length; ++i) {
if (_indicators[i] != null)
_charts[i].removeDecoration(_indicators[i]);
}
chart.putClientProperty(new Key(axis), null);
}
// --------------------------------------------------------------------------
/**
* A key to associate an <code>LocalZoomHandler</code> with a chart and an
* axis.
*/
private static class Key {
private IlvAxis axis;
public Key(IlvAxis axis) {
this.axis = axis;
}
Override
public int hashCode() {
return axis.hashCode();
}
Override
public boolean equals(Object obj) {
if (!(obj instanceof Key))
return false;
Key key = (Key) obj;
return key.axis == this.axis;
}
}
}