/*
 *  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"

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;
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[] = {
        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;
        }

}

