/**
 * fillbar.m
 *
 * Manages custom fillbars.
 *
 * @package	com.winamp.maki.lib.community.fillbar
 * @author	mpdeimos
 * @date	08/10/01
 * @version	1.0
 */

#ifndef included
#error This script can only be compiled as a #include
#endif

Class Layer FillBar;
// {
	Member Map FillBar.fillmap;
	Member int FillBar.pos;
	Member boolean Fillbar.reverse;

	// User dragging stuff
	Member boolean Fillbar.dragable;
	Member boolean Fillbar.dragging;

	/**
	 * constructor
	 * 
	 * @param layer that should be handled like a fillbar
	 * @param bitmapID that should be used as region map
	 * @ret FillBar object
	 */
	Function FillBar FillBar_construct(Layer l, String bitmapID);
	Function FillBar_setMap(FillBar fb, String bitmapID);

	/**
	 * destructor, always call on script unloading
	 * 
	 */
	Function FillBar_destruct(FillBar fb);

	/**
	 * sets the region
	 * 
	 * @param fillbar to act on
	 * @param threshold of the map to generate a region
	 */
	Function FillBar_setPosition(FillBar fb, int threshold);

	/**
	 * called each time the users drags the fillbar
	 * 
	 * @param The dragged FillBar
	 * @param The alue the FillBar was dragged to.
	 * @ret FALSE if you do not want to allow dragging.
	 */
	Function boolean FillBar_onDrag(FillBar fb, int pos);

	/*
	 * called each time the users ends dragging the fillbar
	 * 
	 * @param The dragged FillBar
	 * @param The alue the FillBar was dragged to.
	 * @ret FALSE if you do not want to allow dragging.
	 */
	Function boolean FillBar_onEndDrag(FillBar fb, int pos);


	/*
	 * IMPLEMENTATION
	 */

	FillBar FillBar_construct(Layer l, String bitmapID)
	{
		FillBar fb = l;
		fb.reverse = TRUE;
		fb.fillmap = new Map;
		fb.fillmap.loadMap(bitmapID);
		return fb;
	}

	FillBar_setMap(Fillbar fb, String bitmapID)
	{
		if (fb.fillmap != NULL)
		{
			delete fb.fillmap;
		}
		
		fb.fillmap = new Map;
		fb.fillmap.loadMap(bitmapID);
	}

	FillBar_destruct(FillBar fb)
	{
		Map tmp = fb.fillmap;
		delete tmp;
	}

	FillBar_setPosition(FillBar fb, int threshold)
	{
		fb.pos = threshold;
		fb.setRegionFromMap(fb.fillmap, threshold, fb.reverse);
	}


	// User dragging handles

	FillBar.onLeftButtonDown (int x, int y)
	{
		if (!FillBar.dragable)
		{
			return;
		}
		
		Fillbar.dragging = TRUE;
	}

	FillBar.onMouseMove (int x, int y)
	{
		if (!FillBar.dragable || !Fillbar.dragging)
		{
			return;
		}

		int mouseLeft = x - FillBar.getLeft();
		int mouseTop = y - Fillbar.getTop();

		if (!FillBar.fillMap.inRegion(mouseLeft, mouseTop))
		{
			return;
		}
		
		int position = FillBar.fillMap.getValue(mouseLeft, mouseTop);

		int update = FillBar_onDrag(FillBar, position);
		
		if (update)
		{
			FillBar_setPosition(FillBar, position);
		}
	}
	
	Fillbar.onLeftButtonUp (int x, int y)
	{
		if (!FillBar.dragable || !Fillbar.dragging)
		{
			return;
		}

		int mouseLeft = x - FillBar.getLeft();
		int mouseTop = y - Fillbar.getTop();

		int position = FillBar.fillMap.getValue(mouseLeft, mouseTop);

		if (!FillBar.fillMap.inRegion(mouseLeft, mouseTop))
		{
			position = fb.pos;
		}

		int update = FillBar_onEndDrag(FillBar, position);
		
		if (update)
		{
			FillBar_setPosition(FillBar, position);
		}

		Fillbar.dragging = FALSE;
	}
	
	// Callback Stubs
	boolean FillBar_onDrag(Fillbar fb, int pos) {  return TRUE; }
	boolean FillBar_onEndDrag(Fillbar fb, int pos) { return TRUE; }
// }