package net.seninp.grammarviz.view; import java.awt.Color; import java.awt.event.MouseAdapter; import java.awt.event.MouseEvent; import java.awt.geom.Point2D; import java.awt.geom.Rectangle2D; import java.text.DecimalFormat; import java.util.concurrent.atomic.AtomicBoolean; import org.jfree.chart.ChartPanel; import org.jfree.chart.JFreeChart; import org.jfree.chart.plot.IntervalMarker; import org.jfree.chart.plot.Marker; import org.jfree.chart.plot.XYPlot; import org.jfree.ui.Layer; public class MouseMarker extends MouseAdapter { private static AtomicBoolean isMarking = new AtomicBoolean(false); private static final DecimalFormat dfFormatter = (new DecimalFormat("0.00")); private Marker marker; private Double markerStart = Double.NaN; private Double markerEnd = Double.NaN; private final XYPlot plot; private final JFreeChart chart; private final ChartPanel panel; private Object selectionLock; public MouseMarker(ChartPanel panel) { this.panel = panel; this.chart = panel.getChart(); this.plot = (XYPlot) chart.getPlot(); } private void updateMarker() { if (marker != null) { plot.removeDomainMarker(marker, Layer.BACKGROUND); } if (!(markerStart.isNaN() && markerEnd.isNaN())) { if (markerEnd > markerStart) { marker = new IntervalMarker(markerStart, markerEnd); marker.setPaint(new Color(0xDD, 0xFF, 0xDD, 0x90)); marker.setAlpha(0.7f); plot.addDomainMarker(marker, Layer.BACKGROUND); } else { marker = new IntervalMarker(markerEnd, markerStart); marker.setPaint(new Color(0xDD, 0xFF, 0xDD, 0x90)); marker.setAlpha(0.7f); plot.addDomainMarker(marker, Layer.BACKGROUND); } } } private Double getPosition(MouseEvent e) { // System.err.println("Event position " + e.getX() + ", " + e.getY()); Point2D p = panel.translateScreenToJava2D(e.getPoint()); Rectangle2D plotArea = panel.getScreenDataArea(); XYPlot plot = (XYPlot) chart.getPlot(); return plot.getDomainAxis().java2DToValue(p.getX(), plotArea, plot.getDomainAxisEdge()); } @Override public void mouseDragged(MouseEvent e) { if (isMarking.get()) { markerEnd = getPosition(e); updateMarker(); } } @Override public void mouseReleased(MouseEvent e) { isMarking.set(false); markerEnd = getPosition(e); updateMarker(); synchronized (selectionLock) { selectionLock.notifyAll(); } } @Override public void mousePressed(MouseEvent e) { isMarking.set(true); markerStart = getPosition(e); } public void setLockObject(Object selectionLock) { this.selectionLock = selectionLock; } public String getIntervalStr() { return dfFormatter.format(this.markerStart) + " - " + dfFormatter.format(this.markerEnd); } public double getSelectionStart() { if (markerEnd >= markerStart) { return this.markerStart; } return this.markerEnd; } public double getSelectionEnd() { if (markerEnd >= markerStart) { return this.markerEnd; } return this.markerStart; } }