/* ------------------ msgbox.c ------------------ */

#include "dflat.h"

extern DF_DBOX MsgBox;
extern DF_DBOX InputBoxDB;
DFWINDOW CancelWnd;

static int ReturnValue;

int DfMessageBoxProc(DFWINDOW wnd, DFMESSAGE msg, DF_PARAM p1, DF_PARAM p2)
{
    switch (msg)    {
        case DFM_CREATE_WINDOW:
            DfGetClass(wnd) = DF_MESSAGEBOX;
			DfInitWindowColors(wnd);
            DfClearAttribute(wnd, DF_CONTROLBOX);
            break;
        case DFM_KEYBOARD:
            if (p1 == '\r' || p1 == DF_ESC)
                ReturnValue = (int)p1;
            break;
        default:
            break;
    }
    return DfBaseWndProc(DF_MESSAGEBOX, wnd, msg, p1, p2);
}

int DfYesNoBoxProc(DFWINDOW wnd, DFMESSAGE msg, DF_PARAM p1, DF_PARAM p2)
{
    switch (msg)    {
        case DFM_CREATE_WINDOW:
            DfGetClass(wnd) = DF_MESSAGEBOX;
			DfInitWindowColors(wnd);
            DfClearAttribute(wnd, DF_CONTROLBOX);
            break;
        case DFM_KEYBOARD:    {
            int c = tolower((int)p1);
            if (c == 'y')
                DfSendMessage(wnd, DFM_COMMAND, DF_ID_OK, 0);
            else if (c == 'n')
                DfSendMessage(wnd, DFM_COMMAND, DF_ID_CANCEL, 0);
            break;
        }
        default:
            break;
    }
    return DfBaseWndProc(DF_MESSAGEBOX, wnd, msg, p1, p2);
}

int DfErrorBoxProc(DFWINDOW wnd, DFMESSAGE msg, DF_PARAM p1, DF_PARAM p2)
{
    switch (msg)    {
        case DFM_CREATE_WINDOW:
            DfGetClass(wnd) = DF_ERRORBOX;
			DfInitWindowColors(wnd);
            break;
        case DFM_KEYBOARD:
            if (p1 == '\r' || p1 == DF_ESC)
                ReturnValue = (int)p1;
            break;
        default:
            break;
    }
    return DfBaseWndProc(DF_ERRORBOX, wnd, msg, p1, p2);
}

int DfCancelBoxProc(DFWINDOW wnd, DFMESSAGE msg, DF_PARAM p1, DF_PARAM p2)
{
    switch (msg)    {
        case DFM_CREATE_WINDOW:
            CancelWnd = wnd;
            DfSendMessage(wnd, DFM_CAPTURE_MOUSE, 0, 0);
            DfSendMessage(wnd, DFM_CAPTURE_KEYBOARD, 0, 0);
            break;
        case DFM_COMMAND:
            if ((int) p1 == DF_ID_CANCEL && (int) p2 == 0)
                DfSendMessage(DfGetParent(wnd), msg, p1, p2);
            return TRUE;
        case DFM_CLOSE_WINDOW:
            CancelWnd = NULL;
            DfSendMessage(wnd, DFM_RELEASE_MOUSE, 0, 0);
            DfSendMessage(wnd, DFM_RELEASE_KEYBOARD, 0, 0);
            p1 = TRUE;
            break;
        default:
            break;
    }
    return DfBaseWndProc(DF_MESSAGEBOX, wnd, msg, p1, p2);
}

void DfCloseCancelBox(void)
{
    if (CancelWnd != NULL)
        DfSendMessage(CancelWnd, DFM_CLOSE_WINDOW, 0, 0);
}

static char *InputText;
static int TextLength;

int InputBoxProc(DFWINDOW wnd, DFMESSAGE msg, DF_PARAM p1, DF_PARAM p2)
{
    int rtn;
    switch (msg)    {
        case DFM_CREATE_WINDOW:
            rtn = DfDefaultWndProc(wnd, msg, p1, p2);
            DfSendMessage(DfControlWindow(&InputBoxDB,DF_ID_INPUTTEXT),
                        DFM_SETTEXTLENGTH, TextLength, 0);
            return rtn;
        case DFM_COMMAND:
            if ((int) p1 == DF_ID_OK && (int) p2 == 0)
                DfGetItemText(wnd, DF_ID_INPUTTEXT,
                            InputText, TextLength);
            break;
        default:
            break;
    }
    return DfDefaultWndProc(wnd, msg, p1, p2);
}

