ReactOS 0.4.15-dev-8408-g466a198
CAutoComplete Class Reference

#include <CAutoComplete.h>

Inheritance diagram for CAutoComplete:
Collaboration diagram for CAutoComplete:

Public Member Functions

 CAutoComplete ()
 
virtual ~CAutoComplete ()
 
HWND CreateDropDown ()
 
BOOL CanAutoSuggest () const
 
BOOL CanAutoAppend () const
 
BOOL UseTab () const
 
BOOL IsComboBoxDropped () const
 
BOOL FilterPrefixes () const
 
INT GetItemCount () const
 
CStringW GetItemText (INT iItem) const
 
CStringW GetEditText () const
 
VOID SetEditText (LPCWSTR pszText)
 
CStringW GetStemText (const CStringW &strText) const
 
VOID SetEditSel (INT ich0, INT ich1)
 
VOID ShowDropDown ()
 
VOID HideDropDown ()
 
VOID SelectItem (INT iItem)
 
VOID DoAutoAppend (PAC_THREAD pThread)
 
VOID DoThreadWork (PAC_THREAD pThread)
 
VOID DoBackWord ()
 
VOID UpdateScrollBar ()
 
VOID StartCompletion (BOOL bAppendOK)
 
VOID AutoCompThreadProc ()
 
VOID FinishCompletion (PAC_THREAD pThread)
 
LRESULT EditWndProc (HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam)
 
LRESULT OnEditChar (WPARAM wParam, LPARAM lParam)
 
BOOL OnEditKeyDown (WPARAM wParam, LPARAM lParam)
 
VOID OnListSelChange ()
 
BOOL OnListUpDown (UINT vk)
 
STDMETHODIMP Enable (BOOL fEnable) override
 
STDMETHODIMP Init (HWND hwndEdit, IUnknown *punkACL, LPCOLESTR pwszRegKeyPath, LPCOLESTR pwszQuickComplete) override
 
STDMETHODIMP GetOptions (DWORD *pdwFlag) override
 
STDMETHODIMP SetOptions (DWORD dwFlag) override
 
STDMETHODIMP GetDropDownStatus (DWORD *pdwFlags, LPWSTR *ppwszString) override
 
STDMETHODIMP ResetEnumerator () override
 
STDMETHODIMP Next (ULONG celt, LPOLESTR *rgelt, ULONG *pceltFetched) override
 
STDMETHODIMP Skip (ULONG celt) override
 
STDMETHODIMP Reset () override
 
STDMETHODIMP Clone (IEnumString **ppOut) override
 
- Public Member Functions inherited from ATL::CComObjectRootEx< CComMultiThreadModelNoCS >
 ~CComObjectRootEx ()
 
ULONG InternalAddRef ()
 
ULONG InternalRelease ()
 
void Lock ()
 
void Unlock ()
 
HRESULT _AtlInitialConstruct ()
 
- Public Member Functions inherited from ATL::CComObjectRootBase
 CComObjectRootBase ()
 
 ~CComObjectRootBase ()
 
void SetVoid (void *)
 
HRESULT _AtlFinalConstruct ()
 
HRESULT FinalConstruct ()
 
void InternalFinalConstructAddRef ()
 
void InternalFinalConstructRelease ()
 
void FinalRelease ()
 
HRESULT SetOptions ([in] DWORD dwFlag)
 
HRESULT GetOptions ([out] DWORD *pdwFlag)
 
HRESULT Init ([in] HWND hwndEdit, [in] IUnknown *punkACL, [in] LPCOLESTR pwszRegKeyPath, [in] LPCOLESTR pwszQuickComplete)
 
HRESULT Enable ([in] BOOL fEnable)
 
- Public Member Functions inherited from IUnknown
HRESULT QueryInterface ([in] REFIID riid, [out, iid_is(riid)] void **ppvObject)
 
ULONG AddRef ()
 
ULONG Release ()
 
HRESULT GetDropDownStatus ([out] DWORD *pdwFlags, [out, string] LPWSTR *ppwszString)
 
HRESULT ResetEnumerator ()
 
- Public Member Functions inherited from IEnumString
HRESULT Next ([in] ULONG celt, [out, size_is(celt), length_is(*pceltFetched)] LPOLESTR *rgelt, [out] ULONG *pceltFetched)
 
HRESULT RemoteNext ([in] ULONG celt, [out, size_is(celt), length_is(*pceltFetched)] LPOLESTR *rgelt, [out] ULONG *pceltFetched)
 
HRESULT Skip ([in] ULONG celt)
 
HRESULT Reset ()
 
HRESULT Clone ([out] IEnumString **ppenum)
 

Static Public Member Functions

static LPCWSTR GetWndClassName ()
 
- Static Public Member Functions inherited from ATL::CComObjectRootBase
static void WINAPI ObjectMain (bool)
 
static const struct _ATL_CATMAP_ENTRYGetCategoryMap ()
 
static HRESULT WINAPI InternalQueryInterface (void *pThis, const _ATL_INTMAP_ENTRY *pEntries, REFIID iid, void **ppvObject)
 

Public Attributes

BOOL m_bInSetText
 
BOOL m_bInSelectItem
 
BOOL m_bEditHasFocus
 
- Public Attributes inherited from ATL::CComObjectRootBase
LONG m_dwRef
 

Protected Member Functions

VOID UpdateDropDownState ()
 
VOID CalcRects (BOOL bDowner, RECT &rcListView, RECT &rcScrollBar, RECT &rcSizeBox) const
 
VOID LoadQuickComplete (LPCWSTR pwszRegKeyPath, LPCWSTR pwszQuickComplete)
 
CStringW GetQuickEdit (LPCWSTR pszText) const
 
VOID RepositionDropDown ()
 
VOID ReLoadInnerList (PAC_THREAD pThread)
 
VOID ExtractInnerList (CSimpleArray< CStringW > &outerList, const CSimpleArray< CStringW > &innerList, const CString &strText)
 
LRESULT OnCreate (UINT uMsg, WPARAM wParam, LPARAM lParam, BOOL &bHandled)
 
LRESULT OnNCDestroy (UINT uMsg, WPARAM wParam, LPARAM lParam, BOOL &bHandled)
 
LRESULT OnDrawItem (UINT uMsg, WPARAM wParam, LPARAM lParam, BOOL &bHandled)
 
LRESULT OnExitSizeMove (UINT uMsg, WPARAM wParam, LPARAM lParam, BOOL &bHandled)
 
LRESULT OnGetMinMaxInfo (UINT uMsg, WPARAM wParam, LPARAM lParam, BOOL &bHandled)
 
LRESULT OnMeasureItem (UINT uMsg, WPARAM wParam, LPARAM lParam, BOOL &bHandled)
 
LRESULT OnMouseActivate (UINT uMsg, WPARAM wParam, LPARAM lParam, BOOL &bHandled)
 
LRESULT OnNCActivate (UINT uMsg, WPARAM wParam, LPARAM lParam, BOOL &bHandled)
 
LRESULT OnNCLButtonDown (UINT uMsg, WPARAM wParam, LPARAM lParam, BOOL &bHandled)
 
LRESULT OnNotify (UINT uMsg, WPARAM wParam, LPARAM lParam, BOOL &bHandled)
 
LRESULT OnNCHitTest (UINT uMsg, WPARAM wParam, LPARAM lParam, BOOL &bHandled)
 
LRESULT OnSize (UINT uMsg, WPARAM wParam, LPARAM lParam, BOOL &bHandled)
 
LRESULT OnShowWindow (UINT uMsg, WPARAM wParam, LPARAM lParam, BOOL &bHandled)
 
LRESULT OnTimer (UINT uMsg, WPARAM wParam, LPARAM lParam, BOOL &bHandled)
 
LRESULT OnVScroll (UINT uMsg, WPARAM wParam, LPARAM lParam, BOOL &bHandled)
 
LRESULT OnAutoCompStart (UINT uMsg, WPARAM wParam, LPARAM lParam, BOOL &bHandled)
 
LRESULT OnAutoCompFinish (UINT uMsg, WPARAM wParam, LPARAM lParam, BOOL &bHandled)
 
virtual VOID OnFinalMessage (HWND) override
 

Protected Attributes

BOOL m_bDowner
 
DWORD m_dwOptions
 
DWORD m_bEnabled
 
HWND m_hwndCombo
 
HFONT m_hFont
 
BOOL m_bResized
 
RECT m_rcEdit
 
HWND m_hwndEdit
 
WNDPROC m_fnOldEditProc
 
EDITWORDBREAKPROCW m_fnOldWordBreakProc
 
HANDLE m_hThread
 
PAC_THREAD m_pThread
 
CStringW m_strText
 
CStringW m_strStemText
 
CStringW m_strQuickComplete
 
CACListView m_hwndList
 
CACScrollBar m_hwndScrollBar
 
CACSizeBox m_hwndSizeBox
 
CComPtr< IEnumStringm_pEnum
 
CComPtr< IACList > m_pACList
 
CSimpleArray< CStringW > m_innerList
 
CSimpleArray< CStringW > m_outerList
 

Additional Inherited Members

- Public Types inherited from IAutoComplete2
enum  _tagAUTOCOMPLETEOPTIONS {
  ACO_NONE = 0x00 , ACO_AUTOSUGGEST = 0x01 , ACO_AUTOAPPEND = 0x02 , ACO_SEARCH = 0x04 ,
  ACO_FILTERPREFIXES = 0x08 , ACO_USETAB = 0x10 , ACO_UPDOWNKEYDROPSLIST = 0x20 , ACO_RTLREADING = 0x40
}
 
typedef IAutoComplete2LPAUTOCOMPLETE2
 
typedef enum IAutoComplete2::_tagAUTOCOMPLETEOPTIONS AUTOCOMPLETEOPTIONS
 
- Public Types inherited from IAutoComplete
typedef IAutoCompleteLPAUTOCOMPLETE
 
- Public Types inherited from IUnknown
typedef IUnknownLPUNKNOWN
 
- Public Types inherited from IEnumString
typedef IEnumStringLPENUMSTRING
 

Detailed Description

Definition at line 143 of file CAutoComplete.h.

Constructor & Destructor Documentation

◆ CAutoComplete()

CAutoComplete::CAutoComplete ( )

Definition at line 660 of file CAutoComplete.cpp.

666{
667}
EDITWORDBREAKPROCW m_fnOldWordBreakProc
PAC_THREAD m_pThread
WNDPROC m_fnOldEditProc
#define NULL
Definition: types.h:112
#define TRUE
Definition: types.h:120
#define FALSE
Definition: types.h:117

◆ ~CAutoComplete()

CAutoComplete::~CAutoComplete ( )
virtual

Definition at line 680 of file CAutoComplete.cpp.

681{
682 TRACE("CAutoComplete::~CAutoComplete(%p)\n", this);
683 if (m_hThread)
684 {
686 m_hThread = NULL;
687 }
688 if (m_hFont)
689 {
691 m_hFont = NULL;
692 }
693 // quit holding them
694 m_pEnum.Release();
695 m_pACList.Release();
696}
CComPtr< IACList > m_pACList
CComPtr< IEnumString > m_pEnum
#define CloseHandle
Definition: compat.h:739
pKey DeleteObject()
#define TRACE(s)
Definition: solgame.cpp:4

Member Function Documentation

◆ AutoCompThreadProc()

VOID CAutoComplete::AutoCompThreadProc ( )

Definition at line 2014 of file CAutoComplete.cpp.

2015{
2016 for (;;)
2017 {
2019 if (!pThread)
2020 break;
2021 DoThreadWork(pThread);
2022 }
2023}
static PAC_THREAD InterlockedExchangeThreadData(volatile PAC_THREAD *Target, PAC_THREAD Value)
VOID DoThreadWork(PAC_THREAD pThread)

