Ignore:
Timestamp:
Oct 6, 1999, 5:41:11 PM (26 years ago)
Author:
cbratschi
Message:

* empty log message *

File:
1 edited

Legend:

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

    r1141 r1156  
    1 /* $Id: header.c,v 1.14 1999-10-05 16:54:24 cbratschi Exp $ */
     1/* $Id: header.c,v 1.15 1999-10-06 15:41:10 cbratschi Exp $ */
    22/*
    33 *  Header control
     
    1010 *   - Order list support.
    1111 *   - Control specific cursors (over dividers).
    12  *   - Hottrack support (partially).
    1312 *   - Custom draw support (including Notifications).
    1413 *   - Drag and Drop support (including Notifications).
     14 *   - HDS_FILTERBAR
    1515 *
    1616 *
     
    2727
    2828
    29 #define __HDM_LAYOUT_HACK__
    30 
    31 
    3229#define VERT_BORDER     4
    3330#define DIVIDER_WIDTH  10
     
    3532#define ITEM_FRAMESIZE 2
    3633#define TEXT_MARGIN    3
     34#define TIMER_ID       1
     35#define TIMER_MS       200
    3736
    3837#define HEADER_GetInfoPtr(hwnd) ((HEADER_INFO *)GetWindowLongA(hwnd,0))
     
    368367}
    369368
     369static void
     370HEADER_DrawTrackLine (HWND hwnd, HDC hdc, INT x)
     371{
     372    RECT rect;
     373    HPEN hOldPen;
     374    INT  oldRop;
     375
     376    GetClientRect (hwnd, &rect);
     377
     378    rect.left = x;
     379    rect.right = x+1;
     380    InvertRect(hdc,&rect);
     381/* //CB: Odin bug!!! This code doesn't work:
     382    hOldPen = SelectObject (hdc, GetStockObject (BLACK_PEN));
     383    oldRop = SetROP2 (hdc, R2_XORPEN);
     384    MoveToEx (hdc, x, rect.top, NULL);
     385    LineTo (hdc, x, rect.bottom);
     386    SetROP2 (hdc, oldRop);
     387    SelectObject (hdc, hOldPen);
     388*/
     389}
    370390
    371391static void
     
    373393{
    374394    HEADER_INFO *infoPtr = HEADER_GetInfoPtr (hwnd);
     395    DWORD dwStyle = GetWindowLongA(hwnd,GWL_STYLE);
    375396    HFONT hFont, hOldFont;
    376397    RECT rect;
     
    402423    {
    403424        rect.left = x;
    404         if (GetWindowLongA (hwnd, GWL_STYLE) & HDS_BUTTONS)
     425        if (dwStyle & HDS_BUTTONS)
    405426            DrawEdge (hdc, &rect, EDGE_RAISED, BF_TOP|BF_LEFT|BF_BOTTOM|BF_SOFT);
    406427        else
     
    409430
    410431    SelectObject (hdc, hOldFont);
     432
     433    if (infoPtr->bCaptured && infoPtr->bTracking && !(dwStyle & HDS_FULLDRAG)) HEADER_DrawTrackLine(hwnd,hdc,infoPtr->xOldTrack);
    411434}
    412435
     
    467490  }
    468491}
    469 
    470 
    471 static void
    472 HEADER_ForceItemBounds (HWND hwnd, INT cy)
    473 {
    474     HEADER_INFO *infoPtr = HEADER_GetInfoPtr (hwnd);
    475     HEADER_ITEM *phdi;
    476     int i, x;
    477 
    478     if (infoPtr->uNumItem == 0)
    479         return;
    480 
    481     x = 0;
    482     for (i = 0; i < infoPtr->uNumItem; i++) {
    483         phdi = &infoPtr->items[i];
    484         phdi->rect.top = 0;
    485         phdi->rect.bottom = cy;
    486         phdi->rect.left = x;
    487         phdi->rect.right = phdi->rect.left + phdi->cxy;
    488         x = phdi->rect.right;
    489     }
    490 }
    491 
    492492
    493493static void
     
    627627}
    628628
    629 
    630 static void
    631 HEADER_DrawTrackLine (HWND hwnd, HDC hdc, INT x)
    632 {
    633     RECT rect;
    634     HPEN hOldPen;
    635     INT  oldRop;
    636 
    637     GetClientRect (hwnd, &rect);
    638 
    639     rect.left = x;
    640     rect.right = x+1;
    641     InvertRect(hdc,&rect);
    642 /* //CB: Odin bug!!! This code doesn't work:
    643     hOldPen = SelectObject (hdc, GetStockObject (BLACK_PEN));
    644     oldRop = SetROP2 (hdc, R2_XORPEN);
    645     MoveToEx (hdc, x, rect.top, NULL);
    646     LineTo (hdc, x, rect.bottom);
    647     SetROP2 (hdc, oldRop);
    648     SelectObject (hdc, hOldPen);
    649 */
    650 }
    651 
    652629static BOOL
    653630HEADER_SendSimpleNotify (HWND hwnd, UINT code)
     
    663640}
    664641
    665 
    666642static BOOL
    667 HEADER_SendHeaderNotify (HWND hwnd, UINT code, INT iItem)
    668 {
    669     HEADER_INFO *infoPtr = HEADER_GetInfoPtr (hwnd);
     643HEADER_SendHeaderNotifyA(HWND hwnd,UINT code,INT iItem,INT iButton)
     644{
     645    HEADER_INFO *infoPtr = HEADER_GetInfoPtr(hwnd);
    670646    NMHEADERA nmhdr;
    671647    HDITEMA nmitem;
     648    char* text;
     649    BOOL res;
     650
     651    if (infoPtr->items[iItem].pszText)
     652    {
     653      INT len = lstrlenW(infoPtr->items[iItem].pszText);
     654
     655      if (len > 0)
     656      {
     657        text = COMCTL32_Alloc(len+1);
     658        lstrcpyWtoA(text,infoPtr->items[iItem].pszText);
     659      } else text = NULL;
     660    } else text = NULL;
    672661
    673662    nmhdr.hdr.hwndFrom = hwnd;
    674     nmhdr.hdr.idFrom   = GetWindowLongA (hwnd, GWL_ID);
     663    nmhdr.hdr.idFrom   = GetWindowLongA(hwnd,GWL_ID);
    675664    nmhdr.hdr.code = code;
    676     nmhdr.iItem = iItem;
     665    nmhdr.iItem   = iItem;
    677666    nmhdr.iButton = 0;
    678     nmhdr.pitem = &nmitem;
    679     nmitem.mask = 0;
    680     nmitem.cxy = infoPtr->items[iItem].cxy;
    681     nmitem.hbm = infoPtr->items[iItem].hbm;
    682     nmitem.pszText = NULL;
    683     nmitem.cchTextMax = 0;
    684 /*    nmitem.pszText = infoPtr->items[iItem].pszText; */
    685 /*    nmitem.cchTextMax = infoPtr->items[iItem].cchTextMax; */
    686     nmitem.fmt = infoPtr->items[iItem].fmt;
    687     nmitem.lParam = infoPtr->items[iItem].lParam;
    688     nmitem.iOrder = infoPtr->items[iItem].iOrder;
    689     nmitem.iImage = infoPtr->items[iItem].iImage;
    690 
    691     return (BOOL)SendMessageA (GetParent (hwnd), WM_NOTIFY,
    692                                (WPARAM)nmhdr.hdr.idFrom, (LPARAM)&nmhdr);
    693 }
    694 
     667    nmhdr.pitem   = &nmitem;
     668
     669    nmitem.mask       = 0;
     670    nmitem.cxy        = infoPtr->items[iItem].cxy;
     671    nmitem.hbm        = infoPtr->items[iItem].hbm;
     672    nmitem.pszText    = text;
     673    nmitem.cchTextMax = infoPtr->items[iItem].cchTextMax;
     674    nmitem.fmt        = infoPtr->items[iItem].fmt;
     675    nmitem.lParam     = infoPtr->items[iItem].lParam;
     676    nmitem.iImage     = infoPtr->items[iItem].iImage;
     677    nmitem.iOrder     = infoPtr->items[iItem].iOrder;
     678    nmitem.type       = infoPtr->items[iItem].type;
     679    nmitem.pvFilter   = infoPtr->items[iItem].pvFilter;
     680
     681    res = (BOOL)SendMessageA(GetParent(hwnd),WM_NOTIFY,(WPARAM)nmhdr.hdr.idFrom,(LPARAM)&nmhdr);
     682
     683    if (text) COMCTL32_Free(text);
     684
     685    return res;
     686}
    695687
    696688static BOOL
    697 HEADER_SendClickNotify (HWND hwnd, UINT code, INT iItem)
     689HEADER_SendHeaderNotifyW(HWND hwnd,UINT code,INT iItem,INT iButton)
     690{
     691    HEADER_INFO *infoPtr = HEADER_GetInfoPtr(hwnd);
     692    NMHEADERW nmhdr;
     693    HDITEMW nmitem;
     694
     695    nmhdr.hdr.hwndFrom = hwnd;
     696    nmhdr.hdr.idFrom   = GetWindowLongW(hwnd,GWL_ID);
     697    nmhdr.hdr.code = code;
     698    nmhdr.iItem   = iItem;
     699    nmhdr.iButton = 0;
     700    nmhdr.pitem   = &nmitem;
     701
     702    nmitem.mask       = 0;
     703    nmitem.cxy        = infoPtr->items[iItem].cxy;
     704    nmitem.hbm        = infoPtr->items[iItem].hbm;
     705    nmitem.pszText    = infoPtr->items[iItem].pszText;
     706    nmitem.cchTextMax = infoPtr->items[iItem].cchTextMax;
     707    nmitem.fmt        = infoPtr->items[iItem].fmt;
     708    nmitem.lParam     = infoPtr->items[iItem].lParam;
     709    nmitem.iImage     = infoPtr->items[iItem].iImage;
     710    nmitem.iOrder     = infoPtr->items[iItem].iOrder;
     711    nmitem.type       = infoPtr->items[iItem].type;
     712    nmitem.pvFilter   = infoPtr->items[iItem].pvFilter;
     713
     714    return (BOOL)SendMessageW(GetParent(hwnd),WM_NOTIFY,(WPARAM)nmhdr.hdr.idFrom,(LPARAM)&nmhdr);
     715}
     716
     717static BOOL
     718HEADER_SendItemChanging(HWND hwnd,INT iItem)
     719{
     720  if (IsWindowUnicode(GetParent(hwnd)))
     721    return HEADER_SendHeaderNotifyA(hwnd,HDN_ITEMCHANGINGA,iItem,0);
     722  else
     723    return HEADER_SendHeaderNotifyW(hwnd,HDN_ITEMCHANGINGW,iItem,0);
     724}
     725
     726static BOOL
     727HEADER_SendItemChanged(HWND hwnd,INT iItem)
     728{
     729  if (IsWindowUnicode(GetParent(hwnd)))
     730    return HEADER_SendHeaderNotifyA(hwnd,HDN_ITEMCHANGEDA,iItem,0);
     731  else
     732    return HEADER_SendHeaderNotifyW(hwnd,HDN_ITEMCHANGEDW,iItem,0);
     733}
     734
     735static BOOL
     736HEADER_SendItemDblClick(HWND hwnd,INT iItem,INT iButton)
     737{
     738  if (IsWindowUnicode(GetParent(hwnd)))
     739    return HEADER_SendHeaderNotifyA(hwnd,HDN_ITEMDBLCLICKA,iItem,iButton);
     740  else
     741    return HEADER_SendHeaderNotifyW(hwnd,HDN_ITEMDBLCLICKW,iItem,iButton);
     742}
     743
     744static BOOL
     745HEADER_SendDividerDblClick(HWND hwnd,INT iItem,INT iButton)
     746{
     747  if (IsWindowUnicode(GetParent(hwnd)))
     748    return HEADER_SendHeaderNotifyA(hwnd,HDN_DIVIDERDBLCLICKA,iItem,iButton);
     749  else
     750    return HEADER_SendHeaderNotifyW(hwnd,HDN_DIVIDERDBLCLICKW,iItem,iButton);
     751}
     752
     753static BOOL
     754HEADER_SendBeginTrack(HWND hwnd,INT iItem,INT iButton)
     755{
     756  if (IsWindowUnicode(GetParent(hwnd)))
     757    return HEADER_SendHeaderNotifyA(hwnd,HDN_BEGINTRACKA,iItem,iButton);
     758  else
     759    return HEADER_SendHeaderNotifyW(hwnd,HDN_BEGINTRACKW,iItem,iButton);
     760}
     761
     762static BOOL
     763HEADER_SendEndTrack(HWND hwnd,INT iItem,INT iButton)
     764{
     765  if (IsWindowUnicode(GetParent(hwnd)))
     766    return HEADER_SendHeaderNotifyA(hwnd,HDN_ENDTRACKA,iItem,iButton);
     767  else
     768    return HEADER_SendHeaderNotifyW(hwnd,HDN_ENDTRACKW,iItem,iButton);
     769}
     770
     771static BOOL
     772HEADER_SendTrack(HWND hwnd,INT iItem)
     773{
     774  if (IsWindowUnicode(GetParent(hwnd)))
     775    return HEADER_SendHeaderNotifyA(hwnd,HDN_TRACKA,iItem,0);
     776  else
     777    return HEADER_SendHeaderNotifyW(hwnd,HDN_TRACKW,iItem,0);
     778}
     779
     780static BOOL
     781HEADER_SendClickNotifyA(HWND hwnd,UINT code,INT iItem,INT iButton)
    698782{
    699783    NMHEADERA nmhdr;
    700784
    701785    nmhdr.hdr.hwndFrom = hwnd;
    702     nmhdr.hdr.idFrom   = GetWindowLongA (hwnd, GWL_ID);
    703     nmhdr.hdr.code = code;
    704     nmhdr.iItem = iItem;
    705     nmhdr.iButton = 0;
    706     nmhdr.pitem = NULL;
    707 
    708     return (BOOL)SendMessageA (GetParent (hwnd), WM_NOTIFY,
    709                                (WPARAM)nmhdr.hdr.idFrom, (LPARAM)&nmhdr);
     786    nmhdr.hdr.idFrom   = GetWindowLongA(hwnd,GWL_ID);
     787    nmhdr.hdr.code     = code;
     788    nmhdr.iItem        = iItem;
     789    nmhdr.iButton      = iButton;
     790    nmhdr.pitem        = NULL;
     791
     792    return (BOOL)SendMessageA(GetParent(hwnd),WM_NOTIFY,(WPARAM)nmhdr.hdr.idFrom,(LPARAM)&nmhdr);
     793}
     794
     795static BOOL
     796HEADER_SendClickNotifyW(HWND hwnd,UINT code,INT iItem,INT iButton)
     797{
     798    NMHEADERW nmhdr;
     799
     800    nmhdr.hdr.hwndFrom = hwnd;
     801    nmhdr.hdr.idFrom   = GetWindowLongW(hwnd,GWL_ID);
     802    nmhdr.hdr.code     = code;
     803    nmhdr.iItem        = iItem;
     804    nmhdr.iButton      = iButton;
     805    nmhdr.pitem        = NULL;
     806
     807    return (BOOL)SendMessageW(GetParent(hwnd),WM_NOTIFY,(WPARAM)nmhdr.hdr.idFrom,(LPARAM)&nmhdr);
     808}
     809
     810static BOOL
     811HEADER_SendItemClick(HWND hwnd,INT iItem,INT iButton)
     812{
     813  if (IsWindowUnicode(GetParent(hwnd)))
     814    return HEADER_SendClickNotifyA(hwnd,HDN_ITEMCLICKA,iItem,iButton);
     815  else
     816    return HEADER_SendClickNotifyW(hwnd,HDN_ITEMCLICKW,iItem,iButton);
     817}
     818
     819static BOOL
     820HEADER_SendDragNotify(HWND hwnd,UINT code,INT iItem,INT iButton)
     821{
     822    NMHEADERA nmhdr;
     823
     824    nmhdr.hdr.hwndFrom = hwnd;
     825    nmhdr.hdr.idFrom   = GetWindowLongA(hwnd,GWL_ID);
     826    nmhdr.hdr.code     = code;
     827    nmhdr.iItem        = iItem;
     828    nmhdr.iButton      = iButton;
     829    nmhdr.pitem        = NULL;
     830
     831    return (BOOL)SendMessageA(GetParent(hwnd),WM_NOTIFY,(WPARAM)nmhdr.hdr.idFrom,(LPARAM)&nmhdr);
     832}
     833
     834static BOOL
     835HEADER_SendFilterBtnClick(HWND hwnd,INT iItem,RECT iRect)
     836{
     837    NMHDFILTERBTNCLICK nmhdr;
     838
     839    nmhdr.hdr.hwndFrom = hwnd;
     840    nmhdr.hdr.idFrom   = GetWindowLongA(hwnd,GWL_ID);
     841    nmhdr.hdr.code = HDN_FILTERBTNCLICK;
     842    nmhdr.iItem    = iItem;
     843    nmhdr.rc       = iRect;
     844
     845    return (BOOL)SendMessageA(GetParent(hwnd),WM_NOTIFY,(WPARAM)nmhdr.hdr.idFrom,(LPARAM)&nmhdr);
     846}
     847
     848static BOOL
     849HEADER_SendFilterChange(HWND hwnd,INT iItem)
     850{
     851    NMHEADERA nmhdr;
     852
     853    nmhdr.hdr.hwndFrom = hwnd;
     854    nmhdr.hdr.idFrom   = GetWindowLongA(hwnd,GWL_ID);
     855    nmhdr.hdr.code     = HDN_FILTERCHANGE;
     856    nmhdr.iItem        = iItem;
     857    nmhdr.iButton      = 0;
     858    nmhdr.pitem        = NULL;
     859
     860    return (BOOL)SendMessageA(GetParent(hwnd),WM_NOTIFY,(WPARAM)nmhdr.hdr.idFrom,(LPARAM)&nmhdr);
    710861}
    711862
     
    743894
    744895static LRESULT
    745 HEADER_CreateDragImage (HWND hwnd, WPARAM wParam)
     896HEADER_CreateDragImage(HWND hwnd,WPARAM wParam,LPARAM lParam)
    746897{
    747898  HEADER_INFO *infoPtr = HEADER_GetInfoPtr(hwnd);
     
    12011352    HEADER_INFO *infoPtr = HEADER_GetInfoPtr (hwnd);
    12021353    LPHDLAYOUT lpLayout = (LPHDLAYOUT)lParam;
     1354
     1355    if (!lpLayout) return FALSE;
    12031356
    12041357    lpLayout->pwpos->hwnd = hwnd;
     
    12171370//           lpLayout->pwpos->cx, lpLayout->pwpos->cy);
    12181371
    1219     HEADER_ForceItemBounds (hwnd, lpLayout->pwpos->cy);
    1220 
    1221     /* hack */
    1222 #ifdef __HDM_LAYOUT_HACK__
    1223     MoveWindow (lpLayout->pwpos->hwnd, lpLayout->pwpos->x, lpLayout->pwpos->y,
    1224                   lpLayout->pwpos->cx, lpLayout->pwpos->cy, TRUE);
    1225 #endif
    1226 
    12271372    return TRUE;
    12281373}
     
    12581403
    12591404//    TRACE (header, "[nItem=%d]\n", nItem);
    1260 
    1261     if (HEADER_SendHeaderNotify(hwnd,HDN_ITEMCHANGINGA,nItem)) return FALSE;
     1405    if (HEADER_SendItemChanging(hwnd,nItem)) return FALSE;
    12621406
    12631407    lpItem = (HEADER_ITEM*)&infoPtr->items[nItem];
     
    13071451    }
    13081452
    1309     HEADER_SendHeaderNotify(hwnd,HDN_ITEMCHANGEDA,nItem);
     1453    HEADER_SendItemChanged(hwnd,nItem);
    13101454
    13111455    HEADER_SetItemBounds(hwnd,0);
     
    13311475//    TRACE (header, "[nItem=%d]\n", nItem);
    13321476
    1333     if (HEADER_SendHeaderNotify(hwnd,HDN_ITEMCHANGINGW,nItem)) return FALSE;
     1477    if (HEADER_SendItemChanging(hwnd,nItem)) return FALSE;
    13341478
    13351479    lpItem = (HEADER_ITEM*)&infoPtr->items[nItem];
     
    13791523    }
    13801524
    1381     HEADER_SendHeaderNotify(hwnd,HDN_ITEMCHANGEDW,nItem);
     1525    HEADER_SendItemChanged(hwnd,nItem);
    13821526
    13831527    HEADER_SetItemBounds(hwnd,0);
     
    14161560    infoPtr->hcurDivider = LoadCursorA (0, IDC_SIZEWEA);
    14171561    infoPtr->hcurDivopen = LoadCursorA (0, IDC_SIZENSA);
     1562    infoPtr->bCaptured = FALSE;
    14181563    infoPtr->bPressed  = FALSE;
    14191564    infoPtr->bTracking = FALSE;
     1565    infoPtr->bDragDrop = FALSE;
     1566    infoPtr->bTimer    = FALSE;
    14201567    infoPtr->iMoveItem = 0;
    1421     infoPtr->himl = 0;
    1422     infoPtr->iHotItem = -1;
     1568    infoPtr->himl      = 0;
     1569    infoPtr->dragImage = 0;
     1570    infoPtr->iHotItem  = -1;
    14231571    infoPtr->xBmpMargin = 3*GetSystemMetrics(SM_CXEDGE);
    1424     infoPtr->bUnicode = IsWindowUnicode (hwnd);
     1572    infoPtr->bUnicode = IsWindowUnicode(hwnd);
    14251573
    14261574    hdc = GetDC (0);
     
    14921640
    14931641    if ((GetWindowLongA (hwnd, GWL_STYLE) & HDS_BUTTONS) && (flags == HHT_ONHEADER))
    1494         HEADER_SendHeaderNotify (hwnd, HDN_ITEMDBLCLICKA, nItem);
     1642        HEADER_SendItemDblClick(hwnd,nItem,0);
    14951643    else if ((flags == HHT_ONDIVIDER) || (flags == HHT_ONDIVOPEN))
    1496         HEADER_SendHeaderNotify (hwnd, HDN_DIVIDERDBLCLICKA, nItem);
     1644        HEADER_SendDividerDblClick(hwnd,nItem,0);
    14971645
    14981646    return 0;
     
    15101658    HDC   hdc;
    15111659
    1512     pt.x = (INT)LOWORD(lParam);
    1513     pt.y = (INT)HIWORD(lParam);
     1660    pt.x = (SHORT)LOWORD(lParam);
     1661    pt.y = (SHORT)HIWORD(lParam);
    15141662    HEADER_InternalHitTest (hwnd, &pt, &flags, &nItem);
    15151663
     
    15291677
    15301678//      TRACE (header, "Pressed item %d!\n", nItem);
    1531     }
    1532     else if ((flags == HHT_ONDIVIDER) || (flags == HHT_ONDIVOPEN))
    1533     {
    1534         if (!(HEADER_SendHeaderNotify (hwnd, HDN_BEGINTRACKA, nItem)))
     1679    } else if ((flags == HHT_ONDIVIDER) || (flags == HHT_ONDIVOPEN))
     1680    {
     1681        if (!(HEADER_SendBeginTrack(hwnd,nItem,0)))
    15351682        {
    15361683            SetCapture (hwnd);
     
    15681715    HDC   hdc;
    15691716
    1570     pt.x = (INT)LOWORD(lParam);
    1571     pt.y = (INT)HIWORD(lParam);
     1717    pt.x = (SHORT)LOWORD(lParam);
     1718    pt.y = (SHORT)HIWORD(lParam);
    15721719    HEADER_InternalHitTest (hwnd, &pt, &flags, &nItem);
    15731720
    15741721    if (infoPtr->bPressed)
    15751722    {
    1576         if ((nItem == infoPtr->iMoveItem) && (flags == HHT_ONHEADER))
     1723        if (PtInRect(&infoPtr->items[infoPtr->iMoveItem].rect,pt))
    15771724        {
    15781725            infoPtr->items[infoPtr->iMoveItem].bDown = FALSE;
    1579             hdc = GetDC (hwnd);
    1580             HEADER_RefreshItem (hwnd, hdc, infoPtr->iMoveItem);
    1581             ReleaseDC (hwnd, hdc);
    1582 
    1583             HEADER_SendClickNotify (hwnd, HDN_ITEMCLICKA, infoPtr->iMoveItem);
     1726            hdc = GetDC(hwnd);
     1727            HEADER_RefreshItem(hwnd,hdc,infoPtr->iMoveItem);
     1728            ReleaseDC(hwnd,hdc);
     1729
     1730            HEADER_SendItemClick(hwnd,infoPtr->iMoveItem,0);
    15841731        }
    15851732//      TRACE (header, "Released item %d!\n", infoPtr->iMoveItem);
    15861733        infoPtr->bPressed = FALSE;
    1587     }
    1588     else if (infoPtr->bTracking)
     1734    } else if (infoPtr->bTracking)
    15891735    {
    15901736//      TRACE (header, "End tracking item %d!\n", infoPtr->iMoveItem);
    15911737        infoPtr->bTracking = FALSE;
    15921738
    1593         HEADER_SendHeaderNotify (hwnd, HDN_ENDTRACKA, infoPtr->iMoveItem);
     1739        HEADER_SendEndTrack(hwnd,infoPtr->iMoveItem,0);
    15941740
    15951741        if (!(dwStyle & HDS_FULLDRAG))
     
    15981744            HEADER_DrawTrackLine (hwnd, hdc, infoPtr->xOldTrack);
    15991745            ReleaseDC (hwnd, hdc);
    1600             if (HEADER_SendHeaderNotify (hwnd, HDN_ITEMCHANGINGA, infoPtr->iMoveItem))
     1746            if (HEADER_SendItemChanging(hwnd,infoPtr->iMoveItem))
    16011747                infoPtr->items[infoPtr->iMoveItem].cxy = infoPtr->nOldWidth;
    16021748            else
     
    16081754                {
    16091755                  infoPtr->items[infoPtr->iMoveItem].cxy = nWidth;
    1610                   HEADER_SendHeaderNotify (hwnd, HDN_ITEMCHANGEDA, infoPtr->iMoveItem);
     1756                  HEADER_SendItemChanged(hwnd,infoPtr->iMoveItem);
    16111757
    16121758                  HEADER_SetItemBounds (hwnd,infoPtr->iMoveItem);
     
    16181764    }
    16191765
    1620     if (infoPtr->bCaptured) {
    1621         infoPtr->bCaptured = FALSE;
    1622         ReleaseCapture ();
    1623         HEADER_SendSimpleNotify (hwnd, NM_RELEASEDCAPTURE);
     1766    if (infoPtr->bCaptured)
     1767    {
     1768      infoPtr->bCaptured = FALSE;
     1769      ReleaseCapture();
     1770      HEADER_SendSimpleNotify(hwnd,NM_RELEASEDCAPTURE);
    16241771    }
    16251772
     
    16421789    HEADER_InternalHitTest (hwnd, &pt, &flags, &nItem);
    16431790
    1644     if ((dwStyle & HDS_BUTTONS) && (dwStyle & HDS_HOTTRACK) &&!infoPtr->bCaptured)
     1791    if (dwStyle & HDS_BUTTONS && dwStyle & HDS_HOTTRACK) //CB: check with no buttons
    16451792    {
    16461793        INT newItem;
    16471794
    1648         if (flags & (HHT_ONHEADER | HHT_ONDIVIDER | HHT_ONDIVOPEN))
    1649             newItem = nItem;
     1795        if (infoPtr->bCaptured && infoPtr->bPressed && PtInRect(&infoPtr->items[infoPtr->iMoveItem].rect,pt))
     1796          newItem = infoPtr->iMoveItem;
    16501797        else
    1651             newItem = -1;
     1798        {
     1799          if (flags & (HHT_ONHEADER | HHT_ONDIVIDER | HHT_ONDIVOPEN))
     1800              newItem = nItem;
     1801          else
     1802              newItem = -1;
     1803        }
    16521804        if (newItem != infoPtr->iHotItem)
    16531805        {
    1654           INT oldItem = infoPtr->iHotItem;
    1655 
    16561806          infoPtr->iHotItem = newItem;
    16571807          HEADER_Refresh(hwnd);
    16581808        }
     1809        if (!infoPtr->bTimer && infoPtr->iHotItem != -1)
     1810        {
     1811          infoPtr->bTimer = TRUE;
     1812          SetTimer(hwnd,TIMER_ID,TIMER_MS,NULL);
     1813        } else if (infoPtr->bTimer && infoPtr->iHotItem == -1)
     1814        {
     1815          KillTimer(hwnd,TIMER_ID);
     1816          infoPtr->bTimer = FALSE;
     1817        }
    16591818    }
    16601819
    16611820    if (infoPtr->bCaptured)
    16621821    {
    1663         if (infoPtr->bPressed)
     1822      if (infoPtr->bPressed)
     1823      {
     1824        if (dwStyle & HDS_DRAGDROP && (infoPtr->bDragDrop || !HEADER_SendDragNotify(hwnd,HDN_BEGINDRAG,infoPtr->iMoveItem,0)))
    16641825        {
    1665             BOOL newDown;
    1666 
    1667             if ((nItem == infoPtr->iMoveItem) && (flags == HHT_ONHEADER))
    1668                 newDown = TRUE;
    1669             else
    1670                 newDown = FALSE;
    1671 
    1672             if (newDown != infoPtr->items[infoPtr->iMoveItem].bDown)
    1673             {
    1674               infoPtr->items[infoPtr->iMoveItem].bDown = newDown;
    1675               hdc = GetDC (hwnd);
    1676               HEADER_RefreshItem (hwnd, hdc, infoPtr->iMoveItem);
    1677               ReleaseDC (hwnd, hdc);
    1678             }
    1679 //          TRACE (header, "Moving pressed item %d!\n", infoPtr->iMoveItem);
    1680         } else if (infoPtr->bTracking)
     1826          if (!infoPtr->bDragDrop)
     1827          {
     1828            infoPtr->bDragDrop = TRUE;
     1829            infoPtr->dragImage = (HIMAGELIST)HEADER_CreateDragImage(hwnd,0,0);
     1830          }
     1831          //CB:todo
     1832        } else
    16811833        {
    1682           if (dwStyle & HDS_FULLDRAG)
     1834          BOOL newDown;
     1835
     1836          if (PtInRect(&infoPtr->items[infoPtr->iMoveItem].rect,pt))
     1837            newDown = TRUE;
     1838          else
     1839            newDown = FALSE;
     1840
     1841          if (newDown != infoPtr->items[infoPtr->iMoveItem].bDown)
    16831842          {
    1684             if (HEADER_SendHeaderNotify (hwnd, HDN_ITEMCHANGINGA, infoPtr->iMoveItem))
    1685               infoPtr->items[infoPtr->iMoveItem].cxy = infoPtr->nOldWidth;
    1686             else
    1687             {
    1688               nWidth = pt.x - infoPtr->items[infoPtr->iMoveItem].rect.left + infoPtr->xTrackOffset;
    1689               if (nWidth < MIN_ITEMWIDTH) nWidth = MIN_ITEMWIDTH;
    1690               infoPtr->items[infoPtr->iMoveItem].cxy = nWidth;
    1691               HEADER_SendHeaderNotify(hwnd,HDN_ITEMCHANGEDA,infoPtr->iMoveItem);
    1692             }
    1693             HEADER_SetItemBounds (hwnd,infoPtr->iMoveItem);
    1694             HEADER_Refresh(hwnd);
    1695           } else
    1696           {
    1697             INT lastPos = infoPtr->xOldTrack;
    1698 
     1843            infoPtr->items[infoPtr->iMoveItem].bDown = newDown;
    16991844            hdc = GetDC (hwnd);
    1700             infoPtr->xOldTrack = pt.x + infoPtr->xTrackOffset;
    1701             if (infoPtr->xOldTrack < infoPtr->items[infoPtr->iMoveItem].rect.left+MIN_ITEMWIDTH)
    1702               infoPtr->xOldTrack = infoPtr->items[infoPtr->iMoveItem].rect.left+MIN_ITEMWIDTH;
    1703             infoPtr->items[infoPtr->iMoveItem].cxy =
    1704               infoPtr->xOldTrack-infoPtr->items[infoPtr->iMoveItem].rect.left;
    1705             if (lastPos != infoPtr->xOldTrack)
    1706             {
    1707               HEADER_DrawTrackLine(hwnd,hdc,lastPos);
    1708               HEADER_DrawTrackLine(hwnd,hdc,infoPtr->xOldTrack);
    1709             }
     1845            HEADER_RefreshItem (hwnd, hdc, infoPtr->iMoveItem);
    17101846            ReleaseDC (hwnd, hdc);
    17111847          }
    1712 
    1713           HEADER_SendHeaderNotify (hwnd, HDN_TRACKA, infoPtr->iMoveItem);
     1848        }
     1849//          TRACE (header, "Moving pressed item %d!\n", infoPtr->iMoveItem);
     1850      } else if (infoPtr->bTracking)
     1851      {
     1852        if (dwStyle & HDS_FULLDRAG)
     1853        {
     1854          if (HEADER_SendItemChanging(hwnd,infoPtr->iMoveItem))
     1855            infoPtr->items[infoPtr->iMoveItem].cxy = infoPtr->nOldWidth;
     1856          else
     1857          {
     1858            nWidth = pt.x - infoPtr->items[infoPtr->iMoveItem].rect.left + infoPtr->xTrackOffset;
     1859            if (nWidth < MIN_ITEMWIDTH) nWidth = MIN_ITEMWIDTH;
     1860            infoPtr->items[infoPtr->iMoveItem].cxy = nWidth;
     1861            HEADER_SendItemChanged(hwnd,infoPtr->iMoveItem);
     1862          }
     1863          HEADER_SetItemBounds (hwnd,infoPtr->iMoveItem);
     1864          HEADER_Refresh(hwnd);
     1865        } else
     1866        {
     1867          INT lastPos = infoPtr->xOldTrack;
     1868
     1869          hdc = GetDC (hwnd);
     1870          infoPtr->xOldTrack = pt.x + infoPtr->xTrackOffset;
     1871          if (infoPtr->xOldTrack < infoPtr->items[infoPtr->iMoveItem].rect.left+MIN_ITEMWIDTH)
     1872            infoPtr->xOldTrack = infoPtr->items[infoPtr->iMoveItem].rect.left+MIN_ITEMWIDTH;
     1873          infoPtr->items[infoPtr->iMoveItem].cxy =
     1874            infoPtr->xOldTrack-infoPtr->items[infoPtr->iMoveItem].rect.left;
     1875          if (lastPos != infoPtr->xOldTrack)
     1876          {
     1877            HEADER_DrawTrackLine(hwnd,hdc,lastPos);
     1878            HEADER_DrawTrackLine(hwnd,hdc,infoPtr->xOldTrack);
     1879          }
     1880          ReleaseDC (hwnd, hdc);
     1881        }
     1882
     1883        HEADER_SendTrack(hwnd,infoPtr->iMoveItem);
    17141884//          TRACE (header, "Tracking item %d!\n", infoPtr->iMoveItem);
    1715         }
     1885      }
    17161886    }
    17171887
    17181888    return 0;
     1889}
     1890
     1891static LRESULT
     1892HEADER_Size(HWND hwnd,WPARAM wParam,LPARAM lParam)
     1893{
     1894  HEADER_SetItemBounds(hwnd,0);
     1895
     1896  return DefWindowProcA(hwnd,WM_SIZE,wParam,lParam);
     1897}
     1898
     1899static LRESULT
     1900HEADER_Timer(HWND hwnd,WPARAM wParam,LPARAM lParam)
     1901{
     1902  POINT point;
     1903  RECT rect;
     1904
     1905  GetCursorPos(&point);
     1906  ScreenToClient(hwnd,&point);
     1907  GetClientRect(hwnd,&rect);
     1908  if (!PtInRect(&rect,point))
     1909  {
     1910    HEADER_INFO *infoPtr = HEADER_GetInfoPtr(hwnd);
     1911
     1912    infoPtr->iHotItem = -1;
     1913    infoPtr->bTimer = FALSE;
     1914    HEADER_Refresh(hwnd);
     1915
     1916    KillTimer(hwnd,TIMER_ID);
     1917  }
     1918
     1919  return 0;
    17191920}
    17201921
     
    17301931    infoPtr->bTracking = FALSE;
    17311932
    1732     HEADER_SendHeaderNotify(hwnd,HDN_ENDTRACKA,infoPtr->iMoveItem);
     1933    HEADER_SendEndTrack(hwnd,infoPtr->iMoveItem,0);
    17331934    hdc = GetDC(hwnd);
    17341935    HEADER_DrawTrackLine(hwnd,hdc,infoPtr->xOldTrack);
     
    17481949
    17491950  return DefWindowProcA(WM_KEYDOWN,hwnd,wParam,lParam);
     1951}
     1952
     1953static LRESULT
     1954HEADER_CaptureChanged(HWND hwnd,WPARAM wParam,LPARAM lParam)
     1955{
     1956  HEADER_INFO *infoPtr = HEADER_GetInfoPtr(hwnd);
     1957  DWORD dwStyle = GetWindowLongA(hwnd,GWL_STYLE);
     1958  HDC hdc;
     1959
     1960  if (infoPtr->bCaptured && infoPtr->bTracking)
     1961  {
     1962    infoPtr->bTracking = FALSE;
     1963
     1964    HEADER_SendEndTrack(hwnd,infoPtr->iMoveItem,0);
     1965    hdc = GetDC(hwnd);
     1966    HEADER_DrawTrackLine(hwnd,hdc,infoPtr->xOldTrack);
     1967    ReleaseDC(hwnd,hdc);
     1968    if (dwStyle & HDS_FULLDRAG)
     1969    {
     1970      infoPtr->items[infoPtr->iMoveItem].cxy = infoPtr->nOldWidth;
     1971      HEADER_Refresh(hwnd);
     1972    }
     1973  }
     1974
     1975  return 0;
    17501976}
    17511977
     
    18282054    ReleaseDC (0, hdc);
    18292055
    1830     if (lParam) {
    1831         HEADER_ForceItemBounds (hwnd, infoPtr->nHeight);
    1832         HEADER_Refresh(hwnd);
    1833     }
     2056    if (lParam) HEADER_Refresh(hwnd);
    18342057
    18352058    return 0;
     
    18462069
    18472070        case HDM_CREATEDRAGIMAGE:
    1848             return HEADER_CreateDragImage (hwnd, wParam);
     2071            return HEADER_CreateDragImage (hwnd,wParam,lParam);
    18492072
    18502073        case HDM_DELETEITEM:
     
    19172140            return HEADER_SetUnicodeFormat (hwnd, wParam);
    19182141
     2142        case WM_CAPTURECHANGED:
     2143            return HEADER_CaptureChanged(hwnd,wParam,lParam);
     2144
    19192145        case WM_CREATE:
    19202146            return HEADER_Create (hwnd, wParam, lParam);
     
    19602186        case WM_SETFONT:
    19612187            return HEADER_SetFont (hwnd, wParam, lParam);
     2188
     2189        case WM_SIZE:
     2190            return HEADER_Size(hwnd,wParam,lParam);
     2191
     2192        case WM_TIMER:
     2193            return HEADER_Timer(hwnd,wParam,lParam);
    19622194
    19632195        default:
Note: See TracChangeset for help on using the changeset viewer.