Ignore:
Timestamp:
Jul 12, 1999, 5:58:51 PM (26 years ago)
Author:
cbratschi
Message:

wine-990704 updates, TBCUSTOMIZE implemented

File:
1 edited

Legend:

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

    r190 r295  
    1 /* $Id: ipaddress.c,v 1.5 1999-06-25 15:49:01 achimha Exp $ */
     1/* $Id: ipaddress.c,v 1.6 1999-07-12 15:58:47 cbratschi Exp $ */
    22/*
    33 * IP Address control
    44 *
     5 * Copyright 1999 Chris Morgan<cmorgan@wpi.edu> and
     6 *                James Abbatiello<abbeyj@wpi.edu>
    57 * Copyright 1998, 1999 Eric Kohl
    68 * Copyright 1998 Alex Priem <alexp@sci.kun.nl>
     
    810 *
    911 * NOTES
    10 
    1112 *
    1213 * TODO:
    1314 *    -Check ranges when changing field-focus.
    14  *        -Check all notifications/behavior.
     15 *        -Check all notifications/behavior.
    1516 *    -Optimization: include lpipsi in IPADDRESS_INFO.
    16  *        -CurrentFocus: field that has focus at moment of processing.
    17  *        -connect Rect32 rcClient.
    18  *        -handle right and left arrows correctly. Boring.
    19  *        -split GotoNextField in CheckField and GotoNextField.
    20  *        -check ipaddress.cpp for missing features.
     17 *        -CurrentFocus: field that has focus at moment of processing.
     18 *        -connect Rect32 rcClient.
     19 *        -handle right and left arrows correctly. Boring.
     20 *        -split GotoNextField in CheckField and GotoNextField.
     21 *        -check ipaddress.cpp for missing features.
    2122 *    -refresh: draw '.' instead of setpixel.
    22  *        -handle VK_ESCAPE.
     23 *        -handle VK_ESCAPE.
    2324 */
    2425
     
    3637
    3738
    38 static BOOL 
     39static BOOL
    3940IPADDRESS_SendNotify (HWND hwnd, UINT command);
    40 static BOOL 
     41static BOOL
    4142IPADDRESS_SendIPAddressNotify (HWND hwnd, UINT field, BYTE newValue);
    4243
     
    5556IPADDRESS_Refresh (HWND hwnd, HDC hdc)
    5657{
    57         RECT rcClient;
    58         HBRUSH hbr;
    59         COLORREF clr=GetSysColor (COLOR_3DDKSHADOW);
     58        RECT rcClient;
     59        HBRUSH hbr;
     60        COLORREF clr=GetSysColor (COLOR_3DDKSHADOW);
    6061    int i,x,fieldsize;
    6162
    6263    GetClientRect (hwnd, &rcClient);
    63         hbr =  CreateSolidBrush (RGB(255,255,255));
     64        hbr =  CreateSolidBrush (RGB(255,255,255));
    6465    DrawEdge (hdc, &rcClient, EDGE_SUNKEN, BF_RECT | BF_ADJUST);
    65         FillRect (hdc, &rcClient, hbr);
     66        FillRect (hdc, &rcClient, hbr);
    6667    DeleteObject (hbr);
    6768
    68         x=rcClient.left;
    69         fieldsize=(rcClient.right-rcClient.left) /4;
    70 
    71         for (i=0; i<3; i++) {           /* Should draw text "." here */
    72                 x+=fieldsize;
    73                 SetPixel (hdc, x,   13, clr);
    74                 SetPixel (hdc, x,   14, clr);
    75                 SetPixel (hdc, x+1, 13, clr);
    76                 SetPixel (hdc, x+1, 14, clr);
    77 
    78         }
    79 
    80 }
    81 
    82 
    83 
     69        x=rcClient.left;
     70        fieldsize=(rcClient.right-rcClient.left) /4;
     71
     72        for (i=0; i<3; i++) {           /* Should draw text "." here */
     73                x+=fieldsize;
     74                SetPixel (hdc, x,   13, clr);
     75                SetPixel (hdc, x,   14, clr);
     76                SetPixel (hdc, x+1, 13, clr);
     77                SetPixel (hdc, x+1, 14, clr);
     78        }
     79}
    8480
    8581
     
    8884{
    8985    IPADDRESS_INFO *infoPtr;
    90         RECT rcClient, edit;
    91         int i,fieldsize;
    92         LPIP_SUBCLASS_INFO lpipsi;
    93        
     86        RECT rcClient, edit;
     87        int i,fieldsize;
     88        LPIP_SUBCLASS_INFO lpipsi;
     89
    9490
    9591    infoPtr = (IPADDRESS_INFO *)COMCTL32_Alloc (sizeof(IPADDRESS_INFO));
     
    9894    GetClientRect (hwnd, &rcClient);
    9995
    100         fieldsize=(rcClient.right-rcClient.left) /4;
    101 
    102         edit.top   =rcClient.top+2;
    103         edit.bottom=rcClient.bottom-2;
    104 
    105         lpipsi=(LPIP_SUBCLASS_INFO)
    106                         GetPropA ((HWND)hwnd, IP_SUBCLASS_PROP);
    107         if (lpipsi == NULL)  {
    108                 lpipsi= (LPIP_SUBCLASS_INFO) COMCTL32_Alloc (sizeof(IP_SUBCLASS_INFO));
    109                 lpipsi->hwnd = hwnd;
    110                 lpipsi->uRefCount++;
    111                 SetPropA ((HWND)hwnd, IP_SUBCLASS_PROP,
    112                                         (HANDLE)lpipsi);
    113 /*              infoPtr->lpipsi= lpipsi; */
    114 //      } else
    115         }
    116 //              WARN (ipaddress,"IP-create called twice\n");
    117        
    118         for (i=0; i<=3; i++) {
    119                 infoPtr->LowerLimit[i]=0;
    120                 infoPtr->UpperLimit[i]=255;
    121                 edit.left=rcClient.left+i*fieldsize+3;
    122                 edit.right=rcClient.left+(i+1)*fieldsize-2;
    123                 lpipsi->hwndIP[i]= CreateWindowA ("edit", NULL,
    124                                 WS_CHILD | WS_VISIBLE | ES_LEFT,
    125                                 edit.left, edit.top, edit.right-edit.left, edit.bottom-edit.top,
    126                                 hwnd, (HMENU) 1, GetWindowLongA (hwnd, GWL_HINSTANCE), NULL);
    127                 lpipsi->wpOrigProc[i]= (WNDPROC)
    128                                         SetWindowLongA (lpipsi->hwndIP[i],GWL_WNDPROC, (LONG)
    129                                         IPADDRESS_SubclassProc);
    130                 SetPropA ((HWND)lpipsi->hwndIP[i], IP_SUBCLASS_PROP,
    131                                         (HANDLE)lpipsi);
    132         }
    133 
    134         lpipsi->infoPtr= infoPtr;
     96        fieldsize=(rcClient.right-rcClient.left) /4;
     97
     98        edit.top   =rcClient.top+2;
     99        edit.bottom=rcClient.bottom-2;
     100
     101        lpipsi=(LPIP_SUBCLASS_INFO) GetPropA ((HWND)hwnd, IP_SUBCLASS_PROP);
     102        if (lpipsi == NULL)  {
     103                lpipsi= (LPIP_SUBCLASS_INFO) COMCTL32_Alloc (sizeof(IP_SUBCLASS_INFO));
     104                lpipsi->hwnd = hwnd;
     105                lpipsi->uRefCount++;
     106                SetPropA ((HWND)hwnd, IP_SUBCLASS_PROP, (HANDLE)lpipsi);
     107/*              infoPtr->lpipsi= lpipsi; */
     108//      } else
     109        }
     110//              WARN (ipaddress,"IP-create called twice\n");
     111
     112        for (i=0; i<=3; i++)
     113        {
     114                infoPtr->LowerLimit[i]=0;
     115                infoPtr->UpperLimit[i]=255;
     116                edit.left=rcClient.left+i*fieldsize+6;
     117                edit.right=rcClient.left+(i+1)*fieldsize-2;
     118                lpipsi->hwndIP[i]= CreateWindowA ("edit", NULL,
     119                                WS_CHILD | WS_VISIBLE | ES_CENTER,
     120                                edit.left, edit.top, edit.right-edit.left, edit.bottom-edit.top,
     121                                hwnd, (HMENU) 1, GetWindowLongA (hwnd, GWL_HINSTANCE), NULL);
     122                lpipsi->wpOrigProc[i]= (WNDPROC)
     123                                        SetWindowLongA (lpipsi->hwndIP[i],GWL_WNDPROC, (LONG)
     124                                        IPADDRESS_SubclassProc);
     125                SetPropA ((HWND)lpipsi->hwndIP[i], IP_SUBCLASS_PROP, (HANDLE)lpipsi);
     126        }
     127
     128        lpipsi->infoPtr= infoPtr;
    135129
    136130    return 0;
     
    141135IPADDRESS_Destroy (HWND hwnd, WPARAM wParam, LPARAM lParam)
    142136{
    143         int i;
     137        int i;
    144138    IPADDRESS_INFO *infoPtr = IPADDRESS_GetInfoPtr (hwnd);
    145         LPIP_SUBCLASS_INFO lpipsi=(LPIP_SUBCLASS_INFO)
     139        LPIP_SUBCLASS_INFO lpipsi=(LPIP_SUBCLASS_INFO)
    146140            GetPropA ((HWND)hwnd, IP_SUBCLASS_PROP);
    147141
    148         for (i=0; i<=3; i++) {
    149                 SetWindowLongA ((HWND)lpipsi->hwndIP[i], GWL_WNDPROC,
     142        for (i=0; i<=3; i++) {
     143                SetWindowLongA ((HWND)lpipsi->hwndIP[i], GWL_WNDPROC,
    150144                  (LONG)lpipsi->wpOrigProc[i]);
    151         }
     145        }
    152146
    153147    COMCTL32_Free (infoPtr);
     
    161155    HDC hdc;
    162156
    163 //      TRACE (ipaddress,"\n");
     157//      TRACE (ipaddress,"\n");
    164158    hdc = GetDC (hwnd);
    165159    IPADDRESS_Refresh (hwnd, hdc);
     
    167161
    168162    IPADDRESS_SendIPAddressNotify (hwnd, 0, 0);  /* FIXME: should use -1 */
    169     IPADDRESS_SendNotify (hwnd, EN_KILLFOCUS);       
     163    IPADDRESS_SendNotify (hwnd, EN_KILLFOCUS);
    170164    InvalidateRect (hwnd, NULL, TRUE);
    171165
     
    183177    IPADDRESS_Refresh (hwnd, hdc);
    184178    if(!wParam)
    185         EndPaint (hwnd, &ps);
     179        EndPaint (hwnd, &ps);
    186180    return 0;
    187181}
     
    193187    HDC hdc;
    194188
    195 //      TRACE (ipaddress,"\n");
     189//      TRACE (ipaddress,"\n");
    196190
    197191    hdc = GetDC (hwnd);
     
    207201{
    208202    /* IPADDRESS_INFO *infoPtr = IPADDRESS_GetInfoPtr (hwnd); */
    209 //      TRACE (ipaddress,"\n");
     203//      TRACE (ipaddress,"\n");
    210204    return 0;
    211205}
     
    225219IPADDRESS_SendIPAddressNotify (HWND hwnd, UINT field, BYTE newValue)
    226220{
    227         NMIPADDRESS nmip;
     221        NMIPADDRESS nmip;
    228222
    229223//    TRACE (ipaddress, "%x %x\n",field,newValue);
     
    232226    nmip.hdr.code     = IPN_FIELDCHANGED;
    233227
    234         nmip.iField=field;
    235         nmip.iValue=newValue;
     228        nmip.iField=field;
     229        nmip.iValue=newValue;
    236230
    237231    return (BOOL)SendMessageA (GetParent (hwnd), WM_NOTIFY,
     
    245239IPADDRESS_ClearAddress (HWND hwnd, WPARAM wParam, LPARAM lParam)
    246240{
    247         int i;
    248         HDC hdc;
    249         char buf[1];
    250         LPIP_SUBCLASS_INFO lpipsi=(LPIP_SUBCLASS_INFO)
     241        int i;
     242        HDC hdc;
     243        char buf[1];
     244        LPIP_SUBCLASS_INFO lpipsi=(LPIP_SUBCLASS_INFO)
    251245            GetPropA ((HWND)hwnd,IP_SUBCLASS_PROP);
    252246
    253 //      TRACE (ipaddress,"\n");
    254 
    255         buf[0]=0;
    256         for (i=0; i<=3; i++)
    257                 SetWindowTextA (lpipsi->hwndIP[i],buf);
    258        
     247//      TRACE (ipaddress,"\n");
     248
     249        buf[0]=0;
     250        for (i=0; i<=3; i++)
     251                SetWindowTextA (lpipsi->hwndIP[i],buf);
     252
    259253    hdc = GetDC (hwnd);
    260254    IPADDRESS_Refresh (hwnd, hdc);
    261255    ReleaseDC (hwnd, hdc);
    262        
    263         return 0;
     256
     257        return 0;
    264258}
    265259
     
    275269
    276270 for (i=0; i<=3; i++) {
    277                 GetWindowTextA (lpipsi->hwndIP[i],buf,5);
    278         if (buf[0])
    279             return 0;
    280         }
     271                GetWindowTextA (lpipsi->hwndIP[i],buf,5);
     272        if (buf[0])
     273            return 0;
     274        }
    281275
    282276 return 1;
     
    298292 ip_addr=0;
    299293 for (i=0; i<=3; i++) {
    300                 GetWindowTextA (lpipsi->hwndIP[i],field,4);
    301                 ip_addr*=256;
    302                 if (field[0]) {
    303                         field[3]=0;
    304                         fieldvalue=atoi(field);
    305                         if (fieldvalue<infoPtr->LowerLimit[i])
    306                                 fieldvalue=infoPtr->LowerLimit[i];
    307                         if (fieldvalue>infoPtr->UpperLimit[i])
    308                                 fieldvalue=infoPtr->UpperLimit[i];
    309                         ip_addr+=fieldvalue;
    310                         valid++;
    311                 }
     294                GetWindowTextA (lpipsi->hwndIP[i],field,4);
     295                ip_addr*=256;
     296                if (field[0]) {
     297                        field[3]=0;
     298                        fieldvalue=atoi(field);
     299                        if (fieldvalue<infoPtr->LowerLimit[i])
     300                                fieldvalue=infoPtr->LowerLimit[i];
     301                        if (fieldvalue>infoPtr->UpperLimit[i])
     302                                fieldvalue=infoPtr->UpperLimit[i];
     303                        ip_addr+=fieldvalue;
     304                        valid++;
     305                }
    312306 }
    313307
     
    322316{
    323317    IPADDRESS_INFO *infoPtr = IPADDRESS_GetInfoPtr (hwnd);
    324         INT index;
    325        
    326 //      TRACE (ipaddress,"\n");
    327 
    328         index=(INT) wParam;
    329         if ((index<0) || (index>3)) return 0;
    330 
    331         infoPtr->LowerLimit[index]=lParam & 0xff;
    332         infoPtr->UpperLimit[index]=(lParam >>8)  & 0xff;
    333         return 1;
     318        INT index;
     319
     320//      TRACE (ipaddress,"\n");
     321
     322        index=(INT) wParam;
     323        if ((index<0) || (index>3)) return 0;
     324
     325        infoPtr->LowerLimit[index]=lParam & 0xff;
     326        infoPtr->UpperLimit[index]=(lParam >>8)  & 0xff;
     327        return 1;
    334328}
    335329
     
    338332{
    339333    IPADDRESS_INFO *infoPtr = IPADDRESS_GetInfoPtr (hwnd);
    340         HDC hdc;
    341         LPIP_SUBCLASS_INFO lpipsi=(LPIP_SUBCLASS_INFO)
     334        HDC hdc;
     335        LPIP_SUBCLASS_INFO lpipsi=(LPIP_SUBCLASS_INFO)
    342336            GetPropA ((HWND)hwnd, IP_SUBCLASS_PROP);
    343         int i,ip_address,value;
     337        int i,ip_address,value;
    344338    char buf[20];
    345339
    346 //      TRACE (ipaddress,"\n");
    347         ip_address=(DWORD) lParam;
    348 
    349         for (i=3; i>=0; i--) {
    350                 value=ip_address & 0xff;
    351                 if ((value>=infoPtr->LowerLimit[i]) && (value<=infoPtr->UpperLimit[i]))
    352                         {
    353                         sprintf (buf,"%d",value);
    354                         SetWindowTextA (lpipsi->hwndIP[i],buf);
    355                         IPADDRESS_SendNotify (hwnd, EN_CHANGE);
    356                 }
    357                 ip_address/=256;
    358         }
    359 
    360     hdc = GetDC (hwnd);         /* & send notifications */
     340//      TRACE (ipaddress,"\n");
     341        ip_address=(DWORD) lParam;
     342
     343        for (i=3; i>=0; i--) {
     344                value=ip_address & 0xff;
     345                if ((value>=infoPtr->LowerLimit[i]) && (value<=infoPtr->UpperLimit[i]))
     346                        {
     347                        sprintf (buf,"%d",value);
     348                        SetWindowTextA (lpipsi->hwndIP[i],buf);
     349                        IPADDRESS_SendNotify (hwnd, EN_CHANGE);
     350                }
     351                ip_address/=256;
     352        }
     353
     354    hdc = GetDC (hwnd);         /* & send notifications */
    361355    IPADDRESS_Refresh (hwnd, hdc);
    362356    ReleaseDC (hwnd, hdc);
     
    372366{
    373367    /* IPADDRESS_INFO *infoPtr = IPADDRESS_GetInfoPtr (hwnd); */
    374         LPIP_SUBCLASS_INFO lpipsi=(LPIP_SUBCLASS_INFO)
    375             GetPropA ((HWND)hwnd, IP_SUBCLASS_PROP);
    376         INT index;
    377 
    378         index=(INT) wParam;
    379 //      TRACE (ipaddress," %d\n", index);
    380         if ((index<0) || (index>3)) return 0;
    381        
    382         SetFocus (lpipsi->hwndIP[index]);
    383        
     368        LPIP_SUBCLASS_INFO lpipsi=(LPIP_SUBCLASS_INFO) GetPropA ((HWND)hwnd,
     369                                              IP_SUBCLASS_PROP);
     370        INT index;
     371
     372        index=(INT) wParam;
     373//      TRACE (ipaddress," %d\n", index);
     374        if ((index<0) || (index>3)) return 0;
     375
     376        SetFocus (lpipsi->hwndIP[index]);
     377
    384378    return 1;
    385379}
     
    391385//    TRACE (ipaddress, "\n");
    392386
    393         SetFocus (hwnd);
    394         IPADDRESS_SendNotify (hwnd, EN_SETFOCUS);
    395         IPADDRESS_SetFocusToField (hwnd, 0, 0);
    396 
    397         return TRUE;
    398 }
    399 
    400 
    401 
    402 /* tab/shift-tab: IPN_FIELDCHANGED, lose focus.
    403    dot, space,right arrow:      set focus to next child edit.
    404    numerics (0..9), control characters: forward to default edit control
    405    other characters: dropped
    406 */
    407    
    408 
    409 
    410 
    411 static int
     387        SetFocus (hwnd);
     388        IPADDRESS_SendNotify (hwnd, EN_SETFOCUS);
     389        IPADDRESS_SetFocusToField (hwnd, 0, 0);
     390
     391        return TRUE;
     392}
     393
     394static INT
     395IPADDRESS_CheckField (LPIP_SUBCLASS_INFO lpipsi, int currentfield)
     396{
     397  int newField,fieldvalue;
     398  char field[20];
     399  IPADDRESS_INFO *infoPtr=lpipsi->infoPtr;
     400
     401  if(currentfield >= 0 && currentfield < 4)
     402  {
     403//    TRACE("\n");
     404    GetWindowTextA (lpipsi->hwndIP[currentfield],field,4);
     405    if (field[0])
     406    {
     407      field[3]=0;
     408      newField=-1;
     409      fieldvalue=atoi(field);
     410
     411      if (fieldvalue < infoPtr->LowerLimit[currentfield])
     412        newField=infoPtr->LowerLimit[currentfield];
     413
     414      if (fieldvalue > infoPtr->UpperLimit[currentfield])
     415        newField=infoPtr->UpperLimit[currentfield];
     416
     417      if (newField >= 0)
     418      {
     419        sprintf (field,"%d",newField);
     420        SetWindowTextA (lpipsi->hwndIP[currentfield], field);
     421        return TRUE;
     422      }
     423    }
     424  }
     425  return FALSE;
     426}
     427
     428
     429static INT
    412430IPADDRESS_GotoNextField (LPIP_SUBCLASS_INFO lpipsi, int currentfield)
    413431{
    414  int newField,fieldvalue;
    415  char field[20];
    416  IPADDRESS_INFO *infoPtr=lpipsi->infoPtr;
    417 
    418 // TRACE (ipaddress,"\n");
    419  GetWindowTextA (lpipsi->hwndIP[currentfield],field,4);
    420  if (field[0]) {
    421         field[3]=0;     
    422         newField=-1;
    423         fieldvalue=atoi(field);
    424         if (fieldvalue<infoPtr->LowerLimit[currentfield])
    425                 newField=infoPtr->LowerLimit[currentfield];
    426         if (fieldvalue>infoPtr->UpperLimit[currentfield])
    427                 newField=infoPtr->UpperLimit[currentfield];
    428         if (newField>=0) {
    429                 sprintf (field,"%d",newField);
    430                 SetWindowTextA (lpipsi->hwndIP[currentfield], field);
    431                 return 1;
    432         }
    433  }
    434 
    435  if (currentfield<3)
    436                 SetFocus (lpipsi->hwndIP[currentfield+1]);
    437  return 0;
    438 }
     432  if(currentfield >= -1 && currentfield < 4)
     433  {
     434    IPADDRESS_CheckField(lpipsi, currentfield); /* check the fields value */
     435
     436    if(currentfield < 3)
     437    {
     438      SetFocus (lpipsi->hwndIP[currentfield+1]);
     439      return TRUE;
     440    }
     441  }
     442  return FALSE;
     443}
     444
     445
     446/* period: move and select the text in the next field to the right if */
     447/*         the current field is not empty(l!=0), we are not in the */
     448/*         left most position, and nothing is selected(startsel==endsel) */
     449
     450/* spacebar: same behavior as period */
     451
     452/* alpha characters: completely ignored */
     453
     454/* digits: accepted when field text length < 2 ignored otherwise. */
     455/*         when 3 numbers have been entered into the field the value */
     456/*         of the field is checked, if the field value exceeds the */
     457/*         maximum value and is changed the field remains the current */
     458/*         field, otherwise focus moves to the field to the right */
     459
     460/* tab: change focus from the current ipaddress control to the next */
     461/*      control in the tab order */
     462
     463/* right arrow: move to the field on the right to the left most */
     464/*              position in that field if no text is selected, */
     465/*              we are in the right most position in the field, */
     466/*              we are not in the right most field */
     467
     468/* left arrow: move to the field on the left to the right most */
     469/*             position in that field if no text is selected, */
     470/*             we are in the left most position in the current field */
     471/*             and we are not in the left most field */
     472
     473/* backspace: delete the character to the left of the cursor position, */
     474/*            if none are present move to the field on the left if */
     475/*            we are not in the left most field and delete the right */
     476/*            most digit in that field while keeping the cursor */
     477/*            on the right side of the field */
     478
    439479
    440480
     
    442482IPADDRESS_SubclassProc (HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam)
    443483{
    444  int i,l,index;
    445  IPADDRESS_INFO *infoPtr;
    446  LPIP_SUBCLASS_INFO lpipsi=(LPIP_SUBCLASS_INFO)
    447             GetPropA ((HWND)hwnd,IP_SUBCLASS_PROP);
    448 
    449  infoPtr = lpipsi->infoPtr;
    450  index=0;             /* FIXME */
    451  for (i=0; i<=3; i++)
    452                 if (lpipsi->hwndIP[i]==hwnd) index=i;
    453 
    454  switch (uMsg) {
    455         case WM_CHAR: break;
    456         case WM_KEYDOWN: {
    457                         char c=(char) wParam;
    458                         if (c==VK_TAB) {
    459                                 HWND pwnd;
    460                                 int shift;
    461                                 shift = GetKeyState(VK_SHIFT) & 0x8000;
    462                                 if (shift)
    463                                         pwnd=GetNextDlgTabItem (GetParent (hwnd), 0, TRUE);
    464                                 else
    465                                         pwnd=GetNextDlgTabItem (GetParent (hwnd), 0, FALSE);
    466                                 if (pwnd) SetFocus (pwnd);
    467                                 break;
    468                         }
    469                        
    470                         if ((c==' ') || (c=='.') || (c==VK_RIGHT)) {
    471                                 IPADDRESS_GotoNextField (lpipsi,index);
    472                                 wParam=0;
    473                                 lParam=0;
    474                                 break;
    475                         }
    476                         if (c==VK_LEFT) {
    477                                
    478                         }
    479                         if (c==VK_RETURN) {
    480                         }
    481                         if (((c>='0') && (c<='9')) || (iscntrl(c))) {
    482                                 l=GetWindowTextLengthA (lpipsi->hwndIP[index]);
    483                                 if (l==3)
    484                                         if (IPADDRESS_GotoNextField (lpipsi,index)) {
    485                                                 wParam=0;
    486                                                 lParam=0;
    487                                         }
    488                                 break;
    489                         }
    490        
    491                         wParam=0;
    492                         lParam=0;
    493                         break;
    494                 }
    495  }
    496 
    497  return CallWindowProcA (lpipsi->wpOrigProc[index], hwnd, uMsg, wParam, lParam);
     484  IPADDRESS_INFO *infoPtr;
     485  LPIP_SUBCLASS_INFO lpipsi=(LPIP_SUBCLASS_INFO) GetPropA ((HWND)hwnd,IP_SUBCLASS_PROP);
     486  CHAR c = (CHAR)wParam;
     487  INT i, l, index, startsel, endsel;
     488
     489  infoPtr = lpipsi->infoPtr;
     490  index=0;             /* FIXME */
     491  for (i=0; i<=3; i++)
     492    if (lpipsi->hwndIP[i]==hwnd) index=i;
     493
     494  switch (uMsg) {
     495  case WM_CHAR:
     496    if(isdigit(c)) /* process all digits */
     497    {
     498      int return_val;
     499      SendMessageA(lpipsi->hwndIP[index], EM_GETSEL, (WPARAM)&startsel, (LPARAM)&endsel);
     500      l = GetWindowTextLengthA (lpipsi->hwndIP[index]);
     501      if(l==2 && startsel==endsel) /* field is full after this key is processed */
     502      {
     503        /* process the digit press before we check the field */
     504        return_val = CallWindowProcA (lpipsi->wpOrigProc[index], hwnd, uMsg, wParam, lParam);
     505
     506        /* if the field value was changed stay at the current field */
     507        if(!IPADDRESS_CheckField(lpipsi, index))
     508          IPADDRESS_GotoNextField (lpipsi,index);
     509
     510        return return_val;
     511      }
     512
     513      if(l > 2) /* field is full, stop key messages */
     514      {
     515        lParam = 0;
     516        wParam = 0;
     517      }
     518      break;
     519    }
     520
     521    if(c == '.') /* VK_PERIOD */
     522    {
     523      l = GetWindowTextLengthA(lpipsi->hwndIP[index]);
     524      SendMessageA(lpipsi->hwndIP[index], EM_GETSEL, (WPARAM)&startsel, (LPARAM)&endsel);
     525      if(l != 0 && startsel==endsel && startsel != 0)
     526      {
     527        IPADDRESS_GotoNextField(lpipsi, index);
     528        SendMessageA(lpipsi->hwndIP[index+1], EM_SETSEL, (WPARAM)0, (LPARAM)3);
     529      }
     530    }
     531
     532    /* stop all other characters */
     533    wParam = 0;
     534    lParam = 0;
     535    break;
     536
     537  case WM_KEYDOWN:
     538    if(c == VK_SPACE)
     539    {
     540      l = GetWindowTextLengthA(lpipsi->hwndIP[index]);
     541      SendMessageA(lpipsi->hwndIP[index], EM_GETSEL, (WPARAM)&startsel, (LPARAM)&endsel);
     542      if(l != 0 && startsel==endsel && startsel != 0)
     543      {
     544        IPADDRESS_GotoNextField(lpipsi, index);
     545        SendMessageA(lpipsi->hwndIP[index+1], EM_SETSEL, (WPARAM)0, (LPARAM)3);
     546      }
     547    }
     548
     549    if(c == VK_RIGHT)
     550    {
     551      SendMessageA(lpipsi->hwndIP[index], EM_GETSEL, (WPARAM)&startsel, (LPARAM)&endsel);
     552      l = GetWindowTextLengthA (lpipsi->hwndIP[index]);
     553
     554      if(startsel==endsel && startsel==l)
     555      {
     556        IPADDRESS_GotoNextField(lpipsi, index);
     557        SendMessageA(lpipsi->hwndIP[index+1], EM_SETSEL, (WPARAM)0,(LPARAM)0);
     558      }
     559    }
     560
     561    if(c == VK_LEFT)
     562    {
     563      SendMessageA(lpipsi->hwndIP[index], EM_GETSEL, (WPARAM)&startsel, (LPARAM)&endsel);
     564      if(startsel==0 && startsel==endsel && index > 0)
     565      {
     566        IPADDRESS_GotoNextField(lpipsi, index - 2);
     567        l = GetWindowTextLengthA(lpipsi->hwndIP[index-1]);
     568        SendMessageA(lpipsi->hwndIP[index-1], EM_SETSEL, (WPARAM)l,(LPARAM)l);
     569      }
     570    }
     571
     572    if(c == VK_BACK) /* VK_BACKSPACE */
     573    {
     574      CHAR buf[4];
     575
     576      SendMessageA(lpipsi->hwndIP[index], EM_GETSEL, (WPARAM)&startsel, (LPARAM)&endsel);
     577      l = GetWindowTextLengthA (lpipsi->hwndIP[index]);
     578      if(startsel==endsel && startsel==0 && index > 0)
     579      {
     580        l = GetWindowTextLengthA(lpipsi->hwndIP[index-1]);
     581        if(l!=0)
     582        {
     583          GetWindowTextA (lpipsi->hwndIP[index-1],buf,4);
     584          buf[l-1] = '\0';
     585          SetWindowTextA(lpipsi->hwndIP[index-1], buf);
     586          SendMessageA(lpipsi->hwndIP[index-1], EM_SETSEL, (WPARAM)l,(LPARAM)l);
     587        }
     588        IPADDRESS_GotoNextField(lpipsi, index - 2);
     589      }
     590    }
     591    break;
     592
     593  default:
     594    break;
     595  }
     596  return CallWindowProcA (lpipsi->wpOrigProc[index], hwnd, uMsg, wParam, lParam);
    498597}
    499598
     
    503602    switch (uMsg)
    504603    {
    505         case IPM_CLEARADDRESS:
    506                 return IPADDRESS_ClearAddress (hwnd, wParam, lParam);
    507 
    508         case IPM_SETADDRESS:
    509             return IPADDRESS_SetAddress (hwnd, wParam, lParam);
    510 
    511         case IPM_GETADDRESS:
    512             return IPADDRESS_GetAddress (hwnd, wParam, lParam);
    513 
    514         case IPM_SETRANGE:
    515             return IPADDRESS_SetRange (hwnd, wParam, lParam);
    516 
    517         case IPM_SETFOCUS:
    518             return IPADDRESS_SetFocusToField (hwnd, wParam, lParam);
    519 
    520         case IPM_ISBLANK:
    521                 return IPADDRESS_IsBlank (hwnd, wParam, lParam);
    522 
    523         case WM_CREATE:
    524             return IPADDRESS_Create (hwnd, wParam, lParam);
    525 
    526         case WM_DESTROY:
    527             return IPADDRESS_Destroy (hwnd, wParam, lParam);
    528 
    529         case WM_GETDLGCODE:
    530             return DLGC_WANTARROWS | DLGC_WANTCHARS;
    531 
    532         case WM_KILLFOCUS:
    533             return IPADDRESS_KillFocus (hwnd, wParam, lParam);
    534 
    535         case WM_LBUTTONDOWN:
     604        case IPM_CLEARADDRESS:
     605                return IPADDRESS_ClearAddress (hwnd, wParam, lParam);
     606
     607        case IPM_SETADDRESS:
     608            return IPADDRESS_SetAddress (hwnd, wParam, lParam);
     609
     610        case IPM_GETADDRESS:
     611            return IPADDRESS_GetAddress (hwnd, wParam, lParam);
     612
     613        case IPM_SETRANGE:
     614            return IPADDRESS_SetRange (hwnd, wParam, lParam);
     615
     616        case IPM_SETFOCUS:
     617            return IPADDRESS_SetFocusToField (hwnd, wParam, lParam);
     618
     619        case IPM_ISBLANK:
     620                return IPADDRESS_IsBlank (hwnd, wParam, lParam);
     621
     622        case WM_CREATE:
     623            return IPADDRESS_Create (hwnd, wParam, lParam);
     624
     625        case WM_DESTROY:
     626            return IPADDRESS_Destroy (hwnd, wParam, lParam);
     627
     628        case WM_GETDLGCODE:
     629            return DLGC_WANTARROWS | DLGC_WANTCHARS;
     630
     631        case WM_KILLFOCUS:
     632            return IPADDRESS_KillFocus (hwnd, wParam, lParam);
     633
     634        case WM_LBUTTONDOWN:
    536635        return IPADDRESS_LButtonDown (hwnd, wParam, lParam);
    537636
    538         case WM_PAINT:
    539             return IPADDRESS_Paint (hwnd, wParam);
    540 
    541         case WM_SETFOCUS:
    542             return IPADDRESS_SetFocus (hwnd, wParam, lParam);
    543 
    544         case WM_SIZE:
    545             return IPADDRESS_Size (hwnd, wParam, lParam);
    546 
    547         default:
    548 //          if (uMsg >= WM_USER)
    549 //              ERR (ipaddress, "unknown msg %04x wp=%08x lp=%08lx\n",
    550 //                   uMsg, wParam, lParam);
    551             return DefWindowProcA (hwnd, uMsg, wParam, lParam);
     637        case WM_PAINT:
     638            return IPADDRESS_Paint (hwnd, wParam);
     639
     640        case WM_SETFOCUS:
     641            return IPADDRESS_SetFocus (hwnd, wParam, lParam);
     642
     643        case WM_SIZE:
     644            return IPADDRESS_Size (hwnd, wParam, lParam);
     645
     646        default:
     647//          if (uMsg >= WM_USER)
     648//              ERR (ipaddress, "unknown msg %04x wp=%08x lp=%08lx\n",
     649//                   uMsg, wParam, lParam);
     650            return DefWindowProcA (hwnd, uMsg, wParam, lParam);
    552651    }
    553652    return 0;
     
    570669    wndClass.hbrBackground = (HBRUSH)(COLOR_3DFACE + 1);
    571670    wndClass.lpszClassName = WC_IPADDRESSA;
    572  
     671
    573672    RegisterClassA (&wndClass);
    574673}
Note: See TracChangeset for help on using the changeset viewer.