/*
**	GadTools layout toolkit
**
**	Copyright © 1993-1996 by Olaf `Olsen' Barthel
**		Freely distributable.
**
**	:ts=4
*/

#ifndef _GTLAYOUT_GLOBAL_H
#include "gtlayout_global.h"
#endif

ULONG __saveds __asm
LTP_DefaultEditRoutine(REG(a0) struct Hook *Hook,REG(a2) struct SGWork *Work,REG(a1) ULONG *Msg)
{
	LayoutHandle *Handle;
	ObjectNode *Node;

	if(!GETOBJECT(Work->Gadget,Node))
		return(TRUE);

	Handle = Hook->h_Data;

	if(*Msg == SGH_KEY)
	{
		struct Hook *Validate;

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

				LTP_AddHistory(Work);

				return(TRUE);
			}
		}

		if(Work->IEvent->ie_Code == CURSORUP || Work->IEvent->ie_Code == CURSORDOWN)
			LTP_HandleHistory(Work);

		if(Work->EditOp == EO_ENTER)
		{
			BOOL Activate = TRUE;

			DB(kprintf("enter operation\n"));

			if(Node->Type == STRING_KIND)
			{
				if(Node->Special.String.LastGadget)
					Activate = FALSE;
			}
#ifndef DO_HEXHOOK
			else
			{
				if(Node->Type == INTEGER_KIND)
				{
					if(Node->Special.Integer.LastGadget)
						Activate = FALSE;
				}
			}
#endif

			if(!(Work->IEvent->ie_Qualifier & QUALIFIER_SHIFT))
			{
				DB(kprintf("no shift\n"));

				if(Activate && Handle->AutoActivate)
					Work->Actions |= SGA_NEXTACTIVE;

				if(!(Work->Actions & SGA_NEXTACTIVE))
					Work->Code = '\r';
			}
			else
				DB(kprintf("has shift\n"));
		}

		if(Work->IEvent->ie_Code == CURSORRIGHT && (Work->IEvent->ie_Qualifier & QUALIFIER_CONTROL))
		{
			if(Work->BufferPos != Work->NumChars)
			{
				LONG i,Position = -1;

				for(i = Work->BufferPos ; i < Work->NumChars ; i++)
				{
					if(Work->WorkBuffer[i] == ' ')
					{
						for( ; i < Work->NumChars ; i++)
						{
							if(Work->WorkBuffer[i] != ' ')
							{
								Position = i;

								break;
							}
						}

						break;
					}
				}

				if(Position != -1)
					Work->BufferPos = Position;
				else
					Work->BufferPos = Work->NumChars;

				Work->EditOp = EO_MOVECURSOR;
			}
		}

		if(Work->IEvent->ie_Code == CURSORLEFT && (Work->IEvent->ie_Qualifier & QUALIFIER_CONTROL))
		{
			if(Work->BufferPos)
			{
				LONG i,Position = -1;

				for(i = Work->BufferPos ; i >= 0 ; i--)
				{
					if(Work->WorkBuffer[i] != ' ')
					{
						Position = i;

						break;
					}
				}

				if(Position == -1)
					Position = 0;

				if(Position)
				{
					i = Position;

					Position = -1;

					for( ; i >= 0 ; i--)
					{
						if(Work->WorkBuffer[i] == ' ')
						{
							Position = i + 1;

							break;
						}
					}
				}

				if(Position != -1)
					Work->BufferPos = Position;
				else
					Work->BufferPos = 0;

				Work->EditOp = EO_MOVECURSOR;
			}
		}

		if(Node->Type == INTEGER_KIND)
			Validate = Node->Special.Integer.ValidateHook;
		else
			Validate = Node->Special.String.ValidateHook;

		if(Validate)
		{
			if(!CallHookPkt(Validate,Work,Msg))
			{
				Work->EditOp	= EO_BADFORMAT;
				Work->Actions	= SGA_BEEP;
			}
		}

		if(Work->Actions & SGA_END)
			LTP_AddHistory(Work);
	}
	else
	{
		if(*Msg != SGH_CLICK)
			return(FALSE);
	}

	return(TRUE);
}
