mirror of
https://github.com/reactos/reactos.git
synced 2024-08-21 10:53:15 +00:00
![Eric Kohl](/assets/img/avatar_default.png)
Fixed problems with differnet console sizes Started function renaming svn path=/trunk/; revision=1034
186 lines
4.4 KiB
C
186 lines
4.4 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;
|
|
DrawBox(wnd, 1, 2, CALHEIGHT-4, CALWIDTH-4);
|
|
for (x = 5; x < CALWIDTH-4; x += 4)
|
|
DrawVector(wnd, x, 2, CALHEIGHT-4, FALSE);
|
|
for (y = 4; y < CALHEIGHT-3; y+=2)
|
|
DrawVector(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];
|
|
|
|
SetStandardColor(wnd);
|
|
PutWindowLine(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, " ");
|
|
PutWindowLine(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",
|
|
CHANGECOLOR,
|
|
SelectForeground(wnd)+0x80,
|
|
SelectBackground(wnd)+0x80,
|
|
dy, RESETCOLOR);
|
|
else
|
|
sprintf(dyln, "%2d ", dy);
|
|
}
|
|
SetStandardColor(wnd);
|
|
PutWindowLine(wnd, dyln, 2 + day * 4, 3 + week*2);
|
|
}
|
|
}
|
|
}
|
|
|
|
static int KeyboardMsg(DFWINDOW wnd, PARAM p1)
|
|
{
|
|
switch ((int)p1) {
|
|
case PGUP:
|
|
if (ttm.tm_mon == 0) {
|
|
ttm.tm_mon = 12;
|
|
ttm.tm_year--;
|
|
}
|
|
ttm.tm_mon--;
|
|
FixDate();
|
|
mktime(&ttm);
|
|
DisplayDates(wnd);
|
|
return TRUE;
|
|
case 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,
|
|
PARAM p1,PARAM p2)
|
|
{
|
|
switch (msg) {
|
|
case CREATE_WINDOW:
|
|
DefaultWndProc(wnd, msg, p1, p2);
|
|
CreateWindowMsg(wnd);
|
|
return TRUE;
|
|
case KEYBOARD:
|
|
if (KeyboardMsg(wnd, p1))
|
|
return TRUE;
|
|
break;
|
|
case PAINT:
|
|
DefaultWndProc(wnd, msg, p1, p2);
|
|
DisplayDates(wnd);
|
|
return TRUE;
|
|
case DFM_COMMAND:
|
|
if ((int)p1 == ID_HELP) {
|
|
DisplayHelp(wnd, "Calendar");
|
|
return TRUE;
|
|
}
|
|
break;
|
|
case CLOSE_WINDOW:
|
|
Cwnd = NULL;
|
|
break;
|
|
default:
|
|
break;
|
|
}
|
|
return DefaultWndProc(wnd, msg, p1, p2);
|
|
}
|
|
|
|
void Calendar(DFWINDOW pwnd)
|
|
{
|
|
if (Cwnd == NULL) {
|
|
time_t tim = time(NULL);
|
|
ttm = *localtime(&tim);
|
|
Cwnd = DfCreateWindow(PICTUREBOX,
|
|
"Calendar",
|
|
-1, -1, CALHEIGHT, CALWIDTH,
|
|
NULL, pwnd, CalendarProc,
|
|
SHADOW |
|
|
MINMAXBOX |
|
|
CONTROLBOX |
|
|
MOVEABLE |
|
|
HASBORDER
|
|
);
|
|
}
|
|
DfSendMessage(Cwnd, SETFOCUS, TRUE, 0);
|
|
}
|
|
|
|
/* EOF */
|