
/* *** opendata.c ***********************************************************
 *
 * File IO Suite  --  Open Requester Data
 *     from Book 1 of the Amiga Programmers' Suite by RJ Mical
 *
 * Copyright (C) 1986, 1987, Robert J. Mical
 * All Rights Reserved.
 *
 * Created for Amiga developers.
 * Any or all of this code can be used in any program as long as this
 * entire copyright notice is retained, ok?  Thanks.
 *
 * HISTORY      NAME            DESCRIPTION
 * -----------  --------------  --------------------------------------------
 * 12 Aug 86    RJ >:-{)*       Prepare (clean house) for release
 * 3 May 86     =RJ Mical=      Fix prop gadget for both 1.1 and 1.2
 * 1 Feb 86     =RJ Mical=      Created this file.
 *
 * *********************************************************************** */


#define FILEIO_SOURCEFILE
#include "fileio.h"




struct TextAttr SafeFont =
    {
    (UBYTE *)"topaz.font",
    TOPAZ_EIGHTY,
    0,
    0,
    };



/* This is where the Select text is kept!  This array of text will be
 * redrawn every time we want Intuition to redraw the lowly SelectGadget.
 * The strings themselves are kept in OpenSelectBuffers where 
 * the open routines make sure that the buffers are padded with
 * blanks and are always null-terminated.  Ha ha!  Like madmen
 * dancing, like crazy monkeys.
 */
UBYTE OpenSelectBuffers[NAME_ENTRY_COUNT][VISIBLE_SELECT_LENGTH];
struct IntuiText OpenSelectText[NAME_ENTRY_COUNT] =
    {
        {
        1, 0, 
        JAM2,
        1, 1 + (OPEN_LINEHEIGHT * 0),
        &SafeFont,
        &OpenSelectBuffers[0][0],
        NULL,
        },

        {
        1, 0, 
        JAM2,
        1, 1 + (OPEN_LINEHEIGHT * 1),
        &SafeFont,
        &OpenSelectBuffers[1][0],
        &OpenSelectText[0],
        },

        {
        1, 0, 
        JAM2,
        1, 1 + (OPEN_LINEHEIGHT * 2),
        &SafeFont,
        &OpenSelectBuffers[2][0],
        &OpenSelectText[1],
        },

        {
        1, 0, 
        JAM2,
        1, 1 + (OPEN_LINEHEIGHT * 3),
        &SafeFont,
        &OpenSelectBuffers[3][0],
        &OpenSelectText[2],
        },

        {
        1, 0, 
        JAM2,
        1, 1 + (OPEN_LINEHEIGHT * 4),
        &SafeFont,
        &OpenSelectBuffers[4][0],
        &OpenSelectText[3],
        },

        {
        1, 0, 
        JAM2,
        1, 1 + (OPEN_LINEHEIGHT * 5),
        &SafeFont,
        &OpenSelectBuffers[5][0],
        &OpenSelectText[4],
        },

    };




/* === Backdrop Gadget =================================================== */
/* We shouldn't need this gadget.  It's sole purpose is to allow the user 
 * to cancel the filename building operation by clicking outside any of 
 * the regular requester gadgets.  Why, we may ask, don't we just make 
 * the requester a NOISYREQ and detect SELECTDOWN.  Well, we tried that, 
 * and either there's something wrong with our brains or 1.2 Intuition has 
 * a bug that doesn't broadcast SELECTDOWN to requester listeners.  
 * It broadcasts SELECTUP, MENUDOWN and MENUUP jes' fine, but no DOWN.  
 * Bummer.  So anyway, now we got an imageless, highlightless gadget that 
 * fills up the entire requester but, being at the back of the list, won't 
 * be hit unless all other gadgets are missed.  
 * Having a wonderful time, wish you were here.
 */
struct Gadget BackdropGadget =
    {
    NULL,
    0, 0, 
    OPEN_WIDTH, OPEN_HEIGHT, 
    GADGHNONE,              /* Flags */
    GADGIMMEDIATE,          /* Activation */
    REQGADGET | BOOLGADGET, /* Type */
    NULL,                   /* GadgetRender */
    NULL,                   /* SelectRender */
    NULL,
    NULL, NULL, 
    OPENGADGET_BACKDROP, 
    NULL,
    };



/* === OK, Cancel, and NextDisk Gadgets ================================== */
SHORT BoolCluster3Pairs[] =
    {
    0, -3, 
    55, -3,
    57, -1,
    57, 19,
    55, 21,
    -1, 21,
    -3, 19,
    -3, -1,
    -1, -3,
    };

