/**
*
*/
package de.danielsenff.badds.view.GUI;
import java.awt.GridBagConstraints;
import java.awt.GridBagLayout;
import java.awt.Insets;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.beans.PropertyChangeEvent;
import java.beans.PropertyChangeListener;
import java.text.NumberFormat;
import javax.swing.ComboBoxModel;
import javax.swing.JCheckBox;
import javax.swing.JComboBox;
import javax.swing.JFormattedTextField;
import javax.swing.JLabel;
import javax.swing.JSeparator;
import jogl.DDSImage;
import de.danielsenff.badds.controller.Application;
import de.danielsenff.badds.model.ExportOptions;
import de.danielsenff.badds.model.Preset;
import de.danielsenff.badds.model.PresetsComboModel;
/**
* @author danielsenff
*
*/
public class SettingsPanel extends JCPanel implements PropertyChangeListener {
/**
*
*/
private static final long serialVersionUID = 1L;
protected JFormattedTextField fldNewHeight;
protected JFormattedTextField fldNewWidth;
protected JComboBox comboPixelformat;
private JCheckBox chkMipMaps;
private ExportOptions exportOptions;
/**
* Panel with the saving settings for the dds files
* @param controller
*/
public SettingsPanel(final Application controller) {
super(controller);
this.exportOptions = controller.getExportOptions();
init(controller);
}
/**
* Panel with the saving settings for the dds files to
* write the settings in a specified export-object
* @param controller
* @param exportOptions
*/
public SettingsPanel(final Application controller, ExportOptions exportOptions) {
super(controller);
this.exportOptions = exportOptions;
init(controller);
}
private void init(final Application controller) {
setLayout(new GridBagLayout());
final GridBagConstraints c = new GridBagConstraints();
c.insets = new Insets(4,4,4,4); //top padding
c.anchor = GridBagConstraints.LINE_START;
final JLabel lblPresets = new JLabel(bundle.getString("Presets"));
c.gridx = 0;
c.ipady = 0; //make this component tall
c.gridwidth = 1;
c.gridheight = 1;
c.gridy = 0;
add(lblPresets,c);
final NumberFormat numberformat = NumberFormat.getNumberInstance();
numberformat.setGroupingUsed(false);
this.fldNewWidth = new JFormattedTextField(numberformat);
this.fldNewWidth.setColumns(5);
this.fldNewWidth.addPropertyChangeListener(this);
this.fldNewHeight = new JFormattedTextField(numberformat);
this.fldNewHeight.setColumns(5);
this.fldNewHeight.addPropertyChangeListener(this);
final PresetsComboModel presetsModel = controller.getPresets();
final JComboBox comboPresets = new JComboBox(presetsModel);
comboPresets.addActionListener(new ActionSetPresets());
c.gridx = 0;
c.gridwidth = 2;
c.gridy = 1;
add(comboPresets,c);
final JLabel lblNewWidth = new JLabel(bundle.getString("new_width"));
c.gridx = 0;
c.gridwidth = 1;
c.gridy = 2;
add(lblNewWidth,c);
c.gridx = 1;
c.gridwidth = 1;
c.gridy = 2;
add(fldNewWidth,c);
final JLabel lblNewHeight = new JLabel(bundle.getString("new_height"));
c.gridx = 0;
c.gridy = 3;
add(lblNewHeight,c);
c.gridx = 1;
c.gridy = 3;
add(fldNewHeight,c);
final JCheckBox chkWhiteAlpha = new JCheckBox(bundle.getString("White_alpha_channel_(recommended)"));
chkWhiteAlpha.setToolTipText("If you have a DDSImage with a 8bit alpha and reduce it to 1bit \n" +
"it'll make the pixel either white or black with value 128 as threshold. In most cases if you want \n" +
"a DXT1 file, you want a clean white alpha. This function paints the alpha channel white.");
chkWhiteAlpha.addActionListener(new ActionListener() {
@Override
public void actionPerformed(final ActionEvent arg0) {
final boolean selected = ((JCheckBox)arg0.getSource()).isSelected();
controller.getExportOptions().setPaintWhiteAlpha(selected);
}
});
chkWhiteAlpha.setSelected(false);
chkWhiteAlpha.setEnabled(false);
final JCheckBox chkBackup = new JCheckBox(bundle.getString("backup_old_files"));
chkBackup.setSelected(true);
final JCheckBox chkKeepOriginal = new JCheckBox(bundle.getString("keep_old_files"));
chkKeepOriginal.setSelected(true);
chkKeepOriginal.getInsets().set(0, 15, 0, 0);
chkKeepOriginal.addActionListener(new ActionListener() {
@Override
public void actionPerformed(final ActionEvent arg0) {
controller.getExportOptions().setKeepOriginal(((JCheckBox)arg0.getSource()).isSelected());
}
});
chkBackup.addActionListener(new ActionListener() {
@Override
public void actionPerformed(final ActionEvent arg0) {
boolean selected = ((JCheckBox)arg0.getSource()).isSelected();
controller.getExportOptions().setMakeBackup(selected);
chkKeepOriginal.setEnabled(selected);
}
});
c.gridx = 0;
c.gridy = 4;
add(new JSeparator(),c);
// Pixelformat
final String[] presetsCompression = {bundle.getString("Keep_original_pixelformat"),
"DXT5 compression (8bit alpha)",
"DXT3 compression",
"DXT1 compression (1bit or no alpha)",
"A8R8G8B8 uncompressed",
"R8G8B8 uncompressed",
"X8R8G8B8 uncompressed"};
this.comboPixelformat = new JComboBox(presetsCompression);
this.comboPixelformat.addActionListener(new ActionListener() {
@Override
public void actionPerformed(final ActionEvent e) {
final int newPixelformat = convertIndexPixelFormat(((JComboBox)e.getSource()).getSelectedIndex());
controller.getExportOptions().setNewPixelformat(newPixelformat);
if(newPixelformat == DDSImage.D3DFMT_DXT1) {
chkWhiteAlpha.setEnabled(true);
chkWhiteAlpha.setSelected(true);
controller.getExportOptions().setPaintWhiteAlpha(true);
} else {
chkWhiteAlpha.setEnabled(false);
controller.getExportOptions().setPaintWhiteAlpha(false);
}
}
});
c.gridx = 0;
c.gridwidth=2;
c.gridy = 5;
add(comboPixelformat,c);
c.gridx = 0;
c.gridy = 6;
add(chkWhiteAlpha,c);
chkMipMaps = new JCheckBox(bundle.getString("Generate_MipMaps_(recommended)"));
chkMipMaps.addActionListener(new ActionListener() {
@Override
public void actionPerformed(final ActionEvent arg0) {
boolean selected = ((JCheckBox)arg0.getSource()).isSelected();
controller.getExportOptions().setGenerateMipMaps(selected);
}
});
chkMipMaps.setSelected(true);
c.gridx = 0;
c.gridy = 7;
add(chkMipMaps,c);
c.gridx = 0;
c.gridy = 8;
add(chkBackup,c);
c.gridx = 0;
c.gridy = 9;
add(chkKeepOriginal,c);
comboPresets.setSelectedIndex(1); // set to default texture size
}
class ActionSetPresets implements ActionListener {
/* (non-Javadoc)
* @see java.awt.event.ActionListener#actionPerformed(java.awt.event.ActionEvent)
*/
@Override
public void actionPerformed(final ActionEvent e) {
final JComboBox combo = (JComboBox) e.getSource();
final ComboBoxModel model = combo.getModel();
final Preset preset = (Preset) model.getSelectedItem();
fldNewWidth.setValue(preset.getWidth());
fldNewHeight.setValue(preset.getHeight());
chkMipMaps.setSelected(preset.isMipmaps());
// comboPixelformat.setSelectedIndex(3);
//TODO clean up ... no hardcode
if(preset.getPixelformat() == DDSImage.D3DFMT_DXT1) {
comboPixelformat.setSelectedIndex(3);
} else if (preset.getPixelformat() == DDSImage.D3DFMT_DXT5) {
comboPixelformat.setSelectedIndex(1);
} else {
comboPixelformat.setSelectedIndex(1);
}
}
}
/**
* Set the width in the JTextfield
* @param newHeight
*/
public void setNewHeight(final int newHeight) {
this.fldNewHeight.setValue(new Integer(newHeight));
}
/**
* Set the width in the JTextfield
* @param newWidth
*/
public void setNewWidth(final int newWidth) {
this.fldNewWidth.setValue(new Integer(newWidth));
}
/** Called when a field's "value" property changes. */
@Override
public void propertyChange(final PropertyChangeEvent e) {
final Object source = e.getSource();
if (source == this.fldNewWidth) {
final int width = ((Number)fldNewWidth.getValue()).intValue();
exportOptions.setNewWidth(width);
} else if (source == this.fldNewHeight) {
final int height = ((Number)fldNewHeight.getValue()).intValue();
exportOptions.setNewHeight(height);
}
}
/**
* Get the selected Pixelformat
* @return
*/
public int getNewPixelformat() {
return this.comboPixelformat.getSelectedIndex();
}
private int convertIndexPixelFormat(final int index) {
switch(index) {
default: // keep
case 0:
return 0;
case 1:
return DDSImage.D3DFMT_DXT5;
case 2:
return DDSImage.D3DFMT_DXT3;
case 3:
return DDSImage.D3DFMT_DXT1;
case 4:
return DDSImage.D3DFMT_A8R8G8B8;
case 5:
return DDSImage.D3DFMT_R8G8B8;
case 6:
return DDSImage.D3DFMT_X8R8G8B8;
}
}
}