Referenced by AutoCompThreadProc(), and OnAutoCompStart().

◆ CalcRects()

VOID CAutoComplete::CalcRects ( BOOL  bDowner,
RECT rcListView,
RECT rcScrollBar,
RECT rcSizeBox 
) const
protected

Definition at line 1310 of file CAutoComplete.cpp.

1311{
1312 // get the client rectangle
1313 RECT rcClient;
1314 GetClientRect(&rcClient);
1315
1316 // the list
1317 rcList = rcClient;
1318 rcList.right = rcList.left + CX_LIST;
1319
1320 // the scroll bar
1321 rcScrollBar = rcClient;
1322 rcScrollBar.left = rcClient.right - GetSystemMetrics(SM_CXVSCROLL);
1323 if (bDowner)
1324 {
1325 rcScrollBar.top = 0;
1326 rcScrollBar.bottom = rcClient.bottom - GetSystemMetrics(SM_CYHSCROLL);
1327 }
1328 else
1329 {
1330 rcScrollBar.top = GetSystemMetrics(SM_CYHSCROLL);
1331 }
1332
1333 // the size box
1334 rcSizeBox = rcClient;
1335 rcSizeBox.left = rcClient.right - GetSystemMetrics(SM_CXVSCROLL);
1336 if (bDowner)
1337 {
1338 rcSizeBox.top = rcClient.bottom - GetSystemMetrics(SM_CYHSCROLL);
1339 }
1340 else
1341 {
1342 rcSizeBox.top = 0;
1343 rcSizeBox.bottom = rcClient.top + GetSystemMetrics(SM_CYHSCROLL);
1344 }
1345}
#define CX_LIST
LONG right
Definition: windef.h:308
LONG bottom
Definition: windef.h:309
LONG top
Definition: windef.h:307
LONG left
Definition: windef.h:306
#define SM_CXVSCROLL
Definition: winuser.h:961
#define SM_CYHSCROLL
Definition: winuser.h:962
BOOL WINAPI GetClientRect(_In_ HWND, _Out_ LPRECT)
int WINAPI GetSystemMetrics(_In_ int)

Referenced by OnSize().

◆ CanAutoAppend()

BOOL CAutoComplete::CanAutoAppend ( ) const
inline

Definition at line 703 of file CAutoComplete.cpp.

704{
705 return !!(m_dwOptions & ACO_AUTOAPPEND) && m_bEnabled;
706}

Referenced by DoAutoAppend(), FinishCompletion(), OnEditChar(), and StartCompletion().

◆ CanAutoSuggest()

BOOL CAutoComplete::CanAutoSuggest ( ) const
inline

◆ Clone()

STDMETHODIMP CAutoComplete::Clone ( IEnumString **  ppOut)
override

Implements IEnumString.

Definition at line 1282 of file CAutoComplete.cpp.

1283{
1284 TRACE("(%p, %p)\n", this, ppOut);
1285 if (ppOut)
1286 *ppOut = NULL;
1287 return E_NOTIMPL;
1288}
#define E_NOTIMPL
Definition: ddrawi.h:99

◆ CreateDropDown()

HWND CAutoComplete::CreateDropDown ( )

Definition at line 669 of file CAutoComplete.cpp.

670{
671 ATLASSERT(m_hWnd == NULL);
672 DWORD dwStyle = WS_POPUP | /*WS_VISIBLE |*/ WS_CLIPSIBLINGS | WS_CLIPCHILDREN | WS_BORDER;
674 Create(NULL, NULL, NULL, dwStyle, dwExStyle);
675 TRACE("CAutoComplete::CreateDropDown(%p): m_hWnd=%p, m_hwndEdit=%p\n",
676 this, m_hWnd, m_hwndEdit);
677 return m_hWnd;
678}
#define ATLASSERT(x)
Definition: CComVariant.cpp:10
@ Create
Definition: registry.c:563
unsigned long DWORD
Definition: ntddk_ex.h:95
#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_EX_TOOLWINDOW
Definition: winuser.h:404

Referenced by UpdateDropDownState().

◆ DoAutoAppend()

VOID CAutoComplete::DoAutoAppend ( PAC_THREAD  pThread)

Definition at line 793 of file CAutoComplete.cpp.

794{
795 if (!CanAutoAppend()) // can we auto-append?
796 return; // don't append
797
798 CStringW strText = GetEditText(); // get the text
799 if (strText.IsEmpty())
800 return; // don't append
801
802 INT cItems = m_outerList.GetSize(); // get the number of items
803 if (cItems == 0)
804 return; // don't append
805
806 // get the common string
807 CStringW strCommon;
808 BOOL bFound = FALSE;
809 for (INT iItem = 0; iItem < cItems; ++iItem)
810 {
811 const CStringW& strItem = m_outerList[iItem]; // get the text of the item
812
813 CStringW strBody;
814 if (DropPrefix(strItem, strBody) &&
815 ::StrCmpNIW(strBody, strText, strText.GetLength()) == 0)
816 {
817 if (!bFound)
818 {
819 bFound = TRUE;
820 strCommon = strBody;
821 continue;
822 }
823 for (INT ich = 0; ich < strBody.GetLength(); ++ich)
824 {
825 if (strCommon.GetLength() <= ich)
826 break;
827 if (ChrCmpIW(strCommon[ich], strBody[ich]) != 0)
828 {
829 strCommon = strCommon.Left(ich);
830 break;
831 }
832 }
833 continue;
834 }
835
836 if (::StrCmpNIW(strItem, strText, strText.GetLength()) == 0)
837 {
838 if (!bFound)
839 {
840 bFound = TRUE;
841 strCommon = strItem;
842 continue;
843 }
844
845 for (INT ich = 0; ich < strItem.GetLength(); ++ich)
846 {
847 if (strCommon.GetLength() <= ich)
848 break;
849 if (ChrCmpIW(strCommon[ich], strItem[ich]) != 0)
850 {
851 strCommon = strCommon.Left(ich);
852 break;
853 }
854 }
855 }
856 }
857
858 if (strCommon.IsEmpty() || strCommon.GetLength() <= strText.GetLength())
859 return; // no suggestion
860
861 // append suggestion
862 SetEditText(strCommon);
863
864 // select the appended suggestion
865 SetEditSel(strText.GetLength(), strCommon.GetLength());
866}
static BOOL DropPrefix(const CStringW &str, CStringW &strBody)
bool IsEmpty() const noexcept
Definition: atlsimpstr.h:394
int GetLength() const noexcept
Definition: atlsimpstr.h:362
CStringT Left(int nCount) const
Definition: cstringt.h:776
CStringW GetEditText() const
VOID SetEditText(LPCWSTR pszText)
CSimpleArray< CStringW > m_outerList
VOID SetEditSel(INT ich0, INT ich1)
BOOL CanAutoAppend() const
INT WINAPI StrCmpNIW(LPCWSTR lpszStr, LPCWSTR lpszComp, INT iLen)
Definition: string.c:311
BOOL WINAPI ChrCmpIW(WCHAR ch1, WCHAR ch2)
Definition: string.c:217
unsigned int BOOL
Definition: ntddk_ex.h:94
int32_t INT
Definition: typedefs.h:58

Referenced by FinishCompletion().

◆ DoBackWord()

VOID CAutoComplete::DoBackWord ( )

Definition at line 869 of file CAutoComplete.cpp.

870{
871 // get current selection
872 INT ich0, ich1;
874 reinterpret_cast<WPARAM>(&ich0), reinterpret_cast<LPARAM>(&ich1));
875 if (ich0 <= 0 || ich0 != ich1) // there is selection or left-side end
876 return; // don't do anything
877 // get text
879 // extend the range
880 while (ich0 > 0 && IsWordBreak(str[ich0 - 1]))
881 --ich0;
882 while (ich0 > 0 && !IsWordBreak(str[ich0 - 1]))
883 --ich0;
884 // select range
885 SetEditSel(ich0, ich1);
886 // replace selection with empty text (this is actually deletion)
888}
static BOOL IsWordBreak(WCHAR ch)
#define L(x)
Definition: ntvdm.h:50
const WCHAR * str
LONG_PTR LPARAM
Definition: windef.h:208
UINT_PTR WPARAM
Definition: windef.h:207
#define EM_GETSEL
Definition: winuser.h:1997
#define EM_REPLACESEL
Definition: winuser.h:2006
LRESULT WINAPI CallWindowProcW(_In_ WNDPROC, _In_ HWND, _In_ UINT, _In_ WPARAM, _In_ LPARAM)

Referenced by OnEditKeyDown().

◆ DoThreadWork()

VOID CAutoComplete::DoThreadWork ( PAC_THREAD  pThread)

Definition at line 2025 of file CAutoComplete.cpp.

2026{
2027 if (pThread->m_bExpand || m_innerList.GetSize() == 0)
2028 {
2029 ReLoadInnerList(pThread);
2030 }
2031 else
2032 {
2033 pThread->m_innerList = m_innerList;
2034 }
2035
2036 if (m_pThread || !m_hThread)
2037 {
2038 delete pThread;
2039 return;
2040 }
2041
2042 ExtractInnerList(pThread->m_outerList, pThread->m_innerList, pThread->m_strText);
2043
2044 if (m_pThread || !m_hThread)
2045 {
2046 delete pThread;
2047 return;
2048 }
2049
2050 DoSort(pThread->m_outerList);
2051 DoUniqueAndTrim(pThread->m_outerList);
2052
2053 if (m_pThread || !m_hThread ||
2054 !::PostMessageW(m_hWnd, AUTOCOMP_FINISH, 0, (LPARAM)pThread))
2055 {
2056 delete pThread;
2057 }
2058}
static void DoUniqueAndTrim(list_t &list)
static void DoSort(list_t &list)
#define AUTOCOMP_FINISH
CSimpleArray< CStringW > m_innerList
VOID ExtractInnerList(CSimpleArray< CStringW > &outerList, const CSimpleArray< CStringW > &innerList, const CString &strText)
VOID ReLoadInnerList(PAC_THREAD pThread)
CSimpleArray< CStringW > m_outerList
CSimpleArray< CStringW > m_innerList
CStringW m_strText
BOOL m_bExpand
BOOL WINAPI PostMessageW(_In_opt_ HWND, _In_ UINT, _In_ WPARAM, _In_ LPARAM)

Referenced by AutoCompThreadProc().

◆ EditWndProc()

LRESULT CAutoComplete::EditWndProc ( HWND  hwnd,
UINT  uMsg,
WPARAM  wParam,
LPARAM  lParam 
)

Definition at line 300 of file CAutoComplete.cpp.

