You cannot select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

366 lines
14 KiB
C++

// XTPSyntaxEditAutoCompleteWnd.h: interface for the CXTPSyntaxEditAutoCompleteWnd class.
//
// This file is a part of the XTREME TOOLKIT PRO MFC class library.
// (c)1998-2012 Codejock Software, All Rights Reserved.
//
// THIS SOURCE FILE IS THE PROPERTY OF CODEJOCK SOFTWARE AND IS NOT TO BE
// RE-DISTRIBUTED BY ANY MEANS WHATSOEVER WITHOUT THE EXPRESSED WRITTEN
// CONSENT OF CODEJOCK SOFTWARE.
//
// THIS SOURCE CODE CAN ONLY BE USED UNDER THE TERMS AND CONDITIONS OUTLINED
// IN THE XTREME SYNTAX EDIT LICENSE AGREEMENT. CODEJOCK SOFTWARE GRANTS TO
// YOU (ONE SOFTWARE DEVELOPER) THE LIMITED RIGHT TO USE THIS SOFTWARE ON A
// SINGLE COMPUTER.
//
// CONTACT INFORMATION:
// support@codejock.com
// http://www.codejock.com
//
//////////////////////////////////////////////////////////////////////
//{{AFX_CODEJOCK_PRIVATE
#if !defined(__XTPSYNTAXEDITAUTOCOMPLETEWND_H__)
#define __XTPSYNTAXEDITAUTOCOMPLETEWND_H__
//}}AFX_CODEJOCK_PRIVATE
#if _MSC_VER > 1000
#pragma once
#endif // _MSC_VER > 1000
class CXTPSyntaxEditCtrl;
//===========================================================================
// Summary:
// XTP_EDIT_ACDATA structure defines items displayed data. Provides text and
// icon for each displayed line in Auto-complete window.
//===========================================================================
struct XTP_EDIT_ACDATA
{
int m_nIcon; // The icon ID.
CString m_strText; // The item text.
//-----------------------------------------------------------------------
// Summary:
// Default class constructor.
// Parameters:
// nIcon - The icon ID.
// strText - The item text.
//-----------------------------------------------------------------------
XTP_EDIT_ACDATA(int nIcon, CString strText)
{
m_nIcon = nIcon;
m_strText = strText;
}
};
//===========================================================================
// Summary:
// CXTPSyntaxEditACDataArray type defines a custom array to store AutoComplete items
// displayed data.
// See Also:
// PXTP_EDIT_ACDATA
//===========================================================================
typedef CArray<XTP_EDIT_ACDATA*, XTP_EDIT_ACDATA*> CXTPSyntaxEditACDataArray;
//===========================================================================
// Summary:
// CXTPSyntaxEditACGrid type defines a custom array to store and manage visible
// rectangle arrays that represented lines of data in AutoComplete window.
//===========================================================================
typedef CArray<CRect, CRect> CXTPSyntaxEditACGrid;
//===========================================================================
// Summary:
// This class implements AutoComplete window. It provides facilities
// to display predefined strings of data in the sorted order. Then
// user can navigate over list of strings and choose desired text to
// complete his input. AutoComplete window provides some ways to
// navigate by using vertical scroll bar, up/down keys, mouse.
// If user types alphanumeric keys after AutoComplete window was
// appeared it uses user input as search criteria and tries to find
// text from its predefined strings of data that are like user input.
//===========================================================================
class _XTP_EXT_CLASS CXTPSyntaxEditAutoCompleteWnd : public CWnd
{
//{{AFX_CODEJOCK_PRIVATE
friend class CXTPSyntaxEditCtrl;
//}}AFX_CODEJOCK_PRIVATE
public:
//-----------------------------------------------------------------------
// Summary:
// Default class constructor.
//-----------------------------------------------------------------------
CXTPSyntaxEditAutoCompleteWnd();
//-----------------------------------------------------------------------
// Summary:
// Destroys a CXTPSyntaxEditAutoCompleteWnd object, handles cleanup
// and de-allocation.
//-----------------------------------------------------------------------
virtual ~CXTPSyntaxEditAutoCompleteWnd();
//-----------------------------------------------------------------------
// Summary:
// Creates AutoComplete window and sets predefined properties.
// Parameters:
// pParentWnd: [in] Pointer to the parent window.
// Remarks:
// Before create Auto-complete window you should construct
// CXTPSyntaxEditAutoCompleteWnd object by calling constrictor.
// Returns:
// TRUE if success; FALSE otherwise.
//-----------------------------------------------------------------------
virtual BOOL Create(CWnd* pParentWnd);
//-----------------------------------------------------------------------
// Summary:
// Sets list of data to be displayed in AutoComplete window.
// Parameters:
// parrData: [in] reference to array of data.
// Remarks:
// AutoComplete window displays list of data for user choice.If
// AutoComplete window has already had a list of displayed data it will
// be replaced by new one. Before add to the AutoComplete window new
// data is sorted.
// See Also:
// CXTPSyntaxEditACDataArray
//-----------------------------------------------------------------------
virtual void SetList(CXTPSyntaxEditACDataArray& parrData);
//-----------------------------------------------------------------------
// Summary:
// Sets list of open tags for AutoComplete window.
// Parameters:
// strOpenTags: [in] string with new open tags.
// Remarks:
// Open Tags are treated by AutoComplete window as command to be
// displayed and activated. Each tag may consists of one or more symbols.
// Tags must be separated by "~" sign. If AutoComplete window has
// already had a list of tags it will be replaced by new one.
//-----------------------------------------------------------------------
virtual void SetOpenTags(CString strOpenTags);
//-----------------------------------------------------------------------
// Summary:
// Determines if user input is open tag.
// Parameters:
// strToTest: [in] string to test.
// Remarks:
// Call this function to determine if user enters open tag.
// Function uses incremental search and temporary stores input
// that resembles initial part of open tags that consist of
// number of symbols.
// Returns:
// TRUE if open tag detected; FALSE otherwise.
//-----------------------------------------------------------------------
BOOL IsOpenTag(CString strToTest);
//-----------------------------------------------------------------------
// Summary:
// Sets list of close tags for AutoComplete window.
// Parameters:
// strCloseTags: [in] string with new close tags.
// Remarks:
// Close Tags are treated by AutoComplete window as command to be
// hidden and deactivated. Each tag may consists of one or more symbols.
// Tags must be separated by "~" sign. If AutoComplete window has
// already had a list of tags it will be replaced by new one.
//-----------------------------------------------------------------------
virtual void SetCloseTags(CString strCloseTags);
//-----------------------------------------------------------------------
// Summary:
// Determines if user input is Close tag.
// Parameters:
// strToTest: [in] String to test.
// Remarks:
// Call this function to determine if user enters close tag.
// Function uses incremental search and temporary stores input that
// resembles initial part of close tags that consist of number of
// symbols.
// Returns:
// TRUE if close tag detected; FALSE otherwise.
//-----------------------------------------------------------------------
BOOL IsCloseTag(CString strToTest);
//-----------------------------------------------------------------------
// Summary:
// Shows AutoComplete window.
// Parameters:
// pt: [in] Point where left upper corner of AutoComplete
// window should appears.
// strSearch: [in] Search string.
// Remarks:
// Shows AutoComplete window at specified point and try to filter
// dataset by previously typed piece of word and highlighted line
// according search string.
//-----------------------------------------------------------------------
virtual void Show(CPoint pt, CString strSearch = _T(""));
//-----------------------------------------------------------------------
// Summary:
// Hides AutoComplete window.
//-----------------------------------------------------------------------
virtual void Hide();
//-----------------------------------------------------------------------
// Summary:
// Returns active flag for AutoComplete window.
// Returns:
// TRUE if window is visible and active; FALSE otherwise.
//-----------------------------------------------------------------------
BOOL IsActive() const;
//-----------------------------------------------------------------------
// Summary:
// Updates display settings from system settings.
//-----------------------------------------------------------------------
virtual void RefreshMetrics();
// Summary:
// This member function registers the window class if it has not
// already been registered.
// Parameters:
// hInstance - Instance of resource where control is located
// Returns:
// A boolean value that specifies if the window is successfully
// registered.<p/>
// TRUE if the window class is successfully registered.<p/>
// Otherwise FALSE.
// -----------------------------------------------------------------
virtual BOOL RegisterWindowClass(HINSTANCE hInstance = NULL);
//-----------------------------------------------------------------------
// Summary:
// This member function is used to obtain width of the auto-complete window.
// Returns:
// A window width in pixels.
//-----------------------------------------------------------------------
int GetWndWidth() const;
//-----------------------------------------------------------------------
// Summary:
// This member function is used to set width of the auto-complete window.
// Parameters:
// nWidth - A window width in pixels.
//-----------------------------------------------------------------------
void SetWndWidth(int nWidth);
protected:
//-----------------------------------------------------------------------
// Summary:
// Returns text line where user click mouse.
// Parameters:
// ptTest: [in] tested point.
// Returns:
// Integer identifier of affected text line.
//-----------------------------------------------------------------------
int HitTest(CPoint ptTest) const;
//{{AFX_CODEJOCK_PRIVATE
// message handlers
void OnLButtonDown(UINT nFlags, CPoint point);
void OnRButtonDown(UINT nFlags, CPoint point);
void OnLButtonDblClk( UINT nFlags, CPoint point );
BOOL OnMouseWheel(UINT nFlags, short zDelta, CPoint pt);
void OnKeyDown(UINT nChar, UINT nRepCnt, UINT nFlags);
void OnChar( UINT nChar, UINT nRepCnt, UINT nFlags );
void OnVScroll(UINT nSBCode, UINT nPos, CScrollBar* pScrollBar);
void OnPaint();
BOOL OnSetCursor(CWnd* pWnd, UINT nHitTest, UINT message);
DECLARE_MESSAGE_MAP()
//}}AFX_CODEJOCK_PRIVATE
protected:
CString m_strSearch; // Temporary stores chain of chars from user input to perform
// incremental search
CString m_strCloseTags; // Stores set of closed tags divided by ~
// input closed tags lead to close AutoComplete window
CString m_strTmpCloseTag;// Temporary stores chain of chars from user input to
// recognize close tags
CString m_strOpenTags; // Stores open tags
CString m_strTmpOpenTag;// Temporary stores chain of chars from user input to
// recognize Open tags
CXTPSyntaxEditCtrl* m_pParentWnd; // Pointer to the parent window
CFont m_fontBasic; // Font to display text
COLORREF m_clrWindow; // Standard window color
COLORREF m_clrHighLight; // Standard window highlight color
COLORREF m_clrWindowText; // Standard windows text color
COLORREF m_clrHighLightText;// Standard windows highlight text color
CXTPSyntaxEditACDataArray m_arrACData;// Stores list of choices (line of text and image)
CXTPSyntaxEditACDataArray m_arrACDataFiltered; // Stores filtered list of choices (line of text and image)
CXTPSyntaxEditACGrid m_arrGrid; // Stores list of rectangle areas where were
// displayed text\image strings from m_arrACData
int m_nBordersHeight; // Stores summary thickness of vertical window borders
int m_nLineHeight; // Stores height of line
int m_nLines; // Number of visible lines
int m_nWndHeight; // Height of window
int m_nWndWidth; // Width of window
int m_nHighLightLine; // Current highlight line identifier
int m_nFirstDisplayedStr; // Current first visible (upper) line
BOOL m_bFixedBottom; // Store autocomplete window position: above or below at the cursor.
BOOL m_bActive; // Active flag
BOOL m_bFilteredMode; // Flag to identify is current mode (filtered/full);
BOOL m_bHighLight; // This flag determines if selected string is highlighted.
int m_nStartReplacePos; // Position of first char in the Edit Control which will be replaced
// by the chosen text
int m_nEndReplacePos; // Position of last char in the Edit Control which will be replaced
// by the chosen text
CImageList m_ilACGlyphs; // Images for AutoComplete list
CString m_strDelims; // stores char list that are tag delimiters
private:
BOOL AdjusLayout(int nHeightMax = 0);
void _AdjustWndRect(CRect& rrcWndRect);
void RemoveAll();
BOOL ScrollTo(int nNewLine);
void UpdateFilteredList();
void ReturnSelected(BOOL bAdjust = FALSE);
void Sort();
static int _cdecl CompareACData(const XTP_EDIT_ACDATA** p1, const XTP_EDIT_ACDATA** p2);
int Search(CString strSearch = _T(""));
int Filter(CString strSearch = _T(""));
static int _cdecl CompareACDataToSearch(const XTP_EDIT_ACDATA** ppKey, const XTP_EDIT_ACDATA** ppElem);
};
/////////////////////////////////////////////////////////////////////////////
AFX_INLINE int CXTPSyntaxEditAutoCompleteWnd::GetWndWidth() const {
return m_nWndWidth;
}
AFX_INLINE BOOL CXTPSyntaxEditAutoCompleteWnd::IsActive() const {
return m_bActive;
}
#endif // !defined(__XTPSYNTAXEDITAUTOCOMPLETEWND_H__)