- make monthcal a child of datetime (it was a sibling before, causing
completely incorrect message flow) - update monthcal after date change in datetime - choose different coordinates when DTS_SHOWNONE is not used - embedded monthcal is now 200 pixels wide - selecting a day in embedded monthcal updates the datetime and hides the monthcal - changing months/years by clicking month name/year in title bar works - embedded month calendar is correctly destroyed (it used to stick on the screen long after the datetime's container was closed)
This commit is contained in:
parent
a13b736829
commit
3ae8f73caf
|
@ -148,13 +148,14 @@ DATETIME_SetSystemTime (HWND hwnd, WPARAM wParam, LPARAM lParam )
|
||||||
TRACE("%p %04x %08lx\n",hwnd, wParam, lParam);
|
TRACE("%p %04x %08lx\n",hwnd, wParam, lParam);
|
||||||
if (!lParam) return 0;
|
if (!lParam) return 0;
|
||||||
|
|
||||||
TRACE("%04d/%02d/%02d %02d:%02d:%02d)\n",
|
TRACE("%04d/%02d/%02d %02d:%02d:%02d\n",
|
||||||
lprgSysTimeArray->wYear, lprgSysTimeArray->wMonth, lprgSysTimeArray->wDay,
|
lprgSysTimeArray->wYear, lprgSysTimeArray->wMonth, lprgSysTimeArray->wDay,
|
||||||
lprgSysTimeArray->wHour, lprgSysTimeArray->wMinute, lprgSysTimeArray->wSecond);
|
lprgSysTimeArray->wHour, lprgSysTimeArray->wMinute, lprgSysTimeArray->wSecond);
|
||||||
|
|
||||||
if (wParam==GDT_VALID) {
|
if (wParam==GDT_VALID) {
|
||||||
infoPtr->dateValid = TRUE;
|
infoPtr->dateValid = TRUE;
|
||||||
MONTHCAL_CopyTime (lprgSysTimeArray, &infoPtr->date);
|
MONTHCAL_CopyTime (lprgSysTimeArray, &infoPtr->date);
|
||||||
|
SendMessageA(infoPtr->hMonthCal, MCM_SETCURSEL, 0, (LPARAM)(&infoPtr->date));
|
||||||
SendMessageA (infoPtr->hwndCheckbut, BM_SETCHECK, BST_CHECKED, 0);
|
SendMessageA (infoPtr->hwndCheckbut, BM_SETCHECK, BST_CHECKED, 0);
|
||||||
} else if (wParam==GDT_NONE) {
|
} else if (wParam==GDT_NONE) {
|
||||||
infoPtr->dateValid = FALSE;
|
infoPtr->dateValid = FALSE;
|
||||||
|
@ -784,8 +785,10 @@ static void DATETIME_Refresh (HWND hwnd, HDC hdc)
|
||||||
GetTextExtentPoint32A (hdc, txt, strlen (txt), &size);
|
GetTextExtentPoint32A (hdc, txt, strlen (txt), &size);
|
||||||
rcDraw->bottom = size.cy+2;
|
rcDraw->bottom = size.cy+2;
|
||||||
|
|
||||||
if (dwStyle & DTS_SHOWNONE) checkbox->right = 18;
|
if (dwStyle & DTS_SHOWNONE)
|
||||||
|
checkbox->right = 18;
|
||||||
|
else
|
||||||
|
checkbox->right = 2;
|
||||||
prevright = checkbox->right;
|
prevright = checkbox->right;
|
||||||
|
|
||||||
for (i=0; i<infoPtr->nrFields; i++) {
|
for (i=0; i<infoPtr->nrFields; i++) {
|
||||||
|
@ -882,19 +885,25 @@ DATETIME_LButtonDown (HWND hwnd, WPARAM wParam, LPARAM lParam)
|
||||||
/* recalculate the position of the monthcal popup */
|
/* recalculate the position of the monthcal popup */
|
||||||
if(dwStyle & DTS_RIGHTALIGN)
|
if(dwStyle & DTS_RIGHTALIGN)
|
||||||
infoPtr->monthcal_pos.x = infoPtr->rcClient.right - ((infoPtr->calbutton.right -
|
infoPtr->monthcal_pos.x = infoPtr->rcClient.right - ((infoPtr->calbutton.right -
|
||||||
infoPtr->calbutton.left) + 145);
|
infoPtr->calbutton.left) + 200);
|
||||||
else
|
else
|
||||||
infoPtr->monthcal_pos.x = 8;
|
infoPtr->monthcal_pos.x = 8;
|
||||||
|
|
||||||
infoPtr->monthcal_pos.y = infoPtr->rcClient.bottom;
|
infoPtr->monthcal_pos.y = infoPtr->rcClient.bottom;
|
||||||
ClientToScreen (hwnd, &(infoPtr->monthcal_pos));
|
ClientToScreen (hwnd, &(infoPtr->monthcal_pos));
|
||||||
|
/* FIXME My Windoze has cx=about 200, but it probably depends on font size etc */
|
||||||
SetWindowPos(infoPtr->hMonthCal, 0, infoPtr->monthcal_pos.x,
|
SetWindowPos(infoPtr->hMonthCal, 0, infoPtr->monthcal_pos.x,
|
||||||
infoPtr->monthcal_pos.y, 145, 150, 0);
|
infoPtr->monthcal_pos.y, 200, 150, 0);
|
||||||
|
|
||||||
if(IsWindowVisible(infoPtr->hMonthCal))
|
if(IsWindowVisible(infoPtr->hMonthCal))
|
||||||
ShowWindow(infoPtr->hMonthCal, SW_HIDE);
|
ShowWindow(infoPtr->hMonthCal, SW_HIDE);
|
||||||
else
|
else {
|
||||||
ShowWindow(infoPtr->hMonthCal, SW_SHOW);
|
SYSTEMTIME *lprgSysTimeArray = &infoPtr->date;
|
||||||
|
TRACE("update calendar %04d/%02d/%02d\n",
|
||||||
|
lprgSysTimeArray->wYear, lprgSysTimeArray->wMonth, lprgSysTimeArray->wDay);
|
||||||
|
SendMessageA(infoPtr->hMonthCal, MCM_SETCURSEL, 0, (LPARAM)(&infoPtr->date));
|
||||||
|
ShowWindow(infoPtr->hMonthCal, SW_SHOW);
|
||||||
|
}
|
||||||
|
|
||||||
TRACE ("dt:%p mc:%p mc parent:%p, desktop:%p\n",
|
TRACE ("dt:%p mc:%p mc parent:%p, desktop:%p\n",
|
||||||
hwnd, infoPtr->hMonthCal, infoPtr->hwndNotify, GetDesktopWindow ());
|
hwnd, infoPtr->hMonthCal, infoPtr->hwndNotify, GetDesktopWindow ());
|
||||||
|
@ -995,6 +1004,17 @@ DATETIME_Notify (HWND hwnd, WPARAM wParam, LPARAM lParam)
|
||||||
TRACE ("%x,%lx\n",wParam, lParam);
|
TRACE ("%x,%lx\n",wParam, lParam);
|
||||||
TRACE ("Got notification %x from %p\n", lpnmh->code, lpnmh->hwndFrom);
|
TRACE ("Got notification %x from %p\n", lpnmh->code, lpnmh->hwndFrom);
|
||||||
TRACE ("info: %p %p %p\n",hwnd,infoPtr->hMonthCal,infoPtr->hUpdown);
|
TRACE ("info: %p %p %p\n",hwnd,infoPtr->hMonthCal,infoPtr->hUpdown);
|
||||||
|
|
||||||
|
if (lpnmh->code==MCN_SELECT) {
|
||||||
|
ShowWindow(infoPtr->hMonthCal, SW_HIDE);
|
||||||
|
infoPtr->dateValid = TRUE;
|
||||||
|
SendMessageA (infoPtr->hMonthCal, MCM_GETCURSEL, 0, (LPARAM)&infoPtr->date);
|
||||||
|
TRACE("got from calendar %04d/%02d/%02d\n",
|
||||||
|
infoPtr->date.wYear, infoPtr->date.wMonth, infoPtr->date.wDay);
|
||||||
|
SendMessageA (infoPtr->hwndCheckbut, BM_SETCHECK, BST_CHECKED, 0);
|
||||||
|
InvalidateRect(hwnd, NULL, TRUE);
|
||||||
|
DATETIME_SendDateTimeChangeNotify (hwnd);
|
||||||
|
}
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -1232,7 +1252,7 @@ DATETIME_Create (HWND hwnd, WPARAM wParam, LPARAM lParam)
|
||||||
infoPtr->hMonthCal = CreateWindowExA (0,"SysMonthCal32", 0,
|
infoPtr->hMonthCal = CreateWindowExA (0,"SysMonthCal32", 0,
|
||||||
WS_BORDER | WS_POPUP | WS_CLIPSIBLINGS,
|
WS_BORDER | WS_POPUP | WS_CLIPSIBLINGS,
|
||||||
0, 0, 0, 0,
|
0, 0, 0, 0,
|
||||||
infoPtr->hwndNotify,
|
hwnd,
|
||||||
0, 0, 0);
|
0, 0, 0);
|
||||||
|
|
||||||
/* initialize info structure */
|
/* initialize info structure */
|
||||||
|
@ -1249,8 +1269,14 @@ DATETIME_Destroy (HWND hwnd, WPARAM wParam, LPARAM lParam)
|
||||||
DATETIME_INFO *infoPtr = DATETIME_GetInfoPtr (hwnd);
|
DATETIME_INFO *infoPtr = DATETIME_GetInfoPtr (hwnd);
|
||||||
|
|
||||||
TRACE("\n");
|
TRACE("\n");
|
||||||
|
if (infoPtr->hMonthCal) {
|
||||||
|
/* FIXME I don't completely understand why doesn't it
|
||||||
|
* happen automatically, WS_POPUP maybe? */
|
||||||
|
DestroyWindow(infoPtr->hMonthCal);
|
||||||
|
infoPtr->hMonthCal = NULL;
|
||||||
|
}
|
||||||
Free (infoPtr);
|
Free (infoPtr);
|
||||||
SetWindowLongA( hwnd, 0, 0 );
|
SetWindowLongA( hwnd, 0, 0 ); /* clear infoPtr */
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue