242 lines
7.2 KiB
C++
242 lines
7.2 KiB
C++
// ==========================================================================
|
|
// Class Specification : COXAutoComplete
|
|
// ==========================================================================
|
|
// Header file : OXAutoComplete.h
|
|
// Version: 9.3
|
|
// This software along with its related components, documentation and files ("The Libraries")
|
|
// is © 1994-2007 The Code Project (1612916 Ontario Limited) and use of The Libraries is
|
|
// governed by a software license agreement ("Agreement"). Copies of the Agreement are
|
|
// available at The Code Project (www.codeproject.com), as part of the package you downloaded
|
|
// to obtain this file, or directly from our office. For a copy of the license governing
|
|
// this software, you may contact us at legalaffairs@codeproject.com, or by calling 416-849-8900.
|
|
//
|
|
// //////////////////////////////////////////////////////////////////////////
|
|
//
|
|
// Description:
|
|
//
|
|
// The COXAutoComplete class provided similar capabilities to the user
|
|
// like IE addressbar. It will remember your last values you've entered in
|
|
// the edit box (number of the values for a window you can set by
|
|
// SetDepth()) function. And while you are typing it will suggest you some values
|
|
// from your most recently used ones.
|
|
// To use this class you may have just one instance for you application.
|
|
// Call Attach() function for every window you want to provide this
|
|
// functionality. If you want to provide separate list of values for
|
|
// the windows you should supply different names for every window in
|
|
// Attach(). The data is persistent and will be saved in the registry.
|
|
// You do not need call Detach() - it will be done on destruction.
|
|
// To add value to the list you must call Complete() function telling
|
|
// to the COXAutoComplete to add this value to the list.
|
|
// Usually it will be when user pressed enter.
|
|
// The class has two flags that define his behavior.
|
|
// When you call Attach() if you set OX_AUTOCOMPLETE_LIST flag, it will
|
|
// bring you list box to show you possible values.
|
|
// If you set OX_AUTOCOMPLETE_APPEND style it will fill edit box
|
|
// with recommended value. By default all they are set on.
|
|
//
|
|
//
|
|
//
|
|
//
|
|
//
|
|
//
|
|
//
|
|
//
|
|
//
|
|
//
|
|
//
|
|
//
|
|
//
|
|
//
|
|
//
|
|
//
|
|
//
|
|
//
|
|
//////////////////////////////////////////////////////////////////////
|
|
//
|
|
// Dependencies:
|
|
// OXAutoListBox.h
|
|
// OXAutoComplete.h
|
|
// OXRegistryValFile.h
|
|
//
|
|
// OXAutoListBox.cpp
|
|
// OXAutoComplete.cpp
|
|
// OXRegistryValFile.cpp
|
|
|
|
|
|
#if !defined(_OXAUTOCOMPLETE_H__)
|
|
#define _OXAUTOCOMPLETE_H__
|
|
|
|
#if _MSC_VER > 1000
|
|
#pragma once
|
|
#endif // _MSC_VER > 1000
|
|
|
|
#include "oxdllext.h"
|
|
#include "afxtempl.h"
|
|
#include "OXAutoListBox.h"
|
|
#include "UTB64Bit.h"
|
|
|
|
#ifndef OX_AUTOCOMPLETE_DEPTHDEFAULT
|
|
#define OX_AUTOCOMPLETE_DEPTHDEFAULT 20
|
|
#endif
|
|
|
|
#ifndef OX_AUTOCOMPLETE_NAMEDEFAULT
|
|
#define OX_AUTOCOMPLETE_NAMEDEFAULT _T("Common")
|
|
#endif
|
|
|
|
#ifndef OX_AUTOCOMPLETE_VERSION
|
|
#define OX_AUTOCOMPLETE_VERSION 0x100
|
|
#endif
|
|
|
|
#ifndef OX_AUTOCOMPLETE_HEIGHTDEFAULTMAX
|
|
#define OX_AUTOCOMPLETE_HEIGHTDEFAULTMAX 60
|
|
#endif
|
|
|
|
#define OX_AUTOCOMPLETE_LIST 0x01
|
|
#define OX_AUTOCOMPLETE_APPEND 0x02
|
|
|
|
///////////////////////////////////////////////////////////////////////////
|
|
//
|
|
// class COXAutoStorage
|
|
//
|
|
///////////////////////////////////////////////////////////////////////////
|
|
//
|
|
// Description:
|
|
// Internal helper class
|
|
//
|
|
///////////////////////////////////////////////////////////////////////////
|
|
|
|
class COXAutoStorage : public CObject
|
|
{
|
|
public:
|
|
UINT GetDepth();
|
|
void SetDepth(UINT nDepth);
|
|
COXAutoStorage(LPCTSTR lpszName=NULL,
|
|
UINT nDepth=OX_AUTOCOMPLETE_DEPTHDEFAULT);
|
|
~COXAutoStorage();
|
|
CString GetName() const { return m_sName;}
|
|
UINT GetMatchedStrings(CString sText, CStringArray& arsStrings);
|
|
BOOL AddString(CString sText);
|
|
BOOL Load();
|
|
BOOL Save();
|
|
inline int GetCount() { return PtrToInt( m_arsContents.GetSize() );}
|
|
protected:
|
|
CString m_sName;
|
|
UINT m_nDepth;
|
|
CStringArray m_arsContents;
|
|
};
|
|
|
|
///////////////////////////////////////////////////////////////////////////
|
|
//
|
|
// class COXAutoComplete
|
|
//
|
|
///////////////////////////////////////////////////////////////////////////
|
|
|
|
class OX_CLASS_DECL COXAutoComplete : public CObject
|
|
{
|
|
|
|
//functions:
|
|
public:
|
|
|
|
// --- In :
|
|
// --- Out :
|
|
// --- Returns :
|
|
// --- Effect : Constructor
|
|
COXAutoComplete(HWND hParentWnd=NULL);
|
|
|
|
// --- In : hWnd - handle of the window to attach to
|
|
// lpszStorageName - name of the entry in the registry where
|
|
// list of entries is saved
|
|
// dwOptions - options - see description of the class
|
|
// --- Out :
|
|
// --- Returns : TRUE on success, FALSE otherwise
|
|
// --- Effect : Attaches list of entries to the window
|
|
BOOL Attach(HWND hWnd, LPCTSTR lpszStorageName=NULL,
|
|
DWORD dwOptions=OX_AUTOCOMPLETE_LIST | OX_AUTOCOMPLETE_APPEND);
|
|
|
|
// --- In : pWnd - A pointer to the window to attach to
|
|
// lpszStorageName - name of the entry in the registry where
|
|
// list of entries is saved
|
|
// dwOptions - options - see description of the class
|
|
// --- Out :
|
|
// --- Returns : TRUE on success, FALSE otherwise
|
|
// --- Effect : Attaches list of entries to the window
|
|
BOOL Attach(CWnd* pWnd, LPCTSTR lpszStorageName=NULL,
|
|
DWORD dwOptions=OX_AUTOCOMPLETE_LIST | OX_AUTOCOMPLETE_APPEND);
|
|
|
|
// --- In : hWnd - A handle to the window to detach from
|
|
// --- Out :
|
|
// --- Returns :
|
|
// --- Effect : Detaches the window
|
|
void Detach(HWND hWnd);
|
|
|
|
// --- In : pWnd - A pointer to the window to detach from
|
|
// --- Out :
|
|
// --- Returns :
|
|
// --- Effect : Detaches the window
|
|
void Detach(CWnd* pWnd=NULL);
|
|
|
|
// --- In : hWnd - A handle of the window to add entry to the list from
|
|
// --- Out :
|
|
// --- Returns :
|
|
// --- Effect : Adds entry to the list for
|
|
// the specified window
|
|
void Complete(HWND hWnd);
|
|
|
|
// --- In :
|
|
// --- Out :
|
|
// --- Returns :
|
|
// --- Effect : Hides listbox
|
|
void Hide();
|
|
|
|
// --- In : hWnd - A handle to the window
|
|
// --- Out :
|
|
// --- Returns : maximum number of entries in the list for the window
|
|
// --- Effect : Returns maximum number of the entries in the list
|
|
int GetDepth(HWND hWnd);
|
|
|
|
// --- In : hWnd - A handle to the window
|
|
// nDepth - maximum number of entries in the list for the window
|
|
// --- Out :
|
|
// --- Returns :
|
|
// --- Effect :Sets new maximum entries for the list
|
|
void SetDepth(UINT nDepth, HWND hWnd);
|
|
|
|
COXAutoStorage* GetStorage(HWND hWnd);
|
|
virtual ~COXAutoComplete();
|
|
|
|
protected:
|
|
|
|
// --- In : hwnd - A handle of the window where text has been changed
|
|
// sNewText - a new text of the window
|
|
// --- Out :
|
|
// --- Returns : TRUE on success, FALSE otherwise
|
|
// --- Effect : This function called internally when text has been
|
|
// changed in a window that was attached
|
|
virtual BOOL OnContentsChange(HWND hwnd, CString sNewText);
|
|
|
|
void ChangeSel(int nKey);
|
|
static LRESULT CALLBACK CallWndProc(int nCode, WPARAM wParam,
|
|
LPARAM lParam);
|
|
static LRESULT CALLBACK KeyboardProc(int code, WPARAM wParam,
|
|
LPARAM lParam);
|
|
|
|
//members
|
|
public:
|
|
void SetParent(HWND hParentWnd);
|
|
|
|
//handle of the window where listbox currently is attached to
|
|
HWND m_hAttached;
|
|
|
|
protected:
|
|
HWND m_hParent;
|
|
BOOL m_bUpdate;
|
|
COXAutoListBox m_lstBox;
|
|
CMap<HWND,HWND,COXAutoStorage*,COXAutoStorage*> m_mpStorage;
|
|
CMap<HWND,HWND,DWORD,DWORD> m_mpOptions;
|
|
HHOOK m_hkMsg;
|
|
HHOOK m_hkKbrd;
|
|
static COXAutoComplete* m_pThis;
|
|
};
|
|
|
|
#endif // !defined(_OXAUTOCOMPLETE_H__)
|