    001    /* ===========================================================
    002     * JFreeChart : a free chart library for the Java(tm) platform
    003     * ===========================================================
    004     *
    005     * (C) Copyright 2000-2008, 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     * [Java is a trademark or registered trademark of Sun Microsystems, Inc.
    025     * in the United States and other countries.]
    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     *
    035     * Changes
    036     * -------
    037     * 19-Jan-2004 : Version 1, contributed by DB with minor changes by DG (DG);
    038     * ------------- JFREECHART 1.0.x ---------------------------------------------
    039     * 02-Feb-2007 : Removed author tags all over JFreeChart sources (DG);
    040     *
    041     */
    042
    043    package org.jfree.chart;
    044
    045    import java.awt.Component;
    046    import java.awt.event.ActionEvent;
    047
    048    import javax.swing.JMenuItem;
    049    import javax.swing.JPopupMenu;
    050
    051    import org.jfree.chart.plot.Plot;
    052    import org.jfree.chart.plot.PolarPlot;
    053
    054    /**
    055     * <code>PolarChartPanel</code> is the top level object for using the
    056     * {@link PolarPlot}. Since this class has a <code>JPanel</code> in the
    057     * inheritance hierarchy, one uses this class to integrate the Polar plot into
    058     * their application.
    059     * <p>
    060     * The main modification to <code>ChartPanel</code> is the popup menu.  It
    061     * removes <code>ChartPanel</code>'s versions of:
    062     * <ul>
    063     *    <li><code>Zoom In</code></li>
    064     *    <li><code>Zoom Out</code></li>
    065     *    <li><code>Auto Range</code></li>
    066     * </ul>
    067     * and replaces them with versions more appropriate for {@link PolarPlot}.
    068     */
    069    public class PolarChartPanel extends ChartPanel {
    070
    071        // -----------------
    072        // --- Constants ---
    073        // -----------------
    074
    075        /** Zoom in command string. */
    076        private static final String POLAR_ZOOM_IN_ACTION_COMMAND = "Polar Zoom In";
    077
    078        /** Zoom out command string. */
    079        private static final String POLAR_ZOOM_OUT_ACTION_COMMAND
    080            = "Polar Zoom Out";
    081
    082        /** Auto range command string. */
    083        private static final String POLAR_AUTO_RANGE_ACTION_COMMAND
    084            = "Polar Auto Range";
    085
    086        // ------------------------
    087        // --- Member Variables ---
    088        // ------------------------
    089
    090        // --------------------
    091        // --- Constructors ---
    092        // --------------------
    093        /**
    094         * Constructs a JFreeChart panel.
    095         *
    096         * @param chart  the chart.
    097         */
    098        public PolarChartPanel(JFreeChart chart) {
    099            this(chart, true);
    100        }
    101
    102        /**
    103         * Creates a new panel.
    104         *
    105         * @param chart  the chart.
    106         * @param useBuffer  buffered?
    107         */
    108        public PolarChartPanel(JFreeChart chart, boolean useBuffer) {
    109            super(chart, useBuffer);
    110            checkChart(chart);
    111            setMinimumDrawWidth(200);
    112            setMinimumDrawHeight(200);
    113            setMaximumDrawWidth(2000);
    114            setMaximumDrawHeight(2000);
    115        }
    116
    117        // --------------------------
    118        // --- ChartPanel Methods ---
    119        // --------------------------
    120        /**
    121         * Sets the chart that is displayed in the panel.
    122         *
    123         * @param chart  The chart.
    124         */
    125        public void setChart(JFreeChart chart) {
    126            checkChart(chart);
    127            super.setChart(chart);
    128        }
    129
    130        /**
    131         * Creates a popup menu for the panel.
    132         *
    133         * @param properties  include a menu item for the chart property editor.
    134         * @param save  include a menu item for saving the chart.
    135         * @param print  include a menu item for printing the chart.
    136         * @param zoom  include menu items for zooming.
    137         *
    138         * @return The popup menu.
    139         */
    140        protected JPopupMenu createPopupMenu(boolean properties,
    141                                             boolean save,
    142                                             boolean print,
    143                                             boolean zoom) {
    144
    145           JPopupMenu result = super.createPopupMenu(properties, save, print, zoom);
    146           int zoomInIndex  = getPopupMenuItem(result, "Zoom In");
    147           int zoomOutIndex = getPopupMenuItem(result, "Zoom Out");
    148           int autoIndex     = getPopupMenuItem(result, "Auto Range");
    149           if (zoom) {
    150               JMenuItem zoomIn = new JMenuItem("Zoom In");
    151               zoomIn.setActionCommand(POLAR_ZOOM_IN_ACTION_COMMAND);
    152               zoomIn.addActionListener(this);
    153
    154               JMenuItem zoomOut = new JMenuItem("Zoom Out");
    155               zoomOut.setActionCommand(POLAR_ZOOM_OUT_ACTION_COMMAND);
    156               zoomOut.addActionListener(this);
    157
    158               JMenuItem auto = new JMenuItem("Auto Range");
    159               auto.setActionCommand(POLAR_AUTO_RANGE_ACTION_COMMAND);
    160               auto.addActionListener(this);
    161
    162               if (zoomInIndex != -1) {
    163                   result.remove(zoomInIndex);
    164               }
    165               else {
    166                   zoomInIndex = result.getComponentCount() - 1;
    167               }
    168               result.add(zoomIn, zoomInIndex);
    169               if (zoomOutIndex != -1) {
    170                   result.remove(zoomOutIndex);
    171               }
    172               else {
    173                   zoomOutIndex = zoomInIndex + 1;
    174               }
    175               result.add(zoomOut, zoomOutIndex);
    176               if (autoIndex != -1) {
    177                   result.remove(autoIndex);
    178               }
    179               else {
    180                   autoIndex = zoomOutIndex + 1;
    181               }
    182               result.add(auto, autoIndex);
    183           }
    184           return result;
    185        }
    186
    187        /**
    188         * Handles action events generated by the popup menu.
    189         *
    190         * @param event  the event.
    191         */
    192        public void actionPerformed(ActionEvent event) {
    193           String command = event.getActionCommand();
    194
    195           if (command.equals(POLAR_ZOOM_IN_ACTION_COMMAND)) {
    196               PolarPlot plot = (PolarPlot) getChart().getPlot();
    197               plot.zoom(0.5);
    198           }
    199           else if (command.equals(POLAR_ZOOM_OUT_ACTION_COMMAND)) {
    200               PolarPlot plot = (PolarPlot) getChart().getPlot();
    201               plot.zoom(2.0);
    202           }
    203           else if (command.equals(POLAR_AUTO_RANGE_ACTION_COMMAND)) {
    204               PolarPlot plot = (PolarPlot) getChart().getPlot();
    205               plot.getAxis().setAutoRange(true);
    206           }
    207           else {
    208               super.actionPerformed(event);
    209           }
    210        }
    211
    212        // ----------------------
    213        // --- Public Methods ---
    214        // ----------------------
    215
    216        // -----------------------
    217        // --- Private Methods ---
    218        // -----------------------
    219
    220        /**
    221         * Test that the chart is using an xy plot with time as the domain axis.
    222         *
    223         * @param chart  the chart.
    224         */
    225        private void checkChart(JFreeChart chart) {
    226            Plot plot = chart.getPlot();
    227            if (!(plot instanceof PolarPlot)) {
    228                throw new IllegalArgumentException("plot is not a PolarPlot");
    229           }
    230        }
    231
    232        /**
    233         * Returns the index of an item in a popup menu.
    234         *
    235         * @param menu  the menu.
    236         * @param text  the label.
    237         *
    238         * @return The item index.
    239         */
    240        private int getPopupMenuItem(JPopupMenu menu, String text) {
    241            int index = -1;
    242            for (int i = 0; (index == -1) && (i < menu.getComponentCount()); i++) {
    243                Component comp = menu.getComponent(i);
    244                if (comp instanceof JMenuItem) {
    245                    JMenuItem item = (JMenuItem) comp;
    246                    if (text.equals(item.getText())) {
    247                        index = i;
    248                    }
    249                }
    250           }
    251           return index;
    252        }
    253
    254    }