/*
 * HalfNES by Andrew Hoffman
 * Licensed under the GNU GPL Version 3. See LICENSE file
 */

/*
 * OptionsDialog.java
 *
 * Created on Jan 16, 2011, 4:21:43 PM
 */
package com.grapeshot.halfnes.ui;

import com.grapeshot.halfnes.PrefsSingleton;
import java.awt.event.KeyEvent;
import java.util.logging.Level;
import java.util.logging.Logger;
import java.util.prefs.BackingStoreException;
import java.util.prefs.Preferences;

/**
 *
 * @author Andrew
 */
public class PreferencesDialog extends javax.swing.JDialog {
    
    private int screenScaling;
    private boolean okClicked = false;

    /**
     * Creates new form OptionsDialog
     */
    public PreferencesDialog(java.awt.Frame parent) {
        super(parent, true);
        Preferences prefs = PrefsSingleton.get();
        initComponents();
        this.setTitle("HalfNES Preferences");
        //set all of the text boxes
        //aand the sound enable checkbox.
        jCheckSoundEnable.setSelected(prefs.getBoolean("soundEnable", true));
        jCheckSoundFiltering.setSelected(prefs.getBoolean("soundFiltering", true));
        jCheckMaintainAspect.setSelected(prefs.getBoolean("maintainAspect", true));
        jCheckBoxNTSC.setSelected(prefs.getBoolean("TVEmulation", false));
        jCheckBoxNTView.setSelected(prefs.getBoolean("ntView", false));
        jCheckBoxShowScope.setSelected(prefs.getBoolean("showScope", false));
        jCheckBoxSleep.setSelected(prefs.getBoolean("Sleep", true));
        jButtonOK.setActionCommand("OK");
        jButtonCancel.setActionCommand("Cancel");
        screenScaling = prefs.getInt("screenScaling", 2);
        jSpinnerScale.setValue(screenScaling);
        jSampleRateBox.setSelectedItem(Integer.toString(prefs.getInt("sampleRate", 44100)));
        jCheckBoxSmoothVideo.setSelected(prefs.getBoolean("smoothScaling", false));
        volumeSlider.setValue(prefs.getInt("outputvol", 13107));
        jRegionBox.setSelectedIndex(prefs.getInt("region", 0));
        //0-> auto, 1-> NTSC, 2-> PAL, 3-> Dendy
    }

