/* ------------------ msgbox.c ------------------ */ #include "dflat.h" extern DBOX MsgBox; WINDOW CancelWnd; static int ReturnValue; int MessageBoxProc(WINDOW wnd, MESSAGE msg, PARAM p1, PARAM p2) { switch (msg) { case CREATE_WINDOW: GetClass(wnd) = MESSAGEBOX; ClearAttribute(wnd, CONTROLBOX); break; case KEYBOARD: if (p1 == '\r' || p1 == ESC) ReturnValue = (int)p1; break; default: break; } return BaseWndProc(MESSAGEBOX, wnd, msg, p1, p2); } int YesNoBoxProc(WINDOW wnd, MESSAGE msg, PARAM p1, PARAM p2) { switch (msg) { case CREATE_WINDOW: GetClass(wnd) = MESSAGEBOX; ClearAttribute(wnd, CONTROLBOX); break; case KEYBOARD: { int c = tolower((int)p1); if (c == 'y') SendMessage(wnd, COMMAND, ID_OK, 0); else if (c == 'n') SendMessage(wnd, COMMAND, ID_CANCEL, 0); break; } default: break; } return BaseWndProc(MESSAGEBOX, wnd, msg, p1, p2); } int ErrorBoxProc(WINDOW wnd, MESSAGE msg, PARAM p1, PARAM p2) { switch (msg) { case CREATE_WINDOW: GetClass(wnd) = ERRORBOX; break; case KEYBOARD: if (p1 == '\r' || p1 == ESC) ReturnValue = (int)p1; break; default: break; } return BaseWndProc(ERRORBOX, wnd, msg, p1, p2); } int CancelBoxProc(WINDOW wnd, MESSAGE msg, PARAM p1, PARAM p2) { switch (msg) { case CREATE_WINDOW: CancelWnd = wnd; SendMessage(wnd, CAPTURE_MOUSE, 0, 0); SendMessage(wnd, CAPTURE_KEYBOARD, 0, 0); break; case COMMAND: if ((int) p1 == ID_CANCEL && (int) p2 == 0) SendMessage(GetParent(wnd), msg, p1, p2); return TRUE; case CLOSE_WINDOW: CancelWnd = NULL; SendMessage(wnd, RELEASE_MOUSE, 0, 0); SendMessage(wnd, RELEASE_KEYBOARD, 0, 0); p1 = TRUE; break; default: break; } return BaseWndProc(MESSAGEBOX, wnd, msg, p1, p2); } void CloseCancelBox(void) { if (CancelWnd != NULL) SendMessage(CancelWnd, CLOSE_WINDOW, 0, 0); } int GenericMessage(WINDOW wnd, char *ttl, char *msg, int buttonct, int (*wndproc)(struct window *, enum messages, PARAM, PARAM), char *b1, char *b2, int c1, int c2, int isModal) { int rtn; MsgBox.dwnd.title = ttl; MsgBox.ctl[0].dwnd.h = MsgHeight(msg); MsgBox.ctl[0].dwnd.w = max(max(MsgWidth(msg), buttonct*8 + buttonct + 2), strlen(ttl)+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 = 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 = ON; MsgBox.ctl[2].isetting = ON; rtn = DialogBox(wnd, &MsgBox, isModal, wndproc); MsgBox.ctl[2].class = 0; return rtn; } WINDOW MomentaryMessage(char *msg) { WINDOW wnd = CreateWindow( TEXTBOX, NULL, -1,-1,MsgHeight(msg)+2,MsgWidth(msg)+2, NULL,NULL,NULL, HASBORDER | SHADOW | SAVESELF); SendMessage(wnd, SETTEXT, (PARAM) msg, 0); if (cfg.mono == 0) { WindowClientColor(wnd, WHITE, GREEN); WindowFrameColor(wnd, WHITE, GREEN); } SendMessage(wnd, SHOW_WINDOW, 0, 0); return wnd; } int MsgHeight(char *msg) { int h = 1; while ((msg = strchr(msg, '\n')) != NULL) { h++; msg++; } return min(h, SCREENHEIGHT-10); } int MsgWidth(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(strlen(msg),w), SCREENWIDTH-10); }