Files
foobar2000-sdk/libPPUI/TypeFind.cpp
2021-12-14 00:28:25 -07:00

54 lines
1.8 KiB
C++

#include "stdafx.h"
#include "TypeFind.h"
#include "SmartStrStr.h"
static size_t _ItemCount(HWND wnd) {
return ListView_GetItemCount(wnd);
}
static const wchar_t * _ItemText(wchar_t * buffer, int bufSize, HWND wnd, size_t index, int subItem) {
NMLVDISPINFO info = {};
info.hdr.code = LVN_GETDISPINFO;
info.hdr.idFrom = GetDlgCtrlID(wnd);
info.hdr.hwndFrom = wnd;
info.item.iItem = (int) index;
info.item.iSubItem = subItem;
info.item.mask = LVIF_TEXT;
info.item.pszText = buffer;
info.item.cchTextMax = bufSize;
::SendMessage(::GetParent(wnd), WM_NOTIFY, info.hdr.idFrom, reinterpret_cast<LPARAM>(&info));
if (info.item.pszText == NULL) return L"";
if ( bufSize > 0 && info.item.pszText == buffer ) buffer[ bufSize - 1 ] = 0;
return info.item.pszText;
}
LRESULT TypeFind::Handler(NMHDR* hdr, int subItemFrom, int subItemCnt) {
NMLVFINDITEM * info = reinterpret_cast<NMLVFINDITEM*>(hdr);
const HWND wnd = hdr->hwndFrom;
if (info->lvfi.flags & LVFI_NEARESTXY) return -1;
const size_t count = _ItemCount(wnd);
if (count == 0) return -1;
const size_t base = (size_t)info->iStart % count;
static SmartStrStr tool;
enum {
bufSize = 1024,
};
wchar_t textBuf[bufSize];
for (size_t walk = 0; walk < count; ++walk) {
const size_t index = (walk + base) % count;
for (int subItem = subItemFrom; subItem < subItemFrom + subItemCnt; ++subItem) {
if (tool.matchHereW(_ItemText(textBuf, bufSize, wnd, index, subItem), info->lvfi.psz)) return (LRESULT)index;
}
}
for (size_t walk = 0; walk < count; ++walk) {
const size_t index = (walk + base) % count;
for (int subItem = subItemFrom; subItem < subItemFrom + subItemCnt; ++subItem) {
if (tool.strStrEndW(_ItemText(textBuf, bufSize, wnd, index, subItem), info->lvfi.psz)) return (LRESULT)index;
}
}
return -1;
}