public void redo() {
    // We must remove our element...
    if (jrf == null && crosstabReportElement == null) return;
    Enumeration e = this.getElements().elements();
    Vector changed_elements = new Vector();
    while (e.hasMoreElements()) {
      PositionedElement pe = (PositionedElement) e.nextElement();
      ReportElement element = pe.getElement();

      if (crosstabReportElement != null) {
        jrf.getCrosstabEditor(crosstabReportElement)
            .getPanelEditor()
            .getSelectedElements()
            .remove(element);
        crosstabReportElement.getElements().remove(element);
        jrf.getCrosstabEditor(crosstabReportElement).getPanelEditor().repaint();
      } else {
        jrf.getSelectedElements().remove(element);
        jrf.getReport().getElements().remove(element);
        if (element instanceof CrosstabReportElement) {
          jrf.removeCrosstabEditor((CrosstabReportElement) element);
        }
        jrf.getReportPanel().repaint();
      }
      changed_elements.add(element);
    }
    jrf.fireReportListenerReportElementsChanged(
        new ReportElementChangedEvent(
            jrf, crosstabReportElement, changed_elements, ReportElementChangedEvent.REMOVED));
  }
  public void undo() {
    // We must add our element...
    if (jrf == null && crosstabReportElement == null) return;
    Vector changed_elements = new Vector();
    for (int i = this.getElements().size() - 1; i >= 0; --i) {
      PositionedElement pe = (PositionedElement) getElements().get(i);
      ReportElement element = pe.getElement();
      // Add element....

      if (crosstabReportElement != null) {

        crosstabReportElement.getElements().insertElementAt(element, pe.getOldPosition());
      } else {
        jrf.getReport().getElements().insertElementAt(element, pe.getOldPosition());
        // jrf.addSelectedElement( element, false );
        if (element instanceof CrosstabReportElement) {
          jrf.addCrosstabEditor((CrosstabReportElement) element);
        }
      }
      changed_elements.add(element);
      // jrf.getSelectedElements().remove( element );
      // jrf.fireReportListenerReportElementsChanged(new ReportElementChangedEvent(jrf, element ,
      // ReportElementChangedEvent.REMOVED));
    }
    jrf.fireReportListenerReportElementsChanged(
        new ReportElementChangedEvent(
            jrf, crosstabReportElement, changed_elements, ReportElementChangedEvent.ADDED));

    if (crosstabReportElement != null) {
      jrf.getCrosstabEditor(crosstabReportElement)
          .getPanelEditor()
          .setSelectedElements(changed_elements);
      jrf.getCrosstabEditor(crosstabReportElement).getPanelEditor().repaint();
    } else {
      jrf.setSelectedElements(changed_elements);
      jrf.getReportPanel().repaint();
    }
  }