mirror of
https://github.com/reactos/reactos.git
synced 2025-08-05 21:23:05 +00:00
[SHELL32] Initial implement SHLimitInputEdit (#2323)
Popup balloon window is not implemented yet. CORE-11701
This commit is contained in:
parent
48160c74b7
commit
c6ed215eef
2 changed files with 179 additions and 12 deletions
|
@ -36,17 +36,6 @@ SHFindComputer(LPCITEMIDLIST pidl1, LPCITEMIDLIST pidl2)
|
||||||
return FALSE;
|
return FALSE;
|
||||||
}
|
}
|
||||||
|
|
||||||
/*
|
|
||||||
* Unimplemented
|
|
||||||
*/
|
|
||||||
EXTERN_C HRESULT
|
|
||||||
WINAPI
|
|
||||||
SHLimitInputEdit(HWND hWnd, IShellFolder *psf)
|
|
||||||
{
|
|
||||||
FIXME("SHLimitInputEdit() stub\n");
|
|
||||||
return S_FALSE;
|
|
||||||
}
|
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Unimplemented
|
* Unimplemented
|
||||||
*/
|
*/
|
||||||
|
|
|
@ -2148,3 +2148,181 @@ BOOL WINAPI IsUserAnAdmin(VOID)
|
||||||
{
|
{
|
||||||
return SHTestTokenMembership(NULL, DOMAIN_ALIAS_RID_ADMINS);
|
return SHTestTokenMembership(NULL, DOMAIN_ALIAS_RID_ADMINS);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/*************************************************************************
|
||||||
|
* SHLimitInputEdit(SHELL32.@)
|
||||||
|
*/
|
||||||
|
|
||||||
|
/* TODO: Show baloon popup window using SetWindowRgn */
|
||||||
|
|
||||||
|
typedef struct UxSubclassInfo
|
||||||
|
{
|
||||||
|
HWND hwnd;
|
||||||
|
WNDPROC fnWndProc;
|
||||||
|
LPWSTR pwszValidChars;
|
||||||
|
LPWSTR pwszInvalidChars;
|
||||||
|
} UxSubclassInfo;
|
||||||
|
|
||||||
|
static void
|
||||||
|
UxSubclassInfo_Destroy(UxSubclassInfo *pInfo)
|
||||||
|
{
|
||||||
|
if (!pInfo)
|
||||||
|
return;
|
||||||
|
|
||||||
|
RemovePropW(pInfo->hwnd, L"UxSubclassInfo");
|
||||||
|
|
||||||
|
CoTaskMemFree(pInfo->pwszValidChars);
|
||||||
|
CoTaskMemFree(pInfo->pwszInvalidChars);
|
||||||
|
|
||||||
|
SetWindowLongPtr(pInfo->hwnd, GWLP_WNDPROC, (LONG_PTR)pInfo->fnWndProc);
|
||||||
|
|
||||||
|
HeapFree(GetProcessHeap(), 0, pInfo);
|
||||||
|
}
|
||||||
|
|
||||||
|
static LRESULT CALLBACK
|
||||||
|
LimitEditWindowProc(HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam)
|
||||||
|
{
|
||||||
|
WNDPROC fnWndProc;
|
||||||
|
UxSubclassInfo *pInfo = GetPropW(hwnd, L"UxSubclassInfo");
|
||||||
|
if (!pInfo)
|
||||||
|
return DefWindowProc(hwnd, uMsg, wParam, lParam);
|
||||||
|
|
||||||
|
fnWndProc = pInfo->fnWndProc;
|
||||||
|
|
||||||
|
switch (uMsg)
|
||||||
|
{
|
||||||
|
case WM_CHAR:
|
||||||
|
{
|
||||||
|
if (pInfo->pwszInvalidChars)
|
||||||
|
{
|
||||||
|
if (wcschr(pInfo->pwszInvalidChars, (WCHAR)wParam) != NULL)
|
||||||
|
{
|
||||||
|
MessageBeep(0xFFFFFFFF);
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else if (pInfo->pwszValidChars)
|
||||||
|
{
|
||||||
|
if (wcschr(pInfo->pwszValidChars, (WCHAR)wParam) == NULL)
|
||||||
|
{
|
||||||
|
MessageBeep(0xFFFFFFFF);
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return fnWndProc(hwnd, uMsg, wParam, lParam);
|
||||||
|
}
|
||||||
|
|
||||||
|
case WM_IME_CHAR:
|
||||||
|
{
|
||||||
|
WCHAR wch = (WCHAR)wParam;
|
||||||
|
if (!IsWindowUnicode(hwnd) && HIBYTE(wch) != 0)
|
||||||
|
{
|
||||||
|
CHAR data[] = {HIBYTE(wch), LOBYTE(wch)};
|
||||||
|
MultiByteToWideChar(CP_ACP, 0, data, 2, &wch, 1);
|
||||||
|
}
|
||||||
|
|
||||||
|
if (pInfo->pwszInvalidChars)
|
||||||
|
{
|
||||||
|
if (wcschr(pInfo->pwszInvalidChars, wch) != NULL)
|
||||||
|
{
|
||||||
|
MessageBeep(0xFFFFFFFF);
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else if (pInfo->pwszValidChars)
|
||||||
|
{
|
||||||
|
if (wcschr(pInfo->pwszValidChars, wch) == NULL)
|
||||||
|
{
|
||||||
|
MessageBeep(0xFFFFFFFF);
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return fnWndProc(hwnd, uMsg, wParam, lParam);
|
||||||
|
}
|
||||||
|
|
||||||
|
case WM_NCDESTROY:
|
||||||
|
{
|
||||||
|
UxSubclassInfo_Destroy(pInfo);
|
||||||
|
return fnWndProc(hwnd, uMsg, wParam, lParam);
|
||||||
|
}
|
||||||
|
|
||||||
|
default:
|
||||||
|
return fnWndProc(hwnd, uMsg, wParam, lParam);
|
||||||
|
}
|
||||||
|
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
static UxSubclassInfo *
|
||||||
|
UxSubclassInfo_Create(HWND hwnd, LPWSTR valid, LPWSTR invalid)
|
||||||
|
{
|
||||||
|
UxSubclassInfo *pInfo;
|
||||||
|
pInfo = HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, sizeof(UxSubclassInfo));
|
||||||
|
if (!pInfo)
|
||||||
|
{
|
||||||
|
ERR("HeapAlloc failed.\n");
|
||||||
|
CoTaskMemFree(valid);
|
||||||
|
CoTaskMemFree(invalid);
|
||||||
|
return NULL;
|
||||||
|
}
|
||||||
|
|
||||||
|
pInfo->fnWndProc = (WNDPROC)SetWindowLongPtr(hwnd, GWLP_WNDPROC, (LONG_PTR)LimitEditWindowProc);
|
||||||
|
if (!pInfo->fnWndProc)
|
||||||
|
{
|
||||||
|
ERR("SetWindowLongPtr failed\n");
|
||||||
|
CoTaskMemFree(valid);
|
||||||
|
CoTaskMemFree(invalid);
|
||||||
|
HeapFree(GetProcessHeap(), 0, pInfo);
|
||||||
|
return NULL;
|
||||||
|
}
|
||||||
|
|
||||||
|
pInfo->hwnd = hwnd;
|
||||||
|
pInfo->pwszValidChars = valid;
|
||||||
|
pInfo->pwszInvalidChars = invalid;
|
||||||
|
if (!SetPropW(hwnd, L"UxSubclassInfo", pInfo))
|
||||||
|
{
|
||||||
|
UxSubclassInfo_Destroy(pInfo);
|
||||||
|
pInfo = NULL;
|
||||||
|
}
|
||||||
|
return pInfo;
|
||||||
|
}
|
||||||
|
|
||||||
|
HRESULT WINAPI
|
||||||
|
SHLimitInputEdit(HWND hWnd, IShellFolder *psf)
|
||||||
|
{
|
||||||
|
IItemNameLimits *pLimits;
|
||||||
|
HRESULT hr;
|
||||||
|
LPWSTR pwszValidChars, pwszInvalidChars;
|
||||||
|
UxSubclassInfo *pInfo;
|
||||||
|
|
||||||
|
pInfo = GetPropW(hWnd, L"UxSubclassInfo");
|
||||||
|
if (pInfo)
|
||||||
|
{
|
||||||
|
UxSubclassInfo_Destroy(pInfo);
|
||||||
|
pInfo = NULL;
|
||||||
|
}
|
||||||
|
|
||||||
|
hr = psf->lpVtbl->QueryInterface(psf, &IID_IItemNameLimits, (LPVOID *)&pLimits);
|
||||||
|
if (FAILED(hr))
|
||||||
|
{
|
||||||
|
ERR("hr: %x\n", hr);
|
||||||
|
return hr;
|
||||||
|
}
|
||||||
|
|
||||||
|
pwszValidChars = pwszInvalidChars = NULL;
|
||||||
|
hr = pLimits->lpVtbl->GetValidCharacters(pLimits, &pwszValidChars, &pwszInvalidChars);
|
||||||
|
if (FAILED(hr))
|
||||||
|
{
|
||||||
|
ERR("hr: %x\n", hr);
|
||||||
|
pLimits->lpVtbl->Release(pLimits);
|
||||||
|
return hr;
|
||||||
|
}
|
||||||
|
|
||||||
|
pInfo = UxSubclassInfo_Create(hWnd, pwszValidChars, pwszInvalidChars);
|
||||||
|
if (!pInfo)
|
||||||
|
hr = E_FAIL;
|
||||||
|
|
||||||
|
pLimits->lpVtbl->Release(pLimits);
|
||||||
|
|
||||||
|
return hr;
|
||||||
|
}
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue