/*
* 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.tunnel;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import javax.swing.JLabel;
import javax.swing.event.TableModelEvent;
import javax.swing.event.TableModelListener;
import javax.swing.table.TableModel;
import org.pepsoft.util.MathUtils;
import org.pepsoft.worldpainter.NoiseSettings;
import org.pepsoft.worldpainter.layers.Layer;
/**
*
* @author SchmitzP
*/
public class TunnelFloorLayersTableModel implements TableModel {
public TunnelFloorLayersTableModel(Map<Layer, TunnelLayer.LayerSettings> settings, int maxHeight) {
this.maxHeight = maxHeight;
if (settings != null) {
for (Map.Entry<Layer, TunnelLayer.LayerSettings> entry: settings.entrySet()) {
layers.add(entry.getKey());
this.settings.put(entry.getKey(), entry.getValue().clone());
}
}
}
public void addLayer(Layer layer) {
if (! layers.contains(layer)) {
layers.add(layer);
settings.put(layer, new TunnelLayer.LayerSettings());
int row = layers.size() - 1;
TableModelEvent event = new TableModelEvent(this, row, row, TableModelEvent.ALL_COLUMNS, TableModelEvent.INSERT);
for (TableModelListener listener: listeners) {
listener.tableChanged(event);
}
}
}
public Layer getLayer(int row) {
return layers.get(row);
}
public void removeLayer(int row) {
Layer layer = layers.remove(row);
settings.remove(layer);
TableModelEvent event = new TableModelEvent(this, row, row, TableModelEvent.ALL_COLUMNS, TableModelEvent.DELETE);
for (TableModelListener listener: listeners) {
listener.tableChanged(event);
}
}
public void layerChanged(int row) {
TableModelEvent event = new TableModelEvent(this, row);
for (TableModelListener listener: listeners) {
listener.tableChanged(event);
}
}
public Map<Layer, TunnelLayer.LayerSettings> getLayers() {
return settings;
}
// TableModel
@Override
public int getRowCount() {
return layers.size();
}
@Override
public int getColumnCount() {
return COLUMN_NAMES.length;
}
@Override
public String getColumnName(int index) {
return COLUMN_NAMES[index];
}
@Override
public Class<?> getColumnClass(int index) {
return COLUMN_TYPES[index];
}
@Override
public boolean isCellEditable(int row, int column) {
return (column != COLUMN_NAME);
}
@Override
public Object getValueAt(int row, int column) {
Layer layer = layers.get(row);
switch (column) {
case COLUMN_NAME:
return layer;
case COLUMN_INTENSITY:
TunnelLayer.LayerSettings layerSettings = settings.get(layer);
return layerSettings.getIntensity();
case COLUMN_VARIATION:
layerSettings = settings.get(layer);
return layerSettings.getVariation();
case COLUMN_MIN_LEVEL:
layerSettings = settings.get(layer);
return layerSettings.getMinLevel();
case COLUMN_MAX_LEVEL:
layerSettings = settings.get(layer);
return layerSettings.getMaxLevel();
default:
throw new IndexOutOfBoundsException("column: " + column);
}
}
@Override
public void setValueAt(Object value, int row, int column) {
Layer layer = layers.get(row);
TunnelLayer.LayerSettings layerSettings = settings.get(layer);
switch (column) {
case COLUMN_INTENSITY:
layerSettings.setIntensity(MathUtils.clamp(0, (Integer) value, 100));
break;
case COLUMN_VARIATION:
layerSettings.setVariation((NoiseSettings) value);
break;
case COLUMN_MIN_LEVEL:
layerSettings.setMinLevel(MathUtils.clamp(0, (Integer) value, layerSettings.getMaxLevel()));
break;
case COLUMN_MAX_LEVEL:
layerSettings.setMaxLevel(MathUtils.clamp(layerSettings.getMinLevel(), (Integer) value, maxHeight - 1));
break;
default:
throw new IndexOutOfBoundsException("column: " + column);
}
}
@Override
public void addTableModelListener(TableModelListener listener) {
if (! listeners.contains(listener)) {
listeners.add(listener);
}
}
@Override
public void removeTableModelListener(TableModelListener listener) {
listeners.remove(listener);
}
private final List<Layer> layers = new ArrayList<>();
private final Map<Layer, TunnelLayer.LayerSettings> settings = new HashMap<>();
private final List<TableModelListener> listeners = new ArrayList<>();
private final int maxHeight;
public static final int COLUMN_NAME = 0;
public static final int COLUMN_INTENSITY = 1;
public static final int COLUMN_VARIATION = 2;
public static final int COLUMN_MIN_LEVEL = 3;
public static final int COLUMN_MAX_LEVEL = 4;
private static final String[] COLUMN_NAMES = {"Layer", "Intensity", "Variation", "Minimum level", "Maximum level"};
private static final Class[] COLUMN_TYPES = {JLabel.class, Integer.class, NoiseSettings.class, Integer.class, Integer.class};
}