Changeset 6644 for trunk/src/comctl32/datetime.c
- Timestamp:
- Sep 5, 2001, 2:05:03 PM (24 years ago)
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
trunk/src/comctl32/datetime.c
r6470 r6644 1 /* $Id: datetime.c,v 1.18 2001-09-05 12:04:57 bird Exp $ */ 1 2 /* 2 3 * Date and time picker control … … 34 35 COMCTL32_HEADER header; 35 36 #endif 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 int *buflen; 54 37 HWND hMonthCal; 38 HWND hUpdown; 39 SYSTEMTIME date; 40 BOOL dateValid; 41 HWND hwndCheckbut; 42 RECT rcClient; /* rect around the edge of the window */ 43 RECT rcDraw; /* rect inside of the border */ 44 RECT checkbox; /* checkbox allowing the control to be enabled/disabled */ 45 RECT calbutton; /* button that toggles the dropdown of the monthcal control */ 46 BOOL bCalDepressed; /* TRUE = cal button is depressed */ 47 int select; 48 HFONT hFont; 49 int nrFieldsAllocated; 50 int nrFields; 51 int haveFocus; 52 int *fieldspec; 53 RECT *fieldRect; 54 int *buflen; 55 char textbuf[256]; 55 56 POINT monthcal_pos; 56 57 } DATETIME_INFO, *LPDATETIME_INFO; … … 61 62 /* this list of defines is closely related to `allowedformatchars' defined 62 63 * in datetime.c; the high nibble indicates the `base type' of the format 63 * specifier. 64 * specifier. 64 65 * Do not change without first reading DATETIME_UseFormat. 65 * 66 * 66 67 */ 67 68 68 #define DT_END_FORMAT 0 69 #define ONEDIGITDAY 70 #define TWODIGITDAY 71 #define THREECHARDAY 69 #define DT_END_FORMAT 0 70 #define ONEDIGITDAY 0x01 71 #define TWODIGITDAY 0x02 72 #define THREECHARDAY 0x03 72 73 #define FULLDAY 0x04 73 74 #define ONEDIGIT12HOUR 0x11 … … 94 95 #define FORMATCALLBACK 0x81 /* -> maximum of 0x80 callbacks possible */ 95 96 #define FORMATCALLMASK 0x80 96 #define DT_STRING 97 #define DT_STRING 0x0100 97 98 98 99 #define DTHT_DATEFIELD 0xff /* for hit-testing */ 99 100 100 101 #define DTHT_NONE 0 101 #define DTHT_CHECKBOX 0x200 102 #define DTHT_CHECKBOX 0x200 /* these should end at '00' , to make */ 102 103 #define DTHT_MCPOPUP 0x300 /* & DTHT_DATEFIELD 0 when DATETIME_KeyDown */ 103 104 #define DTHT_GOTFOCUS 0x400 /* tests for date-fields */ … … 126 127 if (!lParam) return GDT_NONE; 127 128 128 if ((dwStyle & DTS_SHOWNONE) && 129 if ((dwStyle & DTS_SHOWNONE) && 129 130 (SendMessageA (infoPtr->hwndCheckbut, BM_GETCHECK, 0, 0))) 130 131 return GDT_NONE; … … 145 146 if (!lParam) return 0; 146 147 147 if (lParam==GDT_VALID) 148 148 if (lParam==GDT_VALID) 149 MONTHCAL_CopyTime (lprgSysTimeArray, &infoPtr->date); 149 150 if (lParam==GDT_NONE) { 150 151 infoPtr->dateValid=FALSE; 151 152 SendMessageA (infoPtr->hwndCheckbut, BM_SETCHECK, 0, 0); 152 153 } 153 154 return 1; 154 155 } … … 228 229 229 230 230 /* 231 Split up a formattxt in actions. 231 /* 232 Split up a formattxt in actions. 232 233 See ms documentation for the meaning of the letter codes/'specifiers'. 233 234 234 Notes: 235 Notes: 235 236 *'dddddd' is handled as 'dddd' plus 'dd'. 236 *unrecognized formats are strings (here given the type DT_STRING; 237 *unrecognized formats are strings (here given the type DT_STRING; 237 238 start of the string is encoded in lower bits of DT_STRING. 238 239 Therefore, 'string' ends finally up as '<show seconds>tring'. … … 241 242 242 243 243 static void 244 static void 244 245 DATETIME_UseFormat (DATETIME_INFO *infoPtr, const char *formattxt) 245 246 { … … 256 257 257 258 for (i=0; i<strlen (formattxt); i++) { 258 259 260 if (allowedformatchars[j]==formattxt[i]) {261 262 263 264 265 266 267 if (infoPtr->fieldspec[*nrFields]>>4!=j) { 268 (*nrFields)++; 269 270 271 272 273 (*nrFields)++; 274 275 276 277 278 279 280 281 282 283 284 285 286 287 288 } else 289 290 291 292 293 } 294 295 296 297 298 299 300 301 259 TRACE ("\n%d %c:",i, formattxt[i]); 260 for (j=0; j<len; j++) { 261 if (allowedformatchars[j]==formattxt[i]) { 262 TRACE ("%c[%d,%x]",allowedformatchars[j], *nrFields, 263 infoPtr->fieldspec[*nrFields]); 264 if ((*nrFields==0) && (infoPtr->fieldspec[*nrFields]==0)) { 265 infoPtr->fieldspec[*nrFields]=(j<<4) +1; 266 break; 267 } 268 if (infoPtr->fieldspec[*nrFields]>>4!=j) { 269 (*nrFields)++; 270 infoPtr->fieldspec[*nrFields]=(j<<4) +1; 271 break; 272 } 273 if ((infoPtr->fieldspec[*nrFields] & 0x0f)==maxrepetition[j]) { 274 (*nrFields)++; 275 infoPtr->fieldspec[*nrFields]=(j<<4) +1; 276 break; 277 } 278 infoPtr->fieldspec[*nrFields]++; 279 break; 280 } /* if allowedformatchar */ 281 } /* for j */ 282 283 284 /* char is not a specifier: handle char like a string */ 285 if (j==len) { 286 if ((*nrFields==0) && (infoPtr->fieldspec[*nrFields]==0)) { 287 infoPtr->fieldspec[*nrFields]=DT_STRING+k; 288 infoPtr->buflen[*nrFields]=0; 289 } else 290 if ((infoPtr->fieldspec[*nrFields] & DT_STRING)!=DT_STRING) { 291 (*nrFields)++; 292 infoPtr->fieldspec[*nrFields]=DT_STRING+k; 293 infoPtr->buflen[*nrFields]=0; 294 } 295 infoPtr->textbuf[k]=formattxt[i]; 296 k++; 297 infoPtr->buflen[*nrFields]++; 298 } /* if j=len */ 299 300 if (*nrFields==infoPtr->nrFieldsAllocated) { 301 FIXME ("out of memory; should reallocate. crash ahead.\n"); 302 } 302 303 303 304 } /* for i */ … … 309 310 310 311 311 static LRESULT 312 static LRESULT 312 313 DATETIME_SetFormat (HWND hwnd, WPARAM wParam, LPARAM lParam) 313 314 { … … 318 319 TRACE("%04x %08lx\n",wParam,lParam); 319 320 if (!lParam) { 320 321 322 if (dwStyle & DTS_LONGDATEFORMAT) 323 324 else if (dwStyle & DTS_TIMEFORMAT) 325 321 DWORD dwStyle = GetWindowLongA (hwnd, GWL_STYLE); 322 323 if (dwStyle & DTS_LONGDATEFORMAT) 324 format_item=LOCALE_SLONGDATE; 325 else if (dwStyle & DTS_TIMEFORMAT) 326 format_item=LOCALE_STIMEFORMAT; 326 327 else /* DTS_SHORTDATEFORMAT */ 327 328 329 330 } 328 format_item=LOCALE_SSHORTDATE; 329 GetLocaleInfoA( GetSystemDefaultLCID(), format_item,format_buf,sizeof(format_buf)); 330 DATETIME_UseFormat (infoPtr, format_buf); 331 } 331 332 else 332 333 DATETIME_UseFormat (infoPtr, (char *) lParam); 333 334 334 335 return infoPtr->nrFields; … … 336 337 337 338 338 static LRESULT 339 static LRESULT 339 340 DATETIME_SetFormatW (HWND hwnd, WPARAM wParam, LPARAM lParam) 340 341 … … 342 343 TRACE("%04x %08lx\n",wParam,lParam); 343 344 if (lParam) { 344 345 345 LPSTR buf; 346 int retval; 346 347 int len = WideCharToMultiByte( CP_ACP, 0, (LPWSTR)lParam, -1, NULL, 0, NULL, NULL ); 347 348 348 349 buf = (LPSTR) COMCTL32_Alloc (len); 349 350 WideCharToMultiByte( CP_ACP, 0, (LPWSTR)lParam, -1, buf, len, NULL, NULL ); 350 351 352 353 } 351 retval=DATETIME_SetFormat (hwnd, 0, (LPARAM) buf); 352 COMCTL32_Free (buf); 353 return retval; 354 } 354 355 else 355 356 357 } 358 359 360 static void 356 return DATETIME_SetFormat (hwnd, 0, 0); 357 358 } 359 360 361 static void 361 362 DATETIME_ReturnTxt (DATETIME_INFO *infoPtr, int count, char *result) 362 363 { … … 368 369 TRACE ("%d,%d\n", infoPtr->nrFields, count); 369 370 if ((count>infoPtr->nrFields) || (count<0)) { 370 371 371 WARN ("buffer overrun, have %d want %d\n", infoPtr->nrFields, count); 372 return; 372 373 } 373 374 374 375 if (!infoPtr->fieldspec) return; 375 376 376 377 spec=infoPtr->fieldspec[count]; 377 378 if (spec & DT_STRING) { 378 379 380 381 382 383 379 int txtlen=infoPtr->buflen[count]; 380 381 strncpy (result, infoPtr->textbuf + (spec &~ DT_STRING), txtlen); 382 result[txtlen]=0; 383 TRACE ("arg%d=%x->[%s]\n",count,infoPtr->fieldspec[count],result); 384 return; 384 385 } 385 386 386 387 387 388 switch (spec) { 388 case DT_END_FORMAT: 389 390 391 case ONEDIGITDAY: 392 393 394 case TWODIGITDAY: 395 396 397 case THREECHARDAY: 398 399 400 401 402 403 404 405 406 407 case ONEDIGIT12HOUR: 408 if (date.wHour>12) 409 410 else 411 412 413 case TWODIGIT12HOUR: 414 if (date.wHour>12) 415 416 else 417 418 419 case ONEDIGIT24HOUR: 420 421 422 case TWODIGIT24HOUR: 423 424 425 case ONEDIGITSECOND: 426 427 428 case TWODIGITSECOND: 429 430 431 case ONEDIGITMINUTE: 432 433 434 case TWODIGITMINUTE: 435 436 437 case ONEDIGITMONTH: 438 439 440 case TWODIGITMONTH: 441 442 443 case THREECHARMONTH: 444 445 446 447 448 case FULLMONTH: 449 389 case DT_END_FORMAT: 390 *result=0; 391 break; 392 case ONEDIGITDAY: 393 sprintf (result,"%d",date.wDay); 394 break; 395 case TWODIGITDAY: 396 sprintf (result,"%.2d",date.wDay); 397 break; 398 case THREECHARDAY: 399 GetLocaleInfoA( LOCALE_USER_DEFAULT, LOCALE_SABBREVDAYNAME1+(date.wDayOfWeek+6)%7, 400 result,4); 401 /*sprintf (result,"%.3s",days[date.wDayOfWeek]);*/ 402 break; 403 case FULLDAY: 404 GetLocaleInfoA( LOCALE_USER_DEFAULT,LOCALE_SDAYNAME1+ (date.wDayOfWeek+6)%7, 405 buffer,sizeof(buffer)); 406 strcpy (result,buffer); 407 break; 408 case ONEDIGIT12HOUR: 409 if (date.wHour>12) 410 sprintf (result,"%d",date.wHour-12); 411 else 412 sprintf (result,"%d",date.wHour); 413 break; 414 case TWODIGIT12HOUR: 415 if (date.wHour>12) 416 sprintf (result,"%.2d",date.wHour-12); 417 else 418 sprintf (result,"%.2d",date.wHour); 419 break; 420 case ONEDIGIT24HOUR: 421 sprintf (result,"%d",date.wHour); 422 break; 423 case TWODIGIT24HOUR: 424 sprintf (result,"%.2d",date.wHour); 425 break; 426 case ONEDIGITSECOND: 427 sprintf (result,"%d",date.wSecond); 428 break; 429 case TWODIGITSECOND: 430 sprintf (result,"%.2d",date.wSecond); 431 break; 432 case ONEDIGITMINUTE: 433 sprintf (result,"%d",date.wMinute); 434 break; 435 case TWODIGITMINUTE: 436 sprintf (result,"%.2d",date.wMinute); 437 break; 438 case ONEDIGITMONTH: 439 sprintf (result,"%d",date.wMonth); 440 break; 441 case TWODIGITMONTH: 442 sprintf (result,"%.2d",date.wMonth); 443 break; 444 case THREECHARMONTH: 445 GetLocaleInfoA( GetSystemDefaultLCID(),LOCALE_SMONTHNAME1+date.wMonth -1, 446 buffer,sizeof(buffer)); 447 sprintf (result,"%.3s",buffer); 448 break; 449 case FULLMONTH: 450 GetLocaleInfoA( GetSystemDefaultLCID(),LOCALE_SMONTHNAME1+date.wMonth -1, 450 451 #ifdef __WIN32OS2__ 451 452 452 buffer,sizeof(buffer)); 453 strcpy (result,buffer); 453 454 #else 454 455 result,sizeof(result)); 455 456 #endif 456 457 case ONELETTERAMPM: 458 if (date.wHour<12) 459 460 else 461 462 463 case TWOLETTERAMPM: 464 if (date.wHour<12) 465 466 else 467 468 469 case FORMATCALLBACK: 470 471 472 473 case ONEDIGITYEAR: 474 475 476 case TWODIGITYEAR: 477 478 479 case FULLYEAR: 480 481 457 break; 458 case ONELETTERAMPM: 459 if (date.wHour<12) 460 strcpy (result,"A"); 461 else 462 strcpy (result,"P"); 463 break; 464 case TWOLETTERAMPM: 465 if (date.wHour<12) 466 strcpy (result,"AM"); 467 else 468 strcpy (result,"PM"); 469 break; 470 case FORMATCALLBACK: 471 FIXME ("Not implemented\n"); 472 strcpy (result,"xxx"); 473 break; 474 case ONEDIGITYEAR: 475 sprintf (result,"%d",date.wYear-10* (int) floor(date.wYear/10)); 476 break; 477 case TWODIGITYEAR: 478 sprintf (result,"%.2d",date.wYear-100* (int) floor(date.wYear/100)); 479 break; 480 case FULLYEAR: 481 sprintf (result,"%d",date.wYear); 482 break; 482 483 } 483 484 485 } 486 487 488 static void 484 485 TRACE ("arg%d=%x->[%s]\n",count,infoPtr->fieldspec[count],result); 486 } 487 488 489 static void 489 490 DATETIME_IncreaseField (DATETIME_INFO *infoPtr, int number) 490 491 { … … 497 498 spec=infoPtr->fieldspec[number]; 498 499 if ((spec & DTHT_DATEFIELD)==0) return; 499 500 500 501 switch (spec) { 501 case ONEDIGITDAY: 502 case TWODIGITDAY: 503 case THREECHARDAY: 504 505 506 507 date->wDay=1; 508 509 case ONEDIGIT12HOUR: 510 case TWODIGIT12HOUR: 511 case ONEDIGIT24HOUR: 512 case TWODIGIT24HOUR: 513 514 515 516 case ONEDIGITSECOND: 517 case TWODIGITSECOND: 518 519 520 521 case ONEDIGITMINUTE: 522 case TWODIGITMINUTE: 523 524 525 526 case ONEDIGITMONTH: 527 case TWODIGITMONTH: 528 case THREECHARMONTH: 529 case FULLMONTH: 530 531 532 if (date->wDay>MONTHCAL_MonthLength(date->wMonth,date->wYear)) 533 534 535 case ONELETTERAMPM: 536 case TWOLETTERAMPM: 537 538 539 540 case FORMATCALLBACK: 541 542 543 case ONEDIGITYEAR: 544 case TWODIGITYEAR: 545 case FULLYEAR: 546 547 548 549 550 } 551 552 553 static void 502 case ONEDIGITDAY: 503 case TWODIGITDAY: 504 case THREECHARDAY: 505 case FULLDAY: 506 date->wDay++; 507 if (date->wDay>MONTHCAL_MonthLength(date->wMonth,date->wYear)) 508 date->wDay=1; 509 break; 510 case ONEDIGIT12HOUR: 511 case TWODIGIT12HOUR: 512 case ONEDIGIT24HOUR: 513 case TWODIGIT24HOUR: 514 date->wHour++; 515 if (date->wHour>23) date->wHour=0; 516 break; 517 case ONEDIGITSECOND: 518 case TWODIGITSECOND: 519 date->wSecond++; 520 if (date->wSecond>59) date->wSecond=0; 521 break; 522 case ONEDIGITMINUTE: 523 case TWODIGITMINUTE: 524 date->wMinute++; 525 if (date->wMinute>59) date->wMinute=0; 526 break; 527 case ONEDIGITMONTH: 528 case TWODIGITMONTH: 529 case THREECHARMONTH: 530 case FULLMONTH: 531 date->wMonth++; 532 if (date->wMonth>12) date->wMonth=1; 533 if (date->wDay>MONTHCAL_MonthLength(date->wMonth,date->wYear)) 534 date->wDay=MONTHCAL_MonthLength(date->wMonth,date->wYear); 535 break; 536 case ONELETTERAMPM: 537 case TWOLETTERAMPM: 538 date->wHour+=12; 539 if (date->wHour>23) date->wHour-=24; 540 break; 541 case FORMATCALLBACK: 542 FIXME ("Not implemented\n"); 543 break; 544 case ONEDIGITYEAR: 545 case TWODIGITYEAR: 546 case FULLYEAR: 547 date->wYear++; 548 break; 549 } 550 551 } 552 553 554 static void 554 555 DATETIME_DecreaseField (DATETIME_INFO *infoPtr, int number) 555 556 { … … 562 563 spec = infoPtr->fieldspec[number]; 563 564 if ((spec & DTHT_DATEFIELD)==0) return; 564 565 565 566 TRACE ("%x\n",spec); 566 567 567 568 switch (spec) { 568 case ONEDIGITDAY: 569 case TWODIGITDAY: 570 case THREECHARDAY: 571 572 573 if (date->wDay<1) 574 575 576 case ONEDIGIT12HOUR: 577 case TWODIGIT12HOUR: 578 case ONEDIGIT24HOUR: 579 case TWODIGIT24HOUR: 580 if (date->wHour) 581 582 583 584 585 case ONEDIGITSECOND: 586 case TWODIGITSECOND: 587 if (date->wHour) 588 589 590 591 592 case ONEDIGITMINUTE: 593 case TWODIGITMINUTE: 594 if (date->wMinute) 595 596 597 598 599 case ONEDIGITMONTH: 600 case TWODIGITMONTH: 601 case THREECHARMONTH: 602 case FULLMONTH: 603 if (date->wMonth>1) 604 605 606 607 if (date->wDay>MONTHCAL_MonthLength(date->wMonth,date->wYear)) 608 609 610 case ONELETTERAMPM: 611 case TWOLETTERAMPM: 612 if (date->wHour<12) 613 614 615 616 617 case FORMATCALLBACK: 618 619 620 case ONEDIGITYEAR: 621 case TWODIGITYEAR: 622 case FULLYEAR: 623 624 625 626 627 } 628 629 630 static void 569 case ONEDIGITDAY: 570 case TWODIGITDAY: 571 case THREECHARDAY: 572 case FULLDAY: 573 date->wDay--; 574 if (date->wDay<1) 575 date->wDay=MONTHCAL_MonthLength(date->wMonth,date->wYear); 576 break; 577 case ONEDIGIT12HOUR: 578 case TWODIGIT12HOUR: 579 case ONEDIGIT24HOUR: 580 case TWODIGIT24HOUR: 581 if (date->wHour) 582 date->wHour--; 583 else 584 date->wHour=23; 585 break; 586 case ONEDIGITSECOND: 587 case TWODIGITSECOND: 588 if (date->wHour) 589 date->wSecond--; 590 else 591 date->wHour=59; 592 break; 593 case ONEDIGITMINUTE: 594 case TWODIGITMINUTE: 595 if (date->wMinute) 596 date->wMinute--; 597 else 598 date->wMinute=59; 599 break; 600 case ONEDIGITMONTH: 601 case TWODIGITMONTH: 602 case THREECHARMONTH: 603 case FULLMONTH: 604 if (date->wMonth>1) 605 date->wMonth--; 606 else 607 date->wMonth=12; 608 if (date->wDay>MONTHCAL_MonthLength(date->wMonth,date->wYear)) 609 date->wDay=MONTHCAL_MonthLength(date->wMonth,date->wYear); 610 break; 611 case ONELETTERAMPM: 612 case TWOLETTERAMPM: 613 if (date->wHour<12) 614 date->wHour+=12; 615 else 616 date->wHour-=12; 617 break; 618 case FORMATCALLBACK: 619 FIXME ("Not implemented\n"); 620 break; 621 case ONEDIGITYEAR: 622 case TWODIGITYEAR: 623 case FULLYEAR: 624 date->wYear--; 625 break; 626 } 627 628 } 629 630 631 static void 631 632 DATETIME_ResetFieldDown (DATETIME_INFO *infoPtr, int number) 632 633 { … … 639 640 spec = infoPtr->fieldspec[number]; 640 641 if ((spec & DTHT_DATEFIELD)==0) return; 641 642 642 643 643 644 switch (spec) { 644 case ONEDIGITDAY: 645 case TWODIGITDAY: 646 case THREECHARDAY: 647 648 649 650 case ONEDIGIT12HOUR: 651 case TWODIGIT12HOUR: 652 case ONEDIGIT24HOUR: 653 case TWODIGIT24HOUR: 654 case ONELETTERAMPM: 655 case TWOLETTERAMPM: 656 657 658 case ONEDIGITSECOND: 659 case TWODIGITSECOND: 660 661 662 case ONEDIGITMINUTE: 663 case TWODIGITMINUTE: 664 665 666 case ONEDIGITMONTH: 667 case TWODIGITMONTH: 668 case THREECHARMONTH: 669 case FULLMONTH: 670 671 case FORMATCALLBACK: 672 673 674 case ONEDIGITYEAR: 675 case TWODIGITYEAR: 645 case ONEDIGITDAY: 646 case TWODIGITDAY: 647 case THREECHARDAY: 648 case FULLDAY: 649 date->wDay = 1; 650 break; 651 case ONEDIGIT12HOUR: 652 case TWODIGIT12HOUR: 653 case ONEDIGIT24HOUR: 654 case TWODIGIT24HOUR: 655 case ONELETTERAMPM: 656 case TWOLETTERAMPM: 657 date->wHour = 0; 658 break; 659 case ONEDIGITSECOND: 660 case TWODIGITSECOND: 661 date->wSecond = 0; 662 break; 663 case ONEDIGITMINUTE: 664 case TWODIGITMINUTE: 665 date->wMinute = 0; 666 break; 667 case ONEDIGITMONTH: 668 case TWODIGITMONTH: 669 case THREECHARMONTH: 670 case FULLMONTH: 671 date->wMonth = 1; 672 case FORMATCALLBACK: 673 FIXME ("Not implemented\n"); 674 break; 675 case ONEDIGITYEAR: 676 case TWODIGITYEAR: 676 677 /* FYI: On 9/14/1752 the calender changed and England and the American */ 677 678 /* colonies changed to the Gregorian calender. This change involved */ 678 679 /* having September 14th following September 2nd. So no date algorithms */ 679 680 /* work before that date. */ 680 case FULLYEAR: 681 682 683 684 date->wDay = 14;/* overactive ms-programmers..*/685 686 687 688 689 690 } 691 692 693 static void 681 case FULLYEAR: 682 date->wSecond = 0; 683 date->wMinute = 0; 684 date->wHour = 0; 685 date->wDay = 14; /* overactive ms-programmers..*/ 686 date->wMonth = 9; 687 date->wYear = 1752; 688 break; 689 } 690 691 } 692 693 694 static void 694 695 DATETIME_ResetFieldUp (DATETIME_INFO *infoPtr, int number) 695 696 { … … 702 703 spec=infoPtr->fieldspec[number]; 703 704 if ((spec & DTHT_DATEFIELD)==0) return; 704 705 705 706 switch (spec) { 706 case ONEDIGITDAY: 707 case TWODIGITDAY: 708 case THREECHARDAY: 709 710 711 712 case ONEDIGIT12HOUR: 713 case TWODIGIT12HOUR: 714 case ONEDIGIT24HOUR: 715 case TWODIGIT24HOUR: 716 case ONELETTERAMPM: 717 case TWOLETTERAMPM: 718 719 720 case ONEDIGITSECOND: 721 case TWODIGITSECOND: 722 723 724 case ONEDIGITMINUTE: 725 case TWODIGITMINUTE: 726 727 728 case ONEDIGITMONTH: 729 case TWODIGITMONTH: 730 case THREECHARMONTH: 731 case FULLMONTH: 732 733 case FORMATCALLBACK: 734 735 736 case ONEDIGITYEAR: 737 case TWODIGITYEAR: 738 case FULLYEAR: 739 740 741 707 case ONEDIGITDAY: 708 case TWODIGITDAY: 709 case THREECHARDAY: 710 case FULLDAY: 711 date->wDay=MONTHCAL_MonthLength(date->wMonth,date->wYear); 712 break; 713 case ONEDIGIT12HOUR: 714 case TWODIGIT12HOUR: 715 case ONEDIGIT24HOUR: 716 case TWODIGIT24HOUR: 717 case ONELETTERAMPM: 718 case TWOLETTERAMPM: 719 date->wHour=23; 720 break; 721 case ONEDIGITSECOND: 722 case TWODIGITSECOND: 723 date->wSecond=59; 724 break; 725 case ONEDIGITMINUTE: 726 case TWODIGITMINUTE: 727 date->wMinute=59; 728 break; 729 case ONEDIGITMONTH: 730 case TWODIGITMONTH: 731 case THREECHARMONTH: 732 case FULLMONTH: 733 date->wMonth=12; 734 case FORMATCALLBACK: 735 FIXME ("Not implemented\n"); 736 break; 737 case ONEDIGITYEAR: 738 case TWODIGITYEAR: 739 case FULLYEAR: 740 date->wYear=9999; /* Y10K problem? naaah. */ 741 break; 742 } 742 743 743 744 } … … 758 759 SIZE size; 759 760 COLORREF oldBk, oldTextColor; 760 761 761 762 /* draw control edge */ 762 763 TRACE("\n"); … … 764 765 FillRect(hdc, rcClient, hbr); 765 766 DrawEdge(hdc, rcClient, EDGE_SUNKEN, BF_RECT); 766 DeleteObject(hbr); 767 767 DeleteObject(hbr); 768 768 769 if (infoPtr->dateValid) { 769 770 char txt[80]; … … 798 799 DT_RIGHT | DT_VCENTER | DT_SINGLELINE ); 799 800 SetBkColor (hdc, oldBk); 800 801 SetTextColor (hdc, oldTextColor); 801 802 } 802 803 else … … 832 833 if (PtInRect (&infoPtr->fieldRect[i], pt)) { 833 834 retval = i; 834 TRACE("Hit in date text in field %d\n", i); 835 TRACE("Hit in date text in field %d\n", i); 835 836 break; 836 837 } … … 845 846 DATETIME_LButtonDown (HWND hwnd, WPARAM wParam, LPARAM lParam) 846 847 { 847 DATETIME_INFO *infoPtr = DATETIME_GetInfoPtr (hwnd); 848 DATETIME_INFO *infoPtr = DATETIME_GetInfoPtr (hwnd); 848 849 DWORD dwStyle = GetWindowLongA (hwnd, GWL_STYLE); 849 850 int old, new; … … 874 875 infoPtr->monthcal_pos.x = infoPtr->rcClient.right - ((infoPtr->calbutton.right - 875 876 infoPtr->calbutton.left) + 145); 876 else 877 else 877 878 infoPtr->monthcal_pos.x = 8; 878 879 … … 888 889 889 890 TRACE ("dt:%x mc:%x mc parent:%x, desktop:%x, mcpp:%x\n", 890 hwnd,infoPtr->hMonthCal, 891 hwnd,infoPtr->hMonthCal, 891 892 GetParent (infoPtr->hMonthCal), 892 893 GetDesktopWindow (), … … 904 905 DATETIME_LButtonUp (HWND hwnd, WPARAM wParam, LPARAM lParam) 905 906 { 906 DATETIME_INFO *infoPtr = DATETIME_GetInfoPtr (hwnd); 907 DATETIME_INFO *infoPtr = DATETIME_GetInfoPtr (hwnd); 907 908 908 909 TRACE("\n"); 909 910 910 911 if(infoPtr->bCalDepressed == TRUE) { 911 912 infoPtr->bCalDepressed = FALSE; … … 934 935 DATETIME_ParentNotify (HWND hwnd, WPARAM wParam, LPARAM lParam) 935 936 { 936 DATETIME_INFO *infoPtr = DATETIME_GetInfoPtr (hwnd); 937 DATETIME_INFO *infoPtr = DATETIME_GetInfoPtr (hwnd); 937 938 LPNMHDR lpnmh = (LPNMHDR) lParam; 938 939 … … 954 955 955 956 { 956 DATETIME_INFO *infoPtr = DATETIME_GetInfoPtr (hwnd); 957 DATETIME_INFO *infoPtr = DATETIME_GetInfoPtr (hwnd); 957 958 LPNMHDR lpnmh = (LPNMHDR) lParam; 958 959 … … 964 965 965 966 966 static LRESULT 967 static LRESULT 967 968 DATETIME_KeyDown (HWND hwnd, WPARAM wParam, LPARAM lParam) 968 969 { … … 978 979 979 980 if (infoPtr->select & FORMATCALLMASK) { 980 981 FIXME ("Callbacks not implemented yet\n"); 981 982 } 982 983 983 984 switch (wParam) { 984 985 case VK_UP:986 987 988 989 990 991 992 993 994 995 996 997 998 999 1000 1001 1002 case VK_LEFT: 1003 1004 1005 1006 1007 } else 1008 1009 1010 1011 1012 case VK_RIGHT: 1013 1014 1015 1016 1017 1018 1019 1020 1021 1022 985 case VK_ADD: 986 case VK_UP: 987 DATETIME_IncreaseField (infoPtr,FieldNum); 988 DATETIME_SendDateTimeChangeNotify (hwnd); 989 break; 990 case VK_SUBTRACT: 991 case VK_DOWN: 992 DATETIME_DecreaseField (infoPtr,FieldNum); 993 DATETIME_SendDateTimeChangeNotify (hwnd); 994 break; 995 case VK_HOME: 996 DATETIME_ResetFieldDown (infoPtr,FieldNum); 997 DATETIME_SendDateTimeChangeNotify (hwnd); 998 break; 999 case VK_END: 1000 DATETIME_ResetFieldUp(infoPtr,FieldNum); 1001 DATETIME_SendDateTimeChangeNotify (hwnd); 1002 break; 1003 case VK_LEFT: 1004 do { 1005 if (infoPtr->select==0) { 1006 infoPtr->select = infoPtr->nrFields - 1; 1007 wrap++; 1008 } else 1009 infoPtr->select--; 1010 } 1011 while ((infoPtr->fieldspec[infoPtr->select] & DT_STRING) && (wrap<2)); 1012 break; 1013 case VK_RIGHT: 1014 do { 1015 infoPtr->select++; 1016 if (infoPtr->select==infoPtr->nrFields) { 1017 infoPtr->select = 0; 1018 wrap++; 1019 } 1020 } 1021 while ((infoPtr->fieldspec[infoPtr->select] & DT_STRING) && (wrap<2)); 1022 break; 1023 } 1023 1024 1024 1025 InvalidateRect(hwnd, NULL, FALSE); … … 1031 1032 DATETIME_KillFocus (HWND hwnd, WPARAM wParam, LPARAM lParam) 1032 1033 { 1033 DATETIME_INFO *infoPtr = DATETIME_GetInfoPtr (hwnd); 1034 DATETIME_INFO *infoPtr = DATETIME_GetInfoPtr (hwnd); 1034 1035 1035 1036 TRACE ("\n"); 1036 1037 1037 1038 if (infoPtr->haveFocus) { 1038 1039 1039 DATETIME_SendSimpleNotify (hwnd, NM_KILLFOCUS); 1040 infoPtr->haveFocus = 0; 1040 1041 } 1041 1042 … … 1049 1050 DATETIME_SetFocus (HWND hwnd, WPARAM wParam, LPARAM lParam) 1050 1051 { 1051 DATETIME_INFO *infoPtr = DATETIME_GetInfoPtr (hwnd); 1052 DATETIME_INFO *infoPtr = DATETIME_GetInfoPtr (hwnd); 1052 1053 1053 1054 TRACE ("\n"); 1054 1055 1055 1056 if (infoPtr->haveFocus==0) { 1056 DATETIME_SendSimpleNotify (hwnd, NM_SETFOCUS); 1057 1057 DATETIME_SendSimpleNotify (hwnd, NM_SETFOCUS); 1058 infoPtr->haveFocus = DTHT_GOTFOCUS; 1058 1059 } 1059 1060 … … 1068 1069 1069 1070 { 1070 DATETIME_INFO *infoPtr = DATETIME_GetInfoPtr (hwnd); 1071 DATETIME_INFO *infoPtr = DATETIME_GetInfoPtr (hwnd); 1071 1072 NMDATETIMECHANGE dtdtc; 1072 1073 … … 1136 1137 infoPtr->monthcal_pos.x = infoPtr->rcClient.right - ((infoPtr->calbutton.right - 1137 1138 infoPtr->calbutton.left) + 145); 1138 else 1139 else 1139 1140 infoPtr->monthcal_pos.x = 8; 1140 1141 … … 1172 1173 1173 1174 if (dwStyle & DTS_SHOWNONE) { 1174 infoPtr->hwndCheckbut=CreateWindowExA (0,"button", 0, 1175 WS_CHILD | WS_VISIBLE | BS_AUTOCHECKBOX, 1175 infoPtr->hwndCheckbut=CreateWindowExA (0,"button", 0, 1176 WS_CHILD | WS_VISIBLE | BS_AUTOCHECKBOX, 1176 1177 2,2,13,13, 1177 hwnd, 1178 hwnd, 1178 1179 0, GetWindowLongA (hwnd, GWL_HINSTANCE), 0); 1179 1180 SendMessageA (infoPtr->hwndCheckbut, BM_SETCHECK, 1, 0); … … 1196 1197 1197 1198 /* create the monthcal control */ 1198 infoPtr->hMonthCal = CreateWindowExA (0,"SysMonthCal32", 0, 1199 1200 1201 GetParent(hwnd), 1202 1199 infoPtr->hMonthCal = CreateWindowExA (0,"SysMonthCal32", 0, 1200 WS_BORDER | WS_POPUP | WS_CLIPSIBLINGS, 1201 0, 0, 0, 0, 1202 GetParent(hwnd), 1203 0, 0, 0); 1203 1204 1204 1205 /* initialize info structure */ … … 1214 1215 { 1215 1216 DATETIME_INFO *infoPtr = DATETIME_GetInfoPtr (hwnd); 1216 1217 1217 1218 TRACE("\n"); 1218 1219 COMCTL32_Free (infoPtr); … … 1227 1228 1228 1229 if (!DATETIME_GetInfoPtr(hwnd) && (uMsg != WM_CREATE)) 1229 1230 1230 return DefWindowProcA( hwnd, uMsg, wParam, lParam ); 1231 1231 1232 switch (uMsg) 1232 1233 { … … 1236 1237 1237 1238 case DTM_SETSYSTEMTIME: 1238 1239 return DATETIME_SetSystemTime (hwnd, wParam, lParam); 1239 1240 1240 1241 case DTM_GETRANGE: … … 1266 1267 1267 1268 case WM_PARENTNOTIFY: 1268 1269 return DATETIME_ParentNotify (hwnd, wParam, lParam); 1269 1270 1270 1271 case WM_NOTIFY: 1271 1272 return DATETIME_Notify (hwnd, wParam, lParam); 1272 1273 1273 1274 case WM_GETDLGCODE: … … 1296 1297 1297 1298 case WM_CREATE: 1298 1299 return DATETIME_Create (hwnd, wParam, lParam); 1299 1300 1300 1301 case WM_DESTROY: 1301 1302 return DATETIME_Destroy (hwnd, wParam, lParam); 1302 1303 1303 1304 default: 1304 1305 1306 1305 if (uMsg >= WM_USER) 1306 ERR("unknown msg %04x wp=%08x lp=%08lx\n", 1307 uMsg, wParam, lParam); 1307 1308 #ifdef __WIN32OS2__ 1308 1309 return defComCtl32ProcA (hwnd, uMsg, wParam, lParam); 1309 1310 #else 1310 1311 return DefWindowProcA (hwnd, uMsg, wParam, lParam); 1311 1312 #endif 1312 1313 } … … 1329 1330 wndClass.hbrBackground = (HBRUSH)(COLOR_WINDOW + 1); 1330 1331 wndClass.lpszClassName = DATETIMEPICK_CLASSA; 1331 1332 1332 1333 RegisterClassA (&wndClass); 1333 1334 }
Note:
See TracChangeset
for help on using the changeset viewer.