    001/* ===========================================================
    002 * JFreeChart : a free chart library for the Java(tm) platform
    003 * ===========================================================
    004 *
    005 * (C) Copyright 2000-2011, by Object Refinery Limited and Contributors.
    006 *
    007 * Project Info:  http://www.jfree.org/jfreechart/index.html
    008 *
    009 * This library is free software; you can redistribute it and/or modify it
    010 * under the terms of the GNU Lesser General Public License as published by
    011 * the Free Software Foundation; either version 2.1 of the License, or
    012 * (at your option) any later version.
    013 *
    014 * This library is distributed in the hope that it will be useful, but
    015 * WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
    016 * or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public
    017 * License for more details.
    018 *
    019 * You should have received a copy of the GNU Lesser General Public
    020 * License along with this library; if not, write to the Free Software
    021 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301,
    022 * USA.
    023 *
    024 * [Oracle and Java are registered trademarks of Oracle and/or its affiliates.
    025 * Other names may be trademarks of their respective owners.]
    026 *
    027 * --------------------
    028 * PolarChartPanel.java
    029 * --------------------
    030 * (C) Copyright 2004-2008, by Solution Engineering, Inc. and Contributors.
    031 *
    032 * Original Author:  Daniel Bridenbecker, Solution Engineering, Inc.;
    033 * Contributor(s):   David Gilbert (for Object Refinery Limited);
    034 *                   Martin Hoeller;
    035 *
    036 * Changes
    037 * -------
    038 * 19-Jan-2004 : Version 1, contributed by DB with minor changes by DG (DG);
    039 * ------------- JFREECHART 1.0.x ---------------------------------------------
    040 * 02-Feb-2007 : Removed author tags all over JFreeChart sources (DG);
    041 * 10-Oct-2011 : bug #3165708: localization (MH);
    042 *
    043 */
    044
    045package org.jfree.chart;
    046
    047import java.awt.Component;
    048import java.awt.event.ActionEvent;
    049
    050import javax.swing.JMenuItem;
    051import javax.swing.JPopupMenu;
    052
    053import org.jfree.chart.plot.Plot;
    054import org.jfree.chart.plot.PolarPlot;
    055
    056/**
    057 * <code>PolarChartPanel</code> is the top level object for using the
    058 * {@link PolarPlot}. Since this class has a <code>JPanel</code> in the
    059 * inheritance hierarchy, one uses this class to integrate the Polar plot into
    060 * their application.
    061 * <p>
    062 * The main modification to <code>ChartPanel</code> is the popup menu.  It
    063 * removes <code>ChartPanel</code>'s versions of:
    064 * <ul>
    065 *    <li><code>Zoom In</code></li>
    066 *    <li><code>Zoom Out</code></li>
    067 *    <li><code>Auto Range</code></li>
    068 * </ul>
    069 * and replaces them with versions more appropriate for {@link PolarPlot}.
    070 */
    071public class PolarChartPanel extends ChartPanel {
    072
    073    // -----------------
    074    // --- Constants ---
    075    // -----------------
    076
    077    /** Zoom in command string. */
    078    private static final String POLAR_ZOOM_IN_ACTION_COMMAND = "Polar Zoom In";
    079
    080    /** Zoom out command string. */
    081    private static final String POLAR_ZOOM_OUT_ACTION_COMMAND
    082        = "Polar Zoom Out";
    083
    084    /** Auto range command string. */
    085    private static final String POLAR_AUTO_RANGE_ACTION_COMMAND
    086        = "Polar Auto Range";
    087
    088    // ------------------------
    089    // --- Member Variables ---
    090    // ------------------------
    091
    092    // --------------------
    093    // --- Constructors ---
    094    // --------------------
    095    /**
    096     * Constructs a JFreeChart panel.
    097     *
    098     * @param chart  the chart.
    099     */
    100    public PolarChartPanel(JFreeChart chart) {
    101        this(chart, true);
    102    }
    103
    104    /**
    105     * Creates a new panel.
    106     *
    107     * @param chart  the chart.
    108     * @param useBuffer  buffered?
    109     */
    110    public PolarChartPanel(JFreeChart chart, boolean useBuffer) {
    111        super(chart, useBuffer);
    112        checkChart(chart);
    113        setMinimumDrawWidth(200);
    114        setMinimumDrawHeight(200);
    115        setMaximumDrawWidth(2000);
    116        setMaximumDrawHeight(2000);
    117    }
    118
    119    // --------------------------
    120    // --- ChartPanel Methods ---
    121    // --------------------------
    122    /**
    123     * Sets the chart that is displayed in the panel.
    124     *
    125     * @param chart  The chart.
    126     */
    127    public void setChart(JFreeChart chart) {
    128        checkChart(chart);
    129        super.setChart(chart);
    130    }
    131
    132    /**
    133     * Creates a popup menu for the panel.
    134     *
    135     * @param properties  include a menu item for the chart property editor.
    136     * @param save  include a menu item for saving the chart.
    137     * @param print  include a menu item for printing the chart.
    138     * @param zoom  include menu items for zooming.
    139     *
    140     * @return The popup menu.
    141     */
    142    protected JPopupMenu createPopupMenu(boolean properties,
    143                                         boolean save,
    144                                         boolean print,
    145                                         boolean zoom) {
    146
    147       JPopupMenu result = super.createPopupMenu(properties, save, print, zoom);
    148       int zoomInIndex = getPopupMenuItem(result,
    149               localizationResources.getString("Zoom_In"));
    150       int zoomOutIndex = getPopupMenuItem(result,
    151               localizationResources.getString("Zoom_Out"));
    152       int autoIndex = getPopupMenuItem(result,
    153               localizationResources.getString("Auto_Range"));
    154       if (zoom) {
    155           JMenuItem zoomIn = new JMenuItem(
    156                   localizationResources.getString("Zoom_In"));
    157           zoomIn.setActionCommand(POLAR_ZOOM_IN_ACTION_COMMAND);
    158           zoomIn.addActionListener(this);
    159
    160           JMenuItem zoomOut = new JMenuItem(
    161                   localizationResources.getString("Zoom_Out"));
    162           zoomOut.setActionCommand(POLAR_ZOOM_OUT_ACTION_COMMAND);
    163           zoomOut.addActionListener(this);
    164
    165           JMenuItem auto = new JMenuItem(
    166                   localizationResources.getString("Auto_Range"));
    167           auto.setActionCommand(POLAR_AUTO_RANGE_ACTION_COMMAND);
    168           auto.addActionListener(this);
    169
    170           if (zoomInIndex != -1) {
    171               result.remove(zoomInIndex);
    172           }
    173           else {
    174               zoomInIndex = result.getComponentCount() - 1;
    175           }
    176           result.add(zoomIn, zoomInIndex);
    177           if (zoomOutIndex != -1) {
    178               result.remove(zoomOutIndex);
    179           }
    180           else {
    181               zoomOutIndex = zoomInIndex + 1;
    182           }
    183           result.add(zoomOut, zoomOutIndex);
    184           if (autoIndex != -1) {
    185               result.remove(autoIndex);
    186           }
    187           else {
    188               autoIndex = zoomOutIndex + 1;
    189           }
    190           result.add(auto, autoIndex);
    191       }
    192       return result;
    193    }
    194
    195    /**
    196     * Handles action events generated by the popup menu.
    197     *
    198     * @param event  the event.
    199     */
    200    public void actionPerformed(ActionEvent event) {
    201       String command = event.getActionCommand();
    202
    203       if (command.equals(POLAR_ZOOM_IN_ACTION_COMMAND)) {
    204           PolarPlot plot = (PolarPlot) getChart().getPlot();
    205           plot.zoom(0.5);
    206       }
    207       else if (command.equals(POLAR_ZOOM_OUT_ACTION_COMMAND)) {
    208           PolarPlot plot = (PolarPlot) getChart().getPlot();
    209           plot.zoom(2.0);
    210       }
    211       else if (command.equals(POLAR_AUTO_RANGE_ACTION_COMMAND)) {
    212           PolarPlot plot = (PolarPlot) getChart().getPlot();
    213           plot.getAxis().setAutoRange(true);
    214       }
    215       else {
    216           super.actionPerformed(event);
    217       }
    218    }
    219
    220    // ----------------------
    221    // --- Public Methods ---
    222    // ----------------------
    223
    224    // -----------------------
    225    // --- Private Methods ---
    226    // -----------------------
    227
    228    /**
    229     * Test that the chart is using an xy plot with time as the domain axis.
    230     *
    231     * @param chart  the chart.
    232     */
    233    private void checkChart(JFreeChart chart) {
    234        Plot plot = chart.getPlot();
    235        if (!(plot instanceof PolarPlot)) {
    236            throw new IllegalArgumentException("plot is not a PolarPlot");
    237       }
    238    }
    239
    240    /**
    241     * Returns the index of an item in a popup menu.
    242     *
    243     * @param menu  the menu.
    244     * @param text  the label.
    245     *
    246     * @return The item index.
    247     */
    248    private int getPopupMenuItem(JPopupMenu menu, String text) {
    249        int index = -1;
    250        for (int i = 0; (index == -1) && (i < menu.getComponentCount()); i++) {
    251            Component comp = menu.getComponent(i);
    252            if (comp instanceof JMenuItem) {
    253                JMenuItem item = (JMenuItem) comp;
    254                if (text.equals(item.getText())) {
    255                    index = i;
    256                }
    257            }
    258       }
    259       return index;
    260    }
    261
    262}