ReactOS 0.4.15-dev-7788-g1ad9096
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
 
- 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 653 of file CAutoComplete.cpp.

659{
660}
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 673 of file CAutoComplete.cpp.

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}
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 1999 of file CAutoComplete.cpp.

2000{
2001 for (;;)
2002 {
2004 if (!pThread)
2005 break;
2006 DoThreadWork(pThread);
2007 }
2008}
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 1302 of file CAutoComplete.cpp.

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}
#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 696 of file CAutoComplete.cpp.

697{
698 return !!(m_dwOptions & ACO_AUTOAPPEND) && m_bEnabled;
699}

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 1274 of file CAutoComplete.cpp.

1275{
1276 TRACE("(%p, %p)\n", this, ppOut);
1277 if (ppOut)
1278 *ppOut = NULL;
1279 return E_NOTIMPL;
1280}
#define E_NOTIMPL
Definition: ddrawi.h:99

◆ CreateDropDown()

HWND CAutoComplete::CreateDropDown ( )

Definition at line 662 of file CAutoComplete.cpp.

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}
#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 786 of file CAutoComplete.cpp.

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}
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 862 of file CAutoComplete.cpp.

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}
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 2010 of file CAutoComplete.cpp.

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}
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 299 of file CAutoComplete.cpp.

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}
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
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 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 1094 of file CAutoComplete.cpp.

1095{
1096 TRACE("(%p)->Enable(%d)\n", this, fEnable);
1097 m_bEnabled = fEnable;
1098 return S_OK;
1099}
#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 1463 of file CAutoComplete.cpp.

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}
#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 713 of file CAutoComplete.cpp.

714{
716}
@ ACO_FILTERPREFIXES
Definition: shldisp.idl:98

◆ FinishCompletion()

VOID CAutoComplete::FinishCompletion ( PAC_THREAD  pThread)

Definition at line 2131 of file CAutoComplete.cpp.

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}
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 1193 of file CAutoComplete.cpp.

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}
CStringW GetItemText(INT iItem)
#define E_OUTOFMEMORY
Definition: ddrawi.h:100
HRESULT WINAPI SHStrDupW(LPCWSTR src, LPWSTR *dest)
Definition: string.c:2004
r dropped
Definition: btrfs.c:3014

◆ GetEditText()

CStringW CAutoComplete::GetEditText ( ) const
inline

Definition at line 730 of file CAutoComplete.cpp.

731{
732 WCHAR szText[L_MAX_URL_LENGTH];
733 if (::GetWindowTextW(m_hwndEdit, szText, _countof(szText)))
734 return szText;
735 return L"";
736}
#define L_MAX_URL_LENGTH
Definition: commctrl.h:4735
#define _countof(array)
Definition: sndvol32.h:68
int WINAPI GetWindowTextW(HWND hWnd, LPWSTR lpString, int nMaxCount)
Definition: window.c:1412
__wchar_t WCHAR
Definition: xmlstorage.h:180

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

◆ GetItemCount()

INT CAutoComplete::GetItemCount ( ) const
inline

Definition at line 718 of file CAutoComplete.cpp.

719{
720 return m_outerList.GetSize();
721}

Referenced by RepositionDropDown(), and ShowDropDown().

◆ GetItemText()

CStringW CAutoComplete::GetItemText ( INT  iItem) const

Definition at line 723 of file CAutoComplete.cpp.

724{
725 if (iItem < 0 || m_outerList.GetSize() <= iItem)
726 return L"";
727 return m_outerList[iItem];
728}

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

◆ GetOptions()

STDMETHODIMP CAutoComplete::GetOptions ( DWORD pdwFlag)
override

Implements IAutoComplete2.

Definition at line 1161 of file CAutoComplete.cpp.

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}
#define E_INVALIDARG
Definition: ddrawi.h:101

◆ GetQuickEdit()

CStringW CAutoComplete::GetQuickEdit ( LPCWSTR  pszText) const
protected

Definition at line 1372 of file CAutoComplete.cpp.

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}
CStringW m_strQuickComplete

Referenced by OnEditKeyDown().

◆ GetStemText()

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

Definition at line 745 of file CAutoComplete.cpp.

