public void summaryRowSelection(final ReportEvent event) {
    if (FunctionUtilities.isDefinedGroup(getCrosstabFilterGroup(), event)) {
      final String targetName = getName().substring(1);
      final Object expressionValue = getDataRow().get(targetName);
      final Object tableModelValue = getDataRow().get("validate-" + targetName);

      currentDataItem = event.getState().getCurrentDataItem();
      long sequenceCounter = event.getState().getCrosstabColumnSequenceCounter(3);

      if (!equalNumeric(expressionValue, tableModelValue)) {
        logger.debug(
            String.format(
                "!*%12s %3d:%d# %s - %s",
                targetName, currentDataItem, sequenceCounter, expressionValue, tableModelValue));
        if (failHard) {
          Assert.assertEquals(tableModelValue, expressionValue);
        }
      } else {
        logger.debug(
            String.format(
                " *%12s %3d:%d# %s - %s",
                targetName, currentDataItem, sequenceCounter, expressionValue, tableModelValue));
      }
    }
  }
 public void summaryRowSelection(final ReportEvent event) {
   if (FunctionUtilities.isDefinedGroup(getCrosstabFilterGroup(), event)) {
     final int groupIndex = event.getState().getCurrentGroupIndex();
     this.lastGroupSequenceNumber =
         (int) event.getState().getCrosstabColumnSequenceCounter(groupIndex);
   }
 }
  public void summaryRowSelection(final ReportEvent event) {
    if (rowbandingOnGroup == false) {
      return;
    }

    if (StringUtils.isEmpty(group)) {
      final Group group = event.getReport().getGroup(event.getState().getCurrentGroupIndex());
      if (group instanceof CrosstabRowGroup) {
        final GroupBody body = group.getBody();
        if (body instanceof CrosstabColumnGroupBody) {
          if (Boolean.TRUE.equals(
              group.getAttribute(
                  AttributeNames.Crosstab.NAMESPACE, AttributeNames.Crosstab.PRINT_SUMMARY))) {
            triggerVisibleStateCrosstab(event);
          }
        }
      }
    } else {
      if (FunctionUtilities.isDefinedGroup(group, event)) {
        final Group group = event.getReport().getGroup(event.getState().getCurrentGroupIndex());
        if (Boolean.TRUE.equals(
            group.getAttribute(
                AttributeNames.Crosstab.NAMESPACE, AttributeNames.Crosstab.PRINT_SUMMARY))) {
          triggerVisibleStateCrosstab(event);
        }
      }
    }
  }
  private DataRow extractDataRow(final ReportEvent event) {
    if (event.isDeepTraversing() == false) {
      return getDataRow();
    }

    return event.getOriginatingState().getDataRow();
  }
  /**
   * Create a image according to the current state, simple and silly ...
   *
   * @param event the report event.
   */
  public void pageStarted(final ReportEvent event) {
    final BufferedImage image = new BufferedImage(150, 50, BufferedImage.TYPE_INT_ARGB);
    final Graphics2D g2 = image.createGraphics();
    final JButton bt = new JButton("A Button");
    bt.setSize(90, 20);
    final JRadioButton radio = new JRadioButton("A radio button");
    radio.setSize(100, 20);

    g2.setColor(Color.darkGray);
    bt.paint(g2);
    g2.setColor(Color.blue);
    g2.setTransform(AffineTransform.getTranslateInstance(20, 20));
    radio.paint(g2);
    g2.setTransform(AffineTransform.getTranslateInstance(0, 0));
    g2.setPaint(Color.green);
    g2.setFont(new Font("Serif", Font.PLAIN, 10));
    g2.drawString(
        "You are viewing a graphics of JFreeReport on index " + event.getState().getCurrentRow(),
        10,
        10);
    g2.dispose();
    try {
      functionValue = new DefaultImageReference(image);
    } catch (IOException e) {
      functionValue = null;
    }
  }
  /**
   * Receives notification that report generation has completed, the report footer was printed, no
   * more output is done. This is a helper event to shut down the output service.
   *
   * @param event The event.
   */
  public void reportDone(final ReportEvent event) {
    if (event.isDeepTraversing()) {
      return;
    }

    if (FunctionUtilities.isDefinedPrepareRunLevel(this, event)) {
      final Iterator iterator = dataStorage.entrySet().iterator();
      while (iterator.hasNext()) {
        final Map.Entry entry = (Map.Entry) iterator.next();
        final String key = (String) entry.getKey();
        final IndexDataHolder data = (IndexDataHolder) entry.getValue();
        model.addRow(
            new Object[] {
              data.getData(),
              data.getPagesText(indexSeparator, condensedStyle),
              data.getPages(),
              key
            });
      }
    } else if (FunctionUtilities.isLayoutLevel(event)) {
      final int rowCount = model.getRowCount();
      for (int i = 0; i < rowCount; i++) {
        final String key = (String) model.getValueAt(i, 3);
        final IndexDataHolder dataHolder = dataStorage.get(key);
        model.setValueAt(dataHolder.getPagesText(indexSeparator, condensedStyle), i, 1);
        model.setValueAt(dataHolder.getPages(), i, 2);
      }
    }
  }
  /**
   * Receives notification that the report has started.
   *
   * @param event the event.
   */
  public void reportStarted(final ReportEvent event) {
    if (event.isDeepTraversing()) {
      return;
    }

    pageFunction.reportStarted(event);
  }
  public void groupStarted(final ReportEvent event) {
    if (rowbandingOnGroup == false) {
      return;
    }

    if (StringUtils.isEmpty(group)) {
      final Group group = event.getReport().getGroup(event.getState().getCurrentGroupIndex());
      if (group instanceof CrosstabRowGroup) {
        final GroupBody body = group.getBody();
        if (body instanceof CrosstabColumnGroupBody) {
          triggerVisibleStateCrosstab(event);
        }
      }
    } else {
      if (FunctionUtilities.isDefinedGroup(group, event)) {
        triggerVisibleStateCrosstab(event);
      }
    }
  }
  public void itemsAdvanced(final ReportEvent event) {
    final String targetName = getName().substring(1);
    final Object expressionValue = getDataRow().get(targetName);
    final Object tableModelValue = getDataRow().get("validate-" + targetName);

    currentDataItem = event.getState().getCurrentDataItem();
    long sequenceCounter = event.getState().getCrosstabColumnSequenceCounter(3);

    if (!equalNumeric(expressionValue, tableModelValue)) {
      logger.debug(
          String.format(
              "! %12s %3d:%d# %s - %s",
              targetName, currentDataItem, sequenceCounter, expressionValue, tableModelValue));
      if (failHard) {
        Assert.assertEquals(tableModelValue, expressionValue);
      }
    } else {
      logger.debug(
          String.format(
              "  %12s %3d:%d# %s - %s",
              targetName, currentDataItem, sequenceCounter, expressionValue, tableModelValue));
    }
  }
  /**
   * Receives notification that a row of data is being processed.
   *
   * @param event the event.
   */
  public void itemsAdvanced(final ReportEvent event) {
    if (event.isDeepTraversing()) {
      if ("index".equals(event.getOriginatingState().getReport().getMetaData().getName())) {
        return;
      }
    }

    final Object o = computeDataValue(event);
    if (o == null) {
      return;
    }

    if (FunctionUtilities.isDefinedPrepareRunLevel(this, event)) {
      dataStorage.put(String.valueOf(o), new IndexDataHolder(o));
    } else if (FunctionUtilities.isLayoutLevel(event)) {
      final IndexDataHolder o1 = dataStorage.get(String.valueOf(o));
      if (o1 == null) {
        throw new IllegalStateException(
            "Unable to compute index: Function values changed between prepare and layout run");
      }
      o1.addPage(pageFunction.getPage());
    }
  }
  /**
   * Receives notification that report generation initializes the current run.
   *
   * <p>The event carries a ReportState.Started state. Use this to initialize the report.
   *
   * @param event The event.
   */
  public void reportInitialized(final ReportEvent event) {
    if (event.isDeepTraversing()) {
      return;
    }

    if (initialized == false) {
      initialized = true;
      model.addColumn("item-data", Object.class);
      model.addColumn("item-pages", String.class);
      model.addColumn("item-pages-array", Integer[].class);
      model.addColumn("item-key", String.class);
    }

    pageFunction.reportInitialized(event);
  }
  /**
   * Triggers the visible state of the specified itemband element. If the named element was visible
   * at the last call, it gets now invisible and vice versa. This creates the effect, that an
   * element is printed every other line.
   *
   * @param event the current report event.
   */
  private void triggerVisibleState(final ReportEvent event) {
    // avoid divide by zero exception
    if (numberOfElements == 0) {
      return;
    }

    if ((count % numberOfElements) == 0) {
      trigger = (!trigger);
    }
    count += 1;

    final ItemBand itemBand = event.getReport().getItemBand();
    if (itemBand == null) {
      return;
    }

    if (element == null) {
      if (trigger) {
        itemBand.getStyle().setStyleProperty(ElementStyleKeys.BACKGROUND_COLOR, visibleBackground);
      } else {
        itemBand
            .getStyle()
            .setStyleProperty(ElementStyleKeys.BACKGROUND_COLOR, invisibleBackground);
      }
    } else {
      final Element[] e = FunctionUtilities.findAllElements(itemBand, getElement());
      if (e.length > 0) {
        for (int i = 0; i < e.length; i++) {
          if (trigger) {
            e[i].getStyle().setStyleProperty(ElementStyleKeys.BACKGROUND_COLOR, visibleBackground);
          } else {
            e[i].getStyle()
                .setStyleProperty(ElementStyleKeys.BACKGROUND_COLOR, invisibleBackground);
          }
        }
      } else {
        if (warned == false) {
          RowBandingFunction.logger.warn(
              "The Band does not contain an element named " + getElement());
          warned = true;
        }
      }
    }
  }
  /**
   * Receives notification that a row of data is being processed. Reads the data from the field
   * defined for this function and calculates the minimum value.
   *
   * @param event Information about the event.
   */
  public void itemsAdvanced(final ReportEvent event) {
    if (field == null) {
      return;
    }

    final Object fieldValue = event.getDataRow().get(getField());
    if (fieldValue instanceof Comparable == false) {
      return;
    }
    try {
      final Comparable compare = (Comparable) fieldValue;

      final Comparable oldValue = min.get(lastGroupSequenceNumber);
      if (oldValue == null || oldValue.compareTo(compare) > 0) {
        min.set(lastGroupSequenceNumber, compare);
      }
    } catch (Exception e) {
      ItemMinFunction.logger.error("ItemMinFunction.advanceItems(): problem adding number.");
    }
  }
  /**
   * Triggers the visible state of the specified itemband element. If the named element was visible
   * at the last call, it gets now invisible and vice versa. This creates the effect, that an
   * element is printed every other line.
   *
   * @param event the current report event.
   */
  private void triggerVisibleStateCrosstab(final ReportEvent event) {
    if ((count % numberOfElements) == 0) {
      trigger = (!trigger);
    }
    count += 1;

    final CrosstabCellBody cellBody = event.getReport().getCrosstabCellBody();
    if (cellBody == null) {
      return;
    }

    if (element == null) {
      final int elementCount = cellBody.getElementCount();
      for (int i = 1; i < elementCount; i += 1) {
        final Element cell = cellBody.getElement(i);
        if (trigger) {
          cell.getStyle().setStyleProperty(ElementStyleKeys.BACKGROUND_COLOR, visibleBackground);
        } else {
          cell.getStyle().setStyleProperty(ElementStyleKeys.BACKGROUND_COLOR, invisibleBackground);
        }
      }
    } else {
      final Element[] e = FunctionUtilities.findAllElements(cellBody, getElement());
      if (e.length > 0) {
        for (int i = 0; i < e.length; i++) {
          if (trigger) {
            e[i].getStyle().setStyleProperty(ElementStyleKeys.BACKGROUND_COLOR, visibleBackground);
          } else {
            e[i].getStyle()
                .setStyleProperty(ElementStyleKeys.BACKGROUND_COLOR, invisibleBackground);
          }
        }
      } else {
        if (warned == false) {
          RowBandingFunction.logger.warn(
              "The cell-body does not contain an element named " + getElement());
          warned = true;
        }
      }
    }
  }
 public String toString() {
   return "ReportStateKey{"
       + "sc="
       + sequenceCounter
       + ", cursor="
       + cursor
       + ", groupLevel="
       + groupLevel
       + ", subreport="
       + subreport
       + ", stateCode="
       + ReportEvent.translateStateCode(stateCode)
       + ", restoreState="
       + restoreState
       + ", inlineSubReport="
       + inlineSubReportState
       + ", stateCodeRaw=0x"
       + Integer.toHexString(stateCode)
       + ", parent="
       + parent
       + '}';
 }