package plab.prefuseTests;

import java.util.Map;
import prefuse.action.assignment.*;
import prefuse.Constants;
import prefuse.data.tuple.TupleSet;
import prefuse.util.DataLib;
import prefuse.util.StrokeLib;
import prefuse.visual.VisualItem;
import java.awt.BasicStroke;

public class DataStrokeAction extends StrokeAction {

    protected String m_dataField;
    protected int[]  m_palette;

    protected Map    m_ordinalMap;
    protected static BasicStroke defaultStroke = StrokeLib.getStroke(1.0f);

    /**
     * Create a new DataShapeAction.
     * @param group the data group to process
     * @param field the data field to base shape assignments on
     */
    public DataStrokeAction(String group, String field) {
        super(group, defaultStroke);
        m_dataField = field;
    }

    /**
     * Create a new DataShapeAction.
     * @param group the data group to process
     * @param field the data field to base shape assignments on
     * @param palette a palette of shape values to use for the encoding.
     * By default, shape values are assumed to be one of the integer SHAPE
     * codes included in the {@link prefuse.Constants} class.
     */
    public DataStrokeAction(String group, String field, int[] palette) {
        super(group, defaultStroke);
        m_dataField = field;
        m_palette = palette;
    }

    // ------------------------------------------------------------------------

    /**
     * Returns the data field used to encode shape values.
     * @return the data field that is mapped to shape values
     */
    public String getDataField() {
        return m_dataField;
    }

    /**
     * Set the data field used to encode shape values.
     * @param field the data field to map to shape values
     */
    public void setDataField(String field) {
        m_dataField = field;
    }

    /**
     * This operation is not supported by the DataShapeAction type.
     * Calling this method will result in a thrown exception.
     * @see prefuse.action.assignment.ShapeAction#setDefaultShape(int)
     * @throws UnsupportedOperationException
     */
    public void setDefaultStroke(int defaultShape) {
        throw new UnsupportedOperationException();
    }

    // ------------------------------------------------------------------------

    /**
     * @see prefuse.action.EncoderAction#setup()
     */
    protected void setup() {
        TupleSet ts = m_vis.getGroup(m_group);
        m_ordinalMap = DataLib.ordinalMap(ts, m_dataField);
    }

    /**
     * @see prefuse.action.assignment.ShapeAction#getShape(prefuse.visual.VisualItem)
     */
    public BasicStroke getStroke(VisualItem item) {
        // check for any cascaded rules first
    	BasicStroke  shape = super.getStroke(item);
        if ( shape != defaultStroke ) {
            return shape;
        }

        // otherwise perform data-driven assignment
        Object v = item.get(m_dataField);
        float idx = item.getFloat(m_dataField) + 1;
       // System.out.println("idx:" + idx);
        return new BasicStroke(idx);
    }
}