Package org.pentaho.reporting.designer.core.editor.preview

Source Code of org.pentaho.reporting.designer.core.editor.preview.ReportPreviewComponent

/*
* This program is free software; you can redistribute it and/or modify it under the
* terms of the GNU Lesser General Public License, version 2.1 as published by the Free Software
* Foundation.
*
* You should have received a copy of the GNU Lesser General Public License along with this
* program; if not, you can obtain a copy at http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html
* or from the Free Software Foundation, Inc.,
* 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
*
* This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY;
* without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
* See the GNU Lesser General Public License for more details.
*
* Copyright (c) 2006 - 2009 Pentaho Corporation..  All rights reserved.
*/

package org.pentaho.reporting.designer.core.editor.preview;

import java.awt.BorderLayout;
import java.awt.Component;
import java.awt.Dialog;
import java.awt.EventQueue;
import java.awt.Frame;
import java.beans.PropertyChangeEvent;
import java.beans.PropertyChangeListener;
import javax.swing.JPanel;

import org.pentaho.reporting.designer.core.ReportDesignerContext;
import org.pentaho.reporting.designer.core.editor.ReportRenderContext;
import org.pentaho.reporting.designer.core.editor.ZoomModel;
import org.pentaho.reporting.designer.core.editor.ZoomModelListener;
import org.pentaho.reporting.designer.core.util.exceptions.UncaughtExceptionsModel;
import org.pentaho.reporting.engine.classic.core.MasterReport;
import org.pentaho.reporting.engine.classic.core.ReportInterruptedException;
import org.pentaho.reporting.engine.classic.core.ReportParameterValidationException;
import org.pentaho.reporting.engine.classic.core.modules.gui.base.PreviewPane;
import org.pentaho.reporting.engine.classic.core.modules.gui.commonswing.ReportProgressBar;
import org.pentaho.reporting.engine.classic.core.modules.gui.commonswing.ReportProgressDialog;
import org.pentaho.reporting.engine.classic.core.modules.gui.commonswing.SwingUtil;

/**
* Todo: Document me!
*
* @author Thomas Morgner
*/
public class ReportPreviewComponent extends JPanel
{
  private class StatusHandler implements PropertyChangeListener
  {
    private PreviewPane previewPane;
    private ReportDesignerContext context;

    private StatusHandler(final PreviewPane previewPane, final ReportDesignerContext context)
    {
      this.previewPane = previewPane;
      this.context = context;
    }

    public void propertyChange(final PropertyChangeEvent evt)
    {
      if (PreviewPane.STATUS_TEXT_PROPERTY.equals(evt.getPropertyName()))
      {
        context.setStatusText(previewPane.getStatusText());
      }
      final String propertyName = evt.getPropertyName();
      if (PreviewPane.ERROR_PROPERTY.equals(propertyName))
      {
        final Throwable error = previewPane.getError();
        if (error != null &&
            error instanceof ReportParameterValidationException == false &&
            error instanceof ReportInterruptedException == false)
        {
          UncaughtExceptionsModel.getInstance().addException(error);
        }
        return;
      }

      if (PreviewPane.STATUS_TEXT_PROPERTY.equals(propertyName)
          || PreviewPane.STATUS_TYPE_PROPERTY.equals(propertyName))
      {
        context.setStatusText(previewPane.getStatusText());
        return;
      }

      if (PreviewPane.PAGINATING_PROPERTY.equals(propertyName))
      {
        if (Boolean.TRUE.equals(evt.getNewValue()))
        {

          context.setStatusText("Paginating..."); //$NON-NLS-1$
          if (progressBar != null)
          {
            previewPane.addReportProgressListener(progressBar);
            progressBar.setOnlyPagination(true);
            progressBar.setVisible(true);
            progressBar.revalidate();
          }
          if (progressDialog != null)
          {
            previewPane.addReportProgressListener(progressDialog);
            SwingUtil.centerDialogInParent(progressDialog);
            progressDialog.setOnlyPagination(true);
            progressDialog.setVisible(true);
          }
        }
        else
        {
          context.setStatusText(""); //$NON-NLS-1$
          if (progressBar != null)
          {
            progressBar.setOnlyPagination(false);
            progressBar.setVisible(false);
            previewPane.removeReportProgressListener(progressBar);
            progressBar.revalidate();
          }
          if (progressDialog != null)
          {
            previewPane.removeReportProgressListener(progressDialog);
            progressDialog.setOnlyPagination(false);
            progressDialog.setVisible(false);
          }
        }
      }
    }
  }