301{
302 LRESULT ret;
303 HWND hwndGotFocus;
304 switch (uMsg)
305 {
306 case WM_CHAR:
307 return OnEditChar(wParam, lParam);
308 case WM_CUT: case WM_PASTE: case WM_CLEAR:
309 ret = ::DefSubclassProc(hwnd, uMsg, wParam, lParam); // do default
311 return ret;
312 case WM_GETDLGCODE:
313 ret = ::DefSubclassProc(hwnd, uMsg, wParam, lParam); // do default
314 // some special keys need default processing. we handle them here
315 switch (wParam)
316 {
317 case VK_RETURN:
320 break;
321 case VK_TAB:
322 if (IsWindowVisible() && UseTab())
323 ret |= DLGC_WANTALLKEYS; // we want all keys to manipulate the list
324 break;
325 case VK_ESCAPE:
326 if (IsWindowVisible())
327 ret |= DLGC_WANTALLKEYS; // we want all keys to manipulate the list
328 break;
329 default:
330 {
331 ret |= DLGC_WANTALLKEYS; // we want all keys to manipulate the list
332 break;
333 }
334 }
335 return ret;
336 case WM_KEYDOWN:
338 return TRUE; // eat
339 break;
340 case WM_SETFOCUS:
342 break;
343 case WM_KILLFOCUS:
344 // hide the list if lost focus
345 hwndGotFocus = (HWND)wParam;
346 if (hwndGotFocus != m_hwndEdit && hwndGotFocus != m_hWnd)
347 HideDropDown();
349 break;
350 case WM_IME_NOTIFY:
352 HideDropDown();
353 break;
354 case WM_SETTEXT:
355 if (!m_bInSetText)
356 HideDropDown(); // it's mechanical WM_SETTEXT
357 break;
358 case WM_DESTROY:
359 {
361 {
364 }
366 if (::IsWindow(m_hWnd))
367 PostMessageW(WM_CLOSE, 0, 0);
368 // remove reference to m_hwndEdit
369 Release();
370 break;
371 }
372 }
373
374 return ::DefSubclassProc(hwnd, uMsg, wParam, lParam); // do default
375}
static LRESULT CALLBACK EditSubclassProc(HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam, UINT_PTR uSubclassID, DWORD_PTR dwData)
LRESULT OnEditChar(WPARAM wParam, LPARAM lParam)
VOID StartCompletion(BOOL bAppendOK)
BOOL OnEditKeyDown(WPARAM wParam, LPARAM lParam)
BOOL UseTab() const
WPARAM wParam
Definition: combotst.c:138
LPARAM lParam
Definition: combotst.c:139
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
HANDLE HWND
Definition: compat.h:19
#define IMN_OPENCANDIDATE
Definition: imm.h:376
ULONG Release()
int ret
_In_ LONG _In_ HWND hwnd
Definition: winddi.h:4023
LONG_PTR LRESULT
Definition: windef.h:209
BOOL WINAPI IsWindow(_In_opt_ HWND)
#define WM_CLOSE
Definition: winuser.h:1621
#define VK_TAB
Definition: winuser.h:2199
#define WM_PASTE
Definition: winuser.h:1863
#define WM_IME_NOTIFY
Definition: winuser.h:1830
#define DLGC_WANTALLKEYS
Definition: winuser.h:2612
#define VK_CONTROL
Definition: winuser.h:2203
#define WM_SETFOCUS
Definition: winuser.h:1613
#define WM_CUT
Definition: winuser.h:1861
#define WM_SETTEXT
Definition: winuser.h:1617
#define VK_RETURN
Definition: winuser.h:2201
#define EM_SETWORDBREAKPROC
Definition: winuser.h:2020
#define WM_CHAR
Definition: winuser.h:1717
#define WM_DESTROY
Definition: winuser.h:1609
#define WM_CLEAR
Definition: winuser.h:1864
#define WM_KEYDOWN
Definition: winuser.h:1715
#define VK_ESCAPE
Definition: winuser.h:2214
BOOL WINAPI IsWindowVisible(_In_ HWND)
#define WM_KILLFOCUS
Definition: winuser.h:1614
#define WM_GETDLGCODE
Definition: winuser.h:1689
LRESULT WINAPI SendMessageW(_In_ HWND, _In_ UINT, _In_ WPARAM, _In_ LPARAM)
SHORT WINAPI GetKeyState(_In_ int)

Referenced by EditSubclassProc().

◆ Enable()

STDMETHODIMP CAutoComplete::Enable ( BOOL  fEnable)
override

Implements IAutoComplete.

Definition at line 1101 of file CAutoComplete.cpp.

1102{
1103 TRACE("(%p)->Enable(%d)\n", this, fEnable);
1104 m_bEnabled = fEnable;
1105 return S_OK;
1106}
#define S_OK
Definition: intsafe.h:52

◆ ExtractInnerList()

VOID CAutoComplete::ExtractInnerList ( CSimpleArray< CStringW > &  outerList,
const CSimpleArray< CStringW > &  innerList,
const CString strText 
)
protected

Definition at line 1478 of file CAutoComplete.cpp.

1481{
1482 for (INT iItem = 0; iItem < innerList.GetSize(); ++iItem)
1483 {
1484 if (m_pThread || !m_hThread)
1485 break;
1486
1487 const CStringW& strTarget = innerList[iItem];
1488 if (DoesMatch(strTarget, strText))
1489 {
1490 outerList.Add(strTarget);
1491
1492 if (outerList.GetSize() >= MAX_ITEM_COUNT)
1493 break;
1494 }
1495 }
1496}
#define MAX_ITEM_COUNT
static BOOL DoesMatch(const CStringW &strTarget, const CStringW &strText)

Referenced by DoThreadWork().

◆ FilterPrefixes()

BOOL CAutoComplete::FilterPrefixes ( ) const
inline

Definition at line 720 of file CAutoComplete.cpp.

721{
723}
@ ACO_FILTERPREFIXES
Definition: shldisp.idl:98

◆ FinishCompletion()

VOID CAutoComplete::FinishCompletion ( PAC_THREAD  pThread)

Definition at line 2146 of file CAutoComplete.cpp.

2147{
2148 if (m_pThread || !m_hThread)
2149 return;
2150
2151 if (!CanAutoSuggest() && !CanAutoAppend())
2152 return;
2153
2154 // set inner list
2155 m_innerList = pThread->m_innerList;
2156
2157 // set the items of the virtual listview
2158 m_outerList = pThread->m_outerList; // FIXME: We need more speed!
2159 m_hwndList.SendMessageW(LVM_SETITEMCOUNT, m_outerList.GetSize(), 0);
2160
2161 // save text
2162 m_strText = pThread->m_strText;
2164
2165 if (CanAutoSuggest()) // can we auto-suggest?
2166 {
2167 m_bInSelectItem = TRUE; // don't respond
2168 SelectItem(-1); // select none
2170
2171 if (m_outerList.GetSize() > 0)
2173 else
2174 HideDropDown();
2175 }
2176
2177 if (CanAutoAppend() && pThread->m_bAppendOK) // can we auto-append?
2178 {
2179 DoAutoAppend(pThread);
2180 }
2181}
CACListView m_hwndList
VOID RepositionDropDown()
CStringW m_strStemText
VOID SelectItem(INT iItem)
CStringW m_strText
BOOL CanAutoSuggest() const
VOID DoAutoAppend(PAC_THREAD pThread)
CStringW GetStemText(const CStringW &strText) const
#define LVM_SETITEMCOUNT
Definition: commctrl.h:2696
BOOL m_bAppendOK

Referenced by OnAutoCompFinish().

◆ GetDropDownStatus()

STDMETHODIMP CAutoComplete::GetDropDownStatus ( DWORD pdwFlags,
LPWSTR ppwszString 
)
override

Implements IAutoCompleteDropDown.

Definition at line 1201 of file CAutoComplete.cpp.

1202{
1203 BOOL dropped = m_hwndList.IsWindowVisible();
1204
1205 if (pdwFlags)
1206 *pdwFlags = (dropped ? ACDD_VISIBLE : 0);
1207
1208 if (ppwszString)
1209 {
1210 *ppwszString = NULL;
1211
1212 if (dropped)
1213 {
1214 // get selected item
1215 INT iItem = m_hwndList.GetCurSel();
1216 if (iItem >= 0)
1217 {
1218 // get the text of item
1219 CStringW strText = m_hwndList.GetItemText(iItem);
1220
1221 // store to *ppwszString
1222 SHStrDupW(strText, ppwszString);
1223 if (*ppwszString == NULL)
1224 return E_OUTOFMEMORY;
1225 }
1226 }
1227 }
1228
1229 return S_OK;
1230}
CStringW GetItemText(INT iItem)
#define E_OUTOFMEMORY
Definition: ddrawi.h:100
HRESULT WINAPI SHStrDupW(LPCWSTR src, LPWSTR *dest)
Definition: string.c:2012
r dropped
Definition: btrfs.c:3014

◆ GetEditText()

CStringW CAutoComplete::GetEditText ( ) const
inline

Definition at line 737 of file CAutoComplete.cpp.

738{
739 WCHAR szText[L_MAX_URL_LENGTH];
740 if (::GetWindowTextW(m_hwndEdit, szText, _countof(szText)))
741 return szText;
742 return L"";
743}
#define L_MAX_URL_LENGTH
Definition: commctrl.h:4735
#define _countof(array)
Definition: sndvol32.h:70
int WINAPI GetWindowTextW(HWND hWnd, LPWSTR lpString, int nMaxCount)
Definition: window.c:1384
__wchar_t WCHAR
Definition: xmlstorage.h:180

Referenced by DoAutoAppend(), DoBackWord(), OnAutoCompStart(), and OnEditKeyDown().

◆ GetItemCount()

INT CAutoComplete::GetItemCount ( ) const
inline

Definition at line 725 of file CAutoComplete.cpp.

726{
727 return m_outerList.GetSize();
728}

Referenced by RepositionDropDown(), and ShowDropDown().

◆ GetItemText()

CStringW CAutoComplete::GetItemText ( INT  iItem) const

Definition at line 730 of file CAutoComplete.cpp.

731{
732 if (iItem < 0 || m_outerList.GetSize() <= iItem)
733 return L"";
734 return m_outerList[iItem];
735}

Referenced by CACListView::GetItemText(), OnEditKeyDown(), OnListSelChange(), and OnNotify().

◆ GetOptions()

STDMETHODIMP CAutoComplete::GetOptions ( DWORD pdwFlag)
override

Implements IAutoComplete2.

Definition at line 1169 of file CAutoComplete.cpp.

1170{
1171 TRACE("(%p) -> (%p)\n", this, pdwFlag);
1172 if (pdwFlag)
1173 {
1174 *pdwFlag = m_dwOptions;
1175 return S_OK;
1176 }
1177 return E_INVALIDARG;
1178}
#define E_INVALIDARG
Definition: ddrawi.h:101

◆ GetQuickEdit()

CStringW CAutoComplete::GetQuickEdit ( LPCWSTR  pszText) const
protected

Definition at line 1380 of file CAutoComplete.cpp.

1381{
1382 if (pszText[0] == 0 || m_strQuickComplete.IsEmpty())
1383 return pszText;
1384
1385 // m_strQuickComplete will be "www.%s.com" etc.
1386 CStringW ret;
1387 ret.Format(m_strQuickComplete, pszText);
1388 return ret;
1389}
CStringW m_strQuickComplete

Referenced by OnEditKeyDown().

◆ GetStemText()

CStringW CAutoComplete::GetStemText ( const CStringW strText) const
inline

Definition at line 752 of file CAutoComplete.cpp.

753{
754 INT ich = strText.ReverseFind(L'\\');
755 if (ich == -1)
756 return L""; // no stem
757 return strText.Left(ich + 1);
758}
int ReverseFind(_In_ XCHAR ch) const noexcept
Definition: cstringt.h:730

Referenced by FinishCompletion(), and OnAutoCompStart().

◆ GetWndClassName()

static LPCWSTR CAutoComplete::GetWndClassName ( )
inlinestatic

Definition at line 153 of file CAutoComplete.h.

153{ return WC_DROPDOWNW; }
#define WC_DROPDOWNW

◆ HideDropDown()

VOID CAutoComplete::HideDropDown ( )

Definition at line 781 of file CAutoComplete.cpp.

782{
784}
#define SW_HIDE
Definition: winuser.h:768
BOOL WINAPI ShowWindow(_In_ HWND, _In_ int)

Referenced by EditWndProc(), FinishCompletion(), OnEditKeyDown(), CACListView::OnLButtonDown(), OnNCDestroy(), OnNotify(), OnTimer(), and ShowDropDown().

◆ Init()

STDMETHODIMP CAutoComplete::Init ( HWND  hwndEdit,
IUnknown punkACL,
LPCOLESTR  pwszRegKeyPath,
LPCOLESTR  pwszQuickComplete 
)
override

Implements IAutoComplete.