SHORT BoolCluster2Pairs[] =
    {
    -2, -1,
    56, -1,
    56, 19,
    -2, 19,
    -2, -1,
    };

SHORT BoolClusterPairs[] =
    {
    -1, -2,
    55, -2,
    55, 20,
    -1, 20,
    -1, -2,
    };

struct Border BoolCluster3Border =
    {
    1, 1,
    2, 0,
    JAM1,
    9,
    &BoolCluster3Pairs[0],
    NULL,
    };

struct Border BoolCluster2Border =
    {
    1, 1,
    1, 0,
    JAM1,
    5,
    &BoolCluster2Pairs[0],
    &BoolCluster3Border,
    };

struct Border BoolClusterBorder =
    {
    1, 1,
    1, 0,
    JAM1,
    5,
    &BoolClusterPairs[0],
    &BoolCluster2Border,
    };

struct IntuiText NextDisk2Text =
    {
    1, 0, 
    JAM2,
    13, 11,
    &SafeFont,
    (UBYTE *)"DISK",
    NULL,
    };

struct IntuiText NextDiskText =
    {
    1, 0, 
    JAM2,
    13, 3,
    &SafeFont,
    (UBYTE *)"NEXT",
    &NextDisk2Text,
    };

struct IntuiText CancelText =
    {
    1, 0, 
    JAM2,
    5, 7,
    &SafeFont,
    (UBYTE *)"CANCEL",
    NULL,
    };

struct IntuiText OK2Text =
    {
    1, 0, 
    JAM2,
    17, 7,
    &SafeFont,
    (UBYTE *)"OK!",
    NULL,
    };


struct Gadget NextDiskGadget =
    {
    &BackdropGadget,
    197, 82 + REQTITLE_HEIGHT,
    57, 21,
    GADGHCOMP,  /* Flags */
    RELVERIFY,      /* Activation */
    REQGADGET | BOOLGADGET,     /* Type */
    (APTR)&BoolClusterBorder,           /* GadgetRender */
    NULL,               /* SelectRender */
    &NextDiskText,
    NULL, NULL, 
    OPENGADGET_NEXTDISK, 
    NULL,
    };

struct Gadget CancelGadget =
    {
    &NextDiskGadget,
    114, 82 + REQTITLE_HEIGHT,
    57, 21,
    GADGHCOMP,  /* Flags */
    RELVERIFY | ENDGADGET,      /* Activation */
    REQGADGET | BOOLGADGET,     /* Type */
    (APTR)&BoolClusterBorder,           /* GadgetRender */
    NULL,               /* SelectRender */
    &CancelText,
    NULL, NULL, 
    OPENGADGET_CANCEL,
    NULL,
    };

struct Gadget OKGadget =
    {
    &CancelGadget,
    32, 82 + REQTITLE_HEIGHT,
    57, 21,
    GADGHCOMP,      /* Flags */
    RELVERIFY | ENDGADGET,      /* Activation */
    REQGADGET | BOOLGADGET,     /* Type */
    (APTR)&BoolClusterBorder, 
    NULL,               /* Renders */
    &OK2Text,
    NULL, NULL, 
    OPENGADGET_OK, 
    NULL,
    };



/* === OpenUp ============================================================= */

struct Image OpenUpImage =
    {
    1, -1,
    15, 14,
    2,
    &OpenUpData[0],
    0x03, 0x00,
    NULL,
    };

struct Gadget OpenUpGadget =
    {
    &OKGadget,
    134, 14 + REQTITLE_HEIGHT,
    15, 12,
    GADGIMAGE | GADGHNONE,            /* Flags */
    GADGIMMEDIATE,                    /* Activation */
    REQGADGET | BOOLGADGET,          /* Type */
    (APTR)&OpenUpImage, 
    NULL,                              /* Renders */
    NULL,
    NULL, NULL, 
    OPENGADGET_UPGADGET, 
    NULL,
    };



/* === OpenDown =========================================================== */

struct Image OpenDownImage =
    {
    1, -1,
    15, 14,
    2,
    &OpenDownData[0],
    0x03, 0x00,
    NULL,
    };

