/*
* 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.themes.impl.fancy;
import java.util.ArrayList;
import java.util.List;
import java.util.Map;
import javax.swing.event.TableModelEvent;
import javax.swing.event.TableModelListener;
import javax.swing.table.TableModel;
import org.pepsoft.worldpainter.layers.Layer;
import org.pepsoft.worldpainter.themes.Filter;
import org.pepsoft.worldpainter.themes.HeightFilter;
/**
*
* @author SchmitzP
*/
public class LayerMapTableModel implements TableModel {
public LayerMapTableModel(int maxHeight, Map<Filter, Layer> layerMap) {
this.maxHeight = maxHeight;
filters = new ArrayList<>(layerMap.size());
layers = new ArrayList<>(layerMap.size());
for (Map.Entry<Filter, Layer> entry: layerMap.entrySet()) {
filters.add((HeightFilter) entry.getKey());
layers.add(entry.getValue());
}
}
@Override
public int getRowCount() {
return layers.size();
}
@Override
public int getColumnCount() {
return COLUMN_NAMES.length;
}
@Override
public String getColumnName(int columnIndex) {
return COLUMN_NAMES[columnIndex];
}
@Override
public Class<?> getColumnClass(int columnIndex) {
return COLUMN_TYPES[columnIndex];
}
@Override
public boolean isCellEditable(int rowIndex, int columnIndex) {
return true;
}
@Override
public Object getValueAt(int rowIndex, int columnIndex) {
switch (columnIndex) {
case COLUMN_LAYER:
return layers.get(rowIndex);
case COLUMN_FROM:
return filters.get(rowIndex).getStartHeight();
case COLUMN_TO:
return filters.get(rowIndex).getStopHeight();
case COLUMN_FEATHER:
return filters.get(rowIndex).isFeather();
default:
throw new IndexOutOfBoundsException("columnIndex " + columnIndex);
}
}
@Override
public void setValueAt(Object aValue, int rowIndex, int columnIndex) {
switch (columnIndex) {
case COLUMN_LAYER:
layers.set(rowIndex, (Layer) aValue);
break;
case COLUMN_FROM:
HeightFilter oldFilter = filters.get(rowIndex);
filters.set(rowIndex, new HeightFilter(maxHeight, (Integer) aValue, oldFilter.getStopHeight(), oldFilter.isFeather()));
break;
case COLUMN_TO:
oldFilter = filters.get(rowIndex);
filters.set(rowIndex, new HeightFilter(maxHeight, oldFilter.getStartHeight(), (Integer) aValue, oldFilter.isFeather()));
break;
case COLUMN_FEATHER:
oldFilter = filters.get(rowIndex);
filters.set(rowIndex, new HeightFilter(maxHeight, oldFilter.getStartHeight(), oldFilter.getStopHeight(), (Boolean) aValue));
break;
default:
throw new IndexOutOfBoundsException("columnIndex " + columnIndex);
}
TableModelEvent event = new TableModelEvent(this, rowIndex, rowIndex, columnIndex);
for (TableModelListener listener: listeners) {
listener.tableChanged(event);
}
}
@Override
public void addTableModelListener(TableModelListener l) {
listeners.add(l);
}
@Override
public void removeTableModelListener(TableModelListener l) {
listeners.add(l);
}
private final int maxHeight;
private final List<HeightFilter> filters;
private final List<Layer> layers;
private final List<TableModelListener> listeners = new ArrayList<>();
private static final String[] COLUMN_NAMES = {"Layer", "From", "To", "Feather"};
private static final Class[] COLUMN_TYPES = {Layer.class, Integer.class, Integer.class, Boolean.class};
private static final int COLUMN_LAYER = 0;
private static final int COLUMN_FROM = 1;
private static final int COLUMN_TO = 2;
private static final int COLUMN_FEATHER = 3;
}