ReactOS 0.4.15-dev-7788-g1ad9096
CAutoComplete.cpp
Go to the documentation of this file.
1/*
2 * AutoComplete interfaces implementation.
3 *
4 * Copyright 2004 Maxime Bellengé <maxime.bellenge@laposte.net>
5 * Copyright 2009 Andrew Hill
6 * Copyright 2020-2021 Katayama Hirofumi MZ <katayama.hirofumi.mz@gmail.com>
7 *
8 * This library is free software; you can redistribute it and/or
9 * modify it under the terms of the GNU Lesser General Public
10 * License as published by the Free Software Foundation; either
11 * version 2.1 of the License, or (at your option) any later version.
12 *
13 * This library is distributed in the hope that it will be useful,
14 * but WITHOUT ANY WARRANTY; without even the implied warranty of
15 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
16 * Lesser General Public License for more details.
17 *
18 * You should have received a copy of the GNU Lesser General Public
19 * License along with this library; if not, write to the Free Software
20 * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
21 */
22
23#include "precomp.h"
24#include <process.h> // _beginthreadex
25
26/*
27 TODO:
28 - implement ACO_SEARCH style
29 - implement ACO_FILTERPREFIXES style
30 - implement ACO_RTLREADING style
31 */
32
33#define CX_LIST 30160 // width of m_hwndList (very wide but alright)
34#define CY_LIST 288 // maximum height of drop-down window
35#define CY_ITEM 18 // default height of listview item
36#define MAX_ITEM_COUNT 1000 // the maximum number of items
37#define WATCH_TIMER_ID 0xFEEDBEEF // timer ID to watch m_rcEdit
38#define WATCH_INTERVAL 300 // in milliseconds
39
40static HHOOK s_hMouseHook = NULL; // hook handle
41static HWND s_hWatchWnd = NULL; // the window handle to watch
42
44{
47};
48static const PREFIX_INFO s_prefixes[] =
49{
50 { L"https://", 8 },
51 { L"http://www.", 11 },
52 { L"http://", 7 },
53 { L"www.", 4 },
54};
55
56static BOOL DropPrefix(const CStringW& str, CStringW& strBody)
57{
58 for (size_t iPrefix = 0; iPrefix < _countof(s_prefixes); ++iPrefix)
59 {
60 LPCWSTR psz = s_prefixes[iPrefix].psz;
61 INT cch = s_prefixes[iPrefix].cch;
62 if (::StrCmpNIW(str, psz, cch) == 0)
63 {
64 strBody = str.Mid(cch);
65 return TRUE;
66 }
67 }
68 strBody = str;
69 return FALSE;
70}
71
72static BOOL DoesMatch(const CStringW& strTarget, const CStringW& strText)
73{
74 CStringW strBody;
75 if (DropPrefix(strTarget, strBody))
76 {
77 if (::StrCmpNIW(strBody, strText, strText.GetLength()) == 0)
78 return TRUE;
79 }
80 else if (::StrCmpNIW(strTarget, strText, strText.GetLength()) == 0)
81 {
82 return TRUE;
83 }
84 return FALSE;
85}
86
87// mouse hook procedure to watch the mouse click
88// https://docs.microsoft.com/en-us/previous-versions/windows/desktop/legacy/ms644988(v=vs.85)
90{
91 if (s_hMouseHook == NULL)
92 return 0; // do default
93 // if the user clicked the outside of s_hWatchWnd, then hide the drop-down window
94 if (nCode == HC_ACTION && // an action?
95 s_hWatchWnd && ::IsWindow(s_hWatchWnd) && // s_hWatchWnd is valid?
96 ::GetCapture() == NULL) // no capture? (dragging something?)
97 {
98 RECT rc;
99 MOUSEHOOKSTRUCT *pMouseHook = reinterpret_cast<MOUSEHOOKSTRUCT *>(lParam);
100 switch (wParam)
101 {
102 case WM_LBUTTONDOWN: case WM_LBUTTONUP:
103 case WM_RBUTTONDOWN: case WM_RBUTTONUP:
104 case WM_MBUTTONDOWN: case WM_MBUTTONUP:
108 {
110 if (!::PtInRect(&rc, pMouseHook->pt)) // outside of s_hWatchWnd?
111 {
113 }
114 break;
115 }
116 }
117 }
118 return ::CallNextHookEx(s_hMouseHook, nCode, wParam, lParam); // go next hook
119}
120
122// sorting algorithm
123// http://www.ics.kagoshima-u.ac.jp/~fuchida/edu/algorithm/sort-algorithm/
124
126
127static inline INT compare1(const CStringW& str1, const CStringW& str2)
128{
129 CStringW s1, s2;
130 DropPrefix(str1, s1);
131 DropPrefix(str2, s2);
132 return s1.CompareNoCase(s2);
133}
134
135static inline INT pivot(list_t& list, INT i, INT j)
136{
137 INT k = i + 1;
138 while (k <= j && compare1(list[i], list[k]) == 0)
139 k++;
140 if (k > j)
141 return -1;
142 if (compare1(list[i], list[k]) >= 0)
143 return i;
144 return k;
145}
146
147static inline INT partition(list_t& list, INT i, INT j, const CStringW& x)
148{
149 INT left = i, right = j;
150 while (left <= right)
151 {
152 while (left <= j && compare1(list[left], x) < 0)
153 left++;
154 while (right >= i && compare1(list[right], x) >= 0)
155 right--;
156 if (left > right)
157 break;
158
159 CStringW tmp = list[left];
160 list[left] = list[right];
161 list[right] = tmp;
162
163 left++;
164 right--;
165 }
166 return left;
167}
168
169static void quicksort(list_t& list, INT i, INT j)
170{
171 if (i == j)
172 return;
173 INT p = pivot(list, i, j);
174 if (p == -1)
175 return;
176 INT k = partition(list, i, j, list[p]);
177 quicksort(list, i, k - 1);
178 quicksort(list, k, j);
179}
180
181static inline void DoSort(list_t& list)
182{
183 if (list.GetSize() <= 1) // sanity check
184 return;
185 quicksort(list, 0, list.GetSize() - 1); // quick sort
186}
187
188// std::unique
190{
191 INT first = 0, last = list.GetSize();
192 if (first == last)
193 return last;
194 INT result = first;
195 while (++first != last)
196 {
197 if (compare1(list[result], list[first]) != 0)
198 list[++result] = list[first];
199 }
200 return ++result;
201}
202
203static inline void DoUniqueAndTrim(list_t& list)
204{
206 while (list.GetSize() > last)
207 {
208 list.RemoveAt(last);
209 }
210}
211
213
214// range of WCHAR (inclusive)
215struct RANGE
216{
218};
219
220// a callback function for bsearch: comparison of two ranges
221static inline int RangeCompare(const void *x, const void *y)
222{
223 const RANGE *a = reinterpret_cast<const RANGE *>(x);
224 const RANGE *b = reinterpret_cast<const RANGE *>(y);
225 if (a->to < b->from)
226 return -1;
227 if (b->to < a->from)
228 return 1;
229 return 0;
230}
231
232// is the WCHAR a word break?
233static inline BOOL IsWordBreak(WCHAR ch)
234{
235 // the ranges of word break characters
236 static const RANGE s_ranges[] =
237 {
238 { 0x0009, 0x0009 }, { 0x0020, 0x002f }, { 0x003a, 0x0040 }, { 0x005b, 0x0060 },
239 { 0x007b, 0x007e }, { 0x00ab, 0x00ab }, { 0x00ad, 0x00ad }, { 0x00bb, 0x00bb },
240 { 0x02c7, 0x02c7 }, { 0x02c9, 0x02c9 }, { 0x055d, 0x055d }, { 0x060c, 0x060c },
241 { 0x2002, 0x200b }, { 0x2013, 0x2014 }, { 0x2016, 0x2016 }, { 0x2018, 0x2018 },
242 { 0x201c, 0x201d }, { 0x2022, 0x2022 }, { 0x2025, 0x2027 }, { 0x2039, 0x203a },
243 { 0x2045, 0x2046 }, { 0x207d, 0x207e }, { 0x208d, 0x208e }, { 0x226a, 0x226b },
244 { 0x2574, 0x2574 }, { 0x3001, 0x3003 }, { 0x3005, 0x3005 }, { 0x3008, 0x3011 },
245 { 0x3014, 0x301b }, { 0x301d, 0x301e }, { 0x3041, 0x3041 }, { 0x3043, 0x3043 },
246 { 0x3045, 0x3045 }, { 0x3047, 0x3047 }, { 0x3049, 0x3049 }, { 0x3063, 0x3063 },
247 { 0x3083, 0x3083 }, { 0x3085, 0x3085 }, { 0x3087, 0x3087 }, { 0x308e, 0x308e },
248 { 0x309b, 0x309e }, { 0x30a1, 0x30a1 }, { 0x30a3, 0x30a3 }, { 0x30a5, 0x30a5 },
249 { 0x30a7, 0x30a7 }, { 0x30a9, 0x30a9 }, { 0x30c3, 0x30c3 }, { 0x30e3, 0x30e3 },
250 { 0x30e5, 0x30e5 }, { 0x30e7, 0x30e7 }, { 0x30ee, 0x30ee }, { 0x30f5, 0x30f6 },
251 { 0x30fc, 0x30fe }, { 0xfd3e, 0xfd3f }, { 0xfe30, 0xfe31 }, { 0xfe33, 0xfe44 },
252 { 0xfe4f, 0xfe51 }, { 0xfe59, 0xfe5e }, { 0xff08, 0xff09 }, { 0xff0c, 0xff0c },
253 { 0xff0e, 0xff0e }, { 0xff1c, 0xff1c }, { 0xff1e, 0xff1e }, { 0xff3b, 0xff3b },
254 { 0xff3d, 0xff3d }, { 0xff40, 0xff40 }, { 0xff5b, 0xff5e }, { 0xff61, 0xff64 },
255 { 0xff67, 0xff70 }, { 0xff9e, 0xff9f }, { 0xffe9, 0xffe9 }, { 0xffeb, 0xffeb },
256 };
257 // binary search
258 RANGE range = { ch, ch };
259 return !!bsearch(&range, s_ranges, _countof(s_ranges), sizeof(RANGE), RangeCompare);
260}
261
262// This function is an application-defined callback function.
263// https://docs.microsoft.com/en-us/windows/win32/api/winuser/nc-winuser-editwordbreakprocw
264static INT CALLBACK
266{
267 switch (code)
268 {
269 case WB_ISDELIMITER:
270 return IsWordBreak(lpch[index]);
271 case WB_LEFT:
272 {
273 if (index)
274 --index;
275 while (index && !IsWordBreak(lpch[index]))
276 --index;
277 return index;
278 }
279 case WB_RIGHT:
280 {
281 if (!count)
282 break;
283 while (index < count && lpch[index] && !IsWordBreak(lpch[index]))
284 ++index;
285 return index;
286 }
287 }
288 return 0;
289}
290
291static LRESULT CALLBACK
293 UINT_PTR uSubclassID, DWORD_PTR dwData)
294{
295 CAutoComplete *pThis = reinterpret_cast<CAutoComplete *>(dwData);
296 return pThis->EditWndProc(hwnd, uMsg, wParam, lParam);
297}
298
300{
301 LRESULT ret;
302 HWND hwndGotFocus;
303 switch (uMsg)
304 {
305 case WM_CHAR:
306 return OnEditChar(wParam, lParam);
307 case WM_CUT: case WM_PASTE: case WM_CLEAR:
308 ret = ::DefSubclassProc(hwnd, uMsg, wParam, lParam); // do default
310 return ret;
311 case WM_GETDLGCODE:
312 ret = ::DefSubclassProc(hwnd, uMsg, wParam, lParam); // do default
313 // some special keys need default processing. we handle them here
314 switch (wParam)
315 {
316 case VK_RETURN:
319 break;
320 case VK_TAB:
321 if (IsWindowVisible() && UseTab())
322 ret |= DLGC_WANTALLKEYS; // we want all keys to manipulate the list
323 break;
324 case VK_ESCAPE:
325 if (IsWindowVisible())
326 ret |= DLGC_WANTALLKEYS; // we want all keys to manipulate the list
327 break;
328 default:
329 {
330 ret |= DLGC_WANTALLKEYS; // we want all keys to manipulate the list
331 break;
332 }
333 }
334 return ret;
335 case WM_KEYDOWN:
337 return TRUE; // eat
338 break;
339 case WM_SETFOCUS:
340 break;
341 case WM_KILLFOCUS:
342 // hide the list if lost focus
343 hwndGotFocus = (HWND)wParam;
344 if (hwndGotFocus != m_hwndEdit && hwndGotFocus != m_hWnd)
345 HideDropDown();
346 break;
347 case WM_SETTEXT:
348 if (!m_bInSetText)
349 HideDropDown(); // it's mechanical WM_SETTEXT
350 break;
351 case WM_DESTROY:
352 {
354 {
357 }
359 if (::IsWindow(m_hWnd))
360 PostMessageW(WM_CLOSE, 0, 0);
361 // remove reference to m_hwndEdit
362 Release();
363 break;
364 }
365 }
366
367 return ::DefSubclassProc(hwnd, uMsg, wParam, lParam); // do default
368}
369
371// CACListView
372
373CACListView::CACListView() : m_pDropDown(NULL), m_cyItem(CY_ITEM)
374{
375}
376
378{
379 ATLASSERT(m_hWnd == NULL);
380 DWORD dwStyle = WS_CHILD | /*WS_VISIBLE |*/ WS_CLIPSIBLINGS | LVS_NOCOLUMNHEADER |
382 HWND hWnd = ::CreateWindowExW(0, GetWndClassName(), L"Internet Explorer", dwStyle,
383 0, 0, 0, 0, hwndParent, NULL,
384 _AtlBaseModule.GetModuleInstance(), NULL);
385 SubclassWindow(hWnd); // do subclass to handle messages
386 // set extended listview style
388 SetExtendedListViewStyle(exstyle, exstyle);
389 // insert one column (needed to insert items)
391 column.fmt = LVCFMT_LEFT;
393 InsertColumn(0, &column);
394 return m_hWnd;
395}
396
397// set font handle
399{
400 SendMessageW(WM_SETFONT, (WPARAM)hFont, TRUE); // set font
401
402 // get listview item height
404 HDC hDC = GetDC();
405 if (hDC)
406 {
407 HGDIOBJ hFontOld = ::SelectObject(hDC, hFont);
409 if (::GetTextMetricsW(hDC, &tm))
410 {
411 m_cyItem = (tm.tmHeight * 3) / 2; // 3/2 of text height
412 }
413 ::SelectObject(hDC, hFontOld);
414 ReleaseDC(hDC);
415 }
416}
417
418// get the number of visible items
420{
421 if (m_cyItem <= 0) // avoid "division by zero"
422 return 0;
423 CRect rc;
424 GetClientRect(&rc);
425 return rc.Height() / m_cyItem;
426}
427
428// get the text of an item
430{
431 // NOTE: LVS_OWNERDATA doesn't support LVM_GETITEMTEXT.
433 ATLASSERT(GetStyle() & LVS_OWNERDATA);
434 return m_pDropDown->GetItemText(iItem);
435}
436
437// get the item index from position
439{
440 LV_HITTESTINFO hittest;
441 hittest.pt.x = x;
442 hittest.pt.y = y;
443 return HitTest(&hittest);
444}
445
446// get current selection
448{
449 return GetNextItem(-1, LVNI_ALL | LVNI_SELECTED);
450}
451
452// set current selection
454{
455 if (iItem == -1)
456 SetItemState(-1, 0, LVIS_SELECTED); // select none
457 else
458 SetItemState(iItem, LVIS_SELECTED, LVIS_SELECTED);
459}
460
461// select the specific position (in client coordinates)
463{
465}
466
467// WM_LBUTTONUP / WM_MBUTTONUP / WM_RBUTTONUP @implemented
469{
470 TRACE("CACListView::OnButtonUp(%p)\n", this);
471 return 0; // eat
472}
473
474// WM_LBUTTONDOWN @implemented
475// This message is posted when the user pressed the left mouse button while the cursor is inside.
477{
478 TRACE("CACListView::OnLButtonDown(%p)\n", this);
481 if (iItem != -1)
482 {
483 m_pDropDown->SelectItem(iItem); // select the item
484 CStringW strText = GetItemText(iItem); // get text of item
485 m_pDropDown->SetEditText(strText); // set text
486 m_pDropDown->SetEditSel(0, strText.GetLength()); // select all
487 m_pDropDown->HideDropDown(); // hide
488 }
489 return 0;
490}
491
492// WM_MBUTTONDOWN / WM_RBUTTONDOWN @implemented
494{
495 TRACE("CACListView::OnMRButtonDown(%p)\n", this);
496 return 0; // eat
497}
498
499// WM_MOUSEWHEEL @implemented
501{
502 TRACE("CACListView::OnMouseWheel(%p)\n", this);
504 LRESULT ret = DefWindowProcW(uMsg, wParam, lParam); // do default
506 return ret;
507}
508
509// WM_NCHITTEST
511{
512 TRACE("CACListView::OnNCHitTest(%p)\n", this);
514 POINT pt = { GET_X_LPARAM(lParam), GET_Y_LPARAM(lParam) }; // in screen coordinates
515 ScreenToClient(&pt); // into client coordinates
516 HWND hwndTarget = m_pDropDown->ChildWindowFromPoint(pt);
517 if (hwndTarget != m_hWnd)
518 return HTTRANSPARENT; // pass through (for resizing the drop-down window)
519 bHandled = FALSE; // do default
520 return 0;
521}
522
524// CACScrollBar
525
527{
528 ATLASSERT(m_hWnd == NULL);
529 DWORD dwStyle = WS_CHILD | /*WS_VISIBLE |*/ SBS_BOTTOMALIGN | SBS_VERT;
530 m_hWnd = ::CreateWindowExW(0, GetWndClassName(), NULL, dwStyle,
531 0, 0, 0, 0, hwndParent, NULL,
532 _AtlBaseModule.GetModuleInstance(), NULL);
533 // we don't subclass because no message handling is needed
534 return m_hWnd;
535}
536
538// CACSizeBox
539
541{
542 ATLASSERT(m_hWnd == NULL);
543 DWORD dwStyle = WS_CHILD | /*WS_VISIBLE |*/ SBS_SIZEBOX;
545 0, 0, 0, 0, hwndParent, NULL,
546 _AtlBaseModule.GetModuleInstance(), NULL);
547 SubclassWindow(hWnd); // do subclass to handle message
548 return m_hWnd;
549}
550
552{
553 // set flags
554 m_bDowner = bDowner;
555 m_bLongList = bLongList;
556
557 if (bLongList)
558 {
559 SetWindowRgn(NULL, TRUE); // reset window region
560 return;
561 }
562
563 RECT rc;
564 GetWindowRect(&rc); // get size-box size
565 ::OffsetRect(&rc, -rc.left, -rc.top); // window regions use special coordinates
566 ATLASSERT(rc.left == 0 && rc.top == 0);
567
568 // create a trianglar region
571 if (m_bDowner)
572 {
573 ::MoveToEx(hDC, rc.right, 0, NULL);
574 ::LineTo(hDC, rc.right, rc.bottom);
575 ::LineTo(hDC, 0, rc.bottom);
576 ::LineTo(hDC, rc.right, 0);
577 }
578 else
579 {
580 ::MoveToEx(hDC, rc.right, rc.bottom, NULL);
581 ::LineTo(hDC, rc.right, 0);
582 ::LineTo(hDC, 0, 0);
583 ::LineTo(hDC, rc.right, rc.bottom);
584 }
585 ::EndPath(hDC);
586 HRGN hRgn = ::PathToRegion(hDC);
588
589 SetWindowRgn(hRgn, TRUE); // set the trianglar region
590}
591
592// WM_ERASEBKGND
594{
595 return TRUE; // do nothing (for quick drawing)
596}
597
598// WM_NCHITTEST
600{
601 return HTTRANSPARENT; // pass through
602}
603
604// WM_PAINT
606{
607 CRect rc;
608 GetClientRect(&rc);
609
610 PAINTSTRUCT ps;
611 HDC hDC = BeginPaint(&ps);
612 if (!hDC)
613 return 0;
614
615 // fill background
617
618 // draw size-box
619 INT cxy = rc.Width();
620 for (INT shift = 0; shift < 2; ++shift)
621 {
622 // choose pen color
624 HPEN hPen = ::CreatePen(PS_SOLID, 1, ::GetSysColor(iColor));
625 HGDIOBJ hPenOld = ::SelectObject(hDC, hPen);
626 // do loop to draw the slanted lines
627 for (INT delta = cxy / 4; delta < cxy; delta += cxy / 4)
628 {
629 // draw a grip line
630 if (m_bDowner)
631 {
632 ::MoveToEx(hDC, rc.right, rc.top + delta + shift, NULL);
633 ::LineTo(hDC, rc.left + delta + shift, rc.bottom);
634 }
635 else
636 {
637 ::MoveToEx(hDC, rc.left + delta + shift, rc.top, NULL);
638 ::LineTo(hDC, rc.right, rc.bottom - delta - shift);
639 }
640 }
641 // delete pen
642 ::SelectObject(hDC, hPenOld);
643 ::DeleteObject(hPen);
644 }
645
646 EndPaint(&ps);
647 return 0;
648}
649
651// CAutoComplete public methods
652
654 : m_bInSetText(FALSE), m_bInSelectItem(FALSE)
655 , m_bDowner(TRUE), m_dwOptions(ACO_AUTOAPPEND | ACO_AUTOSUGGEST)
656 , m_bEnabled(TRUE), m_hwndCombo(NULL), m_hFont(NULL), m_bResized(FALSE)
657 , m_hwndEdit(NULL), m_fnOldEditProc(NULL), m_fnOldWordBreakProc(NULL)
658 , m_hThread(NULL), m_pThread(NULL)
659{
660}
661
663{
664 ATLASSERT(m_hWnd == NULL);
665 DWORD dwStyle = WS_POPUP | /*WS_VISIBLE |*/ WS_CLIPSIBLINGS | WS_CLIPCHILDREN | WS_BORDER;
667 Create(NULL, NULL, NULL, dwStyle, dwExStyle);
668 TRACE("CAutoComplete::CreateDropDown(%p): m_hWnd=%p, m_hwndEdit=%p\n",
669 this, m_hWnd, m_hwndEdit);
670 return m_hWnd;
671}
672
674{
675 TRACE("CAutoComplete::~CAutoComplete(%p)\n", this);
676 if (m_hThread)
677 {
679 m_hThread = NULL;
680 }
681 if (m_hFont)
682 {
684 m_hFont = NULL;
685 }
686 // quit holding them
687 m_pEnum.Release();
688 m_pACList.Release();
689}
690
692{
693 return !!(m_dwOptions & ACO_AUTOSUGGEST) && m_bEnabled;
694}
695
697{
698 return !!(m_dwOptions & ACO_AUTOAPPEND) && m_bEnabled;
699}
700
702{
703 return !!(m_dwOptions & ACO_USETAB) && m_bEnabled;
704}
705
707{
709 return FALSE;
711}
712
714{
716}
717
719{
720 return m_outerList.GetSize();
721}
722
724{
725 if (iItem < 0 || m_outerList.GetSize() <= iItem)
726 return L"";
727 return m_outerList[iItem];
728}
729
731{
732 WCHAR szText[L_MAX_URL_LENGTH];
733 if (::GetWindowTextW(m_hwndEdit, szText, _countof(szText)))
734 return szText;
735 return L"";
736}
737
739{
740 m_bInSetText = TRUE; // don't hide drop-down
741 ::CallWindowProcW(m_fnOldEditProc, m_hwndEdit, WM_SETTEXT, 0, reinterpret_cast<LPARAM>(pszText));
743}
744
745inline CStringW CAutoComplete::GetStemText(const CStringW& strText) const
746{
747 INT ich = strText.ReverseFind(L'\\');
748 if (ich == -1)
749 return L""; // no stem
750 return strText.Left(ich + 1);
751}
752
754{
756}
757
759{
760 if (!m_hWnd || !CanAutoSuggest())
761 return;
762
763 INT cItems = GetItemCount();
764 if (cItems == 0 || ::GetFocus() != m_hwndEdit || IsComboBoxDropped())
765 {
766 // hide the drop-down if necessary
767 HideDropDown();
768 return;
769 }
770
772}
773
775{
777}
778
780{
781 m_hwndList.SetCurSel(iItem);
782 if (iItem != -1)
783 m_hwndList.EnsureVisible(iItem, FALSE);
784}
785
787{
788 if (!CanAutoAppend()) // can we auto-append?
789 return; // don't append
790
791 CStringW strText = GetEditText(); // get the text
792 if (strText.IsEmpty())
793 return; // don't append
794
795 INT cItems = m_outerList.GetSize(); // get the number of items
796 if (cItems == 0)
797 return; // don't append
798
799 // get the common string
800 CStringW strCommon;
801 BOOL bFound = FALSE;
802 for (INT iItem = 0; iItem < cItems; ++iItem)
803 {
804 const CStringW& strItem = m_outerList[iItem]; // get the text of the item
805
806 CStringW strBody;
807 if (DropPrefix(strItem, strBody) &&
808 ::StrCmpNIW(strBody, strText, strText.GetLength()) == 0)
809 {
810 if (!bFound)
811 {
812 bFound = TRUE;
813 strCommon = strBody;
814 continue;
815 }
816 for (INT ich = 0; ich < strBody.GetLength(); ++ich)
817 {
818 if (strCommon.GetLength() <= ich)
819 break;
820 if (ChrCmpIW(strCommon[ich], strBody[ich]) != 0)
821 {
822 strCommon = strCommon.Left(ich);
823 break;
824 }
825 }
826 continue;
827 }
828
829 if (::StrCmpNIW(strItem, strText, strText.GetLength()) == 0)
830 {
831 if (!bFound)
832 {
833 bFound = TRUE;
834 strCommon = strItem;
835 continue;
836 }
837
838 for (INT ich = 0; ich < strItem.GetLength(); ++ich)
839 {
840 if (strCommon.GetLength() <= ich)
841 break;
842 if (ChrCmpIW(strCommon[ich], strItem[ich]) != 0)
843 {
844 strCommon = strCommon.Left(ich);
845 break;
846 }
847 }
848 }
849 }
850
851 if (strCommon.IsEmpty() || strCommon.GetLength() <= strText.GetLength())
852 return; // no suggestion
853
854 // append suggestion
855 SetEditText(strCommon);
856
857 // select the appended suggestion
858 SetEditSel(strText.GetLength(), strCommon.GetLength());
859}
860
861// go back a word ([Ctrl]+[Backspace])
863{
864 // get current selection
865 INT ich0, ich1;
867 reinterpret_cast<WPARAM>(&ich0), reinterpret_cast<LPARAM>(&ich1));
868 if (ich0 <= 0 || ich0 != ich1) // there is selection or left-side end
869 return; // don't do anything
870 // get text
872 // extend the range
873 while (ich0 > 0 && IsWordBreak(str[ich0 - 1]))
874 --ich0;
875 while (ich0 > 0 && !IsWordBreak(str[ich0 - 1]))
876 --ich0;
877 // select range
878 SetEditSel(ich0, ich1);
879 // replace selection with empty text (this is actually deletion)
881}
882
884{
885 // copy scroll info from m_hwndList to m_hwndScrollBar
886 SCROLLINFO si = { sizeof(si), SIF_ALL };
887 m_hwndList.GetScrollInfo(SB_VERT, &si);
888 m_hwndScrollBar.SetScrollInfo(SB_CTL, &si, FALSE);
889
890 // show/hide scroll bar
891 INT cVisibles = m_hwndList.GetVisibleCount();
892 INT cItems = m_hwndList.GetItemCount();
893 BOOL bShowScroll = (cItems > cVisibles);
894 m_hwndScrollBar.ShowWindow(bShowScroll ? SW_SHOWNOACTIVATE : SW_HIDE);
895 if (bShowScroll)
896 m_hwndScrollBar.InvalidateRect(NULL, FALSE); // redraw
897}
898
900{
901 TRACE("CAutoComplete::OnEditKeyDown(%p, %p)\n", this, wParam);
902
903 UINT vk = (UINT)wParam; // virtual key
904 switch (vk)
905 {
906 case VK_UP: case VK_DOWN:
907 case VK_PRIOR: case VK_NEXT:
908 // is suggestion available?
909 if (!CanAutoSuggest())
910 return FALSE; // do default
911 if (IsWindowVisible())
912 return OnListUpDown(vk);
913 break;
914 case VK_ESCAPE:
915 {
916 // is suggestion available?
917 if (!CanAutoSuggest())
918 return FALSE; // do default
919 if (IsWindowVisible())
920 {
921 SetEditText(m_strText); // revert the edit text
922 // select the end
925 HideDropDown(); // hide
926 return TRUE; // eat
927 }
928 break;
929 }
930 case VK_RETURN:
931 {
932 if (::GetKeyState(VK_CONTROL) < 0)
933 {
934 // quick edit
935 CStringW strText = GetEditText();
936 SetEditText(GetQuickEdit(strText));
937 }
938 else
939 {
940 // if item is selected, then update the edit text
941 INT iItem = m_hwndList.GetCurSel();
942 if (iItem != -1)
943 {
944 CStringW strText = GetItemText(iItem);
945 SetEditText(strText);
946 }
947 }
948 // select all
950 SetEditSel(0, cch);
951 // hide
952 HideDropDown();
953 break;
954 }
955 case VK_TAB:
956 {
957 // ACO_USETAB
958 if (IsWindowVisible() && UseTab())
959 {
960 if (GetKeyState(VK_SHIFT) < 0)
961 return OnListUpDown(VK_UP);
962 else
963 return OnListUpDown(VK_DOWN);
964 }
965 break;
966 }
967 case VK_DELETE:
968 {
969 // is suggestion available?
970 if (!CanAutoSuggest())
971 return FALSE; // do default
974 return TRUE; // eat
975 }
976 case VK_BACK:
977 {
978 if (::GetKeyState(VK_CONTROL) < 0)
979 {
980 DoBackWord();
981 return TRUE; // eat
982 }
983 break;
984 }
985 }
986 return FALSE; // default
987}
988
990{
991 TRACE("CACEditCtrl::OnEditChar(%p, %p)\n", this, wParam);
992 if (wParam == L'\n' || wParam == L'\t')
993 return 0; // eat
995 if (CanAutoSuggest() || CanAutoAppend())
997 return ret;
998}
999
1001{
1002 // update EDIT text
1003 INT iItem = m_hwndList.GetCurSel();
1004 CStringW text = ((iItem != -1) ? GetItemText(iItem) : m_strText);
1006 // ensure the item visible
1007 m_hwndList.EnsureVisible(iItem, FALSE);
1008 // select the end
1009 INT cch = text.GetLength();
1010 SetEditSel(cch, cch);
1011}
1012
1014{
1015 if (!CanAutoSuggest())
1016 return FALSE; // default
1017
1019 {
1020 ShowDropDown();
1021 return TRUE; // eat
1022 }
1023
1024 INT iItem = m_hwndList.GetCurSel(); // current selection
1025 INT cItems = m_hwndList.GetItemCount(); // the number of items
1026 switch (vk)
1027 {
1028 case VK_UP:
1029 if (iItem == -1)
1030 iItem = cItems - 1;
1031 else if (iItem == 0)
1032 iItem = -1;
1033 else
1034 --iItem;
1035 m_hwndList.SetCurSel(iItem);
1036 break;
1037 case VK_DOWN:
1038 if (iItem == -1)
1039 iItem = 0;
1040 else if (iItem == cItems - 1)
1041 iItem = -1;
1042 else
1043 ++iItem;
1044 m_hwndList.SetCurSel(iItem);
1045 break;
1046 case VK_PRIOR:
1047 if (iItem == -1)
1048 {
1049 iItem = cItems - 1;
1050 }
1051 else if (iItem == 0)
1052 {
1053 iItem = -1;
1054 }
1055 else
1056 {
1057 iItem -= m_hwndList.GetVisibleCount() - 1;
1058 if (iItem < 0)
1059 iItem = 0;
1060 }
1061 m_hwndList.SetCurSel(iItem);
1062 break;
1063 case VK_NEXT:
1064 if (iItem == -1)
1065 {
1066 iItem = 0;
1067 }
1068 else if (iItem == cItems - 1)
1069 {
1070 iItem = -1;
1071 }
1072 else
1073 {
1074 iItem += m_hwndList.GetVisibleCount() - 1;
1075 if (iItem > cItems)
1076 iItem = cItems - 1;
1077 }
1078 m_hwndList.SetCurSel(iItem);
1079 break;
1080 default:
1081 {
1083 break;
1084 }
1085 }
1086
1087 return TRUE; // eat
1088}
1089
1091// CAutoComplete IAutoComplete methods
1092
1093// @implemented
1095{
1096 TRACE("(%p)->Enable(%d)\n", this, fEnable);
1097 m_bEnabled = fEnable;
1098 return S_OK;
1099}
1100
1103 LPCOLESTR pwszRegKeyPath, LPCOLESTR pwszQuickComplete)
1104{
1105 TRACE("(%p)->Init(0x%08lx, %p, %s, %s)\n",
1106 this, hwndEdit, punkACL, debugstr_w(pwszRegKeyPath), debugstr_w(pwszQuickComplete));
1107 // sanity check
1108 if (m_hwndEdit || !punkACL)
1109 return E_FAIL;
1110 if (!hwndEdit)
1111 return E_INVALIDARG;
1112 // do subclass textbox to watch messages
1114 if (!m_fnOldEditProc)
1115 return E_FAIL;
1116 if (!::SetWindowSubclass(hwndEdit, EditSubclassProc, 0, reinterpret_cast<DWORD_PTR>(this)))
1117 return E_FAIL;
1119 // add reference to m_hwndEdit
1120 AddRef();
1121 // set word break procedure
1122 m_fnOldWordBreakProc = reinterpret_cast<EDITWORDBREAKPROCW>(
1124 reinterpret_cast<LPARAM>(EditWordBreakProcW)));
1125 // save position
1127
1128 // get an IEnumString
1130 TRACE("m_pEnum: %p\n", static_cast<void *>(m_pEnum));
1131
1132 // get an IACList
1133 punkACL->QueryInterface(IID_IACList, (VOID **)&m_pACList);
1134 TRACE("m_pACList: %p\n", static_cast<void *>(m_pACList));
1135
1136 UpdateDropDownState(); // create/hide the drop-down window if necessary
1137
1138 // load quick completion info
1139 LoadQuickComplete(pwszRegKeyPath, pwszQuickComplete);
1140
1141 // any combobox for m_hwndEdit?
1142 m_hwndCombo = NULL;
1144 WCHAR szClass[16];
1145 if (::GetClassNameW(hwndParent, szClass, _countof(szClass)))
1146 {
1147 if (::StrCmpIW(szClass, WC_COMBOBOXW) == 0 ||
1148 ::StrCmpIW(szClass, WC_COMBOBOXEXW) == 0)
1149 {
1150 m_hwndCombo = hwndParent; // get combobox
1151 }
1152 }
1153
1154 return S_OK;
1155}
1156
1158// CAutoComplete IAutoComplete2 methods
1159
1160// @implemented
1162{
1163 TRACE("(%p) -> (%p)\n", this, pdwFlag);
1164 if (pdwFlag)
1165 {
1166 *pdwFlag = m_dwOptions;
1167 return S_OK;
1168 }
1169 return E_INVALIDARG;
1170}
1171
1172// @implemented
1174{
1175 TRACE("(%p) -> (0x%x)\n", this, dwFlag);
1176 m_dwOptions = dwFlag;
1177
1178 if (m_dwOptions & ACO_SEARCH)
1179 FIXME(" ACO_SEARCH not supported\n");
1181 FIXME(" ACO_FILTERPREFIXES not supported\n");
1183 FIXME(" ACO_RTLREADING not supported\n");
1184
1185 UpdateDropDownState(); // create/hide the drop-down window if necessary
1186 return S_OK;
1187}
1188
1190// CAutoComplete IAutoCompleteDropDown methods
1191
1192// @implemented
1194{
1195 BOOL dropped = m_hwndList.IsWindowVisible();
1196
1197 if (pdwFlags)
1198 *pdwFlags = (dropped ? ACDD_VISIBLE : 0);
1199
1200 if (ppwszString)
1201 {
1202 *ppwszString = NULL;
1203
1204 if (dropped)
1205 {
1206 // get selected item
1207 INT iItem = m_hwndList.GetCurSel();
1208 if (iItem >= 0)
1209 {
1210 // get the text of item
1211 CStringW strText = m_hwndList.GetItemText(iItem);
1212
1213 // store to *ppwszString
1214 SHStrDupW(strText, ppwszString);
1215 if (*ppwszString == NULL)
1216 return E_OUTOFMEMORY;
1217 }
1218 }
1219 }
1220
1221 return S_OK;
1222}
1223
1225{
1226 FIXME("(%p): stub\n", this);
1227
1228 Reset();
1229 m_hwndList.SendMessageW(LVM_SETITEMCOUNT, 0, 0);
1230 m_outerList.RemoveAll();
1231 return S_OK;
1232}
1233
1235// CAutoComplete IEnumString methods
1236
1237// @implemented
1239{
1240 TRACE("(%p, %d, %p, %p)\n", this, celt, rgelt, pceltFetched);
1241 if (rgelt)
1242 *rgelt = NULL;
1243 if (*pceltFetched)
1244 *pceltFetched = 0;
1245 if (celt != 1 || !rgelt || !pceltFetched || !m_pEnum)
1246 return E_INVALIDARG;
1247
1248 LPWSTR pszText = NULL;
1249 HRESULT hr = m_pEnum->Next(1, &pszText, pceltFetched);
1250 if (hr == S_OK)
1251 *rgelt = pszText;
1252 else
1253 ::CoTaskMemFree(pszText);
1254 return hr;
1255}
1256
1257// @implemented
1259{
1260 TRACE("(%p, %d)\n", this, celt);
1261 return E_NOTIMPL;
1262}
1263
1264// @implemented
1266{
1267 TRACE("(%p)\n", this);
1268 if (m_pEnum)
1269 return m_pEnum->Reset();
1270 return E_FAIL;
1271}
1272
1273// @implemented
1275{
1276 TRACE("(%p, %p)\n", this, ppOut);
1277 if (ppOut)
1278 *ppOut = NULL;
1279 return E_NOTIMPL;
1280}
1281
1283// CAutoComplete protected methods
1284
1286{
1287 if (CanAutoSuggest())
1288 {
1289 // create the drop-down window if not existed
1290 if (!m_hWnd)
1292 }
1293 else
1294 {
1295 // hide if existed
1296 if (m_hWnd)
1298 }
1299}
1300
1301// calculate the positions of the controls
1302VOID CAutoComplete::CalcRects(BOOL bDowner, RECT& rcList, RECT& rcScrollBar, RECT& rcSizeBox) const
1303{
1304 // get the client rectangle
1305 RECT rcClient;
1306 GetClientRect(&rcClient);
1307
1308 // the list
1309 rcList = rcClient;
1310 rcList.right = rcList.left + CX_LIST;
1311
1312 // the scroll bar
1313 rcScrollBar = rcClient;
1314 rcScrollBar.left = rcClient.right - GetSystemMetrics(SM_CXVSCROLL);
1315 if (bDowner)
1316 {
1317 rcScrollBar.top = 0;
1318 rcScrollBar.bottom = rcClient.bottom - GetSystemMetrics(SM_CYHSCROLL);
1319 }
1320 else
1321 {
1322 rcScrollBar.top = GetSystemMetrics(SM_CYHSCROLL);
1323 }
1324
1325 // the size box
1326 rcSizeBox = rcClient;
1327 rcSizeBox.left = rcClient.right - GetSystemMetrics(SM_CXVSCROLL);
1328 if (bDowner)
1329 {
1330 rcSizeBox.top = rcClient.bottom - GetSystemMetrics(SM_CYHSCROLL);
1331 }
1332 else
1333 {
1334 rcSizeBox.top = 0;
1335 rcSizeBox.bottom = rcClient.top + GetSystemMetrics(SM_CYHSCROLL);
1336 }
1337}
1338
1339VOID CAutoComplete::LoadQuickComplete(LPCWSTR pwszRegKeyPath, LPCWSTR pwszQuickComplete)
1340{
1342
1343 if (pwszRegKeyPath)
1344 {
1345 CStringW strPath = pwszRegKeyPath;
1346 INT ichSep = strPath.ReverseFind(L'\\'); // find separator
1347 if (ichSep != -1) // found the last separator
1348 {
1349 // split by the separator
1350 CStringW strKey = strPath.Left(ichSep);
1351 CStringW strName = strPath.Mid(ichSep + 1);
1352
1353 // load from registry
1354 WCHAR szValue[MAX_PATH] = L"";
1355 DWORD cbValue = sizeof(szValue), dwType = REG_NONE;
1356 SHRegGetUSValueW(pwszRegKeyPath, strName, &dwType,
1357 szValue, &cbValue, FALSE, NULL, 0);
1358 if (szValue[0] != 0 && cbValue != 0 &&
1359 (dwType == REG_SZ || dwType == REG_EXPAND_SZ))
1360 {
1361 m_strQuickComplete = szValue;
1362 }
1363 }
1364 }
1365
1366 if (pwszQuickComplete && m_strQuickComplete.IsEmpty())
1367 {
1368 m_strQuickComplete = pwszQuickComplete;
1369 }
1370}
1371
1373{
1374 if (pszText[0] == 0 || m_strQuickComplete.IsEmpty())
1375 return pszText;
1376
1377 // m_strQuickComplete will be "www.%s.com" etc.
1378 CStringW ret;
1379 ret.Format(m_strQuickComplete, pszText);
1380 return ret;
1381}
1382
1384{
1385 // get nearest monitor from m_hwndEdit
1386 HMONITOR hMon = ::MonitorFromWindow(m_hwndEdit, MONITOR_DEFAULTTONEAREST);
1387 ATLASSERT(hMon != NULL);
1388 if (hMon == NULL)
1389 return;
1390
1391 // get nearest monitor info
1392 MONITORINFO mi = { sizeof(mi) };
1393 if (!::GetMonitorInfo(hMon, &mi))
1394 {
1396 return;
1397 }
1398
1399 // get count and item height
1400 INT cItems = GetItemCount();
1401 INT cyItem = m_hwndList.m_cyItem;
1402 ATLASSERT(cyItem > 0);
1403
1404 // get m_hwndEdit position
1405 RECT rcEdit;
1406 ::GetWindowRect(m_hwndEdit, &rcEdit);
1407 INT x = rcEdit.left, y = rcEdit.bottom;
1408
1409 // get list extent
1410 RECT rcMon = mi.rcMonitor;
1411 INT cx = rcEdit.right - rcEdit.left, cy = cItems * cyItem;
1412 BOOL bLongList = FALSE;
1413 if (cy > CY_LIST)
1414 {
1415 cy = INT(CY_LIST / cyItem) * cyItem;
1416 bLongList = TRUE;
1417 }
1418
1419 // convert rectangle for frame
1420 RECT rc = { 0, 0, cx, cy };
1421 AdjustWindowRectEx(&rc, GetStyle(), FALSE, GetExStyle());
1422 cy = rc.bottom - rc.top;
1423
1424 if (!m_bResized)
1425 {
1426 // is the drop-down window a 'downer' or 'upper'?
1427 // NOTE: 'downer' is below the EDIT control. 'upper' is above the EDIT control.
1428 m_bDowner = (rcEdit.bottom + cy < rcMon.bottom);
1429 }
1430
1431 // adjust y and cy
1432 if (m_bDowner)
1433 {
1434 if (rcMon.bottom < y + cy)
1435 {
1436 cy = ((rcMon.bottom - y) / cyItem) * cyItem;
1437 bLongList = TRUE;
1438 }
1439 }
1440 else
1441 {
1442 if (rcEdit.top < rcMon.top + cy)
1443 {
1444 cy = ((rcEdit.top - rcMon.top) / cyItem) * cyItem;
1445 bLongList = TRUE;
1446 }
1447 y = rcEdit.top - cy;
1448 }
1449
1450 // set status
1451 m_hwndSizeBox.SetStatus(m_bDowner, bLongList);
1452
1453 if (m_bResized) // already resized?
1454 PostMessageW(WM_SIZE, 0, 0); // re-layout
1455 else
1456 MoveWindow(x, y, cx, cy); // move
1457
1458 // show without activation
1460}
1461
1462VOID
1464 const CSimpleArray<CStringW>& innerList,
1465 const CString& strText)
1466{
1467 for (INT iItem = 0; iItem < innerList.GetSize(); ++iItem)
1468 {
1469 if (m_pThread || !m_hThread)
1470 break;
1471
1472 const CStringW& strTarget = innerList[iItem];
1473 if (DoesMatch(strTarget, strText))
1474 {
1475 outerList.Add(strTarget);
1476
1477 if (outerList.GetSize() >= MAX_ITEM_COUNT)
1478 break;
1479 }
1480 }
1481}
1482
1484{
1485 pThread->m_innerList.RemoveAll(); // clear contents
1486
1487 if (!m_pEnum || pThread->m_strText.IsEmpty())
1488 return;
1489
1490 // reload the items
1491 LPWSTR pszItem;
1492 ULONG cGot;
1493 HRESULT hr;
1494 CSimpleArray<CStringW>& innerList = pThread->m_innerList;
1495 while (!m_pThread && m_hThread)
1496 {
1497 // get next item
1498 hr = m_pEnum->Next(1, &pszItem, &cGot);
1499 if (hr != S_OK)
1500 break;
1501
1502 innerList.Add(pszItem); // append item to innerList
1503 ::CoTaskMemFree(pszItem); // free
1504 }
1505}
1506
1508{
1509 TRACE("CAutoComplete::StartCompletion(%p, %d)\n", this, bAppendOK);
1510
1511 if (!m_pEnum || (!CanAutoSuggest() && !CanAutoAppend()))
1512 return;
1513
1514 ::SendMessageW(m_hWnd, AUTOCOMP_START, bAppendOK, 0);
1515}
1516
1518// CAutoComplete message handlers
1519
1520// WM_CREATE
1521// This message is sent when the window is about to be created after WM_NCCREATE.
1522// The return value is -1 (failure) or zero (success).
1524{
1525 TRACE("CAutoComplete::OnCreate(%p)\n", this);
1526
1527 // set the pointer of CAutoComplete
1528 m_hwndList.m_pDropDown = this;
1531
1532 // create the children
1533 m_hwndList.Create(m_hWnd);
1534 if (!m_hwndList)
1535 return -1; // failure
1536 m_hwndSizeBox.Create(m_hWnd);
1537 if (!m_hwndSizeBox)
1538 return -1; // failure
1539 m_hwndScrollBar.Create(m_hWnd);
1540 if (!m_hwndScrollBar)
1541 return -1; // failure
1542
1543 // show the controls
1544 m_hwndList.ShowWindow(SW_SHOWNOACTIVATE);
1545 m_hwndSizeBox.ShowWindow(SW_SHOWNOACTIVATE);
1547
1548 // set the list font
1549 m_hFont = reinterpret_cast<HFONT>(::GetStockObject(DEFAULT_GUI_FONT));
1551
1552 // add reference so we won't be deleted during message processing
1553 AddRef();
1554 return 0; // success
1555}
1556
1557// WM_NCDESTROY
1559{
1560 TRACE("CAutoComplete::OnNCDestroy(%p)\n", this);
1561
1562 // hide
1563 if (IsWindowVisible())
1564 HideDropDown();
1565
1566 // clear CAutoComplete pointers
1570
1571 // destroy controls
1572 m_hwndList.DestroyWindow();
1573 m_hwndScrollBar.DestroyWindow();
1574 m_hwndSizeBox.DestroyWindow();
1575
1576 // clean up
1577 m_hwndCombo = NULL;
1578
1579 // Tell ATL to clean up
1580 bHandled = 0;
1581
1582 return 0;
1583}
1584
1586{
1587 // The message loop is finished, now we can safely destruct!
1588 Release();
1589}
1590
1591// WM_EXITSIZEMOVE
1592// This message is sent once to a window after it has exited the moving or sizing mode.
1594{
1595 TRACE("CAutoComplete::OnExitSizeMove(%p)\n", this);
1596 m_bResized = TRUE; // remember resized
1597
1598 ModifyStyle(WS_THICKFRAME, 0); // remove thick frame to resize
1599 // frame changed
1601 SetWindowPos(NULL, 0, 0, 0, 0, uSWP_);
1602
1603 ::SetFocus(m_hwndEdit); // restore focus
1604 return 0;
1605}
1606
1607// WM_DRAWITEM @implemented
1608// This message is sent to the owner window to draw m_hwndList.
1610{
1611 LPDRAWITEMSTRUCT pDraw = reinterpret_cast<LPDRAWITEMSTRUCT>(lParam);
1612 ATLASSERT(pDraw != NULL);
1614
1615 // sanity check
1616 if (pDraw->CtlType != ODT_LISTVIEW || pDraw->hwndItem != m_hwndList)
1617 return FALSE;
1618
1619 // item rectangle
1620 RECT rcItem = pDraw->rcItem;
1621
1622 // get info
1623 UINT iItem = pDraw->itemID; // the index of item
1624 CStringW strItem = m_hwndList.GetItemText(iItem); // get text of item
1625
1626 // draw background and set text color
1627 HDC hDC = pDraw->hDC;
1628 BOOL bSelected = (pDraw->itemState & ODS_SELECTED);
1629 if (bSelected)
1630 {
1633 }
1634 else
1635 {
1638 }
1639
1640 // draw text
1642 HGDIOBJ hFontOld = ::SelectObject(hDC, m_hFont);
1643 const UINT uDT_ = DT_LEFT | DT_NOPREFIX | DT_SINGLELINE | DT_VCENTER;
1645 ::DrawTextW(hDC, strItem, -1, &rcItem, uDT_);
1646 ::SelectObject(hDC, hFontOld);
1647
1648 return TRUE;
1649}
1650
1651// WM_GETMINMAXINFO @implemented
1652// This message is sent to a window when the size or position of the window is about to change.
1654{
1655 // restrict minimum size
1656 LPMINMAXINFO pInfo = reinterpret_cast<LPMINMAXINFO>(lParam);
1659 return 0;
1660}
1661
1662// WM_MEASUREITEM @implemented
1663// This message is sent to the owner window to get the item extent of m_hwndList.
1665{
1666 LPMEASUREITEMSTRUCT pMeasure = reinterpret_cast<LPMEASUREITEMSTRUCT>(lParam);
1667 ATLASSERT(pMeasure != NULL);
1668 if (pMeasure->CtlType != ODT_LISTVIEW)
1669 return FALSE;
1670 if (!m_hwndList)
1671 return FALSE;
1673 pMeasure->itemHeight = m_hwndList.m_cyItem; // height of item
1674 return TRUE;
1675}
1676
1677// WM_MOUSEACTIVATE @implemented
1678// The return value of this message specifies whether the window should be activated or not.
1680{
1681 return MA_NOACTIVATE; // don't activate by mouse
1682}
1683
1684// WM_NCACTIVATE
1685// This message is sent to a window to indicate an active or inactive state.
1687{
1688 bHandled = FALSE; // do default
1689 return 0;
1690}
1691
1692// WM_NCLBUTTONDOWN
1694{
1695 switch (wParam)
1696 {
1697 case HTBOTTOMRIGHT: case HTTOPRIGHT:
1698 {
1699 // add thick frame to resize.
1700 ModifyStyle(0, WS_THICKFRAME);
1701 // frame changed
1703 SetWindowPos(NULL, 0, 0, 0, 0, uSWP_);
1704 break;
1705 }
1706 }
1707 bHandled = FALSE; // do default
1708 return 0;
1709}
1710
1711// WM_NOTIFY
1712// This message informs the parent window of a control that an event has occurred.
1714{
1715 LPNMHDR pnmh = reinterpret_cast<LPNMHDR>(lParam);
1716 ATLASSERT(pnmh != NULL);
1717
1718 switch (pnmh->code)
1719 {
1720 case NM_DBLCLK: // double-clicked
1721 {
1722 TRACE("NM_DBLCLK\n");
1723 HideDropDown();
1724 break;
1725 }
1726 case NM_HOVER: // mouse is hovering
1727 {
1728 POINT pt;
1729 ::GetCursorPos(&pt); // get cursor position in screen coordinates
1730 m_hwndList.ScreenToClient(&pt); // into client coordinates
1731 INT iItem = m_hwndList.ItemFromPoint(pt.x, pt.y);
1732 if (iItem != -1)
1733 {
1734 m_bInSelectItem = TRUE; // don't respond
1735 m_hwndList.SetCurSel(iItem); // select
1737 }
1738 return TRUE; // eat
1739 }
1740 case LVN_GETDISPINFOA: // for user's information only
1741 {
1742 TRACE("LVN_GETDISPINFOA\n");
1743 if (pnmh->hwndFrom != m_hwndList)
1744 break;
1745
1746 LV_DISPINFOA *pDispInfo = reinterpret_cast<LV_DISPINFOA *>(pnmh);
1747 LV_ITEMA *pItem = &pDispInfo->item;
1748 INT iItem = pItem->iItem;
1749 if (iItem == -1)
1750 break;
1751
1752 CStringW strText = GetItemText(iItem);
1753 if (pItem->mask & LVIF_TEXT)
1754 SHUnicodeToAnsi(strText, pItem->pszText, pItem->cchTextMax);
1755 break;
1756 }
1757 case LVN_GETDISPINFOW: // for user's information only
1758 {
1759 TRACE("LVN_GETDISPINFOW\n");
1760 if (pnmh->hwndFrom != m_hwndList)
1761 break;
1762
1763 LV_DISPINFOW *pDispInfo = reinterpret_cast<LV_DISPINFOW *>(pnmh);
1764 LV_ITEMW *pItem = &pDispInfo->item;
1765 INT iItem = pItem->iItem;
1766 if (iItem == -1)
1767 break;
1768
1769 CStringW strText = GetItemText(iItem);
1770 if (pItem->mask & LVIF_TEXT)
1771 StringCbCopyW(pItem->pszText, pItem->cchTextMax, strText);
1772 break;
1773 }
1774 case LVN_HOTTRACK: // enabled by LVS_EX_TRACKSELECT
1775 {
1776 TRACE("LVN_HOTTRACK\n");
1777 LPNMLISTVIEW pListView = reinterpret_cast<LPNMLISTVIEW>(pnmh);
1778 INT iItem = pListView->iItem;
1779 TRACE("LVN_HOTTRACK: iItem:%d\n", iItem);
1780 m_hwndList.SetCurSel(iItem);
1781 m_hwndList.EnsureVisible(iItem, FALSE);
1782 return TRUE;
1783 }
1784 case LVN_ITEMACTIVATE: // enabled by LVS_EX_ONECLICKACTIVATE
1785 {
1786 TRACE("LVN_ITEMACTIVATE\n");
1787 LPNMITEMACTIVATE pItemActivate = reinterpret_cast<LPNMITEMACTIVATE>(pnmh);
1788 INT iItem = pItemActivate->iItem;
1789 TRACE("LVN_ITEMACTIVATE: iItem:%d\n", iItem);
1790 if (iItem != -1) // the item is clicked
1791 {
1792 SelectItem(iItem);
1793 HideDropDown();
1794 }
1795 break;
1796 }
1797 case LVN_ITEMCHANGED: // item info is changed
1798 {
1799 TRACE("LVN_ITEMCHANGED\n");
1800 LPNMLISTVIEW pListView = reinterpret_cast<LPNMLISTVIEW>(pnmh);
1801 if (pListView->uChanged & LVIF_STATE) // selection changed
1802 {
1803 // listview selection changed
1804 if (!m_bInSelectItem)
1805 {
1807 }
1809 }
1810 break;
1811 }
1812 }
1813
1814 return 0;
1815}
1816
1817// WM_NCHITTEST @implemented
1818// The return value is indicating the cursor shape and the behaviour.
1820{
1821 TRACE("CAutoComplete::OnNCHitTest(%p)\n", this);
1822 POINT pt = { GET_X_LPARAM(lParam), GET_Y_LPARAM(lParam) }; // in screen coordinates
1823 ScreenToClient(&pt); // into client coordinates
1824 if (ChildWindowFromPoint(pt) == m_hwndSizeBox) // hit?
1825 {
1826 // allow resizing (with cursor shape)
1828 }
1829 bHandled = FALSE; // do default
1830 return 0;
1831}
1832
1833// WM_SIZE @implemented
1834// This message is sent when the window size is changed.
1836{
1837 // calculate the positions of the controls
1838 CRect rcList, rcScrollBar, rcSizeBox;
1839 CalcRects(m_bDowner, rcList, rcScrollBar, rcSizeBox);
1840
1841 // reposition the controls in smartest way
1843 HDWP hDWP = ::BeginDeferWindowPos(3);
1845 rcScrollBar.left, rcScrollBar.top,
1846 rcScrollBar.Width(), rcScrollBar.Height(), uSWP_);
1848 rcSizeBox.left, rcSizeBox.top,
1849 rcSizeBox.Width(), rcSizeBox.Height(), uSWP_);
1851 rcList.left, rcList.top,
1852 rcList.Width(), rcList.Height(), uSWP_);
1853 ::EndDeferWindowPos(hDWP);
1854
1856 return 0;
1857}
1858
1859// WM_SHOWWINDOW
1861{
1862 // hook mouse events
1863 BOOL bShow = (BOOL)wParam;
1864 if (bShow)
1865 {
1866 if (s_hWatchWnd != m_hWnd && ::IsWindowVisible(s_hWatchWnd))
1868 s_hWatchWnd = m_hWnd; // watch this
1869
1870 // unhook mouse if any
1871 if (s_hMouseHook)
1872 {
1873 HHOOK hHookOld = s_hMouseHook;
1875 ::UnhookWindowsHookEx(hHookOld);
1876 }
1877
1878 // hook mouse
1881
1882 // set timer
1884
1885 bHandled = FALSE; // do default
1886 return 0;
1887 }
1888 else
1889 {
1890 // kill timer
1892
1893 s_hWatchWnd = NULL; // unwatch
1894
1895 // unhook mouse if any
1896 if (s_hMouseHook)
1897 {
1898 HHOOK hHookOld = s_hMouseHook;
1900 ::UnhookWindowsHookEx(hHookOld);
1901 }
1902
1903 LRESULT ret = DefWindowProcW(uMsg, wParam, lParam); // do default
1904
1905 if (m_hwndCombo)
1907
1908 m_outerList.RemoveAll(); // no use
1909 return ret;
1910 }
1911}
1912
1913// WM_TIMER
1915{
1916 if (wParam != WATCH_TIMER_ID) // sanity check
1917 return 0;
1918
1919 // if the textbox is dead, then kill the timer
1920 if (!::IsWindow(m_hwndEdit))
1921 {
1923 return 0;
1924 }
1925
1926 // m_hwndEdit is moved?
1927 RECT rcEdit;
1928 ::GetWindowRect(m_hwndEdit, &rcEdit);
1929 if (!::EqualRect(&rcEdit, &m_rcEdit))
1930 {
1931 // if so, hide
1932 HideDropDown();
1933
1934 m_rcEdit = rcEdit; // update rectangle
1935 m_bResized = FALSE; // clear flag
1936 }
1937
1938 return 0;
1939}
1940
1941// WM_VSCROLL
1942// This message is sent when a scroll event occurs.
1944{
1945 TRACE("CAutoComplete::OnVScroll(%p)\n", this);
1947 switch (code)
1948 {
1950 {
1951 // get the scrolling info
1952 INT nPos = HIWORD(wParam);
1953 SCROLLINFO si = { sizeof(si), SIF_ALL };
1954 m_hwndList.GetScrollInfo(SB_VERT, &si);
1955
1956 // scroll the list-view by CListView::EnsureVisible
1957 INT cItems = m_hwndList.GetItemCount();
1958 // iItem : cItems == (nPos - si.nMin) : (si.nMax - si.nMin).
1959 INT iItem = cItems * (nPos - si.nMin) / (si.nMax - si.nMin);
1960 if (nPos > si.nPos)
1961 {
1962 iItem += m_hwndList.GetVisibleCount();
1963 if (iItem >= cItems)
1964 iItem = cItems - 1;
1965 }
1966 m_hwndList.EnsureVisible(iItem, FALSE);
1967
1968 // update scrolling position of m_hwndScrollBar
1969 si.fMask = SIF_POS;
1970 m_hwndList.GetScrollInfo(SB_VERT, &si);
1971 m_hwndScrollBar.SetScrollInfo(SB_VERT, &si, FALSE);
1972 break;
1973 }
1974 default:
1975 {
1976 // pass it to m_hwndList
1977 m_hwndList.SendMessageW(WM_VSCROLL, wParam, lParam);
1979 break;
1980 }
1981 }
1982 return 0;
1983}
1984
1985static inline PAC_THREAD
1987{
1988 return reinterpret_cast<PAC_THREAD>(
1989 ::InterlockedExchangePointer(reinterpret_cast<volatile PVOID *>(Target), Value));
1990}
1991
1992static unsigned __stdcall AutoCompThreadProc(void *arg)
1993{
1994 CAutoComplete* pThis = reinterpret_cast<CAutoComplete*>(arg);
1995 pThis->AutoCompThreadProc();
1996 return 0;
1997}
1998
2000{
2001 for (;;)
2002 {
2004 if (!pThread)
2005 break;
2006 DoThreadWork(pThread);
2007 }
2008}
2009
2011{
2012 if (pThread->m_bExpand || m_innerList.GetSize() == 0)
2013 {
2014 ReLoadInnerList(pThread);
2015 }
2016 else
2017 {
2018 pThread->m_innerList = m_innerList;
2019 }
2020
2021 if (m_pThread || !m_hThread)
2022 {
2023 delete pThread;
2024 return;
2025 }
2026
2027 ExtractInnerList(pThread->m_outerList, pThread->m_innerList, pThread->m_strText);
2028
2029 if (m_pThread || !m_hThread)
2030 {
2031 delete pThread;
2032 return;
2033 }
2034
2035 DoSort(pThread->m_outerList);
2036 DoUniqueAndTrim(pThread->m_outerList);
2037
2038 if (m_pThread || !m_hThread ||
2039 !::PostMessageW(m_hWnd, AUTOCOMP_FINISH, 0, (LPARAM)pThread))
2040 {
2041 delete pThread;
2042 }
2043}
2044
2045// AUTOCOMP_START
2047{
2048 BOOL bAppendOK = (BOOL)wParam;
2049
2050 CStringW strText = GetEditText();
2051 if (m_strText.CompareNoCase(strText) == 0)
2052 {
2053 // no change
2054 return 0;
2055 }
2056
2057 PAC_THREAD pThread = new AC_THREAD { this, bAppendOK, strText };
2058
2059 // if previous text was empty
2060 if (m_strText.IsEmpty())
2061 {
2062 pThread->m_bReset = TRUE;
2063 }
2064 m_strText = strText;
2065
2066 // do expand the items if the stem is changed
2067 CStringW strStemText = GetStemText(pThread->m_strText);
2068 if (m_strStemText.CompareNoCase(strStemText) != 0)
2069 {
2070 pThread->m_bReset = TRUE;
2071 pThread->m_bExpand = !strStemText.IsEmpty();
2072 m_strStemText = strStemText;
2073 }
2074
2075 // reset if necessary
2076 if (pThread->m_bReset && m_pEnum)
2077 {
2078 HRESULT hr = m_pEnum->Reset(); // IEnumString::Reset
2079 TRACE("m_pEnum->Reset(%p): 0x%08lx\n",
2080 static_cast<IUnknown *>(m_pEnum), hr);
2081 }
2082
2083 // update ac list if necessary
2084 if (pThread->m_bExpand && m_pACList)
2085 {
2086 HRESULT hr = m_pACList->Expand(strStemText); // IACList::Expand
2087 TRACE("m_pACList->Expand(%p, %S): 0x%08lx\n",
2088 static_cast<IUnknown *>(m_pACList),
2089 static_cast<LPCWSTR>(strStemText), hr);
2090 }
2091
2093 if (pOld)
2094 delete pOld;
2095
2096 BOOL bDoStart = FALSE;
2097 if (m_hThread)
2098 {
2100 {
2102 m_hThread = NULL;
2103 bDoStart = TRUE;
2104 }
2105 }
2106 else
2107 {
2108 bDoStart = TRUE;
2109 }
2110
2111 if (bDoStart)
2113
2114 return 0;
2115}
2116
2117// AUTOCOMP_FINISH
2119{
2120 PAC_THREAD pThread = reinterpret_cast<PAC_THREAD>(lParam);
2121 if (m_pThread == NULL)
2122 {
2123 FinishCompletion(pThread);
2124 }
2126 m_hThread = NULL;
2127 delete pThread;
2128 return 0;
2129}
2130
2132{
2133 if (m_pThread || !m_hThread)
2134 return;
2135
2136 if (!CanAutoSuggest() && !CanAutoAppend())
2137 return;
2138
2139 // set inner list
2140 m_innerList = pThread->m_innerList;
2141
2142 // set the items of the virtual listview
2143 m_outerList = pThread->m_outerList; // FIXME: We need more speed!
2144 m_hwndList.SendMessageW(LVM_SETITEMCOUNT, m_outerList.GetSize(), 0);
2145
2146 // save text
2147 m_strText = pThread->m_strText;
2149
2150 if (CanAutoSuggest()) // can we auto-suggest?
2151 {
2152 m_bInSelectItem = TRUE; // don't respond
2153 SelectItem(-1); // select none
2155
2156 if (m_outerList.GetSize() > 0)
2158 else
2159 HideDropDown();
2160 }
2161
2162 if (CanAutoAppend() && pThread->m_bAppendOK) // can we auto-append?
2163 {
2164 DoAutoAppend(pThread);
2165 }
2166}
static HDC hDC
Definition: 3dtext.c:33
static const PREFIX_INFO s_prefixes[]
static int RangeCompare(const void *x, const void *y)
static INT partition(list_t &list, INT i, INT j, const CStringW &x)
static unsigned __stdcall AutoCompThreadProc(void *arg)
static INT CALLBACK EditWordBreakProcW(LPWSTR lpch, INT index, INT count, INT code)
static INT pivot(list_t &list, INT i, INT j)
CSimpleArray< CStringW > list_t
#define MAX_ITEM_COUNT
#define CY_LIST
static HWND s_hWatchWnd
static PAC_THREAD InterlockedExchangeThreadData(volatile PAC_THREAD *Target, PAC_THREAD Value)
static LRESULT CALLBACK EditSubclassProc(HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam, UINT_PTR uSubclassID, DWORD_PTR dwData)
static void DoUniqueAndTrim(list_t &list)
static BOOL DoesMatch(const CStringW &strTarget, const CStringW &strText)
static INT compare1(const CStringW &str1, const CStringW &str2)
static void DoSort(list_t &list)
#define CX_LIST
#define WATCH_TIMER_ID
static BOOL IsWordBreak(WCHAR ch)
static BOOL DropPrefix(const CStringW &str, CStringW &strBody)
static INT DoUnique(list_t &list)
static HHOOK s_hMouseHook
#define CY_ITEM
static LRESULT CALLBACK MouseProc(INT nCode, WPARAM wParam, LPARAM lParam)
static void quicksort(list_t &list, INT i, INT j)
#define WATCH_INTERVAL
#define AUTOCOMP_FINISH
#define AUTOCOMP_START
#define ATLASSERT(x)
Definition: CComVariant.cpp:10
HWND hWnd
Definition: settings.c:17
#define index(s, c)
Definition: various.h:29
HFONT hFont
Definition: main.c:53
@ Create
Definition: registry.c:563
#define STDMETHODIMP
Definition: basetyps.h:43
#define FIXME(fmt,...)
Definition: debug.h:111
int GetSize() const
Definition: atlsimpcoll.h:104
BOOL Add(const T &t)
Definition: atlsimpcoll.h:58
bool IsEmpty() const noexcept
Definition: atlsimpstr.h:394
int GetLength() const noexcept
Definition: atlsimpstr.h:362
void Empty() noexcept
Definition: atlsimpstr.h:253
int CompareNoCase(_In_z_ PCXSTR psz) const
Definition: cstringt.h:743
CStringT Left(int nCount) const
Definition: cstringt.h:776
CStringT Mid(int iFirst, int nCount) const
Definition: cstringt.h:748
int ReverseFind(_In_ XCHAR ch) const noexcept
Definition: cstringt.h:730
LRESULT OnNCHitTest(UINT uMsg, WPARAM wParam, LPARAM lParam, BOOL &bHandled)
LRESULT OnLButtonDown(UINT uMsg, WPARAM wParam, LPARAM lParam, BOOL &bHandled)
LRESULT OnMouseWheel(UINT uMsg, WPARAM wParam, LPARAM lParam, BOOL &bHandled)
INT ItemFromPoint(INT x, INT y)
INT GetVisibleCount()
VOID SelectHere(INT x, INT y)
HWND Create(HWND hwndParent)
static LPCWSTR GetWndClassName()
Definition: CAutoComplete.h:40
CAutoComplete * m_pDropDown
Definition: CAutoComplete.h:38
CStringW GetItemText(INT iItem)
VOID SetFont(HFONT hFont)
LRESULT OnButtonUp(UINT uMsg, WPARAM wParam, LPARAM lParam, BOOL &bHandled)
LRESULT OnMRButtonDown(UINT uMsg, WPARAM wParam, LPARAM lParam, BOOL &bHandled)
VOID SetCurSel(INT iItem)
CAutoComplete * m_pDropDown
Definition: CAutoComplete.h:80
HWND Create(HWND hwndParent)
static LPCWSTR GetWndClassName()
Definition: CAutoComplete.h:81
static LPCWSTR GetWndClassName()
Definition: CAutoComplete.h:98
LRESULT OnEraseBkGnd(UINT uMsg, WPARAM wParam, LPARAM lParam, BOOL &bHandled)
CAutoComplete * m_pDropDown
Definition: CAutoComplete.h:97
BOOL m_bLongList
HWND Create(HWND hwndParent)
LRESULT OnPaint(UINT uMsg, WPARAM wParam, LPARAM lParam, BOOL &bHandled)
VOID SetStatus(BOOL bDowner, BOOL bLongList)
LRESULT OnNCHitTest(UINT uMsg, WPARAM wParam, LPARAM lParam, BOOL &bHandled)
STDMETHODIMP Enable(BOOL fEnable) override
LRESULT OnNCHitTest(UINT uMsg, WPARAM wParam, LPARAM lParam, BOOL &bHandled)
BOOL IsComboBoxDropped() const
CStringW GetEditText() const
LRESULT EditWndProc(HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam)
VOID DoThreadWork(PAC_THREAD pThread)
VOID UpdateDropDownState()
CSimpleArray< CStringW > m_innerList
CACListView m_hwndList
STDMETHODIMP Reset() override
VOID RepositionDropDown()
LRESULT OnTimer(UINT uMsg, WPARAM wParam, LPARAM lParam, BOOL &bHandled)
LRESULT OnVScroll(UINT uMsg, WPARAM wParam, LPARAM lParam, BOOL &bHandled)
CStringW m_strQuickComplete
STDMETHODIMP GetOptions(DWORD *pdwFlag) override
CStringW m_strStemText
BOOL FilterPrefixes() const
LRESULT OnExitSizeMove(UINT uMsg, WPARAM wParam, LPARAM lParam, BOOL &bHandled)
VOID SetEditText(LPCWSTR pszText)
LRESULT OnEditChar(WPARAM wParam, LPARAM lParam)
CComPtr< IACList > m_pACList
LRESULT OnDrawItem(UINT uMsg, WPARAM wParam, LPARAM lParam, BOOL &bHandled)
STDMETHODIMP Next(ULONG celt, LPOLESTR *rgelt, ULONG *pceltFetched) override
LRESULT OnMouseActivate(UINT uMsg, WPARAM wParam, LPARAM lParam, BOOL &bHandled)
CStringW GetQuickEdit(LPCWSTR pszText) const
virtual VOID OnFinalMessage(HWND) override
LRESULT OnNotify(UINT uMsg, WPARAM wParam, LPARAM lParam, BOOL &bHandled)
VOID AutoCompThreadProc()
STDMETHODIMP Init(HWND hwndEdit, IUnknown *punkACL, LPCOLESTR pwszRegKeyPath, LPCOLESTR pwszQuickComplete) override
VOID StartCompletion(BOOL bAppendOK)
CSimpleArray< CStringW > m_outerList
LRESULT OnShowWindow(UINT uMsg, WPARAM wParam, LPARAM lParam, BOOL &bHandled)
STDMETHODIMP ResetEnumerator() override
EDITWORDBREAKPROCW m_fnOldWordBreakProc
BOOL OnEditKeyDown(WPARAM wParam, LPARAM lParam)
STDMETHODIMP Clone(IEnumString **ppOut) override
PAC_THREAD m_pThread
WNDPROC m_fnOldEditProc
VOID SelectItem(INT iItem)
CStringW m_strText
LRESULT OnGetMinMaxInfo(UINT uMsg, WPARAM wParam, LPARAM lParam, BOOL &bHandled)
LRESULT OnSize(UINT uMsg, WPARAM wParam, LPARAM lParam, BOOL &bHandled)
VOID SetEditSel(INT ich0, INT ich1)
virtual ~CAutoComplete()
BOOL UseTab() const
VOID UpdateScrollBar()
CACSizeBox m_hwndSizeBox
LRESULT OnNCActivate(UINT uMsg, WPARAM wParam, LPARAM lParam, BOOL &bHandled)
LRESULT OnCreate(UINT uMsg, WPARAM wParam, LPARAM lParam, BOOL &bHandled)
STDMETHODIMP GetDropDownStatus(DWORD *pdwFlags, LPWSTR *ppwszString) override
LRESULT OnAutoCompFinish(UINT uMsg, WPARAM wParam, LPARAM lParam, BOOL &bHandled)
CACScrollBar m_hwndScrollBar
BOOL OnListUpDown(UINT vk)
CStringW GetItemText(INT iItem) const
VOID ExtractInnerList(CSimpleArray< CStringW > &outerList, const CSimpleArray< CStringW > &innerList, const CString &strText)
LRESULT OnNCDestroy(UINT uMsg, WPARAM wParam, LPARAM lParam, BOOL &bHandled)
LRESULT OnMeasureItem(UINT uMsg, WPARAM wParam, LPARAM lParam, BOOL &bHandled)
LRESULT OnNCLButtonDown(UINT uMsg, WPARAM wParam, LPARAM lParam, BOOL &bHandled)
BOOL CanAutoSuggest() const
VOID DoAutoAppend(PAC_THREAD pThread)
VOID FinishCompletion(PAC_THREAD pThread)
CComPtr< IEnumString > m_pEnum
VOID ReLoadInnerList(PAC_THREAD pThread)
CStringW GetStemText(const CStringW &strText) const
STDMETHODIMP SetOptions(DWORD dwFlag) override
VOID CalcRects(BOOL bDowner, RECT &rcListView, RECT &rcScrollBar, RECT &rcSizeBox) const
VOID LoadQuickComplete(LPCWSTR pwszRegKeyPath, LPCWSTR pwszQuickComplete)
STDMETHODIMP Skip(ULONG celt) override
LRESULT OnAutoCompStart(UINT uMsg, WPARAM wParam, LPARAM lParam, BOOL &bHandled)
BOOL CanAutoAppend() const
INT GetItemCount() const
int Width() const noexcept
Definition: atltypes.h:461
int Height() const noexcept
Definition: atltypes.h:318
Definition: list.h:37
static int InsertColumn(int nCol, LPCWSTR lpszColumnHeading, int nFormat, int nWidth, int nSubItem)
Definition: column.c:67
WPARAM wParam
Definition: combotst.c:138
HWND hwndEdit
Definition: combotst.c:65
LPARAM lParam
Definition: combotst.c:139
BOOL WINAPI SetWindowSubclass(HWND hWnd, SUBCLASSPROC pfnSubclass, UINT_PTR uIDSubclass, DWORD_PTR dwRef)
Definition: commctrl.c:1261
BOOL WINAPI RemoveWindowSubclass(HWND hWnd, SUBCLASSPROC pfnSubclass, UINT_PTR uID)
Definition: commctrl.c:1390
LRESULT WINAPI DefSubclassProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam)
Definition: commctrl.c:1496
static HWND hwndParent
Definition: cryptui.c:300
#define WAIT_TIMEOUT
Definition: dderror.h:14
#define E_OUTOFMEMORY
Definition: ddrawi.h:100
#define E_INVALIDARG
Definition: ddrawi.h:101
#define E_NOTIMPL
Definition: ddrawi.h:99
#define E_FAIL
Definition: ddrawi.h:102
#define NULL
Definition: types.h:112
#define TRUE
Definition: types.h:120
#define FALSE
Definition: types.h:117
INT WINAPI StrCmpNIW(LPCWSTR lpszStr, LPCWSTR lpszComp, INT iLen)
Definition: string.c:311
#define CloseHandle
Definition: compat.h:739
HANDLE HWND
Definition: compat.h:19
#define MAX_PATH
Definition: compat.h:34
#define CALLBACK
Definition: compat.h:35
const WCHAR * text
Definition: package.c:1799
LONG WINAPI SHRegGetUSValueW(LPCWSTR pSubKey, LPCWSTR pValue, LPDWORD pwType, LPVOID pvData, LPDWORD pcbData, BOOL flagIgnoreHKCU, LPVOID pDefaultData, DWORD wDefaultDataSize)
Definition: reg.c:594
BOOL WINAPI ChrCmpIW(WCHAR ch1, WCHAR ch2)
Definition: string.c:217
HRESULT WINAPI SHStrDupW(LPCWSTR src, LPWSTR *dest)
Definition: string.c:2004
INT WINAPI SHUnicodeToAnsi(LPCWSTR lpSrcStr, LPSTR lpDstStr, INT iLen)
Definition: string.c:2783
int WINAPI StrCmpIW(LPCWSTR lpszStr, LPCWSTR lpszComp)
Definition: string.c:353
#define pt(x, y)
Definition: drawing.c:79
r dropped
Definition: btrfs.c:3014
#define InterlockedExchangePointer(Target, Value)
Definition: dshow.h:45
unsigned int BOOL
Definition: ntddk_ex.h:94
unsigned long DWORD
Definition: ntddk_ex.h:95
unsigned short WORD
Definition: ntddk_ex.h:93
pKey DeleteObject()
GLint GLint GLint GLint GLint x
Definition: gl.h:1548
GLint GLint GLint GLint GLint GLint y
Definition: gl.h:1548
GLuint GLuint GLsizei count
Definition: gl.h:1545
GLuint index
Definition: glext.h:6031
GLdouble GLdouble right
Definition: glext.h:10859
GLboolean GLboolean GLboolean b
Definition: glext.h:6204
GLenum GLint * range
Definition: glext.h:7539
GLint left
Definition: glext.h:7726
const GLint * first
Definition: glext.h:5794
GLfloat GLfloat p
Definition: glext.h:8902
GLboolean GLboolean GLboolean GLboolean a
Definition: glext.h:6204
GLuint64EXT * result
Definition: glext.h:11304
GLsizei GLenum const GLvoid GLsizei GLenum GLbyte GLbyte GLbyte GLdouble GLdouble GLdouble GLfloat GLfloat GLfloat GLint GLint GLint GLshort GLshort GLshort GLubyte GLubyte GLubyte GLuint GLuint GLuint GLushort GLushort GLushort GLbyte GLbyte GLbyte GLbyte GLdouble GLdouble GLdouble GLdouble GLfloat GLfloat GLfloat GLfloat GLint GLint GLint GLint GLshort GLshort GLshort GLshort GLubyte GLubyte GLubyte GLubyte GLuint GLuint GLuint GLuint GLushort GLushort GLushort GLushort GLboolean const GLdouble const GLfloat const GLint const GLshort const GLbyte const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLdouble const GLfloat const GLfloat const GLint const GLint const GLshort const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort GLenum GLenum GLenum GLfloat GLenum GLint GLenum GLenum GLenum GLfloat GLenum GLenum GLint GLenum GLfloat GLenum GLint GLint GLushort GLenum GLenum GLfloat GLenum GLenum GLint GLfloat const GLubyte GLenum GLenum GLenum const GLfloat GLenum GLenum const GLint GLenum GLint GLint GLsizei GLsizei GLint GLenum GLenum const GLvoid GLenum GLenum const GLfloat GLenum GLenum const GLint GLenum GLenum const GLdouble GLenum GLenum const GLfloat GLenum GLenum const GLint GLsizei GLuint GLfloat GLuint GLbitfield GLfloat GLint GLuint GLboolean GLenum GLfloat GLenum GLbitfield GLenum GLfloat GLfloat GLint GLint const GLfloat GLenum GLfloat GLfloat GLint GLint GLfloat GLfloat GLint GLint const GLfloat GLint GLfloat GLfloat GLint GLfloat GLfloat GLint GLfloat GLfloat const GLdouble const GLfloat const GLdouble const GLfloat GLint i
Definition: glfuncs.h:248
GLsizei GLenum const GLvoid GLsizei GLenum GLbyte GLbyte GLbyte GLdouble GLdouble GLdouble GLfloat GLfloat GLfloat GLint GLint GLint GLshort GLshort GLshort GLubyte GLubyte GLubyte GLuint GLuint GLuint GLushort GLushort GLushort GLbyte GLbyte GLbyte GLbyte GLdouble GLdouble GLdouble GLdouble GLfloat GLfloat GLfloat GLfloat GLint GLint GLint GLint GLshort GLshort GLshort GLshort GLubyte GLubyte GLubyte GLubyte GLuint GLuint GLuint GLuint GLushort GLushort GLushort GLushort GLboolean const GLdouble const GLfloat const GLint const GLshort const GLbyte const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLdouble const GLfloat const GLfloat const GLint const GLint const GLshort const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort GLenum GLenum GLenum GLfloat GLenum GLint GLenum GLenum GLenum GLfloat GLenum GLenum GLint GLenum GLfloat GLenum GLint GLint GLushort GLenum GLenum GLfloat GLenum GLenum GLint GLfloat const GLubyte GLenum GLenum GLenum const GLfloat GLenum GLenum const GLint GLenum GLint GLint GLsizei GLsizei GLint GLenum GLenum const GLvoid GLenum GLenum const GLfloat GLenum GLenum const GLint GLenum GLenum const GLdouble GLenum GLenum const GLfloat GLenum GLenum const GLint GLsizei GLuint GLfloat GLuint GLbitfield GLfloat GLint GLuint GLboolean GLenum GLfloat GLenum GLbitfield GLenum GLfloat GLfloat GLint GLint const GLfloat GLenum GLfloat GLfloat GLint GLint GLfloat GLfloat GLint GLint const GLfloat GLint GLfloat GLfloat GLint GLfloat GLfloat GLint GLfloat GLfloat const GLdouble const GLfloat const GLdouble const GLfloat GLint GLint GLint j
Definition: glfuncs.h:250
VOID WINAPI CoTaskMemFree(LPVOID ptr)
Definition: ifs.c:442
@ ACO_FILTERPREFIXES
Definition: shldisp.idl:98
@ ACO_UPDOWNKEYDROPSLIST
Definition: shldisp.idl:100
ULONG AddRef()
HRESULT QueryInterface([in] REFIID riid, [out, iid_is(riid)] void **ppvObject)
ULONG Release()
#define S_OK
Definition: intsafe.h:52
#define debugstr_w
Definition: kernel32.h:32
#define REG_SZ
Definition: layer.c:22
struct S1 s1
struct S2 s2
static HDC
Definition: imagelist.c:92
static DWORD DWORD void LPSTR DWORD cch
Definition: str.c:202
static UINT UINT last
Definition: font.c:45
static DWORD *static HFONT(WINAPI *pCreateFontIndirectExA)(const ENUMLOGFONTEXDVA *)
static HRGN hRgn
Definition: mapping.c:33
static HANDLE ULONG_PTR dwData
Definition: file.c:35
static LPOLESTR
Definition: stg_prop.c:27
#define shift
Definition: input.c:1755
WORD vk
Definition: input.c:77
int k
Definition: mpi.c:3369
unsigned __int3264 UINT_PTR
Definition: mstsclib_h.h:274
HMONITOR WINAPI MonitorFromWindow(HWND, DWORD)
unsigned int UINT
Definition: ndis.h:50
#define BOOL
Definition: nt_native.h:43
#define REG_NONE
Definition: nt_native.h:1492
#define REG_EXPAND_SZ
Definition: nt_native.h:1494
INT WINAPI DrawTextW(HDC hdc, LPCWSTR str, INT count, LPRECT rect, UINT flags)
Definition: defwnd.c:16
#define L(x)
Definition: ntvdm.h:50
const GUID IID_IEnumString
#define LOWORD(l)
Definition: pedump.c:82
#define WS_CHILD
Definition: pedump.c:617
#define WS_EX_NOPARENTNOTIFY
Definition: pedump.c:646
#define WS_BORDER
Definition: pedump.c:625
#define WS_POPUP
Definition: pedump.c:616
#define WS_EX_TOPMOST
Definition: pedump.c:647
#define WS_CLIPSIBLINGS
Definition: pedump.c:618
#define WS_CLIPCHILDREN
Definition: pedump.c:619
#define WS_THICKFRAME
Definition: pedump.c:630
#define INT
Definition: polytest.cpp:20
#define LVN_GETDISPINFOA
Definition: commctrl.h:3153
_Out_opt_ int _Out_opt_ int * cy
Definition: commctrl.h:586
#define LVS_EX_ONECLICKACTIVATE
Definition: commctrl.h:2735
#define LVS_SINGLESEL
Definition: commctrl.h:2266
#define LVN_HOTTRACK
Definition: commctrl.h:3152
#define L_MAX_URL_LENGTH
Definition: commctrl.h:4735
#define LV_DISPINFOW
Definition: commctrl.h:3169
#define LVS_NOCOLUMNHEADER
Definition: commctrl.h:2284
#define NM_DBLCLK
Definition: commctrl.h:131
#define LVIF_STATE
Definition: commctrl.h:2312
#define LVS_OWNERDATA
Definition: commctrl.h:2274
#define LVS_OWNERDRAWFIXED
Definition: commctrl.h:2283
#define LVNI_SELECTED
Definition: commctrl.h:2424
#define LVS_REPORT
Definition: commctrl.h:2262
#define LVCF_WIDTH
Definition: commctrl.h:2587
_Out_opt_ int * cx
Definition: commctrl.h:585
#define WC_COMBOBOXEXW
Definition: commctrl.h:3781
#define ODT_LISTVIEW
Definition: commctrl.h:80
#define NM_HOVER
Definition: commctrl.h:138
#define LVS_EX_FULLROWSELECT
Definition: commctrl.h:2734
#define LVS_EX_TRACKSELECT
Definition: commctrl.h:2732
#define LVM_SETITEMCOUNT
Definition: commctrl.h:2696
#define LVIS_SELECTED
Definition: commctrl.h:2319
#define LV_COLUMNW
Definition: commctrl.h:2546
#define LVIF_TEXT
Definition: commctrl.h:2309
#define LVCF_FMT
Definition: commctrl.h:2586
#define LV_HITTESTINFO
Definition: commctrl.h:2504
#define LV_ITEMW
Definition: commctrl.h:2332
#define LVCFMT_LEFT
Definition: commctrl.h:2598
#define LVN_GETDISPINFOW
Definition: commctrl.h:3154
#define LV_ITEMA
Definition: commctrl.h:2331
#define LVN_ITEMCHANGED
Definition: commctrl.h:3131
#define LVN_ITEMACTIVATE
Definition: commctrl.h:3147
#define LV_DISPINFOA
Definition: commctrl.h:3168
#define WC_COMBOBOXW
Definition: commctrl.h:4717
#define LVNI_ALL
Definition: commctrl.h:2422
const WCHAR * str
_CRTIMP uintptr_t __cdecl _beginthreadex(_In_opt_ void *_Security, _In_ unsigned _StackSize, _In_ unsigned(__stdcall *_StartAddress)(void *), _In_opt_ void *_ArgList, _In_ unsigned _InitFlag, _Out_opt_ unsigned *_ThrdAddr)
HRESULT hr
Definition: shlfolder.c:183
#define _countof(array)
Definition: sndvol32.h:68
#define TRACE(s)
Definition: solgame.cpp:4
STRSAFEAPI StringCbCopyW(STRSAFE_LPWSTR pszDest, size_t cbDest, STRSAFE_LPCWSTR pszSrc)
Definition: strsafe.h:166
CSimpleArray< CStringW > m_outerList
BOOL m_bAppendOK
CSimpleArray< CStringW > m_innerList
CStringW m_strText
BOOL m_bExpand
WCHAR from
WCHAR to
Definition: inflate.c:139
POINT ptMinTrackSize
Definition: winuser.h:3630
RECT rcMonitor
Definition: winuser.h:3785
UINT code
Definition: winuser.h:3159
HWND hwndFrom
Definition: winuser.h:3157
long y
Definition: polytest.cpp:48
long x
Definition: polytest.cpp:48
LONG right
Definition: windef.h:308
LONG bottom
Definition: windef.h:309
LONG top
Definition: windef.h:307
LONG left
Definition: windef.h:306
Definition: time.h:68
DWORD WINAPI WaitForSingleObject(IN HANDLE hHandle, IN DWORD dwMilliseconds)
Definition: synch.c:82
#define bsearch
#define GWLP_WNDPROC
Definition: treelist.c:66
uint32_t DWORD_PTR
Definition: typedefs.h:65
PVOID HANDLE
Definition: typedefs.h:73
int32_t INT
Definition: typedefs.h:58
#define __stdcall
Definition: typedefs.h:25
uint32_t ULONG
Definition: typedefs.h:59
#define HIWORD(l)
Definition: typedefs.h:247
int ret
_Must_inspect_result_ _In_ WDFKEY _In_ PCUNICODE_STRING _Out_opt_ PUSHORT _Inout_opt_ PUNICODE_STRING Value
Definition: wdfregistry.h:413
_In_ WDFIOTARGET Target
Definition: wdfrequest.h:306
int WINAPI GetWindowTextW(HWND hWnd, LPWSTR lpString, int nMaxCount)
Definition: window.c:1412
static MONITORINFO mi
Definition: win.c:7338
DWORD WINAPI GetCurrentThreadId(void)
Definition: thread.c:459
_In_ LONG _In_ HWND hwnd
Definition: winddi.h:4023
LONG_PTR LPARAM
Definition: windef.h:208
LONG_PTR LRESULT
Definition: windef.h:209
UINT_PTR WPARAM
Definition: windef.h:207
void * arg
Definition: msvc.h:10
#define SubclassWindow(hwnd, lpfn)
Definition: windowsx.h:542
#define GET_Y_LPARAM(lp)
Definition: windowsx.h:300
#define GET_X_LPARAM(lp)
Definition: windowsx.h:299
BOOL WINAPI GetTextMetricsW(_In_ HDC, _Out_ LPTEXTMETRICW)
Definition: text.c:221
HGDIOBJ WINAPI GetStockObject(_In_ int)
#define DEFAULT_GUI_FONT
Definition: wingdi.h:909
HGDIOBJ WINAPI SelectObject(_In_ HDC, _In_ HGDIOBJ)
Definition: dc.c:1539
BOOL WINAPI MoveToEx(_In_ HDC, _In_ int, _In_ int, _Out_opt_ LPPOINT)
HDC WINAPI CreateCompatibleDC(_In_opt_ HDC hdc)
#define TRANSPARENT
Definition: wingdi.h:950
HRGN WINAPI PathToRegion(_In_ HDC)
int WINAPI FillRect(HDC, LPCRECT, HBRUSH)
int WINAPI SetBkMode(_In_ HDC, _In_ int)
Definition: dc.c:1056
COLORREF WINAPI SetTextColor(_In_ HDC, _In_ COLORREF)
Definition: text.c:918
BOOL WINAPI DeleteDC(_In_ HDC)
HPEN WINAPI CreatePen(_In_ int, _In_ int, _In_ COLORREF)
BOOL WINAPI EndPath(_In_ HDC)
BOOL WINAPI LineTo(_In_ HDC, _In_ int, _In_ int)
BOOL WINAPI BeginPath(_In_ HDC hdc)
#define PS_SOLID
Definition: wingdi.h:586
HWND WINAPI GetFocus(void)
Definition: window.c:1893
#define HTTOPRIGHT
Definition: winuser.h:2492
HWND WINAPI ChildWindowFromPoint(_In_ HWND, _In_ POINT)
int WINAPI ReleaseDC(_In_opt_ HWND, _In_ HDC)
#define GetMonitorInfo
Definition: winuser.h:5791
DWORD WINAPI GetSysColor(_In_ int)
BOOL WINAPI IsWindow(_In_opt_ HWND)
#define ODS_SELECTED
Definition: winuser.h:2545
#define WM_GETTEXTLENGTH
Definition: winuser.h:1619
#define SW_HIDE
Definition: winuser.h:768
#define WM_CLOSE
Definition: winuser.h:1621
#define SWP_NOACTIVATE
Definition: winuser.h:1242
#define DT_NOPREFIX
Definition: winuser.h:537
#define SB_THUMBTRACK
Definition: winuser.h:573
#define GetWindowLongPtrW
Definition: winuser.h:4829
#define VK_TAB
Definition: winuser.h:2199
#define SWP_FRAMECHANGED
Definition: winuser.h:1240
#define WM_PASTE
Definition: winuser.h:1863
#define COLOR_WINDOW
Definition: winuser.h:918
BOOL WINAPI ShowWindow(_In_ HWND, _In_ int)
LRESULT WINAPI DefWindowProcW(_In_ HWND, _In_ UINT, _In_ WPARAM, _In_ LPARAM)
BOOL WINAPI PostMessageW(_In_opt_ HWND, _In_ UINT, _In_ WPARAM, _In_ LPARAM)
#define COLOR_WINDOWTEXT
Definition: winuser.h:921
#define WM_VSCROLL
Definition: winuser.h:1744
BOOL WINAPI GetWindowRect(_In_ HWND, _Out_ LPRECT)
#define EM_GETSEL
Definition: winuser.h:1997
BOOL WINAPI SetWindowPos(_In_ HWND, _In_opt_ HWND, _In_ int, _In_ int, _In_ int, _In_ int, _In_ UINT)
#define SM_CXVSCROLL
Definition: winuser.h:961
#define WB_ISDELIMITER
Definition: winuser.h:549
#define WM_SIZE
Definition: winuser.h:1611
#define COLOR_HIGHLIGHT
Definition: winuser.h:926
int WINAPI SetWindowRgn(_In_ HWND, _In_opt_ HRGN, _In_ BOOL)
HBRUSH WINAPI GetSysColorBrush(_In_ int)
#define SB_VERT
Definition: winuser.h:553
#define DT_SINGLELINE
Definition: winuser.h:540
#define DLGC_WANTALLKEYS
Definition: winuser.h:2612
#define SWP_NOMOVE
Definition: winuser.h:1244
#define SBS_SIZEBOX
Definition: winuser.h:329
#define EM_REPLACESEL
Definition: winuser.h:2006
#define VK_CONTROL
Definition: winuser.h:2203
BOOL WINAPI GetCursorPos(_Out_ LPPOINT)
Definition: cursoricon.c:2670
#define HC_ACTION
Definition: winuser.h:48
#define WS_EX_TOOLWINDOW
Definition: winuser.h:404
#define WM_RBUTTONUP
Definition: winuser.h:1780
BOOL WINAPI AdjustWindowRectEx(_Inout_ LPRECT, _In_ DWORD, _In_ BOOL, _In_ DWORD)
#define VK_UP
Definition: winuser.h:2225
#define SW_SHOWNOACTIVATE
Definition: winuser.h:774
#define WM_SETFOCUS
Definition: winuser.h:1613
#define COLOR_3DSHADOW
Definition: winuser.h:931
#define SWP_NOSIZE
Definition: winuser.h:1245
#define WM_NCMBUTTONUP
Definition: winuser.h:1699
HWND WINAPI GetCapture(void)
Definition: message.c:2881
#define WM_CUT
Definition: winuser.h:1861
#define MA_NOACTIVATE
Definition: winuser.h:2503
#define WM_LBUTTONDOWN
Definition: winuser.h:1776
BOOL WINAPI EndDeferWindowPos(_In_ HDWP)
#define SetWindowsHookEx
Definition: winuser.h:5856
#define SM_CYHSCROLL
Definition: winuser.h:962
UINT_PTR WINAPI SetTimer(_In_opt_ HWND, _In_ UINT_PTR, _In_ UINT, _In_opt_ TIMERPROC)
#define VK_NEXT
Definition: winuser.h:2221
#define WM_RBUTTONDOWN
Definition: winuser.h:1779
BOOL WINAPI ShowWindowAsync(_In_ HWND, _In_ int)
BOOL WINAPI PtInRect(_In_ LPCRECT, _In_ POINT)
#define WM_SETTEXT
Definition: winuser.h:1617
#define SBS_BOTTOMALIGN
Definition: winuser.h:325
#define DT_LEFT
Definition: winuser.h:534
BOOL WINAPI GetClientRect(_In_ HWND, _Out_ LPRECT)
#define VK_RETURN
Definition: winuser.h:2201
#define HWND_TOP
Definition: winuser.h:1207
HWND WINAPI SetFocus(_In_opt_ HWND)
#define WH_MOUSE
Definition: winuser.h:37
BOOL WINAPI UnhookWindowsHookEx(_In_ HHOOK)
#define SWP_NOCOPYBITS
Definition: winuser.h:1243
#define WM_NCMBUTTONDOWN
Definition: winuser.h:1698
#define WB_LEFT
Definition: winuser.h:550
#define WM_SETFONT
Definition: winuser.h:1650
HWND WINAPI CreateWindowExW(_In_ DWORD dwExStyle, _In_opt_ LPCWSTR lpClassName, _In_opt_ LPCWSTR lpWindowName, _In_ DWORD dwStyle, _In_ int X, _In_ int Y, _In_ int nWidth, _In_ int nHeight, _In_opt_ HWND hWndParent, _In_opt_ HMENU hMenu, _In_opt_ HINSTANCE hInstance, _In_opt_ LPVOID lpParam)
BOOL WINAPI EndPaint(_In_ HWND, _In_ const PAINTSTRUCT *)
#define SM_CXBORDER
Definition: winuser.h:964
#define EM_SETWORDBREAKPROC
Definition: winuser.h:2020
#define SIF_ALL
Definition: winuser.h:1232
#define VK_BACK
Definition: winuser.h:2198
#define HTBOTTOMRIGHT
Definition: winuser.h:2495
#define COLOR_HIGHLIGHTTEXT
Definition: winuser.h:927
HDC WINAPI GetDC(_In_opt_ HWND)
#define EM_SETSEL
Definition: winuser.h:2018
#define SBS_VERT
Definition: winuser.h:334
int(CALLBACK * EDITWORDBREAKPROCW)(LPWSTR, int, int, int)
Definition: winuser.h:2905
#define CB_GETDROPPEDSTATE
Definition: winuser.h:1945
#define WM_LBUTTONUP
Definition: winuser.h:1777
#define WB_RIGHT
Definition: winuser.h:551
#define WM_CHAR
Definition: winuser.h:1717
#define DT_VCENTER
Definition: winuser.h:543
HWND WINAPI GetParent(_In_ HWND)
int WINAPI GetClassNameW(_In_ HWND hWnd, _Out_writes_to_(nMaxCount, return) LPWSTR lpClassName, _In_ int nMaxCount)
#define SIF_POS
Definition: winuser.h:1234
#define WM_NCLBUTTONUP
Definition: winuser.h:1693
#define VK_DOWN
Definition: winuser.h:2227
#define HTTRANSPARENT
Definition: winuser.h:2473
#define SB_CTL
Definition: winuser.h:554
BOOL WINAPI OffsetRect(_Inout_ LPRECT, _In_ int, _In_ int)
#define VK_SHIFT
Definition: winuser.h:2202
HDWP WINAPI DeferWindowPos(_In_ HDWP, _In_ HWND, _In_opt_ HWND, _In_ int, _In_ int, _In_ int, _In_ int, _In_ UINT)
#define VK_PRIOR
Definition: winuser.h:2220
#define VK_DELETE
Definition: winuser.h:2233
#define WM_DESTROY
Definition: winuser.h:1609
#define WM_NCRBUTTONUP
Definition: winuser.h:1696
#define WM_CLEAR
Definition: winuser.h:1864
#define WM_KEYDOWN
Definition: winuser.h:1715
BOOL WINAPI InvalidateRect(_In_opt_ HWND, _In_opt_ LPCRECT, _In_ BOOL)
LRESULT(CALLBACK * WNDPROC)(HWND, UINT, WPARAM, LPARAM)
Definition: winuser.h:2906
#define SWP_NOZORDER
Definition: winuser.h:1247
HDC WINAPI BeginPaint(_In_ HWND, _Out_ LPPAINTSTRUCT)
BOOL WINAPI KillTimer(_In_opt_ HWND, _In_ UINT_PTR)
LRESULT WINAPI CallWindowProcW(_In_ WNDPROC, _In_ HWND, _In_ UINT, _In_ WPARAM, _In_ LPARAM)
#define WM_MBUTTONUP
Definition: winuser.h:1783
#define VK_ESCAPE
Definition: winuser.h:2214
BOOL WINAPI IsWindowVisible(_In_ HWND)
#define WM_KILLFOCUS
Definition: winuser.h:1614
BOOL WINAPI EqualRect(_In_ LPCRECT, _In_ LPCRECT)
int WINAPI GetSystemMetrics(_In_ int)
#define WM_NCLBUTTONDOWN
Definition: winuser.h:1692
BOOL WINAPI MoveWindow(_In_ HWND, _In_ int, _In_ int, _In_ int, _In_ int, _In_ BOOL)
#define WM_GETDLGCODE
Definition: winuser.h:1689
#define WM_MBUTTONDOWN
Definition: winuser.h:1782
LRESULT WINAPI SendMessageW(_In_ HWND, _In_ UINT, _In_ WPARAM, _In_ LPARAM)
SHORT WINAPI GetKeyState(_In_ int)
#define WM_NCRBUTTONDOWN
Definition: winuser.h:1695
HDWP WINAPI BeginDeferWindowPos(_In_ int)
#define COLOR_3DFACE
Definition: winuser.h:929
#define SB_THUMBPOSITION
Definition: winuser.h:572
BOOL WINAPI ScreenToClient(_In_ HWND, _Inout_ LPPOINT)
_In_ ULONG iColor
Definition: xlateobj.h:17
__wchar_t WCHAR
Definition: xmlstorage.h:180
WCHAR * LPWSTR
Definition: xmlstorage.h:184
const WCHAR * LPCWSTR
Definition: xmlstorage.h:185