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
043package org.jfree.chart;
044
045import java.awt.Component;
046import java.awt.event.ActionEvent;
047
048import javax.swing.JMenuItem;
049import javax.swing.JPopupMenu;
050
051import org.jfree.chart.plot.Plot;
052import 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 */
069public 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}