Definition at line 1109 of file CAutoComplete.cpp.

1111{
1112 TRACE("(%p)->Init(0x%08lx, %p, %s, %s)\n",
1113 this, hwndEdit, punkACL, debugstr_w(pwszRegKeyPath), debugstr_w(pwszQuickComplete));
1114 // sanity check
1115 if (m_hwndEdit || !punkACL)
1116 return E_FAIL;
1117 if (!hwndEdit)
1118 return E_INVALIDARG;
1119 // do subclass textbox to watch messages
1121 if (!m_fnOldEditProc)
1122 return E_FAIL;
1123 if (!::SetWindowSubclass(hwndEdit, EditSubclassProc, 0, reinterpret_cast<DWORD_PTR>(this)))
1124 return E_FAIL;
1127 // add reference to m_hwndEdit
1128 AddRef();
1129 // set word break procedure
1130 m_fnOldWordBreakProc = reinterpret_cast<EDITWORDBREAKPROCW>(
1132 reinterpret_cast<LPARAM>(EditWordBreakProcW)));
1133 // save position
1135
1136 // get an IEnumString
1138 TRACE("m_pEnum: %p\n", static_cast<void *>(m_pEnum));
1139
1140 // get an IACList
1141 punkACL->QueryInterface(IID_IACList, (VOID **)&m_pACList);
1142 TRACE("m_pACList: %p\n", static_cast<void *>(m_pACList));
1143
1144 UpdateDropDownState(); // create/hide the drop-down window if necessary
1145
1146 // load quick completion info
1147 LoadQuickComplete(pwszRegKeyPath, pwszQuickComplete);
1148
1149 // any combobox for m_hwndEdit?
1150 m_hwndCombo = NULL;
1152 WCHAR szClass[16];
1153 if (::GetClassNameW(hwndParent, szClass, _countof(szClass)))
1154 {
1155 if (::StrCmpIW(szClass, WC_COMBOBOXW) == 0 ||
1156 ::StrCmpIW(szClass, WC_COMBOBOXEXW) == 0)
1157 {
1158 m_hwndCombo = hwndParent; // get combobox
1159 }
1160 }
1161
1162 return S_OK;
1163}
static INT CALLBACK EditWordBreakProcW(LPWSTR lpch, INT index, INT count, INT code)
VOID UpdateDropDownState()
VOID LoadQuickComplete(LPCWSTR pwszRegKeyPath, LPCWSTR pwszQuickComplete)
HWND hwndEdit
Definition: combotst.c:65
BOOL WINAPI SetWindowSubclass(HWND hWnd, SUBCLASSPROC pfnSubclass, UINT_PTR uIDSubclass, DWORD_PTR dwRef)
Definition: commctrl.c:1261
static HWND hwndParent
Definition: cryptui.c:300
#define E_FAIL
Definition: ddrawi.h:102
int WINAPI StrCmpIW(LPCWSTR lpszStr, LPCWSTR lpszComp)
Definition: string.c:353
ULONG AddRef()
HRESULT QueryInterface([in] REFIID riid, [out, iid_is(riid)] void **ppvObject)
#define debugstr_w
Definition: kernel32.h:32
const GUID IID_IEnumString
#define WC_COMBOBOXEXW
Definition: commctrl.h:3781
#define WC_COMBOBOXW
Definition: commctrl.h:4717
#define GWLP_WNDPROC
Definition: treelist.c:66
uint32_t DWORD_PTR
Definition: typedefs.h:65
HWND WINAPI GetFocus(void)
Definition: window.c:1865
#define GetWindowLongPtrW
Definition: winuser.h:4829
BOOL WINAPI GetWindowRect(_In_ HWND, _Out_ LPRECT)
int(CALLBACK * EDITWORDBREAKPROCW)(LPWSTR, int, int, int)
Definition: winuser.h:2905
HWND WINAPI GetParent(_In_ HWND)
int WINAPI GetClassNameW(_In_ HWND hWnd, _Out_writes_to_(nMaxCount, return) LPWSTR lpClassName, _In_ int nMaxCount)
LRESULT(CALLBACK * WNDPROC)(HWND, UINT, WPARAM, LPARAM)
Definition: winuser.h:2906

◆ IsComboBoxDropped()

BOOL CAutoComplete::IsComboBoxDropped ( ) const
inline

Definition at line 713 of file CAutoComplete.cpp.

714{
716 return FALSE;
718}
#define CB_GETDROPPEDSTATE
Definition: winuser.h:1945

Referenced by ShowDropDown().

◆ LoadQuickComplete()

VOID CAutoComplete::LoadQuickComplete ( LPCWSTR  pwszRegKeyPath,
LPCWSTR  pwszQuickComplete 
)
protected

Definition at line 1347 of file CAutoComplete.cpp.

1348{
1350
1351 if (pwszRegKeyPath)
1352 {
1353 CStringW strPath = pwszRegKeyPath;
1354 INT ichSep = strPath.ReverseFind(L'\\'); // find separator
1355 if (ichSep != -1) // found the last separator
1356 {
1357 // split by the separator
1358 CStringW strKey = strPath.Left(ichSep);
1359 CStringW strName = strPath.Mid(ichSep + 1);
1360
1361 // load from registry
1362 WCHAR szValue[MAX_PATH] = L"";
1363 DWORD cbValue = sizeof(szValue), dwType = REG_NONE;
1364 SHRegGetUSValueW(pwszRegKeyPath, strName, &dwType,
1365 szValue, &cbValue, FALSE, NULL, 0);
1366 if (szValue[0] != 0 && cbValue != 0 &&
1367 (dwType == REG_SZ || dwType == REG_EXPAND_SZ))
1368 {
1369 m_strQuickComplete = szValue;
1370 }
1371 }
1372 }
1373
1374 if (pwszQuickComplete && m_strQuickComplete.IsEmpty())
1375 {
1376 m_strQuickComplete = pwszQuickComplete;
1377 }
1378}
void Empty() noexcept
Definition: atlsimpstr.h:253
CStringT Mid(int iFirst, int nCount) const
Definition: cstringt.h:748
#define MAX_PATH
Definition: compat.h:34
LONG WINAPI SHRegGetUSValueW(LPCWSTR pSubKey, LPCWSTR pValue, LPDWORD pwType, LPVOID pvData, LPDWORD pcbData, BOOL flagIgnoreHKCU, LPVOID pDefaultData, DWORD wDefaultDataSize)
Definition: reg.c:594
#define REG_SZ
Definition: layer.c:22
#define REG_NONE
Definition: nt_native.h:1492
#define REG_EXPAND_SZ
Definition: nt_native.h:1494

Referenced by Init().

◆ Next()

STDMETHODIMP CAutoComplete::Next ( ULONG  celt,
LPOLESTR rgelt,
ULONG pceltFetched 
)
override

Implements IEnumString.

Definition at line 1246 of file CAutoComplete.cpp.

1247{
1248 TRACE("(%p, %d, %p, %p)\n", this, celt, rgelt, pceltFetched);
1249 if (rgelt)
1250 *rgelt = NULL;
1251 if (*pceltFetched)
1252 *pceltFetched = 0;
1253 if (celt != 1 || !rgelt || !pceltFetched || !m_pEnum)
1254 return E_INVALIDARG;
1255
1256 LPWSTR pszText = NULL;
1257 HRESULT hr = m_pEnum->Next(1, &pszText, pceltFetched);
1258 if (hr == S_OK)
1259 *rgelt = pszText;
1260 else
1261 ::CoTaskMemFree(pszText);
1262 return hr;
1263}
HRESULT hr
Definition: shlfolder.c:183
WCHAR * LPWSTR
Definition: xmlstorage.h:184

◆ OnAutoCompFinish()

LRESULT CAutoComplete::OnAutoCompFinish ( UINT  uMsg,
WPARAM  wParam,
LPARAM  lParam,
BOOL bHandled 
)
protected

Definition at line 2133 of file CAutoComplete.cpp.

2134{
2135 PAC_THREAD pThread = reinterpret_cast<PAC_THREAD>(lParam);
2136 if (m_pThread == NULL)
2137 {
2138 FinishCompletion(pThread);
2139 }
2141 m_hThread = NULL;
2142 delete pThread;
2143 return 0;
2144}
VOID FinishCompletion(PAC_THREAD pThread)

◆ OnAutoCompStart()

LRESULT CAutoComplete::OnAutoCompStart ( UINT  uMsg,
WPARAM  wParam,
LPARAM  lParam,
BOOL bHandled 
)
protected

Definition at line 2061 of file CAutoComplete.cpp.

2062{
2063 BOOL bAppendOK = (BOOL)wParam;
2064
2065 CStringW strText = GetEditText();
2066 if (m_strText.CompareNoCase(strText) == 0)
2067 {
2068 // no change
2069 return 0;
2070 }
2071
2072 PAC_THREAD pThread = new AC_THREAD { this, bAppendOK, strText };
2073
2074 // if previous text was empty
2075 if (m_strText.IsEmpty())
2076 {
2077 pThread->m_bReset = TRUE;
2078 }
2079 m_strText = strText;
2080
2081 // do expand the items if the stem is changed
2082 CStringW strStemText = GetStemText(pThread->m_strText);
2083 if (m_strStemText.CompareNoCase(strStemText) != 0)
2084 {
2085 pThread->m_bReset = TRUE;
2086 pThread->m_bExpand = !strStemText.IsEmpty();
2087 m_strStemText = strStemText;
2088 }
2089
2090 // reset if necessary
2091 if (pThread->m_bReset && m_pEnum)
2092 {
2093 HRESULT hr = m_pEnum->Reset(); // IEnumString::Reset
2094 TRACE("m_pEnum->Reset(%p): 0x%08lx\n",
2095 static_cast<IUnknown *>(m_pEnum), hr);
2096 }
2097
2098 // update ac list if necessary
2099 if (pThread->m_bExpand && m_pACList)
2100 {
2101 HRESULT hr = m_pACList->Expand(strStemText); // IACList::Expand
2102 TRACE("m_pACList->Expand(%p, %S): 0x%08lx\n",
2103 static_cast<IUnknown *>(m_pACList),
2104 static_cast<LPCWSTR>(strStemText), hr);
2105 }
2106
2108 if (pOld)
2109 delete pOld;
2110
2111 BOOL bDoStart = FALSE;
2112 if (m_hThread)
2113 {
2115 {
2117 m_hThread = NULL;
2118 bDoStart = TRUE;
2119 }
2120 }
2121 else
2122 {
2123 bDoStart = TRUE;
2124 }
2125
2126 if (bDoStart)
2128
2129 return 0;
2130}
int CompareNoCase(_In_z_ PCXSTR psz) const
Definition: cstringt.h:743
VOID AutoCompThreadProc()
#define WAIT_TIMEOUT
Definition: dderror.h:14
#define BOOL
Definition: nt_native.h:43
_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)
DWORD WINAPI WaitForSingleObject(IN HANDLE hHandle, IN DWORD dwMilliseconds)
Definition: synch.c:82
PVOID HANDLE
Definition: typedefs.h:73
const WCHAR * LPCWSTR
Definition: xmlstorage.h:185

◆ OnCreate()

LRESULT CAutoComplete::OnCreate ( UINT  uMsg,
WPARAM  wParam,
LPARAM  lParam,
BOOL bHandled 
)
protected

Definition at line 1538 of file CAutoComplete.cpp.