struct Gadget OpenDownGadget =
    {
    &OpenUpGadget,
    134, 64 + REQTITLE_HEIGHT,
    15, 12,
    GADGIMAGE | GADGHNONE,            /* Flags */
    GADGIMMEDIATE,                        /* Activation */
    REQGADGET | BOOLGADGET,          /* Type */
    (APTR)&OpenDownImage, 
    NULL,                              /* Renders */
    NULL,
    NULL, NULL, 
    OPENGADGET_DOWNGADGET, 
    NULL,
    };


/* === OpenDrawerText ==================================================== */

struct StringInfo OpenDrawerTextInfo =
    {
    NULL, /* Must be supplied from the appropriate FileIOSupport structure */
    &OpenUndoBuffer[0],
    0,
    MAX_NAME_LENGTH,
    0,
    0,0,0,0,0,0,0,0,
    };

struct Gadget OpenDrawerTextGadget =
    {
    &OpenDownGadget,
    157, 41 + REQTITLE_HEIGHT,
    122, 10,
    GADGHCOMP | SELECTED,              /* Flags */
    RELVERIFY | STRINGCENTER,              /* Activation */
    REQGADGET | STRGADGET,            /* Type */
    NULL, NULL,                      /* Renders */
    NULL,
    NULL,
    (APTR)&OpenDrawerTextInfo,
    OPENGADGET_DRAWERTEXT,
    NULL,
    };


/* === OpenDiskText ====================================================== */

struct StringInfo OpenDiskTextInfo =
    {
    NULL, /* Must be supplied from the appropriate FileIOSupport structure */
    &OpenUndoBuffer[0],
    0,
    MAX_NAME_LENGTH,
    0,
    0,0,0,0,0,0,0,0,
    };

struct Gadget OpenDiskTextGadget =
    {
    &OpenDrawerTextGadget,
    157, 65 + REQTITLE_HEIGHT,
    122, 10,
    GADGHCOMP | SELECTED,              /* Flags */
    RELVERIFY | STRINGCENTER,              /* Activation */
    REQGADGET | STRGADGET,            /* Type */
    NULL, NULL,                      /* Renders */
    NULL,
    NULL,
    (APTR)&OpenDiskTextInfo,
    OPENGADGET_DISKTEXT,
    NULL,
    };



/* === OpenNameText ====================================================== */

struct StringInfo OpenNameTextInfo =
    {
    NULL, /* Must be supplied from the appropriate FileIOSupport structure */
    &OpenUndoBuffer[0],
    0,
    MAX_NAME_LENGTH,
    0,
    0,0,0,0,0,0,0,0,
    };

struct Gadget OpenNameTextGadget =
    {
    &OpenDiskTextGadget,
    157, 16 + REQTITLE_HEIGHT,
    122, 10,
    GADGHCOMP | SELECTED,              /* Flags */
    RELVERIFY | ENDGADGET | STRINGCENTER,              /* Activation */
    REQGADGET | STRGADGET,            /* Type */
    NULL, NULL,                      /* Renders */
    NULL,
    NULL,
    (APTR)&OpenNameTextInfo,
    OPENGADGET_NAMETEXT,
    NULL,
    };


/* === OpenProp =========================================================== */
/* OpenPropData[] is in chipdata.c */

struct Image OpenPropImage =
    {
    1, 0,
    11, 8,
    2,
    &OpenPropData[0],
    0x03, 0x00,
    NULL,
    };

struct PropInfo OpenPropInfo =
    {
    FREEVERT | PROPBORDERLESS,
    0, 0,  /* Pots should be reinitialized on the fly */
    0, 0,  /* Bodies should be reinitialized on the fly */
    0, 0, 0, 0, 0, 0,
    };

struct Gadget OpenPropGadget =
    {
    &OpenNameTextGadget,
    136, 30 + REQTITLE_HEIGHT,  /* Left, Top */
    13, 30,     /* Width, Height */
    GADGIMAGE | GADGHNONE,       /* Flags */
    GADGIMMEDIATE | RELVERIFY | FOLLOWMOUSE,  /* Activation */
    REQGADGET | PROPGADGET,             /* Type */
    (APTR)&OpenPropImage, 
    NULL,                         /* Renders */
    NULL,
    NULL, 
    (APTR)&OpenPropInfo, 
    OPENGADGET_PROPGADGET, 
    NULL,
    };





/* === OpenSelectName ==================================================== */

