/*
* 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.combined;
import org.pepsoft.worldpainter.BiomeListCellRenderer;
import org.pepsoft.worldpainter.ColourScheme;
import org.pepsoft.worldpainter.LayerListCellRenderer;
import org.pepsoft.worldpainter.Terrain;
import org.pepsoft.worldpainter.biomeschemes.CustomBiome;
import org.pepsoft.worldpainter.biomeschemes.CustomBiomeManager;
import org.pepsoft.worldpainter.biomeschemes.Minecraft1_7Biomes;
import org.pepsoft.worldpainter.layers.AbstractLayerEditor;
import org.pepsoft.worldpainter.layers.CombinedLayer;
import org.pepsoft.worldpainter.layers.Layer;
import org.pepsoft.worldpainter.layers.LayerTableCellRenderer;
import org.pepsoft.worldpainter.layers.exporters.ExporterSettings;
import org.pepsoft.worldpainter.themes.JSpinnerTableCellEditor;
import org.pepsoft.worldpainter.themes.TerrainListCellRenderer;
import javax.swing.*;
import javax.swing.event.DocumentEvent;
import javax.swing.event.DocumentListener;
import javax.swing.table.TableColumn;
import java.awt.*;
import java.util.ArrayList;
import java.util.List;
import java.util.stream.Collectors;
import static org.pepsoft.worldpainter.layers.combined.CombinedLayerTableModel.COLUMN_FACTOR;
import static org.pepsoft.worldpainter.layers.combined.CombinedLayerTableModel.COLUMN_LAYER;
/**
*
* @author Pepijn Schmitz
*/
public class CombinedLayerEditor extends AbstractLayerEditor<CombinedLayer> {
/**
* Creates new form CombinedLayerEditor
*/
public CombinedLayerEditor() {
initComponents();
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 CombinedLayer createLayer() {
return new CombinedLayer("My Combined Layer", "A combined layer", Color.ORANGE.getRGB());
}
@Override
public void setLayer(CombinedLayer layer) {
super.setLayer(layer);
reset();
}
@Override
public void commit() {
if (! isCommitAvailable()) {
throw new IllegalStateException("Settings invalid or incomplete");
}
saveSettings(layer);
}
@Override
public void reset() {
tableModel = new CombinedLayerTableModel(layer.getLayers(), layer.getFactors());
tableModel.addTableModelListener(e -> settingsChanged());
configureTable();
comboBoxTerrain.setSelectedItem(layer.getTerrain());
fieldName.setText(layer.getName());
colourEditor1.setColour(layer.getColour());
comboBoxBiome.setSelectedItem(layer.getBiome());
settingsChanged();
}
@Override
public ExporterSettings getSettings() {
if (! isCommitAvailable()) {
throw new IllegalStateException("Settings invalid or incomplete");
}
final CombinedLayer previewLayer = saveSettings(null);
return new ExporterSettings() {
@Override
public boolean isApplyEverywhere() {
return false;
}
@Override
public CombinedLayer getLayer() {
return previewLayer;
}
@Override
public ExporterSettings clone() {
throw new UnsupportedOperationException("Not supported");
}
};
}
@Override
public void setContext(LayerEditorContext context) {
super.setContext(context);
CustomBiomeManager customBiomeManager = context.getCustomBiomeManager();
ColourScheme colourScheme = context.getColourScheme();
comboBoxTerrain.setRenderer(new TerrainListCellRenderer(colourScheme, "none"));
comboBoxBiome.setRenderer(new BiomeListCellRenderer(colourScheme, customBiomeManager, "none"));
List<Integer> allBiomes = new ArrayList<>();
allBiomes.add(-1);
for (int i = 0; i < Minecraft1_7Biomes.BIOME_NAMES.length; i++) {
if (Minecraft1_7Biomes.BIOME_NAMES[i] != null) {
allBiomes.add(i);
}
}
List<CustomBiome> customBiomes = customBiomeManager.getCustomBiomes();
if (customBiomes != null) {
allBiomes.addAll(customBiomes.stream().map(CustomBiome::getId).collect(Collectors.toList()));
}
comboBoxBiome.setModel(new DefaultComboBoxModel(allBiomes.toArray()));
allLayers = context.getAllLayers();
}
@Override
public boolean isCommitAvailable() {
boolean terrainSelected = comboBoxTerrain.getSelectedItem() != null;
boolean biomeSelected = (comboBoxBiome.getSelectedItem() != null) && ((Integer) comboBoxBiome.getSelectedItem() != -1);
int layersSelected = tableModel.getRowCount();
boolean nameEntered = ! fieldName.getText().trim().isEmpty();
return nameEntered
&& ((terrainSelected && biomeSelected)
|| ((terrainSelected || biomeSelected) && (layersSelected > 0))
|| (layersSelected > 1));
}
private void addLayer() {
List<Layer> availableLayers = new ArrayList<>(allLayers.size());
availableLayers.addAll(allLayers.stream().filter(availableLayer -> (!availableLayer.equals(layer)) && (!tableModel.contains(availableLayer))).collect(Collectors.toList()));
AddLayerDialog dialog = new AddLayerDialog(SwingUtilities.getWindowAncestor(this), availableLayers);
dialog.setVisible(true);
if (! dialog.isCancelled()) {
tableModel.addRow(new CombinedLayerTableModel.Row(dialog.getSelectedLayer(), dialog.getSelectedFactor(), dialog.isHiddenSelected()));
}
}
private void settingsChanged() {
context.settingsChanged();
}
private CombinedLayer saveSettings(CombinedLayer layer) {
if (layer == null) {
layer = createLayer();
}
layer.setName(fieldName.getText().trim());
layer.setBiome((Integer) comboBoxBiome.getSelectedItem());
layer.setTerrain((Terrain) comboBoxTerrain.getSelectedItem());
tableModel.saveSettings(layer);
layer.setColour(colourEditor1.getColour());
return layer;
}
private void configureTable() {
tableLayers.setModel(tableModel);
TableColumn layerColumn = tableLayers.getColumnModel().getColumn(COLUMN_LAYER);
JComboBox layerCellEditor = new JComboBox(allLayers.toArray());
layerCellEditor.setRenderer(new LayerListCellRenderer());
layerColumn.setCellEditor(new DefaultCellEditor(layerCellEditor));
layerColumn.setCellRenderer(new LayerTableCellRenderer());
SpinnerModel factorSpinnerModel = new SpinnerNumberModel(100, 1, 1500, 1);
tableLayers.getColumnModel().getColumn(COLUMN_FACTOR).setCellEditor(new JSpinnerTableCellEditor(factorSpinnerModel));
}
/**
* 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() {
jLabel1 = new javax.swing.JLabel();
jLabel2 = new javax.swing.JLabel();
comboBoxTerrain = new javax.swing.JComboBox();
jLabel3 = new javax.swing.JLabel();
comboBoxBiome = new javax.swing.JComboBox();
jLabel4 = new javax.swing.JLabel();
jScrollPane1 = new javax.swing.JScrollPane();
tableLayers = new javax.swing.JTable();
buttonAddLayer = new javax.swing.JButton();
jLabel5 = new javax.swing.JLabel();
fieldName = new javax.swing.JTextField();
jLabel6 = new javax.swing.JLabel();
colourEditor1 = new org.pepsoft.worldpainter.ColourEditor();
jLabel1.setText("Configure your combined layer on this screen.");
jLabel2.setText("Terrain:");
comboBoxTerrain.setModel(new DefaultComboBoxModel(Terrain.getConfiguredValues()));
comboBoxTerrain.addActionListener(this::comboBoxTerrainActionPerformed);
jLabel3.setText("Biome:");
comboBoxBiome.addActionListener(this::comboBoxBiomeActionPerformed);
jLabel4.setText("Layers:");
jScrollPane1.setViewportView(tableLayers);
buttonAddLayer.setText("Add");
buttonAddLayer.addActionListener(this::buttonAddLayerActionPerformed);
jLabel5.setText("Name:");
fieldName.setColumns(20);
jLabel6.setText("Colour:");
javax.swing.GroupLayout layout = new javax.swing.GroupLayout(this);
this.setLayout(layout);
layout.setHorizontalGroup(
layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
.addComponent(jScrollPane1, javax.swing.GroupLayout.PREFERRED_SIZE, 0, Short.MAX_VALUE)
.addComponent(jLabel1)
.addGroup(layout.createSequentialGroup()
.addComponent(jLabel2)
.addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
.addComponent(comboBoxTerrain, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE))
.addGroup(layout.createSequentialGroup()
.addComponent(jLabel3)
.addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
.addComponent(comboBoxBiome, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE))
.addComponent(jLabel4)
.addGroup(layout.createSequentialGroup()
.addComponent(jLabel5)
.addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
.addComponent(fieldName, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE))
.addGroup(layout.createSequentialGroup()
.addComponent(jLabel6)
.addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
.addComponent(colourEditor1, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE))
.addGroup(javax.swing.GroupLayout.Alignment.TRAILING, layout.createSequentialGroup()
.addGap(0, 0, Short.MAX_VALUE)
.addComponent(buttonAddLayer))
);
layout.setVerticalGroup(
layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
.addGroup(layout.createSequentialGroup()
.addComponent(jLabel1)
.addGap(18, 18, 18)
.addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE)
.addComponent(jLabel2)
.addComponent(comboBoxTerrain, 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(jLabel3)
.addComponent(comboBoxBiome, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE))
.addGap(18, 18, 18)
.addComponent(jLabel4)
.addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
.addComponent(jScrollPane1, javax.swing.GroupLayout.DEFAULT_SIZE, 26, Short.MAX_VALUE)
.addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
.addComponent(buttonAddLayer)
.addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
.addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE)
.addComponent(jLabel5)
.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.BASELINE)
.addComponent(jLabel6)
.addComponent(colourEditor1, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)))
);
}// </editor-fold>//GEN-END:initComponents
private void comboBoxTerrainActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_comboBoxTerrainActionPerformed
settingsChanged();
}//GEN-LAST:event_comboBoxTerrainActionPerformed
private void comboBoxBiomeActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_comboBoxBiomeActionPerformed
settingsChanged();
}//GEN-LAST:event_comboBoxBiomeActionPerformed
private void buttonAddLayerActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_buttonAddLayerActionPerformed
addLayer();
}//GEN-LAST:event_buttonAddLayerActionPerformed
// Variables declaration - do not modify//GEN-BEGIN:variables
private javax.swing.JButton buttonAddLayer;
private org.pepsoft.worldpainter.ColourEditor colourEditor1;
private javax.swing.JComboBox comboBoxBiome;
private javax.swing.JComboBox comboBoxTerrain;
private javax.swing.JTextField fieldName;
private javax.swing.JLabel jLabel1;
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.JScrollPane jScrollPane1;
private javax.swing.JTable tableLayers;
// End of variables declaration//GEN-END:variables
private CombinedLayerTableModel tableModel;
private List<Layer> allLayers;
private static final long serialVersionUID = 1L;
}