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    }