746{
747 INT ich = strText.ReverseFind(L'\\');
748 if (ich == -1)
749 return L""; // no stem
750 return strText.Left(ich + 1);
751}
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 774 of file CAutoComplete.cpp.

775{
777}
#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 1102 of file CAutoComplete.cpp.

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}
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
#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 706 of file CAutoComplete.cpp.

707{
709 return FALSE;
711}
#define CB_GETDROPPEDSTATE
Definition: winuser.h:1945

Referenced by ShowDropDown().

◆ LoadQuickComplete()

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

Definition at line 1339 of file CAutoComplete.cpp.

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}
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 1238 of file CAutoComplete.cpp.

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}
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 2118 of file CAutoComplete.cpp.

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}
VOID FinishCompletion(PAC_THREAD pThread)

◆ OnAutoCompStart()

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

Definition at line 2046 of file CAutoComplete.cpp.

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}
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 1523 of file CAutoComplete.cpp.

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}
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 1609 of file CAutoComplete.cpp.

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}
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:1539
#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 989 of file CAutoComplete.cpp.

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}
#define VK_BACK
Definition: winuser.h:2198

Referenced by EditWndProc().

◆ OnEditKeyDown()

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

Definition at line 899 of file CAutoComplete.cpp.

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}
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 1593 of file CAutoComplete.cpp.

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}
#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 1585 of file CAutoComplete.cpp.

1586{
1587 // The message loop is finished, now we can safely destruct!
1588 Release();
1589}

◆ OnGetMinMaxInfo()

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

Definition at line 1653 of file CAutoComplete.cpp.

1654{
1655 // restrict minimum size
1656 LPMINMAXINFO pInfo = reinterpret_cast<LPMINMAXINFO>(lParam);
1659 return 0;
1660}
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 1000 of file CAutoComplete.cpp.

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}
const WCHAR * text
Definition: package.c:1799

Referenced by OnNotify().

◆ OnListUpDown()

BOOL CAutoComplete::OnListUpDown ( UINT  vk)

Definition at line 1013 of file CAutoComplete.cpp.

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}
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 1664 of file CAutoComplete.cpp.

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}

◆ OnMouseActivate()

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

Definition at line 1679 of file CAutoComplete.cpp.

1680{
1681 return MA_NOACTIVATE; // don't activate by mouse
1682}
#define MA_NOACTIVATE
Definition: winuser.h:2503

◆ OnNCActivate()

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

Definition at line 1686 of file CAutoComplete.cpp.

1687{
1688 bHandled = FALSE; // do default
1689 return 0;
1690}

◆ OnNCDestroy()

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

Definition at line 1558 of file CAutoComplete.cpp.

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}

◆ OnNCHitTest()

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

Definition at line 1819 of file CAutoComplete.cpp.

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}
#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 1693 of file CAutoComplete.cpp.

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}

◆ OnNotify()

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

Definition at line 1713 of file CAutoComplete.cpp.

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}
INT ItemFromPoint(INT x, INT y)
VOID UpdateScrollBar()
INT WINAPI SHUnicodeToAnsi(LPCWSTR lpSrcStr, LPSTR lpDstStr, INT iLen)
Definition: string.c:2783
#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:2670

◆ OnShowWindow()

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

Definition at line 1860 of file CAutoComplete.cpp.

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}
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:5856
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 1835 of file CAutoComplete.cpp.

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}
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 1914 of file CAutoComplete.cpp.

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}
BOOL WINAPI EqualRect(_In_ LPCRECT, _In_ LPCRECT)

◆ OnVScroll()

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

Definition at line 1943 of file CAutoComplete.cpp.

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}
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 1483 of file CAutoComplete.cpp.

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}
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 1383 of file CAutoComplete.cpp.

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}
#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:5791
#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 1265 of file CAutoComplete.cpp.

1266{
1267 TRACE("(%p)\n", this);
1268 if (m_pEnum)
1269 return m_pEnum->Reset();
1270 return E_FAIL;
1271}

Referenced by ResetEnumerator().

◆ ResetEnumerator()

STDMETHODIMP CAutoComplete::ResetEnumerator ( )
override

Implements IAutoCompleteDropDown.

Definition at line 1224 of file CAutoComplete.cpp.

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}
#define FIXME(fmt,...)
Definition: debug.h:111
STDMETHODIMP Reset() override

