123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832 |
- #include "main.h"
- #include "config.h"
- #include "../winamp/wa_dlg.h"
- #include "./skinnedheader.h"
- #include "./skinning.h"
- #include "./ml_imagelist.h"
- #include "./imagefilters.h"
- #include "./ml_cloudcolumn.h"
- #include "./resource.h"
- // Timers
- #define TIMER_UNBLOCKREDRAW_ID 1978
- #define TIMER_ENDTRACK_ID 1979
- #define TIMER_ENDTRACK_DELAY 5
- // Header internal flags (LOWORD reserved to sort index)
- #define HIF_ASCENDING 0x00010000
- #define HIF_OWNPARENTSW 0x00020000 // parent was subclassed by this control
- #define HIF_REALCXY 0x00040000
- #define HIF_DEFSIZERULE 0x00100000 // item will use default size rule.
- #define HIF_BLOCKCHANGING 0x10000000
- #define HIF_BLOCKCHANGED 0x20000000
- #define HIF_BLOCKWNDPOS 0x40000000
- #define HIF_BLOCKREDRAW 0x80000000
- extern HMLIMGFLTRMNGR hmlifMngr; // default gen_ml fitler manager
- typedef struct _HDSIZE
- {
- INT instanceRef;
- INT *pCXY; // stored by index
- INT *pOrder; // current left-to-right order of items (index values for items in the header).
- INT count;
- INT allocated;
- INT headerCXY;
- INT lastCXY;
- HWND hwndParent;
- HDITEMW hdi; // safe to use duaring size
- } HDSIZE;
- typedef struct _HDCURSOR
- {
- HWND hwndParent;
- NMMOUSE nm;
- HDHITTESTINFO hitTest;
- DWORD pts;
- } HDCURSOR;
- static HDSIZE hdrSize = {0,0,0, } ;
- static INT GetDefaultSizeRule(void)
- {
- INT rule;
- rule = g_config->ReadInt(L"column_resize_mode", 0);
- switch(rule)
- {
- case 1: return SHS_SIZERULE_ADJUSTONE;
- case 2: return SHS_SIZERULE_PROPORTIONAL;
- case 3: return SHS_SIZERULE_ADJUSTALL;
- }
- return SHS_SIZERULE_WINDOWS;
- }
- SkinnedHeader::SkinnedHeader(void) : SkinnedWnd(FALSE), hcurNormal(NULL), cloudColumn(-1)
- {
- if (!hdrSize.instanceRef)
- ZeroMemory(&hdrSize, sizeof(HDSIZE));
- hdrSize.instanceRef++;
- hdrFlags = LOWORD(-1) | HIF_ASCENDING | HIF_DEFSIZERULE;
- hdrSizeRule = (HIF_DEFSIZERULE & hdrFlags) ? GetDefaultSizeRule() : SHS_SIZERULE_WINDOWS;
- }
- SkinnedHeader::~SkinnedHeader(void)
- {
- if (hdrSize.instanceRef && !--hdrSize.instanceRef)
- {
- if (hdrSize.pCXY)
- free(hdrSize.pCXY); // pOrder - use same buffer
- ZeroMemory(&hdrSize, sizeof(HDSIZE));
- }
- }
- extern HMLIMGLST hmlilCloud;
- BOOL SkinnedHeader::Attach(HWND hwndHeader)
- {
- HWND hwndParent;
- if(!__super::Attach(hwndHeader)) return FALSE;
- SetType(SKINNEDWND_TYPE_HEADER);
- hwndParent = GetParent(hwndHeader);
- if (hwndParent) SkinWindow(hwndParent, SWS_NORMAL);
- hdrFlags = LOWORD(-1) | HIF_ASCENDING | HIF_DEFSIZERULE;
- hdrSizeRule = (HIF_DEFSIZERULE & hdrFlags) ? GetDefaultSizeRule() : SHS_SIZERULE_WINDOWS;
- // set default height
- SetHeight(-1);
- return TRUE;
- }
- void SkinnedHeader::OnSkinChanged(BOOL bNotifyChildren, BOOL bRedraw)
- {
- hcurNormal = (HCURSOR)SendMessageW(plugin.hwndParent, WM_WA_IPC, WACURSOR_NORMAL, IPC_GETSKINCURSORS);
- __super::OnSkinChanged(bNotifyChildren, bRedraw);
- }
- void SkinnedHeader::BlockRedraw(BOOL bBlock, UINT unblockDelay)
- {
- KillTimer(hwnd, TIMER_UNBLOCKREDRAW_ID);
- if (FALSE != bBlock)
- hdrFlags |= HIF_BLOCKREDRAW;
- else
- hdrFlags &= ~HIF_BLOCKREDRAW;
- CallDefWndProc(WM_SETREDRAW, (WPARAM)!bBlock, 0L);
- if (FALSE != bBlock && -1 != unblockDelay)
- SetTimer(hwnd, TIMER_UNBLOCKREDRAW_ID, unblockDelay, NULL);
- }
- DWORD SkinnedHeader::GetSortArrowSize(void)
- {
- return MAKELPARAM(7, 8);
- }
- BOOL SkinnedHeader::DrawSortArrow(HDC hdc, RECT *prc, COLORREF rgbBk, COLORREF rgbFg, BOOL bAscending)
- {
- static HMLIMGLST hmlilSort = NULL;
- IMAGELISTDRAWPARAMS ildp;
- if (!hmlilSort)
- {
- DWORD arrowSize = GetSortArrowSize();
- hmlilSort = MLImageListI_Create(GET_X_LPARAM(arrowSize)*2, GET_Y_LPARAM(arrowSize), MLILC_COLOR24_I, 1, 1, 1, hmlifMngr);
- if (hmlilSort)
- {
- MLIMAGESOURCE_I mlis;
- ZeroMemory(&mlis, sizeof(MLIMAGESOURCE_I));
- mlis.type = SRC_TYPE_PNG_I;
- mlis.hInst = plugin.hDllInstance;
- mlis.lpszName = MAKEINTRESOURCEW(IDB_SORTARROW);
- MLImageListI_Add(hmlilSort, &mlis, MLIF_FILTER1_UID, 0);
- }
- }
- ZeroMemory(&ildp, sizeof(IMAGELISTDRAWPARAMS));
- ildp.cbSize = 56; // keep it hardcoded for now - otherwise brakes win2000. sizeof(IMAGELISTDRAWPARAMS);
- ildp.i = MLImageListI_GetRealIndex(hmlilSort, 0, rgbBk, rgbFg);
- if (-1 != ildp.i)
- {
- ildp.hdcDst = hdc;
- ildp.himl = MLImageListI_GetRealList(hmlilSort);
- ildp.cx = prc->right - prc->left;
- ildp.cy = prc->bottom - prc->top;
- ildp.x = prc->left;
- ildp.y = prc->top;
- ildp.fStyle = ILD_NORMAL;
- ildp.dwRop = SRCCOPY;
- ildp.xBitmap = (bAscending) ? ildp.cx : 0;
- return ImageList_DrawIndirect(&ildp);
- }
- return FALSE;
- }
- BOOL SkinnedHeader::DrawCloudIcon(HDC hdc, RECT *prc, COLORREF rgbBk, COLORREF rgbFg)
- {
- IMAGELISTDRAWPARAMS ildp;
- ZeroMemory(&ildp, sizeof(IMAGELISTDRAWPARAMS));
- ildp.cbSize = 56; // keep it hardcoded for now - otherwise brakes win2000. sizeof(IMAGELISTDRAWPARAMS);
- ildp.i = MLImageListI_GetRealIndex(hmlilCloud, 0, rgbBk, rgbFg);
- if (-1 != ildp.i)
- {
- ildp.hdcDst = hdc;
- ildp.himl = MLImageListI_GetRealList(hmlilCloud);
- ildp.cx = 16;
- ildp.cy = 16;
- ildp.x = prc->left - 7;
- ildp.y = prc->top - 4;
- ildp.fStyle = ILD_NORMAL;
- ildp.dwRop = SRCCOPY;
- ildp.xBitmap = 0;
- return ImageList_DrawIndirect(&ildp);
- }
- return FALSE;
- }
- void SkinnedHeader::DrawHeaderItem(LPNMCUSTOMDRAW pnmcd)
- {
- HPEN pen, penOld;
- HDC hdc;
- RECT *prc, rcText;
- INT textRight;
- INT ox, oy;
- hdc = pnmcd->hdc;
- prc = &pnmcd->rc;
- ox = (CDIS_SELECTED & pnmcd->uItemState) ? 1 : 0;
- oy = 0;
- SetBkColor(hdc, WADlg_getColor(WADLG_LISTHEADER_BGCOLOR));
- ExtTextOutW(hdc, 0, 0, ETO_OPAQUE, prc, L"", 0, 0);
- pen = (HPEN)MlStockObjects_Get((CDIS_SELECTED & pnmcd->uItemState) ? HEADERBOTTOM_PEN : HEADERTOP_PEN);
- penOld = (HPEN)SelectObject(hdc, pen);
- MoveToEx(hdc, prc->left, prc->top, NULL);
- LineTo(hdc, prc->right, prc->top);
- MoveToEx(hdc, prc->left, prc->top, NULL);
- LineTo(hdc, prc->left, prc->bottom);
- if (0 == (CDIS_SELECTED & pnmcd->uItemState))
- {
- SelectObject(hdc, penOld);
- pen = (HPEN)MlStockObjects_Get(HEADERBOTTOM_PEN);
- penOld = (HPEN)SelectObject(hdc, pen);
- }
- MoveToEx(hdc, prc->right - 1, prc->top, NULL);
- LineTo(hdc, prc->right - 1, prc->bottom);
- MoveToEx(hdc, prc->right - 1, prc->bottom - 1, NULL);
- LineTo(hdc, prc->left - 1, prc->bottom - 1);
- if (0 == (CDIS_SELECTED & pnmcd->uItemState))
- {
- SelectObject(hdc, penOld);
- pen = (HPEN)MlStockObjects_Get(HEADERMIDDLE_PEN);
- penOld = (HPEN)SelectObject(hdc, pen);
- MoveToEx(hdc, prc->right - 2, prc->top + 1, NULL);
- LineTo(hdc, prc->right - 2, prc->bottom - 2);
- MoveToEx(hdc, prc->right - 2, prc->bottom - 2, NULL);
- LineTo(hdc, prc->left, prc->bottom - 2);
- }
- textRight = prc->right - 5 + ox;
- if (LOWORD(hdrFlags) == pnmcd->dwItemSpec || pnmcd->dwItemSpec == cloudColumn)
- {
- RECT r;
- DWORD arrowSize;
- int dividerArea;
- arrowSize = GetSortArrowSize();
- SetRect(&r, 0, 0, GET_X_LPARAM(arrowSize), GET_Y_LPARAM(arrowSize));
- dividerArea = 4*GetSystemMetrics(SM_CXEDGE);
- OffsetRect(&r, prc->right - r.right - dividerArea, (((prc->bottom - prc->top) - r.bottom) + 1)/2);
- if (pnmcd->dwItemSpec != cloudColumn && (r.left > (prc->left + 16) && r.top > (prc->top + 2)))
- {
- if (DrawSortArrow(hdc, &r,
- WADlg_getColor(WADLG_LISTHEADER_BGCOLOR),
- WADlg_getColor(WADLG_LISTHEADER_FONTCOLOR),
- (HIF_ASCENDING & hdrFlags))) textRight = r.left - 3;
- }
- else if (pnmcd->dwItemSpec == cloudColumn)
- {
- if ((prc->right - prc->left) >= MLCloudColumnI_GetMinWidth())
- {
- DrawCloudIcon(hdc, &r,
- WADlg_getColor(WADLG_LISTHEADER_BGCOLOR),
- WADlg_getColor(WADLG_LISTHEADER_FONTCOLOR));
- }
- }
- }
- if (pnmcd->dwItemSpec != cloudColumn && (textRight > (prc->left + 4 + ox)))
- {
- WCHAR buffer[128] = {0};
- HDITEMW item;
- item.mask = HDI_TEXT | HDI_FORMAT;
- item.pszText = buffer;
- item.cchTextMax = sizeof(buffer)/sizeof(wchar_t) -1;
- if (CallPrevWndProc(HDM_GETITEMW, (WPARAM)pnmcd->dwItemSpec, (LPARAM)&item))
- {
- DWORD format;
- SetBkMode(hdc, TRANSPARENT);
- SetTextColor(hdc, WADlg_getColor(WADLG_LISTHEADER_FONTCOLOR));
- SetRect(&rcText, prc->left + 5 + ox, prc->top + 2 + oy, textRight, prc->bottom - 2);
- format = DT_VCENTER | DT_SINGLELINE | DT_LEFT | DT_NOCLIP;
- switch(HDF_JUSTIFYMASK & item.fmt)
- {
- case HDF_RIGHT: format |= DT_RIGHT; break;
- case HDF_CENTER: format |= DT_CENTER; break;
- }
- // because we draw with DT_NOCLIP, make sure we don't overhang to the right
- RECT testRect = rcText;
- DrawTextW(hdc, item.pszText, -1, &testRect, format | DT_CALCRECT);
- if (testRect.right > textRight)
- {
- format &= ~(HDF_JUSTIFYMASK | DT_NOCLIP);
- format |= DT_LEFT;
- if ((testRect.right - textRight) > 6)
- format |= DT_END_ELLIPSIS;
- }
- DrawTextW(hdc, item.pszText, -1, &rcText, format);
- }
- }
- SelectObject(hdc, penOld);
- }
- BOOL SkinnedHeader::OnCustomDraw(HWND hwndFrom, NMCUSTOMDRAW *pnmcd, LRESULT *pResult)
- {
- switch(pnmcd->dwDrawStage)
- {
- case CDDS_PREPAINT:
- *pResult = (SWS_USESKINCOLORS & style) ?
- CDRF_NOTIFYITEMDRAW :
- CDRF_DODEFAULT;
- return TRUE;
- case CDDS_ITEMPREPAINT:
- DrawHeaderItem(pnmcd);
- *pResult = CDRF_SKIPDEFAULT;
- return TRUE;
- }
- return FALSE;
- }
- UINT SkinnedHeader::SizeRuleAdjustOne(HDITEMW *phdi, INT index, UINT uMsg)
- {
- UINT result, flags;
-
- flags = hdrFlags;
- hdrFlags |= HIF_REALCXY;
- result = 0;
- if (index < hdrSize.count)
- {
- INT delta;
- delta = phdi->cxy - hdrSize.pCXY[index];
- hdrSize.hdi.mask = HDI_WIDTH;
- phdi = &hdrSize.hdi;
- if (delta)
- {
- if(CallPrevWndProc(HDM_GETITEMW, index + 1, (LPARAM)phdi))
- {
- INT temp = phdi->cxy;
- phdi->cxy -= delta;
- if (CallPrevWndProc(HDM_SETITEMW, index + 1, (LPARAM)phdi)) delta = temp - phdi->cxy;
- else delta = 0;
- }
- hdrSize.pCXY[index] += delta;
- result = 1;
- }
- }
- hdrFlags = flags;
- return result;
- }
- UINT SkinnedHeader::SizeRuleProportional(HDITEMW *phdi, INT index, UINT uMsg)
- {
- UINT flags;
- INT o, delta;
- if (index >= hdrSize.count ||
- hdrSize.lastCXY == phdi->cxy ||
- 0 == (phdi->cxy - hdrSize.pCXY[index]))
- {
- return 0;
- }
- flags = hdrFlags;
- hdrFlags |= HIF_REALCXY;
- delta = phdi->cxy - hdrSize.pCXY[index];
- hdrSize.lastCXY = phdi->cxy;
- for (o = 0; o < hdrSize.count; o++)
- {
- if (hdrSize.pOrder[o] == index)
- break;
- }
- phdi = &hdrSize.hdi;
- phdi->mask = HDI_WIDTH;
- for(++o; o < hdrSize.count && 0 != delta; o++)
- {
- INT i = hdrSize.pOrder[o];
- INT r = delta / (hdrSize.count - o) + ((delta % (hdrSize.count - o)) ? ((delta >0) ? 1 : -1) : 0);
- if (0 == r)
- r = delta;
- phdi->cxy = hdrSize.pCXY[i] - r;
- INT temp = phdi->cxy;
- CallPrevWndProc(HDM_SETITEMW, i, (LPARAM)phdi);
- delta -= r;
- // hdrSize.pCXY[i] = phdi->cxy;
- if (phdi->cxy != temp)
- delta += (phdi->cxy- temp);
- }
- hdrFlags = flags;
- return 1;
- }
- BOOL SkinnedHeader::OnBeginTrack(HWND hwndFrom, NMHEADERW *phdn, LRESULT *pResult)
- {
- if (HIF_DEFSIZERULE & hdrFlags) hdrSizeRule = GetDefaultSizeRule();
- KillTimer(hwnd, TIMER_ENDTRACK_ID);
- hdrSize.headerCXY = 0;
- hdrSize.lastCXY = -1;
- hdrSize.hwndParent = hwndFrom;
- hdrSize.count = (INT)CallPrevWndProc(HDM_GETITEMCOUNT, 0, 0L);
- if (hdrSize.count < 0) hdrSize.count = 0;
- if (hdrSize.count > 0)
- {
- HDITEMW item;
- if (hdrSize.count > hdrSize.allocated)
- {
- VOID *data;
- data = realloc(hdrSize.pCXY, sizeof(INT)*hdrSize.count*2);
- if (data)
- {
- hdrSize.pCXY = (INT*)data;
- hdrSize.pOrder = hdrSize.pCXY + hdrSize.count;
- hdrSize.allocated = hdrSize.count;
- }
- if (!data) hdrSize.count = 0;
- }
- if (hdrSize.count)
- {
- INT i;
- if (!CallPrevWndProc(HDM_GETORDERARRAY, hdrSize.count, (LPARAM)hdrSize.pOrder))
- {
- for (i = 0; i < hdrSize.count; i++) hdrSize.pOrder[i] = i;
- }
- item.mask = HDI_WIDTH;
- for (INT o = 0; o < hdrSize.count; o++)
- {
- i = hdrSize.pOrder[o];
- if (SendMessageW(hwnd, HDM_GETITEMW, i, (LPARAM)&item) && item.lParam)
- {
- hdrSize.pCXY[i] = item.cxy;
- hdrSize.headerCXY += item.cxy;
- }
- }
- }
- }
- return FALSE;
- }
- BOOL SkinnedHeader::OnEndTrack(HWND hwndFrom, NMHEADERW *phdn)
- {
- if (hdrSize.count)
- {
- BlockRedraw(FALSE, 0);
- hdrFlags &= ~(HIF_BLOCKCHANGING | HIF_BLOCKCHANGED);
- SetTimer(hwnd, TIMER_ENDTRACK_ID, TIMER_ENDTRACK_DELAY, NULL);
- }
- return FALSE;
- }
- BOOL SkinnedHeader::OnItemChanging(HWND hwndFrom, NMHEADERW *phdn, LRESULT *pResult)
- {
- if (HIF_BLOCKCHANGING & hdrFlags)
- {
- *pResult = FALSE;
- return TRUE;
- }
- if (0 != hdrSize.count &&
- 0 == (HIF_REALCXY & hdrFlags))
- {
- switch(hdrSizeRule)
- {
- case SHS_SIZERULE_ADJUSTONE:
- case SHS_SIZERULE_PROPORTIONAL:
- case SHS_SIZERULE_ADJUSTALL:
- BlockRedraw(TRUE, 10);
- break;
- }
- }
- return FALSE;
- }
- BOOL SkinnedHeader::OnItemChanged(HWND hwndFrom, NMHEADERW *phdn)
- {
- UINT result;
- if (HIF_BLOCKCHANGED & hdrFlags)
- return TRUE;
- if((HIF_REALCXY & hdrFlags) || !phdn->pitem || 0== (HDI_WIDTH & phdn->pitem->mask))
- return FALSE;
-
- hdrFlags |= HIF_BLOCKCHANGED;
- switch(hdrSizeRule)
- {
- case SHS_SIZERULE_ADJUSTONE: result = SizeRuleAdjustOne(phdn->pitem, phdn->iItem, phdn->hdr.code); break;
- case SHS_SIZERULE_PROPORTIONAL: result = SizeRuleProportional(phdn->pitem, phdn->iItem, phdn->hdr.code); break;
- case SHS_SIZERULE_ADJUSTALL: result = 0; break;
- default: result = 0; break;
- }
- hdrFlags &= ~HIF_BLOCKCHANGED;
- if (result)
- {
- if(hdrSize.count)
- {
- INT i;
- HDITEMW item;
- item.mask = HDI_WIDTH;
- i = hdrSize.pOrder[hdrSize.count - 1];
- if (CallPrevWndProc(HDM_GETITEMW, i, (LPARAM)&item))
- {
- long cxy = item.cxy;
- hdrFlags |= (HIF_BLOCKCHANGING | HIF_BLOCKCHANGED | HIF_REALCXY);
- item.cxy = cxy + 1;
- CallPrevWndProc(HDM_SETITEMW, i, (LPARAM)&item);
- hdrFlags &= ~(HIF_BLOCKCHANGING | HIF_BLOCKCHANGED);
- item.cxy = cxy;
- CallPrevWndProc(HDM_SETITEMW, i, (LPARAM)&item);
- hdrFlags &= ~HIF_REALCXY;
- }
- }
- BlockRedraw(FALSE, 0);
- if (NULL != hdrSize.hwndParent)
- {
- RedrawWindow(hdrSize.hwndParent, NULL, NULL,
- RDW_INVALIDATE | RDW_UPDATENOW | RDW_ERASENOW | RDW_ALLCHILDREN/*| RDW_VALIDATE*/);
- }
- else
- RedrawWindow(hwnd, NULL, NULL,
- RDW_INVALIDATE | RDW_UPDATENOW | RDW_ERASENOW | RDW_ALLCHILDREN/*| RDW_VALIDATE*/);
- return TRUE;
- }
- return FALSE;
- }
- BOOL SkinnedHeader::OnCursorNotify(HWND hwndFrom, NMMOUSE *pnm, LRESULT *pResult)
- {
- if (0 == ((HHT_ONDIVIDER | HHT_ONDIVOPEN)& pnm->dwHitInfo) && (SWS_USESKINCURSORS & style) && hcurNormal)
- {
- SetCursor(hcurNormal);
- *pResult = TRUE;
- return TRUE;
- }
- return FALSE;
- }
- BOOL SkinnedHeader::OnReflectedNotify(INT idCtrl, REFLECTPARAM *rParam)
- {
- if (rParam->hwndFrom != GetParent(hwnd)) return FALSE; // controls such as listview forward headers notifications to they parent.
- switch(((NMHDR*)(rParam->lParam))->code)
- {
- case NM_CUSTOMDRAW: return OnCustomDraw(rParam->hwndFrom, (NMCUSTOMDRAW*)rParam->lParam, &rParam->result);
- case HDN_ITEMCHANGINGA:
- case HDN_ITEMCHANGINGW: return OnItemChanging(rParam->hwndFrom, (NMHEADERW*)rParam->lParam, &rParam->result);
- case HDN_ITEMCHANGEDA:
- case HDN_ITEMCHANGEDW: return OnItemChanged(rParam->hwndFrom, (NMHEADERW*)rParam->lParam);
- case HDN_BEGINTRACKA:
- case HDN_BEGINTRACKW: return OnBeginTrack(rParam->hwndFrom, (NMHEADERW*)rParam->lParam, &rParam->result);
- case HDN_ENDTRACKA:
- case HDN_ENDTRACKW: return OnEndTrack(rParam->hwndFrom, (NMHEADERW*)rParam->lParam);
- case NM_SETCURSOR: return OnCursorNotify(rParam->hwndFrom, (NMMOUSE*)rParam->lParam, &rParam->result);
- }
- return FALSE;
- }
- void SkinnedHeader::OnPaint(void)
- {
- if (HIF_BLOCKREDRAW & hdrFlags)
- {
- ValidateRgn(hwnd, NULL);
- }
- else if (SWS_USESKINCOLORS & style)
- {
- //process the grey area with our color
- RECT rc, ri;
- int i;
- GetClientRect(hwnd, &rc);
- i = (INT)CallPrevWndProc(HDM_GETITEMCOUNT, 0, 0L);
- if(i > 0)
- {
- Header_GetItemRect(hwnd, (INT)CallPrevWndProc(HDM_ORDERTOINDEX, (i-1), 0L), &ri);
- rc.left = ri.right;
- }
- if(rc.left < rc.right && GetUpdateRect(hwnd, &ri, FALSE) && IntersectRect(&rc, &rc, &ri))
- {
- UINT flags = DCX_PARENTCLIP | DCX_CACHE | DCX_CLIPSIBLINGS | DCX_CLIPCHILDREN |
- DCX_INTERSECTUPDATE | DCX_VALIDATE;
- HDC hdc = GetDCEx(hwnd, NULL, flags);
- if(hdc)
- {
- COLORREF rgbBkOld;
- rgbBkOld = SetBkColor(hdc, WADlg_getColor(WADLG_LISTHEADER_EMPTY_BGCOLOR));
- ExtTextOutW(hdc, 0, 0, ETO_OPAQUE, &rc, L"", 0, 0);
- SetBkColor(hdc, rgbBkOld);
- ReleaseDC(hwnd, hdc);
- ValidateRect(hwnd, &rc);
- }
- }
- }
- }
- void SkinnedHeader::OnTimer(UINT_PTR nIDEvent, TIMERPROC lpTimerFunc)
- {
- switch (nIDEvent)
- {
- case TIMER_UNBLOCKREDRAW_ID:
- BlockRedraw(FALSE, 0);
- return;
- case TIMER_ENDTRACK_ID:
- KillTimer(hwnd, TIMER_ENDTRACK_ID);
- hdrSize.count = 0;
- hdrSize.headerCXY = 0;
- hdrSize.lastCXY = -1;
- return;
- }
- __super::WindowProc(WM_TIMER, (WPARAM)nIDEvent, (LPARAM)lpTimerFunc);
- }
- void SkinnedHeader::SetHeight(INT nHeight)
- {
- RECT rw;
- GetWindowRect(hwnd, &rw);
- if (nHeight < 0)
- {
- HDC hdc;
- hdc = GetWindowDC(hwnd);
- if (hdc)
- {
- HFONT hfnt;
- hfnt = (HFONT)CallPrevWndProc(WM_GETFONT, 0, 0L);
- if (!hfnt) hfnt = (HFONT)MlStockObjects_Get(DEFAULT_FONT);
- if (hfnt)
- {
- TEXTMETRICW tm = {0};
- HFONT hfntOld = (HFONT)SelectObject(hdc, hfnt);
- if (GetTextMetricsW(hdc, &tm)) nHeight = tm.tmHeight + 6/*Borders*/;
- SelectObject(hdc, hfntOld);
- }
- ReleaseDC(hwnd, hdc);
- }
- }
- if (nHeight != (rw.bottom - rw.top))
- {
- INT i;
- SetWindowPos(hwnd, NULL, 0, 0, rw.right - rw.left, nHeight, SWP_NOACTIVATE | SWP_NOMOVE | SWP_NOZORDER);
- if (HDS_HIDDEN & GetWindowLongPtrW(hwnd, GWL_STYLE)) return;
- i = (INT)CallPrevWndProc(HDM_GETITEMCOUNT, 0, 0L);
- if(i > 0)
- {
- HDITEMW item;
- i = (INT)CallPrevWndProc(HDM_ORDERTOINDEX, (i-1), 0L);
- item.mask = HDI_WIDTH;
- if (CallPrevWndProc(HDM_GETITEMW, i, (LPARAM)&item))
- {
- hdrFlags |= (HIF_BLOCKCHANGING | HIF_BLOCKCHANGED | HIF_REALCXY);
- item.cxy++; CallPrevWndProc(HDM_SETITEMW, i, (LPARAM)&item);
- hdrFlags &= ~(HIF_BLOCKCHANGING | HIF_BLOCKCHANGED);
- item.cxy--; CallPrevWndProc(HDM_SETITEMW, i, (LPARAM)&item);
- hdrFlags &= ~HIF_REALCXY;
- }
- }
- }
- }
- BOOL SkinnedHeader::OnLayout(HDLAYOUT *pLayout)
- {
- BOOL result;
- result = (BOOL)__super::WindowProc(HDM_LAYOUT, 0, (LPARAM)pLayout);
- if (0 == (HDS_HIDDEN & GetWindowLongPtrW(hwnd, GWL_STYLE)))
- {
- RECT rw;
- GetWindowRect(hwnd, &rw);
- OffsetRect(&rw, -rw.left, -rw.top);
- pLayout->pwpos->cy= rw.bottom;
- pLayout->prc->top = rw.bottom;
- if (GetClientRect(GetParent(hwnd), &rw))
- pLayout->pwpos->cx = (rw.right - rw.left) - pLayout->pwpos->x;
- }
- return result;
- }
- BOOL SkinnedHeader::OnSetCursor(HWND hwdCursor, UINT hitTest, UINT message)
- {
- static HDCURSOR hdrCursor;
- hdrCursor.hwndParent = GetParent(hwnd);
- if (hdrCursor.hwndParent)
- {
- hdrCursor.nm.hdr.code = NM_SETCURSOR;
- hdrCursor.nm.hdr.hwndFrom = hwnd;
- hdrCursor.nm.hdr.idFrom = GetDlgCtrlID(hwnd);
- hdrCursor.pts = GetMessagePos();
- POINTSTOPOINT(hdrCursor.nm.pt, hdrCursor.pts);
- hdrCursor.hitTest.pt = hdrCursor.nm.pt;
- MapWindowPoints(HWND_DESKTOP, hwnd, &hdrCursor.hitTest.pt, 1);
- CallPrevWndProc(HDM_HITTEST, 0, (LPARAM)&hdrCursor.hitTest);
- hdrCursor.nm.dwItemSpec = hdrCursor.hitTest.iItem;
- hdrCursor.nm.dwHitInfo = hdrCursor.hitTest.flags;
- if (SendMessage(hdrCursor.hwndParent, WM_NOTIFY, (WPARAM)hdrCursor.nm.hdr.code, (LPARAM)&hdrCursor.nm))
- return TRUE;
- }
- return (BOOL)__super::WindowProc(WM_SETCURSOR, (WPARAM)hwdCursor, MAKELPARAM(hitTest, message));
- }
- LRESULT SkinnedHeader::OnSetItem(INT iIndex, HDITEMW *phdItem, BOOL bUnicode)
- {
- if (NULL != phdItem &&
- 0 != (HDI_FORMAT & phdItem->mask))
- {
- DWORD newFlags = 0x0000FFFF | (hdrFlags & (0xFFFF0000 & ~HIF_ASCENDING));
- if (0 != ((HDF_SORTDOWN | HDF_SORTUP) & phdItem->fmt) &&
- iIndex >= 0 && iIndex < 0xFFFF)
- {
- newFlags = (newFlags & 0xFFFF0000) | (0xFFFF & iIndex);
- if (0 != (HDF_SORTUP & phdItem->fmt))
- newFlags |= HIF_ASCENDING;
- }
- if ((LOWORD(newFlags) != LOWORD(hdrFlags)) ||
- ((HIF_ASCENDING & newFlags) != (HIF_ASCENDING & hdrFlags)))
- {
- hdrFlags = newFlags;
- RECT rcItem;
- if (NULL != CallPrevWndProc(HDM_GETITEMRECT, (WPARAM)iIndex, (LPARAM)&rcItem))
- {
- InvalidateRect(hwnd, &rcItem, FALSE);
- }
- }
- }
- return __super::WindowProc(((bUnicode) ? HDM_SETITEMW : HDM_SETITEMA), (WPARAM)iIndex, (LPARAM)phdItem);
- }
- BOOL SkinnedHeader::OnMediaLibraryIPC(INT msg, INT_PTR param, LRESULT *pResult)
- {
- switch(msg)
- {
- case ML_IPC_SKINNEDHEADER_DISPLAYSORT:
- hdrFlags = (hdrFlags & 0xFFFF0000) | LOWORD(param);
- hdrFlags = (hdrFlags & ~HIF_ASCENDING) | ((HIWORD(param)) ? HIF_ASCENDING : 0);
- *pResult = 1;
- InvalidateRect(hwnd, NULL, FALSE);
- UpdateWindow(hwnd);
- return TRUE;
- case ML_IPC_SKINNEDHEADER_SETHEIGHT: SetHeight((INT)param); *pResult = TRUE; return TRUE;
- case ML_IPC_SKINNEDHEADER_GETSORT: *pResult = MAKELONG(LOWORD(hdrFlags), 0 != (HIF_ASCENDING & hdrFlags)); return TRUE;
- case ML_IPC_SKINNEDHEADER_SETCLOUDCOLUMN:
- cloudColumn = (INT)param;
- InvalidateRect(hwnd, NULL, FALSE);
- UpdateWindow(hwnd);
- return TRUE;
- }
- return __super::OnMediaLibraryIPC(msg, param, pResult);
- }
- LRESULT SkinnedHeader::WindowProc(UINT uMsg, WPARAM wParam, LPARAM lParam)
- {
- switch(uMsg)
- {
- case WM_ERASEBKGND: return 1;
- case WM_PAINT: OnPaint(); break;
- case WM_TIMER: OnTimer((UINT_PTR)wParam, (TIMERPROC)lParam); return 0;
- case WM_SETCURSOR: return OnSetCursor((HWND)wParam, LOWORD(lParam), HIWORD(lParam));
- case WM_CAPTURECHANGED: InvalidateRect(hwnd, NULL, TRUE); break;
- case WM_WINDOWPOSCHANGING: if (HIF_BLOCKWNDPOS & hdrFlags) return TRUE;
- break;
- case REFLECTED_NOTIFY: return OnReflectedNotify((INT)wParam, (REFLECTPARAM*)lParam);
- case HDM_LAYOUT: return OnLayout((LPHDLAYOUT)lParam);
- case HDM_SETITEMA:
- case HDM_SETITEMW:
- return OnSetItem((INT)wParam, (HDITEMW*)lParam, (HDM_SETITEMW == uMsg));
- }
- return __super::WindowProc(uMsg, wParam, lParam);
- }
|