/* This file is part of RouteConverter. RouteConverter is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. RouteConverter is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with RouteConverter; if not, write to the Free Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA Copyright (C) 2007 Christian Pesch. All Rights Reserved. */ package slash.navigation.converter.gui.profileview; import org.jfree.chart.ChartPanel; import org.jfree.chart.JFreeChart; import org.jfree.chart.axis.ValueAxis; import org.jfree.chart.labels.XYToolTipGenerator; import org.jfree.chart.plot.PlotRenderingInfo; import org.jfree.chart.plot.XYPlot; import org.jfree.data.xy.XYDataset; import slash.navigation.converter.gui.models.ProfileModeModel; import javax.swing.*; import java.awt.*; import java.awt.event.MouseEvent; import java.awt.geom.Rectangle2D; import static org.jfree.ui.RectangleEdge.BOTTOM; import static slash.navigation.gui.helpers.JMenuHelper.createMenu; /** * [@link ChartPanel} that allows for a cheaper display of tooltips. * * @author Christian Pesch */ public class LazyToolTipChartPanel extends ChartPanel { static ProfileModeModel profileModeModel; private XYToolTipGenerator toolTipGenerator; public LazyToolTipChartPanel(JFreeChart chart, boolean properties, boolean save, boolean print, boolean zoom, boolean tooltips) { super(chart, DEFAULT_WIDTH, DEFAULT_HEIGHT, DEFAULT_MINIMUM_DRAW_WIDTH, DEFAULT_MINIMUM_DRAW_HEIGHT, DEFAULT_MAXIMUM_DRAW_WIDTH, DEFAULT_MAXIMUM_DRAW_HEIGHT, DEFAULT_BUFFER_USED, properties, save, print, zoom, tooltips ); } protected JPopupMenu createPopupMenu(boolean properties, boolean copy, boolean save, boolean print, boolean zoom) { JPopupMenu popupMenu = super.createPopupMenu(properties, copy, save, print, zoom); // remove Zoom in/out plus separator from default menu popupMenu.remove(6); popupMenu.remove(5); popupMenu.remove(4); JMenu xAxisMenu = createMenu("show-profile-x-axis"); new XAxisModeMenu(xAxisMenu, profileModeModel); popupMenu.add(xAxisMenu, 0); JMenu yAxisMenu = createMenu("show-profile-y-axis"); new YAxisModeMenu(yAxisMenu, profileModeModel); popupMenu.add(yAxisMenu, 1); popupMenu.add(new JPopupMenu.Separator(), 2); return popupMenu; } public void setToolTipGenerator(XYToolTipGenerator toolTipGenerator) { this.toolTipGenerator = toolTipGenerator; } public String getToolTipText(MouseEvent e) { return getTooltipAtPoint(e.getPoint()); } protected String getTooltipAtPoint(Point point) { XYPlot plot = (XYPlot) getChart().getPlot(); PlotRenderingInfo info = getChartRenderingInfo().getPlotInfo(); double x0 = point.getX(); double x1 = x0 - 2 * getScaleX(); double x2 = x0 + 4 * getScaleX(); ValueAxis domainAxis = plot.getDomainAxis(); Rectangle2D screenArea = scale(info.getDataArea()); double tx1 = domainAxis.java2DToValue(x1, screenArea, BOTTOM); double tx2 = domainAxis.java2DToValue(x2, screenArea, BOTTOM); for (int datasetIndex = 0; datasetIndex < plot.getDatasetCount(); datasetIndex++) { XYDataset dataset = plot.getDataset(datasetIndex); for (int seriesIndex = 0; seriesIndex < dataset.getSeriesCount(); seriesIndex++) { int itemCount = dataset.getItemCount(seriesIndex); for (int itemIndex = 0; itemIndex < itemCount; itemIndex++) { double xValue = dataset.getXValue(seriesIndex, itemIndex); if (tx1 < xValue && xValue < tx2) return toolTipGenerator.generateToolTip(dataset, seriesIndex, itemIndex); } } } return null; } }