    /**
     * 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();
        jLabel1 = new javax.swing.JLabel();
        jCheckSoundEnable = new javax.swing.JCheckBox();
        jButtonCancel = new javax.swing.JButton();
        jButtonOK = new javax.swing.JButton();
        jSampleRateBox = new javax.swing.JComboBox();
        jLabel2 = new javax.swing.JLabel();
        jCheckMaintainAspect = new javax.swing.JCheckBox();
        jLabel14 = new javax.swing.JLabel();
        jCheckSoundFiltering = new javax.swing.JCheckBox();
        jLabel15 = new javax.swing.JLabel();
        volumeSlider = new javax.swing.JSlider();
        jLabel17 = new javax.swing.JLabel();
        jLabel18 = new javax.swing.JLabel();
        jCheckBoxNTSC = new javax.swing.JCheckBox();
        jLabel19 = new javax.swing.JLabel();
        jSpinnerScale = new javax.swing.JSpinner();
        jLabel20 = new javax.swing.JLabel();
        jCheckBoxSmoothVideo = new javax.swing.JCheckBox();
        jCheckBoxSleep = new javax.swing.JCheckBox();
        jCheckBoxShowScope = new javax.swing.JCheckBox();
        jCheckBoxNTView = new javax.swing.JCheckBox();
        jLabel3 = new javax.swing.JLabel();
        jRegionBox = new javax.swing.JComboBox();

        setModalityType(java.awt.Dialog.ModalityType.APPLICATION_MODAL);
        setName("OptionsDialog"); // NOI18N
        setResizable(false);

        jLabel1.setText("Screen scaling: scale up "); // NOI18N

        jCheckSoundEnable.setText("Enable Sound"); // NOI18N

        jButtonCancel.setText("Cancel"); // NOI18N
        jButtonCancel.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                jButtonCancelActionPerformed(evt);
            }
        });

        jButtonOK.setText("OK"); // NOI18N
        jButtonOK.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                jButtonOKActionPerformed(evt);
            }
        });

        jSampleRateBox.setModel(new javax.swing.DefaultComboBoxModel(new String[] { "16000", "24000", "44100", "48000","96000" }));
        jSampleRateBox.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                jSampleRateBoxActionPerformed(evt);
            }
        });

        jLabel2.setText("Sample Rate:"); // NOI18N

        jCheckMaintainAspect.setText("Maintain Aspect Ratio"); // NOI18N

        jLabel14.setText("Sound:"); // NOI18N

        jCheckSoundFiltering.setText("Enable Filtering"); // NOI18N
        jCheckSoundFiltering.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                jCheckSoundFilteringActionPerformed(evt);
            }
        });

        jLabel15.setText("Output Volume:"); // NOI18N

        volumeSlider.setMajorTickSpacing(8192);
        volumeSlider.setMaximum(16384);
        volumeSlider.setMinorTickSpacing(4096);
        volumeSlider.setPaintTicks(true);
        volumeSlider.setValue(80);

        jLabel17.setText("0"); // NOI18N

        jLabel18.setText("100"); // NOI18N

        jCheckBoxNTSC.setText("Use NTSC TV Filter (Experimental)");
        jCheckBoxNTSC.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                jCheckBoxNTSCActionPerformed(evt);
            }
        });

        jLabel19.setText("Video options:"); // NOI18N

        jSpinnerScale.setModel(new javax.swing.SpinnerNumberModel(2, 1, 6, 1));

        jLabel20.setText("times"); // NOI18N

        jCheckBoxSmoothVideo.setText("Use Smooth Scaling");
        jCheckBoxSmoothVideo.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                jCheckBoxSmoothVideoActionPerformed(evt);
            }
        });

        jCheckBoxSleep.setText("Sleep Between Frames");
        jCheckBoxSleep.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                jCheckBoxSleepActionPerformed(evt);
            }
        });

        jCheckBoxShowScope.setText("Show Audio Output");

        jCheckBoxNTView.setText("Show Nametable Viewer");

        jLabel3.setText("Console Region:");

        jRegionBox.setModel(new javax.swing.DefaultComboBoxModel(new String[] { "Auto Detect", "NTSC", "PAL", "Dendy (Hybrid)" }));
        jRegionBox.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                jRegionBoxActionPerformed(evt);
            }
        });

        javax.swing.GroupLayout layout = new javax.swing.GroupLayout(getContentPane());
        getContentPane().setLayout(layout);
        layout.setHorizontalGroup(
            layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
            .addGroup(layout.createSequentialGroup()
                .addContainerGap()
                .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
                    .addGroup(javax.swing.GroupLayout.Alignment.TRAILING, layout.createSequentialGroup()
                        .addGap(0, 0, Short.MAX_VALUE)
                        .addComponent(jButtonOK)
                        .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.UNRELATED)
                        .addComponent(jButtonCancel))
                    .addGroup(layout.createSequentialGroup()
                        .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
                            .addGroup(layout.createSequentialGroup()
                                .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
                                    .addGroup(layout.createSequentialGroup()
                                        .addComponent(jLabel1)
                                        .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
                                        .addComponent(jSpinnerScale, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
                                        .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
                                        .addComponent(jLabel20, javax.swing.GroupLayout.PREFERRED_SIZE, 26, javax.swing.GroupLayout.PREFERRED_SIZE))
                                    .addComponent(jLabel19)
                                    .addComponent(jCheckBoxNTSC)
                                    .addComponent(jCheckMaintainAspect)
                                    .addComponent(jCheckBoxSmoothVideo)
                                    .addComponent(jCheckBoxSleep)
                                    .addComponent(jCheckBoxShowScope)
                                    .addComponent(jCheckBoxNTView))
                                .addGap(18, 18, 18)
                                .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING, false)
                                    .addComponent(volumeSlider, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
                                    .addComponent(jLabel14)
                                    .addComponent(jCheckSoundEnable)
                                    .addComponent(jCheckSoundFiltering)
                                    .addGroup(layout.createSequentialGroup()
                                        .addComponent(jLabel2, javax.swing.GroupLayout.PREFERRED_SIZE, 73, javax.swing.GroupLayout.PREFERRED_SIZE)
                                        .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
                                        .addComponent(jSampleRateBox, javax.swing.GroupLayout.PREFERRED_SIZE, 83, javax.swing.GroupLayout.PREFERRED_SIZE))
                                    .addComponent(jLabel15)
                                    .addGroup(layout.createSequentialGroup()
                                        .addComponent(jLabel17)
                                        .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)
                                        .addComponent(jLabel18))))
                            .addGroup(layout.createSequentialGroup()
                                .addComponent(jLabel3)
                                .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.UNRELATED)
                                .addComponent(jRegionBox, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)))
                        .addGap(0, 0, Short.MAX_VALUE)))
                .addContainerGap())
        );
        layout.setVerticalGroup(
            layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
            .addGroup(layout.createSequentialGroup()
                .addGap(6, 6, 6)
                .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
                    .addGroup(layout.createSequentialGroup()
                        .addComponent(jLabel14)
                        .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
                        .addComponent(jCheckSoundEnable)
                        .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
                        .addComponent(jCheckSoundFiltering)
                        .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
                        .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE)
                            .addComponent(jLabel2)
                            .addComponent(jSampleRateBox, javax.swing.GroupLayout.PREFERRED_SIZE, 20, javax.swing.GroupLayout.PREFERRED_SIZE))
                        .addGap(3, 3, 3)
                        .addComponent(jLabel15)
                        .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
                        .addComponent(volumeSlider, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
                        .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
                        .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
                            .addComponent(jLabel17)
                            .addComponent(jLabel18)))
                    .addGroup(layout.createSequentialGroup()
                        .addComponent(jLabel19)
                        .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
                        .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE)
                            .addComponent(jLabel1)
                            .addComponent(jSpinnerScale, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
                            .addComponent(jLabel20))
                        .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
                        .addComponent(jCheckBoxSmoothVideo)
                        .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
                        .addComponent(jCheckMaintainAspect)
                        .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
                        .addComponent(jCheckBoxNTSC)
                        .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
                        .addComponent(jCheckBoxSleep)
                        .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
                        .addComponent(jCheckBoxShowScope)
                        .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
                        .addComponent(jCheckBoxNTView)))
                .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
                .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE)
                    .addComponent(jLabel3)
                    .addComponent(jRegionBox, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE))
                .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED, 26, Short.MAX_VALUE)
                .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE)
                    .addComponent(jButtonOK)
                    .addComponent(jButtonCancel))
                .addContainerGap())
        );

        pack();
    }// </editor-fold>//GEN-END:initComponents

    private void jButtonCancelActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_jButtonCancelActionPerformed
        if ("Cancel".equals(evt.getActionCommand())) {
            this.setVisible(false);
        }
    }//GEN-LAST:event_jButtonCancelActionPerformed

    private void jButtonOKActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_jButtonOKActionPerformed
        //    if ("OK".equals(evt.getActionCommand())) {
        //here we go... save everything and hide the window
        Preferences prefs = PrefsSingleton.get();
        prefs.putBoolean("soundEnable", jCheckSoundEnable.isSelected());
        prefs.putBoolean("soundFiltering", jCheckSoundFiltering.isSelected());
        prefs.putBoolean("maintainAspect", jCheckMaintainAspect.isSelected());
        prefs.putBoolean("TVEmulation", jCheckBoxNTSC.isSelected());
        prefs.putBoolean("Sleep", jCheckBoxSleep.isSelected());
        screenScaling = (Integer) (jSpinnerScale.getModel().getValue());
        prefs.putBoolean("smoothScaling", jCheckBoxSmoothVideo.isSelected());
        prefs.putBoolean("showScope", jCheckBoxShowScope.isSelected());
        prefs.putBoolean("ntView", jCheckBoxNTView.isSelected());
        prefs.putInt("screenScaling", screenScaling);
        prefs.putInt("sampleRate", Integer.parseInt(jSampleRateBox.getSelectedItem().toString()));
        prefs.putInt("outputvol", volumeSlider.getValue());
        prefs.putInt("region", jRegionBox.getSelectedIndex());
        try {
            prefs.flush();
        } catch (BackingStoreException ex) {
            Logger.getLogger(PreferencesDialog.class.getName()).log(Level.SEVERE, null, ex);
        }
        okClicked = true;
        this.setVisible(false);
        //   }
    }//GEN-LAST:event_jButtonOKActionPerformed
    public boolean okClicked() {
        return okClicked;
    }
    private void jSampleRateBoxActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_jSampleRateBoxActionPerformed
        // TODO add your handling code here:
    }//GEN-LAST:event_jSampleRateBoxActionPerformed

    private void jCheckSoundFilteringActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_jCheckSoundFilteringActionPerformed
        // TODO add your handling code here:
    }//GEN-LAST:event_jCheckSoundFilteringActionPerformed

    private void jCheckBoxNTSCActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_jCheckBoxNTSCActionPerformed
        // TODO add your handling code here:
    }//GEN-LAST:event_jCheckBoxNTSCActionPerformed

    private void jCheckBoxSmoothVideoActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_jCheckBoxSmoothVideoActionPerformed
        // TODO add your handling code here:
    }//GEN-LAST:event_jCheckBoxSmoothVideoActionPerformed

    private void jCheckBoxSleepActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_jCheckBoxSleepActionPerformed
        // TODO add your handling code here:
    }//GEN-LAST:event_jCheckBoxSleepActionPerformed

    private void jRegionBoxActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_jRegionBoxActionPerformed
        // TODO add your handling code here:
    }//GEN-LAST:event_jRegionBoxActionPerformed
    // Variables declaration - do not modify//GEN-BEGIN:variables
    private javax.swing.ButtonGroup buttonGroup1;
    private javax.swing.JButton jButtonCancel;
    private javax.swing.JButton jButtonOK;
    private javax.swing.JCheckBox jCheckBoxNTSC;
    private javax.swing.JCheckBox jCheckBoxNTView;
    private javax.swing.JCheckBox jCheckBoxShowScope;
    private javax.swing.JCheckBox jCheckBoxSleep;
    private javax.swing.JCheckBox jCheckBoxSmoothVideo;
    private javax.swing.JCheckBox jCheckMaintainAspect;
    private javax.swing.JCheckBox jCheckSoundEnable;
    private javax.swing.JCheckBox jCheckSoundFiltering;
    private javax.swing.JLabel jLabel1;
    private javax.swing.JLabel jLabel14;
    private javax.swing.JLabel jLabel15;
    private javax.swing.JLabel jLabel17;
    private javax.swing.JLabel jLabel18;
    private javax.swing.JLabel jLabel19;
    private javax.swing.JLabel jLabel2;
    private javax.swing.JLabel jLabel20;
    private javax.swing.JLabel jLabel3;
    private javax.swing.JComboBox jRegionBox;
    private javax.swing.JComboBox jSampleRateBox;
    private javax.swing.JSpinner jSpinnerScale;
    private javax.swing.JSlider volumeSlider;
    // End of variables declaration//GEN-END:variables
}