/*
 * iReport - Visual Designer for JasperReports.
 * Copyright (C) 2002 - 2009 Jaspersoft Corporation. All rights reserved.
 * http://www.jaspersoft.com
 *
 * Unless you have purchased a commercial license agreement from Jaspersoft,
 * the following license terms apply:
 *
 * This program is part of iReport.
 *
 * iReport is free software: you can redistribute it and/or modify
 * it under the terms of the GNU Affero General Public License as published by
 * the Free Software Foundation, either version 3 of the License, or
 * (at your option) any later version.
 *
 * iReport 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 Affero General Public License for more details.
 *
 * You should have received a copy of the GNU Affero General Public License
 * along with iReport. If not, see <http://www.gnu.org/licenses/>.
 */
package com.jaspersoft.ireport.designer.options.export;

import com.jaspersoft.ireport.designer.IReportManager;
import com.jaspersoft.ireport.locale.I18n;
import java.util.prefs.Preferences;
import javax.swing.SpinnerNumberModel;
import javax.swing.event.ChangeEvent;
import javax.swing.event.ChangeListener;
import net.sf.jasperreports.engine.JRExporterParameter;
import net.sf.jasperreports.engine.util.JRProperties;

/**
 *
 * @author gtoffoli
 */
public class CommonExportParametersPanel extends AbstractExportParametersPanel {

    /** Creates new form CommonExportParametersPanel */
    public CommonExportParametersPanel() {
        initComponents();
        SpinnerNumberModel snmX = new SpinnerNumberModel(0,0,Integer.MAX_VALUE,1);
        SpinnerNumberModel snmY = new SpinnerNumberModel(0,0,Integer.MAX_VALUE,1);
        jSpinnerOffsetX.setModel(snmX);
        jSpinnerOffsetY.setModel(snmY);

        snmX.addChangeListener(new ChangeListener() {

            public void stateChanged(ChangeEvent e) {
                notifyChange();
            }
        });

        snmY.addChangeListener(new ChangeListener() {

            public void stateChanged(ChangeEvent e) {
                notifyChange();
            }
        });

        javax.swing.event.DocumentListener textfieldListener =  new javax.swing.event.DocumentListener()
                {
                    public void changedUpdate(javax.swing.event.DocumentEvent evt)
                    {
                        notifyChange();
                    }
                    public void insertUpdate(javax.swing.event.DocumentEvent evt)
                    {
                        notifyChange();
                    }
                    public void removeUpdate(javax.swing.event.DocumentEvent evt)
                    {
                        notifyChange();
                    }
                };

         jTextFieldCharacterEncoding.getDocument().addDocumentListener(textfieldListener);
         jTextFieldPageIndex.getDocument().addDocumentListener(textfieldListener);
         jTextFieldPageRangeFrom.getDocument().addDocumentListener(textfieldListener);
         jTextFieldPageRangeTo.getDocument().addDocumentListener(textfieldListener);


         applyI18n();
    }

    public void applyI18n()
    {
        jRadioButtonExportAll.setText(I18n.getString("CommonExportParametersPanel.jRadioButtonExportAll.text")); // NOI18N
        jRadioButtonExportPageIndex.setText(I18n.getString("CommonExportParametersPanel.jRadioButtonExportPageIndex.text")); // NOI18N
        jRadioButtonExportRange.setText(I18n.getString("CommonExportParametersPanel.jRadioButtonExportRange.text")); // NOI18N
        jLabelPageRangeTo.setText(I18n.getString("CommonExportParametersPanel.jLabelPageRangeTo.text")); // NOI18N
        jLabelCharacterEncoding.setText(I18n.getString("CommonExportParametersPanel.jLabelCharacterEncoding.text")); // NOI18N
        jLabelOffsetX.setText(I18n.getString("CommonExportParametersPanel.jLabelOffsetX.text")); // NOI18N
        jLabelOffsetY.setText(I18n.getString("CommonExportParametersPanel.jLabelOffsetY.text")); // NOI18N
        jCheckBoxIgnorePageMargins.setText(I18n.getString("CommonExportParametersPanel.jCheckBoxIgnorePageMargins.text")); // NOI18N
        jLabelTitle.setText(I18n.getString("CommonExportParametersPanel.jLabelTitle.text")); // NOI18N
        jPanel1.setBorder(javax.swing.BorderFactory.createTitledBorder(I18n.getString("CommonExportParametersPanel.jPanel1.border.title"))); // NOI18N
    }

