/* * 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 - 2016 Pentaho Corporation.. All rights reserved. */ package org.pentaho.reporting.designer.core.editor.drilldown.swing; import org.pentaho.reporting.designer.core.ReportDesignerContext; import org.pentaho.reporting.designer.core.editor.ReportDocumentContext; import org.pentaho.reporting.designer.core.editor.drilldown.DrillDownParameterRefreshEvent; import org.pentaho.reporting.designer.core.editor.drilldown.DrillDownParameterRefreshListener; import org.pentaho.reporting.designer.core.editor.drilldown.DrillDownParameterTable; 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.basic.DrillDownModelWrapper; import org.pentaho.reporting.designer.core.editor.drilldown.model.DrillDownModel; import org.pentaho.reporting.designer.core.editor.drilldown.model.DrillDownParameter; import org.pentaho.reporting.engine.classic.core.MasterReport; import org.pentaho.reporting.engine.classic.core.parameters.ParameterDefinitionEntry; import org.pentaho.reporting.engine.classic.core.parameters.ReportParameterDefinition; import org.pentaho.reporting.libraries.base.util.StringUtils; import javax.swing.JPanel; import javax.swing.SpringLayout; import javax.swing.SwingUtilities; import java.awt.Component; import java.awt.event.ItemEvent; import java.awt.event.ItemListener; import java.beans.PropertyChangeEvent; import java.beans.PropertyChangeListener; import java.util.ArrayList; import java.util.HashMap; /** * Swing version of the self-drilldown.xul dialog. */ public class SwingSelfDrillDownUi implements DrillDownUi { /** Main panel of the dialog. */ private JPanel editor; /** Tooltip and Target panel. */ private TooltipAndTargetPanel tatPanel; /** Table for parameters input. */ private DrillDownParameterTable table; /** Wrapper for drill down model. */ private DrillDownModelWrapper wrapper; /** Current active render-context holder. */ private ReportDesignerContext reportDesignerContext; /** * Create Swing version of the self-drilldown.xul dialog. */ public SwingSelfDrillDownUi() { SpringLayout layout = new SpringLayout(); final int layoutIndent = 2; editor = new JPanel(); editor.setLayout( layout ); /** "Target:" and "Tooltip:" input fields */ tatPanel = new TooltipAndTargetPanel(); tatPanel.getTargetComboBox().addItemListener( new ItemListener() { public void itemStateChanged( final ItemEvent e ) { getModel().setTargetFormula( e.getItem().toString() ); } } ); tatPanel.getTooltipPanel().addPropertyChangeListener( "formula", new PropertyChangeListener() { public void propertyChange( final PropertyChangeEvent evt ) { getModel().setTooltipFormula( evt.getNewValue().toString() ); } } ); editor.add( tatPanel ); layout.putConstraint( SpringLayout.NORTH, tatPanel, layoutIndent, SpringLayout.NORTH, editor ); layout.putConstraint( SpringLayout.EAST, tatPanel, -layoutIndent, SpringLayout.EAST, editor ); layout.putConstraint( SpringLayout.WEST, tatPanel, layoutIndent, SpringLayout.WEST, editor ); /** "Parameter:" input table */ table = new DrillDownParameterTable(); table.setShowRefreshButton( false ); table.setAllowCustomParameter( true ); table.setSingleTabMode( true ); table.setShowHideParameterUiCheckbox( false ); table.addDrillDownParameterRefreshListener( new UpdateParametersHandler() ); table.addPropertyChangeListener( DrillDownParameterTable.DRILL_DOWN_PARAMETER_PROPERTY, new TableModelBinding() ); editor.add( table ); layout.putConstraint( SpringLayout.NORTH, table, layoutIndent, SpringLayout.SOUTH, tatPanel ); layout.putConstraint( SpringLayout.EAST, table, -layoutIndent, SpringLayout.EAST, editor ); layout.putConstraint( SpringLayout.SOUTH, table, -layoutIndent, SpringLayout.SOUTH, editor ); layout.putConstraint( SpringLayout.WEST, table, layoutIndent, SpringLayout.WEST, editor ); } /** * {@inheritDoc} */ @Override public Component getEditorPanel() { return editor; } /** * {@inheritDoc} */ @Override public DrillDownModel getModel() { return wrapper.getModel(); } /** * Get wrapper for drill down model. * * @return DrillDownModelWrapper of this drill down dialog. */ protected DrillDownModelWrapper getWrapper() { return wrapper; } /** * Get table for parameters input. * * @return DrillDownParameterTable of this drill down dialog. */ protected DrillDownParameterTable getTable() { return table; } /** * {@inheritDoc} */ @Override public void init( Component parent, ReportDesignerContext reportDesignerContext, DrillDownModel model, String[] extraFields ) throws DrillDownUiException { this.reportDesignerContext = reportDesignerContext; this.wrapper = new DrillDownModelWrapper( model ); model.setDrillDownConfig( SwingSelfDrillDownUiProfile.NAME_DEFAULT ); // Check model and init default values if ( getModel().isLimitedEditor() ) { tatPanel.hideContent(); } if ( getModel().getTooltipFormula() != null ) { tatPanel.getTooltipPanel().setFormula( getModel().getTooltipFormula() ); } if ( getModel().getTargetFormula() != null ) { tatPanel.getTargetComboBox().setSelectedItem( getModel().getTargetFormula() ); } SwingUtilities.invokeLater( new Runnable() { @Override public void run() { getTable().refreshParameterData(); } } ); } /** * {@inheritDoc} */ @Override public void deactivate() { // Nothing to deactivate --Kaa } /** * Get current active render-context holder. * * @return current active render-context holder. */ public ReportDesignerContext getReportDesignerContext() { return reportDesignerContext; } /** * PropertyChangeListener for drill down parameter table. */ private class TableModelBinding implements PropertyChangeListener { /** * {@inheritDoc} */ public void propertyChange( final PropertyChangeEvent evt ) { wrapper.setDrillDownParameter( filterParameter( table.getDrillDownParameter() ) ); } private DrillDownParameter[] filterParameter( final DrillDownParameter[] parameter ) { final ArrayList<DrillDownParameter> list = new ArrayList<DrillDownParameter>( parameter.length ); for ( int i = 0; i < parameter.length; i++ ) { final DrillDownParameter downParameter = parameter[ i ]; if ( StringUtils.isEmpty( downParameter.getFormulaFragment() ) ) { continue; } list.add( downParameter ); } return list.toArray( new DrillDownParameter[ list.size() ] ); } } /** * ParameterRefreshListener for drill down parameter table. */ private class UpdateParametersHandler implements DrillDownParameterRefreshListener { /** * {@inheritDoc} */ public void requestParameterRefresh( final DrillDownParameterRefreshEvent event ) { final HashMap<String, DrillDownParameter> entries = new HashMap<String, DrillDownParameter>(); final DrillDownParameter[] originalParams = event.getParameter(); for ( int i = 0; i < originalParams.length; i++ ) { final DrillDownParameter param = originalParams[ i ]; param.setType( DrillDownParameter.Type.MANUAL ); entries.put( param.getName(), param ); } final ReportDocumentContext activeContext = getReportDesignerContext().getActiveContext(); final MasterReport masterReportElement = activeContext.getContextRoot(); final ReportParameterDefinition reportParams = masterReportElement.getParameterDefinition(); final ParameterDefinitionEntry[] parameterDefinitionEntries = reportParams.getParameterDefinitions(); for ( int i = 0; i < parameterDefinitionEntries.length; i++ ) { final ParameterDefinitionEntry entry = parameterDefinitionEntries[i]; if ( entries.containsKey( entry.getName() ) == false ) { entries.put( entry.getName(), new DrillDownParameter( entry.getName(), null, DrillDownParameter.Type.PREDEFINED, false, false ) ); } else { final DrillDownParameter parameter = entries.get( entry.getName() ); parameter.setType( DrillDownParameter.Type.PREDEFINED ); } } final DrillDownParameter[] parameters = entries.values().toArray( new DrillDownParameter[ entries.size() ] ); getWrapper().setDrillDownParameter( parameters ); getTable().setDrillDownParameter( parameters ); } } }