/*
* To change this license header, choose License Headers in Project Properties.
* To change this template file, choose Tools | Templates
* and open the template in the editor.
*/
package org.pepsoft.worldpainter.layers.groundcover;
import java.awt.Color;
import javax.swing.JColorChooser;
import javax.swing.event.DocumentEvent;
import javax.swing.event.DocumentListener;
import org.pepsoft.minecraft.Constants;
import org.pepsoft.worldpainter.MixedMaterial;
import org.pepsoft.worldpainter.MixedMaterialManager;
import org.pepsoft.worldpainter.NoiseSettings;
import org.pepsoft.worldpainter.layers.AbstractLayerEditor;
import org.pepsoft.worldpainter.layers.exporters.ExporterSettings;
/**
*
* @author Pepijn Schmitz
*/
public class GroundCoverLayerEditor extends AbstractLayerEditor<GroundCoverLayer> {
/**
* Creates new form GroundCoverLayerEditor
*/
public GroundCoverLayerEditor() {
initComponents();
if (! "true".equalsIgnoreCase(System.getProperty("org.pepsoft.worldpainter.westerosCraftMode"))) {
checkBoxSmooth.setVisible(false);
labelWesterosCraftFeature.setVisible(false);
}
setLabelColour();
setControlStates();
fieldName.getDocument().addDocumentListener(new DocumentListener() {
@Override
public void insertUpdate(DocumentEvent e) {
settingsChanged();
}
@Override
public void removeUpdate(DocumentEvent e) {
settingsChanged();
}
@Override
public void changedUpdate(DocumentEvent e) {
settingsChanged();
}
});
}
// LayerEditor
@Override
public GroundCoverLayer createLayer() {
return new GroundCoverLayer("My Ground Cover", MixedMaterial.create(Constants.BLK_ROSE), Color.RED.getRGB());
}
@Override
public void setLayer(GroundCoverLayer layer) {
super.setLayer(layer);
reset();
}
@Override
public void commit() {
if (! isCommitAvailable()) {
throw new IllegalStateException("Settings invalid or incomplete");
}
// Make sure the material is registered, in case it's new
layer.setMaterial(MixedMaterialManager.getInstance().register(mixedMaterialSelector1.getMaterial()));
saveSettings(layer);
}
@Override
public void reset() {
fieldName.setText(layer.getName());
spinnerThickness.setValue(layer.getThickness());
selectedColour = layer.getColour();
switch (layer.getEdgeShape()) {
case SHEER:
radioButtonSheerEdge.setSelected(true);
break;
case LINEAR:
radioButtonLinearEdge.setSelected(true);
break;
case SMOOTH:
radioButtonSmoothEdge.setSelected(true);
break;
case ROUNDED:
radioButtonRoundedEdge.setSelected(true);
break;
}
spinnerEdgeWidth.setValue(layer.getEdgeWidth());
if (layer.getNoiseSettings() != null) {
noiseSettingsEditor1.setNoiseSettings(layer.getNoiseSettings());
}
checkBoxSmooth.setSelected(layer.isSmooth());
mixedMaterialSelector1.setMaterial(layer.getMaterial());
setLabelColour();
settingsChanged();
}
@Override
public ExporterSettings getSettings() {
if (! isCommitAvailable()) {
throw new IllegalStateException("Settings invalid or incomplete");
}
final GroundCoverLayer previewLayer = saveSettings(null);
return new ExporterSettings() {
@Override
public boolean isApplyEverywhere() {
return false;
}
@Override
public GroundCoverLayer getLayer() {
return previewLayer;
}
@Override
public ExporterSettings clone() {
throw new UnsupportedOperationException("Not supported");
}
};
}
@Override
public boolean isCommitAvailable() {
return ((Integer) spinnerThickness.getValue() != 0) && (! fieldName.getText().trim().isEmpty());
}
@Override
public void setContext(LayerEditorContext context) {
super.setContext(context);
mixedMaterialSelector1.setColourScheme(context.getColourScheme());
mixedMaterialSelector1.setExtendedBlockIds(context.isExtendedBlockIds());
}
private void settingsChanged() {
setControlStates();
context.settingsChanged();
}
private void pickColour() {
Color pick = JColorChooser.showDialog(this, "Select Colour", new Color(selectedColour));
if (pick != null) {
selectedColour = pick.getRGB();
setLabelColour();
}
}
private void setLabelColour() {
jLabel5.setBackground(new Color(selectedColour));
}
private void setControlStates() {
int thickness = (Integer) spinnerThickness.getValue();
spinnerEdgeWidth.setEnabled((thickness < -1 || thickness > 1) && (! radioButtonSheerEdge.isSelected()));
radioButtonSheerEdge.setEnabled(thickness < -1 || thickness > 1);
radioButtonLinearEdge.setEnabled(thickness < -1 || thickness > 1);
radioButtonSmoothEdge.setEnabled(thickness < -1 || thickness > 1);
radioButtonRoundedEdge.setEnabled(thickness < -1 || thickness > 1);
}
private GroundCoverLayer saveSettings(GroundCoverLayer layer) {
if (layer == null) {
layer = new GroundCoverLayer(fieldName.getText(), mixedMaterialSelector1.getMaterial(), selectedColour);
} else {
layer.setName(fieldName.getText());
layer.setColour(selectedColour);
}
layer.setThickness((Integer) spinnerThickness.getValue());
if (radioButtonSheerEdge.isSelected()) {
layer.setEdgeShape(GroundCoverLayer.EdgeShape.SHEER);
} else if (radioButtonLinearEdge.isSelected()) {
layer.setEdgeShape(GroundCoverLayer.EdgeShape.LINEAR);
} else if (radioButtonSmoothEdge.isSelected()) {
layer.setEdgeShape(GroundCoverLayer.EdgeShape.SMOOTH);
} else if (radioButtonRoundedEdge.isSelected()) {
layer.setEdgeShape(GroundCoverLayer.EdgeShape.ROUNDED);
}
layer.setEdgeWidth((Integer) spinnerEdgeWidth.getValue());
NoiseSettings noiseSettings = noiseSettingsEditor1.getNoiseSettings();
if (noiseSettings.getRange() == 0) {
layer.setNoiseSettings(null);
} else {
layer.setNoiseSettings(noiseSettings);
}
layer.setSmooth(checkBoxSmooth.isSelected());
return layer;
}
/**
* 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();
radioButtonRoundedEdge = new javax.swing.JRadioButton();
jLabel13 = new javax.swing.JLabel();
noiseSettingsEditor1 = new org.pepsoft.worldpainter.NoiseSettingsEditor();
jLabel1 = new javax.swing.JLabel();
jLabel3 = new javax.swing.JLabel();
jLabel8 = new javax.swing.JLabel();
jLabel14 = new javax.swing.JLabel();
jLabel15 = new javax.swing.JLabel();
checkBoxSmooth = new javax.swing.JCheckBox();
labelWesterosCraftFeature = new javax.swing.JLabel();
jLabel6 = new javax.swing.JLabel();
mixedMaterialSelector1 = new org.pepsoft.worldpainter.MixedMaterialChooser();
fieldName = new javax.swing.JTextField();
jLabel7 = new javax.swing.JLabel();
spinnerThickness = new javax.swing.JSpinner();
jLabel9 = new javax.swing.JLabel();
jLabel10 = new javax.swing.JLabel();
radioButtonSheerEdge = new javax.swing.JRadioButton();
radioButtonLinearEdge = new javax.swing.JRadioButton();
jLabel11 = new javax.swing.JLabel();
radioButtonSmoothEdge = new javax.swing.JRadioButton();
jLabel2 = new javax.swing.JLabel();
jLabel4 = new javax.swing.JLabel();
jLabel5 = new javax.swing.JLabel();
jButton1 = new javax.swing.JButton();
jLabel12 = new javax.swing.JLabel();
spinnerEdgeWidth = new javax.swing.JSpinner();
buttonGroup1.add(radioButtonRoundedEdge);
radioButtonRoundedEdge.setText("rounded");
radioButtonRoundedEdge.addActionListener(this::radioButtonRoundedEdgeActionPerformed);
jLabel13.setText("Variation:");
jLabel1.setIcon(new javax.swing.ImageIcon(getClass().getResource("/org/pepsoft/worldpainter/icons/edge_sheer.png"))); // NOI18N
jLabel3.setIcon(new javax.swing.ImageIcon(getClass().getResource("/org/pepsoft/worldpainter/icons/edge_linear.png"))); // NOI18N
jLabel8.setIcon(new javax.swing.ImageIcon(getClass().getResource("/org/pepsoft/worldpainter/icons/edge_smooth.png"))); // NOI18N
jLabel14.setIcon(new javax.swing.ImageIcon(getClass().getResource("/org/pepsoft/worldpainter/icons/edge_rounded.png"))); // NOI18N
jLabel15.setText(" ");
checkBoxSmooth.setText("Smooth:");
checkBoxSmooth.setHorizontalTextPosition(javax.swing.SwingConstants.LEADING);
labelWesterosCraftFeature.setFont(new java.awt.Font("Times New Roman", 1, 18)); // NOI18N
labelWesterosCraftFeature.setText("W ");
jLabel6.setText("Name:");
fieldName.setColumns(10);
jLabel7.setText("Thickness:");
spinnerThickness.setModel(new javax.swing.SpinnerNumberModel(1, -255, 255, 1));
spinnerThickness.addChangeListener(this::spinnerThicknessStateChanged);
jLabel9.setText("(negative values will dig down into the terrain)");
jLabel10.setText("Edge ");
buttonGroup1.add(radioButtonSheerEdge);
radioButtonSheerEdge.setSelected(true);
radioButtonSheerEdge.setText("sheer");
radioButtonSheerEdge.addActionListener(this::radioButtonSheerEdgeActionPerformed);
buttonGroup1.add(radioButtonLinearEdge);
radioButtonLinearEdge.setText("linear");
radioButtonLinearEdge.addActionListener(this::radioButtonLinearEdgeActionPerformed);
jLabel11.setText("shape:");
buttonGroup1.add(radioButtonSmoothEdge);
radioButtonSmoothEdge.setText("smooth");
radioButtonSmoothEdge.addActionListener(this::radioButtonSmoothEdgeActionPerformed);
jLabel2.setText("Material:");
jLabel4.setText("Colour:");
jLabel5.setBackground(java.awt.Color.orange);
jLabel5.setText(" ");
jLabel5.setBorder(javax.swing.BorderFactory.createLineBorder(new java.awt.Color(0, 0, 0)));
jLabel5.setOpaque(true);
jButton1.setText("...");
jButton1.addActionListener(this::jButton1ActionPerformed);
jLabel12.setText("width:");
spinnerEdgeWidth.setModel(new javax.swing.SpinnerNumberModel(1, 1, 255, 1));
spinnerEdgeWidth.setEnabled(false);
spinnerEdgeWidth.addChangeListener(this::spinnerEdgeWidthStateChanged);
javax.swing.GroupLayout layout = new javax.swing.GroupLayout(this);
this.setLayout(layout);
layout.setHorizontalGroup(
layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
.addGroup(layout.createSequentialGroup()
.addComponent(jLabel2)
.addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
.addComponent(mixedMaterialSelector1, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE))
.addGroup(layout.createSequentialGroup()
.addComponent(jLabel7)
.addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
.addComponent(spinnerThickness, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
.addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
.addComponent(jLabel9))
.addGroup(layout.createSequentialGroup()
.addComponent(jLabel13)
.addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
.addComponent(noiseSettingsEditor1, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE))
.addGroup(layout.createSequentialGroup()
.addComponent(jLabel10)
.addGap(0, 0, 0)
.addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
.addGroup(layout.createSequentialGroup()
.addComponent(jLabel12)
.addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
.addComponent(spinnerEdgeWidth, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE))
.addGroup(layout.createSequentialGroup()
.addComponent(jLabel11)
.addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
.addComponent(radioButtonSheerEdge)
.addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
.addComponent(jLabel1)
.addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
.addComponent(radioButtonLinearEdge)
.addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
.addComponent(jLabel3)
.addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
.addComponent(radioButtonSmoothEdge)
.addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
.addComponent(jLabel8)
.addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
.addComponent(radioButtonRoundedEdge)
.addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
.addComponent(jLabel14))))
.addGroup(layout.createSequentialGroup()
.addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
.addGroup(layout.createSequentialGroup()
.addComponent(jLabel4)
.addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
.addComponent(jLabel5)
.addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
.addComponent(jButton1))
.addGroup(layout.createSequentialGroup()
.addComponent(jLabel6)
.addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
.addComponent(fieldName, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)))
.addGap(18, 18, 18)
.addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
.addComponent(jLabel15)
.addGroup(layout.createSequentialGroup()
.addComponent(checkBoxSmooth)
.addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
.addComponent(labelWesterosCraftFeature))))
);
layout.setVerticalGroup(
layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
.addGroup(layout.createSequentialGroup()
.addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE)
.addComponent(jLabel2)
.addComponent(mixedMaterialSelector1, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE))
.addGap(18, 18, 18)
.addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE)
.addComponent(jLabel7)
.addComponent(spinnerThickness, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
.addComponent(jLabel9))
.addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
.addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE)
.addComponent(jLabel13)
.addComponent(noiseSettingsEditor1, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE))
.addGap(18, 18, 18)
.addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
.addComponent(jLabel14)
.addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE)
.addComponent(jLabel10)
.addComponent(radioButtonSheerEdge)
.addComponent(radioButtonLinearEdge)
.addComponent(jLabel11)
.addComponent(radioButtonSmoothEdge)
.addComponent(radioButtonRoundedEdge)
.addComponent(jLabel1)
.addComponent(jLabel3)
.addComponent(jLabel8)))
.addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
.addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE)
.addComponent(jLabel12)
.addComponent(spinnerEdgeWidth, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE))
.addGap(18, 18, 18)
.addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE)
.addComponent(jLabel6)
.addComponent(fieldName, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
.addComponent(checkBoxSmooth)
.addComponent(labelWesterosCraftFeature))
.addGap(18, 18, 18)
.addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE)
.addComponent(jLabel4)
.addComponent(jLabel5)
.addComponent(jButton1)
.addComponent(jLabel15)))
);
}// </editor-fold>//GEN-END:initComponents
private void radioButtonRoundedEdgeActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_radioButtonRoundedEdgeActionPerformed
settingsChanged();
}//GEN-LAST:event_radioButtonRoundedEdgeActionPerformed
private void spinnerThicknessStateChanged(javax.swing.event.ChangeEvent evt) {//GEN-FIRST:event_spinnerThicknessStateChanged
settingsChanged();
}//GEN-LAST:event_spinnerThicknessStateChanged
private void radioButtonSheerEdgeActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_radioButtonSheerEdgeActionPerformed
settingsChanged();
}//GEN-LAST:event_radioButtonSheerEdgeActionPerformed
private void radioButtonLinearEdgeActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_radioButtonLinearEdgeActionPerformed
settingsChanged();
}//GEN-LAST:event_radioButtonLinearEdgeActionPerformed
private void radioButtonSmoothEdgeActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_radioButtonSmoothEdgeActionPerformed
settingsChanged();
}//GEN-LAST:event_radioButtonSmoothEdgeActionPerformed
private void jButton1ActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_jButton1ActionPerformed
pickColour();
}//GEN-LAST:event_jButton1ActionPerformed
private void spinnerEdgeWidthStateChanged(javax.swing.event.ChangeEvent evt) {//GEN-FIRST:event_spinnerEdgeWidthStateChanged
settingsChanged();
}//GEN-LAST:event_spinnerEdgeWidthStateChanged
// Variables declaration - do not modify//GEN-BEGIN:variables
private javax.swing.ButtonGroup buttonGroup1;
private javax.swing.JCheckBox checkBoxSmooth;
private javax.swing.JTextField fieldName;
private javax.swing.JButton jButton1;
private javax.swing.JLabel jLabel1;
private javax.swing.JLabel jLabel10;
private javax.swing.JLabel jLabel11;
private javax.swing.JLabel jLabel12;
private javax.swing.JLabel jLabel13;
private javax.swing.JLabel jLabel14;
private javax.swing.JLabel jLabel15;
private javax.swing.JLabel jLabel2;
private javax.swing.JLabel jLabel3;
private javax.swing.JLabel jLabel4;
private javax.swing.JLabel jLabel5;
private javax.swing.JLabel jLabel6;
private javax.swing.JLabel jLabel7;
private javax.swing.JLabel jLabel8;
private javax.swing.JLabel jLabel9;
private javax.swing.JLabel labelWesterosCraftFeature;
private org.pepsoft.worldpainter.MixedMaterialChooser mixedMaterialSelector1;
private org.pepsoft.worldpainter.NoiseSettingsEditor noiseSettingsEditor1;
private javax.swing.JRadioButton radioButtonLinearEdge;
private javax.swing.JRadioButton radioButtonRoundedEdge;
private javax.swing.JRadioButton radioButtonSheerEdge;
private javax.swing.JRadioButton radioButtonSmoothEdge;
private javax.swing.JSpinner spinnerEdgeWidth;
private javax.swing.JSpinner spinnerThickness;
// End of variables declaration//GEN-END:variables
private int selectedColour = Color.RED.getRGB();
}