/* * To change this template, choose Tools | Templates * and open the template in the editor. */ package org.pepsoft.worldpainter.layers.combined; import java.util.ArrayList; import java.util.HashMap; import java.util.List; import java.util.Map; import java.util.stream.Collectors; import javax.swing.event.TableModelEvent; import javax.swing.event.TableModelListener; import javax.swing.table.TableModel; import org.pepsoft.worldpainter.layers.CombinedLayer; import org.pepsoft.worldpainter.layers.CustomLayer; import org.pepsoft.worldpainter.layers.Layer; /** * * @author pepijn */ public class CombinedLayerTableModel implements TableModel { public CombinedLayerTableModel(List<Layer> layers, Map<Layer, Float> factors) { rows = new ArrayList<>(layers.size()); rows.addAll(layers.stream().map(layer -> new Row(layer, (int) (factors.get(layer) * 100 + 0.5f), ((layer instanceof CustomLayer) ? ((CustomLayer) layer).isHide() : false))).collect(Collectors.toList())); } void addRow(Row row) { rows.add(row); TableModelEvent event = new TableModelEvent(this, rows.size() - 1, rows.size() - 1, TableModelEvent.ALL_COLUMNS, TableModelEvent.INSERT); for (TableModelListener listener: listeners) { listener.tableChanged(event); } } void deleteRow(int rowIndex) { rows.remove(rowIndex); TableModelEvent event = new TableModelEvent(this, rowIndex, rowIndex, TableModelEvent.ALL_COLUMNS, TableModelEvent.DELETE); for (TableModelListener listener: listeners) { listener.tableChanged(event); } } void saveSettings(CombinedLayer layer) { List<Layer> layers = new ArrayList<>(rows.size()); Map<Layer, Float> factors = new HashMap<>(); for (Row row: rows) { layers.add(row.layer); if (row.layer instanceof CustomLayer) { ((CustomLayer) row.layer).setHide(row.hide); } factors.put(row.layer, row.factor / 100f); } layer.setLayers(layers); layer.setFactors(factors); } boolean contains(Layer layer) { for (Row row: rows) { if (row.layer.equals(layer)) { return true; } } return false; } // TableModel @Override public int getRowCount() { return rows.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) { Row row = rows.get(rowIndex); switch (columnIndex) { case COLUMN_LAYER: return row.layer; case COLUMN_FACTOR: return row.factor; case COLUMN_HIDE: return row.hide; default: throw new IndexOutOfBoundsException("columnIndex " + columnIndex); } } @Override public void setValueAt(Object aValue, int rowIndex, int columnIndex) { Row row = rows.get(rowIndex); switch (columnIndex) { case COLUMN_LAYER: row.layer = (Layer) aValue; break; case COLUMN_FACTOR: row.factor = (Integer) aValue; break; case COLUMN_HIDE: row.hide = (Boolean) aValue; break; default: throw new IndexOutOfBoundsException("columnIndex " + columnIndex); } } @Override public void addTableModelListener(TableModelListener l) { listeners.add(l); } @Override public void removeTableModelListener(TableModelListener l) { listeners.remove(l); } private final List<Row> rows; private final List<TableModelListener> listeners = new ArrayList<>(); public static final int COLUMN_LAYER = 0; public static final int COLUMN_FACTOR = 1; public static final int COLUMN_HIDE = 2; private static final String[] COLUMN_NAMES = {"Layer", "Factor", "Hidden"}; private static final Class<?>[] COLUMN_TYPES = {String.class, Integer.class, Boolean.class}; static class Row { Row(Layer layer, int factor, boolean hide) { this.layer = layer; this.factor = factor; this.hide = hide; } Layer layer; int factor; boolean hide; } }