public void actionPerformed(final ActionEvent e) {
    final ReportRenderContext activeContext = getActiveContext();
    if (activeContext == null) {
      return;
    }

    final ReportDesignerContext context = getReportDesignerContext();
    final Component parent = context.getParent();
    final Window window = LibSwingUtil.getWindowAncestor(parent);
    final RowBandingDialog dialog;
    if (window instanceof JDialog) {
      dialog = new RowBandingDialog((JDialog) window);
    } else if (window instanceof JFrame) {
      dialog = new RowBandingDialog((JFrame) window);
    } else {
      dialog = new RowBandingDialog();
    }

    final RowBandingFunction function = findRowbandingFunction(activeContext);
    final AbstractReportDefinition report = activeContext.getReportDefinition();
    if (function == null) {
      final RowBandingFunction newFunction = new RowBandingFunction();
      if (dialog.performEdit(newFunction)) {
        report.getExpressions().add(newFunction);
        activeContext
            .getUndo()
            .addChange(
                ActionMessages.getString("EditRowBandingAction.Text"),
                new ExpressionAddedUndoEntry(report.getExpressions().size() - 1, newFunction));
        report.notifyNodeChildAdded(function);
      }
    } else {
      final RowBandingFunction instance = (RowBandingFunction) function.getInstance();
      if (dialog.performEdit(instance)) {
        final ExpressionCollection expressionCollection = report.getExpressions();
        final int idx = expressionCollection.indexOf(function);
        expressionCollection.set(idx, instance);
        activeContext
            .getUndo()
            .addChange(
                ActionMessages.getString("EditRowBandingAction.Text"),
                new ExpressionEditUndoEntry(idx, function, instance));
        report.fireModelLayoutChanged(report, ReportModelEvent.NODE_PROPERTIES_CHANGED, instance);
      }
    }
  }
  /** Invoked when an action occurs. */
  public void actionPerformed(final ActionEvent e) {
    final ReportDocumentContext activeContext = getActiveContext();
    if (activeContext == null) {
      return;
    }
    final ReportDesignerContext context = getReportDesignerContext();
    final Component parent = context.getView().getParent();
    final Window window = LibSwingUtil.getWindowAncestor(parent);
    final DocumentMetaDataDialog dialog;
    if (window instanceof JDialog) {
      dialog = new DocumentMetaDataDialog((JDialog) window);
    } else if (window instanceof JFrame) {
      dialog = new DocumentMetaDataDialog((JFrame) window);
    } else {
      dialog = new DocumentMetaDataDialog();
    }

    try {
      final MasterReport report = activeContext.getContextRoot();
      final DocumentBundle bundle = report.getBundle();
      final DocumentMetaData oldMetaData = (DocumentMetaData) bundle.getMetaData().clone();
      final DocumentMetaData result =
          dialog.performEdit(
              oldMetaData, report.getResourceManager(), report.getDefinitionSource());

      if (result == null) {
        return;
      }

      final MetaDataEditUndoEntry undoEntry = new MetaDataEditUndoEntry(oldMetaData, result);
      undoEntry.redo(activeContext);
      activeContext
          .getUndo()
          .addChange(ActionMessages.getString("EditReportPropertiesAction.Text"), undoEntry);
    } catch (CloneNotSupportedException cne) {
      // should not happen
      UncaughtExceptionsModel.getInstance().addException(cne);
    }
  }
  /** Invoked when an action occurs. */
  public void actionPerformed(final ActionEvent e) {

    final ReportDesignerContext reportDesignerContext = getReportDesignerContext();
    final ReportRenderContext activeContext = getActiveContext();
    if (activeContext == null) {
      return;
    }

    if (activeContext.isChanged()) {
      // ask the user and maybe save the report..
      final int option =
          JOptionPane.showConfirmDialog(
              reportDesignerContext.getParent(),
              Messages.getInstance()
                  .getString("PublishToServerAction.ReportModifiedWarning.Message"),
              Messages.getInstance().getString("PublishToServerAction.ReportModifiedWarning.Title"),
              JOptionPane.YES_NO_CANCEL_OPTION,
              JOptionPane.WARNING_MESSAGE);
      if (option == JOptionPane.YES_OPTION) {
        if (SaveReportAction.saveReport(
                reportDesignerContext, activeContext, reportDesignerContext.getParent())
            == false) {
          return;
        }
      }
      if (option == JOptionPane.CANCEL_OPTION) {
        return;
      }
    }

    final PublishToServerTask publishToServerTask =
        new PublishToServerTask(reportDesignerContext, reportDesignerContext.getParent());
    final LoginTask loginTask =
        new LoginTask(
            reportDesignerContext, reportDesignerContext.getParent(), publishToServerTask);

    SwingUtilities.invokeLater(loginTask);
  }
    public void run() {
      final ReportDocumentContext context = dragContext.getRenderContext();
      if (rootband) {
        final int result =
            JOptionPane.showOptionDialog(
                dragContext.getRepresentationContainer(),
                Messages.getString(
                    "CrosstabReportElementDragHandler.BandedOrInlineSubreportQuestion"),
                Messages.getString("CrosstabReportElementDragHandler.InsertSubreport"),
                JOptionPane.YES_NO_CANCEL_OPTION,
                JOptionPane.PLAIN_MESSAGE,
                null,
                new String[] {
                  Messages.getString("CrosstabReportElementDragHandler.Inline"),
                  Messages.getString("CrosstabReportElementDragHandler.Banded"),
                  Messages.getString("CrosstabReportElementDragHandler.Cancel")
                },
                Messages.getString("CrosstabReportElementDragHandler.Inline"));
        if (result == JOptionPane.CLOSED_OPTION || result == 2) {
          return;
        }

        if (result == 0) {
          final UndoManager undo = context.getUndo();
          undo.addChange(
              Messages.getString("CrosstabReportElementDragHandler.UndoEntry"),
              new ElementEditUndoEntry(
                  parent.getObjectID(), parent.getElementCount(), null, subReport));
          parent.addElement(subReport);
        } else {
          final AbstractRootLevelBand arb = (AbstractRootLevelBand) parent;
          final UndoManager undo = context.getUndo();
          undo.addChange(
              Messages.getString("CrosstabReportElementDragHandler.UndoEntry"),
              new BandedSubreportEditUndoEntry(
                  parent.getObjectID(), arb.getSubReportCount(), null, subReport));
          arb.addSubReport(subReport);
        }
      } else {
        final UndoManager undo = context.getUndo();
        undo.addChange(
            Messages.getString("CrosstabReportElementDragHandler.UndoEntry"),
            new ElementEditUndoEntry(
                parent.getObjectID(), parent.getElementCount(), null, subReport));
        parent.addElement(subReport);
      }

      final ReportDesignerContext designerContext = dragContext.getDesignerContext();
      final Window window = LibSwingUtil.getWindowAncestor(designerContext.getView().getParent());
      final AbstractReportDefinition reportDefinition =
          designerContext.getActiveContext().getReportDefinition();

      try {
        // Create the new subreport tab - this is where the contents of the Crosstab
        // dialog will go.  Zoom the crosstab canvas to 150% as crosstab has a lot of elements to
        // display
        subReport.setDataFactory(reportDefinition.getDataFactory());
        subReport
            .getReportDefinition()
            .setAttribute(ReportDesignerBoot.DESIGNER_NAMESPACE, ReportDesignerBoot.ZOOM, 1.5f);

        final ResourceBundleFactory rbf = subReport.getResourceBundleFactory();
        subReport.setResourceBundleFactory(rbf);

        final int idx = designerContext.addSubReport(designerContext.getActiveContext(), subReport);
        designerContext.setActiveDocument(designerContext.getReportRenderContext(idx));
      } catch (ReportDataFactoryException e) {
        UncaughtExceptionsModel.getInstance().addException(e);
      }

      // Prompt user to either create or use an existing data-source.
      final SubReportDataSourceDialog crosstabDataSourceDialog;
      if (window instanceof Dialog) {
        crosstabDataSourceDialog = new SubReportDataSourceDialog((Dialog) window);
      } else if (window instanceof Frame) {
        crosstabDataSourceDialog = new SubReportDataSourceDialog((Frame) window);
      } else {
        crosstabDataSourceDialog = new SubReportDataSourceDialog();
      }

      // User has prompted to select a data-source.  Get the selected query
      final String queryName = crosstabDataSourceDialog.performSelection(designerContext);
      if (queryName != null) {
        subReport.setQuery(queryName);

        // Invoke Crosstab dialog
        final InsertCrosstabGroupAction crosstabAction = new InsertCrosstabGroupAction();
        crosstabAction.setReportDesignerContext(designerContext);
        crosstabAction.actionPerformed(new ActionEvent(this, ActionEvent.ACTION_PERFORMED, ""));
      }

      dragContext
          .getRenderContext()
          .getSelectionModel()
          .setSelectedElements(new Object[] {subReport});
    }
  public ChartEditingResult performEdit(
      final Element element, final ReportDesignerContext reportDesignerContext)
      throws CloneNotSupportedException {
    if (element == null) {
      throw new NullPointerException();
    }
    if (reportDesignerContext == null) {
      throw new NullPointerException();
    }
    if (LegacyChartsUtil.isLegacyChartElement(element) == false) {
      return null;
    }
    try {
      chartTable.setReportDesignerContext(reportDesignerContext);
      primaryDataSourceTable.setReportDesignerContext(reportDesignerContext);
      secondaryDataSourceTable.setReportDesignerContext(reportDesignerContext);

      chartPropertiesTableModel.setActiveContext(reportDesignerContext.getActiveContext());
      primaryDataSourcePropertiesTableModel.setActiveContext(
          reportDesignerContext.getActiveContext());
      secondaryDataSourcePropertiesTableModel.setActiveContext(
          reportDesignerContext.getActiveContext());

      final Element editableElement = element.derive();
      final Expression chartExpression =
          editableElement.getAttributeExpression(
              AttributeNames.Core.NAMESPACE, AttributeNames.Core.VALUE);

      final Expression originalPrimaryDataSourceExpression;
      final Expression originalSecondaryDataSourceExpression;
      if (chartExpression != null) {
        originalPrimaryDataSourceExpression = extractPrimaryDatasource(element);
        originalSecondaryDataSourceExpression = extractSecondaryDatasource(element);

        editModel.setChartExpression(chartExpression.getInstance());
        if (originalPrimaryDataSourceExpression != null) {
          editModel.setPrimaryDataSource(originalPrimaryDataSourceExpression.getInstance());
        } else {
          editModel.setPrimaryDataSource(null);
        }

        if (originalSecondaryDataSourceExpression != null) {
          editModel.setSecondaryDataSource(originalSecondaryDataSourceExpression.getInstance());
        } else {
          editModel.setSecondaryDataSource(null);
        }

      } else {
        editModel.setChartExpression(null);
        editModel.setPrimaryDataSource(null);
        editModel.setSecondaryDataSource(null);
        originalPrimaryDataSourceExpression = null;
        originalSecondaryDataSourceExpression = null;
      }

      if (editModel.getCurrentChartType() != null) {
        final ChartType chartType = editModel.getCurrentChartType();
        if (editModel.getPrimaryDataSource() == null) {
          final Class dataSourceImplementation =
              chartType.getPreferredPrimaryDataSourceImplementation();
          final ExpressionMetaData data =
              ExpressionRegistry.getInstance()
                  .getExpressionMetaData(dataSourceImplementation.getName());
          editModel.getPrimaryDataSourcesModel().setSelectedItem(data);
        }
        if (editModel.getSecondaryDataSource() == null) {
          final Class dataSourceImplementation =
              chartType.getPreferredSecondaryDataSourceImplementation();
          if (dataSourceImplementation != null) {
            final ExpressionMetaData data =
                ExpressionRegistry.getInstance()
                    .getExpressionMetaData(dataSourceImplementation.getName());
            editModel.getSecondaryDataSourcesModel().setSelectedItem(data);
          }
        }
      }

      if (performEdit() == false) {
        return null;
      }

      secondaryDataSourceTable.stopEditing();
      primaryDataSourceTable.stopEditing();
      chartTable.stopEditing();

      return new ChartEditingResult(
          chartExpression,
          originalPrimaryDataSourceExpression,
          originalSecondaryDataSourceExpression,
          editModel.getChartExpression(),
          editModel.getPrimaryDataSource(),
          editModel.getSecondaryDataSource());
    } finally {
      chartTable.setReportDesignerContext(null);
      primaryDataSourceTable.setReportDesignerContext(null);
      secondaryDataSourceTable.setReportDesignerContext(null);

      chartPropertiesTableModel.setActiveContext(null);
      primaryDataSourcePropertiesTableModel.setActiveContext(null);
      secondaryDataSourcePropertiesTableModel.setActiveContext(null);
    }
  }