package cnp.ew.spin;

import cnp.ew.util.*;
import java.util.*;
import cnp.ew.displayer.*;
import cnp.ew.converter.*;
import java.awt.*;
import cnp.ew.lightweight.*;

abstract public class CpAbstractSpinFieldLc extends CpAbstractLc
implements CpSpinFieldLc
{

        // Does the actual displaying of the object
    CpModelSelectableDisplayable displayer;

    // Converts the object into a string
    CpToStringConverter converter;

    public CpSpinEditorLc getSpinEditor()
    {
        return (CpSpinEditorLc)getParent();
    }

    public void update(CpObservable o, int facet, Object arg)
    {
        getDisplayer().setModel((Object)getConverter().convert(getSpinEditor().getModel()));
        repaint();
    }

    public void paint(Graphics g, Rectangle clipRect)
    {
        Rectangle clientRect = getClientRect();
        getDisplayer().paintIn(this, g, clientRect.x, clientRect.y, clientRect.width, clientRect.height);
    }

    public boolean mouseDown(Event e, int x, int y)
    {
        requestFocus();
        if (getSpinEditor() != null) {
            getSpinEditor().setSelectedField(this);
        }
        return false;
    }

    public CpToStringConverter getConverter()
    {
        if (converter == null) {
            converter = buildConverter();
        }
        return converter;
    }

    public CpModelSelectableDisplayable getDisplayer()
    {
        if (displayer == null) {
            displayer = buildDisplayer();
        }
        return displayer;
    }


    abstract public void increment();
    abstract public void decrement();
    abstract public boolean canIncrementAndDecrement();
    abstract public CpToStringConverter buildConverter();
    abstract public CpModelSelectableDisplayable buildDisplayer();
}


