Ignore:
Timestamp:
May 15, 2003, 4:25:14 PM (22 years ago)
Author:
sandervl
Message:

Wine resync

File:
1 edited

Legend:

Unmodified
Added
Removed
  • trunk/src/comctl32/datetime.c

    r6709 r10097  
    66 * Copyright 2000 Chris Morgan <cmorgan@wpi.edu>
    77 *
     8 * This library is free software; you can redistribute it and/or
     9 * modify it under the terms of the GNU Lesser General Public
     10 * License as published by the Free Software Foundation; either
     11 * version 2.1 of the License, or (at your option) any later version.
     12 *
     13 * This library is distributed in the hope that it will be useful,
     14 * but WITHOUT ANY WARRANTY; without even the implied warranty of
     15 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
     16 * Lesser General Public License for more details.
     17 *
     18 * You should have received a copy of the GNU Lesser General Public
     19 * License along with this library; if not, write to the Free Software
     20 * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
    821 *
    922 * TODO:
     
    2033#include "wingdi.h"
    2134#include "commctrl.h"
    22 #include "debugtools.h"
    23 
    24 #ifdef __WIN32OS2__
    25 #include "ccbase.h"
    26 #define inline
    27 #endif
    28 
    29 DEFAULT_DEBUG_CHANNEL(datetime);
     35#include "wine/debug.h"
     36
     37WINE_DEFAULT_DEBUG_CHANNEL(datetime);
    3038
    3139typedef struct
    3240{
    33 #ifdef __WIN32OS2__
    34         COMCTL32_HEADER header;
    35 #endif
    3641        HWND hMonthCal;
    3742        HWND hUpdown;
     
    5156        int *fieldspec;
    5257        RECT *fieldRect;
    53         int  *buflen;           
     58        int  *buflen;
    5459        char textbuf[256];
    5560        POINT monthcal_pos;
     
    6166/* this list of defines is closely related to `allowedformatchars' defined
    6267 * in datetime.c; the high nibble indicates the `base type' of the format
    63  * specifier. 
     68 * specifier.
    6469 * Do not change without first reading DATETIME_UseFormat.
    65  * 
     70 *
    6671 */
    6772
    68 #define DT_END_FORMAT      0 
     73#define DT_END_FORMAT      0
    6974#define ONEDIGITDAY     0x01
    7075#define TWODIGITDAY     0x02
     
    8792#define ONEDIGITYEAR    0x71
    8893#define TWODIGITYEAR    0x72
    89 #ifdef __WIN32OS2__
     94#define INVALIDFULLYEAR 0x73      /* FIXME - yyy is not valid - we'll treat it as yyyy */
    9095#define FULLYEAR        0x74
    91 #else
    92 #define FULLYEAR        0x73
    93 #endif
    9496#define FORMATCALLBACK  0x81      /* -> maximum of 0x80 callbacks possible */
    9597#define FORMATCALLMASK  0x80
     
    109111extern void MONTHCAL_CopyTime(const SYSTEMTIME *from, SYSTEMTIME *to);
    110112static const char *allowedformatchars = {"dhHmMstyX'"};
    111 #ifdef __WIN32OS2__
    112113static const int maxrepetition [] = {4,2,2,2,4,2,2,4,-1,-1};
    113 //DT all wine xxx.nls contains yyyy for FULLYEAR
    114 #else
    115 static const int maxrepetition [] = {4,2,2,2,4,2,2,3,-1,-1};
    116 #endif
     114
    117115
    118116static LRESULT
     
    126124  if (!lParam) return GDT_NONE;
    127125
    128   if ((dwStyle & DTS_SHOWNONE) && 
    129        (SendMessageA (infoPtr->hwndCheckbut, BM_GETCHECK, 0, 0)))
     126  if ((dwStyle & DTS_SHOWNONE) &&
     127       (SendMessageA (infoPtr->hwndCheckbut, BM_GETCHECK, 0, 0) == BST_UNCHECKED))
    130128        return GDT_NONE;
    131129
     
    142140  SYSTEMTIME *lprgSysTimeArray=(SYSTEMTIME *) lParam;
    143141
    144   TRACE("%04x %08lx\n",wParam,lParam);
     142  TRACE("%p %04x %08lx\n",hwnd, wParam, lParam);
    145143  if (!lParam) return 0;
    146144
    147   if (lParam==GDT_VALID)
    148         MONTHCAL_CopyTime (lprgSysTimeArray, &infoPtr->date);
    149   if (lParam==GDT_NONE) {
    150         infoPtr->dateValid=FALSE;
    151     SendMessageA (infoPtr->hwndCheckbut, BM_SETCHECK, 0, 0);
    152         }
     145  TRACE("%04d/%02d/%02d %02d:%02d:%02d)\n",
     146        lprgSysTimeArray->wYear, lprgSysTimeArray->wMonth, lprgSysTimeArray->wDay,
     147        lprgSysTimeArray->wHour, lprgSysTimeArray->wMinute, lprgSysTimeArray->wSecond);
     148
     149  if (wParam==GDT_VALID) {
     150      infoPtr->dateValid = TRUE;
     151      MONTHCAL_CopyTime (lprgSysTimeArray, &infoPtr->date);
     152      SendMessageA (infoPtr->hwndCheckbut, BM_SETCHECK, BST_CHECKED, 0);
     153  } else if (wParam==GDT_NONE) {
     154      infoPtr->dateValid = FALSE;
     155      SendMessageA (infoPtr->hwndCheckbut, BM_SETCHECK, BST_UNCHECKED, 0);
     156  }
     157  InvalidateRect(hwnd, NULL, TRUE);
    153158  return 1;
    154159}
     160
    155161
    156162static LRESULT
     
    203209
    204210  TRACE("\n");
    205   return infoPtr->hMonthCal;
     211  return (LRESULT)infoPtr->hMonthCal;
    206212}
    207213
     
    228234
    229235
    230 /* 
    231    Split up a formattxt in actions. 
     236/*
     237   Split up a formattxt in actions.
    232238   See ms documentation for the meaning of the letter codes/'specifiers'.
    233239
    234    Notes: 
     240   Notes:
    235241   *'dddddd' is handled as 'dddd' plus 'dd'.
    236    *unrecognized formats are strings (here given the type DT_STRING; 
     242   *unrecognized formats are strings (here given the type DT_STRING;
    237243   start of the string is encoded in lower bits of DT_STRING.
    238244   Therefore, 'string' ends finally up as '<show seconds>tring'.
     
    241247
    242248
    243 static void 
     249static void
    244250DATETIME_UseFormat (DATETIME_INFO *infoPtr, const char *formattxt)
    245251{
     
    258264        TRACE ("\n%d %c:",i, formattxt[i]);
    259265        for (j=0; j<len; j++) {
    260                 if (allowedformatchars[j]==formattxt[i]) {   
     266                if (allowedformatchars[j]==formattxt[i]) {
    261267                        TRACE ("%c[%d,%x]",allowedformatchars[j], *nrFields,
    262268                                                         infoPtr->fieldspec[*nrFields]);
     
    265271                                break;
    266272                        }
    267                         if (infoPtr->fieldspec[*nrFields]>>4!=j) {   
    268                                 (*nrFields)++; 
     273                        if (infoPtr->fieldspec[*nrFields]>>4!=j) {
     274                                (*nrFields)++;
    269275                                infoPtr->fieldspec[*nrFields]=(j<<4) +1;
    270276                                break;
    271277                        }
    272278                        if ((infoPtr->fieldspec[*nrFields] & 0x0f)==maxrepetition[j]) {
    273                                 (*nrFields)++; 
     279                                (*nrFields)++;
    274280                                infoPtr->fieldspec[*nrFields]=(j<<4) +1;
    275281                                break;
     
    286292                        infoPtr->fieldspec[*nrFields]=DT_STRING+k;
    287293                        infoPtr->buflen[*nrFields]=0;
    288         } else 
     294        } else
    289295                if ((infoPtr->fieldspec[*nrFields] & DT_STRING)!=DT_STRING)  {
    290296                        (*nrFields)++;
    291297                        infoPtr->fieldspec[*nrFields]=DT_STRING+k;
    292298                        infoPtr->buflen[*nrFields]=0;
    293                 } 
     299                }
    294300                infoPtr->textbuf[k]=formattxt[i];
    295301                k++;
     
    309315
    310316
    311 static LRESULT 
     317static LRESULT
    312318DATETIME_SetFormat (HWND hwnd, WPARAM wParam, LPARAM lParam)
    313319{
     
    320326        DWORD dwStyle = GetWindowLongA (hwnd, GWL_STYLE);
    321327
    322         if (dwStyle & DTS_LONGDATEFORMAT) 
     328        if (dwStyle & DTS_LONGDATEFORMAT)
    323329                format_item=LOCALE_SLONGDATE;
    324         else if (dwStyle & DTS_TIMEFORMAT) 
     330        else if (dwStyle & DTS_TIMEFORMAT)
    325331                format_item=LOCALE_STIMEFORMAT;
    326332        else /* DTS_SHORTDATEFORMAT */
     
    328334        GetLocaleInfoA( GetSystemDefaultLCID(), format_item,format_buf,sizeof(format_buf));
    329335        DATETIME_UseFormat (infoPtr, format_buf);
    330  }     
     336 }
    331337 else
    332338        DATETIME_UseFormat (infoPtr, (char *) lParam);
     
    336342
    337343
    338 static LRESULT 
     344static LRESULT
    339345DATETIME_SetFormatW (HWND hwnd, WPARAM wParam, LPARAM lParam)
    340346
     
    351357        COMCTL32_Free (buf);
    352358        return retval;
    353  } 
     359 }
    354360 else
    355361        return DATETIME_SetFormat (hwnd, 0, 0);
     
    358364
    359365
    360 static void 
    361 DATETIME_ReturnTxt (DATETIME_INFO *infoPtr, int count, char *result)
     366static void
     367DATETIME_ReturnTxt (DATETIME_INFO *infoPtr, int count, char *result, int resultSize)
    362368{
    363369 SYSTEMTIME date = infoPtr->date;
     
    373379
    374380 if (!infoPtr->fieldspec) return;
    375  
     381
    376382 spec=infoPtr->fieldspec[count];
    377383 if (spec & DT_STRING) {
    378384        int txtlen=infoPtr->buflen[count];
    379385
    380         strncpy (result, infoPtr->textbuf + (spec &~ DT_STRING), txtlen);
     386        if (txtlen > resultSize)
     387            txtlen = resultSize - 1;
     388        memcpy (result, infoPtr->textbuf + (spec &~ DT_STRING), txtlen);
    381389        result[txtlen]=0;
    382390        TRACE ("arg%d=%x->[%s]\n",count,infoPtr->fieldspec[count],result);
     
    384392 }
    385393
    386                
     394
    387395 switch (spec) {
    388         case DT_END_FORMAT: 
     396        case DT_END_FORMAT:
    389397                *result=0;
    390398                break;
    391         case ONEDIGITDAY: 
     399        case ONEDIGITDAY:
    392400                sprintf (result,"%d",date.wDay);
    393401                break;
    394         case TWODIGITDAY: 
     402        case TWODIGITDAY:
    395403                sprintf (result,"%.2d",date.wDay);
    396404                break;
    397         case THREECHARDAY: 
     405        case THREECHARDAY:
    398406                GetLocaleInfoA( LOCALE_USER_DEFAULT, LOCALE_SABBREVDAYNAME1+(date.wDayOfWeek+6)%7,
    399407                                result,4);
     
    402410        case FULLDAY:
    403411                GetLocaleInfoA( LOCALE_USER_DEFAULT,LOCALE_SDAYNAME1+ (date.wDayOfWeek+6)%7,
    404                                 buffer,sizeof(buffer));
    405                 strcpy  (result,buffer);
    406                 break;
    407         case ONEDIGIT12HOUR:
    408                 if (date.wHour>12)
     412                               result, resultSize);
     413                break;
     414        case ONEDIGIT12HOUR:
     415                if (date.wHour>12)
    409416                        sprintf (result,"%d",date.wHour-12);
    410                 else 
     417                else
    411418                        sprintf (result,"%d",date.wHour);
    412419                break;
    413         case TWODIGIT12HOUR: 
    414                 if (date.wHour>12) 
     420        case TWODIGIT12HOUR:
     421                if (date.wHour>12)
    415422                        sprintf (result,"%.2d",date.wHour-12);
    416                 else 
     423                else
    417424                        sprintf (result,"%.2d",date.wHour);
    418425                break;
    419         case ONEDIGIT24HOUR: 
     426        case ONEDIGIT24HOUR:
    420427                sprintf (result,"%d",date.wHour);
    421428                break;
    422         case TWODIGIT24HOUR: 
     429        case TWODIGIT24HOUR:
    423430                sprintf (result,"%.2d",date.wHour);
    424431                break;
    425         case ONEDIGITSECOND: 
     432        case ONEDIGITSECOND:
    426433                sprintf (result,"%d",date.wSecond);
    427434                break;
    428         case TWODIGITSECOND: 
     435        case TWODIGITSECOND:
    429436                sprintf (result,"%.2d",date.wSecond);
    430437                break;
    431         case ONEDIGITMINUTE: 
     438        case ONEDIGITMINUTE:
    432439                sprintf (result,"%d",date.wMinute);
    433440                break;
    434         case TWODIGITMINUTE: 
     441        case TWODIGITMINUTE:
    435442                sprintf (result,"%.2d",date.wMinute);
    436443                break;
    437         case ONEDIGITMONTH: 
     444        case ONEDIGITMONTH:
    438445                sprintf (result,"%d",date.wMonth);
    439446                break;
    440         case TWODIGITMONTH: 
     447        case TWODIGITMONTH:
    441448                sprintf (result,"%.2d",date.wMonth);
    442449                break;
    443         case THREECHARMONTH: 
     450        case THREECHARMONTH:
    444451                GetLocaleInfoA( GetSystemDefaultLCID(),LOCALE_SMONTHNAME1+date.wMonth -1,
    445                   buffer,sizeof(buffer));
     452                               buffer,sizeof(buffer));
    446453                sprintf (result,"%.3s",buffer);
    447454                break;
    448         case FULLMONTH:   
     455        case FULLMONTH:
    449456                GetLocaleInfoA( GetSystemDefaultLCID(),LOCALE_SMONTHNAME1+date.wMonth -1,
    450457#ifdef __WIN32OS2__
     
    452459                strcpy  (result,buffer);
    453460#else
    454                   result,sizeof(result));
     461                               result, resultSize);
    455462#endif
    456463                break;
    457         case ONELETTERAMPM:   
    458                 if (date.wHour<12) 
     464        case ONELETTERAMPM:
     465                if (date.wHour<12)
    459466                        strcpy (result,"A");
    460                 else 
     467                else
    461468                        strcpy (result,"P");
    462469                break;
    463         case TWOLETTERAMPM:   
    464                 if (date.wHour<12) 
     470        case TWOLETTERAMPM:
     471                if (date.wHour<12)
    465472                        strcpy (result,"AM");
    466                 else 
     473                else
    467474                        strcpy (result,"PM");
    468475                break;
    469         case FORMATCALLBACK:   
     476        case FORMATCALLBACK:
    470477                FIXME ("Not implemented\n");
    471478                strcpy (result,"xxx");
    472479                break;
    473         case ONEDIGITYEAR: 
     480        case ONEDIGITYEAR:
    474481                sprintf (result,"%d",date.wYear-10* (int) floor(date.wYear/10));
    475482                break;
    476         case TWODIGITYEAR: 
     483        case TWODIGITYEAR:
    477484                sprintf (result,"%.2d",date.wYear-100* (int) floor(date.wYear/100));
    478485                break;
    479         case FULLYEAR:   
     486        case INVALIDFULLYEAR:
     487        case FULLYEAR:
    480488                sprintf (result,"%d",date.wYear);
    481489                break;
    482490    }
    483        
     491
    484492        TRACE ("arg%d=%x->[%s]\n",count,infoPtr->fieldspec[count],result);
    485493}
    486494
    487495
    488 static void 
     496static void
    489497DATETIME_IncreaseField (DATETIME_INFO *infoPtr, int number)
    490498{
     
    497505 spec=infoPtr->fieldspec[number];
    498506 if ((spec & DTHT_DATEFIELD)==0) return;
    499                
     507
    500508 switch (spec) {
    501         case ONEDIGITDAY: 
    502         case TWODIGITDAY: 
    503         case THREECHARDAY: 
     509        case ONEDIGITDAY:
     510        case TWODIGITDAY:
     511        case THREECHARDAY:
    504512        case FULLDAY:
    505513                date->wDay++;
    506514                if (date->wDay>MONTHCAL_MonthLength(date->wMonth,date->wYear))
    507                   date->wDay=1; 
    508                 break;
    509         case ONEDIGIT12HOUR: 
    510         case TWODIGIT12HOUR: 
    511         case ONEDIGIT24HOUR: 
    512         case TWODIGIT24HOUR: 
     515                  date->wDay=1;
     516                break;
     517        case ONEDIGIT12HOUR:
     518        case TWODIGIT12HOUR:
     519        case ONEDIGIT24HOUR:
     520        case TWODIGIT24HOUR:
    513521                date->wHour++;
    514522                if (date->wHour>23) date->wHour=0;
    515523                break;
    516         case ONEDIGITSECOND: 
    517         case TWODIGITSECOND: 
     524        case ONEDIGITSECOND:
     525        case TWODIGITSECOND:
    518526                date->wSecond++;
    519527                if (date->wSecond>59) date->wSecond=0;
    520528                break;
    521         case ONEDIGITMINUTE: 
    522         case TWODIGITMINUTE: 
     529        case ONEDIGITMINUTE:
     530        case TWODIGITMINUTE:
    523531                date->wMinute++;
    524532                if (date->wMinute>59) date->wMinute=0;
    525533                break;
    526         case ONEDIGITMONTH: 
    527         case TWODIGITMONTH: 
    528         case THREECHARMONTH: 
    529         case FULLMONTH:   
     534        case ONEDIGITMONTH:
     535        case TWODIGITMONTH:
     536        case THREECHARMONTH:
     537        case FULLMONTH:
    530538                date->wMonth++;
    531539                if (date->wMonth>12) date->wMonth=1;
    532                 if (date->wDay>MONTHCAL_MonthLength(date->wMonth,date->wYear)) 
     540                if (date->wDay>MONTHCAL_MonthLength(date->wMonth,date->wYear))
    533541                        date->wDay=MONTHCAL_MonthLength(date->wMonth,date->wYear);
    534542                break;
    535         case ONELETTERAMPM:   
    536         case TWOLETTERAMPM:   
     543        case ONELETTERAMPM:
     544        case TWOLETTERAMPM:
    537545                date->wHour+=12;
    538546                if (date->wHour>23) date->wHour-=24;
    539547                break;
    540         case FORMATCALLBACK:   
     548        case FORMATCALLBACK:
    541549                FIXME ("Not implemented\n");
    542550                break;
    543         case ONEDIGITYEAR: 
    544         case TWODIGITYEAR: 
    545         case FULLYEAR:   
     551        case ONEDIGITYEAR:
     552        case TWODIGITYEAR:
     553        case FULLYEAR:
    546554                date->wYear++;
    547555                break;
     
    551559
    552560
    553 static void 
     561static void
    554562DATETIME_DecreaseField (DATETIME_INFO *infoPtr, int number)
    555563{
     
    562570 spec = infoPtr->fieldspec[number];
    563571 if ((spec & DTHT_DATEFIELD)==0) return;
    564                
     572
    565573 TRACE ("%x\n",spec);
    566574
    567575 switch (spec) {
    568         case ONEDIGITDAY: 
    569         case TWODIGITDAY: 
    570         case THREECHARDAY: 
     576        case ONEDIGITDAY:
     577        case TWODIGITDAY:
     578        case THREECHARDAY:
    571579        case FULLDAY:
    572580                date->wDay--;
    573                 if (date->wDay<1) 
     581                if (date->wDay<1)
    574582                  date->wDay=MONTHCAL_MonthLength(date->wMonth,date->wYear);
    575583                break;
    576         case ONEDIGIT12HOUR: 
    577         case TWODIGIT12HOUR: 
    578         case ONEDIGIT24HOUR: 
    579         case TWODIGIT24HOUR: 
    580                 if (date->wHour) 
     584        case ONEDIGIT12HOUR:
     585        case TWODIGIT12HOUR:
     586        case ONEDIGIT24HOUR:
     587        case TWODIGIT24HOUR:
     588                if (date->wHour)
    581589                        date->wHour--;
    582590                else
    583591                        date->wHour=23;
    584592                break;
    585         case ONEDIGITSECOND: 
    586         case TWODIGITSECOND: 
    587                 if (date->wHour) 
     593        case ONEDIGITSECOND:
     594        case TWODIGITSECOND:
     595                if (date->wHour)
    588596                        date->wSecond--;
    589597                else
    590598                        date->wHour=59;
    591599                break;
    592         case ONEDIGITMINUTE: 
    593         case TWODIGITMINUTE: 
    594                 if (date->wMinute) 
     600        case ONEDIGITMINUTE:
     601        case TWODIGITMINUTE:
     602                if (date->wMinute)
    595603                        date->wMinute--;
    596604                else
    597605                        date->wMinute=59;
    598606                break;
    599         case ONEDIGITMONTH: 
    600         case TWODIGITMONTH: 
    601         case THREECHARMONTH: 
    602         case FULLMONTH:   
    603                 if (date->wMonth>1) 
     607        case ONEDIGITMONTH:
     608        case TWODIGITMONTH:
     609        case THREECHARMONTH:
     610        case FULLMONTH:
     611                if (date->wMonth>1)
    604612                        date->wMonth--;
    605613                else
    606614                        date->wMonth=12;
    607                 if (date->wDay>MONTHCAL_MonthLength(date->wMonth,date->wYear)) 
     615                if (date->wDay>MONTHCAL_MonthLength(date->wMonth,date->wYear))
    608616                        date->wDay=MONTHCAL_MonthLength(date->wMonth,date->wYear);
    609617                break;
    610         case ONELETTERAMPM:   
    611         case TWOLETTERAMPM:   
    612                 if (date->wHour<12) 
     618        case ONELETTERAMPM:
     619        case TWOLETTERAMPM:
     620                if (date->wHour<12)
    613621                        date->wHour+=12;
    614622                else
    615623                        date->wHour-=12;
    616624                break;
    617         case FORMATCALLBACK:   
     625        case FORMATCALLBACK:
    618626                FIXME ("Not implemented\n");
    619627                break;
    620         case ONEDIGITYEAR: 
    621         case TWODIGITYEAR: 
    622         case FULLYEAR:   
     628        case ONEDIGITYEAR:
     629        case TWODIGITYEAR:
     630        case FULLYEAR:
    623631                date->wYear--;
    624632                break;
     
    628636
    629637
    630 static void 
     638static void
    631639DATETIME_ResetFieldDown (DATETIME_INFO *infoPtr, int number)
    632640{
     
    639647 spec = infoPtr->fieldspec[number];
    640648 if ((spec & DTHT_DATEFIELD)==0) return;
    641                
     649
    642650
    643651 switch (spec) {
    644         case ONEDIGITDAY: 
    645         case TWODIGITDAY: 
    646         case THREECHARDAY: 
     652        case ONEDIGITDAY:
     653        case TWODIGITDAY:
     654        case THREECHARDAY:
    647655        case FULLDAY:
    648656                date->wDay = 1;
    649657                break;
    650         case ONEDIGIT12HOUR: 
    651         case TWODIGIT12HOUR: 
    652         case ONEDIGIT24HOUR: 
    653         case TWODIGIT24HOUR: 
    654         case ONELETTERAMPM:   
    655         case TWOLETTERAMPM:   
     658        case ONEDIGIT12HOUR:
     659        case TWODIGIT12HOUR:
     660        case ONEDIGIT24HOUR:
     661        case TWODIGIT24HOUR:
     662        case ONELETTERAMPM:
     663        case TWOLETTERAMPM:
    656664                date->wHour = 0;
    657665                break;
    658         case ONEDIGITSECOND: 
    659         case TWODIGITSECOND: 
     666        case ONEDIGITSECOND:
     667        case TWODIGITSECOND:
    660668                date->wSecond = 0;
    661669                break;
    662         case ONEDIGITMINUTE: 
    663         case TWODIGITMINUTE: 
     670        case ONEDIGITMINUTE:
     671        case TWODIGITMINUTE:
    664672                date->wMinute = 0;
    665673                break;
    666         case ONEDIGITMONTH: 
    667         case TWODIGITMONTH: 
    668         case THREECHARMONTH: 
    669         case FULLMONTH:   
     674        case ONEDIGITMONTH:
     675        case TWODIGITMONTH:
     676        case THREECHARMONTH:
     677        case FULLMONTH:
    670678                date->wMonth = 1;
    671         case FORMATCALLBACK:   
     679        case FORMATCALLBACK:
    672680                FIXME ("Not implemented\n");
    673681                break;
    674         case ONEDIGITYEAR:
    675         case TWODIGITYEAR:
    676         /* FYI: On 9/14/1752 the calender changed and England and the American */
    677         /* colonies changed to the Gregorian calender.  This change involved */
    678         /* having September 14th following September 2nd.  So no date algorithms */
    679         /* work before that date. */
    680         case FULLYEAR:   
     682        case ONEDIGITYEAR:
     683        case TWODIGITYEAR:
     684        /* FYI: On 1752/9/14 the calendar changed and England and the
     685         * American colonies changed to the Gregorian calendar. This change
     686         * involved having September 14th follow September 2nd. So no date
     687         * algorithm works before that date.
     688         */
     689        case FULLYEAR:
    681690                date->wSecond = 0;
    682691                date->wMinute = 0;
     
    691700
    692701
    693 static void 
     702static void
    694703DATETIME_ResetFieldUp (DATETIME_INFO *infoPtr, int number)
    695704{
     
    702711 spec=infoPtr->fieldspec[number];
    703712 if ((spec & DTHT_DATEFIELD)==0) return;
    704                
     713
    705714 switch (spec) {
    706         case ONEDIGITDAY: 
    707         case TWODIGITDAY: 
    708         case THREECHARDAY: 
     715        case ONEDIGITDAY:
     716        case TWODIGITDAY:
     717        case THREECHARDAY:
    709718        case FULLDAY:
    710719                date->wDay=MONTHCAL_MonthLength(date->wMonth,date->wYear);
    711720                break;
    712         case ONEDIGIT12HOUR: 
    713         case TWODIGIT12HOUR: 
    714         case ONEDIGIT24HOUR: 
    715         case TWODIGIT24HOUR: 
    716         case ONELETTERAMPM:   
    717         case TWOLETTERAMPM:   
     721        case ONEDIGIT12HOUR:
     722        case TWODIGIT12HOUR:
     723        case ONEDIGIT24HOUR:
     724        case TWODIGIT24HOUR:
     725        case ONELETTERAMPM:
     726        case TWOLETTERAMPM:
    718727                date->wHour=23;
    719728                break;
    720         case ONEDIGITSECOND: 
    721         case TWODIGITSECOND: 
     729        case ONEDIGITSECOND:
     730        case TWODIGITSECOND:
    722731                date->wSecond=59;
    723732                break;
    724         case ONEDIGITMINUTE: 
    725         case TWODIGITMINUTE: 
     733        case ONEDIGITMINUTE:
     734        case TWODIGITMINUTE:
    726735                date->wMinute=59;
    727736                break;
    728         case ONEDIGITMONTH: 
    729         case TWODIGITMONTH: 
    730         case THREECHARMONTH: 
    731         case FULLMONTH:   
     737        case ONEDIGITMONTH:
     738        case TWODIGITMONTH:
     739        case THREECHARMONTH:
     740        case FULLMONTH:
    732741                date->wMonth=12;
    733         case FORMATCALLBACK:   
     742        case FORMATCALLBACK:
    734743                FIXME ("Not implemented\n");
    735744                break;
    736         case ONEDIGITYEAR: 
    737         case TWODIGITYEAR: 
    738         case FULLYEAR:   
     745        case ONEDIGITYEAR:
     746        case TWODIGITYEAR:
     747        case FULLYEAR:
    739748                date->wYear=9999;    /* Y10K problem? naaah. */
    740749                break;
     
    758767  SIZE size;
    759768  COLORREF oldBk, oldTextColor;
    760  
     769
    761770  /* draw control edge */
    762771  TRACE("\n");
     
    764773  FillRect(hdc, rcClient, hbr);
    765774  DrawEdge(hdc, rcClient, EDGE_SUNKEN, BF_RECT);
    766   DeleteObject(hbr);   
    767        
     775  DeleteObject(hbr);
     776
    768777  if (infoPtr->dateValid) {
    769778    char txt[80];
     
    771780    oldFont = SelectObject (hdc, infoPtr->hFont);
    772781
    773     DATETIME_ReturnTxt (infoPtr, 0, txt);
     782    DATETIME_ReturnTxt (infoPtr, 0, txt, sizeof(txt));
    774783    GetTextExtentPoint32A (hdc, txt, strlen (txt), &size);
    775784    rcDraw->bottom = size.cy+2;
     
    780789
    781790    for (i=0; i<infoPtr->nrFields; i++) {
    782       DATETIME_ReturnTxt (infoPtr, i, txt);
     791      DATETIME_ReturnTxt (infoPtr, i, txt, sizeof(txt));
    783792      GetTextExtentPoint32A (hdc, txt, strlen (txt), &size);
    784793      field = & infoPtr->fieldRect[i];
     
    832841    if (PtInRect (&infoPtr->fieldRect[i], pt)) {
    833842      retval = i;
    834       TRACE("Hit in date text in field %d\n", i);           
     843      TRACE("Hit in date text in field %d\n", i);
    835844      break;
    836845    }
     
    845854DATETIME_LButtonDown (HWND hwnd, WPARAM wParam, LPARAM lParam)
    846855{
    847   DATETIME_INFO *infoPtr = DATETIME_GetInfoPtr (hwnd); 
     856  DATETIME_INFO *infoPtr = DATETIME_GetInfoPtr (hwnd);
    848857  DWORD dwStyle = GetWindowLongA (hwnd, GWL_STYLE);
    849858  int old, new;
     
    867876  if (infoPtr->select == DTHT_MCPOPUP) {
    868877    /* FIXME: button actually is only depressed during dropdown of the */
    869     /* calender control and when the mouse is over the button window */
     878    /* calendar control and when the mouse is over the button window */
    870879    infoPtr->bCalDepressed = TRUE;
    871880
     
    874883      infoPtr->monthcal_pos.x = infoPtr->rcClient.right - ((infoPtr->calbutton.right -
    875884                                infoPtr->calbutton.left) + 145);
    876     else 
     885    else
    877886      infoPtr->monthcal_pos.x = 8;
    878887
     
    887896        ShowWindow(infoPtr->hMonthCal, SW_SHOW);
    888897
    889     TRACE ("dt:%x mc:%x mc parent:%x, desktop:%x, mcpp:%x\n",
    890               hwnd,infoPtr->hMonthCal, 
     898    TRACE ("dt:%p mc:%p mc parent:%p, desktop:%p, mcpp:%p\n",
     899              hwnd,infoPtr->hMonthCal,
    891900              GetParent (infoPtr->hMonthCal),
    892901              GetDesktopWindow (),
     
    904913DATETIME_LButtonUp (HWND hwnd, WPARAM wParam, LPARAM lParam)
    905914{
    906   DATETIME_INFO *infoPtr = DATETIME_GetInfoPtr (hwnd); 
     915  DATETIME_INFO *infoPtr = DATETIME_GetInfoPtr (hwnd);
    907916
    908917  TRACE("\n");
    909  
     918
    910919  if(infoPtr->bCalDepressed == TRUE) {
    911920    infoPtr->bCalDepressed = FALSE;
     
    932941
    933942static LRESULT
     943DATETIME_Button_Command (HWND hwnd, WPARAM wParam, LPARAM lParam)
     944{
     945    DATETIME_INFO *infoPtr = DATETIME_GetInfoPtr(hwnd);
     946
     947    switch(HIWORD(wParam)) {
     948    case BN_CLICKED:
     949    {
     950        DWORD state = SendMessageA((HWND)lParam, BM_GETCHECK, 0, 0);
     951        if(state == BST_CHECKED)
     952            infoPtr->dateValid = TRUE;
     953        else
     954            infoPtr->dateValid = FALSE;
     955        InvalidateRect(hwnd, NULL, TRUE);
     956        return 0;
     957    }
     958    default:
     959        return 0;
     960    }
     961}
     962         
     963       
     964       
     965static LRESULT
     966DATETIME_Command (HWND hwnd, WPARAM wParam, LPARAM lParam)
     967{
     968    DATETIME_INFO *infoPtr = DATETIME_GetInfoPtr(hwnd);
     969
     970    TRACE("%08x %08lx\n", wParam, lParam);
     971    TRACE("hwndbutton = %p\n", infoPtr->hwndCheckbut);
     972    if(infoPtr->hwndCheckbut == (HWND)lParam)
     973        return DATETIME_Button_Command(hwnd, wParam, lParam);
     974    return 0;
     975}
     976
     977static LRESULT
    934978DATETIME_ParentNotify (HWND hwnd, WPARAM wParam, LPARAM lParam)
    935979{
    936  DATETIME_INFO *infoPtr = DATETIME_GetInfoPtr (hwnd);   
     980 DATETIME_INFO *infoPtr = DATETIME_GetInfoPtr (hwnd);
    937981 LPNMHDR lpnmh = (LPNMHDR) lParam;
    938982
     
    943987#else
    944988 TRACE ("%x,%lx\n",wParam, lParam);
    945  TRACE ("Got notification %x from %x\n", lpnmh->code, lpnmh->hwndFrom);
     989 TRACE ("Got notification %x from %p\n", lpnmh->code, lpnmh->hwndFrom);
    946990#endif
    947  TRACE ("info: %x %x %x\n",hwnd,infoPtr->hMonthCal,infoPtr->hUpdown);
     991 TRACE ("info: %p %p %p\n",hwnd,infoPtr->hMonthCal,infoPtr->hUpdown);
    948992 return 0;
    949993}
     
    954998
    955999{
    956  DATETIME_INFO *infoPtr = DATETIME_GetInfoPtr (hwnd);   
     1000 DATETIME_INFO *infoPtr = DATETIME_GetInfoPtr (hwnd);
    9571001 LPNMHDR lpnmh = (LPNMHDR) lParam;
    9581002
    9591003 TRACE ("%x,%lx\n",wParam, lParam);
    960  TRACE ("Got notification %x from %x\n", lpnmh->code, lpnmh->hwndFrom);
    961  TRACE ("info: %x %x %x\n",hwnd,infoPtr->hMonthCal,infoPtr->hUpdown);
     1004 TRACE ("Got notification %x from %p\n", lpnmh->code, lpnmh->hwndFrom);
     1005 TRACE ("info: %p %p %p\n",hwnd,infoPtr->hMonthCal,infoPtr->hUpdown);
    9621006 return 0;
    9631007}
    9641008
    9651009
    966 static LRESULT 
     1010static LRESULT
    9671011DATETIME_KeyDown (HWND hwnd, WPARAM wParam, LPARAM lParam)
    9681012{
     
    9831027 switch (wParam) {
    9841028        case VK_ADD:
    985         case VK_UP: 
     1029        case VK_UP:
    9861030                DATETIME_IncreaseField (infoPtr,FieldNum);
    9871031                DATETIME_SendDateTimeChangeNotify (hwnd);
     
    10001044                DATETIME_SendDateTimeChangeNotify (hwnd);
    10011045                break;
    1002         case VK_LEFT: 
     1046        case VK_LEFT:
    10031047                do {
    10041048                        if (infoPtr->select==0) {
    10051049                                infoPtr->select = infoPtr->nrFields - 1;
    10061050                                wrap++;
    1007                         } else 
     1051                        } else
    10081052                        infoPtr->select--;
    10091053                }
    10101054                while ((infoPtr->fieldspec[infoPtr->select] & DT_STRING) && (wrap<2));
    10111055                break;
    1012         case VK_RIGHT: 
     1056        case VK_RIGHT:
    10131057                do {
    10141058                        infoPtr->select++;
     
    10311075DATETIME_KillFocus (HWND hwnd, WPARAM wParam, LPARAM lParam)
    10321076{
    1033     DATETIME_INFO *infoPtr = DATETIME_GetInfoPtr (hwnd);       
     1077    DATETIME_INFO *infoPtr = DATETIME_GetInfoPtr (hwnd);
    10341078
    10351079    TRACE ("\n");
     
    10491093DATETIME_SetFocus (HWND hwnd, WPARAM wParam, LPARAM lParam)
    10501094{
    1051     DATETIME_INFO *infoPtr = DATETIME_GetInfoPtr (hwnd);       
     1095    DATETIME_INFO *infoPtr = DATETIME_GetInfoPtr (hwnd);
    10521096
    10531097    TRACE ("\n");
    10541098
    10551099    if (infoPtr->haveFocus==0) {
    1056         DATETIME_SendSimpleNotify (hwnd, NM_SETFOCUS); 
     1100        DATETIME_SendSimpleNotify (hwnd, NM_SETFOCUS);
    10571101        infoPtr->haveFocus = DTHT_GOTFOCUS;
    10581102    }
     
    10681112
    10691113{
    1070  DATETIME_INFO *infoPtr = DATETIME_GetInfoPtr (hwnd);   
     1114 DATETIME_INFO *infoPtr = DATETIME_GetInfoPtr (hwnd);
    10711115 NMDATETIMECHANGE dtdtc;
    10721116
     
    11111155  infoPtr->rcClient.right = LOWORD(lParam);
    11121156
    1113   TRACE("Height=%d, Width=%d\n", infoPtr->rcClient.bottom, infoPtr->rcClient.right);
     1157  TRACE("Height=%ld, Width=%ld\n", infoPtr->rcClient.bottom, infoPtr->rcClient.right);
    11141158
    11151159  /* use DrawEdge to adjust the size of rcEdge to get rcDraw */
    11161160  memcpy((&infoPtr->rcDraw), (&infoPtr->rcClient), sizeof(infoPtr->rcDraw));
    11171161
    1118   DrawEdge((HDC)NULL, &(infoPtr->rcDraw), EDGE_SUNKEN, BF_RECT | BF_ADJUST);
    1119 
    1120   /* set the size of the button that drops the calender down */
     1162  DrawEdge(NULL, &(infoPtr->rcDraw), EDGE_SUNKEN, BF_RECT | BF_ADJUST);
     1163
     1164  /* set the size of the button that drops the calendar down */
    11211165  /* FIXME: account for style that allows button on left side */
    11221166  infoPtr->calbutton.top   = infoPtr->rcDraw.top;
     
    11361180    infoPtr->monthcal_pos.x = infoPtr->rcClient.right - ((infoPtr->calbutton.right -
    11371181                                infoPtr->calbutton.left) + 145);
    1138   else 
     1182  else
    11391183    infoPtr->monthcal_pos.x = 8;
    11401184
     
    11591203  /* allocate memory for info structure */
    11601204  TRACE("%04x %08lx\n",wParam,lParam);
    1161 #ifdef __WIN32OS2__
    1162   infoPtr = (DATETIME_INFO*)initControl(hwnd,sizeof(DATETIME_INFO));
    1163 #else
    11641205  infoPtr = (DATETIME_INFO *)COMCTL32_Alloc (sizeof(DATETIME_INFO));
    1165 #endif
    11661206  if (infoPtr == NULL) {
    11671207    ERR("could not allocate info memory!\n");
     
    11721212
    11731213  if (dwStyle & DTS_SHOWNONE) {
    1174     infoPtr->hwndCheckbut=CreateWindowExA (0,"button", 0, 
    1175          WS_CHILD | WS_VISIBLE | BS_AUTOCHECKBOX, 
     1214    infoPtr->hwndCheckbut=CreateWindowExA (0,"button", 0,
     1215         WS_CHILD | WS_VISIBLE | BS_AUTOCHECKBOX,
    11761216         2,2,13,13,
    1177          hwnd, 
    1178          0, GetWindowLongA  (hwnd, GWL_HINSTANCE), 0);
     1217         hwnd,
     1218         0, (HINSTANCE)GetWindowLongA  (hwnd, GWL_HINSTANCE), 0);
    11791219         SendMessageA (infoPtr->hwndCheckbut, BM_SETCHECK, 1, 0);
    11801220  }
     
    11961236
    11971237  /* create the monthcal control */
    1198     infoPtr->hMonthCal = CreateWindowExA (0,"SysMonthCal32", 0, 
     1238    infoPtr->hMonthCal = CreateWindowExA (0,"SysMonthCal32", 0,
    11991239        WS_BORDER | WS_POPUP | WS_CLIPSIBLINGS,
    12001240        0, 0, 0, 0,
    1201         GetParent(hwnd), 
     1241        GetParent(hwnd),
    12021242        0, 0, 0);
    12031243
     
    12141254{
    12151255    DATETIME_INFO *infoPtr = DATETIME_GetInfoPtr (hwnd);
    1216        
     1256
    12171257    TRACE("\n");
    12181258    COMCTL32_Free (infoPtr);
     
    12251265DATETIME_WindowProc (HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam)
    12261266{
    1227 
    12281267    if (!DATETIME_GetInfoPtr(hwnd) && (uMsg != WM_CREATE))
    12291268        return DefWindowProcA( hwnd, uMsg, wParam, lParam );
    1230    
     1269
    12311270    switch (uMsg)
    12321271    {
     
    13011340        return DATETIME_Destroy (hwnd, wParam, lParam);
    13021341
     1342    case WM_COMMAND:
     1343        return DATETIME_Command (hwnd, wParam, lParam);
     1344
    13031345    default:
    1304         if (uMsg >= WM_USER)
     1346        if ((uMsg >= WM_USER) && (uMsg < WM_APP))
    13051347                ERR("unknown msg %04x wp=%08x lp=%08lx\n",
    13061348                     uMsg, wParam, lParam);
    1307 #ifdef __WIN32OS2__
    1308         return defComCtl32ProcA (hwnd, uMsg, wParam, lParam);
    1309 #else
    13101349        return DefWindowProcA (hwnd, uMsg, wParam, lParam);
    1311 #endif
    13121350    }
    13131351    return 0;
     
    13291367    wndClass.hbrBackground = (HBRUSH)(COLOR_WINDOW + 1);
    13301368    wndClass.lpszClassName = DATETIMEPICK_CLASSA;
    1331  
     1369
    13321370    RegisterClassA (&wndClass);
    13331371}
     
    13381376{
    13391377    TRACE("\n");
    1340     UnregisterClassA (DATETIMEPICK_CLASSA, (HINSTANCE)NULL);
    1341 }
    1342 
    1343 
     1378    UnregisterClassA (DATETIMEPICK_CLASSA, NULL);
     1379}
Note: See TracChangeset for help on using the changeset viewer.