struct Gadget OpenSelectNameGadget =
    {
    &OpenPropGadget,
    OPENSELECT_LEFT, OPENSELECT_TOP,        /* Left, Top */
    OPENSELECT_WIDTH, OPENSELECT_HEIGHT,    /* Width, Height */
    GADGHNONE,                              /* Flags */
    GADGIMMEDIATE,                          /* Activation */
    REQGADGET | BOOLGADGET,                 /* Type */
    NULL, NULL,                             /* Renders */
    NULL,                                   /* Text */
    NULL, NULL, 
    OPENGADGET_SELECTNAME,
    NULL,
    };



/* === Requester Details ================================================= */
/* This data is used to render the requester more prettily. */

/* === Line Pairs === */
SHORT Req3BorderData[] =
    {
      1, 0,
    OPEN_WIDTH - 2, 0,
    OPEN_WIDTH - 2, 1,
    OPEN_WIDTH - 1, 1,
    OPEN_WIDTH - 1, 108 + REQTITLE_HEIGHT,
    OPEN_WIDTH - 2, 108 + REQTITLE_HEIGHT,
    OPEN_WIDTH - 2, 109 + REQTITLE_HEIGHT,
      1, 109 + REQTITLE_HEIGHT,
      1, 108 + REQTITLE_HEIGHT,
      0, 108 + REQTITLE_HEIGHT,
      0, 1,
      1, 1,
      1, 0,
    };

SHORT Req2BorderData[] =
    {
      1 + 1, 0 + 1,
    OPEN_WIDTH - 2 - 1, 0 + 1,
    OPEN_WIDTH - 2 - 1, 1 + 1,
    OPEN_WIDTH - 1 - 1, 1 + 1,
    OPEN_WIDTH - 1 - 1, 108 - 1 + REQTITLE_HEIGHT,
    OPEN_WIDTH - 2 - 1, 108 - 1 + REQTITLE_HEIGHT,
    OPEN_WIDTH - 2 - 1, 109 - 1 + REQTITLE_HEIGHT,
      1 + 1, 109 - 1 + REQTITLE_HEIGHT,
      1 + 1, 108 - 1 + REQTITLE_HEIGHT,
      0 + 1, 108 - 1 + REQTITLE_HEIGHT,
      0 + 1, 1 + 1,
      1 + 1, 1 + 1,
      1 + 1, 0 + 1,
    };

SHORT ReqBorderData[] =
    {
      1 + 2, 0 + 2,
    OPEN_WIDTH - 2 - 2, 0 + 2,
    OPEN_WIDTH - 2 - 2, 1 + 2,
    OPEN_WIDTH - 1 - 2, 1 + 2,
    OPEN_WIDTH - 1 - 2, 108 - 2 + REQTITLE_HEIGHT,
    OPEN_WIDTH - 2 - 2, 108 - 2 + REQTITLE_HEIGHT,
    OPEN_WIDTH - 2 - 2, 109 - 2 + REQTITLE_HEIGHT,
      1 + 2, 109 - 2 + REQTITLE_HEIGHT,
      1 + 2, 108 - 2 + REQTITLE_HEIGHT,
      0 + 2, 108 - 2 + REQTITLE_HEIGHT,
      0 + 2, 1 + 2,
      1 + 2, 1 + 2,
      1 + 2, 0 + 2,
    };

SHORT SelectBorderData[] =
    {
    8,   14 + REQTITLE_HEIGHT,
    129, 14 + REQTITLE_HEIGHT,
    130, 15 + REQTITLE_HEIGHT,
    130, 74 + REQTITLE_HEIGHT,
    129, 75 + REQTITLE_HEIGHT,
    8,   75 + REQTITLE_HEIGHT,
    7,   74 + REQTITLE_HEIGHT,
    7,   15 + REQTITLE_HEIGHT,
    8,   14 + REQTITLE_HEIGHT,
    };

SHORT TextBorderData[] =
    {
    -1,  -2,
    120, -2,
    121, -1,
    121, 8,
    120, 9,
    -1,  9,
    -2,  8,
    -2,  -1,
    -1,  -2,
    };

SHORT PropBorderData[] =
    {
    0,  -3,
    16, -3,
    16, 32,
    0,  32,
    0,  -2,
    15, -2,
    15, -1,
    17, -1,
    17, 30,
    15, 30,
    15, 31,
    1,  31,
    1,  30,
    -1, 30,
    -1, -1,
    -1, 1,
    };


/* === Borders === */
struct Border Req3Border =
    {
    0, 0,
    1, 0,
    JAM1,
    13,
    &Req3BorderData[0],
    NULL,
    };