1539{
1540 TRACE("CAutoComplete::OnCreate(%p)\n", this);
1541
1542 // set the pointer of CAutoComplete
1543 m_hwndList.m_pDropDown = this;
1546
1547 // create the children
1548 m_hwndList.Create(m_hWnd);
1549 if (!m_hwndList)
1550 return -1; // failure
1551 m_hwndSizeBox.Create(m_hWnd);
1552 if (!m_hwndSizeBox)
1553 return -1; // failure
1554 m_hwndScrollBar.Create(m_hWnd);
1555 if (!m_hwndScrollBar)
1556 return -1; // failure
1557
1558 // show the controls
1559 m_hwndList.ShowWindow(SW_SHOWNOACTIVATE);
1560 m_hwndSizeBox.ShowWindow(SW_SHOWNOACTIVATE);
1562
1563 // set the list font
1564 m_hFont = reinterpret_cast<HFONT>(::GetStockObject(DEFAULT_GUI_FONT));
1566
1567 // add reference so we won't be deleted during message processing
1568 AddRef();
1569 return 0; // success
1570}
HWND Create(HWND hwndParent)
CAutoComplete * m_pDropDown
Definition: CAutoComplete.h:38
VOID SetFont(HFONT hFont)
CAutoComplete * m_pDropDown
Definition: CAutoComplete.h:80
HWND Create(HWND hwndParent)
CAutoComplete * m_pDropDown
Definition: CAutoComplete.h:97
HWND Create(HWND hwndParent)
CACSizeBox m_hwndSizeBox
CACScrollBar m_hwndScrollBar
static DWORD *static HFONT(WINAPI *pCreateFontIndirectExA)(const ENUMLOGFONTEXDVA *)
HGDIOBJ WINAPI GetStockObject(_In_ int)
#define DEFAULT_GUI_FONT
Definition: wingdi.h:909
#define SW_SHOWNOACTIVATE
Definition: winuser.h:774

◆ OnDrawItem()

LRESULT CAutoComplete::OnDrawItem ( UINT  uMsg,
WPARAM  wParam,
LPARAM  lParam,
BOOL bHandled 
)
protected

Definition at line 1624 of file CAutoComplete.cpp.

1625{
1626 LPDRAWITEMSTRUCT pDraw = reinterpret_cast<LPDRAWITEMSTRUCT>(lParam);
1627 ATLASSERT(pDraw != NULL);
1629
1630 // sanity check
1631 if (pDraw->CtlType != ODT_LISTVIEW || pDraw->hwndItem != m_hwndList)
1632 return FALSE;
1633
1634 // item rectangle
1635 RECT rcItem = pDraw->rcItem;
1636
1637 // get info
1638 UINT iItem = pDraw->itemID; // the index of item
1639 CStringW strItem = m_hwndList.GetItemText(iItem); // get text of item
1640
1641 // draw background and set text color
1642 HDC hDC = pDraw->hDC;
1643 BOOL bSelected = (pDraw->itemState & ODS_SELECTED);
1644 if (bSelected)
1645 {
1648 }
1649 else
1650 {
1653 }
1654
1655 // draw text
1657 HGDIOBJ hFontOld = ::SelectObject(hDC, m_hFont);
1658 const UINT uDT_ = DT_LEFT | DT_NOPREFIX | DT_SINGLELINE | DT_VCENTER;
1660 ::DrawTextW(hDC, strItem, -1, &rcItem, uDT_);
1661 ::SelectObject(hDC, hFontOld);
1662
1663 return TRUE;
1664}
static HDC hDC
Definition: 3dtext.c:33
static HDC
Definition: imagelist.c:92
unsigned int UINT
Definition: ndis.h:50
INT WINAPI DrawTextW(HDC hdc, LPCWSTR str, INT count, LPRECT rect, UINT flags)
Definition: defwnd.c:16
#define LVS_OWNERDRAWFIXED
Definition: commctrl.h:2283
#define ODT_LISTVIEW
Definition: commctrl.h:80
HGDIOBJ WINAPI SelectObject(_In_ HDC, _In_ HGDIOBJ)
Definition: dc.c:1546
#define TRANSPARENT
Definition: wingdi.h:950
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
DWORD WINAPI GetSysColor(_In_ int)
#define ODS_SELECTED
Definition: winuser.h:2545
#define DT_NOPREFIX
Definition: winuser.h:537
#define COLOR_WINDOW
Definition: winuser.h:918
#define COLOR_WINDOWTEXT
Definition: winuser.h:921
#define COLOR_HIGHLIGHT
Definition: winuser.h:926
HBRUSH WINAPI GetSysColorBrush(_In_ int)
#define DT_SINGLELINE
Definition: winuser.h:540
#define DT_LEFT
Definition: winuser.h:534
#define SM_CXBORDER
Definition: winuser.h:964
#define COLOR_HIGHLIGHTTEXT
Definition: winuser.h:927
#define DT_VCENTER
Definition: winuser.h:543

◆ OnEditChar()

LRESULT CAutoComplete::OnEditChar ( WPARAM  wParam,
LPARAM  lParam 
)

Definition at line 996 of file CAutoComplete.cpp.

997{
998 TRACE("CACEditCtrl::OnEditChar(%p, %p)\n", this, wParam);
999 if (wParam == L'\n' || wParam == L'\t')
1000 return 0; // eat
1002 if (CanAutoSuggest() || CanAutoAppend())
1004 return ret;
1005}
#define VK_BACK
Definition: winuser.h:2198

Referenced by EditWndProc().

◆ OnEditKeyDown()

BOOL CAutoComplete::OnEditKeyDown ( WPARAM  wParam,
LPARAM  lParam 
)

Definition at line 906 of file CAutoComplete.cpp.

907{
908 TRACE("CAutoComplete::OnEditKeyDown(%p, %p)\n", this, wParam);
909
910 UINT vk = (UINT)wParam; // virtual key
911 switch (vk)
912 {
913 case VK_UP: case VK_DOWN:
914 case VK_PRIOR: case VK_NEXT:
915 // is suggestion available?
916 if (!CanAutoSuggest())
917 return FALSE; // do default
918 if (IsWindowVisible())
919 return OnListUpDown(vk);
920 break;
921 case VK_ESCAPE:
922 {
923 // is suggestion available?
924 if (!CanAutoSuggest())
925 return FALSE; // do default
926 if (IsWindowVisible())
927 {
928 SetEditText(m_strText); // revert the edit text
929 // select the end
932 HideDropDown(); // hide
933 return TRUE; // eat
934 }
935 break;
936 }
937 case VK_RETURN:
938 {
939 if (::GetKeyState(VK_CONTROL) < 0)
940 {
941 // quick edit
942 CStringW strText = GetEditText();
943 SetEditText(GetQuickEdit(strText));
944 }
945 else
946 {
947 // if item is selected, then update the edit text
948 INT iItem = m_hwndList.GetCurSel();
949 if (iItem != -1)
950 {
951 CStringW strText = GetItemText(iItem);
952 SetEditText(strText);
953 }
954 }
955 // select all
957 SetEditSel(0, cch);
958 // hide
959 HideDropDown();
960 break;
961 }
962 case VK_TAB:
963 {
964 // ACO_USETAB
965 if (IsWindowVisible() && UseTab())
966 {
967 if (GetKeyState(VK_SHIFT) < 0)
968 return OnListUpDown(VK_UP);
969 else
970 return OnListUpDown(VK_DOWN);
971 }
972 break;
973 }
974 case VK_DELETE:
975 {
976 // is suggestion available?
977 if (!CanAutoSuggest())
978 return FALSE; // do default
981 return TRUE; // eat
982 }
983 case VK_BACK:
984 {
985 if (::GetKeyState(VK_CONTROL) < 0)
986 {
987 DoBackWord();
988 return TRUE; // eat
989 }
990 break;
991 }
992 }
993 return FALSE; // default
994}
CStringW GetQuickEdit(LPCWSTR pszText) const
BOOL OnListUpDown(UINT vk)
CStringW GetItemText(INT iItem) const
static DWORD DWORD void LPSTR DWORD cch
Definition: str.c:202
WORD vk
Definition: input.c:77
#define WM_GETTEXTLENGTH
Definition: winuser.h:1619
#define VK_UP
Definition: winuser.h:2225
#define VK_NEXT
Definition: winuser.h:2221
#define VK_DOWN
Definition: winuser.h:2227
#define VK_SHIFT
Definition: winuser.h:2202
#define VK_PRIOR
Definition: winuser.h:2220
#define VK_DELETE
Definition: winuser.h:2233

Referenced by EditWndProc().

◆ OnExitSizeMove()

LRESULT CAutoComplete::OnExitSizeMove ( UINT  uMsg,
WPARAM  wParam,
LPARAM  lParam,
BOOL bHandled 
)
protected

Definition at line 1608 of file CAutoComplete.cpp.

1609{
1610 TRACE("CAutoComplete::OnExitSizeMove(%p)\n", this);
1611 m_bResized = TRUE; // remember resized
1612
1613 ModifyStyle(WS_THICKFRAME, 0); // remove thick frame to resize
1614 // frame changed
1616 SetWindowPos(NULL, 0, 0, 0, 0, uSWP_);
1617
1618 ::SetFocus(m_hwndEdit); // restore focus
1619 return 0;
1620}
#define WS_THICKFRAME
Definition: pedump.c:630
#define SWP_NOACTIVATE
Definition: winuser.h:1242
#define SWP_FRAMECHANGED
Definition: winuser.h:1240
BOOL WINAPI SetWindowPos(_In_ HWND, _In_opt_ HWND, _In_ int, _In_ int, _In_ int, _In_ int, _In_ UINT)
#define SWP_NOMOVE
Definition: winuser.h:1244
#define SWP_NOSIZE
Definition: winuser.h:1245
HWND WINAPI SetFocus(_In_opt_ HWND)
#define SWP_NOZORDER
Definition: winuser.h:1247

◆ OnFinalMessage()

VOID CAutoComplete::OnFinalMessage ( HWND  )
overrideprotectedvirtual

Definition at line 1600 of file CAutoComplete.cpp.

1601{
1602 // The message loop is finished, now we can safely destruct!
1603 Release();
1604}

◆ OnGetMinMaxInfo()

LRESULT CAutoComplete::OnGetMinMaxInfo ( UINT  uMsg,
WPARAM  wParam,
LPARAM  lParam,
BOOL bHandled 
)
protected

Definition at line 1668 of file CAutoComplete.cpp.

1669{
1670 // restrict minimum size
1671 LPMINMAXINFO pInfo = reinterpret_cast<LPMINMAXINFO>(lParam);
1674 return 0;
1675}
POINT ptMinTrackSize
Definition: winuser.h:3630
long y
Definition: polytest.cpp:48
long x
Definition: polytest.cpp:48

◆ OnListSelChange()

VOID CAutoComplete::OnListSelChange ( )

Definition at line 1007 of file CAutoComplete.cpp.

1008{
1009 // update EDIT text
1010 INT iItem = m_hwndList.GetCurSel();
1011 CStringW text = ((iItem != -1) ? GetItemText(iItem) : m_strText);
1013 // ensure the item visible
1014 m_hwndList.EnsureVisible(iItem, FALSE);
1015 // select the end
1016 INT cch = text.GetLength();
1017 SetEditSel(cch, cch);
1018}
const WCHAR * text
Definition: package.c:1799

Referenced by OnNotify().

◆ OnListUpDown()

BOOL CAutoComplete::OnListUpDown ( UINT  vk)

Definition at line 1020 of file CAutoComplete.cpp.

