package usda.weru.gis.gui;

import javax.swing.table.AbstractTableModel;
import org.geotools.map.MapContent;
import org.geotools.map.Layer;
import org.geotools.map.event.MapLayerListEvent;
import org.geotools.map.event.MapLayerListListener;

/**
 *
 * @author Joseph A. Levin <joelevin@weru.ksu.edu>
 */
public class LayerTableModel extends AbstractTableModel implements MapLayerListListener {

    private static final long serialVersionUID = 1L;

    final MapContent c_content;

    /**
     *
     * @param content
     */
    public LayerTableModel(MapContent content) {
        c_content = content;
        c_content.addMapLayerListListener(this);
    }

    //map layer events
    /**
     *
     * @param event
     */
    @Override
    public void layerAdded(MapLayerListEvent event) {
        fireTableRowsInserted(invertIndex(event.getFromIndex()), invertIndex(event.getToIndex()));
    }

    /**
     *
     * @param event
     */
    @Override
    public void layerRemoved(MapLayerListEvent event) {
        fireTableRowsDeleted(invertIndex(event.getFromIndex()), invertIndex(event.getToIndex()));
    }

    /**
     *
     * @param event
     */
    @Override
    public void layerChanged(MapLayerListEvent event) {
        fireTableRowsUpdated(invertIndex(event.getFromIndex()), invertIndex(event.getToIndex()));
    }

    /**
     *
     * @param event
     */
    @Override
    public void layerMoved(MapLayerListEvent event) {
        fireTableDataChanged();
    }
    //end layer events

    private int invertIndex(int index) {
        return getRowCount() - 1 - index;
    }

    /**
     *
     * @return
     */
    @Override
    public int getRowCount() {
        return c_content.layers().size();
    }

    /**
     *
     * @return
     */
    @Override
    public int getColumnCount() {
        return 2;
    }

    /**
     *
     * @param rowIndex
     * @return
     */
    public Layer getLayer(int rowIndex) {
        return c_content.layers().get(invertIndex(rowIndex));
    }

    /**
     *
     * @param rowIndex
     * @param columnIndex
     * @return
     */
    @Override
    public Object getValueAt(int rowIndex, int columnIndex) {
        Layer layer = getLayer(rowIndex);
        if (layer == null) {
            return null;
        }
        switch (columnIndex) {
            case 0:
                return layer.isVisible();
            case 1:
                return layer.getTitle();
            default:
                return null;
        }

    }

    /**
     *
     * @param aValue
     * @param rowIndex
     * @param columnIndex
     */
    @Override
    public void setValueAt(Object aValue, int rowIndex, int columnIndex) {
        switch (columnIndex) {
            case 0:
                boolean value = false;
                if (aValue instanceof Boolean) {
                    value = (Boolean) aValue;
                }
                Layer layer = getLayer(rowIndex);
                if (layer == null) {
                    return;
                }
                layer.setVisible(value);
                break;
            default:
        }
    }

    /**
     *
     * @param columnIndex
     * @return
     */
    @Override
    public String getColumnName(int columnIndex) {
        switch (columnIndex) {
            case 0:
                return "Visible";
            case 1:
                return "Layer";
            default:
                return null;
        }
    }

    /**
     *
     * @param columnIndex
     * @return
     */
    @Override
    public Class<?> getColumnClass(int columnIndex) {
        switch (columnIndex) {
            case 0:
                return Boolean.class;
            case 1:
                return String.class;
            default:
                return super.getColumnClass(columnIndex);
        }
    }

    /**
     *
     * @param rowIndex
     * @param columnIndex
     * @return
     */
    @Override
    public boolean isCellEditable(int rowIndex, int columnIndex) {
        return columnIndex == 0;
    }

    @Override
    public void layerPreDispose(MapLayerListEvent arg0) {

    }

}
