/* -------------- combobox.c -------------- */

#include "dflat.h"

int ListProc(DFWINDOW, DFMESSAGE, DF_PARAM, DF_PARAM);

int DfComboProc(DFWINDOW wnd, DFMESSAGE msg, DF_PARAM p1, DF_PARAM p2)
{
    switch (msg)    {
        case DFM_CREATE_WINDOW:
            wnd->extension = DfDfCreateWindow(
                        DF_LISTBOX,
                        NULL,
                        wnd->rc.lf,wnd->rc.tp+1,
                        wnd->ht-1, wnd->wd+1,
                        NULL,
                        wnd,
                        ListProc,
                        DF_HASBORDER | DF_NOCLIP | DF_SAVESELF);
            ((DFWINDOW)(wnd->extension))->ct->command =
                                        wnd->ct->command;
            wnd->ht = 1;
            wnd->rc.bt = wnd->rc.tp;
			break;
        case DFM_PAINT:
            DfForeground = DfWndBackground(wnd);
            DfBackground = DfWndForeground(wnd);
            DfWPutch(wnd, DF_DOWNSCROLLBOX, DfWindowWidth(wnd), 0);
            break;
        case DFM_KEYBOARD:
            if ((int)p1 == DF_DN)    {
                DfSendMessage(wnd->extension, DFM_SETFOCUS, TRUE, 0);
                return TRUE;
            }
            break;
        case DFM_LEFT_BUTTON:
            if ((int)p1 == DfGetRight(wnd) + 1)
                DfSendMessage(wnd->extension, DFM_SETFOCUS, TRUE, 0);
            break;
        case DFM_CLOSE_WINDOW:
            DfSendMessage(wnd->extension, DFM_CLOSE_WINDOW, 0, 0);
            break;
        default:
            break;
    }
    return DfBaseWndProc(DF_COMBOBOX, wnd, msg, p1, p2);
}

int ListProc(DFWINDOW wnd, DFMESSAGE msg, DF_PARAM p1, DF_PARAM p2)
{
	DFWINDOW pwnd = DfGetParent(DfGetParent(wnd));
	DF_DBOX *db = pwnd->extension;
	DFWINDOW cwnd;
	char text[130];
	int rtn;
	DFWINDOW currFocus;

	switch (msg)
	{
		case DFM_CREATE_WINDOW:
			wnd->ct = DfMalloc(sizeof(DF_CTLWINDOW));
			wnd->ct->setting = DF_OFF;
			wnd->WindowColors[DF_FRAME_COLOR][DF_FG] =
				wnd->WindowColors[DF_STD_COLOR][DF_FG];
			wnd->WindowColors[DF_FRAME_COLOR][DF_BG] =
				wnd->WindowColors[DF_STD_COLOR][DF_BG];
			rtn = DfDefaultWndProc(wnd, msg, p1, p2);
			return rtn;

		case DFM_SETFOCUS:
			if ((int)p1 == FALSE)
			{
				if (!wnd->isHelping)
				{
					DfSendMessage(wnd, DFM_HIDE_WINDOW, 0, 0);
					wnd->ct->setting = DF_OFF;
				}
			}
			else
				wnd->ct->setting = DF_ON;
			break;

		case DFM_SHOW_WINDOW:
			if (wnd->ct->setting == DF_OFF)
				return TRUE;
			break;

		case DFM_BORDER:
			currFocus = DfInFocus;
			DfInFocus = NULL;
			rtn = DfDefaultWndProc(wnd, msg, p1, p2);
			DfInFocus = currFocus;
			return rtn;

		case DFM_LB_SELECTION:
			rtn = DfDefaultWndProc(wnd, msg, p1, p2);
			DfSendMessage(wnd, DFM_LB_GETTEXT,
			              (DF_PARAM) text, wnd->selection);
			DfPutItemText(pwnd, wnd->ct->command, text);
			cwnd = DfControlWindow(db, wnd->ct->command);
			DfSendMessage(cwnd, DFM_PAINT, 0, 0);
			cwnd->TextChanged = TRUE;
			return rtn;

		case DFM_KEYBOARD:
			switch ((int) p1)
			{
				case DF_ESC:
				case DF_FWD:
				case DF_BS:
					cwnd = DfControlWindow(db, wnd->ct->command);
					DfSendMessage(cwnd, DFM_SETFOCUS, TRUE, 0);
					return TRUE;

				default:
					break;
			}
			break;

		case DFM_LB_CHOOSE:
			cwnd = DfControlWindow(db, wnd->ct->command);
			DfSendMessage(cwnd, DFM_SETFOCUS, TRUE, 0);
			return TRUE;

		case DFM_CLOSE_WINDOW:
			if (wnd->ct != NULL)
				free(wnd->ct);
			wnd->ct = NULL;
			break;

		default:
			break;
	}

	return DfDefaultWndProc(wnd, msg, p1, p2);
}

void DfPutComboListText(DFWINDOW wnd, enum DfCommands cmd, char *text)
{
	DF_CTLWINDOW *ct = DfFindCommand(wnd->extension, cmd, DF_COMBOBOX);

	if (ct != NULL)
	{
		DFWINDOW lwnd = ((DFWINDOW)(ct->wnd))->extension;
		DfSendMessage(lwnd, DFM_ADDTEXT, (DF_PARAM) text, 0);
	}
}

/* EOF */