/*
 *  Source machine generated by GadToolsBox V2.0b
 *  which is (c) Copyright 1991-1993 Jaba Development
 *
 *  GUI Designed by : -- Unnamed --
 */

#include <exec/types.h>
#include <intuition/intuition.h>
#include <intuition/classes.h>
#include <intuition/classusr.h>
#include <intuition/imageclass.h>
#include <intuition/gadgetclass.h>
#include <libraries/gadtools.h>
#include <graphics/displayinfo.h>
#include <graphics/gfxbase.h>
#include <graphics/gfxmacros.h>
#include <clib/exec_protos.h>
#include <clib/intuition_protos.h>
#include <clib/gadtools_protos.h>
#include <clib/graphics_protos.h>
#include <clib/utility_protos.h>
#include <string.h>

#include "replace.h"

extern APTR SysBase;

#include <pragmas/exec_pragmas.h>
#include <pragmas/intuition_pragmas.h>
#include <pragmas/gadtools_pragmas.h>
/* #include <pragmas/graphics_pragmas.h> */
/* #include <pragmas/utility_pragmas.h> */

#include "null.h"


APTR		       RVisualInfo = NULL;
struct Window	      *ReplaceWnd = NULL;
struct Gadget	      *ReplaceGList = NULL;
struct IntuiMessage    ReplaceMsg;
struct Gadget	      *ReplaceGadgets[6];
UWORD		       ReplaceLeft = 0;
UWORD		       ReplaceTop = 0;
UWORD		       ReplaceWidth = 335;
UWORD		       ReplaceHeight = 64;
DEFMESSAGE( _REP_wintitle, "Replace text" )
UBYTE		      *ReplaceWdt = (UBYTE *)"Replace text";

char SearchPattern[256];
char ReplacePattern[256];

USHORT ditherData[] =
{
   0x5555, 0xAAAA
};


struct TextAttr topaz8 = {
	( STRPTR )"topaz.font", 8, 0x00, 0x01 };

UWORD ReplaceGTypes[] = {
	BUTTON_KIND,
	BUTTON_KIND,
	TEXT_KIND,
	TEXT_KIND,
	STRING_KIND,
	STRING_KIND
};

struct NewGadget ReplaceNGad[] = {
DEFMESSAGE( ___ok, "_OK" )
DEFMESSAGE( ___cancel, "_Cancel" )

	4, 42, 71, 16, (UBYTE *)"_OK", NULL, GD_ok, PLACETEXT_IN, NULL, NULL,
	252, 42, 71, 16, (UBYTE *)"_Cancel", NULL, GD_cancel, PLACETEXT_IN, NULL, NULL,
	4, 4, 64, 14, NULL, NULL, GD_searchtxt, 0, NULL, NULL,
	4, 22, 64, 14, NULL, NULL, GD_replacetxt, 0, NULL, NULL,
	70, 4, 253, 15, NULL, NULL, GD_search, 0, NULL, NULL,
	70, 22, 253, 15, NULL, NULL, GD_replace, 0, NULL, NULL
};

ULONG ReplaceGTags[] = {
	(GT_Underscore), '_', (TAG_DONE),
	(GT_Underscore), '_', (TAG_DONE),
	(GTTX_Text), (ULONG)"   Find:", (GTTX_Border), FALSE, (TAG_DONE),
	(GTTX_Text), (ULONG)"Replace:", (GTTX_Border), FALSE, (TAG_DONE),
	(GTST_MaxChars), 256, (TAG_DONE),
	(GTST_MaxChars), 256, (TAG_DONE)
};

int HandleReplaceIDCMP( void )
{
    struct IntuiMessage *m;
    struct Gadget *gad;
    BOOL done = FALSE;
    BOOL cancelled = FALSE;
    char *strptr;

    while (! done)
    {
	Wait(1L << ReplaceWnd->UserPort->mp_SigBit);

	while( m = GT_GetIMsg( ReplaceWnd->UserPort ))
	{
	    switch ( m->Class )
	    {

		case IDCMP_REFRESHWINDOW:
		   GT_BeginRefresh( ReplaceWnd );
		   GT_EndRefresh( ReplaceWnd, TRUE );
		   break;

		case IDCMP_VANILLAKEY:
		   switch (m->Code)
		   {
		      case 'O':
		      case 'o':
			 done = TRUE;
			 break;
		      case 'C':
		      case 'c':
			 cancelled = TRUE;
			 done = TRUE;
			 break;
		      default:
			 break;
		   }
		   break;

		case IDCMP_GADGETUP:
		   gad = (struct Gadget *)m->IAddress;
		   switch(gad->GadgetID)
		   {
		      case GD_ok:
			 done = TRUE;
			 break;
		      case GD_cancel:
			 cancelled = TRUE;
			 done = TRUE;
			 break;
		      case GD_search:
			 ActivateGadget(ReplaceGadgets[GD_replace], ReplaceWnd, NULL);
			 break;
		      case GD_replace:
			 strptr = (char *)GetString(ReplaceGadgets[GD_search]);
			 /* If Code is 9 the gadget was deactivated with the TAB key */
			 if ((strlen(strptr) > 0) && (m->Code != 9))
			    done = TRUE;
			 else
			    ActivateGadget(ReplaceGadgets[GD_search], ReplaceWnd, NULL);
			 break;
		      default:
			 break;
		   }
		   break;
	    }
	    GT_ReplyIMsg( m );
	}
    }
    if (! cancelled)
    {
       strptr = (char *)GetString(ReplaceGadgets[GD_search]);
       if (strptr)
	  strcpy(SearchPattern, strptr);
       strptr = (char *)GetString(ReplaceGadgets[GD_replace]);
       if (strptr)
	  strcpy(ReplacePattern, strptr);
    }
    return(! cancelled);
}

