package name.abuchen.portfolio.ui.util.chart; import name.abuchen.portfolio.ui.PortfolioPlugin; import org.eclipse.swt.SWT; import org.eclipse.swt.graphics.Rectangle; import org.eclipse.swt.widgets.Event; import org.eclipse.swt.widgets.Listener; import org.eclipse.swt.widgets.Tracker; import org.swtchart.Chart; import org.swtchart.IAxis; import org.swtchart.Range; public class ZoomInAreaListener implements Listener { public static void attachTo(Chart chart) { Listener listener = new ZoomInAreaListener(chart); chart.getPlotArea().addListener(SWT.MouseDown, listener); } private final Chart chart; private ZoomInAreaListener(Chart chart) { this.chart = chart; } @Override public void handleEvent(Event event) { if (event.button == 1 && event.stateMask == SWT.MOD1) { Tracker tracker = new Tracker(chart.getPlotArea(), SWT.RESIZE); tracker.setRectangles(new Rectangle[] { new Rectangle(event.x, event.y, 0, 0) }); if (tracker.open()) { Rectangle rectangle = tracker.getRectangles()[0]; try { for (IAxis axis : chart.getAxisSet().getXAxes()) { Range range = new Range(axis.getDataCoordinate(rectangle.x), axis.getDataCoordinate(rectangle.x + rectangle.width)); axis.setRange(range); } for (IAxis axis : chart.getAxisSet().getYAxes()) { Range range = new Range(axis.getDataCoordinate(rectangle.y), axis.getDataCoordinate(rectangle.y + rectangle.height)); axis.setRange(range); } } catch (IllegalArgumentException ignore) { PortfolioPlugin.log(ignore); } chart.redraw(); } tracker.dispose(); } } }