◆ SelectItem()

VOID CAutoComplete::SelectItem ( INT  iItem)

Definition at line 779 of file CAutoComplete.cpp.

780{
781 m_hwndList.SetCurSel(iItem);
782 if (iItem != -1)
783 m_hwndList.EnsureVisible(iItem, FALSE);
784}

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

◆ SetEditSel()

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

Definition at line 753 of file CAutoComplete.cpp.

754{
756}
#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 738 of file CAutoComplete.cpp.

739{
740 m_bInSetText = TRUE; // don't hide drop-down
741 ::CallWindowProcW(m_fnOldEditProc, m_hwndEdit, WM_SETTEXT, 0, reinterpret_cast<LPARAM>(pszText));
743}

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

◆ SetOptions()

STDMETHODIMP CAutoComplete::SetOptions ( DWORD  dwFlag)
override

Implements IAutoComplete2.

Definition at line 1173 of file CAutoComplete.cpp.

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}

◆ ShowDropDown()

VOID CAutoComplete::ShowDropDown ( )

Definition at line 758 of file CAutoComplete.cpp.

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}
BOOL IsComboBoxDropped() const
HWND WINAPI GetFocus(void)
Definition: window.c:1893

Referenced by OnListUpDown().

◆ Skip()

STDMETHODIMP CAutoComplete::Skip ( ULONG  celt)
override

Implements IEnumString.

Definition at line 1258 of file CAutoComplete.cpp.

1259{
1260 TRACE("(%p, %d)\n", this, celt);
1261 return E_NOTIMPL;
1262}

◆ StartCompletion()

VOID CAutoComplete::StartCompletion ( BOOL  bAppendOK)

Definition at line 1507 of file CAutoComplete.cpp.

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}
#define AUTOCOMP_START

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

◆ UpdateDropDownState()

VOID CAutoComplete::UpdateDropDownState ( )
protected

Definition at line 1285 of file CAutoComplete.cpp.

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}

Referenced by Init(), and SetOptions().

◆ UpdateScrollBar()

VOID CAutoComplete::UpdateScrollBar ( )

Definition at line 883 of file CAutoComplete.cpp.

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}
#define SB_CTL
Definition: winuser.h:554

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

◆ UseTab()

BOOL CAutoComplete::UseTab ( ) const
inline

Definition at line 701 of file CAutoComplete.cpp.

702{
703 return !!(m_dwOptions & ACO_USETAB) && m_bEnabled;
704}

Referenced by EditWndProc(), and OnEditKeyDown().

Member Data Documentation

◆ m_bDowner

BOOL CAutoComplete::m_bDowner
protected

Definition at line 211 of file CAutoComplete.h.

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

◆ m_bEnabled

DWORD CAutoComplete::m_bEnabled
protected

Definition at line 213 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 216 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 219 of file CAutoComplete.h.

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

◆ m_fnOldWordBreakProc

EDITWORDBREAKPROCW CAutoComplete::m_fnOldWordBreakProc
protected

Definition at line 220 of file CAutoComplete.h.

Referenced by EditWndProc(), and Init().

◆ m_hFont

HFONT CAutoComplete::m_hFont
protected

Definition at line 215 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 214 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 229 of file CAutoComplete.h.

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

◆ m_hwndSizeBox

CACSizeBox CAutoComplete::m_hwndSizeBox
protected

Definition at line 230 of file CAutoComplete.h.

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

◆ m_innerList

CSimpleArray<CStringW> CAutoComplete::m_innerList
protected

Definition at line 233 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 232 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 217 of file CAutoComplete.h.

Referenced by Init(), and OnTimer().

◆ m_strQuickComplete

CStringW CAutoComplete::m_strQuickComplete
protected

Definition at line 227 of file CAutoComplete.h.

Referenced by GetQuickEdit(), and LoadQuickComplete().

◆ m_strStemText

CStringW CAutoComplete::m_strStemText
protected

Definition at line 226 of file CAutoComplete.h.

Referenced by FinishCompletion(), and OnAutoCompStart().

◆ m_strText

CStringW CAutoComplete::m_strText
protected

Definition at line 225 of file CAutoComplete.h.

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


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