/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */

package usda.weru.gis.gui;

import javax.swing.table.AbstractTableModel;
import org.geotools.map.MapContext;
import org.geotools.map.MapLayer;
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{
    final MapContext c_context;

    public LayerTableModel(MapContext context){
        c_context = context;
        c_context.addMapLayerListListener(this);
    }



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

    public void layerRemoved(MapLayerListEvent event) {
        fireTableRowsDeleted(invertIndex(event.getFromIndex()), invertIndex(event.getToIndex()));
    }

    public void layerChanged(MapLayerListEvent event) {
        fireTableRowsUpdated(invertIndex(event.getFromIndex()), invertIndex(event.getToIndex()));
    }

    public void layerMoved(MapLayerListEvent event) {
        fireTableDataChanged();
    }
    //end layer events

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

    public int getRowCount() {
        return c_context.getLayerCount();
    }

    public int getColumnCount() {
        return 2;
    }

    public MapLayer getLayer(int rowIndex){
        return c_context.getLayer(invertIndex(rowIndex));
    }

    public Object getValueAt(int rowIndex, int columnIndex) {
        MapLayer layer = getLayer(rowIndex);
        if(layer == null){
            return null;
        }
        switch(columnIndex){
            case 0:
                return layer.isVisible();
            case 1:
                return layer.getTitle();
            default:
                return null;
        }

    }

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

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





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

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






    

}
