/* * 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) 2001 - 2013 Object Refinery Ltd, Pentaho Corporation and Contributors.. All rights reserved. */ package org.pentaho.reporting.engine.classic.core.modules.gui.pdf; import java.awt.BorderLayout; import java.awt.Dialog; import java.awt.Frame; import java.awt.GridBagConstraints; import java.awt.GridBagLayout; import java.awt.GridLayout; import java.awt.Insets; import java.awt.event.ActionEvent; import java.io.File; import java.text.MessageFormat; import java.util.Locale; import java.util.ResourceBundle; import javax.swing.AbstractAction; import javax.swing.Action; import javax.swing.BorderFactory; import javax.swing.ButtonGroup; import javax.swing.DefaultComboBoxModel; import javax.swing.JButton; import javax.swing.JCheckBox; import javax.swing.JComboBox; import javax.swing.JFileChooser; import javax.swing.JLabel; import javax.swing.JOptionPane; import javax.swing.JPanel; import javax.swing.JPasswordField; import javax.swing.JRadioButton; import javax.swing.JTabbedPane; import javax.swing.JTextField; import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; import org.pentaho.reporting.engine.classic.core.ClassicEngineBoot; import org.pentaho.reporting.engine.classic.core.MasterReport; import org.pentaho.reporting.engine.classic.core.modules.gui.base.AbstractExportDialog; import org.pentaho.reporting.engine.classic.core.modules.gui.common.GuiContext; import org.pentaho.reporting.engine.classic.core.modules.gui.common.StatusType; import org.pentaho.reporting.engine.classic.core.modules.gui.commonswing.EncodingComboBoxModel; import org.pentaho.reporting.engine.classic.core.modules.gui.commonswing.JStatusBar; import org.pentaho.reporting.libraries.base.config.Configuration; import org.pentaho.reporting.libraries.base.config.DefaultConfiguration; import org.pentaho.reporting.libraries.base.util.FilesystemFilter; import org.pentaho.reporting.libraries.fonts.encoding.EncodingRegistry; /** * Creation-Date: 02.12.2006, 15:27:30 * * @author Thomas Morgner */ public class PdfExportDialog extends AbstractExportDialog { private static final Log logger = LogFactory.getLog( PdfExportDialog.class ); /** * Useful constant. */ private static final int CBMODEL_NOPRINTING = 0; /** * Useful constant. */ private static final int CBMODEL_DEGRADED = 1; /** * Useful constant. */ private static final int CBMODEL_FULL = 2; /** * Internal action class to enable/disable the Security-Settings panel. Without encryption a pdf file cannot have any * security settings enabled. */ private class ActionSecuritySelection extends AbstractAction { /** * Default constructor. */ protected ActionSecuritySelection() { } /** * Receives notification that the action has occurred. * * @param e * the action event. */ public void actionPerformed( final ActionEvent e ) { updateSecurityPanelEnabled(); } } /** * Internal action class to select a target file. */ private class ActionSelectFile extends AbstractAction { /** * Default constructor. */ protected ActionSelectFile( final ResourceBundle resources ) { putValue( Action.NAME, resources.getString( "pdfsavedialog.selectFile" ) ); //$NON-NLS-1$ } /** * Receives notification that the action has occurred. * * @param e * the action event. */ public void actionPerformed( final ActionEvent e ) { performSelectFile(); } } /** * Security (none) radio button. */ private JRadioButton rbSecurityNone; /** * Security (40 bit) radio button. */ private JRadioButton rbSecurity40Bit; /** * Security (128 bit) radio button. */ private JRadioButton rbSecurity128Bit; /** * User password text field. */ private JTextField txUserPassword; /** * Owner password text field. */ private JTextField txOwnerPassword; /** * Confirm user password text field. */ private JTextField txConfUserPassword; /** * Confirm ownder password text field. */ private JTextField txConfOwnerPassword; /** * Allow copy check box. */ private JCheckBox cxAllowCopy; /** * Allow screen readers check box. */ private JCheckBox cxAllowScreenReaders; /** * Allow printing check box. */ private JComboBox cbAllowPrinting; /** * Allow assembly check box. */ private JCheckBox cxAllowAssembly; /** * Allow modify contents check box. */ private JCheckBox cxAllowModifyContents; /** * Allow modify annotations check box. */ private JCheckBox cxAllowModifyAnnotations; /** * Allow fill in check box. */ private JCheckBox cxAllowFillIn; /** * A model for the available encodings. */ private EncodingComboBoxModel encodingModel; /** * A file chooser. */ private JFileChooser fileChooser; /** * Title text field. */ private JTextField txTitle; /** * Author text field. */ private JTextField txAuthor; private static final String PDF_FILE_EXTENSION = ".pdf"; //$NON-NLS-1$ private JStatusBar statusBar; private JTextField txFilename; private DefaultComboBoxModel printingModel; private JComboBox cbEncoding; private JCheckBox cxEmbedded; private JTextField txKeywords; private JTextField txDescription; /** * Creates a non-modal dialog without a title and without a specified <code>Frame</code> owner. A shared, hidden frame * will be set as the owner of the dialog. */ public PdfExportDialog() { initializeComponents(); } /** * Creates a non-modal dialog without a title with the specified <code>Frame</code> as its owner. If * <code>owner</code> is <code>null</code>, a shared, hidden frame will be set as the owner of the dialog. * * @param owner * the <code>Frame</code> from which the dialog is displayed */ public PdfExportDialog( final Frame owner ) { super( owner ); initializeComponents(); } /** * Creates a non-modal dialog without a title with the specified <code>Dialog</code> as its owner. * * @param owner * the non-null <code>Dialog</code> from which the dialog is displayed */ public PdfExportDialog( final Dialog owner ) { super( owner ); initializeComponents(); } private JPanel createMetaDataPanel() { final JPanel contentPane = new JPanel(); contentPane.setLayout( new GridBagLayout() ); final JLabel lblAuthor = new JLabel( getResources().getString( "pdfsavedialog.author" ) ); //$NON-NLS-1$ final JLabel lblTitel = new JLabel( getResources().getString( "pdfsavedialog.title" ) ); //$NON-NLS-1$ final JLabel lblKeywords = new JLabel( getResources().getString( "pdfsavedialog.keywords" ) ); //$NON-NLS-1$ final JLabel lblDescription = new JLabel( getResources().getString( "pdfsavedialog.description" ) ); //$NON-NLS-1$ GridBagConstraints gbc = new GridBagConstraints(); gbc.gridx = 0; gbc.gridy = 0; gbc.anchor = GridBagConstraints.WEST; gbc.insets = new Insets( 3, 1, 1, 1 ); contentPane.add( lblTitel, gbc ); gbc = new GridBagConstraints(); gbc.anchor = GridBagConstraints.WEST; gbc.gridx = 0; gbc.gridy = 1; gbc.insets = new Insets( 1, 1, 1, 1 ); contentPane.add( lblAuthor, gbc ); gbc = new GridBagConstraints(); gbc.anchor = GridBagConstraints.WEST; gbc.gridx = 0; gbc.gridy = 2; gbc.insets = new Insets( 1, 1, 1, 1 ); contentPane.add( lblKeywords, gbc ); gbc = new GridBagConstraints(); gbc.anchor = GridBagConstraints.WEST; gbc.gridx = 0; gbc.gridy = 3; gbc.insets = new Insets( 1, 1, 1, 1 ); contentPane.add( lblDescription, gbc ); gbc = new GridBagConstraints(); gbc.fill = GridBagConstraints.HORIZONTAL; gbc.weightx = 1; gbc.gridx = 1; gbc.gridy = 0; gbc.gridwidth = 2; gbc.insets = new Insets( 3, 1, 1, 1 ); contentPane.add( txTitle, gbc ); gbc = new GridBagConstraints(); gbc.fill = GridBagConstraints.HORIZONTAL; gbc.weightx = 1; gbc.gridx = 1; gbc.gridy = 1; gbc.gridwidth = 2; gbc.insets = new Insets( 1, 1, 1, 1 ); contentPane.add( txAuthor, gbc ); gbc = new GridBagConstraints(); gbc.fill = GridBagConstraints.HORIZONTAL; gbc.weightx = 1; gbc.gridx = 1; gbc.gridy = 2; gbc.gridwidth = 2; gbc.insets = new Insets( 1, 1, 1, 1 ); contentPane.add( txKeywords, gbc ); gbc = new GridBagConstraints(); gbc.fill = GridBagConstraints.HORIZONTAL; gbc.weightx = 1; gbc.gridx = 1; gbc.gridy = 3; gbc.gridwidth = 2; gbc.insets = new Insets( 1, 1, 1, 1 ); contentPane.add( txDescription, gbc ); final JPanel advancedOptionsPane = new JPanel(); advancedOptionsPane.setLayout( new BorderLayout() ); advancedOptionsPane.add( contentPane, BorderLayout.NORTH ); return advancedOptionsPane; } private void initializeComponents() { setTitle( getResources().getString( "pdfsavedialog.dialogtitle" ) ); //$NON-NLS-1$ txAuthor = new JTextField(); txAuthor.setColumns( 40 ); txTitle = new JTextField(); txTitle.setColumns( 40 ); txKeywords = new JTextField(); txKeywords.setColumns( 40 ); txDescription = new JTextField(); txDescription.setColumns( 40 ); rbSecurityNone = new JRadioButton( getResources().getString( "pdfsavedialog.securityNone" ) ); //$NON-NLS-1$ rbSecurity40Bit = new JRadioButton( getResources().getString( "pdfsavedialog.security40bit" ) ); //$NON-NLS-1$ rbSecurity128Bit = new JRadioButton( getResources().getString( "pdfsavedialog.security128bit" ) ); //$NON-NLS-1$ final Action securitySelectAction = new ActionSecuritySelection(); rbSecurityNone.addActionListener( securitySelectAction ); rbSecurity40Bit.addActionListener( securitySelectAction ); rbSecurity128Bit.addActionListener( securitySelectAction ); rbSecurity128Bit.setSelected( true ); txUserPassword = new JPasswordField(); txConfUserPassword = new JPasswordField(); txOwnerPassword = new JPasswordField(); txConfOwnerPassword = new JPasswordField(); cxAllowCopy = new JCheckBox( getResources().getString( "pdfsavedialog.allowCopy" ) ); //$NON-NLS-1$ cbAllowPrinting = new JComboBox( getPrintingComboBoxModel() ); cxAllowScreenReaders = new JCheckBox( getResources().getString( "pdfsavedialog.allowScreenreader" ) ); //$NON-NLS-1$ cxAllowAssembly = new JCheckBox( getResources().getString( "pdfsavedialog.allowAssembly" ) ); //$NON-NLS-1$ cxAllowModifyContents = new JCheckBox( getResources().getString( "pdfsavedialog.allowModifyContents" ) ); //$NON-NLS-1$ cxAllowModifyAnnotations = new JCheckBox( getResources().getString( "pdfsavedialog.allowModifyAnnotations" ) ); //$NON-NLS-1$ cxAllowFillIn = new JCheckBox( getResources().getString( "pdfsavedialog.allowFillIn" ) ); //$NON-NLS-1$ txFilename = new JTextField(); txFilename.setColumns( 40 ); statusBar = new JStatusBar(); encodingModel = EncodingComboBoxModel.createDefaultModel( Locale.getDefault() ); encodingModel.sort(); cbEncoding = new JComboBox( encodingModel ); cxEmbedded = new JCheckBox( getResources().getString( "pdfsavedialog.embedfonts" ) ); getFormValidator().registerTextField( txFilename ); getFormValidator().registerTextField( txConfOwnerPassword ); getFormValidator().registerTextField( txConfUserPassword ); getFormValidator().registerTextField( txUserPassword ); getFormValidator().registerTextField( txOwnerPassword ); final JPanel exportPane = createExportPanel(); final Configuration config = ClassicEngineBoot.getInstance().getGlobalConfig(); final boolean advancedSettingsTabAvail = "true" .equals( config .getConfigProperty( "org.pentaho.reporting.engine.classic.core.modules.gui.pdf.AdvancedSettingsAvailable" ) ); final boolean metaDataSettingsTabAvail = "true" .equals( config .getConfigProperty( "org.pentaho.reporting.engine.classic.core.modules.gui.pdf.MetaDataSettingsAvailable" ) ); final JTabbedPane tabbedPane = new JTabbedPane(); tabbedPane.add( getResources().getString( "pdfsavedialog.export-settings" ), exportPane ); //$NON-NLS-1$ tabbedPane.add( getResources().getString( "pdfsavedialog.parameters" ), getParametersPanel() ); if ( metaDataSettingsTabAvail ) { tabbedPane.add( getResources().getString( "pdfsavedialog.metadata-settings" ), createMetaDataPanel() ); //$NON-NLS-1$ } if ( advancedSettingsTabAvail ) { tabbedPane.add( getResources().getString( "pdfsavedialog.advanced-settings" ), createAdvancedPanel() ); //$NON-NLS-1$ } setContentPane( createContentPane( tabbedPane ) ); } private JPanel createExportPanel() { final JButton btnSelect = new JButton( new ActionSelectFile( getResources() ) ); final JLabel lblFileName = new JLabel( getResources().getString( "pdfsavedialog.filename" ) ); //$NON-NLS-1$ final JPanel mainPanel = new JPanel(); mainPanel.setLayout( new GridBagLayout() ); mainPanel.setBorder( BorderFactory.createEmptyBorder( 3, 3, 3, 3 ) ); GridBagConstraints gbc = new GridBagConstraints(); gbc.gridx = 0; gbc.gridy = 0; gbc.anchor = GridBagConstraints.WEST; gbc.insets = new Insets( 3, 3, 1, 1 ); mainPanel.add( lblFileName, gbc ); gbc = new GridBagConstraints(); gbc.fill = GridBagConstraints.HORIZONTAL; gbc.weightx = 1; gbc.gridx = 1; gbc.gridy = 0; gbc.ipadx = 120; gbc.insets = new Insets( 3, 1, 1, 1 ); mainPanel.add( txFilename, gbc ); gbc = new GridBagConstraints(); gbc.anchor = GridBagConstraints.NORTHWEST; gbc.gridx = 2; gbc.gridy = 0; mainPanel.add( btnSelect, gbc ); final JPanel advancedPaneCarrier = new JPanel(); advancedPaneCarrier.setBorder( BorderFactory.createEmptyBorder( 4, 4, 4, 4 ) ); advancedPaneCarrier.setLayout( new BorderLayout() ); advancedPaneCarrier.add( mainPanel, BorderLayout.NORTH ); return advancedPaneCarrier; } public JStatusBar getStatusBar() { return statusBar; } protected boolean performConfirm() { final String filename = txFilename.getText(); final File f = new File( filename ); if ( f.exists() ) { final String key1 = "pdfsavedialog.targetOverwriteConfirmation"; //$NON-NLS-1$ final String key2 = "pdfsavedialog.targetOverwriteTitle"; //$NON-NLS-1$ if ( JOptionPane.showConfirmDialog( this, MessageFormat.format( getResources().getString( key1 ), new Object[] { txFilename.getText() } ), getResources().getString( key2 ), JOptionPane.YES_NO_OPTION, JOptionPane.QUESTION_MESSAGE ) == JOptionPane.NO_OPTION ) { return false; } } if ( getEncryptionValue().equals( PdfExportGUIModule.SECURITY_ENCRYPTION_128BIT ) || getEncryptionValue().equals( PdfExportGUIModule.SECURITY_ENCRYPTION_40BIT ) ) { if ( txOwnerPassword.getText().trim().length() == 0 ) { if ( JOptionPane.showConfirmDialog( this, getResources().getString( "pdfsavedialog.ownerpasswordEmpty" ), //$NON-NLS-1$ getResources().getString( "pdfsavedialog.warningTitle" ), //$NON-NLS-1$ JOptionPane.YES_NO_OPTION, JOptionPane.WARNING_MESSAGE ) == JOptionPane.NO_OPTION ) { return false; } } } return true; } protected boolean performValidate() { getStatusBar().clear(); final String filename = txFilename.getText(); if ( filename.trim().length() == 0 ) { getStatusBar().setStatus( StatusType.ERROR, getResources().getString( "pdfsavedialog.targetIsEmpty" ) ); //$NON-NLS-1$ return false; } final File f = new File( filename ); if ( f.exists() ) { if ( f.isFile() == false ) { getStatusBar().setStatus( StatusType.ERROR, getResources().getString( "pdfsavedialog.targetIsNoFile" ) ); //$NON-NLS-1$ return false; } if ( f.canWrite() == false ) { getStatusBar().setStatus( StatusType.ERROR, getResources().getString( "pdfsavedialog.targetIsNotWritable" ) ); //$NON-NLS-1$ return false; } final String message = MessageFormat.format( getResources().getString( "pdfsavedialog.targetOverwriteWarning" ), //$NON-NLS-1$ new Object[] { filename } ); getStatusBar().setStatus( StatusType.WARNING, message ); } if ( getEncryptionValue().equals( PdfExportGUIModule.SECURITY_ENCRYPTION_128BIT ) || getEncryptionValue().equals( PdfExportGUIModule.SECURITY_ENCRYPTION_40BIT ) ) { if ( txUserPassword.getText().equals( txConfUserPassword.getText() ) == false ) { getStatusBar().setStatus( StatusType.ERROR, getResources().getString( "pdfsavedialog.userpasswordNoMatch" ) ); //$NON-NLS-1$ return false; } if ( txOwnerPassword.getText().equals( txConfOwnerPassword.getText() ) == false ) { getStatusBar().setStatus( StatusType.ERROR, getResources().getString( "pdfsavedialog.ownerpasswordNoMatch" ) ); //$NON-NLS-1$ return false; } } return true; } protected void initializeFromJob( final MasterReport job, final GuiContext guiContext ) { statusBar.setIconTheme( guiContext.getIconTheme() ); encodingModel = EncodingComboBoxModel.createDefaultModel( Locale.getDefault() ); encodingModel.sort(); cbEncoding.setModel( encodingModel ); } protected String getConfigurationPrefix() { return "org.pentaho.reporting.engine.classic.core.modules.gui.pdf."; //$NON-NLS-1$ } /** * Returns a new (and not connected to the default config from the job) configuration containing all properties from * the dialog. * * @param full */ protected Configuration grabDialogContents( final boolean full ) { final DefaultConfiguration config = new DefaultConfiguration(); config.setConfigProperty( "org.pentaho.reporting.engine.classic.core.modules.output.pageable.pdf.Keywords", //$NON-NLS-1$ txKeywords.getText() ); config.setConfigProperty( "org.pentaho.reporting.engine.classic.core.modules.output.pageable.pdf.Description", //$NON-NLS-1$ txDescription.getText() ); config.setConfigProperty( "org.pentaho.reporting.engine.classic.core.modules.output.pageable.pdf.Author", //$NON-NLS-1$ txAuthor.getText() ); config.setConfigProperty( "org.pentaho.reporting.engine.classic.core.modules.output.pageable.pdf.Title", //$NON-NLS-1$ txTitle.getText() ); config.setConfigProperty( "org.pentaho.reporting.engine.classic.core.modules.gui.pdf.TargetFileName", //$NON-NLS-1$ txFilename.getText() ); config.setConfigProperty( "org.pentaho.reporting.engine.classic.core.modules.output.pageable.pdf.Encoding", //$NON-NLS-1$ encodingModel.getSelectedEncoding() ); config.getConfigProperty( "org.pentaho.reporting.engine.classic.core.modules.output.pageable.pdf.PrintLevel", //$NON-NLS-1$ getPrintLevel() ); config.getConfigProperty( "org.pentaho.reporting.engine.classic.core.modules.output.pageable.pdf.Encryption", //$NON-NLS-1$ getEncryptionValue() ); config.getConfigProperty( "org.pentaho.reporting.engine.classic.core.modules.output.pageable.pdf.UserPassword", //$NON-NLS-1$ txUserPassword.getText() ); config.getConfigProperty( "org.pentaho.reporting.engine.classic.core.modules.output.pageable.pdf.OwnerPassword", //$NON-NLS-1$ txOwnerPassword.getText() ); config.setConfigProperty( "org.pentaho.reporting.engine.classic.core.modules.output.pageable.pdf.AllowAssembly", //$NON-NLS-1$ String.valueOf( cxAllowAssembly.isSelected() ) ); config.setConfigProperty( "org.pentaho.reporting.engine.classic.core.modules.output.pageable.pdf.AllowCopy", //$NON-NLS-1$ String.valueOf( cxAllowCopy.isSelected() ) ); config.setConfigProperty( "org.pentaho.reporting.engine.classic.core.modules.output.pageable.pdf.AllowFillIn", //$NON-NLS-1$ String.valueOf( cxAllowFillIn.isSelected() ) ); config.setConfigProperty( "org.pentaho.reporting.engine.classic.core.modules.output.pageable.pdf.AllowModifyAnnotations", //$NON-NLS-1$ String.valueOf( cxAllowModifyAnnotations.isSelected() ) ); config.setConfigProperty( "org.pentaho.reporting.engine.classic.core.modules.output.pageable.pdf.AllowModifyContents", //$NON-NLS-1$ String.valueOf( cxAllowModifyContents.isSelected() ) ); config.setConfigProperty( "org.pentaho.reporting.engine.classic.core.modules.output.pageable.pdf.AllowScreenReaders", //$NON-NLS-1$ String.valueOf( cxAllowScreenReaders.isSelected() ) ); config.setConfigProperty( "org.pentaho.reporting.engine.classic.core.modules.output.pageable.pdf.EmbedFonts", //$NON-NLS-1$ String.valueOf( cxEmbedded.isSelected() ) ); return config; } protected void setDialogContents( final Configuration config ) { txFilename.setText( config .getConfigProperty( "org.pentaho.reporting.engine.classic.core.modules.gui.pdf.TargetFileName" ) ); //$NON-NLS-1$ final String encoding = config.getConfigProperty( "org.pentaho.reporting.engine.classic.core.modules.output.pageable.pdf.Encoding" ); //$NON-NLS-1$ if ( encoding != null && encoding.length() > 0 ) { encodingModel.setSelectedEncoding( encoding ); } setPrintLevel( config .getConfigProperty( "org.pentaho.reporting.engine.classic.core.modules.output.pageable.pdf.security.PrintLevel" ) ); //$NON-NLS-1$ setEncryptionValue( config .getConfigProperty( "org.pentaho.reporting.engine.classic.core.modules.output.pageable.pdf.security.Encryption" ) ); //$NON-NLS-1$ txUserPassword.setText( config .getConfigProperty( "org.pentaho.reporting.engine.classic.core.modules.output.pageable.pdf.UserPassword" ) ); //$NON-NLS-1$ txOwnerPassword.setText( config .getConfigProperty( "org.pentaho.reporting.engine.classic.core.modules.output.pageable.pdf.OwnerPassword" ) ); //$NON-NLS-1$ txConfUserPassword.setText( config .getConfigProperty( "org.pentaho.reporting.engine.classic.core.modules.output.pageable.pdf.UserPassword" ) ); //$NON-NLS-1$ txConfOwnerPassword.setText( config .getConfigProperty( "org.pentaho.reporting.engine.classic.core.modules.output.pageable.pdf.OwnerPassword" ) ); //$NON-NLS-1$ cxAllowAssembly .setSelected( "true".equals( //$NON-NLS-1$ config .getConfigProperty( "org.pentaho.reporting.engine.classic.core.modules.output.pageable.pdf.AllowAssembly" ) ) ); //$NON-NLS-1$ cxAllowCopy .setSelected( "true".equals( //$NON-NLS-1$ config .getConfigProperty( "org.pentaho.reporting.engine.classic.core.modules.output.pageable.pdf.AllowCopy" ) ) ); //$NON-NLS-1$ cxAllowFillIn .setSelected( "true".equals( //$NON-NLS-1$ config .getConfigProperty( "org.pentaho.reporting.engine.classic.core.modules.output.pageable.pdf.AllowFillIn" ) ) ); //$NON-NLS-1$ cxAllowModifyAnnotations .setSelected( "true".equals( //$NON-NLS-1$ config .getConfigProperty( "org.pentaho.reporting.engine.classic.core.modules.output.pageable.pdf.AllowModifyAnnotations" ) ) ); //$NON-NLS-1$ cxAllowModifyContents .setSelected( "true".equals( //$NON-NLS-1$ config .getConfigProperty( "org.pentaho.reporting.engine.classic.core.modules.output.pageable.pdf.AllowModifyContents" ) ) ); //$NON-NLS-1$ cxAllowScreenReaders .setSelected( "true".equals( //$NON-NLS-1$ config .getConfigProperty( "org.pentaho.reporting.engine.classic.core.modules.output.pageable.pdf.AllowScreenReaders" ) ) ); //$NON-NLS-1$ cxEmbedded .setSelected( "true".equals( //$NON-NLS-1$ config .getConfigProperty( "org.pentaho.reporting.engine.classic.core.modules.output.pageable.pdf.EmbedFonts" ) ) ); //$NON-NLS-1$ txTitle.setText( config.getConfigProperty( "org.pentaho.reporting.engine.classic.core.modules.output.pageable.pdf.Title", //$NON-NLS-1$ config.getConfigProperty( "org.pentaho.reporting.engine.classic.core.metadata.Title" ) ) ); //$NON-NLS-1$ txAuthor.setText( config.getConfigProperty( "org.pentaho.reporting.engine.classic.core.modules.output.pageable.pdf.Author", //$NON-NLS-1$ config.getConfigProperty( "org.pentaho.reporting.engine.classic.core.metadata.Author" ) ) ); //$NON-NLS-1$ txKeywords.setText( config.getConfigProperty( "org.pentaho.reporting.engine.classic.core.modules.output.pageable.pdf.Keywords", //$NON-NLS-1$ config.getConfigProperty( "org.pentaho.reporting.engine.classic.core.metadata.Keywords" ) ) ); //$NON-NLS-1$ txDescription.setText( config.getConfigProperty( "org.pentaho.reporting.engine.classic.core.modules.output.pageable.pdf.Description", //$NON-NLS-1$ config.getConfigProperty( "org.pentaho.reporting.engine.classic.core.metadata.Description" ) ) ); //$NON-NLS-1$ } protected String getConfigurationSuffix() { return "_pdf_export"; //$NON-NLS-1$ } public void clear() { txConfOwnerPassword.setText( "" ); //$NON-NLS-1$ txConfUserPassword.setText( "" ); //$NON-NLS-1$ txFilename.setText( "" ); //$NON-NLS-1$ txOwnerPassword.setText( "" ); //$NON-NLS-1$ txUserPassword.setText( "" ); //$NON-NLS-1$ cxAllowAssembly.setSelected( false ); cxAllowCopy.setSelected( false ); cbAllowPrinting.setSelectedIndex( PdfExportDialog.CBMODEL_NOPRINTING ); cxAllowFillIn.setSelected( false ); cxAllowModifyAnnotations.setSelected( false ); cxAllowModifyContents.setSelected( false ); cxAllowScreenReaders.setSelected( false ); cxEmbedded.setSelected( false ); rbSecurityNone.setSelected( true ); updateSecurityPanelEnabled(); final String plattformDefaultEncoding = EncodingRegistry.getPlatformDefaultEncoding(); encodingModel.setSelectedEncoding( plattformDefaultEncoding ); txAuthor.setText( ClassicEngineBoot.getInstance().getGlobalConfig().getConfigProperty( "user.name", "" ) ); //$NON-NLS-1$ //$NON-NLS-2$ txFilename.setText( "" ); //$NON-NLS-1$ txTitle.setText( "" ); //$NON-NLS-1$ txDescription.setText( "" ); //$NON-NLS-1$ txKeywords.setText( "" ); //$NON-NLS-1$ } protected String getResourceBaseName() { return PdfExportPlugin.BASE_RESOURCE_CLASS; } /** * Updates the security panel state. If no encryption is selected, all security setting components will be disabled. */ protected void updateSecurityPanelEnabled() { final boolean b = ( rbSecurityNone.isSelected() == false ); txUserPassword.setEnabled( b ); txOwnerPassword.setEnabled( b ); txConfOwnerPassword.setEnabled( b ); txConfUserPassword.setEnabled( b ); cxAllowAssembly.setEnabled( b ); cxAllowCopy.setEnabled( b ); cbAllowPrinting.setEnabled( b ); cxAllowFillIn.setEnabled( b ); cxAllowModifyAnnotations.setEnabled( b ); cxAllowModifyContents.setEnabled( b ); cxAllowScreenReaders.setEnabled( b ); } /** * Creates a panel for the security settings. * * @return The panel. */ private JPanel createAdvancedPanel() { final JLabel lblEncoding = new JLabel( getResources().getString( "pdfsavedialog.encoding" ) ); //$NON-NLS-1$ final JPanel encodingPanel = new JPanel(); encodingPanel.setBorder( BorderFactory.createTitledBorder( getResources() .getString( "pdfsavedialog.export-options" ) ) ); encodingPanel.setLayout( new GridBagLayout() ); GridBagConstraints gbc = new GridBagConstraints(); gbc.anchor = GridBagConstraints.WEST; gbc.gridx = 0; gbc.gridy = 0; gbc.insets = new Insets( 1, 1, 1, 1 ); encodingPanel.add( lblEncoding, gbc ); gbc = new GridBagConstraints(); gbc.fill = GridBagConstraints.HORIZONTAL; gbc.weightx = 1; gbc.gridx = 1; gbc.gridy = 0; gbc.ipadx = 80; gbc.insets = new Insets( 1, 1, 1, 1 ); encodingPanel.add( cbEncoding, gbc ); gbc = new GridBagConstraints(); gbc.fill = GridBagConstraints.HORIZONTAL; gbc.weightx = 1; gbc.gridx = 1; gbc.gridy = 1; gbc.ipadx = 80; gbc.insets = new Insets( 1, 1, 1, 1 ); encodingPanel.add( cxEmbedded, gbc ); final JPanel securityPanel = new JPanel(); securityPanel.setLayout( new GridBagLayout() ); securityPanel.setBorder( BorderFactory.createTitledBorder( getResources().getString( "pdfsavedialog.security" ) ) ); final JLabel lblUserPass = new JLabel( getResources().getString( "pdfsavedialog.userpassword" ) ); //$NON-NLS-1$ final JLabel lblUserPassConfirm = new JLabel( getResources().getString( "pdfsavedialog.userpasswordconfirm" ) ); //$NON-NLS-1$ final JLabel lblOwnerPass = new JLabel( getResources().getString( "pdfsavedialog.ownerpassword" ) ); //$NON-NLS-1$ final JLabel lblOwnerPassConfirm = new JLabel( getResources().getString( "pdfsavedialog.ownerpasswordconfirm" ) ); //$NON-NLS-1$ final JLabel lbAllowPrinting = new JLabel( getResources().getString( "pdfsavedialog.allowPrinting" ) ); //$NON-NLS-1$ gbc = new GridBagConstraints(); gbc.fill = GridBagConstraints.HORIZONTAL; gbc.weightx = 1; gbc.gridx = 0; gbc.gridwidth = 4; gbc.gridy = 1; gbc.insets = new Insets( 5, 5, 5, 5 ); securityPanel.add( createSecurityConfigPanel(), gbc ); gbc = new GridBagConstraints(); gbc.anchor = GridBagConstraints.WEST; gbc.gridx = 0; gbc.gridy = 2; gbc.insets = new Insets( 5, 5, 5, 5 ); securityPanel.add( lblUserPass, gbc ); gbc = new GridBagConstraints(); gbc.fill = GridBagConstraints.HORIZONTAL; gbc.weightx = 1; gbc.gridx = 1; gbc.gridy = 2; gbc.ipadx = 120; gbc.insets = new Insets( 5, 5, 5, 5 ); securityPanel.add( txUserPassword, gbc ); gbc = new GridBagConstraints(); gbc.anchor = GridBagConstraints.WEST; gbc.gridx = 0; gbc.gridy = 3; gbc.insets = new Insets( 5, 5, 5, 5 ); securityPanel.add( lblOwnerPass, gbc ); gbc = new GridBagConstraints(); gbc.fill = GridBagConstraints.HORIZONTAL; gbc.weightx = 1; gbc.gridx = 1; gbc.gridy = 3; gbc.ipadx = 80; gbc.insets = new Insets( 5, 5, 5, 5 ); securityPanel.add( txOwnerPassword, gbc ); gbc = new GridBagConstraints(); gbc.anchor = GridBagConstraints.WEST; gbc.gridx = 2; gbc.gridy = 2; gbc.insets = new Insets( 5, 5, 5, 5 ); securityPanel.add( lblUserPassConfirm, gbc ); gbc = new GridBagConstraints(); gbc.fill = GridBagConstraints.HORIZONTAL; gbc.weightx = 1; gbc.gridx = 3; gbc.gridy = 2; gbc.ipadx = 80; gbc.insets = new Insets( 5, 5, 5, 5 ); securityPanel.add( txConfUserPassword, gbc ); gbc = new GridBagConstraints(); gbc.anchor = GridBagConstraints.WEST; gbc.gridx = 2; gbc.gridy = 3; gbc.insets = new Insets( 5, 5, 5, 5 ); securityPanel.add( lblOwnerPassConfirm, gbc ); gbc = new GridBagConstraints(); gbc.fill = GridBagConstraints.HORIZONTAL; gbc.weightx = 1; gbc.gridx = 3; gbc.gridy = 3; gbc.ipadx = 80; gbc.insets = new Insets( 5, 5, 5, 5 ); securityPanel.add( txConfOwnerPassword, gbc ); gbc = new GridBagConstraints(); gbc.gridx = 0; gbc.gridwidth = 2; gbc.gridy = 4; gbc.anchor = GridBagConstraints.WEST; securityPanel.add( cxAllowCopy, gbc ); gbc = new GridBagConstraints(); gbc.gridx = 0; gbc.gridwidth = 2; gbc.gridy = 5; gbc.anchor = GridBagConstraints.WEST; securityPanel.add( cxAllowScreenReaders, gbc ); gbc = new GridBagConstraints(); gbc.gridx = 0; gbc.gridwidth = 2; gbc.gridy = 6; gbc.anchor = GridBagConstraints.WEST; securityPanel.add( cxAllowFillIn, gbc ); gbc = new GridBagConstraints(); gbc.gridx = 2; gbc.gridwidth = 2; gbc.gridy = 4; gbc.anchor = GridBagConstraints.WEST; securityPanel.add( cxAllowAssembly, gbc ); gbc = new GridBagConstraints(); gbc.gridx = 2; gbc.gridwidth = 2; gbc.gridy = 5; gbc.anchor = GridBagConstraints.WEST; securityPanel.add( cxAllowModifyContents, gbc ); gbc = new GridBagConstraints(); gbc.gridx = 2; gbc.gridwidth = 2; gbc.gridy = 6; gbc.anchor = GridBagConstraints.WEST; securityPanel.add( cxAllowModifyAnnotations, gbc ); gbc = new GridBagConstraints(); gbc.gridx = 0; gbc.gridwidth = 1; gbc.gridy = 7; gbc.anchor = GridBagConstraints.WEST; securityPanel.add( lbAllowPrinting, gbc ); gbc = new GridBagConstraints(); gbc.gridx = 1; gbc.gridwidth = 3; gbc.gridy = 7; gbc.anchor = GridBagConstraints.WEST; securityPanel.add( cbAllowPrinting, gbc ); final JPanel advancedCarrier2 = new JPanel(); advancedCarrier2.setLayout( new GridBagLayout() ); gbc = new GridBagConstraints(); gbc.gridx = 0; gbc.fill = GridBagConstraints.HORIZONTAL; gbc.gridwidth = 1; gbc.gridy = 0; gbc.anchor = GridBagConstraints.WEST; gbc.insets = new Insets( 1, 1, 5, 1 ); advancedCarrier2.add( encodingPanel, gbc ); gbc = new GridBagConstraints(); gbc.gridx = 0; gbc.fill = GridBagConstraints.HORIZONTAL; gbc.gridwidth = 1; gbc.gridy = 1; gbc.anchor = GridBagConstraints.WEST; gbc.insets = new Insets( 1, 1, 1, 1 ); advancedCarrier2.add( securityPanel, gbc ); final JPanel advancedPaneCarrier = new JPanel(); advancedPaneCarrier.setBorder( BorderFactory.createEmptyBorder( 4, 4, 4, 4 ) ); advancedPaneCarrier.setLayout( new BorderLayout() ); advancedPaneCarrier.add( advancedCarrier2, BorderLayout.NORTH ); return advancedPaneCarrier; } /** * Creates the security config panel. This panel is used to select the level of the PDF security. * * @return the created security config panel. */ private JPanel createSecurityConfigPanel() { final JPanel pnlSecurityConfig = new JPanel(); pnlSecurityConfig.setLayout( new GridLayout() ); pnlSecurityConfig.add( rbSecurityNone ); pnlSecurityConfig.add( rbSecurity40Bit ); pnlSecurityConfig.add( rbSecurity128Bit ); final ButtonGroup btGrpSecurity = new ButtonGroup(); btGrpSecurity.add( rbSecurity128Bit ); btGrpSecurity.add( rbSecurity40Bit ); btGrpSecurity.add( rbSecurityNone ); return pnlSecurityConfig; } /** * Gets and initializes the the combobox model for the security setting "allowPrinting". * * @return the combobox model containing the different values for the allowPrinting option. */ private DefaultComboBoxModel getPrintingComboBoxModel() { if ( printingModel == null ) { final Object[] data = { getResources().getString( "pdfsavedialog.option.noprinting" ), //$NON-NLS-1$ getResources().getString( "pdfsavedialog.option.degradedprinting" ), //$NON-NLS-1$ getResources().getString( "pdfsavedialog.option.fullprinting" ) }; //$NON-NLS-1$ printingModel = new DefaultComboBoxModel( data ); } return printingModel; } /** * selects a file to use as target for the report processing. */ protected void performSelectFile() { // lazy initialize ... the file chooser is one of the hot spots here ... if ( fileChooser == null ) { fileChooser = new JFileChooser(); final FilesystemFilter filter = new FilesystemFilter( PdfExportDialog.PDF_FILE_EXTENSION, getResources().getString( "file.save.pdfdescription" ) ); //$NON-NLS-1$ fileChooser.addChoosableFileFilter( filter ); fileChooser.setMultiSelectionEnabled( false ); } final File file = new File( txFilename.getText() ); fileChooser.setCurrentDirectory( file ); fileChooser.setSelectedFile( file ); final int option = fileChooser.showSaveDialog( this ); if ( option == JFileChooser.APPROVE_OPTION ) { final File selFile = fileChooser.getSelectedFile(); String selFileName = selFile.getAbsolutePath(); // Test if ends of pdf if ( selFileName.toLowerCase().endsWith( PdfExportDialog.PDF_FILE_EXTENSION ) == false ) { selFileName = selFileName + PdfExportDialog.PDF_FILE_EXTENSION; } txFilename.setText( selFileName ); } } /** * Defines whether the user is allowed to print the file. If this right is granted, the user is also able to print a * degraded version of the file, regardless of the <code>allowDegradedPrinting</code< property. If you disabled * printing but enabled degraded printing, then the user is able to print a low-quality version of the document. */ public void setPrintLevel( final String printLevel ) { if ( "full".equals( printLevel ) ) { //$NON-NLS-1$ this.cbAllowPrinting.setSelectedIndex( PdfExportDialog.CBMODEL_FULL ); } else if ( "degraded".equals( printLevel ) ) { //$NON-NLS-1$ this.cbAllowPrinting.setSelectedIndex( PdfExportDialog.CBMODEL_DEGRADED ); } else { this.cbAllowPrinting.setSelectedIndex( PdfExportDialog.CBMODEL_NOPRINTING ); } } public String getPrintLevel() { if ( cbAllowPrinting.getSelectedIndex() == PdfExportDialog.CBMODEL_FULL ) { return "full"; //$NON-NLS-1$ } if ( cbAllowPrinting.getSelectedIndex() == PdfExportDialog.CBMODEL_DEGRADED ) { return "degraded"; //$NON-NLS-1$ } return "none"; //$NON-NLS-1$ } /** * Queries the currently selected encryption. If an encryption is selected this method returns either Boolean.TRUE or * Boolean.FALSE, when no encryption is set, <code>null</code> is returned. If no encryption is set, the security * properties have no defined state. * * @return the selection state for the encryption. If no encryption is set, this method returns null, if 40-bit * encryption is set, the method returns Boolean.FALSE and on 128-Bit-encryption, Boolean.TRUE is returned. */ public String getEncryptionValue() { if ( rbSecurity40Bit.isSelected() ) { return PdfExportGUIModule.SECURITY_ENCRYPTION_40BIT; } if ( rbSecurity128Bit.isSelected() ) { return PdfExportGUIModule.SECURITY_ENCRYPTION_128BIT; } return PdfExportGUIModule.SECURITY_ENCRYPTION_NONE; } /** * Defines the currently selected encryption. * * @param b * the new encryption state, one of null, Boolean.TRUE or Boolean.FALSE */ public void setEncryptionValue( final String b ) { if ( b != null ) { if ( b.equals( PdfExportGUIModule.SECURITY_ENCRYPTION_128BIT ) ) { rbSecurity128Bit.setSelected( true ); updateSecurityPanelEnabled(); return; } else if ( b.equals( PdfExportGUIModule.SECURITY_ENCRYPTION_40BIT ) ) { rbSecurity40Bit.setSelected( true ); updateSecurityPanelEnabled(); return; } else if ( b.equals( PdfExportGUIModule.SECURITY_ENCRYPTION_NONE ) == false ) { PdfExportDialog.logger.warn( "Invalid encryption value entered. " + b ); //$NON-NLS-1$ } } rbSecurityNone.setSelected( true ); updateSecurityPanelEnabled(); } }