1021{
1022 if (!CanAutoSuggest())
1023 return FALSE; // default
1024
1026 {
1027 ShowDropDown();
1028 return TRUE; // eat
1029 }
1030
1031 INT iItem = m_hwndList.GetCurSel(); // current selection
1032 INT cItems = m_hwndList.GetItemCount(); // the number of items
1033 switch (vk)
1034 {
1035 case VK_UP:
1036 if (iItem == -1)
1037 iItem = cItems - 1;
1038 else if (iItem == 0)
1039 iItem = -1;
1040 else
1041 --iItem;
1042 m_hwndList.SetCurSel(iItem);
1043 break;
1044 case VK_DOWN:
1045 if (iItem == -1)
1046 iItem = 0;
1047 else if (iItem == cItems - 1)
1048 iItem = -1;
1049 else
1050 ++iItem;
1051 m_hwndList.SetCurSel(iItem);
1052 break;
1053 case VK_PRIOR:
1054 if (iItem == -1)
1055 {
1056 iItem = cItems - 1;
1057 }
1058 else if (iItem == 0)
1059 {
1060 iItem = -1;
1061 }
1062 else
1063 {
1064 iItem -= m_hwndList.GetVisibleCount() - 1;
1065 if (iItem < 0)
1066 iItem = 0;
1067 }
1068 m_hwndList.SetCurSel(iItem);
1069 break;
1070 case VK_NEXT:
1071 if (iItem == -1)
1072 {
1073 iItem = 0;
1074 }
1075 else if (iItem == cItems - 1)
1076 {
1077 iItem = -1;
1078 }
1079 else
1080 {
1081 iItem += m_hwndList.GetVisibleCount() - 1;
1082 if (iItem > cItems)
1083 iItem = cItems - 1;
1084 }
1085 m_hwndList.SetCurSel(iItem);
1086 break;
1087 default:
1088 {
1090 break;
1091 }
1092 }
1093
1094 return TRUE; // eat
1095}
INT GetVisibleCount()
VOID SetCurSel(INT iItem)
@ ACO_UPDOWNKEYDROPSLIST
Definition: shldisp.idl:100

Referenced by OnEditKeyDown().

◆ OnMeasureItem()

LRESULT CAutoComplete::OnMeasureItem ( UINT  uMsg,
WPARAM  wParam,
LPARAM  lParam,
BOOL bHandled 
)
protected

Definition at line 1679 of file CAutoComplete.cpp.

1680{
1681 LPMEASUREITEMSTRUCT pMeasure = reinterpret_cast<LPMEASUREITEMSTRUCT>(lParam);
1682 ATLASSERT(pMeasure != NULL);
1683 if (pMeasure->CtlType != ODT_LISTVIEW)
1684 return FALSE;
1685 if (!m_hwndList)
1686 return FALSE;
1688 pMeasure->itemHeight = m_hwndList.m_cyItem; // height of item
1689 return TRUE;
1690}

◆ OnMouseActivate()

LRESULT CAutoComplete::OnMouseActivate ( UINT  uMsg,
WPARAM  wParam,
LPARAM  lParam,
BOOL bHandled 
)
protected

Definition at line 1694 of file CAutoComplete.cpp.

1695{
1696 return MA_NOACTIVATE; // don't activate by mouse
1697}
#define MA_NOACTIVATE
Definition: winuser.h:2503

◆ OnNCActivate()

LRESULT CAutoComplete::OnNCActivate ( UINT  uMsg,
WPARAM  wParam,
LPARAM  lParam,
BOOL bHandled 
)
protected

Definition at line 1701 of file CAutoComplete.cpp.

1702{
1703 bHandled = FALSE; // do default
1704 return 0;
1705}

◆ OnNCDestroy()

LRESULT CAutoComplete::OnNCDestroy ( UINT  uMsg,
WPARAM  wParam,
LPARAM  lParam,
BOOL bHandled 
)
protected

Definition at line 1573 of file CAutoComplete.cpp.

1574{
1575 TRACE("CAutoComplete::OnNCDestroy(%p)\n", this);
1576
1577 // hide
1578 if (IsWindowVisible())
1579 HideDropDown();
1580
1581 // clear CAutoComplete pointers
1585
1586 // destroy controls
1587 m_hwndList.DestroyWindow();
1588 m_hwndScrollBar.DestroyWindow();
1589 m_hwndSizeBox.DestroyWindow();
1590
1591 // clean up
1592 m_hwndCombo = NULL;
1593
1594 // Tell ATL to clean up
1595 bHandled = 0;
1596
1597 return 0;
1598}

◆ OnNCHitTest()

LRESULT CAutoComplete::OnNCHitTest ( UINT  uMsg,
WPARAM  wParam,
LPARAM  lParam,
BOOL bHandled 
)
protected

Definition at line 1834 of file CAutoComplete.cpp.

1835{
1836 TRACE("CAutoComplete::OnNCHitTest(%p)\n", this);
1837 POINT pt = { GET_X_LPARAM(lParam), GET_Y_LPARAM(lParam) }; // in screen coordinates
1838 ScreenToClient(&pt); // into client coordinates
1839 if (ChildWindowFromPoint(pt) == m_hwndSizeBox) // hit?
1840 {
1841 // allow resizing (with cursor shape)
1843 }
1844 bHandled = FALSE; // do default
1845 return 0;
1846}
#define pt(x, y)
Definition: drawing.c:79
#define GET_Y_LPARAM(lp)
Definition: windowsx.h:300
#define GET_X_LPARAM(lp)
Definition: windowsx.h:299
#define HTTOPRIGHT
Definition: winuser.h:2492
HWND WINAPI ChildWindowFromPoint(_In_ HWND, _In_ POINT)
#define HTBOTTOMRIGHT
Definition: winuser.h:2495
BOOL WINAPI ScreenToClient(_In_ HWND, _Inout_ LPPOINT)

◆ OnNCLButtonDown()

LRESULT CAutoComplete::OnNCLButtonDown ( UINT  uMsg,
WPARAM  wParam,
LPARAM  lParam,
BOOL bHandled 
)
protected

Definition at line 1708 of file CAutoComplete.cpp.

1709{
1710 switch (wParam)
1711 {
1712 case HTBOTTOMRIGHT: case HTTOPRIGHT:
1713 {
1714 // add thick frame to resize.
1715 ModifyStyle(0, WS_THICKFRAME);
1716 // frame changed
1718 SetWindowPos(NULL, 0, 0, 0, 0, uSWP_);
1719 break;
1720 }
1721 }
1722 bHandled = FALSE; // do default
1723 return 0;
1724}

◆ OnNotify()

LRESULT CAutoComplete::OnNotify ( UINT  uMsg,
WPARAM  wParam,
LPARAM  lParam,
BOOL bHandled 
)
protected

Definition at line 1728 of file CAutoComplete.cpp.

1729{
1730 LPNMHDR pnmh = reinterpret_cast<LPNMHDR>(lParam);
1731 ATLASSERT(pnmh != NULL);
1732
1733 switch (pnmh->code)
1734 {
1735 case NM_DBLCLK: // double-clicked
1736 {
1737 TRACE("NM_DBLCLK\n");
1738 HideDropDown();
1739 break;
1740 }
1741 case NM_HOVER: // mouse is hovering
1742 {
1743 POINT pt;
1744 ::GetCursorPos(&pt); // get cursor position in screen coordinates
1745 m_hwndList.ScreenToClient(&pt); // into client coordinates
1746 INT iItem = m_hwndList.ItemFromPoint(pt.x, pt.y);
1747 if (iItem != -1)
1748 {
1749 m_bInSelectItem = TRUE; // don't respond
1750 m_hwndList.SetCurSel(iItem); // select
1752 }
1753 return TRUE; // eat
1754 }
1755 case LVN_GETDISPINFOA: // for user's information only
1756 {
1757 TRACE("LVN_GETDISPINFOA\n");
1758 if (pnmh->hwndFrom != m_hwndList)
1759 break;
1760
1761 LV_DISPINFOA *pDispInfo = reinterpret_cast<LV_DISPINFOA *>(pnmh);
1762 LV_ITEMA *pItem = &pDispInfo->item;
1763 INT iItem = pItem->iItem;
1764 if (iItem == -1)
1765 break;
1766
1767 CStringW strText = GetItemText(iItem);
1768 if (pItem->mask & LVIF_TEXT)
1769 SHUnicodeToAnsi(strText, pItem->pszText, pItem->cchTextMax);
1770 break;
1771 }
1772 case LVN_GETDISPINFOW: // for user's information only
1773 {
1774 TRACE("LVN_GETDISPINFOW\n");
1775 if (pnmh->hwndFrom != m_hwndList)
1776 break;
1777
1778 LV_DISPINFOW *pDispInfo = reinterpret_cast<LV_DISPINFOW *>(pnmh);
1779 LV_ITEMW *pItem = &pDispInfo->item;
1780 INT iItem = pItem->iItem;
1781 if (iItem == -1)
1782 break;
1783
1784 CStringW strText = GetItemText(iItem);
1785 if (pItem->mask & LVIF_TEXT)
1786 StringCbCopyW(pItem->pszText, pItem->cchTextMax, strText);
1787 break;
1788 }
1789 case LVN_HOTTRACK: // enabled by LVS_EX_TRACKSELECT
1790 {
1791 TRACE("LVN_HOTTRACK\n");
1792 LPNMLISTVIEW pListView = reinterpret_cast<LPNMLISTVIEW>(pnmh);
1793 INT iItem = pListView->iItem;
1794 TRACE("LVN_HOTTRACK: iItem:%d\n", iItem);
1795 m_hwndList.SetCurSel(iItem);
1796 m_hwndList.EnsureVisible(iItem, FALSE);
1797 return TRUE;
1798 }
1799 case LVN_ITEMACTIVATE: // enabled by LVS_EX_ONECLICKACTIVATE
1800 {
1801 TRACE("LVN_ITEMACTIVATE\n");
1802 LPNMITEMACTIVATE pItemActivate = reinterpret_cast<LPNMITEMACTIVATE>(pnmh);
1803 INT iItem = pItemActivate->iItem;
1804 TRACE("LVN_ITEMACTIVATE: iItem:%d\n", iItem);
1805 if (iItem != -1) // the item is clicked
1806 {
1807 SelectItem(iItem);
1808 HideDropDown();
1809 }
1810 break;
1811 }
1812 case LVN_ITEMCHANGED: // item info is changed
1813 {
1814 TRACE("LVN_ITEMCHANGED\n");
1815 LPNMLISTVIEW pListView = reinterpret_cast<LPNMLISTVIEW>(pnmh);
1816 if (pListView->uChanged & LVIF_STATE) // selection changed
1817 {
1818 // listview selection changed
1819 if (!m_bInSelectItem)
1820 {
1822 }
1824 }
1825 break;
1826 }
1827 }
1828
1829 return 0;
1830}
INT ItemFromPoint(INT x, INT y)
VOID UpdateScrollBar()
INT WINAPI SHUnicodeToAnsi(LPCWSTR lpSrcStr, LPSTR lpDstStr, INT iLen)
Definition: string.c:2791
#define LVN_GETDISPINFOA
Definition: commctrl.h:3153
#define LVN_HOTTRACK
Definition: commctrl.h:3152
#define LV_DISPINFOW
Definition: commctrl.h:3169
#define NM_DBLCLK
Definition: commctrl.h:131
#define LVIF_STATE
Definition: commctrl.h:2312
#define NM_HOVER
Definition: commctrl.h:138
#define LVIF_TEXT
Definition: commctrl.h:2309
#define LV_ITEMW
Definition: commctrl.h:2332
#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
STRSAFEAPI StringCbCopyW(STRSAFE_LPWSTR pszDest, size_t cbDest, STRSAFE_LPCWSTR pszSrc)
Definition: strsafe.h:166
UINT code
Definition: winuser.h:3159
HWND hwndFrom
Definition: winuser.h:3157
BOOL WINAPI GetCursorPos(_Out_ LPPOINT)
Definition: cursoricon.c:2714

◆ OnShowWindow()

LRESULT CAutoComplete::OnShowWindow ( UINT  uMsg,
WPARAM  wParam,
LPARAM  lParam,
BOOL bHandled 
)
protected

Definition at line 1875 of file CAutoComplete.cpp.