BOOL DfInputBox(DFWINDOW wnd,char *ttl,char *msg,char *text,int len)
{
    InputText = text;
    TextLength = len;
    InputBoxDB.dwnd.title = ttl;
    InputBoxDB.dwnd.w = 4 +
        max(20, max(len, max((int)strlen(ttl), (int)strlen(msg))));
    InputBoxDB.ctl[1].dwnd.x = (InputBoxDB.dwnd.w-2-len)/2;
    InputBoxDB.ctl[0].dwnd.w = strlen(msg);
    InputBoxDB.ctl[0].itext = msg;
    InputBoxDB.ctl[1].dwnd.w = len;
    InputBoxDB.ctl[2].dwnd.x = (InputBoxDB.dwnd.w - 20) / 2;
    InputBoxDB.ctl[3].dwnd.x = InputBoxDB.ctl[2].dwnd.x + 10;
    InputBoxDB.ctl[2].isetting = DF_ON;
    InputBoxDB.ctl[3].isetting = DF_ON;
    return DfDialogBox(wnd, &InputBoxDB, TRUE, InputBoxProc);
}

BOOL DfGenericMessage(DFWINDOW wnd,char *ttl,char *msg,int buttonct,
      int (*wndproc)(struct DfWindow *,enum DfMessages,DF_PARAM,DF_PARAM),
      char *b1, char *b2, int c1, int c2, int isModal)
{
    BOOL rtn;
    MsgBox.dwnd.title = ttl;
    MsgBox.ctl[0].dwnd.h = DfMsgHeight(msg);
	if (ttl)
		MsgBox.ctl[0].dwnd.w = max(max(DfMsgWidth(msg),
			   (int)(buttonct*8 + buttonct + 2)), (int)strlen(ttl)+2);
	else
		MsgBox.ctl[0].dwnd.w = max(DfMsgWidth(msg), (int)(buttonct*8 + buttonct + 2));
    MsgBox.dwnd.h = MsgBox.ctl[0].dwnd.h+6;
    MsgBox.dwnd.w = MsgBox.ctl[0].dwnd.w+4;
    if (buttonct == 1)
        MsgBox.ctl[1].dwnd.x = (MsgBox.dwnd.w - 10) / 2;
    else    {
        MsgBox.ctl[1].dwnd.x = (MsgBox.dwnd.w - 20) / 2;
        MsgBox.ctl[2].dwnd.x = MsgBox.ctl[1].dwnd.x + 10;
        MsgBox.ctl[2].class = DF_BUTTON;
    }
    MsgBox.ctl[1].dwnd.y = MsgBox.dwnd.h - 4;
    MsgBox.ctl[2].dwnd.y = MsgBox.dwnd.h - 4;
    MsgBox.ctl[0].itext = msg;
    MsgBox.ctl[1].itext = b1;
    MsgBox.ctl[2].itext = b2;
    MsgBox.ctl[1].command = c1;
    MsgBox.ctl[2].command = c2;
    MsgBox.ctl[1].isetting = DF_ON;
    MsgBox.ctl[2].isetting = DF_ON;
    rtn = DfDialogBox(wnd, &MsgBox, isModal, wndproc);
    MsgBox.ctl[2].class = 0;
    return rtn;
}

DFWINDOW DfMomentaryMessage(char *msg)
{
    DFWINDOW wnd = DfDfCreateWindow(
                    DF_TEXTBOX,
                    NULL,
                    -1,-1,DfMsgHeight(msg)+2,DfMsgWidth(msg)+2,
                    NULL,NULL,NULL,
                    DF_HASBORDER | DF_SHADOW | DF_SAVESELF);
    DfSendMessage(wnd, DFM_SETTEXT, (DF_PARAM) msg, 0);
    DfWindowClientColor(wnd, WHITE, GREEN);
    DfWindowFrameColor(wnd, WHITE, GREEN);
    DfSendMessage (wnd, DFM_SHOW_WINDOW, 0, 0);
    return wnd;
}

int DfMsgHeight(char *msg)
{
	int h = 1;

	while ((msg = strchr(msg, '\n')) != NULL)
	{
		h++;
		msg++;
	}

	return min(h, DfGetScreenHeight ()-10);
}

int DfMsgWidth(char *msg)
{
	int w = 0;
	char *cp = msg;

	while ((cp = strchr(msg, '\n')) != NULL)
	{
		w = max(w, (int) (cp-msg));
		msg = cp+1;
	}

	return min(max((int)strlen(msg), (int)w), DfGetScreenWidth()-10);
}

/* EOF */