    /** This method is called from within the constructor to
     * initialize the form.
     * WARNING: Do NOT modify this code. The content of this method is
     * always regenerated by the Form Editor.
     */
    @SuppressWarnings("unchecked")
    // <editor-fold defaultstate="collapsed" desc="Generated Code">//GEN-BEGIN:initComponents
    private void initComponents() {

        buttonGroup1 = new javax.swing.ButtonGroup();
        jLabelTitle = new javax.swing.JLabel();
        jSeparator1 = new javax.swing.JSeparator();
        jPanel1 = new javax.swing.JPanel();
        jRadioButtonExportAll = new javax.swing.JRadioButton();
        jRadioButtonExportPageIndex = new javax.swing.JRadioButton();
        jRadioButtonExportRange = new javax.swing.JRadioButton();
        jTextFieldPageIndex = new javax.swing.JTextField();
        jTextFieldPageRangeFrom = new javax.swing.JTextField();
        jLabelPageRangeTo = new javax.swing.JLabel();
        jTextFieldPageRangeTo = new javax.swing.JTextField();
        jLabelError = new javax.swing.JLabel();
        jLabelCharacterEncoding = new javax.swing.JLabel();
        jTextFieldCharacterEncoding = new javax.swing.JTextField();
        jLabelOffsetX = new javax.swing.JLabel();
        jSpinnerOffsetX = new javax.swing.JSpinner();
        jLabelOffsetY = new javax.swing.JLabel();
        jSpinnerOffsetY = new javax.swing.JSpinner();
        jCheckBoxIgnorePageMargins = new javax.swing.JCheckBox();

        jLabelTitle.setFont(new java.awt.Font("Tahoma", 1, 12)); // NOI18N
        jLabelTitle.setText("Common Export parameters");

        jPanel1.setBorder(javax.swing.BorderFactory.createTitledBorder("Pages to export"));

        buttonGroup1.add(jRadioButtonExportAll);
        jRadioButtonExportAll.setSelected(true);
        jRadioButtonExportAll.setText("Export all pages");
        jRadioButtonExportAll.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                jRadioButtonExportAllActionPerformed(evt);
            }
        });

        buttonGroup1.add(jRadioButtonExportPageIndex);
        jRadioButtonExportPageIndex.setText("Export page:");
        jRadioButtonExportPageIndex.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                jRadioButtonExportPageIndexActionPerformed(evt);
            }
        });

        buttonGroup1.add(jRadioButtonExportRange);
        jRadioButtonExportRange.setText("Export pages from:");
        jRadioButtonExportRange.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                jRadioButtonExportRangeActionPerformed(evt);
            }
        });

        jLabelPageRangeTo.setText("to");

        jLabelError.setForeground(new java.awt.Color(204, 0, 0));

        org.jdesktop.layout.GroupLayout jPanel1Layout = new org.jdesktop.layout.GroupLayout(jPanel1);
        jPanel1.setLayout(jPanel1Layout);
        jPanel1Layout.setHorizontalGroup(
            jPanel1Layout.createParallelGroup(org.jdesktop.layout.GroupLayout.LEADING)
            .add(jPanel1Layout.createSequentialGroup()
                .add(jPanel1Layout.createParallelGroup(org.jdesktop.layout.GroupLayout.LEADING)
                    .add(jRadioButtonExportAll)
                    .add(jPanel1Layout.createSequentialGroup()
                        .add(jRadioButtonExportPageIndex)
                        .addPreferredGap(org.jdesktop.layout.LayoutStyle.RELATED)
                        .add(jTextFieldPageIndex, org.jdesktop.layout.GroupLayout.PREFERRED_SIZE, 33, org.jdesktop.layout.GroupLayout.PREFERRED_SIZE))
                    .add(jPanel1Layout.createSequentialGroup()
                        .add(jRadioButtonExportRange)
                        .addPreferredGap(org.jdesktop.layout.LayoutStyle.RELATED)
                        .add(jTextFieldPageRangeFrom, org.jdesktop.layout.GroupLayout.PREFERRED_SIZE, 34, org.jdesktop.layout.GroupLayout.PREFERRED_SIZE)
                        .add(10, 10, 10)
                        .add(jLabelPageRangeTo)
                        .addPreferredGap(org.jdesktop.layout.LayoutStyle.RELATED)
                        .add(jTextFieldPageRangeTo, org.jdesktop.layout.GroupLayout.PREFERRED_SIZE, 34, org.jdesktop.layout.GroupLayout.PREFERRED_SIZE)))
                .addContainerGap(325, Short.MAX_VALUE))
            .add(jLabelError, org.jdesktop.layout.GroupLayout.DEFAULT_SIZE, 538, Short.MAX_VALUE)
        );
        jPanel1Layout.setVerticalGroup(
            jPanel1Layout.createParallelGroup(org.jdesktop.layout.GroupLayout.LEADING)
            .add(jPanel1Layout.createSequentialGroup()
                .add(jRadioButtonExportAll)
                .addPreferredGap(org.jdesktop.layout.LayoutStyle.RELATED)
                .add(jPanel1Layout.createParallelGroup(org.jdesktop.layout.GroupLayout.BASELINE)
                    .add(jRadioButtonExportPageIndex)
                    .add(jTextFieldPageIndex, org.jdesktop.layout.GroupLayout.PREFERRED_SIZE, org.jdesktop.layout.GroupLayout.DEFAULT_SIZE, org.jdesktop.layout.GroupLayout.PREFERRED_SIZE))
                .addPreferredGap(org.jdesktop.layout.LayoutStyle.RELATED)
                .add(jPanel1Layout.createParallelGroup(org.jdesktop.layout.GroupLayout.BASELINE)
                    .add(jRadioButtonExportRange)
                    .add(jTextFieldPageRangeFrom, org.jdesktop.layout.GroupLayout.PREFERRED_SIZE, org.jdesktop.layout.GroupLayout.DEFAULT_SIZE, org.jdesktop.layout.GroupLayout.PREFERRED_SIZE)
                    .add(jLabelPageRangeTo)
                    .add(jTextFieldPageRangeTo, org.jdesktop.layout.GroupLayout.PREFERRED_SIZE, org.jdesktop.layout.GroupLayout.DEFAULT_SIZE, org.jdesktop.layout.GroupLayout.PREFERRED_SIZE))
                .addPreferredGap(org.jdesktop.layout.LayoutStyle.RELATED)
                .add(jLabelError)
                .addContainerGap(org.jdesktop.layout.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE))
        );

        jLabelCharacterEncoding.setText("Character encoding");

        jLabelOffsetX.setText("Offset X");

        jLabelOffsetY.setText("Offset Y");

        jCheckBoxIgnorePageMargins.setText("Ignore page margins");
        jCheckBoxIgnorePageMargins.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                jCheckBoxIgnorePageMarginsActionPerformed(evt);
            }
        });

        org.jdesktop.layout.GroupLayout layout = new org.jdesktop.layout.GroupLayout(this);
        this.setLayout(layout);
        layout.setHorizontalGroup(
            layout.createParallelGroup(org.jdesktop.layout.GroupLayout.LEADING)
            .add(layout.createSequentialGroup()
                .add(jLabelTitle)
                .addContainerGap(392, Short.MAX_VALUE))
            .add(org.jdesktop.layout.GroupLayout.TRAILING, jSeparator1, org.jdesktop.layout.GroupLayout.DEFAULT_SIZE, 564, Short.MAX_VALUE)
            .add(layout.createSequentialGroup()
                .addContainerGap()
                .add(layout.createParallelGroup(org.jdesktop.layout.GroupLayout.LEADING)
                    .add(layout.createSequentialGroup()
                        .add(jLabelCharacterEncoding)
                        .addPreferredGap(org.jdesktop.layout.LayoutStyle.RELATED)
                        .add(jTextFieldCharacterEncoding, org.jdesktop.layout.GroupLayout.PREFERRED_SIZE, 141, org.jdesktop.layout.GroupLayout.PREFERRED_SIZE))
                    .add(layout.createSequentialGroup()
                        .add(layout.createParallelGroup(org.jdesktop.layout.GroupLayout.LEADING)
                            .add(jLabelOffsetX)
                            .add(jLabelOffsetY, org.jdesktop.layout.GroupLayout.PREFERRED_SIZE, 44, org.jdesktop.layout.GroupLayout.PREFERRED_SIZE))
                        .addPreferredGap(org.jdesktop.layout.LayoutStyle.RELATED)
                        .add(layout.createParallelGroup(org.jdesktop.layout.GroupLayout.LEADING, false)
                            .add(jSpinnerOffsetY)
                            .add(jSpinnerOffsetX, org.jdesktop.layout.GroupLayout.DEFAULT_SIZE, 64, Short.MAX_VALUE))))
                .add(315, 315, 315))
            .add(layout.createSequentialGroup()
                .addContainerGap()
                .add(jCheckBoxIgnorePageMargins)
                .addContainerGap(433, Short.MAX_VALUE))
            .add(layout.createSequentialGroup()
                .add(jPanel1, org.jdesktop.layout.GroupLayout.DEFAULT_SIZE, org.jdesktop.layout.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)
                .addContainerGap())
        );
        layout.setVerticalGroup(
            layout.createParallelGroup(org.jdesktop.layout.GroupLayout.LEADING)
            .add(layout.createSequentialGroup()
                .add(jLabelTitle)
                .addPreferredGap(org.jdesktop.layout.LayoutStyle.RELATED)
                .add(jSeparator1, org.jdesktop.layout.GroupLayout.PREFERRED_SIZE, 10, org.jdesktop.layout.GroupLayout.PREFERRED_SIZE)
                .addPreferredGap(org.jdesktop.layout.LayoutStyle.RELATED)
                .add(jPanel1, org.jdesktop.layout.GroupLayout.PREFERRED_SIZE, 120, org.jdesktop.layout.GroupLayout.PREFERRED_SIZE)
                .add(18, 18, 18)
                .add(layout.createParallelGroup(org.jdesktop.layout.GroupLayout.BASELINE)
                    .add(jLabelCharacterEncoding)
                    .add(jTextFieldCharacterEncoding, org.jdesktop.layout.GroupLayout.PREFERRED_SIZE, org.jdesktop.layout.GroupLayout.DEFAULT_SIZE, org.jdesktop.layout.GroupLayout.PREFERRED_SIZE))
                .addPreferredGap(org.jdesktop.layout.LayoutStyle.RELATED)
                .add(layout.createParallelGroup(org.jdesktop.layout.GroupLayout.BASELINE)
                    .add(jLabelOffsetX)
                    .add(jSpinnerOffsetX, org.jdesktop.layout.GroupLayout.PREFERRED_SIZE, org.jdesktop.layout.GroupLayout.DEFAULT_SIZE, org.jdesktop.layout.GroupLayout.PREFERRED_SIZE))
                .addPreferredGap(org.jdesktop.layout.LayoutStyle.RELATED)
                .add(layout.createParallelGroup(org.jdesktop.layout.GroupLayout.BASELINE)
                    .add(jLabelOffsetY)
                    .add(jSpinnerOffsetY, org.jdesktop.layout.GroupLayout.PREFERRED_SIZE, 20, org.jdesktop.layout.GroupLayout.PREFERRED_SIZE))
                .addPreferredGap(org.jdesktop.layout.LayoutStyle.RELATED)
                .add(jCheckBoxIgnorePageMargins)
                .add(42, 42, 42))
        );
    }// </editor-fold>//GEN-END:initComponents

    private void jRadioButtonExportAllActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_jRadioButtonExportAllActionPerformed
        updateRange();
    }//GEN-LAST:event_jRadioButtonExportAllActionPerformed

    private void jRadioButtonExportPageIndexActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_jRadioButtonExportPageIndexActionPerformed
        updateRange();
}//GEN-LAST:event_jRadioButtonExportPageIndexActionPerformed

    private void jRadioButtonExportRangeActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_jRadioButtonExportRangeActionPerformed
        updateRange();
}//GEN-LAST:event_jRadioButtonExportRangeActionPerformed

    private void jCheckBoxIgnorePageMarginsActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_jCheckBoxIgnorePageMarginsActionPerformed
        notifyChange();
    }//GEN-LAST:event_jCheckBoxIgnorePageMarginsActionPerformed


  public void updateRange()
  {
      jTextFieldPageIndex.setEnabled( jRadioButtonExportPageIndex.isSelected());
      jTextFieldPageRangeFrom.setEnabled( jRadioButtonExportRange.isSelected() );
      jTextFieldPageRangeTo.setEnabled( jRadioButtonExportRange.isSelected() );
      
      notifyChange();
  }

    // Variables declaration - do not modify//GEN-BEGIN:variables
    private javax.swing.ButtonGroup buttonGroup1;
    private javax.swing.JCheckBox jCheckBoxIgnorePageMargins;
    private javax.swing.JLabel jLabelCharacterEncoding;
    private javax.swing.JLabel jLabelError;
    private javax.swing.JLabel jLabelOffsetX;
    private javax.swing.JLabel jLabelOffsetY;
    private javax.swing.JLabel jLabelPageRangeTo;
    private javax.swing.JLabel jLabelTitle;
    private javax.swing.JPanel jPanel1;
    private javax.swing.JRadioButton jRadioButtonExportAll;
    private javax.swing.JRadioButton jRadioButtonExportPageIndex;
    private javax.swing.JRadioButton jRadioButtonExportRange;
    private javax.swing.JSeparator jSeparator1;
    private javax.swing.JSpinner jSpinnerOffsetX;
    private javax.swing.JSpinner jSpinnerOffsetY;
    private javax.swing.JTextField jTextFieldCharacterEncoding;
    private javax.swing.JTextField jTextFieldPageIndex;
    private javax.swing.JTextField jTextFieldPageRangeFrom;
    private javax.swing.JTextField jTextFieldPageRangeTo;
    // End of variables declaration//GEN-END:variables

    public void load() {
        setInit(true);
        Preferences pref = IReportManager.getPreferences();

        jCheckBoxIgnorePageMargins.setSelected( pref.getBoolean(JRExporterParameter.PROPERTY_IGNORE_PAGE_MARGINS, JRProperties.getBooleanProperty(JRExporterParameter.PROPERTY_IGNORE_PAGE_MARGINS)));
        int pageMode = pref.getInt(JRProperties.PROPERTY_PREFIX + "export.printrange", 0);

        jRadioButtonExportAll.setSelected( pageMode == 0);
        jRadioButtonExportPageIndex.setSelected( pageMode == 1);
        jTextFieldPageIndex.setEnabled(pageMode == 1);
        if (pageMode == 1)
        {
            jTextFieldPageIndex.setText( pref.getInt(JRProperties.PROPERTY_PREFIX + "export.printrange.index", 1) +"");
        }

        jRadioButtonExportRange.setSelected( pageMode == 2);
        jTextFieldPageRangeFrom.setEnabled( pageMode == 2 );
        jTextFieldPageRangeTo.setEnabled( pageMode == 2 );
        if (pageMode == 2)
        {
            jTextFieldPageRangeFrom.setText( pref.getInt(JRProperties.PROPERTY_PREFIX + "export.printrange.from", 1) +"");
            jTextFieldPageRangeTo.setText( pref.getInt(JRProperties.PROPERTY_PREFIX + "export.printrange.to", 1) +"");
        }

        String encoding = pref.get(JRExporterParameter.PROPERTY_CHARACTER_ENCODING, JRProperties.getProperty(JRExporterParameter.PROPERTY_CHARACTER_ENCODING));
        jTextFieldCharacterEncoding.setText( (encoding == null) ? "" : encoding );

        SpinnerNumberModel m = (SpinnerNumberModel)jSpinnerOffsetX.getModel();
        m.setValue(pref.getInt(JRProperties.PROPERTY_PREFIX + "export.offset.x", 0));
        m = (SpinnerNumberModel)jSpinnerOffsetY.getModel();
        m.setValue(pref.getInt(JRProperties.PROPERTY_PREFIX + "export.offset.y", 0));
        setInit(false);
    }

    public void store() {

        Preferences pref = IReportManager.getPreferences();
        if (jRadioButtonExportAll.isSelected())
        {
            pref.putInt(JRProperties.PROPERTY_PREFIX + "export.printrange", 0);
        }
        else if (jRadioButtonExportPageIndex.isSelected())
        {
            pref.putInt(JRProperties.PROPERTY_PREFIX + "export.printrange", 1);
            pref.putInt(JRProperties.PROPERTY_PREFIX + "export.printrange.index", Integer.valueOf( jTextFieldPageIndex.getText() ) );
        }
        else if (jRadioButtonExportRange.isSelected())
        {
            pref.putInt(JRProperties.PROPERTY_PREFIX + "export.printrange", 2);
            pref.putInt(JRProperties.PROPERTY_PREFIX + "export.printrange.from", Integer.valueOf( jTextFieldPageRangeFrom.getText() ) );
            pref.putInt(JRProperties.PROPERTY_PREFIX + "export.printrange.to", Integer.valueOf( jTextFieldPageRangeTo.getText() ) );
        }

        if (jTextFieldCharacterEncoding.getText().trim().length() == 0)
        {
            pref.remove(JRExporterParameter.PROPERTY_CHARACTER_ENCODING);
        }
        else
        {
            pref.put(JRExporterParameter.PROPERTY_CHARACTER_ENCODING, jTextFieldCharacterEncoding.getText().trim());
        }

        SpinnerNumberModel m = (SpinnerNumberModel)jSpinnerOffsetX.getModel();
        if (m.getNumber().intValue() == 0)
        {
           pref.remove(JRProperties.PROPERTY_PREFIX + "export.offset.x");
        }
        else
        {
            pref.putInt(JRProperties.PROPERTY_PREFIX + "export.offset.x", m.getNumber().intValue());
        }

        m = (SpinnerNumberModel)jSpinnerOffsetY.getModel();
        if (m.getNumber().intValue() == 0)
        {
           pref.remove(JRProperties.PROPERTY_PREFIX + "export.offset.y");
        }
        else
        {
            pref.putInt(JRProperties.PROPERTY_PREFIX + "export.offset.y", m.getNumber().intValue());
        }

        pref.putBoolean(JRExporterParameter.PROPERTY_IGNORE_PAGE_MARGINS, jCheckBoxIgnorePageMargins.isSelected());

    }

    public boolean valid() {

        jLabelError.setText(" ");
        if (jRadioButtonExportPageIndex.isSelected())
        {
            try {

                Integer.valueOf(jTextFieldPageIndex.getText().trim());

            } catch (Exception ex)
            {
                jLabelError.setText(I18n.getString("CommonExportParametersPanel.errorInvalidPageIndex"));
                return false;
            }
        }
        else if (jRadioButtonExportRange.isSelected())
        {
            try {

                int a = Integer.valueOf(jTextFieldPageRangeFrom.getText().trim());
                int b = Integer.valueOf(jTextFieldPageRangeTo.getText().trim());
                if (b < a) throw new Exception();

            } catch (Exception ex)
            {
                jLabelError.setText(I18n.getString("CommonExportParametersPanel.errorInvalidRange"));
                return false;
            }
        }

        return true;
    }

    @Override
    public String getDisplayName() {
        return I18n.getString("CommonExportParametersPanel.title");
    }

}
