/*-*-C-*-
 * Rename dialogue box for ResEd shell
 */

#include "resed.h"
#include "main.h"

#include "swicall.h"
#include "wimp.h"
#include "resformat.h"
#include "dbox.h"
#include "interactor.h"
#include "registry.h"

#include "class.h"
#include "document.h"
#include "icondefs.h"
#include "rename.h"


static WindowPtr window = NULL;


/*
 * Load templates, etc.
 */

error * rename_load_prototypes ()
{
   ER ( wimp_load_template("Rename", &window) );
   ER ( swi (Wimp_CreateWindow,  R1, &window->visarea,
               OUT,  R0, &window->handle,  END) );

   /* register window - for interactive help */
   return registry_register_window(window->handle,
                                       RenameDbox, (void *) window);
}


/*
 * Interactor for the rename window.  Expects to be pushed on top of the
 * menu.c interactor, so needs to be careful about popping itself correctly.
 */

static error * rename_interactor (unsigned int event, int *buf, void *closure, Bool *consumed)
{
    MouseClickPtr mouse = (MouseClickPtr) buf;
    WindowPtr win = (WindowPtr) buf;         /* only half there */
    KeyPressPtr key = (KeyPressPtr) buf;
    ResourcePtr res = (ResourcePtr) closure;
    error *err = NULL;

    if (buf == NULL)                     /* we are being asked to cancel */
    {
        return NULL;
    }

    switch (event)
    {
    case EV_OPEN_WINDOW_REQUEST:
        if (win->handle == window->handle)
        {
            *consumed = TRUE;
            window->visarea = win->visarea;
            window->scrolloffset = win->scrolloffset;
            window->behind = win->behind;
            ER ( swi (Wimp_OpenWindow, R1, window, END) );
        }
        break;

    case EV_KEY_PRESSED:
        if (key->caret.windowhandle == window->handle)
        {
            unsigned int modifiers = wimp_read_modifiers ();

            *consumed = TRUE;
            switch (key->code)
            {
            case 0x0d:   /* RETURN */
                err = document_rename_resource (res->owner, res, dbox_getstring (window, I_RENAME_NAME));
                if (err)
                {
                    error_box (err);
                    break;
                }

            case 0x1b:   /* ESCAPE */
                if ((modifiers & MODIFIER_SHIFT) == 0)
                    interactor_cancel();
                else
                    dbox_setstring (window, I_RENAME_NAME, res->object->hdr.name);
                break;

            default:
                *consumed = FALSE;
                break;
            }
        }
        break;

    case EV_MOUSE_CLICK:
        if (mouse->windowhandle == window->handle)
        {
            *consumed = TRUE;
            switch (mouse->iconhandle)
            {
            case I_RENAME_OK:
                if (mouse->buttons == MB_CLICK(MB_SELECT) ||
                    mouse->buttons == MB_CLICK(MB_ADJUST))
                {
                    err = document_rename_resource (res->owner, res, dbox_getstring (window, I_RENAME_NAME));
                    if (err)
                    {
                        error_box (err);
                        break;
                    }
                }
            case I_RENAME_CANCEL:
                if (mouse->buttons == MB_CLICK(MB_SELECT))
                    interactor_cancel ();
                else if (mouse->buttons == MB_CLICK(MB_ADJUST))
                    dbox_setstring (window, I_RENAME_NAME, res->object->hdr.name);
                break;
            }
        }
        break;
    }

    return NULL;
}


/*
 * Open the rename dialogue as a submenu at the appointed position
 */

error * rename_open (DocumentPtr doc, PointPtr position)
{
    ResourcePtr res = doc->resources;
    if (doc->numselected == 0)
        return NULL;
    for (; res; res = res->next)
        if (res->selected)
            break;
    dbox_setstring (window, I_RENAME_NAME, res->object->hdr.name);
    ER ( swi (Wimp_CreateSubMenu,  R1, window->handle,  R2, position->x,  R3, position->y,  END) );
    interactor_push (rename_interactor, (void *) res);
    return NULL;
}