1876{
1877 // hook mouse events
1878 BOOL bShow = (BOOL)wParam;
1879 if (bShow)
1880 {
1881 if (s_hWatchWnd != m_hWnd && ::IsWindowVisible(s_hWatchWnd))
1883 s_hWatchWnd = m_hWnd; // watch this
1884
1885 // unhook mouse if any
1886 if (s_hMouseHook)
1887 {
1888 HHOOK hHookOld = s_hMouseHook;
1890 ::UnhookWindowsHookEx(hHookOld);
1891 }
1892
1893 // hook mouse
1896
1897 // set timer
1899
1900 bHandled = FALSE; // do default
1901 return 0;
1902 }
1903 else
1904 {
1905 // kill timer
1907
1908 s_hWatchWnd = NULL; // unwatch
1909
1910 // unhook mouse if any
1911 if (s_hMouseHook)
1912 {
1913 HHOOK hHookOld = s_hMouseHook;
1915 ::UnhookWindowsHookEx(hHookOld);
1916 }
1917
1918 LRESULT ret = DefWindowProcW(uMsg, wParam, lParam); // do default
1919
1920 if (m_hwndCombo)
1922
1923 m_outerList.RemoveAll(); // no use
1924 return ret;
1925 }
1926}
static HWND s_hWatchWnd
#define WATCH_TIMER_ID
static HHOOK s_hMouseHook
static LRESULT CALLBACK MouseProc(INT nCode, WPARAM wParam, LPARAM lParam)
#define WATCH_INTERVAL
DWORD WINAPI GetCurrentThreadId(void)
Definition: thread.c:459
LRESULT WINAPI DefWindowProcW(_In_ HWND, _In_ UINT, _In_ WPARAM, _In_ LPARAM)
#define SetWindowsHookEx
Definition: winuser.h:5865
UINT_PTR WINAPI SetTimer(_In_opt_ HWND, _In_ UINT_PTR, _In_ UINT, _In_opt_ TIMERPROC)
BOOL WINAPI ShowWindowAsync(_In_ HWND, _In_ int)
#define WH_MOUSE
Definition: winuser.h:37
BOOL WINAPI UnhookWindowsHookEx(_In_ HHOOK)
BOOL WINAPI InvalidateRect(_In_opt_ HWND, _In_opt_ LPCRECT, _In_ BOOL)
BOOL WINAPI KillTimer(_In_opt_ HWND, _In_ UINT_PTR)

◆ OnSize()

LRESULT CAutoComplete::OnSize ( UINT  uMsg,
WPARAM  wParam,
LPARAM  lParam,
BOOL bHandled 
)
protected

Definition at line 1850 of file CAutoComplete.cpp.

1851{
1852 // calculate the positions of the controls
1853 CRect rcList, rcScrollBar, rcSizeBox;
1854 CalcRects(m_bDowner, rcList, rcScrollBar, rcSizeBox);
1855
1856 // reposition the controls in smartest way
1858 HDWP hDWP = ::BeginDeferWindowPos(3);
1860 rcScrollBar.left, rcScrollBar.top,
1861 rcScrollBar.Width(), rcScrollBar.Height(), uSWP_);
1863 rcSizeBox.left, rcSizeBox.top,
1864 rcSizeBox.Width(), rcSizeBox.Height(), uSWP_);
1866 rcList.left, rcList.top,
1867 rcList.Width(), rcList.Height(), uSWP_);
1868 ::EndDeferWindowPos(hDWP);
1869
1871 return 0;
1872}
VOID CalcRects(BOOL bDowner, RECT &rcListView, RECT &rcScrollBar, RECT &rcSizeBox) const
int Width() const noexcept
Definition: atltypes.h:461
int Height() const noexcept
Definition: atltypes.h:318
BOOL WINAPI EndDeferWindowPos(_In_ HDWP)
#define HWND_TOP
Definition: winuser.h:1207
#define SWP_NOCOPYBITS
Definition: winuser.h:1243
HDWP WINAPI DeferWindowPos(_In_ HDWP, _In_ HWND, _In_opt_ HWND, _In_ int, _In_ int, _In_ int, _In_ int, _In_ UINT)
HDWP WINAPI BeginDeferWindowPos(_In_ int)

◆ OnTimer()

LRESULT CAutoComplete::OnTimer ( UINT  uMsg,
WPARAM  wParam,
LPARAM  lParam,
BOOL bHandled 
)
protected

Definition at line 1929 of file CAutoComplete.cpp.

1930{
1931 if (wParam != WATCH_TIMER_ID) // sanity check
1932 return 0;
1933
1934 // if the textbox is dead, then kill the timer
1935 if (!::IsWindow(m_hwndEdit))
1936 {
1938 return 0;
1939 }
1940
1941 // m_hwndEdit is moved?
1942 RECT rcEdit;
1943 ::GetWindowRect(m_hwndEdit, &rcEdit);
1944 if (!::EqualRect(&rcEdit, &m_rcEdit))
1945 {
1946 // if so, hide
1947 HideDropDown();
1948
1949 m_rcEdit = rcEdit; // update rectangle
1950 m_bResized = FALSE; // clear flag
1951 }
1952
1953 return 0;
1954}
BOOL WINAPI EqualRect(_In_ LPCRECT, _In_ LPCRECT)

◆ OnVScroll()

LRESULT CAutoComplete::OnVScroll ( UINT  uMsg,
WPARAM  wParam,
LPARAM  lParam,
BOOL bHandled 
)
protected

Definition at line 1958 of file CAutoComplete.cpp.

1959{
1960 TRACE("CAutoComplete::OnVScroll(%p)\n", this);
1962 switch (code)
1963 {
1965 {
1966 // get the scrolling info
1967 INT nPos = HIWORD(wParam);
1968 SCROLLINFO si = { sizeof(si), SIF_ALL };
1969 m_hwndList.GetScrollInfo(SB_VERT, &si);
1970
1971 // scroll the list-view by CListView::EnsureVisible
1972 INT cItems = m_hwndList.GetItemCount();
1973 // iItem : cItems == (nPos - si.nMin) : (si.nMax - si.nMin).
1974 INT iItem = cItems * (nPos - si.nMin) / (si.nMax - si.nMin);
1975 if (nPos > si.nPos)
1976 {
1977 iItem += m_hwndList.GetVisibleCount();
1978 if (iItem >= cItems)
1979 iItem = cItems - 1;
1980 }
1981 m_hwndList.EnsureVisible(iItem, FALSE);
1982
1983 // update scrolling position of m_hwndScrollBar
1984 si.fMask = SIF_POS;
1985 m_hwndList.GetScrollInfo(SB_VERT, &si);
1986 m_hwndScrollBar.SetScrollInfo(SB_VERT, &si, FALSE);
1987 break;
1988 }
1989 default:
1990 {
1991 // pass it to m_hwndList
1992 m_hwndList.SendMessageW(WM_VSCROLL, wParam, lParam);
1994 break;
1995 }
1996 }
1997 return 0;
1998}
unsigned short WORD
Definition: ntddk_ex.h:93
#define LOWORD(l)
Definition: pedump.c:82
Definition: inflate.c:139
#define HIWORD(l)
Definition: typedefs.h:247
#define SB_THUMBTRACK
Definition: winuser.h:573
#define WM_VSCROLL
Definition: winuser.h:1744
#define SB_VERT
Definition: winuser.h:553
#define SIF_ALL
Definition: winuser.h:1232
#define SIF_POS
Definition: winuser.h:1234
#define SB_THUMBPOSITION
Definition: winuser.h:572

◆ ReLoadInnerList()

VOID CAutoComplete::ReLoadInnerList ( PAC_THREAD  pThread)
protected

Definition at line 1498 of file CAutoComplete.cpp.

1499{
1500 pThread->m_innerList.RemoveAll(); // clear contents
1501
1502 if (!m_pEnum || pThread->m_strText.IsEmpty())
1503 return;
1504
1505 // reload the items
1506 LPWSTR pszItem;
1507 ULONG cGot;
1508 HRESULT hr;
1509 CSimpleArray<CStringW>& innerList = pThread->m_innerList;
1510 while (!m_pThread && m_hThread)
1511 {
1512 // get next item
1513 hr = m_pEnum->Next(1, &pszItem, &cGot);
1514 if (hr != S_OK)
1515 break;
1516
1517 innerList.Add(pszItem); // append item to innerList
1518 ::CoTaskMemFree(pszItem); // free
1519 }
1520}
VOID WINAPI CoTaskMemFree(LPVOID ptr)
Definition: ifs.c:442
uint32_t ULONG
Definition: typedefs.h:59

Referenced by DoThreadWork().

◆ RepositionDropDown()

VOID CAutoComplete::RepositionDropDown ( )
protected

Definition at line 1391 of file CAutoComplete.cpp.

1392{
1393 // If Edit has no focus, don't open auto-complete
1394 if (!m_bEditHasFocus)
1395 {
1396 TRACE("!m_bEditHasFocus\n");
1397 return;
1398 }
1399
1400 // get nearest monitor from m_hwndEdit
1401 HMONITOR hMon = ::MonitorFromWindow(m_hwndEdit, MONITOR_DEFAULTTONEAREST);
1402 ATLASSERT(hMon != NULL);
1403 if (hMon == NULL)
1404 return;
1405
1406 // get nearest monitor info
1407 MONITORINFO mi = { sizeof(mi) };
1408 if (!::GetMonitorInfo(hMon, &mi))
1409 {
1411 return;
1412 }
1413
1414 // get count and item height
1415 INT cItems = GetItemCount();
1416 INT cyItem = m_hwndList.m_cyItem;
1417 ATLASSERT(cyItem > 0);
1418
1419 // get m_hwndEdit position
1420 RECT rcEdit;
1421 ::GetWindowRect(m_hwndEdit, &rcEdit);
1422 INT x = rcEdit.left, y = rcEdit.bottom;
1423
1424 // get list extent
1425 RECT rcMon = mi.rcMonitor;
1426 INT cx = rcEdit.right - rcEdit.left, cy = cItems * cyItem;
1427 BOOL bLongList = FALSE;
1428 if (cy > CY_LIST)
1429 {
1430 cy = INT(CY_LIST / cyItem) * cyItem;
1431 bLongList = TRUE;
1432 }
1433
1434 // convert rectangle for frame
1435 RECT rc = { 0, 0, cx, cy };
1436 AdjustWindowRectEx(&rc, GetStyle(), FALSE, GetExStyle());
1437 cy = rc.bottom - rc.top;
1438
1439 if (!m_bResized)
1440 {
1441 // is the drop-down window a 'downer' or 'upper'?
1442 // NOTE: 'downer' is below the EDIT control. 'upper' is above the EDIT control.
1443 m_bDowner = (rcEdit.bottom + cy < rcMon.bottom);
1444 }
1445
1446 // adjust y and cy
1447 if (m_bDowner)
1448 {
1449 if (rcMon.bottom < y + cy)
1450 {
1451 cy = ((rcMon.bottom - y) / cyItem) * cyItem;
1452 bLongList = TRUE;
1453 }
1454 }
1455 else
1456 {
1457 if (rcEdit.top < rcMon.top + cy)
1458 {
1459 cy = ((rcEdit.top - rcMon.top) / cyItem) * cyItem;
1460 bLongList = TRUE;
1461 }
1462 y = rcEdit.top - cy;
1463 }
1464
1465 // set status
1466 m_hwndSizeBox.SetStatus(m_bDowner, bLongList);
1467
1468 if (m_bResized) // already resized?
1469 PostMessageW(WM_SIZE, 0, 0); // re-layout
1470 else
1471 MoveWindow(x, y, cx, cy); // move
1472
1473 // show without activation
1475}
#define CY_LIST
VOID SetStatus(BOOL bDowner, BOOL bLongList)
INT GetItemCount() const
GLint GLint GLint GLint GLint x
Definition: gl.h:1548
GLint GLint GLint GLint GLint GLint y
Definition: gl.h:1548
HMONITOR WINAPI MonitorFromWindow(HWND, DWORD)
#define INT
Definition: polytest.cpp:20
_Out_opt_ int _Out_opt_ int * cy
Definition: commctrl.h:586
_Out_opt_ int * cx
Definition: commctrl.h:585
RECT rcMonitor
Definition: winuser.h:3785
static MONITORINFO mi
Definition: win.c:7338
#define GetMonitorInfo
Definition: winuser.h:5800
#define WM_SIZE
Definition: winuser.h:1611
BOOL WINAPI AdjustWindowRectEx(_Inout_ LPRECT, _In_ DWORD, _In_ BOOL, _In_ DWORD)
BOOL WINAPI MoveWindow(_In_ HWND, _In_ int, _In_ int, _In_ int, _In_ int, _In_ BOOL)

