Source for org.jfree.chart.PolarChartPanel

   1: /* ===========================================================
   2:  * JFreeChart : a free chart library for the Java(tm) platform
   3:  * ===========================================================
   4:  *
   5:  * (C) Copyright 2000-2007, by Object Refinery Limited and Contributors.
   6:  *
   7:  * Project Info:  http://www.jfree.org/jfreechart/index.html
   8:  *
   9:  * This library is free software; you can redistribute it and/or modify it 
  10:  * under the terms of the GNU Lesser General Public License as published by 
  11:  * the Free Software Foundation; either version 2.1 of the License, or 
  12:  * (at your option) any later version.
  13:  *
  14:  * This library is distributed in the hope that it will be useful, but 
  15:  * WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY 
  16:  * or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public 
  17:  * License for more details.
  18:  *
  19:  * You should have received a copy of the GNU Lesser General Public
  20:  * License along with this library; if not, write to the Free Software
  21:  * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, 
  22:  * USA.  
  23:  *
  24:  * [Java is a trademark or registered trademark of Sun Microsystems, Inc. 
  25:  * in the United States and other countries.]
  26:  *
  27:  * --------------------
  28:  * PolarChartPanel.java
  29:  * --------------------
  30:  * (C) Copyright 2004, 2007, by Solution Engineering, Inc. and Contributors.
  31:  *
  32:  * Original Author:  Daniel Bridenbecker, Solution Engineering, Inc.;
  33:  * Contributor(s):   David Gilbert (for Object Refinery Limited);
  34:  *
  35:  * $Id: PolarChartPanel.java,v 1.2.2.2 2007/02/02 15:53:36 mungady Exp $
  36:  *
  37:  * Changes
  38:  * -------
  39:  * 19-Jan-2004 : Version 1, contributed by DB with minor changes by DG (DG);
  40:  * ------------- JFREECHART 1.0.x ---------------------------------------------
  41:  * 02-Feb-2007 : Removed author tags all over JFreeChart sources (DG);
  42:  *
  43:  */
  44: 
  45: package org.jfree.chart;
  46: 
  47: import java.awt.Component;
  48: import java.awt.event.ActionEvent;
  49: 
  50: import javax.swing.JMenuItem;
  51: import javax.swing.JPopupMenu;
  52: 
  53: import org.jfree.chart.plot.Plot;
  54: import org.jfree.chart.plot.PolarPlot;
  55: 
  56: /**
  57:  * <code>PolarChartPanel</code> is the top level object for using the 
  58:  * {@link PolarPlot}. Since this class has a <code>JPanel</code> in the 
  59:  * inheritance hierarchy, one uses this class to integrate the Polar plot into 
  60:  * their application.
  61:  * <p>
  62:  * The main modification to <code>ChartPanel</code> is the popup menu.  It 
  63:  * removes <code>ChartPanel</code>'s versions of:
  64:  * <ul>
  65:  *    <li><code>Zoom In</code></li>
  66:  *    <li><code>Zoom Out</code></li>
  67:  *    <li><code>Auto Range</code></li>
  68:  * </ul>
  69:  * and replaces them with versions more appropriate for {@link PolarPlot}.
  70:  */
  71: public class PolarChartPanel extends ChartPanel {
  72: 
  73:     // -----------------
  74:     // --- Constants ---
  75:     // -----------------   
  76:     
  77:     /** Zoom in command string. */
  78:     private static final String POLAR_ZOOM_IN_ACTION_COMMAND = "Polar Zoom In";
  79:     
  80:     /** Zoom out command string. */
  81:     private static final String POLAR_ZOOM_OUT_ACTION_COMMAND 
  82:         = "Polar Zoom Out";
  83:     
  84:     /** Auto range command string. */
  85:     private static final String POLAR_AUTO_RANGE_ACTION_COMMAND 
  86:         = "Polar Auto Range";
  87:    
  88:     // ------------------------
  89:     // --- Member Variables ---
  90:     // ------------------------
  91:    
  92:     // --------------------
  93:     // --- Constructors ---
  94:     // --------------------
  95:     /**
  96:      * Constructs a JFreeChart panel.
  97:      *
  98:      * @param chart  the chart.
  99:      */
 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: }