mirror of
https://github.com/reactos/reactos.git
synced 2024-10-30 19:41:57 +00:00
216 lines
5.8 KiB
C
216 lines
5.8 KiB
C
|
/* ------------------ msgbox.c ------------------ */
|
||
|
|
||
|
#include "dflat32/dflat.h"
|
||
|
|
||
|
extern DBOX MsgBox;
|
||
|
extern DBOX InputBoxDB;
|
||
|
DFWINDOW CancelWnd;
|
||
|
|
||
|
static int ReturnValue;
|
||
|
|
||
|
int MessageBoxProc(DFWINDOW wnd, DFMESSAGE msg, PARAM p1, PARAM p2)
|
||
|
{
|
||
|
switch (msg) {
|
||
|
case CREATE_WINDOW:
|
||
|
GetClass(wnd) = MESSAGEBOX;
|
||
|
InitWindowColors(wnd);
|
||
|
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(DFWINDOW wnd, DFMESSAGE msg, PARAM p1, PARAM p2)
|
||
|
{
|
||
|
switch (msg) {
|
||
|
case CREATE_WINDOW:
|
||
|
GetClass(wnd) = MESSAGEBOX;
|
||
|
InitWindowColors(wnd);
|
||
|
ClearAttribute(wnd, CONTROLBOX);
|
||
|
break;
|
||
|
case KEYBOARD: {
|
||
|
int c = tolower((int)p1);
|
||
|
if (c == 'y')
|
||
|
DfSendMessage(wnd, DFM_COMMAND, ID_OK, 0);
|
||
|
else if (c == 'n')
|
||
|
DfSendMessage(wnd, DFM_COMMAND, ID_CANCEL, 0);
|
||
|
break;
|
||
|
}
|
||
|
default:
|
||
|
break;
|
||
|
}
|
||
|
return BaseWndProc(MESSAGEBOX, wnd, msg, p1, p2);
|
||
|
}
|
||
|
|
||
|
int ErrorBoxProc(DFWINDOW wnd, DFMESSAGE msg, PARAM p1, PARAM p2)
|
||
|
{
|
||
|
switch (msg) {
|
||
|
case CREATE_WINDOW:
|
||
|
GetClass(wnd) = ERRORBOX;
|
||
|
InitWindowColors(wnd);
|
||
|
break;
|
||
|
case KEYBOARD:
|
||
|
if (p1 == '\r' || p1 == ESC)
|
||
|
ReturnValue = (int)p1;
|
||
|
break;
|
||
|
default:
|
||
|
break;
|
||
|
}
|
||
|
return BaseWndProc(ERRORBOX, wnd, msg, p1, p2);
|
||
|
}
|
||
|
|
||
|
int CancelBoxProc(DFWINDOW wnd, DFMESSAGE msg, PARAM p1, PARAM p2)
|
||
|
{
|
||
|
switch (msg) {
|
||
|
case CREATE_WINDOW:
|
||
|
CancelWnd = wnd;
|
||
|
DfSendMessage(wnd, CAPTURE_MOUSE, 0, 0);
|
||
|
DfSendMessage(wnd, CAPTURE_KEYBOARD, 0, 0);
|
||
|
break;
|
||
|
case DFM_COMMAND:
|
||
|
if ((int) p1 == ID_CANCEL && (int) p2 == 0)
|
||
|
DfSendMessage(GetParent(wnd), msg, p1, p2);
|
||
|
return TRUE;
|
||
|
case CLOSE_WINDOW:
|
||
|
CancelWnd = NULL;
|
||
|
DfSendMessage(wnd, RELEASE_MOUSE, 0, 0);
|
||
|
DfSendMessage(wnd, RELEASE_KEYBOARD, 0, 0);
|
||
|
p1 = TRUE;
|
||
|
break;
|
||
|
default:
|
||
|
break;
|
||
|
}
|
||
|
return BaseWndProc(MESSAGEBOX, wnd, msg, p1, p2);
|
||
|
}
|
||
|
|
||
|
void CloseCancelBox(void)
|
||
|
{
|
||
|
if (CancelWnd != NULL)
|
||
|
DfSendMessage(CancelWnd, CLOSE_WINDOW, 0, 0);
|
||
|
}
|
||
|
|
||
|
static char *InputText;
|
||
|
static int TextLength;
|
||
|
|
||
|
int InputBoxProc(DFWINDOW wnd, DFMESSAGE msg, PARAM p1, PARAM p2)
|
||
|
{
|
||
|
int rtn;
|
||
|
switch (msg) {
|
||
|
case CREATE_WINDOW:
|
||
|
rtn = DefaultWndProc(wnd, msg, p1, p2);
|
||
|
DfSendMessage(ControlWindow(&InputBoxDB,ID_INPUTTEXT),
|
||
|
SETTEXTLENGTH, TextLength, 0);
|
||
|
return rtn;
|
||
|
case DFM_COMMAND:
|
||
|
if ((int) p1 == ID_OK && (int) p2 == 0)
|
||
|
GetItemText(wnd, ID_INPUTTEXT,
|
||
|
InputText, TextLength);
|
||
|
break;
|
||
|
default:
|
||
|
break;
|
||
|
}
|
||
|
return DefaultWndProc(wnd, msg, p1, p2);
|
||
|
}
|
||
|
|
||
|
BOOL InputBox(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 = ON;
|
||
|
InputBoxDB.ctl[3].isetting = ON;
|
||
|
return DfDialogBox(wnd, &InputBoxDB, TRUE, InputBoxProc);
|
||
|
}
|
||
|
|
||
|
BOOL GenericMessage(DFWINDOW 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)
|
||
|
{
|
||
|
BOOL rtn;
|
||
|
MsgBox.dwnd.title = ttl;
|
||
|
MsgBox.ctl[0].dwnd.h = MsgHeight(msg);
|
||
|
if (ttl)
|
||
|
MsgBox.ctl[0].dwnd.w = max(max(MsgWidth(msg),
|
||
|
(int)(buttonct*8 + buttonct + 2)), (int)strlen(ttl)+2);
|
||
|
else
|
||
|
MsgBox.ctl[0].dwnd.w = max(MsgWidth(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 = 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 = DfDialogBox(wnd, &MsgBox, isModal, wndproc);
|
||
|
MsgBox.ctl[2].class = 0;
|
||
|
return rtn;
|
||
|
}
|
||
|
|
||
|
DFWINDOW MomentaryMessage(char *msg)
|
||
|
{
|
||
|
DFWINDOW wnd = DfCreateWindow(
|
||
|
TEXTBOX,
|
||
|
NULL,
|
||
|
-1,-1,MsgHeight(msg)+2,MsgWidth(msg)+2,
|
||
|
NULL,NULL,NULL,
|
||
|
HASBORDER | SHADOW | SAVESELF);
|
||
|
DfSendMessage(wnd, SETTEXT, (PARAM) msg, 0);
|
||
|
WindowClientColor(wnd, WHITE, GREEN);
|
||
|
WindowFrameColor(wnd, WHITE, GREEN);
|
||
|
DfSendMessage (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, DfGetScreenHeight ()-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((int)strlen(msg), (int)w), DfGetScreenWidth()-10);
|
||
|
}
|
||
|
|
||
|
/* EOF */
|