Changeset 1175 for trunk/src


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

Header complete so far

File:
1 edited

Legend:

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

    r1170 r1175  
    1 /* $Id: header.c,v 1.16 1999-10-07 15:46:30 cbratschi Exp $ */
     1/* $Id: header.c,v 1.17 1999-10-07 21:00:41 cbratschi Exp $ */
    22/*
    33 *  Header control
     
    88 *
    99 *  TODO:
    10  *   - Order list support.
    11  *   - Control specific cursors (over dividers).
    12  *   - Custom draw support (including Notifications).
     10 *   - Control specific cursors (over dividers)
     11 *
    1312 *   - HDS_FILTERBAR
     13 *   - HEADER_SetHotDivider()
    1414 *
    15  *
    16  * Status: Development in progress, a lot to do :)
    17  * Version: 5.00 (target)
     15 * Status: ready (inconsistent parts in Microsoft SDK documentation)
     16 * Version: 5.00
    1817 */
    1918
     
    341340      }
    342341
    343       if (!(phdi->fmt & HDI_ORDER) || (phdi->iOrder & (HDF_LEFT | HDF_CENTER)))
     342      if (!(phdi->fmt & HDF_JUSTIFYMASK) || (phdi->fmt & (HDF_LEFT | HDF_CENTER)))
    344343      {
    345344        HEADER_DrawItemImage(hwnd,hdc,infoPtr,phdi,&r,iItem);
     
    389388    HBRUSH hbrBk;
    390389    INT i, x;
    391 
    392     /* get rect for the bar, adjusted for the border */
    393     GetClientRect (hwnd, &rect);
     390    NMCUSTOMDRAW cdraw;
     391    LRESULT cdctlres,cdres;
     392
     393    // get rect for the bar, adjusted for the border
     394    GetClientRect (hwnd,&rect);
     395
     396    //Custom draw
     397    cdraw.hdr.hwndFrom = hwnd;
     398    cdraw.hdr.idFrom   = GetWindowLongA(hwnd,GWL_ID);
     399    cdraw.hdr.code     = NM_CUSTOMDRAW;
     400    cdraw.dwDrawStage  = CDDS_PREPAINT;
     401    cdraw.hdc          = hdc;
     402    cdraw.dwItemSpec   = 0;
     403    cdraw.uItemState   = CDIS_DEFAULT;
     404    cdraw.rc           = rect;
     405    cdraw.lItemlParam  = 0;
     406
     407    cdctlres = SendMessageA(GetParent(hwnd),WM_NOTIFY,(WPARAM)cdraw.hdr.idFrom,(LPARAM)&cdraw);
     408
     409    if (cdctlres & CDRF_SKIPDEFAULT) return;
    394410
    395411    hFont = infoPtr->hFont ? infoPtr->hFont : GetStockObject (SYSTEM_FONT);
    396412    hOldFont = SelectObject (hdc, hFont);
    397413
    398     /* draw Background */
     414    // draw Background
    399415    hbrBk = GetSysColorBrush(COLOR_3DFACE);
    400416    FillRect(hdc, &rect, hbrBk);
     
    403419    for (i = 0; i < infoPtr->uNumItem; i++)
    404420    {
    405       x = HEADER_DrawItem(hwnd,hdc,i,infoPtr->iHotItem == i,FALSE);
    406       if (x > rect.right)
    407       {
    408         x = -1;
    409         break;
     421      if (cdctlres & CDRF_NOTIFYITEMDRAW)
     422      {
     423        cdraw.dwDrawStage    = CDDS_ITEMPREPAINT;
     424        cdraw.dwItemSpec     = x;
     425        cdraw.lItemlParam    = infoPtr->items[x].lParam;
     426        cdraw.rc             = infoPtr->items[x].rect;
     427
     428        cdres = SendMessageA(GetParent(hwnd),WM_NOTIFY,(WPARAM)cdraw.hdr.idFrom,(LPARAM)&cdraw);
     429      } else cdres = 0;
     430
     431      if (!(cdres & CDRF_SKIPDEFAULT))
     432      {
     433        x = HEADER_DrawItem(hwnd,hdc,i,infoPtr->iHotItem == i,FALSE);
     434        if (x > rect.right)
     435        {
     436          x = -1;
     437          break;
     438        }
     439
     440        if (cdctlres & CDRF_NOTIFYITEMDRAW)
     441        {
     442          cdraw.dwDrawStage    = CDDS_ITEMPOSTPAINT;
     443
     444          SendMessageA(GetParent(hwnd),WM_NOTIFY,(WPARAM)cdraw.hdr.idFrom,(LPARAM)&cdraw);
     445        }
    410446      }
    411447    }
     
    413449    if (x != -1 && (x <= rect.right) && (infoPtr->uNumItem > 0))
    414450    {
    415         rect.left = x;
    416         if (dwStyle & HDS_BUTTONS)
    417             DrawEdge (hdc, &rect, EDGE_RAISED, BF_TOP|BF_LEFT|BF_BOTTOM|BF_SOFT);
    418         else
    419             DrawEdge (hdc, &rect, EDGE_ETCHED, BF_BOTTOM);
     451      rect.left = x;
     452      if (dwStyle & HDS_BUTTONS)
     453        DrawEdge (hdc, &rect, EDGE_RAISED, BF_TOP|BF_LEFT|BF_BOTTOM|BF_SOFT);
     454      else
     455        DrawEdge (hdc, &rect, EDGE_ETCHED, BF_BOTTOM);
    420456    }
    421457
     
    458494      }
    459495      ImageList_Draw(infoPtr->dragImage,0,hdc,infoPtr->items[infoPtr->iMoveItem].rect.left+infoPtr->dragPos.x-infoPtr->dragStart.x,0,ILD_NORMAL);
     496    }
     497
     498    if (cdctlres & CDRF_NOTIFYPOSTPAINT)
     499    {
     500      cdraw.dwDrawStage    = CDDS_POSTPAINT;
     501      cdraw.dwItemSpec     = 0;
     502      GetClientRect(hwnd,&cdraw.rc);
     503
     504      SendMessageA(GetParent(hwnd),WM_NOTIFY,(WPARAM)cdraw.hdr.idFrom,(LPARAM)&cdraw);
    460505    }
    461506}
     
    9951040HEADER_SetHotDivider(HWND hwnd,WPARAM wParam,LPARAM lParam)
    9961041{
     1042  HEADER_INFO *infoPtr = HEADER_GetInfoPtr(hwnd);
     1043
    9971044  if (wParam)
    9981045  {
    999     //CB:todo
     1046    POINT pt;
     1047
     1048    pt.x = LOWORD(lParam);
     1049    pt.y = HIWORD(lParam);
     1050
     1051    //CB: todo
    10001052  } else
    10011053  {
    1002     //CB:todo
     1054    //CB: todo
    10031055  }
    10041056
     
    12111263}
    12121264
     1265static BOOL
     1266HEADER_CheckOrderArray(HEADER_INFO* infoPtr,LPINT lpiArray)
     1267{
     1268  INT x,y;
     1269
     1270  for (x = 0;x < infoPtr->uNumItem;x++)
     1271  {
     1272    BOOL found = FALSE;
     1273
     1274    for (y = 0;y <= x;y++)
     1275      if (infoPtr->items[y].iOrder == lpiArray[x]) found = TRUE;
     1276    for (y = x+1;y < infoPtr->uNumItem;y++)
     1277    {
     1278      if (infoPtr->items[x].iOrder == infoPtr->items[y].iOrder  || lpiArray[x] == lpiArray[y]) return FALSE;
     1279      if (infoPtr->items[y].iOrder == lpiArray[x]) found = TRUE;
     1280    }
     1281
     1282    if (!found) return FALSE;
     1283  }
     1284
     1285  return TRUE;
     1286}
     1287
    12131288static LRESULT
    12141289HEADER_GetOrderArray(HWND hwnd,WPARAM wParam,LPARAM lParam)
     
    12161291  HEADER_INFO *infoPtr = HEADER_GetInfoPtr(hwnd);
    12171292  LPINT lpiArray = (LPINT)lParam;
    1218 
    1219   if (wParam != infoPtr->uNumItem || !lpiArray) return FALSE;
    1220 
    1221   //CB: todo
     1293  INT x;
     1294
     1295  if (wParam != infoPtr->uNumItem || !lpiArray || !HEADER_CheckOrderArray(infoPtr,lpiArray)) return FALSE;
     1296
     1297  for (x = 0;x < infoPtr->uNumItem;x++) lpiArray[x] = infoPtr->items[x].iOrder;
    12221298
    12231299  return TRUE;
     
    12291305  HEADER_INFO *infoPtr = HEADER_GetInfoPtr(hwnd);
    12301306  LPINT lpiArray = (LPINT)lParam;
    1231 
    1232   if (wParam != infoPtr->uNumItem || !lpiArray) return FALSE;
    1233 
    1234   //CB: todo
     1307  HEADER_ITEM* newItems;
     1308  INT x,y;
     1309
     1310  if (wParam != infoPtr->uNumItem || !lpiArray || !HEADER_CheckOrderArray(infoPtr,lpiArray)) return FALSE;
     1311  if (infoPtr->uNumItem <= 1) return TRUE;
     1312
     1313  newItems = COMCTL32_Alloc(infoPtr->uNumItem*sizeof(HEADER_ITEM));
     1314  for (x = 0;x < infoPtr->uNumItem;x++)
     1315    for (y = 0;y < infoPtr->uNumItem;y++)
     1316      if (infoPtr->items[x].iOrder == lpiArray[x]) memcpy(&newItems[x],&infoPtr->items[y],sizeof(HEADER_ITEM));
     1317  COMCTL32_Free(infoPtr->items);
     1318  infoPtr->items = newItems;
     1319
    12351320  HEADER_SetItemBounds(hwnd,0);
    12361321  HEADER_Refresh(hwnd);
     
    12471332
    12481333  for (x = 0;x < infoPtr->uNumItem;x++)
    1249   {
    1250 //CB:todo
    1251   }
     1334    if (infoPtr->items[x].iOrder == iOrder) return x;
    12521335
    12531336  return iOrder;
     
    13441427    lpItem->iImage = (phdi->mask & HDI_IMAGE) ? phdi->iImage:0;
    13451428
    1346     lpItem->iOrder = (phdi->mask & HDI_ORDER) ? phdi->iOrder:HDF_LEFT;
     1429    lpItem->iOrder = (phdi->mask & HDI_ORDER) ? phdi->iOrder:-1;
    13471430
    13481431    lpItem->hbm = (phdi->mask & HDI_BITMAP) ? phdi->hbm:0;
     
    14301513    lpItem->iImage = (phdi->mask & HDI_IMAGE) ? phdi->iImage:0;
    14311514
    1432     lpItem->iOrder = (phdi->mask & HDI_ORDER) ? phdi->iOrder:HDF_LEFT;
     1515    lpItem->iOrder = (phdi->mask & HDI_ORDER) ? phdi->iOrder:-1;
    14331516
    14341517    lpItem->hbm = (phdi->mask & HDI_BITMAP) ? phdi->hbm:0;
Note: See TracChangeset for help on using the changeset viewer.