struct Border Req2Border =
    {
    0, 0,
    2, 0,
    JAM1,
    13,
    &Req2BorderData[0],
    &Req3Border,
    };

struct Border ReqBorder =
    {
    0, 0,
    1, 0,
    JAM1,
    13,
    &ReqBorderData[0],
    &Req2Border,
    };

struct Border SelectBorder =
    {
    0, 0,
    1, 0,
    JAM1,
    9,
    &SelectBorderData[0],
    &ReqBorder,
    };

struct Border Text3Border =
    {
    157, 65 + REQTITLE_HEIGHT,
    1, 0,
    JAM1,
    9,
    &TextBorderData[0],
    &SelectBorder,
    };

struct Border Text2Border =
    {
    157, 41 + REQTITLE_HEIGHT,
    1, 0,
    JAM1,
    9,
    &TextBorderData[0],
    &Text3Border,
    };

struct Border TextBorder =
    {
    157, 16 + REQTITLE_HEIGHT,
    1, 0,
    JAM1,
    9,
    &TextBorderData[0],
    &Text2Border,
    };

struct Border PropBorder =
    {
    134, 30 + REQTITLE_HEIGHT,
    1, 0,
    JAM1,
    16,
    &PropBorderData[0],
    &TextBorder,
    };

/* === RJ wants to know:  Some Requester Text For You? === */
UBYTE *DefaultReqTitle = (UBYTE *)"File IO Requester";
struct IntuiText ReqTitleText =
    {
    1, 0, 
    JAM2,
    0, 5,       /* The x-coordinate is initialized to center the title */
    &SafeFont,
    NULL,       /* Points to the title supplied in the FileIOSupport */
    NULL,
    };

struct IntuiText SelectText =
    {
    1, 0, 
    JAM2,
    18, 6 + REQTITLE_HEIGHT,
    &SafeFont,
    (UBYTE *)"Select a Name",
    &ReqTitleText,
    };

struct IntuiText Type3Text =
    {
    1, 0, 
    JAM2,
    201, 55 + REQTITLE_HEIGHT,
    &SafeFont,
    (UBYTE *)"Disk",
    &SelectText,
    };

struct IntuiText Type2Text =
    {
    1, 0, 
    JAM2,
    193, 31 + REQTITLE_HEIGHT,
    &SafeFont,
    (UBYTE *)"Drawer",
    &Type3Text,
    };

struct IntuiText TypeText =
    {
    1, 0, 
    JAM2,
    161, 6 + REQTITLE_HEIGHT,
    &SafeFont,
    (UBYTE *)"Or Type a Name",
    &Type2Text,
    };



/* === Main Data ======================================================== */
struct ReqSupport OpenReqSupport = 
    {

    /* struct Requester Requester; */
        {
        /*  struct Requester *OlderRequest;*/
        NULL,

        /*  SHORT LeftEdge, TopEdge;*/
        OPEN_LEFT, OPEN_TOP,

        /*  SHORT Width, Height;*/
        OPEN_WIDTH, OPEN_HEIGHT, 

        /*  SHORT RelLeft, RelTop;*/
        0, 0,

        /*  struct Gadget *ReqGadget;*/
        &OpenSelectNameGadget,
    
        /*  struct Border *ReqBorder;*/
        &PropBorder,
    
        /*  struct IntuiText *ReqText;*/
        &TypeText,
    
        /*  USHORT Flags;*/
        NOISYREQ,

        /*  UBYTE BackFill;*/
        0,

        /*  struct ClipRect ReqCRect;*/
        { NULL },

        /*  struct BitMap *ImageBMap;*/
        NULL,

        /*  struct BitMap ReqBMap;*/
        { NULL },

        },  /* end of Requester structure */

    /* struct Window *Window; */
    NULL,

    /* LONG (*StartRequest)(); */
    NULL,

    /* LONG (*ReqHandler)(); */
    NULL,

    /* LONG (*NewDiskHandler)(); */
    NULL,

    /* LONG (*MouseMoveHandler)(); */
    NULL,

    /* SHORT SelectedGadgetID; */
    0,
};

struct Requester *OpenReq = NULL;
struct Window *OpenReqWindow = NULL;
struct FileIOSupport *OpenReqFileIO = NULL;
UBYTE OpenUndoBuffer[MAX_NAME_LENGTH];
UBYTE OpenLockName[128] = {0};

ULONG OpenSaveLock = NULL;

UBYTE CurrentDiskString[] = ":";

LONG OpenClickSeconds;
LONG OpenClickMicros;

