207 lines
7.7 KiB
C
207 lines
7.7 KiB
C
/*
|
|
*********************************************************************************************************
|
|
* uC/GUI
|
|
* Universal graphic software for embedded applications
|
|
*
|
|
* (c) Copyright 2002, Micrium Inc., Weston, FL
|
|
* (c) Copyright 2002, SEGGER Microcontroller Systeme GmbH
|
|
*
|
|
* µC/GUI is protected by international copyright laws. Knowledge of the
|
|
* source code may not be used to write a similar product. This file may
|
|
* only be used in accordance with a license and should not be redistributed
|
|
* in any way. We appreciate your understanding and fairness.
|
|
*
|
|
----------------------------------------------------------------------
|
|
File : MESSAGEBOX.c
|
|
Purpose : Implementation of Mesagebox
|
|
---------------------------END-OF-HEADER------------------------------
|
|
*/
|
|
|
|
|
|
#include <string.h> /* for memset */
|
|
#include "GUI.h"
|
|
#include "BUTTON.h"
|
|
#include "FRAMEWIN.h"
|
|
#include "TEXT.h"
|
|
#include "DIALOG.h"
|
|
#include "MESSAGEBOX.h"
|
|
|
|
#if GUI_WINSUPPORT
|
|
|
|
/*********************************************************************
|
|
*
|
|
* Defaults
|
|
*
|
|
**********************************************************************
|
|
*/
|
|
|
|
#ifndef MESSAGEBOX_BORDER
|
|
#define MESSAGEBOX_BORDER 4
|
|
#endif
|
|
|
|
#ifndef MESSAGEBOX_XSIZEOK
|
|
#define MESSAGEBOX_XSIZEOK 50
|
|
#endif
|
|
|
|
#ifndef MESSAGEBOX_YSIZEOK
|
|
#define MESSAGEBOX_YSIZEOK 20
|
|
#endif
|
|
|
|
#ifndef MESSAGEBOX_BKCOLOR
|
|
#define MESSAGEBOX_BKCOLOR GUI_WHITE
|
|
#endif
|
|
|
|
#define ID_FRAME 100
|
|
|
|
/*********************************************************************
|
|
*
|
|
* Static functions
|
|
*
|
|
**********************************************************************
|
|
*/
|
|
/*********************************************************************
|
|
*
|
|
* _MESSAGEBOX_cbCallback
|
|
*/
|
|
static void _MESSAGEBOX_cbCallback(WM_MESSAGE * pMsg) {
|
|
WM_HWIN hWin = pMsg->hWin;
|
|
switch (pMsg->MsgId) {
|
|
case WM_INIT_DIALOG:
|
|
FRAMEWIN_SetClientColor(hWin, MESSAGEBOX_BKCOLOR);
|
|
break;
|
|
case WM_KEY:
|
|
{
|
|
int Key = ((const WM_KEY_INFO*)(pMsg->Data.p))->Key;
|
|
if (((const WM_KEY_INFO*)(pMsg->Data.p))->PressedCnt) {
|
|
switch (Key) {
|
|
case GUI_KEY_ESCAPE:
|
|
GUI_EndDialog(hWin, 1); /* End dialog with return value 1 if <ESC> is pressed */
|
|
break;
|
|
case GUI_KEY_ENTER:
|
|
GUI_EndDialog(hWin, 0); /* End dialog with return value 0 if <ENTER> is pressed */
|
|
break;
|
|
}
|
|
}
|
|
}
|
|
break;
|
|
case WM_NOTIFY_PARENT:
|
|
{
|
|
int NCode = pMsg->Data.v; /* Get notification code */
|
|
int Id = WM_GetId(pMsg->hWinSrc); /* Get control ID */
|
|
switch (NCode) {
|
|
case WM_NOTIFICATION_RELEASED: /* React only if released */
|
|
if (Id == GUI_ID_OK) {
|
|
GUI_EndDialog(hWin, 0); /* End dialog with return value 0 if OK */
|
|
}
|
|
break;
|
|
}
|
|
}
|
|
break;
|
|
default:
|
|
WM_DefaultProc(pMsg);
|
|
}
|
|
}
|
|
|
|
/*********************************************************************
|
|
*
|
|
* Exported routines
|
|
*
|
|
**********************************************************************
|
|
*/
|
|
/*********************************************************************
|
|
*
|
|
* MESSAGEBOX_Create
|
|
*/
|
|
WM_HWIN MESSAGEBOX_Create(const char * sMessage, const char * sCaption, int Flags) {
|
|
GUI_WIDGET_CREATE_INFO _aDialogCreate[3]; /* 0: FrameWin, 1: Text, 2: Button */
|
|
int BorderSize = FRAMEWIN_GetDefaultBorderSize(); /* Default border size of frame window */
|
|
int xSizeFrame = MESSAGEBOX_XSIZEOK + 2 * BorderSize + MESSAGEBOX_BORDER * 2; /* XSize of frame window */
|
|
int ySizeFrame; /* YSize of frame window */
|
|
int x0, y0; /* Position of frame window */
|
|
int xSizeMessage; /* Length in pixels of message */
|
|
int xSizeCaption; /* Length in pixels of caption */
|
|
int ySizeCaption; /* YSize of caption */
|
|
int ySizeMessage; /* YSize of message */
|
|
GUI_RECT Rect;
|
|
const GUI_FONT GUI_UNI_PTR * pOldFont;
|
|
/* Zeroinit variables */
|
|
memset(_aDialogCreate, 0, sizeof(_aDialogCreate));
|
|
/* Get dimension of message */
|
|
pOldFont = GUI_SetFont(TEXT_GetDefaultFont());
|
|
GUI_GetTextExtend(&Rect, sMessage, 255);
|
|
xSizeMessage = Rect.x1 - Rect.x0 + MESSAGEBOX_BORDER * 2;
|
|
ySizeMessage = Rect.y1 - Rect.y0 + 1;
|
|
if (xSizeFrame < (xSizeMessage + 4 + MESSAGEBOX_BORDER * 2)) {
|
|
xSizeFrame = xSizeMessage + 4 + MESSAGEBOX_BORDER * 2;
|
|
}
|
|
ySizeCaption = GUI_GetYSizeOfFont(FRAMEWIN_GetDefaultFont());
|
|
ySizeFrame = ySizeMessage + /* size of message */
|
|
MESSAGEBOX_YSIZEOK + /* size of button */
|
|
ySizeCaption + /* caption size */
|
|
MESSAGEBOX_BORDER * 3 + /* inner border - text, text - button, button - bottom */
|
|
BorderSize * 2 + /* top & bottom border */
|
|
1; /* inner border */
|
|
/* Get xsize of caption */
|
|
xSizeCaption = GUI_GetStringDistX(sCaption);
|
|
if (xSizeFrame < xSizeCaption + BorderSize * 2) {
|
|
xSizeFrame = xSizeCaption + BorderSize * 2;
|
|
}
|
|
/* Check maximum */
|
|
if (xSizeFrame > LCD_GET_XSIZE()) {
|
|
xSizeFrame = LCD_GET_XSIZE();
|
|
}
|
|
if (ySizeFrame > LCD_GET_YSIZE()) {
|
|
ySizeFrame = LCD_GET_YSIZE();
|
|
}
|
|
/* Calculate position of framewin */
|
|
x0 = (LCD_GET_XSIZE() - xSizeFrame) / 2;
|
|
y0 = (LCD_GET_YSIZE() - ySizeFrame) / 2;
|
|
/* restore modified Context */
|
|
GUI_SetFont(pOldFont);
|
|
/* Fill frame win resource */
|
|
_aDialogCreate[0].pfCreateIndirect = FRAMEWIN_CreateIndirect;
|
|
_aDialogCreate[0].pName = sCaption;
|
|
_aDialogCreate[0].x0 = x0;
|
|
_aDialogCreate[0].y0 = y0;
|
|
_aDialogCreate[0].xSize = xSizeFrame;
|
|
_aDialogCreate[0].ySize = ySizeFrame;
|
|
if (Flags & GUI_MESSAGEBOX_CF_MOVEABLE) {
|
|
_aDialogCreate[0].Flags = FRAMEWIN_CF_MOVEABLE;
|
|
}
|
|
/* Fill text resource */
|
|
_aDialogCreate[1].pfCreateIndirect = TEXT_CreateIndirect;
|
|
_aDialogCreate[1].pName = sMessage;
|
|
_aDialogCreate[1].x0 = (xSizeFrame - xSizeMessage - BorderSize * 2) / 2;
|
|
_aDialogCreate[1].y0 = MESSAGEBOX_BORDER;
|
|
_aDialogCreate[1].xSize = xSizeMessage;
|
|
_aDialogCreate[1].ySize = ySizeMessage;
|
|
_aDialogCreate[1].Para = GUI_TA_TOP | GUI_TA_HCENTER;
|
|
/* Fill button resource */
|
|
_aDialogCreate[2].pfCreateIndirect = BUTTON_CreateIndirect;
|
|
_aDialogCreate[2].pName = "OK";
|
|
_aDialogCreate[2].Id = GUI_ID_OK;
|
|
_aDialogCreate[2].x0 = (xSizeFrame - MESSAGEBOX_XSIZEOK - BorderSize * 2) / 2;
|
|
_aDialogCreate[2].y0 = MESSAGEBOX_BORDER * 2 + ySizeMessage;
|
|
_aDialogCreate[2].xSize = MESSAGEBOX_XSIZEOK;
|
|
_aDialogCreate[2].ySize = MESSAGEBOX_YSIZEOK;
|
|
/* Create dialog */
|
|
return GUI_CreateDialogBox(_aDialogCreate, GUI_COUNTOF(_aDialogCreate), _MESSAGEBOX_cbCallback, 0, 0, 0);
|
|
}
|
|
|
|
/*********************************************************************
|
|
*
|
|
* GUI_MessageBox
|
|
*/
|
|
int GUI_MessageBox(const char * sMessage, const char * sCaption, int Flags) {
|
|
WM_HWIN hWin;
|
|
hWin = MESSAGEBOX_Create(sMessage, sCaption, Flags);
|
|
/* Exec dialog */
|
|
return GUI_ExecCreatedDialog(hWin);
|
|
}
|
|
|
|
#else
|
|
|
|
void GUI_MessageBox_C(void) {} /* avoid empty object files */
|
|
|
|
#endif /* GUI_WINSUPPORT */
|