package cnp.ew.scrolling;

import cnp.ew.util.*;
import java.awt.*;
import cnp.ew.button.*;
import cnp.ew.image.*;
import cnp.ew.layout.*;
import cnp.ew.lightweight.*;
import cnp.ew.displayer.*;
import cnp.ew.slider.*;

public class CpScrollbarLc extends CpAbstractLc implements CpObserver
{

    public static final int VERTICAL = 1;
    public static final int HORIZONTAL = 0;

    CpLabeledImageButtonLc upButton, downButton;
    CpScrollbarSliderLc slider;
    int position;
    int orientation;

    static int downArrowId;
    static int upArrowId;
    static int leftArrowId;
    static int rightArrowId;

    static {
        downArrowId = CpToolkit.registerImageName("darrow12.gif");
        upArrowId = CpToolkit.registerImageName("uarrow12.gif");
        leftArrowId = CpToolkit.registerImageName("larrow12.gif");
        rightArrowId = CpToolkit.registerImageName("rarrow12.gif");
    }

    public CpScrollbarLc(int newOrientation)
    {
        super();

        orientation = newOrientation;
        upButton = new CpLabeledImageButtonLc();
        ((CpButtonBorderDisplayer)upButton.getBorderDisplayer()).setReverse3D(true);
        upButton.setUsesFocus(false);
        downButton = new CpLabeledImageButtonLc();
        ((CpButtonBorderDisplayer)downButton.getBorderDisplayer()).setReverse3D(true);
        downButton.setUsesFocus(false);
        add(downButton);
        downButton.addObserver(this);
        add(upButton);
        upButton.addObserver(this);

        slider = new CpScrollbarSliderLc(orientation);
        slider.setUsesFocus(false);
        add(slider);
        slider.addObserver(this);

        if (orientation == VERTICAL) {
            upButton.setImage(CpToolkit.getImage(upArrowId), CpLabeledImageButtonLc.IMAGE_OUT);
            downButton.setImage(CpToolkit.getImage(downArrowId), CpLabeledImageButtonLc.IMAGE_OUT);
        } else {
            upButton.setImage(CpToolkit.getImage(leftArrowId), CpLabeledImageButtonLc.IMAGE_OUT);
            downButton.setImage(CpToolkit.getImage(rightArrowId), CpLabeledImageButtonLc.IMAGE_OUT);
        }
    }

    public void layout()
    {
        Dimension size = size();

        if (orientation == VERTICAL) {
            upButton.reshape(0, 0, size.width, size.width);
            downButton.reshape(0, 0 + size.height - size.width, size.width, size.width);
            slider.reshape(0, 0 + size.width, size.width, size.height - size.width - size.width);
        } else {
            upButton.reshape(0, 0, size.height, size.height);
            downButton.reshape(0 + size.width - size.height, 0, size.height, size.height);
            slider.reshape(0 + size.height, 0, size.width - size.height - size.height, size.height);
        }
    }

    public int getValue()
    {
        return slider.getValue();
    }

    public void setValues(int scrollerExtent, int scrollableExtent, int scrollablePosition)
    {
        slider.setValues(scrollablePosition, scrollerExtent, scrollableExtent);
        position = scrollablePosition;
    }

    public void update(CpObservable o, int facet, Object arg)
    {

	    if (o == upButton || o == downButton || o == slider) {
	        if (facet == BUTTON_PRESSING) {
	            if (o == upButton) {
	                slider.moveBy(-1);
	            } else {
	                slider.moveBy(1);
    	        }
    	    }
    	    if (facet == START_DRAG_SCROLL || facet == END_DRAG_SCROLL) {
    	        // Pass along
    	        notifyObservers(facet);
    	    }
            if (slider.getValue() != position) {
                position = slider.getValue();
                if (facet == SLIDER_DRAGGING) {
                    notifyObservers(OBJECT_CHANGING, new Integer(position));
        	    } else {
                    notifyObservers(OBJECT_CHANGED, new Integer(position));
        	    }
    	    }
    	}
	}


	public Dimension preferredSize()
	{
	    return new Dimension(16, 16);
	}
}