001    /* ===========================================================
002     * JFreeChart : a free chart library for the Java(tm) platform
003     * ===========================================================
004     *
005     * (C) Copyright 2000-2007, 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, 2007, 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     * $Id: PolarChartPanel.java,v 1.2.2.2 2007/02/02 15:53:36 mungady Exp $
036     *
037     * Changes
038     * -------
039     * 19-Jan-2004 : Version 1, contributed by DB with minor changes by DG (DG);
040     * ------------- JFREECHART 1.0.x ---------------------------------------------
041     * 02-Feb-2007 : Removed author tags all over JFreeChart sources (DG);
042     *
043     */
044    
045    package org.jfree.chart;
046    
047    import java.awt.Component;
048    import java.awt.event.ActionEvent;
049    
050    import javax.swing.JMenuItem;
051    import javax.swing.JPopupMenu;
052    
053    import org.jfree.chart.plot.Plot;
054    import 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     */
071    public 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, "Zoom In");
149           int zoomOutIndex = getPopupMenuItem(result, "Zoom Out");
150           int autoIndex     = getPopupMenuItem(result, "Auto Range");
151           if (zoom) {
152               JMenuItem zoomIn = new JMenuItem("Zoom In");
153               zoomIn.setActionCommand(POLAR_ZOOM_IN_ACTION_COMMAND);
154               zoomIn.addActionListener(this);
155              
156               JMenuItem zoomOut = new JMenuItem("Zoom Out");
157               zoomOut.setActionCommand(POLAR_ZOOM_OUT_ACTION_COMMAND);
158               zoomOut.addActionListener(this);
159              
160               JMenuItem auto = new JMenuItem("Auto Range");
161               auto.setActionCommand(POLAR_AUTO_RANGE_ACTION_COMMAND);
162               auto.addActionListener(this);
163              
164               if (zoomInIndex != -1) {
165                   result.remove(zoomInIndex);
166               }
167               else {
168                   zoomInIndex = result.getComponentCount() - 1;
169               }
170               result.add(zoomIn, zoomInIndex);
171               if (zoomOutIndex != -1) {
172                   result.remove(zoomOutIndex);
173               }
174               else {
175                   zoomOutIndex = zoomInIndex + 1;
176               }
177               result.add(zoomOut, zoomOutIndex);
178               if (autoIndex != -1) {
179                   result.remove(autoIndex);
180               }
181               else {
182                   autoIndex = zoomOutIndex + 1;
183               }
184               result.add(auto, autoIndex);
185           }
186           return result;
187        }
188       
189        /**
190         * Handles action events generated by the popup menu.
191         *
192         * @param event  the event.
193         */
194        public void actionPerformed(ActionEvent event) {
195           String command = event.getActionCommand();
196           
197           if (command.equals(POLAR_ZOOM_IN_ACTION_COMMAND)) {
198               PolarPlot plot = (PolarPlot) getChart().getPlot();
199               plot.zoom(0.5);
200           }
201           else if (command.equals(POLAR_ZOOM_OUT_ACTION_COMMAND)) {
202               PolarPlot plot = (PolarPlot) getChart().getPlot();
203               plot.zoom(2.0);
204           }
205           else if (command.equals(POLAR_AUTO_RANGE_ACTION_COMMAND)) {
206               PolarPlot plot = (PolarPlot) getChart().getPlot();
207               plot.getAxis().setAutoRange(true);
208           }
209           else {
210               super.actionPerformed(event);
211           }
212        }
213    
214        // ----------------------
215        // --- Public Methods ---
216        // ----------------------
217    
218        // -----------------------
219        // --- Private Methods ---
220        // -----------------------
221       
222        /**
223         * Test that the chart is using an xy plot with time as the domain axis.
224         * 
225         * @param chart  the chart.
226         */
227        private void checkChart(JFreeChart chart) {
228            Plot plot = chart.getPlot();
229            if (!(plot instanceof PolarPlot)) {
230                throw new IllegalArgumentException("plot is not a PolarPlot");
231           }
232        }
233       
234        /**
235         * Returns the index of an item in a popup menu.
236         * 
237         * @param menu  the menu.
238         * @param text  the label.
239         * 
240         * @return The item index.
241         */
242        private int getPopupMenuItem(JPopupMenu menu, String text) {
243            int index = -1;
244            for (int i = 0; (index == -1) && (i < menu.getComponentCount()); i++) {
245                Component comp = menu.getComponent(i);
246                if (comp instanceof JMenuItem) {
247                    JMenuItem item = (JMenuItem) comp;
248                    if (text.equals(item.getText())) {
249                        index = i;
250                    }
251                }
252           }
253           return index;
254        }
255    
256    }