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 }