/*  GadTools layout toolkit
**
**  Copyright © 1993-1995 by Olaf `Olsen' Barthel
**  Freely distributable.
*/

#include "gtlayout_global.h"

STATIC LONG __stdargs
DefaultDispFunc(struct Gadget *gad,WORD value)
{
	return(value);
}


/*****************************************************************************/


VOID __stdargs
LTP_LevelWidth(LayoutHandle *handle,STRPTR levelFormat,LONG (* __stdargs dispFunc)(struct Gadget *,WORD),LONG min,LONG max,LONG *maxWidth,LONG *maxLen,BOOL fullCheck)
{
	UBYTE	buffer[80];
	LONG	localMaxWidth;
	LONG	localMaxLen;
	LONG	len;

	localMaxWidth	= 0;
	localMaxLen	= 0;

	if(handle)
	{
		if(!dispFunc)
			dispFunc = DefaultDispFunc;

		if(!levelFormat)
		{
			if(LocaleBase && LocaleBase -> lb_SysPatches)
				levelFormat = "%lD";
			else
				levelFormat = "%ld";
		}

		if(fullCheck)
		{
			LONG i;

			for(i = min ; i <= max ; i++)
			{
				sprintf(buffer,levelFormat,(*dispFunc)(NULL,i));

				len = strlen(buffer);

				if(len > localMaxLen)
					localMaxLen = len;

				len = TextLength(&handle -> RPort,buffer,len);

				if(len > localMaxWidth)
					localMaxWidth = len;

//				kprintf("i=%3ld len=%3ld width=%3ld |%s|\n",i,localMaxLen,localMaxWidth,buffer);
			}
		}
		else
		{
			sprintf(buffer,levelFormat,(*dispFunc)(NULL,min));

			len = strlen(buffer);

			if(len > localMaxLen)
				localMaxLen = len;

			len = TextLength(&handle -> RPort,buffer,len);

			if(len > localMaxWidth)
				localMaxWidth = len;

//			kprintf("i=%3ld len=%3ld width=%3ld |%s|\n",min,localMaxLen,localMaxWidth,buffer);

			sprintf(buffer,levelFormat,(*dispFunc)(NULL,max));

			len = strlen(buffer);

			if(len > localMaxLen)
				localMaxLen = len;

			len = TextLength(&handle -> RPort,buffer,len);

			if(len > localMaxWidth)
				localMaxWidth = len;

//			kprintf("i=%3ld len=%3ld width=%3ld |%s|\n",max,localMaxLen,localMaxWidth,buffer);
		}
	}

	if(maxLen)
		*maxLen = localMaxLen;

	if(maxWidth)
		*maxWidth = localMaxWidth + handle -> GlyphWidth;
}


/*****************************************************************************/


VOID LIBENT
LT_LevelWidth(REG(a0) LayoutHandle *handle,REG(a1) STRPTR levelFormat,REG(a2) DISPFUNC dispFunc,REG(d0) LONG min,REG(d1) LONG max,REG(a3) LONG *maxWidth,REG(a5) LONG *maxLen,REG(d2) BOOL fullCheck)
{
	LTP_LevelWidth(handle,levelFormat,(LONG (* __stdargs)(struct Gadget *,WORD))dispFunc,min,max,maxWidth,maxLen,fullCheck);
}

VOID LIBENT
LT_NewLevelWidth(REG(a0) LayoutHandle *handle,REG(a1) STRPTR levelFormat,REG(a2) DISPFUNC dispFunc,REG(d0) LONG min,REG(d1) LONG max,REG(a3) LONG *maxWidth,REG(d3) LONG *maxLen,REG(d2) BOOL fullCheck)
{
	LTP_LevelWidth(handle,levelFormat,(LONG (* __stdargs)(struct Gadget *,WORD))dispFunc,min,max,maxWidth,maxLen,fullCheck);
}
