[PATCH v5 2/7] shell32/autocomplete: Move the autocomplete processing to a separate function
Huw Davies
huw at codeweavers.com
Thu Sep 13 05:34:07 CDT 2018
On Wed, Sep 12, 2018 at 10:42:16PM +0300, Gabriel Ivăncescu wrote:
> Signed-off-by: Gabriel Ivăncescu <gabrielopcode at gmail.com>
> ---
> dlls/shell32/autocomplete.c | 135 ++++++++++++++++++++++++--------------------
> 1 file changed, 73 insertions(+), 62 deletions(-)
This wasn't exactly what I was expecting. What I'd hoped to see was
the entire WM_KEYUP handler moved to a helper function, not half of
it. [FWIW, renaming variable and re-formatting the code in the new
helper is a good plan].
After you do that, I then suggest pulling the code that deals with the
displayall stuff into a sub-helper---this is most of the code that you
have in autocomplete_text().
Huw.
> diff --git a/dlls/shell32/autocomplete.c b/dlls/shell32/autocomplete.c
> index 9f35ff7..63fdf3d 100644
> --- a/dlls/shell32/autocomplete.c
> +++ b/dlls/shell32/autocomplete.c
> @@ -119,6 +119,76 @@ static size_t format_quick_complete(WCHAR *dst, const WCHAR *qc, const WCHAR *st
> return dst - base;
> }
>
> +static void autocomplete_text(IAutoCompleteImpl *ac, WCHAR *text, UINT len, HWND hwnd, BOOL displayall)
> +{
> + HRESULT hr;
> + UINT cpt;
> +
> + SendMessageW(ac->hwndListBox, LB_RESETCONTENT, 0, 0);
> +
> + /* Set txtbackup to point to text itself (which must not be released) */
> + heap_free(ac->txtbackup);
> + ac->txtbackup = text;
> +
> + if (!displayall && !len)
> + return;
> +
> + IEnumString_Reset(ac->enumstr);
> + for(cpt = 0;;)
> + {
> + LPOLESTR strs = NULL;
> + ULONG fetched;
> +
> + hr = IEnumString_Next(ac->enumstr, 1, &strs, &fetched);
> + if (hr != S_OK)
> + break;
> +
> + if (!strncmpiW(text, strs, len))
> + {
> + if (cpt == 0 && (ac->options & ACO_AUTOAPPEND))
> + {
> + WCHAR buffW[255];
> +
> + strcpyW(buffW, text);
> + strcatW(buffW, &strs[len]);
> + SetWindowTextW(hwnd, buffW);
> + SendMessageW(hwnd, EM_SETSEL, len, strlenW(strs));
> + if (!(ac->options & ACO_AUTOSUGGEST))
> + {
> + CoTaskMemFree(strs);
> + break;
> + }
> + }
> +
> + if (ac->options & ACO_AUTOSUGGEST)
> + SendMessageW(ac->hwndListBox, LB_ADDSTRING, 0, (LPARAM)strs);
> +
> + cpt++;
> + }
> +
> + CoTaskMemFree(strs);
> + }
> +
> + if (ac->options & ACO_AUTOSUGGEST)
> + {
> + if (cpt)
> + {
> + RECT r;
> + UINT height = SendMessageW(ac->hwndListBox, LB_GETITEMHEIGHT, 0, 0);
> + SendMessageW(ac->hwndListBox, LB_CARETOFF, 0, 0);
> + GetWindowRect(hwnd, &r);
> + SetParent(ac->hwndListBox, HWND_DESKTOP);
> + /* It seems that Windows XP displays 7 lines at most
> + and otherwise displays a vertical scroll bar */
> + SetWindowPos(ac->hwndListBox, HWND_TOP,
> + r.left, r.bottom + 1, r.right - r.left, min(height * 7, height*(cpt+1)),
> + SWP_SHOWWINDOW );
> + }
> + else
> + ShowWindow(ac->hwndListBox, SW_HIDE);
> + }
> +}
> +
> static void destroy_autocomplete_object(IAutoCompleteImpl *ac)
> {
> ac->hwndEdit = NULL;
> @@ -133,12 +203,9 @@ static void destroy_autocomplete_object(IAutoCompleteImpl *ac)
> static LRESULT APIENTRY ACEditSubclassProc(HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam)
> {
> IAutoCompleteImpl *This = GetPropW(hwnd, autocomplete_propertyW);
> - HRESULT hr;
> WCHAR *hwndText;
> - UINT len, size, cpt;
> - RECT r;
> + UINT len, size;
> BOOL displayall = FALSE;
> - int height, sel;
>
> if (!This->enabled) return CallWindowProcW(This->wpOrigEditProc, hwnd, uMsg, wParam, lParam);
>
> @@ -201,7 +268,7 @@ static LRESULT APIENTRY ACEditSubclassProc(HWND hwnd, UINT uMsg, WPARAM wParam,
> } else {
> heap_free(hwndText);
> if (IsWindowVisible(This->hwndListBox)) {
> - int count;
> + int count, sel;
>
> count = SendMessageW(This->hwndListBox, LB_GETCOUNT, 0, 0);
> /* Change the selection */
> @@ -245,63 +312,7 @@ static LRESULT APIENTRY ACEditSubclassProc(HWND hwnd, UINT uMsg, WPARAM wParam,
> if (len + 1 != size)
> hwndText = heap_realloc(hwndText, (len + 1) * sizeof(WCHAR));
>
> - SendMessageW(This->hwndListBox, LB_RESETCONTENT, 0, 0);
> -
> - /* Set txtbackup to point to hwndText itself (which must not be released) */
> - heap_free(This->txtbackup);
> - This->txtbackup = hwndText;
> -
> - if (!displayall && !len)
> - break;
> -
> - IEnumString_Reset(This->enumstr);
> - for(cpt = 0;;) {
> - LPOLESTR strs = NULL;
> - ULONG fetched;
> -
> - hr = IEnumString_Next(This->enumstr, 1, &strs, &fetched);
> - if (hr != S_OK)
> - break;
> -
> - if (!strncmpiW(hwndText, strs, len)) {
> - if (cpt == 0 && (This->options & ACO_AUTOAPPEND)) {
> - WCHAR buffW[255];
> -
> - strcpyW(buffW, hwndText);
> - strcatW(buffW, &strs[len]);
> - SetWindowTextW(hwnd, buffW);
> - SendMessageW(hwnd, EM_SETSEL, len, strlenW(strs));
> - if (!(This->options & ACO_AUTOSUGGEST)) {
> - CoTaskMemFree(strs);
> - break;
> - }
> - }
> -
> - if (This->options & ACO_AUTOSUGGEST)
> - SendMessageW(This->hwndListBox, LB_ADDSTRING, 0, (LPARAM)strs);
> -
> - cpt++;
> - }
> -
> - CoTaskMemFree(strs);
> - }
> -
> - if (This->options & ACO_AUTOSUGGEST) {
> - if (cpt) {
> - height = SendMessageW(This->hwndListBox, LB_GETITEMHEIGHT, 0, 0);
> - SendMessageW(This->hwndListBox, LB_CARETOFF, 0, 0);
> - GetWindowRect(hwnd, &r);
> - SetParent(This->hwndListBox, HWND_DESKTOP);
> - /* It seems that Windows XP displays 7 lines at most
> - and otherwise displays a vertical scroll bar */
> - SetWindowPos(This->hwndListBox, HWND_TOP,
> - r.left, r.bottom + 1, r.right - r.left, min(height * 7, height*(cpt+1)),
> - SWP_SHOWWINDOW );
> - } else {
> - ShowWindow(This->hwndListBox, SW_HIDE);
> - }
> - }
> -
> + autocomplete_text(This, hwndText, len, hwnd, displayall);
> break;
> case WM_DESTROY:
> {
> --
> 1.9.1
>
>
>
More information about the wine-devel
mailing list