Package org.pentaho.reporting.designer.core.editor.drilldown.basic

Source Code of org.pentaho.reporting.designer.core.editor.drilldown.basic.XulDrillDownUi

/*!
* 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) 2002-2013 Pentaho Corporation..  All rights reserved.
*/

package org.pentaho.reporting.designer.core.editor.drilldown.basic;

import java.awt.Component;
import javax.swing.JDialog;
import javax.swing.JFrame;
import javax.swing.JLabel;

import org.dom4j.io.DOMReader;
import org.pentaho.reporting.designer.core.ReportDesignerBoot;
import org.pentaho.reporting.designer.core.ReportDesignerContext;
import org.pentaho.reporting.designer.core.editor.drilldown.DrillDownUi;
import org.pentaho.reporting.designer.core.editor.drilldown.DrillDownUiException;
import org.pentaho.reporting.designer.core.editor.drilldown.model.DrillDownModel;
import org.pentaho.reporting.libraries.base.config.Configuration;
import org.pentaho.reporting.libraries.base.util.ObjectUtilities;
import org.pentaho.reporting.libraries.resourceloader.Resource;
import org.pentaho.reporting.libraries.resourceloader.ResourceException;
import org.pentaho.reporting.libraries.resourceloader.ResourceManager;
import org.pentaho.ui.xul.XulComponent;
import org.pentaho.ui.xul.XulDomContainer;
import org.pentaho.ui.xul.XulException;
import org.pentaho.ui.xul.XulRunner;
import org.pentaho.ui.xul.swing.SwingXulLoader;
import org.pentaho.ui.xul.swing.SwingXulRunner;
import org.pentaho.ui.xul.swing.tags.SwingDialog;
import org.pentaho.ui.xul.swing.tags.SwingWindow;
import org.w3c.dom.Document;

public class XulDrillDownUi implements DrillDownUi
{
  private XulDrillDownController controller;
  private Component editor;
  private DrillDownModel model;
  private String[] validConfigs;
  private String configurationTag;

  public XulDrillDownUi(final String[] validConfigs, final String configurationTag)
  {
    if (validConfigs == null || validConfigs.length == 0)
    {
      throw new IllegalArgumentException();
    }
    if (configurationTag == null)
    {
      throw new NullPointerException();
    }

    this.configurationTag = configurationTag;
    this.validConfigs = validConfigs.clone();
    this.editor = new JLabel("Editor has not been configured");
  }

  public void init(final Component parent,
                   final ReportDesignerContext reportDesignerContext,
                   final DrillDownModel model,
                   final String[] extraFields) throws DrillDownUiException
  {
    if (model == null)
    {
      throw new NullPointerException();
    }
    if (reportDesignerContext == null)
    {
      throw new NullPointerException();
    }
    if (extraFields == null)
    {
      throw new NullPointerException();
    }
    try
    {

      this.model = model;
      // Load the document
      final SwingXulLoader loader = new DrillDownSwingLoader();
      loader.setOuterContext(parent);

      final String modelProfileName = model.getDrillDownConfig();
      final String profileName = filter(modelProfileName);
      model.setDrillDownConfig(profileName);

      final Configuration configuration = ReportDesignerBoot.getInstance().getGlobalConfig();
      final String xulDocument = configuration.getConfigProperty
          ("org.pentaho.reporting.designer.core.editor.drilldown.xul-document." + configurationTag, // NON-NLS
              "res://org/pentaho/reporting/designer/core/editor/drilldown/basic/basic-drilldown.xul"); // NON-NLS

      final ResourceManager resourceManager = new ResourceManager();
      final Resource resource = resourceManager.createDirectly(xulDocument, Document.class);
      final Document document = (Document) resource.getResource();
      final DOMReader domReader = new DOMReader();
      final XulDomContainer container = loader.loadXulFragment(domReader.read(document));


      // Create our main Controller
      final String className = configuration.getConfigProperty
          ("org.pentaho.reporting.designer.core.editor.drilldown.xul-controller." + configurationTag, // NON-NLS
              DefaultXulDrillDownController.class.getName());
      controller =
          ObjectUtilities.loadAndInstantiate(className, XulDrillDownController.class, XulDrillDownController.class);
      if (controller != null)
      {
        controller.setName("controller"); // NON-NLS
        controller.setXulDomContainer(container);
        controller.init(reportDesignerContext, model, extraFields);
        container.addEventHandler(controller);
      }

      // Start it up!
      final XulRunner runner = new SwingXulRunner();
      runner.addContainer(container);

      runner.initialize();
      final org.pentaho.ui.xul.dom.Document documentRoot = runner.getXulDomContainers().get(0).getDocumentRoot();
      final XulComponent rootElement = documentRoot.getElementById("root");
      if (rootElement != null)
      {
        editor = (Component) rootElement.getManagedObject();
      }
      else
      {
        final XulComponent rootEle = documentRoot.getRootElement();
        if (rootEle instanceof SwingWindow)
        {
          final SwingWindow window = (SwingWindow) rootEle;
          final JFrame rootFrame = (JFrame) window.getRootObject();
          editor = rootFrame.getContentPane();
        }
        else if (rootEle instanceof SwingDialog)
        {
          final SwingDialog dialog = (SwingDialog) rootEle;
          final JDialog rootFrame = dialog.getDialog();
          editor = rootFrame.getContentPane();
        }
        else
        {
          throw new DrillDownUiException("Root element not a Frame: " + rootEle);
        }
      }
    }
    catch (XulException xe)
    {
      throw new DrillDownUiException(xe);
    }
    catch (ResourceException e)
    {
      throw new DrillDownUiException(e);
    }
  }

  private String extractPropertiesName(final String xulDocument)
  {
    String base;
    int startIndex = 0;
    if (xulDocument.startsWith("res:/"))
    {
      startIndex = 5;
    }
    if (xulDocument.endsWith(".xul"))
    {
      base = xulDocument.substring(startIndex, xulDocument.length() - 4);
    }
    else
    {
      base = xulDocument.substring(startIndex);
    }
    return base.replace('/', '.');
  }

  private String filter(final String modelProfileName)
  {
    for (int i = 0; i < validConfigs.length; i++)
    {
      final String config = validConfigs[i];
      if (config.equals(modelProfileName))
      {
        return modelProfileName;
      }
    }
    return validConfigs[0];
  }

  public Component getEditorPanel()
  {
    return editor;
  }

  public DrillDownModel getModel()
  {
    if (controller != null)
    {
      return controller.getModel();
    }
    return model;
  }

  public void deactivate()
  {
    if (controller != null)
    {
      controller.deactivate();
    }
  }
}
TOP

Related Classes of org.pentaho.reporting.designer.core.editor.drilldown.basic.XulDrillDownUi

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.