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 }