Ignore:
Timestamp:
Oct 4, 1999, 6:02:07 PM (26 years ago)
Author:
cbratschi
Message:

* empty log message *

File:
1 edited

Legend:

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

    r1111 r1125  
    1 /* $Id: header.c,v 1.11 1999-10-02 13:58:21 cbratschi Exp $ */
     1/* $Id: header.c,v 1.12 1999-10-04 16:02:07 cbratschi Exp $ */
    22/*
    33 *  Header control
     
    1717 *   - Unicode support.
    1818 *
    19  *  FIXME:
    20  *   - Little flaw when drawing a bitmap on the right side of the text.
    2119 *
    2220 * Status: Development in progress, a lot to do :)
     
    3937#define MIN_ITEMWIDTH  0
    4038#define ITEM_FRAMESIZE 2
     39#define TEXT_MARGIN    3
    4140
    4241#define HEADER_GetInfoPtr(hwnd) ((HEADER_INFO *)GetWindowLongA(hwnd,0))
    4342
     43static VOID
     44HEADER_DrawItemImage(HWND hwnd,HDC hdc,HEADER_INFO* infoPtr,HEADER_ITEM* phdi,RECT* r,INT iItem)
     45{
     46  if (phdi->fmt & HDF_IMAGE)
     47  {
     48    INT iImage;
     49    IMAGEINFO info;
     50    INT x,y,cx,cy,w,h,rx,ry;
     51
     52    if (phdi->iImage == I_IMAGECALLBACK)
     53    {
     54      if (IsWindowUnicode(GetParent(hwnd)))
     55      {
     56        NMHDDISPINFOW nmhdr;
     57
     58        nmhdr.hdr.hwndFrom = hwnd;
     59        nmhdr.hdr.idFrom   = GetWindowLongW(hwnd,GWL_ID);
     60        nmhdr.hdr.code     = HDN_GETDISPINFOW;
     61        nmhdr.iItem      = iItem;
     62        nmhdr.mask       = HDI_IMAGE;
     63        nmhdr.iImage     = 0;
     64        nmhdr.lParam     = phdi->lParam;
     65
     66        SendMessageW(GetParent(hwnd),WM_NOTIFY,(WPARAM)nmhdr.hdr.idFrom,(LPARAM)&nmhdr);
     67
     68        iImage = nmhdr.iImage;
     69        if (nmhdr.mask & HDI_DI_SETITEM) phdi->iImage = iImage;
     70      } else
     71      {
     72        NMHDDISPINFOA nmhdr;
     73
     74        nmhdr.hdr.hwndFrom = hwnd;
     75        nmhdr.hdr.idFrom   = GetWindowLongA(hwnd,GWL_ID);
     76        nmhdr.hdr.code     = HDN_GETDISPINFOA;
     77        nmhdr.iItem      = iItem;
     78        nmhdr.mask       = HDI_IMAGE;
     79        nmhdr.iImage     = 0;
     80        nmhdr.lParam     = phdi->lParam;
     81
     82        SendMessageA(GetParent(hwnd),WM_NOTIFY,(WPARAM)nmhdr.hdr.idFrom,(LPARAM)&nmhdr);
     83
     84        iImage = nmhdr.iImage;
     85        if (nmhdr.mask & HDI_DI_SETITEM) phdi->iImage = iImage;
     86      }
     87    } else iImage = phdi->iImage;
     88
     89    if (!ImageList_GetImageInfo(infoPtr->himl,phdi->iImage,&info)) return;
     90    w = info.rcImage.right-info.rcImage.left;
     91    h = info.rcImage.bottom-info.rcImage.top;
     92
     93    ry = r->bottom-r->top;
     94    rx = r->right-r->left;
     95
     96    if (ry >= h)
     97    {
     98      cy = h;
     99      y = r->top+(ry-h)/2;
     100    } else
     101    {
     102      cy = ry;
     103      y = r->top;
     104    }
     105
     106    if (rx >= w+infoPtr->xBmpMargin)
     107      cx = w;
     108    else
     109      cx = MAX(0,rx-w-infoPtr->xBmpMargin);
     110
     111    if (ImageList_DrawEx(infoPtr->himl,phdi->iImage,hdc,x,y,cx,cy,CLR_NONE,CLR_NONE,ILD_TRANSPARENT))
     112    {
     113      r->left += w+2*infoPtr->xBmpMargin;
     114    }
     115  }
     116}
     117
     118static VOID
     119HEADER_DrawItemBitmap(HDC hdc,HEADER_INFO* infoPtr,HEADER_ITEM* phdi,RECT* r,WCHAR* pszText,UINT uTextJustify)
     120{
     121  if ((phdi->fmt & HDF_BITMAP) && !(phdi->fmt & HDF_BITMAP_ON_RIGHT) && (phdi->hbm))
     122  {
     123    BITMAP bmp;
     124    HDC    hdcBitmap;
     125    INT    yD,yS,cx,cy,rx,ry;
     126
     127    GetObjectA (phdi->hbm,sizeof(BITMAP),(LPVOID)&bmp);
     128
     129    ry = r->bottom-r->top;
     130    rx = r->right-r->left;
     131
     132    if (ry >= bmp.bmHeight)
     133    {
     134      cy = bmp.bmHeight;
     135      yD = r->top + (ry - bmp.bmHeight) / 2;
     136      yS = 0;
     137    } else
     138    {
     139      cy = ry;
     140      yD = r->top;
     141      yS = (bmp.bmHeight - ry) / 2;
     142    }
     143
     144    if (rx >= bmp.bmWidth+infoPtr->xBmpMargin)
     145      cx = bmp.bmWidth;
     146    else
     147      cx = MAX(0,rx-bmp.bmWidth-infoPtr->xBmpMargin);
     148
     149    hdcBitmap = CreateCompatibleDC (hdc);
     150    SelectObject(hdcBitmap,phdi->hbm);
     151    BitBlt (hdc,r->left+infoPtr->xBmpMargin,yD,cx,cy,hdcBitmap,0,yS,SRCCOPY);
     152    DeleteDC (hdcBitmap);
     153
     154    r->left += bmp.bmWidth+2*infoPtr->xBmpMargin;
     155  } else if ((phdi->fmt & HDF_BITMAP_ON_RIGHT) && (phdi->hbm))
     156  {
     157    BITMAP bmp;
     158    HDC    hdcBitmap;
     159    INT    xD,yD,yS,cx,cy,rx,ry,tx;
     160    RECT   textRect;
     161
     162    GetObjectA (phdi->hbm,sizeof(BITMAP),(LPVOID)&bmp);
     163
     164    textRect = *r;
     165    DrawTextExW(hdc,pszText,lstrlenW(pszText),&textRect,DT_LEFT|DT_VCENTER|DT_SINGLELINE|DT_CALCRECT|DT_END_ELLIPSIS,NULL);
     166    tx = textRect.right - textRect.left;
     167    ry = r->bottom-r->top;
     168    rx = r->right-r->left;
     169
     170    if (ry >= bmp.bmHeight)
     171    {
     172      cy = bmp.bmHeight;
     173      yD = r->top + (ry - bmp.bmHeight) / 2;
     174      yS = 0;
     175    } else
     176    {
     177      cy = ry;
     178      yD = r->top;
     179      yS = (bmp.bmHeight - ry) / 2;
     180    }
     181
     182    if (r->left+tx+bmp.bmWidth+2*infoPtr->xBmpMargin <= r->right)
     183    {
     184      cx = bmp.bmWidth;
     185      if (uTextJustify & DT_LEFT)
     186        xD = r->left+tx+infoPtr->xBmpMargin;
     187      else
     188      {
     189        xD = r->right-infoPtr->xBmpMargin-bmp.bmWidth;
     190        r->right = xD;
     191      }
     192    } else
     193    {
     194      if (rx >= bmp.bmWidth+2*infoPtr->xBmpMargin)
     195      {
     196        cx = bmp.bmWidth;
     197        xD = r->right-bmp.bmWidth-infoPtr->xBmpMargin;
     198        r->right = xD-infoPtr->xBmpMargin;
     199      } else
     200      {
     201        cx = MAX(0,rx-infoPtr->xBmpMargin);
     202        xD = r->left;
     203        r->right = r->left;
     204      }
     205    }
     206
     207    hdcBitmap = CreateCompatibleDC(hdc);
     208    SelectObject(hdcBitmap,phdi->hbm);
     209    BitBlt(hdc,xD,yD,cx,cy,hdcBitmap,0,yS,SRCCOPY);
     210    DeleteDC (hdcBitmap);
     211  }
     212}
     213
     214static VOID
     215HEADER_DrawItemText(HDC hdc,HEADER_INFO* infoPtr,HEADER_ITEM* phdi,RECT* r,WCHAR* pszText,UINT uTextJustify,BOOL bEraseTextBkgnd,BOOL bHotTrack)
     216{
     217  if ((phdi->fmt & HDF_STRING) && (phdi->pszText))
     218  {
     219    INT  oldBkMode = SetBkMode(hdc,TRANSPARENT);
     220
     221    if ((phdi->fmt & HDF_BITMAP_ON_RIGHT) || !(phdi->fmt & HDF_IMAGE)) r->left += TEXT_MARGIN;
     222    if (!(phdi->fmt & HDF_BITMAP_ON_RIGHT)) r->right -= TEXT_MARGIN;
     223    if (r->left >= r->right) return;
     224
     225    SetTextColor (hdc,GetSysColor(bHotTrack ? COLOR_HIGHLIGHT:COLOR_BTNTEXT)); //CB: not right color: COLOR_HOTLIGHT? (blue in Win95)
     226    if (bEraseTextBkgnd)
     227    {
     228      HBRUSH hbrBk = GetSysColorBrush(COLOR_3DFACE);
     229
     230      FillRect(hdc,r,hbrBk);
     231    }
     232
     233    DrawTextExW(hdc,pszText,lstrlenW(pszText),r,uTextJustify|DT_VCENTER|DT_SINGLELINE|DT_END_ELLIPSIS,NULL);
     234    if (oldBkMode != TRANSPARENT) SetBkMode(hdc,oldBkMode);
     235  }
     236}
    44237
    45238static INT
     
    49242    HEADER_ITEM *phdi = &infoPtr->items[iItem];
    50243    RECT r;
    51     INT  oldBkMode;
    52244
    53245    r = phdi->rect;
     
    56248    if (GetWindowLongA (hwnd, GWL_STYLE) & HDS_BUTTONS)
    57249    {
    58         if (phdi->bDown)
     250      if (phdi->bDown)
     251      {
     252        DrawEdge (hdc,&r,BDR_RAISEDOUTER,BF_RECT | BF_FLAT | BF_MIDDLE | BF_ADJUST);
     253        r.left += 2;
     254        r.top  += 2;
     255      } else
     256          DrawEdge(hdc,&r,EDGE_RAISED,BF_RECT | BF_SOFT | BF_MIDDLE | BF_ADJUST);
     257    } else
     258        DrawEdge(hdc,&r,EDGE_ETCHED, BF_BOTTOM | BF_RIGHT | BF_ADJUST);
     259
     260    if (r.left >= r.right) return phdi->rect.right;
     261
     262    if (phdi->fmt & HDF_OWNERDRAW)
     263    {
     264      DRAWITEMSTRUCT dis;
     265      dis.CtlType    = ODT_HEADER;
     266      dis.CtlID      = GetWindowLongA (hwnd, GWL_ID);
     267      dis.itemID     = iItem;
     268      dis.itemAction = ODA_DRAWENTIRE;
     269      dis.itemState  = phdi->bDown ? ODS_SELECTED : 0;
     270      dis.hwndItem   = hwnd;
     271      dis.hDC        = hdc;
     272      dis.rcItem     = r;
     273      dis.itemData   = phdi->lParam;
     274      SendMessageA (GetParent(hwnd),WM_DRAWITEM,(WPARAM)dis.CtlID,(LPARAM)&dis);
     275    } else
     276    {
     277      UINT uTextJustify;
     278      WCHAR* pszText = phdi->pszText;
     279
     280      if ((phdi->fmt & HDF_JUSTIFYMASK) == HDF_CENTER)
     281        uTextJustify = DT_CENTER;
     282      else if ((phdi->fmt & HDF_JUSTIFYMASK) == HDF_RIGHT)
     283        uTextJustify = DT_RIGHT;
     284      else uTextJustify = DT_LEFT;
     285
     286      if (phdi->pszText == LPSTR_TEXTCALLBACKW)
     287      {
     288        if (IsWindowUnicode(GetParent(hwnd)))
    59289        {
    60             DrawEdge (hdc, &r, BDR_RAISEDOUTER,
    61                         BF_RECT | BF_FLAT | BF_MIDDLE | BF_ADJUST);
    62             r.left += 2;
    63             r.top  += 2;
    64         }
    65         else
    66             DrawEdge (hdc, &r, EDGE_RAISED,
    67                         BF_RECT | BF_SOFT | BF_MIDDLE | BF_ADJUST);
    68     } else
    69         DrawEdge (hdc, &r, EDGE_ETCHED, BF_BOTTOM | BF_RIGHT | BF_ADJUST);
    70 
    71     if (phdi->fmt & HDF_OWNERDRAW)
    72     {
    73         DRAWITEMSTRUCT dis;
    74         dis.CtlType    = ODT_HEADER;
    75         dis.CtlID      = GetWindowLongA (hwnd, GWL_ID);
    76         dis.itemID     = iItem;
    77         dis.itemAction = ODA_DRAWENTIRE;
    78         dis.itemState  = phdi->bDown ? ODS_SELECTED : 0;
    79         dis.hwndItem   = hwnd;
    80         dis.hDC        = hdc;
    81         dis.rcItem     = r;
    82         dis.itemData   = phdi->lParam;
    83         SendMessageA (GetParent (hwnd), WM_DRAWITEM,
    84                         (WPARAM)dis.CtlID, (LPARAM)&dis);
    85     } else
    86     {
    87         UINT uTextJustify = DT_LEFT;
    88 
    89         if ((phdi->fmt & HDF_JUSTIFYMASK) == HDF_CENTER)
    90             uTextJustify = DT_CENTER;
    91         else if ((phdi->fmt & HDF_JUSTIFYMASK) == HDF_RIGHT)
    92             uTextJustify = DT_RIGHT;
    93 
    94         if ((phdi->fmt & HDF_BITMAP) && (phdi->hbm))
     290          NMHDDISPINFOW nmhdr;
     291
     292          nmhdr.hdr.hwndFrom = hwnd;
     293          nmhdr.hdr.idFrom   = GetWindowLongW(hwnd,GWL_ID);
     294          nmhdr.hdr.code     = HDN_GETDISPINFOW;
     295          nmhdr.iItem      = iItem;
     296          nmhdr.mask       = HDI_TEXT;
     297          nmhdr.cchTextMax = phdi->cchTextMax;
     298          nmhdr.pszText    = COMCTL32_Alloc(phdi->cchTextMax*sizeof(WCHAR));
     299          if (nmhdr.pszText) nmhdr.pszText[0] = 0;
     300          nmhdr.lParam     = phdi->lParam;
     301
     302          SendMessageW(GetParent(hwnd),WM_NOTIFY,(WPARAM)nmhdr.hdr.idFrom,(LPARAM)&nmhdr);
     303
     304          pszText = nmhdr.pszText;
     305          if (nmhdr.mask & HDI_DI_SETITEM)
     306          {
     307            INT len = pszText ? lstrlenW(pszText):0;
     308
     309            if (len)
     310            {
     311              phdi->pszText = COMCTL32_Alloc((len+1)*sizeof(WCHAR));
     312              lstrcpyW(phdi->pszText,pszText);
     313            } else phdi->pszText = NULL;
     314            COMCTL32_Free(pszText);
     315            pszText = phdi->pszText;
     316          }
     317        } else
    95318        {
    96             BITMAP bmp;
    97             HDC    hdcBitmap;
    98             INT    yD, yS, cx, cy, rx, ry;
    99 
    100             GetObjectA (phdi->hbm, sizeof(BITMAP), (LPVOID)&bmp);
    101 
    102             ry = r.bottom - r.top;
    103             rx = r.right - r.left;
    104 
    105             if (ry >= bmp.bmHeight)
    106             {
    107                 cy = bmp.bmHeight;
    108                 yD = r.top + (ry - bmp.bmHeight) / 2;
    109                 yS = 0;
    110             } else
    111             {
    112                 cy = ry;
    113                 yD = r.top;
    114                 yS = (bmp.bmHeight - ry) / 2;
    115 
    116             }
    117 
    118             if (rx >= bmp.bmWidth + 6)
    119             {
    120                 cx = bmp.bmWidth;
    121             } else
    122             {
    123                 cx = rx - 6;
    124             }
    125 
    126             hdcBitmap = CreateCompatibleDC (hdc);
    127             SelectObject (hdcBitmap, phdi->hbm);
    128             BitBlt (hdc, r.left + 3, yD, cx, cy, hdcBitmap, 0, yS, SRCCOPY);
    129             DeleteDC (hdcBitmap);
    130 
    131             r.left += (bmp.bmWidth + 3);
    132         }
    133 
    134 
    135         if ((phdi->fmt & HDF_BITMAP_ON_RIGHT) && (phdi->hbm))
     319          NMHDDISPINFOA nmhdr;
     320          INT len;
     321
     322          nmhdr.hdr.hwndFrom = hwnd;
     323          nmhdr.hdr.idFrom   = GetWindowLongA(hwnd,GWL_ID);
     324          nmhdr.hdr.code     = HDN_GETDISPINFOA;
     325          nmhdr.iItem      = iItem;
     326          nmhdr.mask       = HDI_TEXT;
     327          nmhdr.cchTextMax = phdi->cchTextMax;
     328          nmhdr.pszText    = COMCTL32_Alloc(phdi->cchTextMax);
     329          if (nmhdr.pszText) nmhdr.pszText[0] = 0;
     330          nmhdr.lParam     = phdi->lParam;
     331
     332          SendMessageA(GetParent(hwnd),WM_NOTIFY,(WPARAM)nmhdr.hdr.idFrom,(LPARAM)&nmhdr);
     333
     334          len = nmhdr.pszText ? lstrlenA(nmhdr.pszText):0;
     335
     336          if (len)
     337          {
     338            pszText = COMCTL32_Alloc((len+1)*sizeof(WCHAR));
     339            lstrcpyAtoW(pszText,nmhdr.pszText);
     340          } else pszText = NULL;
     341          COMCTL32_Free(nmhdr.pszText);
     342
     343          if (nmhdr.mask & HDI_DI_SETITEM)
     344            phdi->pszText = pszText;
     345        }
     346      }
     347
     348      if (!(phdi->fmt & HDI_ORDER) || (phdi->iOrder & (HDF_LEFT | HDF_CENTER)))
     349      {
     350        HEADER_DrawItemImage(hwnd,hdc,infoPtr,phdi,&r,iItem);
     351        if (r.left < r.right)
    136352        {
    137             BITMAP bmp;
    138             HDC    hdcBitmap;
    139             INT    xD, yD, yS, cx, cy, rx, ry, tx;
    140             RECT   textRect;
    141 
    142             GetObjectA (phdi->hbm, sizeof(BITMAP), (LPVOID)&bmp);
    143 
    144             textRect = r;
    145             if (bEraseTextBkgnd)
    146             {
    147               HBRUSH hbrBk = GetSysColorBrush(COLOR_3DFACE);
    148 
    149               FillRect(hdc,&textRect,hbrBk);
    150             }
    151             DrawTextExW(hdc,phdi->pszText,lstrlenW(phdi->pszText),
    152                   &textRect,DT_LEFT|DT_VCENTER|DT_SINGLELINE|DT_CALCRECT|DT_END_ELLIPSIS,NULL);
    153             tx = textRect.right - textRect.left;
    154             ry = r.bottom - r.top;
    155             rx = r.right - r.left;
    156 
    157             if (ry >= bmp.bmHeight)
    158             {
    159                 cy = bmp.bmHeight;
    160                 yD = r.top + (ry - bmp.bmHeight) / 2;
    161                 yS = 0;
    162             } else
    163             {
    164                 cy = ry;
    165                 yD = r.top;
    166                 yS = (bmp.bmHeight - ry) / 2;
    167 
    168             }
    169 
    170             if (r.left + tx + bmp.bmWidth + 9 <= r.right)
    171             {
    172                 cx = bmp.bmWidth;
    173                 xD = r.left + tx + 6;
    174             } else
    175             {
    176                 if (rx >= bmp.bmWidth + 6)
    177                 {
    178                     cx = bmp.bmWidth;
    179                     xD = r.right - bmp.bmWidth - 3;
    180                     r.right = xD - 3;
    181                 } else
    182                 {
    183                     cx = rx - 3;
    184                     xD = r.left;
    185                     r.right = r.left;
    186                 }
    187             }
    188 
    189             hdcBitmap = CreateCompatibleDC (hdc);
    190             SelectObject (hdcBitmap, phdi->hbm);
    191             BitBlt (hdc, xD, yD, cx, cy, hdcBitmap, 0, yS, SRCCOPY);
    192             DeleteDC (hdcBitmap);
    193         }
    194 
    195         if (phdi->fmt & HDF_IMAGE)
     353          HEADER_DrawItemBitmap(hdc,infoPtr,phdi,&r,pszText,uTextJustify);
     354          if (r.left < r.right)
     355            HEADER_DrawItemText(hdc,infoPtr,phdi,&r,pszText,uTextJustify,bEraseTextBkgnd,bHotTrack);
     356        }
     357      } else
     358      {
     359        HEADER_DrawItemBitmap(hdc,infoPtr,phdi,&r,pszText,uTextJustify);
     360        if (r.left < r.right)
    196361        {
    197 
    198 
    199 /*          ImageList_Draw (infoPtr->himl, phdi->iImage,...); */
    200         }
    201 
    202         if ((phdi->fmt & HDF_STRING) && (phdi->pszText))
    203         {
    204             oldBkMode = SetBkMode(hdc, TRANSPARENT);
    205             r.left += 3;
    206             r.right -= 3;
    207             SetTextColor (hdc, bHotTrack ? COLOR_HIGHLIGHT : COLOR_BTNTEXT);
    208             if (bEraseTextBkgnd)
    209             {
    210               HBRUSH hbrBk = GetSysColorBrush(COLOR_3DFACE);
    211 
    212               FillRect(hdc,&r,hbrBk);
    213             }
    214             DrawTextExW(hdc,phdi->pszText,lstrlenW (phdi->pszText),
    215                   &r,uTextJustify|DT_VCENTER|DT_SINGLELINE|DT_END_ELLIPSIS,NULL);
    216             if (oldBkMode != TRANSPARENT)
    217                 SetBkMode(hdc, oldBkMode);
    218         }
     362          HEADER_DrawItemImage(hwnd,hdc,infoPtr,phdi,&r,iItem);
     363          if (r.left < r.right)
     364            HEADER_DrawItemText(hdc,infoPtr,phdi,&r,pszText,uTextJustify,bEraseTextBkgnd,bHotTrack);
     365        }
     366      }
     367      if (phdi->pszText == LPSTR_TEXTCALLBACKW) COMCTL32_Free(pszText);
    219368    }
    220369
     
    245394    for (i = 0; i < infoPtr->uNumItem; i++)
    246395    {
    247       x = HEADER_DrawItem(hwnd,hdc,i,FALSE,FALSE);
     396      x = HEADER_DrawItem(hwnd,hdc,i,infoPtr->iHotItem == i,FALSE);
    248397      if (x > rect.right)
    249398      {
     
    274423    hFont = infoPtr->hFont ? infoPtr->hFont : GetStockObject (SYSTEM_FONT);
    275424    hOldFont = SelectObject (hdc, hFont);
    276     HEADER_DrawItem(hwnd,hdc,iItem,FALSE,TRUE);
     425    HEADER_DrawItem(hwnd,hdc,iItem,infoPtr->iHotItem == iItem,TRUE);
    277426    SelectObject (hdc, hOldFont);
    278427}
     
    473622    INT  oldRop;
    474623
    475     GetClientRect (hwnd, &rect); //CB: Odin bug!!!
     624    GetClientRect (hwnd, &rect);
     625
     626    rect.left = x;
     627    rect.right = x+1;
     628    InvertRect(hdc,&rect);
     629/* //CB: Odin bug!!! This code doesn't work:
    476630    hOldPen = SelectObject (hdc, GetStockObject (BLACK_PEN));
    477631    oldRop = SetROP2 (hdc, R2_XORPEN);
     
    480634    SetROP2 (hdc, oldRop);
    481635    SelectObject (hdc, hOldPen);
    482 }
    483 
     636*/
     637}
    484638
    485639static BOOL
     
    546700HEADER_ClearFilter(HWND hwnd,WPARAM wParam,LPARAM lParam)
    547701{
     702  HEADER_INFO *infoPtr = HEADER_GetInfoPtr(hwnd);
     703
    548704  //CB:todo
     705  //HDN_FILTERCHANGE
    549706
    550707  return 0;
     
    552709
    553710static LRESULT
     711HEADER_EditFilter(HWND hwnd,WPARAM wParam,LPARAM lParam)
     712{
     713  HEADER_INFO *infoPtr = HEADER_GetInfoPtr(hwnd);
     714  INT iItem = (INT)wParam;
     715
     716  if ((iItem < 0) || (iItem >= (INT)infoPtr->uNumItem)) return 0;
     717
     718  //CB: todo
     719
     720  return iItem;
     721}
     722
     723static LRESULT
     724HEADER_SetFilterChangeTimeout(HWND hwnd,WPARAM wParam,LPARAM lParam)
     725{
     726  //CB: todo
     727
     728  return 0;
     729}
     730
     731static LRESULT
    554732HEADER_CreateDragImage (HWND hwnd, WPARAM wParam)
    555733{
    556 //    FIXME (header, "empty stub!\n");
    557     return 0;
    558 }
    559 
     734  HEADER_INFO *infoPtr = HEADER_GetInfoPtr(hwnd);
     735  INT iItem = (INT)wParam;
     736  HEADER_ITEM *phdi;
     737  HICON hicon;
     738  HIMAGELIST himl;
     739
     740  if (!infoPtr->himl || (iItem < 0) || (iItem >= (INT)infoPtr->uNumItem)) return 0;
     741  phdi = &infoPtr->items[iItem];
     742/*
     743  hicon = ImageList_GetIcon(infoPtr->himl,phdi->iImage,ILD_BLEND | ILD_TRANSPARENT);
     744  if (!hicon) return 0;
     745
     746  himl = ImageList_Create();
     747*/
     748  //CB: create and return new imagelist
     749
     750  return 0;
     751}
     752
     753static LRESULT
     754HEADER_SetHotDivider(HWND hwnd,WPARAM wParam,LPARAM lParam)
     755{
     756  //CB:todo
     757
     758  return 0;
     759}
    560760
    561761static LRESULT
     
    607807}
    608808
     809static LRESULT
     810HEADER_GetBitmapMargin(HWND hwnd,WPARAM wParam,LPARAM lParam)
     811{
     812  HEADER_INFO *infoPtr = HEADER_GetInfoPtr (hwnd);
     813
     814  return infoPtr->xBmpMargin;
     815}
     816
     817static LRESULT
     818HEADER_SetBitmapMargin(HWND hwnd,WPARAM wParam,LPARAM lParam)
     819{
     820  HEADER_INFO *infoPtr = HEADER_GetInfoPtr (hwnd);
     821  INT oldMargin = infoPtr->xBmpMargin;
     822
     823  if (infoPtr->xBmpMargin != (INT)wParam)
     824  {
     825    infoPtr->xBmpMargin = (INT)wParam;
     826    HEADER_Refresh(hwnd);
     827  }
     828
     829  return oldMargin;
     830}
    609831
    610832static LRESULT
    611833HEADER_GetImageList (HWND hwnd)
    612834{
    613     HEADER_INFO *infoPtr = HEADER_GetInfoPtr (hwnd);
    614 
    615     return (LRESULT)infoPtr->himl;
     835  HEADER_INFO *infoPtr = HEADER_GetInfoPtr (hwnd);
     836
     837  return (LRESULT)infoPtr->himl;
    616838}
    617839
     
    620842HEADER_GetItemA (HWND hwnd, WPARAM wParam, LPARAM lParam)
    621843{
    622     HEADER_INFO *infoPtr = HEADER_GetInfoPtr (hwnd);
     844    HEADER_INFO *infoPtr = HEADER_GetInfoPtr(hwnd);
    623845    HDITEMA   *phdi = (HDITEMA*)lParam;
    624846    INT       nItem = (INT)wParam;
    625847    HEADER_ITEM *lpItem;
    626848
    627     if (!phdi)
    628         return FALSE;
    629     if ((nItem < 0) || (nItem >= (INT)infoPtr->uNumItem))
    630         return FALSE;
     849    if (!phdi) return FALSE;
     850    if ((nItem < 0) || (nItem >= (INT)infoPtr->uNumItem)) return FALSE;
    631851
    632852//    TRACE (header, "[nItem=%d]\n", nItem);
    633853
    634     if (phdi->mask == 0)
    635         return TRUE;
     854    if (phdi->mask == 0) return TRUE;
    636855
    637856    lpItem = (HEADER_ITEM*)&infoPtr->items[nItem];
    638     if (phdi->mask & HDI_BITMAP)
    639         phdi->hbm = lpItem->hbm;
    640 
    641     if (phdi->mask & HDI_FORMAT)
    642         phdi->fmt = lpItem->fmt;
    643 
    644     if (phdi->mask & HDI_WIDTH)
    645         phdi->cxy = lpItem->cxy;
    646 
    647     if (phdi->mask & HDI_LPARAM)
    648         phdi->lParam = lpItem->lParam;
    649 
    650     if (phdi->mask & HDI_TEXT) {
    651         if (lpItem->pszText != LPSTR_TEXTCALLBACKW)
    652             lstrcpynWtoA (phdi->pszText, lpItem->pszText, phdi->cchTextMax);
     857
     858    if (phdi->mask & HDI_BITMAP) phdi->hbm = lpItem->hbm;
     859
     860    if (phdi->mask & HDI_FORMAT) phdi->fmt = lpItem->fmt;
     861
     862    if (phdi->mask & HDI_FILTER)
     863    {
     864      phdi->type = lpItem->type;
     865      phdi->pvFilter = lpItem->pvFilter;
     866    }
     867
     868    if (phdi->mask & (HDI_WIDTH | HDI_HEIGHT)) phdi->cxy = lpItem->cxy;
     869
     870    if (phdi->mask & HDI_IMAGE) phdi->iImage = lpItem->iImage;
     871
     872    if (phdi->mask & HDI_LPARAM) phdi->lParam = lpItem->lParam;
     873
     874    if (phdi->mask & HDI_ORDER) phdi->iOrder = lpItem->iOrder;
     875
     876    if (phdi->mask & HDI_TEXT)
     877    {
     878      if (lpItem->pszText != LPSTR_TEXTCALLBACKW)
     879      {
     880        if (lpItem->pszText)
     881          lstrcpynWtoA (phdi->pszText,lpItem->pszText,phdi->cchTextMax);
    653882        else
    654             phdi->pszText = LPSTR_TEXTCALLBACKA;
    655     }
    656 
    657     if (phdi->mask & HDI_IMAGE)
    658         phdi->iImage = lpItem->iImage;
    659 
    660     if (phdi->mask & HDI_ORDER)
    661         phdi->iOrder = lpItem->iOrder;
     883          phdi->pszText = NULL;
     884      } else phdi->pszText = LPSTR_TEXTCALLBACKA;
     885    }
    662886
    663887    return TRUE;
    664888}
    665889
    666 
    667890static LRESULT
    668891HEADER_GetItemW (HWND hwnd, WPARAM wParam, LPARAM lParam)
    669892{
    670     HEADER_INFO *infoPtr = HEADER_GetInfoPtr (hwnd);
     893    HEADER_INFO *infoPtr = HEADER_GetInfoPtr(hwnd);
    671894    HDITEMW   *phdi = (HDITEMW*)lParam;
    672895    INT       nItem = (INT)wParam;
    673896    HEADER_ITEM *lpItem;
    674897
    675     if (!phdi)
    676         return FALSE;
    677     if ((nItem < 0) || (nItem >= (INT)infoPtr->uNumItem))
    678         return FALSE;
     898    if (!phdi) return FALSE;
     899    if ((nItem < 0) || (nItem >= (INT)infoPtr->uNumItem)) return FALSE;
    679900
    680901//    TRACE (header, "[nItem=%d]\n", nItem);
    681902
    682     if (phdi->mask == 0)
    683         return TRUE;
     903    if (phdi->mask == 0) return TRUE;
    684904
    685905    lpItem = (HEADER_ITEM*)&infoPtr->items[nItem];
    686     if (phdi->mask & HDI_BITMAP)
    687         phdi->hbm = lpItem->hbm;
    688 
    689     if (phdi->mask & HDI_FORMAT)
    690         phdi->fmt = lpItem->fmt;
    691 
    692     if (phdi->mask & HDI_WIDTH)
    693         phdi->cxy = lpItem->cxy;
    694 
    695     if (phdi->mask & HDI_LPARAM)
    696         phdi->lParam = lpItem->lParam;
    697 
    698     if (phdi->mask & HDI_TEXT) {
    699         if (lpItem->pszText != LPSTR_TEXTCALLBACKW)
    700             lstrcpynW (phdi->pszText, lpItem->pszText, phdi->cchTextMax);
     906
     907    if (phdi->mask & HDI_BITMAP) phdi->hbm = lpItem->hbm;
     908
     909    if (phdi->mask & HDI_FORMAT) phdi->fmt = lpItem->fmt;
     910
     911    if (phdi->mask & HDI_FILTER)
     912    {
     913      phdi->type = lpItem->type;
     914      phdi->pvFilter = lpItem->pvFilter;
     915    }
     916
     917    if (phdi->mask & (HDI_WIDTH | HDI_HEIGHT)) phdi->cxy = lpItem->cxy;
     918
     919    if (phdi->mask & HDI_IMAGE) phdi->iImage = lpItem->iImage;
     920
     921    if (phdi->mask & HDI_LPARAM) phdi->lParam = lpItem->lParam;
     922
     923    if (phdi->mask & HDI_ORDER) phdi->iOrder = lpItem->iOrder;
     924
     925    if (phdi->mask & HDI_TEXT)
     926    {
     927      if (lpItem->pszText != LPSTR_TEXTCALLBACKW)
     928      {
     929        if (lpItem->pszText)
     930          lstrcpynW (phdi->pszText,lpItem->pszText,phdi->cchTextMax);
    701931        else
    702             phdi->pszText = LPSTR_TEXTCALLBACKW;
    703     }
    704 
    705     if (phdi->mask & HDI_IMAGE)
    706         phdi->iImage = lpItem->iImage;
    707 
    708     if (phdi->mask & HDI_ORDER)
    709         phdi->iOrder = lpItem->iOrder;
     932          phdi->pszText = NULL;
     933      } else phdi->pszText = LPSTR_TEXTCALLBACKW;
     934    }
    710935
    711936    return TRUE;
     
    717942{
    718943    HEADER_INFO *infoPtr = HEADER_GetInfoPtr (hwnd);
     944
    719945    return infoPtr->uNumItem;
    720946}
     
    728954    LPRECT lpRect = (LPRECT)lParam;
    729955
    730     if ((iItem < 0) || (iItem >= (INT)infoPtr->uNumItem))
    731         return FALSE;
     956    if (!lpRect || (iItem < 0) || (iItem >= (INT)infoPtr->uNumItem)) return FALSE;
    732957
    733958    lpRect->left   = infoPtr->items[iItem].rect.left;
     
    739964}
    740965
    741 
    742 /* << HEADER_GetOrderArray >> */
    743 
     966static LRESULT
     967HEADER_GetOrderArray(HWND hwnd,WPARAM wParam,LPARAM lParam)
     968{
     969  //CB: todo
     970
     971  return 0;
     972}
     973
     974static LRESULT
     975HEADER_SetOrderArray(HWND hwnd,WPARAM wParam,LPARAM lParam)
     976{
     977  //CB: todo
     978  HEADER_SetItemBounds(hwnd,0);
     979  HEADER_Refresh(hwnd);
     980
     981  return 0;
     982}
     983
     984static LRESULT
     985HEADER_OrderToIndex(HWND hwnd,WPARAM wParam,LPARAM lParam)
     986{
     987  //CB:todo
     988
     989  return 0;
     990}
    744991
    745992static LRESULT
    746993HEADER_GetUnicodeFormat (HWND hwnd)
    747994{
    748     HEADER_INFO *infoPtr = HEADER_GetInfoPtr (hwnd);
     995    HEADER_INFO *infoPtr = HEADER_GetInfoPtr(hwnd);
     996
    749997    return infoPtr->bUnicode;
    750998}
     
    7581006    HEADER_InternalHitTest (hwnd, &phti->pt, &phti->flags, &phti->iItem);
    7591007
    760     return phti->flags;
     1008    return phti->iItem;
    7611009}
    7621010
     
    7661014{
    7671015    HEADER_INFO *infoPtr = HEADER_GetInfoPtr (hwnd);
    768     HDITEMA   *phdi = (HDITEMA*)lParam;
    769     INT       nItem = (INT)wParam;
     1016    HDITEMA *phdi = (HDITEMA*)lParam;
     1017    INT nItem = (INT)wParam;
    7701018    HEADER_ITEM *lpItem;
    771     HDC       hdc;
    772     INT       len;
    773 
    774     if ((phdi == NULL) || (nItem < 0))
    775         return -1;
    776 
    777     if (nItem > infoPtr->uNumItem)
    778         nItem = infoPtr->uNumItem;
    779 
    780     if (infoPtr->uNumItem == 0) {
    781         infoPtr->items = COMCTL32_Alloc (sizeof (HEADER_ITEM));
    782         infoPtr->uNumItem++;
    783     }
    784     else {
    785         HEADER_ITEM *oldItems = infoPtr->items;
    786 
    787         infoPtr->uNumItem++;
    788         infoPtr->items = COMCTL32_Alloc (sizeof (HEADER_ITEM) * infoPtr->uNumItem);
    789         if (nItem == 0) {
    790             memcpy (&infoPtr->items[1], &oldItems[0],
    791                     (infoPtr->uNumItem-1) * sizeof(HEADER_ITEM));
    792         }
    793         else
    794         {
    795               /* pre insert copy */
    796             if (nItem > 0) {
    797                  memcpy (&infoPtr->items[0], &oldItems[0],
    798                          nItem * sizeof(HEADER_ITEM));
    799             }
    800 
    801             /* post insert copy */
    802             if (nItem < infoPtr->uNumItem - 1) {
    803                 memcpy (&infoPtr->items[nItem+1], &oldItems[nItem],
    804                         (infoPtr->uNumItem - nItem) * sizeof(HEADER_ITEM));
    805             }
    806         }
    807 
    808         COMCTL32_Free (oldItems);
     1019
     1020    if ((phdi == NULL) || (nItem < 0)) return -1;
     1021
     1022    if (nItem > infoPtr->uNumItem) nItem = infoPtr->uNumItem;
     1023
     1024    if (infoPtr->uNumItem == 0)
     1025    {
     1026      infoPtr->items = COMCTL32_Alloc(sizeof(HEADER_ITEM));
     1027      infoPtr->uNumItem++;
     1028    } else
     1029    {
     1030      HEADER_ITEM *oldItems = infoPtr->items;
     1031
     1032      infoPtr->uNumItem++;
     1033      infoPtr->items = COMCTL32_Alloc(sizeof(HEADER_ITEM)*infoPtr->uNumItem);
     1034      if (nItem == 0)
     1035        memcpy (&infoPtr->items[1],&oldItems[0],(infoPtr->uNumItem-1)*sizeof(HEADER_ITEM));
     1036      else
     1037      {
     1038        /* pre insert copy */
     1039        memcpy (&infoPtr->items[0],&oldItems[0],nItem*sizeof(HEADER_ITEM));
     1040
     1041        /* post insert copy */
     1042        if (nItem < infoPtr->uNumItem-1)
     1043          memcpy (&infoPtr->items[nItem+1],&oldItems[nItem],(infoPtr->uNumItem - nItem)*sizeof(HEADER_ITEM));
     1044      }
     1045
     1046      COMCTL32_Free (oldItems);
    8091047    }
    8101048
     
    8121050    lpItem->bDown = FALSE;
    8131051
    814     if (phdi->mask & HDI_WIDTH)
    815         lpItem->cxy = phdi->cxy;
    816 
    817     if (phdi->mask & HDI_TEXT) {
    818         if (!phdi->pszText) /* null pointer check */
    819             phdi->pszText = "";
    820         if (phdi->pszText != LPSTR_TEXTCALLBACKA) {
    821             len = lstrlenA (phdi->pszText);
    822             lpItem->pszText = COMCTL32_Alloc ((len+1)*sizeof(WCHAR));
    823             lstrcpyAtoW (lpItem->pszText, phdi->pszText);
    824         }
    825         else
    826             lpItem->pszText = LPSTR_TEXTCALLBACKW;
    827     }
    828 
    829     if (phdi->mask & HDI_FORMAT)
    830         lpItem->fmt = phdi->fmt;
    831 
    832     if (lpItem->fmt == 0)
    833         lpItem->fmt = HDF_LEFT;
    834 
    835     if (phdi->mask & HDI_BITMAP)
    836         lpItem->hbm = phdi->hbm;
    837 
    838     if (phdi->mask & HDI_LPARAM)
    839         lpItem->lParam = phdi->lParam;
    840 
    841     if (phdi->mask & HDI_IMAGE)
    842         lpItem->iImage = phdi->iImage;
    843 
    844     if (phdi->mask & HDI_ORDER)
    845         lpItem->iOrder = phdi->iOrder;
     1052    lpItem->cxy = (phdi->mask & HDI_WIDTH || phdi->mask & HDI_HEIGHT) ? phdi->cxy:0;
     1053
     1054    if (phdi->mask & HDI_TEXT)
     1055    {
     1056      if (!phdi->pszText) lpItem->pszText = NULL;
     1057      else if (phdi->pszText != LPSTR_TEXTCALLBACKA)
     1058      {
     1059        INT len;
     1060
     1061        len = lstrlenA(phdi->pszText);
     1062        if (len == 0) lpItem->pszText = NULL; else
     1063        {
     1064          lpItem->pszText = COMCTL32_Alloc((len+1)*sizeof(WCHAR));
     1065          lstrcpyAtoW(lpItem->pszText,phdi->pszText);
     1066        }
     1067      } else lpItem->pszText = LPSTR_TEXTCALLBACKW;
     1068      lpItem->cchTextMax = phdi->cchTextMax;
     1069    } else
     1070    {
     1071      lpItem->pszText = NULL;
     1072      lpItem->cchTextMax = 0;
     1073    }
     1074
     1075    lpItem->fmt = (phdi->mask & HDI_FORMAT) ? phdi->fmt:HDF_LEFT;
     1076    if (lpItem->fmt == 0) lpItem->fmt = HDF_LEFT;
     1077
     1078    lpItem->lParam = (phdi->mask & HDI_LPARAM) ? phdi->lParam:0;
     1079
     1080    lpItem->iImage = (phdi->mask & HDI_IMAGE) ? phdi->iImage:0;
     1081
     1082    lpItem->iOrder = (phdi->mask & HDI_ORDER) ? phdi->iOrder:HDF_LEFT;
     1083
     1084    lpItem->hbm = (phdi->mask & HDI_BITMAP) ? phdi->hbm:0;
     1085
     1086    if (phdi->mask & HDI_FILTER)
     1087    {
     1088      lpItem->type = phdi->type;
     1089      lpItem->pvFilter = phdi->pvFilter;
     1090    }
    8461091
    8471092    HEADER_SetItemBounds (hwnd,nItem);
    848 
    8491093    HEADER_Refresh(hwnd);
    8501094
     
    8521096}
    8531097
    854 
    8551098static LRESULT
    8561099HEADER_InsertItemW (HWND hwnd, WPARAM wParam, LPARAM lParam)
    8571100{
    8581101    HEADER_INFO *infoPtr = HEADER_GetInfoPtr (hwnd);
    859     HDITEMW   *phdi = (HDITEMW*)lParam;
    860     INT       nItem = (INT)wParam;
     1102    HDITEMW *phdi = (HDITEMW*)lParam;
     1103    INT nItem = (INT)wParam;
    8611104    HEADER_ITEM *lpItem;
    862     HDC       hdc;
    863     INT       len;
    864 
    865     if ((phdi == NULL) || (nItem < 0))
    866         return -1;
    867 
    868     if (nItem > infoPtr->uNumItem)
    869         nItem = infoPtr->uNumItem;
    870 
    871     if (infoPtr->uNumItem == 0) {
    872         infoPtr->items = COMCTL32_Alloc (sizeof (HEADER_ITEM));
    873         infoPtr->uNumItem++;
    874     }
    875     else {
    876         HEADER_ITEM *oldItems = infoPtr->items;
    877 
    878         infoPtr->uNumItem++;
    879         infoPtr->items = COMCTL32_Alloc (sizeof (HEADER_ITEM) * infoPtr->uNumItem);
     1105
     1106    if ((phdi == NULL) || (nItem < 0)) return -1;
     1107
     1108    if (nItem > infoPtr->uNumItem) nItem = infoPtr->uNumItem;
     1109
     1110    if (infoPtr->uNumItem == 0)
     1111    {
     1112      infoPtr->items = COMCTL32_Alloc(sizeof(HEADER_ITEM));
     1113      infoPtr->uNumItem++;
     1114    } else
     1115    {
     1116      HEADER_ITEM *oldItems = infoPtr->items;
     1117
     1118      infoPtr->uNumItem++;
     1119      infoPtr->items = COMCTL32_Alloc(sizeof(HEADER_ITEM)*infoPtr->uNumItem);
     1120      if (nItem == 0)
     1121        memcpy (&infoPtr->items[1],&oldItems[0],(infoPtr->uNumItem-1)*sizeof(HEADER_ITEM));
     1122      else
     1123      {
    8801124        /* pre insert copy */
    881         if (nItem > 0) {
    882             memcpy (&infoPtr->items[0], &oldItems[0],
    883                     nItem * sizeof(HEADER_ITEM));
    884         }
     1125        memcpy (&infoPtr->items[0],&oldItems[0],nItem*sizeof(HEADER_ITEM));
    8851126
    8861127        /* post insert copy */
    887         if (nItem < infoPtr->uNumItem - 1) {
    888             memcpy (&infoPtr->items[nItem+1], &oldItems[nItem],
    889                     (infoPtr->uNumItem - nItem) * sizeof(HEADER_ITEM));
    890         }
    891 
    892         COMCTL32_Free (oldItems);
     1128        if (nItem < infoPtr->uNumItem-1)
     1129          memcpy (&infoPtr->items[nItem+1],&oldItems[nItem],(infoPtr->uNumItem - nItem)*sizeof(HEADER_ITEM));
     1130      }
     1131
     1132      COMCTL32_Free (oldItems);
    8931133    }
    8941134
     
    8961136    lpItem->bDown = FALSE;
    8971137
    898     if (phdi->mask & HDI_WIDTH)
    899         lpItem->cxy = phdi->cxy;
    900 
    901     if (phdi->mask & HDI_TEXT) {
    902         WCHAR wide_null_char = 0;
    903         if (!phdi->pszText) /* null pointer check */
    904             phdi->pszText = &wide_null_char;
    905         if (phdi->pszText != LPSTR_TEXTCALLBACKW) {
    906             len = lstrlenW (phdi->pszText);
    907             lpItem->pszText = COMCTL32_Alloc ((len+1)*sizeof(WCHAR));
    908             lstrcpyW (lpItem->pszText, phdi->pszText);
    909         }
    910         else
    911             lpItem->pszText = LPSTR_TEXTCALLBACKW;
    912     }
    913 
    914     if (phdi->mask & HDI_FORMAT)
    915         lpItem->fmt = phdi->fmt;
    916 
    917     if (lpItem->fmt == 0)
    918         lpItem->fmt = HDF_LEFT;
    919 
    920     if (phdi->mask & HDI_BITMAP)
    921         lpItem->hbm = phdi->hbm;
    922 
    923     if (phdi->mask & HDI_LPARAM)
    924         lpItem->lParam = phdi->lParam;
    925 
    926     if (phdi->mask & HDI_IMAGE)
    927         lpItem->iImage = phdi->iImage;
    928 
    929     if (phdi->mask & HDI_ORDER)
    930         lpItem->iOrder = phdi->iOrder;
     1138    lpItem->cxy = (phdi->mask & HDI_WIDTH || phdi->mask & HDI_HEIGHT) ? phdi->cxy:0;
     1139
     1140    if (phdi->mask & HDI_TEXT)
     1141    {
     1142      if (!phdi->pszText) lpItem->pszText = NULL;
     1143      else if (phdi->pszText != LPSTR_TEXTCALLBACKW)
     1144      {
     1145        INT len;
     1146
     1147        len = lstrlenW(phdi->pszText);
     1148        if (len == 0) lpItem->pszText = NULL; else
     1149        {
     1150          lpItem->pszText = COMCTL32_Alloc((len+1)*sizeof(WCHAR));
     1151          lstrcpyW(lpItem->pszText,phdi->pszText);
     1152        }
     1153      } else lpItem->pszText = LPSTR_TEXTCALLBACKW;
     1154      lpItem->cchTextMax = phdi->cchTextMax;
     1155    } else
     1156    {
     1157      lpItem->pszText = NULL;
     1158      lpItem->cchTextMax = 0;
     1159    }
     1160
     1161    lpItem->fmt = (phdi->mask & HDI_FORMAT) ? phdi->fmt:HDF_LEFT;
     1162    if (lpItem->fmt == 0) lpItem->fmt = HDF_LEFT;
     1163
     1164    lpItem->lParam = (phdi->mask & HDI_LPARAM) ? phdi->lParam:0;
     1165
     1166    lpItem->iImage = (phdi->mask & HDI_IMAGE) ? phdi->iImage:0;
     1167
     1168    lpItem->iOrder = (phdi->mask & HDI_ORDER) ? phdi->iOrder:HDF_LEFT;
     1169
     1170    lpItem->hbm = (phdi->mask & HDI_BITMAP) ? phdi->hbm:0;
     1171
     1172    if (phdi->mask & HDI_FILTER)
     1173    {
     1174      lpItem->type = phdi->type;
     1175      lpItem->pvFilter = phdi->pvFilter;
     1176    }
    9311177
    9321178    HEADER_SetItemBounds (hwnd,nItem);
    933 
    9341179    HEADER_Refresh(hwnd);
    9351180
     
    9801225    infoPtr->himl = (HIMAGELIST)lParam;
    9811226
    982     /* FIXME: Refresh needed??? */
     1227    HEADER_Refresh(hwnd);
    9831228
    9841229    return (LRESULT)himlOld;
     
    9951240    HDC hdc;
    9961241
    997     if (phdi == NULL)
    998         return FALSE;
    999     if ((nItem < 0) || (nItem >= (INT)infoPtr->uNumItem))
    1000         return FALSE;
     1242    if (phdi == NULL) return FALSE;
     1243    if ((nItem < 0) || (nItem >= (INT)infoPtr->uNumItem)) return FALSE;
     1244    if (phdi->mask == 0) return TRUE;
    10011245
    10021246//    TRACE (header, "[nItem=%d]\n", nItem);
    10031247
    1004     if (HEADER_SendHeaderNotify (hwnd, HDN_ITEMCHANGINGA, nItem))
    1005         return FALSE;
     1248    if (HEADER_SendHeaderNotify(hwnd,HDN_ITEMCHANGINGA,nItem)) return FALSE;
    10061249
    10071250    lpItem = (HEADER_ITEM*)&infoPtr->items[nItem];
    1008     if (phdi->mask & HDI_BITMAP)
    1009         lpItem->hbm = phdi->hbm;
    1010 
    1011     if (phdi->mask & HDI_FORMAT)
    1012         lpItem->fmt = phdi->fmt;
    1013 
    1014     if (phdi->mask & HDI_LPARAM)
    1015         lpItem->lParam = phdi->lParam;
    1016 
    1017     if (phdi->mask & HDI_TEXT) {
    1018         if (phdi->pszText != LPSTR_TEXTCALLBACKA) {
    1019             if (lpItem->pszText) {
    1020                 COMCTL32_Free (lpItem->pszText);
    1021                 lpItem->pszText = NULL;
    1022             }
    1023             if (phdi->pszText) {
    1024                 INT len = lstrlenA (phdi->pszText);
    1025                 lpItem->pszText = COMCTL32_Alloc ((len+1)*sizeof(WCHAR));
    1026                 lstrcpyAtoW (lpItem->pszText, phdi->pszText);
    1027             }
    1028         }
    1029         else
    1030             lpItem->pszText = LPSTR_TEXTCALLBACKW;
    1031     }
    1032 
    1033     if (phdi->mask & HDI_WIDTH)
    1034         lpItem->cxy = phdi->cxy;
    1035 
    1036     if (phdi->mask & HDI_IMAGE)
    1037         lpItem->iImage = phdi->iImage;
    1038 
    1039     if (phdi->mask & HDI_ORDER)
    1040         lpItem->iOrder = phdi->iOrder;
    1041 
    1042     HEADER_SendHeaderNotify (hwnd, HDN_ITEMCHANGEDA, nItem);
    1043 
    1044     HEADER_SetItemBounds (hwnd,0);
     1251
     1252    if (phdi->mask & HDI_BITMAP) lpItem->hbm = phdi->hbm;
     1253
     1254    if (phdi->mask & HDI_FORMAT) lpItem->fmt = phdi->fmt;
     1255
     1256    if (phdi->mask & HDI_FILTER)
     1257    {
     1258      lpItem->type = lpItem->type;
     1259      lpItem->pvFilter = lpItem->pvFilter;
     1260    }
     1261
     1262    if (phdi->mask & (HDI_WIDTH | HDI_WIDTH)) lpItem->cxy = phdi->cxy;
     1263
     1264    if (phdi->mask & HDI_IMAGE) lpItem->iImage = phdi->iImage;
     1265
     1266    if (phdi->mask & HDI_LPARAM) lpItem->lParam = phdi->lParam;
     1267
     1268    if (phdi->mask & HDI_ORDER) lpItem->iOrder = phdi->iOrder;
     1269
     1270    if (phdi->mask & HDI_TEXT)
     1271    {
     1272      if (phdi->pszText != LPSTR_TEXTCALLBACKA)
     1273      {
     1274        if (lpItem->pszText)
     1275        {
     1276          COMCTL32_Free (lpItem->pszText);
     1277          lpItem->pszText = NULL;
     1278        }
     1279        if (phdi->pszText)
     1280        {
     1281          INT len = lstrlenA (phdi->pszText);
     1282
     1283          if (len)
     1284          {
     1285            lpItem->pszText = COMCTL32_Alloc((len+1)*sizeof(WCHAR));
     1286            lstrcpyAtoW(lpItem->pszText,phdi->pszText);
     1287          }
     1288        }
     1289      } else
     1290      {
     1291        if (lpItem->pszText != LPSTR_TEXTCALLBACKW) COMCTL32_Free(lpItem->pszText);
     1292        lpItem->pszText = LPSTR_TEXTCALLBACKW;
     1293      }
     1294    }
     1295
     1296    HEADER_SendHeaderNotify(hwnd,HDN_ITEMCHANGEDA,nItem);
     1297
     1298    HEADER_SetItemBounds(hwnd,0);
    10451299    HEADER_Refresh(hwnd);
    10461300
     
    10581312    HDC hdc;
    10591313
    1060     if (phdi == NULL)
    1061         return FALSE;
    1062     if ((nItem < 0) || (nItem >= (INT)infoPtr->uNumItem))
    1063         return FALSE;
     1314    if (phdi == NULL) return FALSE;
     1315    if ((nItem < 0) || (nItem >= (INT)infoPtr->uNumItem)) return FALSE;
     1316    if (phdi->mask == 0) return TRUE;
    10641317
    10651318//    TRACE (header, "[nItem=%d]\n", nItem);
    10661319
    1067     if (HEADER_SendHeaderNotify (hwnd, HDN_ITEMCHANGINGA, nItem))
    1068         return FALSE;
     1320    if (HEADER_SendHeaderNotify(hwnd,HDN_ITEMCHANGINGW,nItem)) return FALSE;
    10691321
    10701322    lpItem = (HEADER_ITEM*)&infoPtr->items[nItem];
    1071     if (phdi->mask & HDI_BITMAP)
    1072         lpItem->hbm = phdi->hbm;
    1073 
    1074     if (phdi->mask & HDI_FORMAT)
    1075         lpItem->fmt = phdi->fmt;
    1076 
    1077     if (phdi->mask & HDI_LPARAM)
    1078         lpItem->lParam = phdi->lParam;
    1079 
    1080     if (phdi->mask & HDI_TEXT) {
    1081         if (phdi->pszText != LPSTR_TEXTCALLBACKW) {
    1082             if (lpItem->pszText) {
    1083                 COMCTL32_Free (lpItem->pszText);
    1084                 lpItem->pszText = NULL;
    1085             }
    1086             if (phdi->pszText) {
    1087                 INT len = lstrlenW (phdi->pszText);
    1088                 lpItem->pszText = COMCTL32_Alloc ((len+1)*sizeof(WCHAR));
    1089                 lstrcpyW (lpItem->pszText, phdi->pszText);
    1090             }
    1091         }
    1092         else
    1093             lpItem->pszText = LPSTR_TEXTCALLBACKW;
    1094     }
    1095 
    1096     if (phdi->mask & HDI_WIDTH)
    1097         lpItem->cxy = phdi->cxy;
    1098 
    1099     if (phdi->mask & HDI_IMAGE)
    1100         lpItem->iImage = phdi->iImage;
    1101 
    1102     if (phdi->mask & HDI_ORDER)
    1103         lpItem->iOrder = phdi->iOrder;
    1104 
    1105     HEADER_SendHeaderNotify (hwnd, HDN_ITEMCHANGEDA, nItem);
    1106 
    1107     HEADER_SetItemBounds (hwnd,0);
     1323
     1324    if (phdi->mask & HDI_BITMAP) lpItem->hbm = phdi->hbm;
     1325
     1326    if (phdi->mask & HDI_FORMAT) lpItem->fmt = phdi->fmt;
     1327
     1328    if (phdi->mask & HDI_FILTER)
     1329    {
     1330      lpItem->type = lpItem->type;
     1331      lpItem->pvFilter = lpItem->pvFilter;
     1332    }
     1333
     1334    if (phdi->mask & (HDI_WIDTH | HDI_WIDTH)) lpItem->cxy = phdi->cxy;
     1335
     1336    if (phdi->mask & HDI_IMAGE) lpItem->iImage = phdi->iImage;
     1337
     1338    if (phdi->mask & HDI_LPARAM) lpItem->lParam = phdi->lParam;
     1339
     1340    if (phdi->mask & HDI_ORDER) lpItem->iOrder = phdi->iOrder;
     1341
     1342    if (phdi->mask & HDI_TEXT)
     1343    {
     1344      if (phdi->pszText != LPSTR_TEXTCALLBACKW)
     1345      {
     1346        if (lpItem->pszText)
     1347        {
     1348          COMCTL32_Free(lpItem->pszText);
     1349          lpItem->pszText = NULL;
     1350        }
     1351        if (phdi->pszText)
     1352        {
     1353          INT len = lstrlenW(phdi->pszText);
     1354
     1355          if (len)
     1356          {
     1357            lpItem->pszText = COMCTL32_Alloc((len+1)*sizeof(WCHAR));
     1358            lstrcpyW(lpItem->pszText,phdi->pszText);
     1359          }
     1360        }
     1361      } else
     1362      {
     1363        if (lpItem->pszText != LPSTR_TEXTCALLBACKW) COMCTL32_Free(lpItem->pszText);
     1364        lpItem->pszText = LPSTR_TEXTCALLBACKW;
     1365      }
     1366    }
     1367
     1368    HEADER_SendHeaderNotify(hwnd,HDN_ITEMCHANGEDW,nItem);
     1369
     1370    HEADER_SetItemBounds(hwnd,0);
    11081371    HEADER_Refresh(hwnd);
    11091372
     
    11111374}
    11121375
    1113 
    1114 /* << HEADER_SetOrderArray >> */
    1115 
    1116 
    11171376static LRESULT
    11181377HEADER_SetUnicodeFormat (HWND hwnd, WPARAM wParam)
    11191378{
    1120     HEADER_INFO *infoPtr = HEADER_GetInfoPtr (hwnd);
     1379    HEADER_INFO *infoPtr = HEADER_GetInfoPtr(hwnd);
    11211380    BOOL bTemp = infoPtr->bUnicode;
    11221381
     
    11491408    infoPtr->himl = 0;
    11501409    infoPtr->iHotItem = -1;
     1410    infoPtr->xBmpMargin = 3*GetSystemMetrics(SM_CXEDGE);
    11511411    infoPtr->bUnicode = IsWindowUnicode (hwnd);
    11521412
     
    13811641
    13821642          infoPtr->iHotItem = newItem;
    1383           hdc = GetDC (hwnd);
    1384           if (oldItem != -1) HEADER_DrawItem(hwnd,hdc,oldItem,FALSE,TRUE);
    1385           if (newItem != -1) HEADER_DrawItem(hwnd,hdc,newItem,TRUE,TRUE);
    1386           ReleaseDC (hwnd, hdc);
     1643          HEADER_Refresh(hwnd);
    13871644        }
    13881645    }
     
    14071664            }
    14081665//          TRACE (header, "Moving pressed item %d!\n", infoPtr->iMoveItem);
    1409         }
    1410         else if (infoPtr->bTracking) {
    1411             if (dwStyle & HDS_FULLDRAG) {
     1666        } else if (infoPtr->bTracking)
     1667        {
     1668          if (dwStyle & HDS_FULLDRAG)
     1669          {
    14121670                if (HEADER_SendHeaderNotify (hwnd, HDN_ITEMCHANGINGA, infoPtr->iMoveItem))
    14131671                    infoPtr->items[infoPtr->iMoveItem].cxy = infoPtr->nOldWidth;
     
    14401698    }
    14411699
    1442     if ((dwStyle & HDS_BUTTONS) && (dwStyle & HDS_HOTTRACK)) {
    1443 //      FIXME (header, "hot track support!\n");
    1444     }
    1445 
    14461700    return 0;
    14471701}
     
    15291783    switch (msg)
    15301784    {
    1531 //        case HDM_CLEARFILTER:  //CB:add const
    1532 //            return HEADER_ClearFilter(hwnd,wParam,lParam);
     1785        case HDM_CLEARFILTER:
     1786            return HEADER_ClearFilter(hwnd,wParam,lParam);
    15331787
    15341788        case HDM_CREATEDRAGIMAGE:
     
    15381792            return HEADER_DeleteItem (hwnd, wParam);
    15391793
     1794        case HDM_EDITFILTER:
     1795            return HEADER_EditFilter(hwnd,wParam,lParam);
     1796
     1797        case HDM_GETBITMAPMARGIN:
     1798            return HEADER_GetBitmapMargin(hwnd,wParam,lParam);
     1799
    15401800        case HDM_GETIMAGELIST:
    15411801            return HEADER_GetImageList (hwnd);
     
    15531813            return HEADER_GetItemRect (hwnd, wParam, lParam);
    15541814
    1555 /*      case HDM_GETORDERARRAY: */
     1815        case HDM_GETORDERARRAY:
     1816            return HEADER_GetOrderArray(hwnd,wParam,lParam);
    15561817
    15571818        case HDM_GETUNICODEFORMAT:
     
    15701831            return HEADER_Layout (hwnd, wParam, lParam);
    15711832
     1833        case HDM_ORDERTOINDEX:
     1834            return HEADER_OrderToIndex(hwnd,wParam,lParam);
     1835
     1836        case HDM_SETBITMAPMARGIN:
     1837            return HEADER_SetBitmapMargin(hwnd,wParam,lParam);
     1838
     1839        case HDM_SETFILTERCHANGETIMEOUT:
     1840            return HEADER_SetFilterChangeTimeout(hwnd,wParam,lParam);
     1841
     1842        case HDM_SETHOTDIVIDER:
     1843            return HEADER_SetHotDivider(hwnd,wParam,lParam);
     1844
    15721845        case HDM_SETIMAGELIST:
    15731846            return HEADER_SetImageList (hwnd, wParam, lParam);
     
    15791852            return HEADER_SetItemW (hwnd, wParam, lParam);
    15801853
    1581 /*      case HDM_SETORDERARRAY: */
     1854        case HDM_SETORDERARRAY:
     1855            return HEADER_SetOrderArray(hwnd,wParam,lParam);
    15821856
    15831857        case HDM_SETUNICODEFORMAT:
Note: See TracChangeset for help on using the changeset viewer.