Referenced by FinishCompletion(), and ShowDropDown().

◆ Reset()

STDMETHODIMP CAutoComplete::Reset ( )
override

Implements IEnumString.

Definition at line 1273 of file CAutoComplete.cpp.

1274{
1275 TRACE("(%p)\n", this);
1276 if (m_pEnum)
1277 return m_pEnum->Reset();
1278 return E_FAIL;
1279}

Referenced by ResetEnumerator().

◆ ResetEnumerator()

STDMETHODIMP CAutoComplete::ResetEnumerator ( )
override

Implements IAutoCompleteDropDown.

Definition at line 1232 of file CAutoComplete.cpp.

1233{
1234 FIXME("(%p): stub\n", this);
1235
1236 Reset();
1237 m_hwndList.SendMessageW(LVM_SETITEMCOUNT, 0, 0);
1238 m_outerList.RemoveAll();
1239 return S_OK;
1240}
#define FIXME(fmt,...)
Definition: precomp.h:53
STDMETHODIMP Reset() override

◆ SelectItem()

VOID CAutoComplete::SelectItem ( INT  iItem)

Definition at line 786 of file CAutoComplete.cpp.

787{
788 m_hwndList.SetCurSel(iItem);
789 if (iItem != -1)
790 m_hwndList.EnsureVisible(iItem, FALSE);
791}

Referenced by FinishCompletion(), CACListView::OnLButtonDown(), and OnNotify().

◆ SetEditSel()

VOID CAutoComplete::SetEditSel ( INT  ich0,
INT  ich1 
)

Definition at line 760 of file CAutoComplete.cpp.

761{
763}
#define EM_SETSEL
Definition: winuser.h:2018

Referenced by DoAutoAppend(), DoBackWord(), OnEditKeyDown(), CACListView::OnLButtonDown(), and OnListSelChange().

◆ SetEditText()

VOID CAutoComplete::SetEditText ( LPCWSTR  pszText)

Definition at line 745 of file CAutoComplete.cpp.

746{
747 m_bInSetText = TRUE; // don't hide drop-down
748 ::CallWindowProcW(m_fnOldEditProc, m_hwndEdit, WM_SETTEXT, 0, reinterpret_cast<LPARAM>(pszText));
750}

Referenced by DoAutoAppend(), OnEditKeyDown(), CACListView::OnLButtonDown(), and OnListSelChange().

◆ SetOptions()

STDMETHODIMP CAutoComplete::SetOptions ( DWORD  dwFlag)
override

Implements IAutoComplete2.

Definition at line 1181 of file CAutoComplete.cpp.

1182{
1183 TRACE("(%p) -> (0x%x)\n", this, dwFlag);
1184 m_dwOptions = dwFlag;
1185
1186 if (m_dwOptions & ACO_SEARCH)
1187 FIXME(" ACO_SEARCH not supported\n");
1189 FIXME(" ACO_FILTERPREFIXES not supported\n");
1191 FIXME(" ACO_RTLREADING not supported\n");
1192
1193 UpdateDropDownState(); // create/hide the drop-down window if necessary
1194 return S_OK;
1195}

◆ ShowDropDown()

VOID CAutoComplete::ShowDropDown ( )

Definition at line 765 of file CAutoComplete.cpp.

766{
767 if (!m_hWnd || !CanAutoSuggest())
768 return;
769
770 INT cItems = GetItemCount();
771 if (cItems == 0 || ::GetFocus() != m_hwndEdit || IsComboBoxDropped())
772 {
773 // hide the drop-down if necessary
774 HideDropDown();
775 return;
776 }
777
779}
BOOL IsComboBoxDropped() const

Referenced by OnListUpDown().

◆ Skip()

STDMETHODIMP CAutoComplete::Skip ( ULONG  celt)
override

Implements IEnumString.

Definition at line 1266 of file CAutoComplete.cpp.

1267{
1268 TRACE("(%p, %d)\n", this, celt);
1269 return E_NOTIMPL;
1270}

◆ StartCompletion()

VOID CAutoComplete::StartCompletion ( BOOL  bAppendOK)

Definition at line 1522 of file CAutoComplete.cpp.

1523{
1524 TRACE("CAutoComplete::StartCompletion(%p, %d)\n", this, bAppendOK);
1525
1526 if (!m_pEnum || (!CanAutoSuggest() && !CanAutoAppend()))
1527 return;
1528
1529 ::SendMessageW(m_hWnd, AUTOCOMP_START, bAppendOK, 0);
1530}
#define AUTOCOMP_START

Referenced by EditWndProc(), OnEditChar(), and OnEditKeyDown().

◆ UpdateDropDownState()

VOID CAutoComplete::UpdateDropDownState ( )
protected

Definition at line 1293 of file CAutoComplete.cpp.

1294{
1295 if (CanAutoSuggest())
1296 {
1297 // create the drop-down window if not existed
1298 if (!m_hWnd)
1300 }
1301 else
1302 {
1303 // hide if existed
1304 if (m_hWnd)
1306 }
1307}

Referenced by Init(), and SetOptions().

◆ UpdateScrollBar()

VOID CAutoComplete::UpdateScrollBar ( )

Definition at line 890 of file CAutoComplete.cpp.

891{
892 // copy scroll info from m_hwndList to m_hwndScrollBar
893 SCROLLINFO si = { sizeof(si), SIF_ALL };
894 m_hwndList.GetScrollInfo(SB_VERT, &si);
895 m_hwndScrollBar.SetScrollInfo(SB_CTL, &si, FALSE);
896
897 // show/hide scroll bar
898 INT cVisibles = m_hwndList.GetVisibleCount();
899 INT cItems = m_hwndList.GetItemCount();
900 BOOL bShowScroll = (cItems > cVisibles);
901 m_hwndScrollBar.ShowWindow(bShowScroll ? SW_SHOWNOACTIVATE : SW_HIDE);
902 if (bShowScroll)
903 m_hwndScrollBar.InvalidateRect(NULL, FALSE); // redraw
904}
#define SB_CTL
Definition: winuser.h:554

Referenced by CACListView::OnMouseWheel(), OnNotify(), OnSize(), and OnVScroll().

◆ UseTab()

BOOL CAutoComplete::UseTab ( ) const
inline

Definition at line 708 of file CAutoComplete.cpp.

709{
710 return !!(m_dwOptions & ACO_USETAB) && m_bEnabled;
711}

Referenced by EditWndProc(), and OnEditKeyDown().

Member Data Documentation

◆ m_bDowner

BOOL CAutoComplete::m_bDowner
protected

Definition at line 212 of file CAutoComplete.h.

Referenced by OnNCHitTest(), OnSize(), and RepositionDropDown().

◆ m_bEditHasFocus

BOOL CAutoComplete::m_bEditHasFocus

Definition at line 156 of file CAutoComplete.h.

Referenced by EditWndProc(), Init(), and RepositionDropDown().

◆ m_bEnabled

DWORD CAutoComplete::m_bEnabled
protected

Definition at line 214 of file CAutoComplete.h.

Referenced by CanAutoAppend(), CanAutoSuggest(), Enable(), FilterPrefixes(), and UseTab().

◆ m_bInSelectItem

BOOL CAutoComplete::m_bInSelectItem

Definition at line 155 of file CAutoComplete.h.

Referenced by FinishCompletion(), and OnNotify().

◆ m_bInSetText

BOOL CAutoComplete::m_bInSetText

Definition at line 154 of file CAutoComplete.h.

Referenced by EditWndProc(), and SetEditText().

◆ m_bResized

BOOL CAutoComplete::m_bResized
protected

Definition at line 217 of file CAutoComplete.h.

Referenced by OnExitSizeMove(), OnTimer(), and RepositionDropDown().

◆ m_dwOptions

DWORD CAutoComplete::m_dwOptions
protected

◆ m_fnOldEditProc

WNDPROC CAutoComplete::m_fnOldEditProc
protected

Definition at line 220 of file CAutoComplete.h.

Referenced by DoBackWord(), Init(), OnEditKeyDown(), SetEditSel(), and SetEditText().

◆ m_fnOldWordBreakProc

EDITWORDBREAKPROCW CAutoComplete::m_fnOldWordBreakProc
protected

Definition at line 221 of file CAutoComplete.h.

Referenced by EditWndProc(), and Init().

◆ m_hFont

HFONT CAutoComplete::m_hFont
protected

Definition at line 216 of file CAutoComplete.h.

Referenced by OnCreate(), OnDrawItem(), and ~CAutoComplete().

◆ m_hThread

HANDLE CAutoComplete::m_hThread
protected

◆ m_hwndCombo

HWND CAutoComplete::m_hwndCombo
protected

Definition at line 215 of file CAutoComplete.h.

Referenced by Init(), IsComboBoxDropped(), OnNCDestroy(), and OnShowWindow().

◆ m_hwndEdit

◆ m_hwndList

◆ m_hwndScrollBar

CACScrollBar CAutoComplete::m_hwndScrollBar
protected

Definition at line 230 of file CAutoComplete.h.

Referenced by OnCreate(), OnNCDestroy(), OnSize(), OnVScroll(), and UpdateScrollBar().

◆ m_hwndSizeBox

CACSizeBox CAutoComplete::m_hwndSizeBox
protected

Definition at line 231 of file CAutoComplete.h.

Referenced by OnCreate(), OnNCDestroy(), OnNCHitTest(), OnSize(), and RepositionDropDown().

◆ m_innerList

CSimpleArray<CStringW> CAutoComplete::m_innerList
protected

Definition at line 234 of file CAutoComplete.h.

Referenced by DoThreadWork(), and FinishCompletion().

◆ m_outerList

CSimpleArray<CStringW> CAutoComplete::m_outerList
protected

◆ m_pACList

CComPtr<IACList> CAutoComplete::m_pACList
protected

Definition at line 233 of file CAutoComplete.h.

Referenced by Init(), OnAutoCompStart(), and ~CAutoComplete().

◆ m_pEnum

CComPtr<IEnumString> CAutoComplete::m_pEnum
protected

◆ m_pThread

◆ m_rcEdit

RECT CAutoComplete::m_rcEdit
protected

Definition at line 218 of file CAutoComplete.h.

Referenced by Init(), and OnTimer().

◆ m_strQuickComplete

CStringW CAutoComplete::m_strQuickComplete
protected

Definition at line 228 of file CAutoComplete.h.

Referenced by GetQuickEdit(), and LoadQuickComplete().

◆ m_strStemText

CStringW CAutoComplete::m_strStemText
protected

Definition at line 227 of file CAutoComplete.h.

Referenced by FinishCompletion(), and OnAutoCompStart().

◆ m_strText

CStringW CAutoComplete::m_strText
protected

Definition at line 226 of file CAutoComplete.h.

Referenced by FinishCompletion(), OnAutoCompStart(), OnEditKeyDown(), and OnListSelChange().


The documentation for this class was generated from the following files: