/* setup.c for !DiscEx */


#include "main.h"
#include "setup.h"


static int drive;
static int FS;        /* possible values are FS_ADFS and FS_SCSIFS */

static ObjectId setupdbox = 0;


/* name of setup dbox template */

#define  SETUP  "Setup"


/* gadget component ids */

#define  ID_Drive        1
#define  ID_FS           2


/* event numbers */

#define  Event_Save      6  /* user clicks "Save" button */
#define  Event_Cancel    7  /* user clicks "Cancel" button */
#define  Event_Set       8  /* user clicks "Set" button */


/* forward references */

static Bool setup_save (int c, ToolboxEvent *e, IdBlock *i, void *h);
static Bool setup_cancel (int c, ToolboxEvent *e, IdBlock *i, void *h);
static Bool setup_set (int c, ToolboxEvent *e, IdBlock *i, void *h);



/*
 * Called during program initialisation.
 *
 * Reads in any default settings for drive and FS.
 */

void setup_init ()
{
    /* set overall defaults */    
    drive = 4;
    FS = FS_ADFS;

    /* see if there is a "Choices" file */
    {
        FILE *f;
        char s[20];

        if (f = fopen (APPDIR".Choices", "r"))
        {
            if (fgets (s, 20, f))
            {
                if (strcmp (s, "ADFS\n") == 0)
                    FS = FS_ADFS;
                else
                if (strcmp (s, "SCSIFS\n") == 0)
                    FS = FS_SCSIFS;
            }
            if (fgets (s, 20, f))
            {
                if ('0' <= *s && *s <= '7' && s[1] == '\n')
                    drive = *s - '0';
            }
            fclose (f);
        }
    }

    return;
}


/*
 * Delete the setup box and its associated resources.
 */

static error * setup_delete ()
{
    ER (toolbox_delete_object (0, setupdbox));

    /* deregister handlers */
    ER (event_deregister_toolbox_handler
              (
                  -1,
                  Event_Save,
                  setup_save,
                  NULL
              ));
    ER (event_deregister_toolbox_handler
              (
                  -1,
                  Event_Cancel,
                  setup_cancel,
                  NULL
              ));
    ER (event_deregister_toolbox_handler
              (
                  -1,
                  Event_Set,
                  setup_set,
                  NULL
              ));

    /* and note dbox no longer exists */
    setupdbox = 0;

    return NULL;
}


/*
 * Called when the user clicks on "Save".
 */

static Bool setup_save
(
    int code,
    ToolboxEvent *event,
    IdBlock *idblock,
    void *handle
)
{
    IGNORE(code);
    IGNORE(idblock);
    IGNORE(handle);

    /* retrieve new values */
    EDG (ret, numberrange_get_value (0, setupdbox, ID_Drive, &drive));
    EDG (ret, stringset_get_selected (1, setupdbox, ID_FS, (char *) &FS, 0));

     /* save new values to Choices file if possible */
    {
        FILE *f;

        if (f = fopen (APPDIR".Choices", "w"))
        {
            fprintf (f, "%s\n%d\n",
                (FS == FS_ADFS) ? "ADFS" : "SCSIFS",
                drive);

            fclose (f);
        }
    }

    /* delete dbox unless ADJ-click */
    if (!(event->hdr.flags & ActionButton_Selected_Adjust))
        EDG (ret, setup_delete () );

  ret:
    return TRUE;
}


/*
 * Called when the user clicks on "Cancel".
 */

static Bool setup_cancel
(
    int code,
    ToolboxEvent *event,
    IdBlock *idblock,
    void *handle
)
{
    IGNORE(code);
    IGNORE(idblock);
    IGNORE(handle);

    /* simply reload values if ADJ-click; otherwise delete the dbox */
    if (event->hdr.flags & ActionButton_Selected_Adjust)
    {
        EDG (ret, numberrange_set_value (0, setupdbox, ID_Drive, drive));
        EDG (ret, stringset_set_selected (1, setupdbox, ID_FS, (char *) FS));

    }
    else
        EDG (ret, setup_delete () );
 
  ret:
    return TRUE;
}


/*
 * Called when the user clicks on "Set".
 */

static Bool setup_set
(
    int code,
    ToolboxEvent *event,
    IdBlock *idblock,
    void *handle
)
{
    IGNORE(code);
    IGNORE(idblock);
    IGNORE(handle);

    /* retrieve new values */
    EDG (ret, numberrange_get_value (0, setupdbox, ID_Drive, &drive));
    EDG (ret, stringset_get_selected (1, setupdbox, ID_FS, (char *) &FS, 0));

    /* delete dbox unless ADJ-click */
    if (!(event->hdr.flags & ActionButton_Selected_Adjust))
        EDG (ret, setup_delete () );

  ret:
    return TRUE;
}


/*
 * Called when the user chooses "Set up..." from the icon bar icon menu.
 */

Bool setup_request
(
    int code,
    ToolboxEvent *event,
    IdBlock *idblock,
    void *handle
)
{
    IGNORE(code);
    IGNORE(event);
    IGNORE(idblock);
    IGNORE(handle);

    /* set up  setup object if it does not exist */
    if (setupdbox == 0)
    {
        /* create it */
        EDG (ret, toolbox_create_object (0, SETUP, &setupdbox));

        /* initialise it */
        EDG (ret, numberrange_set_value (0, setupdbox, ID_Drive, drive));
        EDG (ret, stringset_set_selected (1, setupdbox, ID_FS, (char *) FS));

        /* register handlers */

        /* Click on "Save" button */
        EDG (ret, event_register_toolbox_handler
                  (
                      -1,
                      Event_Save,
                      setup_save,
                      NULL
                  ));

        /* Click on "Cancel" button */
        EDG (ret, event_register_toolbox_handler
                  (
                      -1,
                      Event_Cancel,
                      setup_cancel,
                      NULL
                  ));

        /* Click on "Set" button */
        EDG (ret, event_register_toolbox_handler
                  (
                      -1,
                      Event_Set,
                      setup_set,
                      NULL
                  ));
    }

    /* show setup object */
    EDG (ret, toolbox_show_object (0, setupdbox, 0, 0, 0, 0));

  ret:
    return TRUE;
}


/*
 * Returns current drive number.
 */

int setup_drive ()
{
    return drive;
}


/*
 * Returns current filing system type.
 *
 * Possible values are FS_ADFS and FS_SCSIFS.
 */

int setup_FS ()
{
    return FS;
}