int OpenReplaceWindow( struct Screen *RScr )
{
	struct NewGadget	ng;
	struct Gadget	*g;
	UWORD		lc, tc;
	UWORD		offx = RScr->WBorLeft, offy = RScr->WBorTop + RScr->RastPort.TxHeight + 1;

	if ( ! ( g = CreateContext( &ReplaceGList )))
		return( 1L );

	RVisualInfo = GetVisualInfo(RScr, TAG_DONE );

	ReplaceLeft = RScr->MouseX - 290;
	if (ReplaceLeft < 0) ReplaceLeft = 0;
	ReplaceTop = RScr->MouseY - 42 - offy - 7;
	if (ReplaceTop < 0) ReplaceTop = 0;


	for( lc = 0, tc = 0; lc < Replace_CNT; lc++ ) {

		CopyMem((char * )&ReplaceNGad[ lc ], (char * )&ng, (long)sizeof( struct NewGadget ));

		ng.ng_VisualInfo = RVisualInfo;
		ng.ng_TextAttr	 = &topaz8;
		ng.ng_LeftEdge	+= offx;
		ng.ng_TopEdge	+= offy;

		ReplaceGadgets[ lc ] = g = CreateGadgetA((ULONG)ReplaceGTypes[ lc ], g, &ng, ( struct TagItem * )&ReplaceGTags[ tc ] );

		while( ReplaceGTags[ tc ] ) tc += 2;
		tc++;

		if ( NOT g )
			return( 2L );
	}

	if ( ! ( ReplaceWnd = OpenWindowTags( NULL,
				WA_Left,	ReplaceLeft,
				WA_Top, 	ReplaceTop,
				WA_Width,	ReplaceWidth,
				WA_Height,	ReplaceHeight + offy,
				WA_IDCMP,	BUTTONIDCMP|TEXTIDCMP|STRINGIDCMP|IDCMP_VANILLAKEY|IDCMP_REFRESHWINDOW,
				WA_Flags,	WFLG_DRAGBAR|WFLG_DEPTHGADGET|WFLG_SMART_REFRESH|WFLG_ACTIVATE,
				WA_Title,	ReplaceWdt,
				TAG_DONE )))
	return( 4L );

	SetAPen(ReplaceWnd->RPort, 2);
	SetAfPt(ReplaceWnd->RPort, ditherData, 1);
	RectFill(ReplaceWnd->RPort, offx, offy,
				    ReplaceWidth - ReplaceWnd->BorderRight - 1,
				    ReplaceHeight + offy - ReplaceWnd->BorderBottom - 1);
	SetAPen(ReplaceWnd->RPort, 0);
	RectFill(ReplaceWnd->RPort, 70 + offx, 4 + offy, 70 + 252 + offx, 4 + 14 + offy);
	RectFill(ReplaceWnd->RPort, 70 + offx, 22 + offy, 70 + 252 + offx, 22 + 14 + offy);

	AddGList(ReplaceWnd, ReplaceGList, 0, Replace_CNT + 1, NULL);
	GT_SetGadgetAttrs(ReplaceGadgets[GD_search], ReplaceWnd, NULL,
			  GTST_String, SearchPattern, TAG_DONE);
	GT_SetGadgetAttrs(ReplaceGadgets[GD_replace], ReplaceWnd, NULL,
			  GTST_String, ReplacePattern, TAG_DONE);
	WaitBlit();
	RefreshGList(ReplaceGList, ReplaceWnd, NULL, Replace_CNT + 1);
	GT_RefreshWindow( ReplaceWnd, NULL );
	ActivateGadget(ReplaceGadgets[GD_search], ReplaceWnd, NULL);
	return( 0L );
}

void CloseReplaceWindow( void )
{
	if ( ReplaceWnd        ) {
		CloseWindow( ReplaceWnd );
		ReplaceWnd = NULL;
	}

	if ( ReplaceGList      ) {
		FreeGadgets( ReplaceGList );
		ReplaceGList = NULL;
	}
	if ( RVisualInfo ) {
		FreeVisualInfo( RVisualInfo );
		RVisualInfo = NULL;
	}

}