  private class RequestFocusTask implements Runnable
  {
    public void run()
    {
      requestFocusInWindow();
    }
  }

  private class ZoomUpdateHandler implements ZoomModelListener, PropertyChangeListener
  {
    public void zoomFactorChanged()
    {
      if (zoomModel == null)
      {
        return;
      }
      setZoom(zoomModel.getZoomAsPercentage());
    }

    /**
     * This method gets called when a bound property is changed.
     *
     * @param evt A PropertyChangeEvent object describing the event source
     *            and the property that has changed.
     */
    public void propertyChange(final PropertyChangeEvent evt)
    {
      if (PreviewPane.ZOOM_PROPERTY.equals(evt.getPropertyName()))
      {
        final float factor = (float) previewPane.getZoom();
        if (zoomModel.getZoomAsPercentage() != factor)
        {
          zoomModel.setZoomAsPercentage(factor);
        }
      }
    }
  }

  private PreviewPane previewPane;
  private ZoomModel zoomModel;
  private ZoomUpdateHandler zoomUpdateHandler;
  private ReportProgressDialog progressDialog;
  private ReportProgressBar progressBar;

  public ReportPreviewComponent(final ReportDesignerContext context)
  {
    if (context == null)
    {
      throw new NullPointerException();
    }

    setBackground(null);
    setOpaque(false);

    setLayout(new BorderLayout());
    zoomUpdateHandler = new ZoomUpdateHandler();

    previewPane = new DesignerPreviewPane(context);
    previewPane.setOpaque(false);
    previewPane.setBackground(null);
    previewPane.addPropertyChangeListener(new StatusHandler(previewPane, context));
    add(previewPane, BorderLayout.CENTER);


    final Component parent = context.getParent();
    if (parent instanceof Dialog)
    {
      progressDialog = new ReportProgressDialog((Dialog) parent);
    }
    else if (parent instanceof Frame)
    {
      progressDialog = new ReportProgressDialog((Frame) parent);
    }
    else
    {
      progressDialog = new ReportProgressDialog();
    }
    progressDialog.pack();

    progressBar = new ReportProgressBar();
    progressBar.setVisible(false);
    previewPane.addReportProgressListener(progressBar);
  }

  public void updatePreview(final ReportRenderContext reportRenderContext)
  {
    if (zoomModel != null)
    {
      zoomModel.removeZoomModelListener(zoomUpdateHandler);
      previewPane.removePropertyChangeListener(PreviewPane.ZOOM_PROPERTY, zoomUpdateHandler);
    }

    if (reportRenderContext == null)
    {
      previewPane.setReportJob(null);
      zoomModel = null;
    }
    else
    {
      final MasterReport reportDialog = reportRenderContext.getMasterReportElement();
      previewPane.setReportJob(reportDialog);

      zoomModel = reportRenderContext.getZoomModel();
      zoomModel.addZoomModelListener(zoomUpdateHandler);
      previewPane.addPropertyChangeListener(PreviewPane.ZOOM_PROPERTY, zoomUpdateHandler);
      previewPane.setZoom(zoomModel.getZoomAsPercentage());

      EventQueue.invokeLater(new RequestFocusTask());
    }
  }


  public void setZoom(final double zoomFactor)
  {
    previewPane.setZoom(zoomFactor);
  }

  public double getZoom()
  {
    return previewPane.getZoom();
  }

  public void dispose()
  {
    previewPane.setClosed(true);
  }
}
TOP

Related Classes of org.pentaho.reporting.designer.core.editor.preview.ReportPreviewComponent

TOP
Copyright © 2018 www.massapi.com. All rights reserved.
All source code are property of their respective owners. Java is a trademark of Sun Microsystems, Inc and owned by ORACLE Inc. Contact coftware#gmail.com.