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

#include "gtlayout_global.h"

#ifdef DO_PASSWORD_KIND
ULONG __asm __saveds
LTP_PasswordEditRoutine(register __a0 struct Hook *Hook,register __a2 struct SGWork *Work,register __a1 ULONG *Msg)
{
	ObjectNode *Node;

	if(GETOBJECT(Work -> Gadget,Node))
	{
		STRPTR	Buffer		= Node -> Special . String . RealString;
		STRPTR	Original	= Node -> Special . String . Original;
		WORD	Len;

		if(Work -> IEvent -> ie_Code == 0x5F)
		{
			LayoutHandle *Handle = Hook -> h_Data;

			if(Handle -> HelpHook)
			{
				Work -> Code	= 0x5F;
				Work -> Actions	= (Work -> Actions & ~SGA_BEEP) | SGA_END | SGA_USE;

				return(TRUE);
			}
		}

		switch(*Msg)
		{
			case SGH_KEY:

				switch(Work -> EditOp)
				{
					case EO_INSERTCHAR:

						Buffer[Work -> BufferPos - 1]	= Work -> Code;
						Buffer[Work -> NumChars]		= 0;

						Work -> Code = (WORD)'·';

						Work -> WorkBuffer[Work -> BufferPos - 1] = (UBYTE)'·';

						break;

					case EO_RESET:

						Len = strlen(Original);

						strcpy(Buffer,Original);

						memset(Work -> WorkBuffer,'·',Len);

						Work -> WorkBuffer[Len] = 0;

						Work -> NumChars	= Len;
						Work -> BufferPos	= Len;
						Work -> EditOp		= EO_BIGCHANGE;

						break;

					case EO_CLEAR:

						Work -> WorkBuffer[0]	= 0;
						Work -> NumChars		= 0;
						Work -> BufferPos		= 0;
						Work -> EditOp			= EO_BIGCHANGE;

						Buffer[0] = 0;

						break;

					case EO_DELBACKWARD:

						Buffer[Work -> NumChars] = 0;
						break;

					case EO_NOOP:

						break;

					case EO_ENTER:

						strcpy(Original,Buffer);

						if(!(Work -> IEvent -> ie_Qualifier & QUALIFIER_SHIFT))
						{
							if(!Node -> Special . String . LastGadget && Node -> Special . String . LayoutHandle -> AutoActivate)
								Work -> Actions |= SGA_NEXTACTIVE;

							if(!(Work -> Actions & SGA_NEXTACTIVE))
								Work -> Code = '\r';
						}

						break;

					case EO_MOVECURSOR:
					case EO_DELFORWARD:

						Work -> Actions &= ~SGA_USE;
						break;

					default:

						Work -> Actions &= ~SGA_USE;
						Work -> Actions |=  SGA_BEEP;
						break;
				}

				break;

			case SGH_CLICK:

				Work -> BufferPos	= Work -> NumChars;
				Work -> EditOp		= EO_BIGCHANGE;

				break;
		}

		return(TRUE);
	}
	else
		return(FALSE);
}
#endif
