mirror of
https://github.com/reactos/reactos.git
synced 2024-10-31 20:02:55 +00:00
ec3b369d83
svn path=/trunk/; revision=4921
186 lines
4.5 KiB
C
186 lines
4.5 KiB
C
/* ------------- calendar.c ------------- */
|
|
#include "dflat.h"
|
|
|
|
#define CALHEIGHT 17
|
|
#define CALWIDTH 33
|
|
|
|
static int DyMo[] = {31,28,31,30,31,30,31,31,30,31,30,31};
|
|
static struct tm ttm;
|
|
static int dys[42];
|
|
static DFWINDOW Cwnd;
|
|
|
|
static void FixDate(void)
|
|
{
|
|
/* ---- adjust Feb for leap year ---- */
|
|
if (ttm.tm_year % 4 == 0)
|
|
{
|
|
if (ttm.tm_year % 100 == 0)
|
|
{
|
|
if (ttm.tm_year % 400 == 0)
|
|
{
|
|
DyMo[1] = 29;
|
|
}
|
|
else
|
|
{
|
|
DyMo[1] = 28;
|
|
}
|
|
}
|
|
else
|
|
{
|
|
DyMo[1] = 29;
|
|
}
|
|
}
|
|
else
|
|
{
|
|
DyMo[1] = 28;
|
|
}
|
|
|
|
ttm.tm_mday = min(ttm.tm_mday, DyMo[ttm.tm_mon]);
|
|
}
|
|
|
|
/* ---- build calendar dates array ---- */
|
|
static void BuildDateArray(void)
|
|
{
|
|
int offset, dy = 0;
|
|
memset(dys, 0, sizeof dys);
|
|
FixDate();
|
|
/* ----- compute the weekday for the 1st ----- */
|
|
offset = ((ttm.tm_mday-1) - ttm.tm_wday) % 7;
|
|
if (offset < 0)
|
|
offset += 7;
|
|
if (offset)
|
|
offset = (offset - 7) * -1;
|
|
/* ----- build the dates into the array ---- */
|
|
for (dy = 1; dy <= DyMo[ttm.tm_mon]; dy++)
|
|
dys[offset++] = dy;
|
|
}
|
|
|
|
static void CreateWindowMsg(DFWINDOW wnd)
|
|
{
|
|
int x, y;
|
|
DfDrawBox(wnd, 1, 2, CALHEIGHT-4, CALWIDTH-4);
|
|
for (x = 5; x < CALWIDTH-4; x += 4)
|
|
DfDrawVector(wnd, x, 2, CALHEIGHT-4, FALSE);
|
|
for (y = 4; y < CALHEIGHT-3; y+=2)
|
|
DfDrawVector(wnd, 1, y, CALWIDTH-4, TRUE);
|
|
}
|
|
|
|
static void DisplayDates(DFWINDOW wnd)
|
|
{
|
|
int week, day;
|
|
char dyln[10];
|
|
int offset;
|
|
char banner[CALWIDTH-1];
|
|
char banner1[30];
|
|
|
|
DfSetStandardColor(wnd);
|
|
DfPutWindowLine(wnd, "Sun Mon Tue Wed Thu Fri Sat", 2, 1);
|
|
memset(banner, ' ', CALWIDTH-2);
|
|
strftime(banner1, 16, "%B, %Y", &ttm);
|
|
offset = (CALWIDTH-2 - strlen(banner1)) / 2;
|
|
strcpy(banner+offset, banner1);
|
|
strcat(banner, " ");
|
|
DfPutWindowLine(wnd, banner, 0, 0);
|
|
BuildDateArray();
|
|
for (week = 0; week < 6; week++) {
|
|
for (day = 0; day < 7; day++) {
|
|
int dy = dys[week*7+day];
|
|
if (dy == 0)
|
|
strcpy(dyln, " ");
|
|
else {
|
|
if (dy == ttm.tm_mday)
|
|
sprintf(dyln, "%c%c%c%2d %c",
|
|
DF_CHANGECOLOR,
|
|
DfSelectForeground(wnd)+0x80,
|
|
DfSelectBackground(wnd)+0x80,
|
|
dy, DF_RESETCOLOR);
|
|
else
|
|
sprintf(dyln, "%2d ", dy);
|
|
}
|
|
DfSetStandardColor(wnd);
|
|
DfPutWindowLine(wnd, dyln, 2 + day * 4, 3 + week*2);
|
|
}
|
|
}
|
|
}
|
|
|
|
static int KeyboardMsg(DFWINDOW wnd, DF_PARAM p1)
|
|
{
|
|
switch ((int)p1) {
|
|
case DF_PGUP:
|
|
if (ttm.tm_mon == 0) {
|
|
ttm.tm_mon = 12;
|
|
ttm.tm_year--;
|
|
}
|
|
ttm.tm_mon--;
|
|
FixDate();
|
|
mktime(&ttm);
|
|
DisplayDates(wnd);
|
|
return TRUE;
|
|
case DF_PGDN:
|
|
ttm.tm_mon++;
|
|
if (ttm.tm_mon == 12) {
|
|
ttm.tm_mon = 0;
|
|
ttm.tm_year++;
|
|
}
|
|
FixDate();
|
|
mktime(&ttm);
|
|
DisplayDates(wnd);
|
|
return TRUE;
|
|
default:
|
|
break;
|
|
}
|
|
return FALSE;
|
|
}
|
|
|
|
static int CalendarProc(DFWINDOW wnd,DFMESSAGE msg,
|
|
DF_PARAM p1,DF_PARAM p2)
|
|
{
|
|
switch (msg) {
|
|
case DFM_CREATE_WINDOW:
|
|
DfDefaultWndProc(wnd, msg, p1, p2);
|
|
CreateWindowMsg(wnd);
|
|
return TRUE;
|
|
case DFM_KEYBOARD:
|
|
if (KeyboardMsg(wnd, p1))
|
|
return TRUE;
|
|
break;
|
|
case DFM_PAINT:
|
|
DfDefaultWndProc(wnd, msg, p1, p2);
|
|
DisplayDates(wnd);
|
|
return TRUE;
|
|
case DFM_COMMAND:
|
|
if ((int)p1 == DF_ID_HELP) {
|
|
DfDisplayHelp(wnd, "Calendar");
|
|
return TRUE;
|
|
}
|
|
break;
|
|
case DFM_CLOSE_WINDOW:
|
|
Cwnd = NULL;
|
|
break;
|
|
default:
|
|
break;
|
|
}
|
|
return DfDefaultWndProc(wnd, msg, p1, p2);
|
|
}
|
|
|
|
void Calendar(DFWINDOW pwnd)
|
|
{
|
|
if (Cwnd == NULL) {
|
|
time_t tim = time(NULL);
|
|
ttm = *localtime(&tim);
|
|
Cwnd = DfDfCreateWindow(DF_PICTUREBOX,
|
|
"Calendar",
|
|
-1, -1, CALHEIGHT, CALWIDTH,
|
|
NULL, pwnd, CalendarProc,
|
|
DF_SHADOW |
|
|
DF_MINMAXBOX |
|
|
DF_CONTROLBOX |
|
|
DF_MOVEABLE |
|
|
DF_HASBORDER
|
|
);
|
|
}
|
|
DfSendMessage(Cwnd, DFM_SETFOCUS, TRUE, 0);
|
|
}
|
|
|
|
/* EOF */
|