/* * 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.simple; import java.util.ArrayList; import java.util.HashMap; import java.util.Iterator; import java.util.List; import java.util.Map; import javax.swing.JButton; 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 pepijn */ public class LayerRangesTableModel implements TableModel { public LayerRangesTableModel(int maxHeight, Map<Filter, Layer> layerMap) { this.maxHeight = maxHeight; if (layerMap != null) { layerMap.forEach((key, value) -> { filters.add(key); layers.add(value); }); } } public Map<Filter, Layer> getLayerMap() { if (! layers.isEmpty()) { Map<Filter, Layer> layerMap = new HashMap<>(); Iterator<Filter> filterIterator = filters.iterator(); for (Layer layer : layers) { Filter filter = filterIterator.next(); layerMap.put(filter, layer); } return layerMap; } else { return null; } } public void addRow(Filter filter, Layer layer) { filters.add(filter); layers.add(layer); int index = filters.size() - 1; TableModelEvent event = new TableModelEvent(this, index, index, TableModelEvent.ALL_COLUMNS, TableModelEvent.INSERT); listeners.forEach(listener -> listener.tableChanged(event)); } public void deleteRow(int row) { layers.remove(row); filters.remove(row); TableModelEvent event = new TableModelEvent(this, row, row, TableModelEvent.ALL_COLUMNS, TableModelEvent.DELETE); listeners.forEach(listener -> listener.tableChanged(event)); } // TableModel @Override public int getRowCount() { return filters.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 columnIndex != COLUMN_LAYER; } @Override public Object getValueAt(int rowIndex, int columnIndex) { switch (columnIndex) { case COLUMN_FROM: return ((HeightFilter) filters.get(rowIndex)).getStartHeight(); case COLUMN_TO: return ((HeightFilter) filters.get(rowIndex)).getStopHeight(); case COLUMN_FEATHER: return ((HeightFilter) filters.get(rowIndex)).isFeather(); case COLUMN_LAYER: return layers.get(rowIndex); case COLUMN_ACTIONS: return deleteButton; default: throw new IndexOutOfBoundsException("columnIndex " + columnIndex); } } @Override public void setValueAt(Object aValue, int rowIndex, int columnIndex) { switch (columnIndex) { case COLUMN_FROM: HeightFilter old = (HeightFilter) filters.get(rowIndex); filters.set(rowIndex, new HeightFilter(maxHeight, (int) aValue, old.getStopHeight(), old.isFeather())); break; case COLUMN_TO: old = (HeightFilter) filters.get(rowIndex); filters.set(rowIndex, new HeightFilter(maxHeight, old.getStartHeight(), (int) aValue, old.isFeather())); break; case COLUMN_FEATHER: old = (HeightFilter) filters.get(rowIndex); filters.set(rowIndex, new HeightFilter(maxHeight, old.getStartHeight(), old.getStopHeight(), (boolean) aValue)); break; case COLUMN_LAYER: throw new IllegalArgumentException("columnIndex " + columnIndex + " not editable"); case COLUMN_ACTIONS: // Do nothing 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<Filter> filters = new ArrayList<>(); private final List<Layer> layers = new ArrayList<>(); private final int maxHeight; private final List<TableModelListener> listeners = new ArrayList<>(); private final JButton deleteButton = new JButton("Delete"); private static final String[] COLUMN_NAMES = {"From", "To", "Feather", "Layer", "Actions"}; private static final Class[] COLUMN_TYPES = {Integer.class, Integer.class, Boolean.class, Layer.class, JButton.class}; private static final int COLUMN_FROM = 0; private static final int COLUMN_TO = 1; private static final int COLUMN_FEATHER = 2; private static final int COLUMN_LAYER = 3; private static final int COLUMN_ACTIONS = 4; }