Beispiel #1
0
  /**
   * Handle the case where a plot implements the {@link Zoomable} interface.
   *
   * @param zoomable the zoomable plot.
   * @param e the mouse wheel event.
   */
  private void handleZoomable(Zoomable zoomable, MouseWheelEvent e) {
    // don't zoom unless the mouse pointer is in the plot's data area
    ChartRenderingInfo info = this.chartPanel.getChartRenderingInfo();
    PlotRenderingInfo pinfo = info.getPlotInfo();
    Point2D p = this.chartPanel.translateScreenToJava2D(e.getPoint());
    if (!pinfo.getDataArea().contains(p)) {
      return;
    }

    Plot plot = (Plot) zoomable;
    // do not notify while zooming each axis
    boolean notifyState = plot.isNotify();
    plot.setNotify(false);
    int clicks = e.getWheelRotation();
    double zf = 1.0 + this.zoomFactor;
    if (clicks < 0) {
      zf = 1.0 / zf;
    }
    if (chartPanel.isDomainZoomable()) {
      zoomable.zoomDomainAxes(zf, pinfo, p, true);
    }
    if (chartPanel.isRangeZoomable()) {
      zoomable.zoomRangeAxes(zf, pinfo, p, true);
    }
    plot.setNotify(notifyState); // this generates the change event too
  }
  /** if a button is pressed ... */
  public void actionPerformed(ActionEvent evt) {
    try {
      String acmd = evt.getActionCommand();

      if (acmd.equals(ACTION_CMD_PRINT)) {

        this.chartPanel.createChartPrintJob();

      } else if (acmd.equals(ACTION_CMD_SAVE_AS)) {

        this.chartPanel.doSaveAs();

      } else if (acmd.equals(ACTION_CMD_ZOOM_IN)) {

        ChartRenderingInfo info = chartPanel.getChartRenderingInfo();
        Rectangle2D rect = info.getChartArea();
        chartPanel.setZoomInFactor(ZOOM_FACTOR);
        chartPanel.zoomInDomain(rect.getCenterX(), rect.getCenterY());
      } else if (acmd.equals(ACTION_CMD_ZOOM_OUT)) {

        ChartRenderingInfo info = chartPanel.getChartRenderingInfo();
        Rectangle2D rect = info.getChartArea();
        chartPanel.setZoomOutFactor(1 / ZOOM_FACTOR);
        chartPanel.zoomOutDomain(rect.getCenterX(), rect.getCenterY());

      } else if (acmd.equals(ACTION_CMD_ZOOM_TO_FIT)) {
        // X-axis (has no fixed borders)
        chartPanel.restoreAutoBounds();
      }
    } catch (Exception e) {
      e.printStackTrace();
    }
  }
 /**
  * Returns a clone of this object.
  *
  * @return A clone.
  * @throws CloneNotSupportedException if the object cannot be cloned.
  */
 @Override
 public Object clone() throws CloneNotSupportedException {
   ChartRenderingInfo clone = (ChartRenderingInfo) super.clone();
   if (this.chartArea != null) {
     clone.chartArea = (Rectangle2D) this.chartArea.clone();
   }
   if (this.entities instanceof PublicCloneable) {
     PublicCloneable pc = (PublicCloneable) this.entities;
     clone.entities = (EntityCollection) pc.clone();
   }
   return clone;
 }
  /**
   * Creates an image map element that complies with the XHTML 1.0 specification.
   *
   * @param name the map name (<code>null</code> not permitted).
   * @param info the chart rendering info (<code>null</code> not permitted).
   * @param toolTipTagFragmentGenerator a generator for the HTML fragment that will contain the
   *     tooltip text (<code>null</code> not permitted if <code>info</code> contains tooltip
   *     information).
   * @param urlTagFragmentGenerator a generator for the HTML fragment that will contain the URL
   *     reference (<code>null</code> not permitted if <code>info</code> contains URLs).
   * @return The map tag.
   */
  public static String getImageMap(
      String name,
      ChartRenderingInfo info,
      ToolTipTagFragmentGenerator toolTipTagFragmentGenerator,
      URLTagFragmentGenerator urlTagFragmentGenerator) {

    StringBuilder sb = new StringBuilder();
    sb.append("<map id=\"").append(htmlEscape(name));
    sb.append("\" name=\"").append(htmlEscape(name)).append("\">");
    sb.append(StringUtils.getLineSeparator());
    EntityCollection entities = info.getEntityCollection();
    if (entities != null) {
      int count = entities.getEntityCount();
      for (int i = count - 1; i >= 0; i--) {
        ChartEntity entity = entities.getEntity(i);
        if (entity.getToolTipText() != null || entity.getURLText() != null) {
          String area =
              entity.getImageMapAreaTag(toolTipTagFragmentGenerator, urlTagFragmentGenerator);
          if (area.length() > 0) {
            sb.append(area);
            sb.append(StringUtils.getLineSeparator());
          }
        }
      }
    }
    sb.append("</map>");
    return sb.toString();
  }
 private void populateInfo(final ChartRenderingInfo info) {
   if (urlTemplate == null) {
     return;
   }
   Iterator iter = info.getEntityCollection().iterator();
   while (iter.hasNext()) {
     ChartEntity entity = (ChartEntity) iter.next();
     if (entity instanceof XYItemEntity) {
       if (urlTemplate != null) {
         XYItemEntity xyItemEntity = (XYItemEntity) entity;
         if (paramName == null) {
           xyItemEntity.setURLText(urlTemplate);
         } else {
           try {
             int seriesIndex = xyItemEntity.getSeriesIndex();
             int itemIndex = xyItemEntity.getItem();
             String xySeriesKey =
                 (String)
                     ((XYZSeriesCollectionChartDefinition) xyItemEntity.getDataset())
                         .getSeriesKey(seriesIndex);
             String encodedVal = URLEncoder.encode(xySeriesKey, LocaleHelper.getSystemEncoding());
             String drillURL = TemplateUtil.applyTemplate(urlTemplate, paramName, encodedVal);
             String itemValueStr =
                 ((XYZSeriesCollectionChartDefinition) xyItemEntity.getDataset())
                     .getX(seriesIndex, itemIndex)
                     .toString();
             encodedVal = URLEncoder.encode(itemValueStr, LocaleHelper.getSystemEncoding());
             if (seriesName == null) {
               drillURL =
                   TemplateUtil.applyTemplate(drillURL, "SERIES", encodedVal); // $NON-NLS-1$
             } else {
               drillURL = TemplateUtil.applyTemplate(drillURL, seriesName, encodedVal);
             }
             xyItemEntity.setURLText(drillURL);
           } catch (UnsupportedEncodingException e) {
             // TODO Auto-generated catch block
             e.printStackTrace();
           }
         }
       }
     }
   }
 }
  /**
   * Draws the plot on a Java 2D graphics device (such as the screen or a printer).
   *
   * @param g2 the graphics device.
   * @param area the area within which the plot should be drawn.
   * @param anchor the anchor point (<code>null</code> permitted).
   * @param parentState the state from the parent plot, if there is one.
   * @param info collects info about the drawing.
   */
  public void draw(
      Graphics2D g2,
      Rectangle2D area,
      Point2D anchor,
      PlotState parentState,
      PlotRenderingInfo info) {

    // adjust the drawing area for the plot insets (if any)...
    RectangleInsets insets = getInsets();
    insets.trim(area);
    drawBackground(g2, area);
    drawOutline(g2, area);

    // check that there is some data to display...
    if (DatasetUtilities.isEmptyOrNull(getDataset())) {
      drawNoDataMessage(g2, area);
      return;
    }

    int pieCount = 0;
    if (getDataExtractOrder() == TableOrder.BY_ROW) {
      pieCount = getDataset().getRowCount();
    } else {
      pieCount = getDataset().getColumnCount();
    }

    // the columns variable is always >= rows
    int displayCols = (int) Math.ceil(Math.sqrt(pieCount));
    int displayRows = (int) Math.ceil((double) pieCount / (double) displayCols);

    // swap rows and columns to match plotArea shape
    if (displayCols > displayRows && area.getWidth() < area.getHeight()) {
      int temp = displayCols;
      displayCols = displayRows;
      displayRows = temp;
    }

    prefetchSectionPaints();

    int x = (int) area.getX();
    int y = (int) area.getY();
    int width = ((int) area.getWidth()) / displayCols;
    int height = ((int) area.getHeight()) / displayRows;
    int row = 0;
    int column = 0;
    int diff = (displayRows * displayCols) - pieCount;
    int xoffset = 0;
    Rectangle rect = new Rectangle();

    for (int pieIndex = 0; pieIndex < pieCount; pieIndex++) {
      rect.setBounds(x + xoffset + (width * column), y + (height * row), width, height);

      String title = null;
      if (getDataExtractOrder() == TableOrder.BY_ROW) {
        title = getDataset().getRowKey(pieIndex).toString();
      } else {
        title = getDataset().getColumnKey(pieIndex).toString();
      }
      getPieChart().setTitle(title);

      PieDataset piedataset = null;
      PieDataset dd = new CategoryToPieDataset(getDataset(), getDataExtractOrder(), pieIndex);
      if (getLimit() > 0.0) {
        piedataset =
            DatasetUtilities.createConsolidatedPieDataset(dd, getAggregatedItemsKey(), getLimit());
      } else {
        piedataset = dd;
      }
      PiePlot piePlot = (PiePlot) getPieChart().getPlot();
      piePlot.setDataset(piedataset);
      piePlot.setPieIndex(pieIndex);

      // update the section colors to match the global colors...
      for (int i = 0; i < piedataset.getItemCount(); i++) {
        Comparable key = piedataset.getKey(i);
        Paint p;
        if (key.equals(getAggregatedItemsKey())) {
          p = getAggregatedItemsPaint();
        } else {
          p = (Paint) this.sectionPaints.get(key);
        }
        piePlot.setSectionPaint(key, p);
      }

      ChartRenderingInfo subinfo = null;
      if (info != null) {
        subinfo = new ChartRenderingInfo();
      }
      getPieChart().draw(g2, rect, subinfo);
      if (info != null) {
        info.getOwner().getEntityCollection().addAll(subinfo.getEntityCollection());
        info.addSubplotInfo(subinfo.getPlotInfo());
      }

      ++column;
      if (column == displayCols) {
        column = 0;
        ++row;

        if (row == displayRows - 1 && diff != 0) {
          xoffset = (diff * width) / 2;
        }
      }
    }
  }