/* * 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.extensions.pentaho.drilldown.swing; import org.pentaho.reporting.designer.core.Messages; import org.pentaho.reporting.designer.core.ReportDesignerContext; 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.swing.TooltipAndTargetPanel; import javax.swing.JButton; import javax.swing.JCheckBox; import javax.swing.JLabel; import javax.swing.JPanel; import javax.swing.JTextField; import javax.swing.SpringLayout; import java.awt.Component; import java.awt.Dimension; import java.awt.event.ItemEvent; import java.awt.event.ItemListener; import java.beans.PropertyChangeEvent; import java.beans.PropertyChangeListener; import java.util.HashMap; /** * Swing analog for sugar-xaction-drilldown.xul dialog. * * @author Aleksandr Kozlov */ public class SwingRemoteDrillDownUi implements DrillDownUi { /** Form component identifiers for lookup. */ enum ComponentLookup { SERVER_URL_CHECKBOX, LOGIN_BUTTON, SERVER_URL_FIELD, BROWSE_BUTTON, PATH_FIELD, PARAMETER_TABLE; }; /** Component map to perform lookup by name. */ private HashMap<ComponentLookup, Component> componentMap; /** DrillDown form controller. */ private SwingRemoteDrillDownController controller; /** Top=level components container. */ private JPanel editor; /** Server URL input field. */ private JTextField serverUrlField; /** Path input field. */ private JTextField pathField; /** Tooltip and Target panel. */ private TooltipAndTargetPanel tatPanel; /** Wrapper for drill down model. */ private DrillDownModelWrapper wrapper; /** Current active render-context holder. */ private ReportDesignerContext reportDesignerContext; /** * Create Swing version of the sugar-xaction-drilldown.xul dialog. */ public SwingRemoteDrillDownUi() { editor = createEditor(); initComponentMap(); } /** * Create the main panel of the dialog with all Swing component and layout them. * * @return the main panel of the dialog. */ private JPanel createEditor() { final int layoutIndent = 2; JPanel editor = new JPanel(); SpringLayout layout = new SpringLayout(); editor.setLayout( layout ); // "Include server URL in path" section JCheckBox serverUrlCheckBox = createServerUrlCheckBox(); editor.add( serverUrlCheckBox ); layout.putConstraint( SpringLayout.NORTH, serverUrlCheckBox, layoutIndent, SpringLayout.NORTH, editor ); layout.putConstraint( SpringLayout.EAST, serverUrlCheckBox, layoutIndent, SpringLayout.EAST, editor ); layout.putConstraint( SpringLayout.WEST, serverUrlCheckBox, layoutIndent, SpringLayout.WEST, editor ); // "Server URL" section JLabel serverUrlLabel = createServerUrlLabel(); editor.add( serverUrlLabel ); layout.putConstraint( SpringLayout.NORTH, serverUrlLabel, layoutIndent, SpringLayout.SOUTH, serverUrlCheckBox ); layout.putConstraint( SpringLayout.EAST, serverUrlLabel, layoutIndent, SpringLayout.EAST, editor ); layout.putConstraint( SpringLayout.WEST, serverUrlLabel, layoutIndent, SpringLayout.WEST, editor ); JButton loginButton = createLoginButton(); editor.add( loginButton ); layout.putConstraint( SpringLayout.NORTH, loginButton, layoutIndent, SpringLayout.SOUTH, serverUrlLabel ); layout.putConstraint( SpringLayout.EAST, loginButton, 0, SpringLayout.EAST, editor ); serverUrlField = createServerUrlField(); editor.add( serverUrlField ); layout.putConstraint( SpringLayout.NORTH, serverUrlField, layoutIndent, SpringLayout.SOUTH, serverUrlLabel ); layout.putConstraint( SpringLayout.EAST, serverUrlField, -layoutIndent, SpringLayout.WEST, loginButton ); layout.putConstraint( SpringLayout.SOUTH, serverUrlField, 0, SpringLayout.SOUTH, loginButton ); layout.putConstraint( SpringLayout.WEST, serverUrlField, layoutIndent, SpringLayout.WEST, editor ); // "Path" section JLabel pathLabel = createPathLabel(); editor.add( pathLabel ); layout.putConstraint( SpringLayout.NORTH, pathLabel, layoutIndent, SpringLayout.SOUTH, serverUrlField ); layout.putConstraint( SpringLayout.EAST, pathLabel, layoutIndent, SpringLayout.EAST, editor ); layout.putConstraint( SpringLayout.WEST, pathLabel, layoutIndent, SpringLayout.WEST, editor ); JButton browseButton = createBrowseButton(); editor.add( browseButton ); layout.putConstraint( SpringLayout.NORTH, browseButton, layoutIndent, SpringLayout.SOUTH, pathLabel ); layout.putConstraint( SpringLayout.EAST, browseButton, 0, SpringLayout.EAST, editor ); pathField = createPathField(); editor.add( pathField ); layout.putConstraint( SpringLayout.NORTH, pathField, layoutIndent, SpringLayout.SOUTH, pathLabel ); layout.putConstraint( SpringLayout.EAST, pathField, -layoutIndent, SpringLayout.WEST, browseButton ); layout.putConstraint( SpringLayout.SOUTH, pathField, 0, SpringLayout.SOUTH, browseButton ); layout.putConstraint( SpringLayout.WEST, pathField, layoutIndent, SpringLayout.WEST, editor ); /** "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.SOUTH, pathField ); layout.putConstraint( SpringLayout.EAST, tatPanel, 0, SpringLayout.EAST, editor ); layout.putConstraint( SpringLayout.WEST, tatPanel, layoutIndent, SpringLayout.WEST, editor ); // "Parameter table" section DrillDownParameterTable table = createParameterTable(); 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 ); return editor; } /** * Create top checkbox with "Include server URL in path" label. * * @return created checkbox. */ private JCheckBox createServerUrlCheckBox() { JCheckBox checkBox = new JCheckBox(); checkBox.setName( ComponentLookup.SERVER_URL_CHECKBOX.name() ); checkBox.setText( Messages.getString( "DrillDownDialog.ServerUrlCheckBox.Text" ) ); return checkBox; } /** * Create a label of the "server URL" text field. * * @return created label. */ private JLabel createServerUrlLabel() { JLabel label = new JLabel(); label.setText( Messages.getString( "DrillDownDialog.ServerUrlInput.Label" ) ); label.setMinimumSize( new Dimension( 0, 20 ) ); return label; } /** * Create a "Login" button. * * @return created button. */ private JButton createLoginButton() { JButton button = new JButton(); button.setName( ComponentLookup.LOGIN_BUTTON.name() ); button.setText( Messages.getString( "DrillDownDialog.LoginButton.Text" ) ); return button; } /** * Create "server URL" text field. * * @return created text field. */ private JTextField createServerUrlField() { JTextField field = new JTextField(); field.setName( ComponentLookup.SERVER_URL_FIELD.name() ); return field; } /** * Create a label for the path input. * * @return created label. */ private JLabel createPathLabel() { JLabel label = new JLabel(); label.setText( Messages.getString( "DrillDownDialog.PathInput.Label" ) ); label.setMinimumSize( new Dimension( 0, 20 ) ); return label; } /** * Create a "browse" button. * * @return created button. */ private JButton createBrowseButton() { JButton button = new JButton(); button.setName( ComponentLookup.BROWSE_BUTTON.name() ); button.setText( Messages.getString( "DrillDownDialog.BrowseButton.Text" ) ); return button; } /** * Create "path" test field. * * @return created text field. */ private JTextField createPathField() { JTextField field = new JTextField(); field.setName( ComponentLookup.PATH_FIELD.name() ); return field; } /** * Create drill down parameter table. * * @return created table. */ private DrillDownParameterTable createParameterTable() { DrillDownParameterTable table = new DrillDownParameterTable(); table.setName( ComponentLookup.PARAMETER_TABLE.name() ); table.setShowRefreshButton( true ); table.setAllowCustomParameter( true ); return table; } /** * Initialize component map for the lookup. */ private void initComponentMap() { componentMap = new HashMap<>(); for ( Component component : editor.getComponents() ) { try { String name = component.getName(); if ( name != null ) { ComponentLookup lookupName = ComponentLookup.valueOf( name ); componentMap.put( lookupName, component ); } } catch ( IllegalArgumentException ex ) { // Simply skip component, do not handle the exception --Kaa } } } /** * Component lookup. * * @param lookupName name of the component. * @param <C> class of the component. * @return found component. * @throws IllegalStateException of component not found by provided name. */ public <C extends Component> C getComponent( ComponentLookup lookupName ) { if ( componentMap.containsKey( lookupName ) ) { return (C) componentMap.get( lookupName ); } else { throw new IllegalStateException( "Element " + lookupName + " wasn't initialized properly" ); } } /** * {@inheritDoc} */ @Override public Component getEditorPanel() { return editor; } /** * {@inheritDoc} */ @Override public DrillDownModel getModel() { return wrapper.getModel(); } /** * {@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( SwingRemoteDrillDownUiProfile.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() ); } if ( getModel().getDrillDownPath() != null ) { pathField.setText( getModel().getDrillDownPath() ); } controller = new SwingRemoteDrillDownController( this, reportDesignerContext, wrapper ); controller.init(); } /** * {@inheritDoc} */ @Override public void deactivate() { controller.deactivate(); } }