DragonNest/Third/XTToolkitPro/Source/SyntaxEdit/XTPSyntaxEditPropertiesPage.cpp

2186 lines
55 KiB
C++
Raw Normal View History

2024-12-19 09:48:26 +08:00
// XTPSyntaxEditPropertiesPage.cpp : implementation file
//
// This file is a part of the XTREME TOOLKIT PRO MFC class library.
// (c)1998-2008 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
//
/////////////////////////////////////////////////////////////////////////////
#include "stdafx.h"
#include "Resource.h"
// common includes
#include "Common/XTPNotifyConnection.h"
#include "Common/XTPSmartPtrInternalT.h"
#include "Common/XTPVC80Helpers.h"
#include "Common/XTPVC50Helpers.h"
#include "Common/XTPResourceManager.h"
#include "Common/XTPDrawHelpers.h"
// syntax editor includes
#include "XTPSyntaxEditDefines.h"
#include "XTPSyntaxEditStruct.h"
#include "XTPSyntaxEditLexPtrs.h"
#include "XTPSyntaxEditLexClassSubObjT.h"
#include "XTPSyntaxEditTextIterator.h"
#include "XTPSyntaxEditSectionManager.h"
#include "XTPSyntaxEditLexCfgFileReader.h"
#include "XTPSyntaxEditLexClassSubObjDef.h"
#include "XTPSyntaxEditLexClass.h"
#include "XTPSyntaxEditLexColorFileReader.h"
#include "XTPSyntaxEditBufferManager.h"
#include "XTPSyntaxEditCtrl.h"
#include "XTPSyntaxEditDoc.h"
#include "XTPSyntaxEditView.h"
#include "XTPSyntaxEditPaintManager.h"
#include "XTPSyntaxEditColorSampleText.h"
#include "XTPSyntaxEditColorComboBox.h"
#include "XTPSyntaxEditPropertiesPage.h"
#include "XTPSyntaxEditPropertiesDlg.h"
#ifdef _DEBUG
#undef THIS_FILE
static char BASED_CODE THIS_FILE[] = __FILE__;
#endif
//===========================================================================
// EnumFontFamExProc
//===========================================================================
AFX_STATIC int CALLBACK EnumFontFamExProc(
ENUMLOGFONTEX *lpelfe, // logical-font data
NEWTEXTMETRICEX *lpntme, // physical-font data
DWORD FontType, // type of font
LPARAM lParam) // application-defined data
{
CComboBox* pWndCombo = DYNAMIC_DOWNCAST(CComboBox, (CComboBox*)lParam);
if (::IsWindow(pWndCombo->GetSafeHwnd()))
{
switch (pWndCombo->GetDlgCtrlID())
{
case XTP_IDC_EDIT_COMB_NAMES:
{
//if (lpelfe->elfLogFont.lfPitchAndFamily & FIXED_PITCH)
{
// Make sure the fonts are only added once.
if (pWndCombo->FindStringExact(0, (LPCTSTR)lpelfe->elfFullName) == CB_ERR)
{
// Add to list
pWndCombo->AddString((LPCTSTR)lpelfe->elfLogFont.lfFaceName);
}
}
}
break;
case XTP_IDC_EDIT_COMB_SIZES:
{
if (FontType != TRUETYPE_FONTTYPE)
{
CWindowDC dc(NULL);
CString csSize;
csSize.Format(_T("%i"),::MulDiv(lpntme->ntmTm.tmHeight - lpntme->ntmTm.tmInternalLeading,
72, ::GetDeviceCaps(dc.m_hDC, LOGPIXELSY)));
// Make sure the fonts are only added once.
if (pWndCombo->FindStringExact(0, (LPCTSTR)csSize) == CB_ERR)
{
// Add to list
pWndCombo->AddString((LPCTSTR)csSize);
}
}
}
break;
case XTP_IDC_EDIT_COMB_SCRIPT:
{
if (lpelfe->elfScript[0] != _T('\0'))
{
// Make sure the fonts are only added once.
if (pWndCombo->FindStringExact(0, (LPCTSTR)lpelfe->elfScript) == CB_ERR)
{
// Add to list
int iIndex = pWndCombo->AddString((LPCTSTR)lpelfe->elfScript);
if (iIndex != CB_ERR)
{
pWndCombo->SetItemData(iIndex,
(DWORD)lpelfe->elfLogFont.lfCharSet);
}
}
}
}
break;
}
}
return TRUE;
}
namespace XTPSyntaxEditLexAnalyser
{
extern CString MakeStr(const CStringArray& rArProps, LPCTSTR strSplitter);
extern BOOL PropPathSplit(LPCTSTR pcszPropPath, CStringArray& rArProps);
}
using namespace XTPSyntaxEditLexAnalyser;
//===========================================================================
// CXTPSyntaxEditPropertiesPageEdit property page
//===========================================================================
CXTPSyntaxEditPropertiesPageEdit::CXTPSyntaxEditPropertiesPageEdit(CXTPSyntaxEditView* pEditView/*=NULL*/)
: //CPropertyPage(CXTPSyntaxEditPropertiesPageEdit::IDD),
m_bModified(FALSE)
, m_pEditView(pEditView)
{
ASSERT_VALID(m_pEditView); // must be valid.
m_psp.dwFlags |= PSP_DLGINDIRECT;
m_psp.pResource = XTPResourceManager()->LoadDialogTemplate(IDD);
//{{AFX_DATA_INIT(CXTPSyntaxEditPropertiesPageEdit)
m_bAutoReload = TRUE;
m_bHorzScrollBar = TRUE;
m_bVertScrollBar = TRUE;
m_bSyntaxColor = TRUE;
m_bAutoIndent = TRUE;
m_bSelMargin = TRUE;
m_bLineNumbers = TRUE;
m_bVirtualSpace = TRUE;
m_bCollapsibleNodes = TRUE;
m_nCaretStyle = 0;
m_nTabSize = 4;
m_nTabType = 1;
//}}AFX_DATA_INIT
ReadRegistryValues();
}
CXTPSyntaxEditPropertiesPageEdit::~CXTPSyntaxEditPropertiesPageEdit()
{
}
void CXTPSyntaxEditPropertiesPageEdit::DoDataExchange(CDataExchange* pDX)
{
CPropertyPage::DoDataExchange(pDX);
//{{AFX_DATA_MAP(CXTPSyntaxEditPropertiesPageEdit)
DDX_Check(pDX, XTP_IDC_EDIT_CHK_AUTO_RELOAD, m_bAutoReload);
DDX_Check(pDX, XTP_IDC_EDIT_CHK_HORZ_SCROLLBAR, m_bHorzScrollBar);
DDX_Check(pDX, XTP_IDC_EDIT_CHK_VERT_SCROLLBAR, m_bVertScrollBar);
DDX_Check(pDX, XTP_IDC_EDIT_CHK_SYNTAX_COLOR, m_bSyntaxColor);
DDX_Check(pDX, XTP_IDC_EDIT_CHK_AUTO_INDENT, m_bAutoIndent);
DDX_Check(pDX, XTP_IDC_EDIT_CHK_SELMARGIN, m_bSelMargin);
DDX_Check(pDX, XTP_IDC_EDIT_CHK_LINE_NUMBERS, m_bLineNumbers);
DDX_Check(pDX, XTP_IDC_EDIT_CHK_VIRTUAL_SPACE, m_bVirtualSpace);
DDX_Check(pDX, XTP_IDC_EDIT_CHK_COLLAPSIBLE_NODES, m_bCollapsibleNodes);
DDX_Control(pDX, XTP_IDC_EDIT_RAD_TABS_SPACES, m_btnRadioSpaces);
DDX_Control(pDX, XTP_IDC_EDIT_RAD_TABS_TAB, m_btnRadioTab);
DDX_Control(pDX, XTP_IDC_EDIT_RAD_CARET_THIN, m_btnRadioCaretThin);
DDX_Control(pDX, XTP_IDC_EDIT_RAD_CARET_THICK, m_btnRadioCaretThick);
DDX_Text(pDX, XTP_IDC_EDIT_TABS_SIZE, m_nTabSize);
DDV_MinMaxInt(pDX, m_nTabSize, 1, 64);
//}}AFX_DATA_MAP
}
IMPLEMENT_DYNCREATE(CXTPSyntaxEditPropertiesPageEdit, CPropertyPage)
BEGIN_MESSAGE_MAP(CXTPSyntaxEditPropertiesPageEdit, CPropertyPage)
//{{AFX_MSG_MAP(CXTPSyntaxEditPropertiesPageEdit)
ON_BN_CLICKED(XTP_IDC_EDIT_CHK_AUTO_RELOAD, OnChkAutoReload)
ON_BN_CLICKED(XTP_IDC_EDIT_CHK_HORZ_SCROLLBAR, OnChkHorzScrollBar)
ON_BN_CLICKED(XTP_IDC_EDIT_CHK_VERT_SCROLLBAR, OnChkVertScrollBar)
ON_BN_CLICKED(XTP_IDC_EDIT_CHK_SYNTAX_COLOR, OnChkSyntaxColor)
ON_BN_CLICKED(XTP_IDC_EDIT_CHK_AUTO_INDENT, OnChkAutoIndent)
ON_BN_CLICKED(XTP_IDC_EDIT_CHK_SELMARGIN, OnChkSelMargin)
ON_BN_CLICKED(XTP_IDC_EDIT_CHK_LINE_NUMBERS, OnChkLineNumbers)
ON_BN_CLICKED(XTP_IDC_EDIT_CHK_COLLAPSIBLE_NODES, OnChkLineNumbers)
ON_BN_CLICKED(XTP_IDC_EDIT_CHK_VIRTUAL_SPACE, OnChkVirtualSpace)
ON_BN_CLICKED(XTP_IDC_EDIT_RAD_TABS_SPACES, OnTabsSpaces)
ON_BN_CLICKED(XTP_IDC_EDIT_RAD_TABS_TAB, OnTabsTab)
ON_BN_CLICKED(XTP_IDC_EDIT_RAD_CARET_THIN, OnCaretThin)
ON_BN_CLICKED(XTP_IDC_EDIT_RAD_CARET_THICK, OnCaretThick)
ON_EN_CHANGE(XTP_IDC_EDIT_TABS_SIZE, OnChangeTabsSize)
//}}AFX_MSG_MAP
END_MESSAGE_MAP()
BOOL CXTPSyntaxEditPropertiesPageEdit::ReadRegistryValues()
{
if (!::IsWindow(m_pEditView->GetSafeHwnd()))
return FALSE;
CXTPSyntaxEditDoc* pEditDoc = m_pEditView->GetDocument();
if (pEditDoc)
{
m_bAutoReload = pEditDoc->GetAutoReload();
}
CXTPSyntaxEditCtrl& wndEditCtrl = m_pEditView->GetEditCtrl();
if (::IsWindow(wndEditCtrl.m_hWnd))
{
m_bVertScrollBar = wndEditCtrl.GetVertScrollBar();
m_bHorzScrollBar = wndEditCtrl.GetHorzScrollBar();
m_bSyntaxColor = wndEditCtrl.GetSyntaxColor();
m_bAutoIndent = wndEditCtrl.GetAutoIndent();
m_bSelMargin = wndEditCtrl.GetSelMargin();
m_bLineNumbers = wndEditCtrl.GetLineNumbers();
m_bVirtualSpace = wndEditCtrl.IsEnabledVirtualSpace();
m_bCollapsibleNodes = wndEditCtrl.GetCollapsibleNodes();
m_nCaretStyle = wndEditCtrl.GetWideCaret();
m_nTabSize = wndEditCtrl.GetTabSize();
m_nTabType = wndEditCtrl.GetTabWithSpace() ? 0: 1;
}
return TRUE;
}
BOOL CXTPSyntaxEditPropertiesPageEdit::WriteRegistryValues()
{
if (!::IsWindow(m_pEditView->GetSafeHwnd()))
return FALSE;
CXTPSyntaxEditDoc* pEditDoc = m_pEditView->GetDocument();
if (pEditDoc)
{
pEditDoc->SetAutoReload(m_bAutoReload, TRUE);
}
CXTPSyntaxEditCtrl& wndEditCtrl = m_pEditView->GetEditCtrl();
if (::IsWindow(wndEditCtrl.m_hWnd))
{
wndEditCtrl.SetScrollBars(m_bHorzScrollBar, m_bVertScrollBar, TRUE);
wndEditCtrl.SetSyntaxColor(m_bSyntaxColor, TRUE);
wndEditCtrl.SetAutoIndent(m_bAutoIndent, TRUE);
wndEditCtrl.SetSelMargin(m_bSelMargin, TRUE);
wndEditCtrl.SetLineNumbers(m_bLineNumbers, TRUE);
wndEditCtrl.EnableVirtualSpace(m_bVirtualSpace, TRUE);
wndEditCtrl.SetCollapsibleNodes(m_bCollapsibleNodes, TRUE);
wndEditCtrl.SetWideCaret(m_nCaretStyle, TRUE);
wndEditCtrl.SetTabSize(m_nTabSize, TRUE);
wndEditCtrl.SetTabWithSpace(m_nTabType? FALSE: TRUE, TRUE);
}
wndEditCtrl.RestoreCursor();
return TRUE;
}
void CXTPSyntaxEditPropertiesPageEdit::OnChkAutoReload()
{
UpdateData();
SetModified(TRUE);
}
void CXTPSyntaxEditPropertiesPageEdit::OnChkHorzScrollBar()
{
UpdateData();
SetModified(TRUE);
}
void CXTPSyntaxEditPropertiesPageEdit::OnChkVertScrollBar()
{
UpdateData();
SetModified(TRUE);
}
void CXTPSyntaxEditPropertiesPageEdit::OnChkSyntaxColor()
{
UpdateData();
SetModified(TRUE);
}
void CXTPSyntaxEditPropertiesPageEdit::OnChkAutoIndent()
{
UpdateData();
SetModified(TRUE);
}
void CXTPSyntaxEditPropertiesPageEdit::OnChkSelMargin()
{
UpdateData();
SetModified(TRUE);
}
void CXTPSyntaxEditPropertiesPageEdit::OnChkLineNumbers()
{
UpdateData();
SetModified(TRUE);
}
void CXTPSyntaxEditPropertiesPageEdit::OnChkVirtualSpace()
{
UpdateData();
SetModified(TRUE);
}
void CXTPSyntaxEditPropertiesPageEdit::OnChangeTabsSize()
{
UpdateData();
SetModified(TRUE);
}
void CXTPSyntaxEditPropertiesPageEdit::OnTabsSpaces()
{
m_nTabType = 0;
SetModified(TRUE);
}
void CXTPSyntaxEditPropertiesPageEdit::OnTabsTab()
{
m_nTabType = 1;
SetModified(TRUE);
}
void CXTPSyntaxEditPropertiesPageEdit::OnCaretThin()
{
m_nCaretStyle = 0;
SetModified(TRUE);
}
void CXTPSyntaxEditPropertiesPageEdit::OnCaretThick()
{
m_nCaretStyle = 1;
SetModified(TRUE);
}
BOOL CXTPSyntaxEditPropertiesPageEdit::OnInitDialog()
{
CPropertyPage::OnInitDialog();
m_btnRadioSpaces.SetCheck(m_nTabType == 0);
m_btnRadioTab.SetCheck(m_nTabType == 1);
m_btnRadioCaretThin.SetCheck(m_nCaretStyle == 0);
m_btnRadioCaretThick.SetCheck(m_nCaretStyle == 1);
return TRUE; // return TRUE unless you set the focus to a control
// EXCEPTION: OCX Property Pages should return FALSE
}
BOOL CXTPSyntaxEditPropertiesPageEdit::OnApply()
{
if (!CPropertyPage::OnApply())
return FALSE;
// no changes made or they have already been applied.
if (!m_bModified)
return TRUE;
// update registry settings.
if (!WriteRegistryValues())
return FALSE;
m_bModified = FALSE;
if (m_pEditView && m_pEditView->GetDocument() )
m_pEditView->GetDocument()->UpdateAllViews(NULL, xtpEditHintInitView);
return TRUE;
}
void CXTPSyntaxEditPropertiesPageEdit::SetModified(BOOL bChanged/*=TRUE*/)
{
CPropertyPage::SetModified();
m_bModified = bChanged;
}
//===========================================================================
// CXTPSyntaxEditPropertiesPageFont property page
//===========================================================================
CXTPSyntaxEditPropertiesPageFont::CXTPSyntaxEditPropertiesPageFont(CXTPSyntaxEditView* pEditView/*=NULL*/)
: //CPropertyPage(CXTPSyntaxEditPropertiesPageFont::IDD),
m_bModified(FALSE)
, m_pEditView(pEditView)
, m_uFaceSize(LF_FACESIZE)
{
m_psp.dwFlags |= PSP_DLGINDIRECT;
m_psp.pResource = XTPResourceManager()->LoadDialogTemplate(IDD);
//{{AFX_DATA_INIT(CXTPSyntaxEditPropertiesPageFont)
m_bStrikeOut = FALSE;
m_bUnderline = FALSE;
m_csName = _T("Courier");
m_csStyle = _T("Regular");
m_csSize = _T("10");
//}}AFX_DATA_INIT
m_iCharSet = DEFAULT_CHARSET;
m_crHiliteText = ::GetSysColor(COLOR_HIGHLIGHTTEXT);
m_crHiliteBack = ::GetSysColor(COLOR_HIGHLIGHT);
m_crText = ::GetSysColor(COLOR_WINDOWTEXT);
m_crBack = ::GetSysColor(COLOR_WINDOW);
ReadRegistryValues();
}
CXTPSyntaxEditPropertiesPageFont::~CXTPSyntaxEditPropertiesPageFont()
{
}
void CXTPSyntaxEditPropertiesPageFont::DoDataExchange(CDataExchange* pDX)
{
CPropertyPage::DoDataExchange(pDX);
//{{AFX_DATA_MAP(CXTPSyntaxEditPropertiesPageFont)
DDX_Control(pDX, XTP_IDC_EDIT_COMB_SCRIPT, m_wndComboScript);
DDX_Control(pDX, XTP_IDC_EDIT_COMB_STYLES, m_wndComboStyle);
DDX_Control(pDX, XTP_IDC_EDIT_COMB_SIZES, m_wndComboSize);
DDX_Control(pDX, XTP_IDC_EDIT_COMB_NAMES, m_wndComboName);
/* DDX_Check(pDX, XTP_IDC_EDIT_CHK_STRIKEOUT, m_bStrikeOut);*/
/* DDX_Check(pDX, XTP_IDC_EDIT_CHK_UNDERLINE, m_bUnderline);*/
DDX_Control(pDX, XTP_IDC_EDIT_COMB_TEXT, m_wndComboText);
DDX_Control(pDX, XTP_IDC_EDIT_COMB_BACK, m_wndComboBack);
DDX_Control(pDX, XTP_IDC_EDIT_COMB_TEXTSEL, m_wndComboHiliteText);
DDX_Control(pDX, XTP_IDC_EDIT_COMB_BACKSEL, m_wndComboHiliteBack);
DDX_Control(pDX, XTP_IDC_EDIT_TXT_SAMPLE, m_txtSample);
DDX_Control(pDX, XTP_IDC_EDIT_TXT_SAMPLESEL, m_txtSampleSel);
DDX_CBSyntaxColor(pDX, XTP_IDC_EDIT_COMB_TEXT, m_crText);
DDX_CBSyntaxColor(pDX, XTP_IDC_EDIT_COMB_BACK, m_crBack);
DDX_CBSyntaxColor(pDX, XTP_IDC_EDIT_COMB_TEXTSEL, m_crHiliteText);
DDX_CBSyntaxColor(pDX, XTP_IDC_EDIT_COMB_BACKSEL, m_crHiliteBack);
DDX_Control(pDX, XTP_IDC_EDIT_BTN_CUSTOM_TEXT, m_btnCustomText);
DDX_Control(pDX, XTP_IDC_EDIT_BTN_CUSTOM_BACK, m_btnCustomBack);
DDX_Control(pDX, XTP_IDC_EDIT_BTN_CUSTOM_TEXTSEL, m_btnCustomHiliteText);
DDX_Control(pDX, XTP_IDC_EDIT_BTN_CUSTOM_BACKSEL, m_btnCustomHiliteBack);
DDX_CBString(pDX, XTP_IDC_EDIT_COMB_STYLES, m_csStyle);
DDX_CBString(pDX, XTP_IDC_EDIT_COMB_NAMES, m_csName);
DDX_CBString(pDX, XTP_IDC_EDIT_COMB_SIZES, m_csSize);
DDV_MaxChars(pDX, m_csSize, m_uFaceSize);
//}}AFX_DATA_MAP
}
IMPLEMENT_DYNCREATE(CXTPSyntaxEditPropertiesPageFont, CPropertyPage)
BEGIN_MESSAGE_MAP(CXTPSyntaxEditPropertiesPageFont, CPropertyPage)
//{{AFX_MSG_MAP(CXTPSyntaxEditPropertiesPageFont)
ON_CBN_SELCHANGE(XTP_IDC_EDIT_COMB_NAMES, OnSelChangeComboNames)
ON_CBN_SELCHANGE(XTP_IDC_EDIT_COMB_STYLES, OnSelChangeComboStyles)
ON_CBN_SELCHANGE(XTP_IDC_EDIT_COMB_SIZES, OnSelChangeComboSizes)
/* ON_BN_CLICKED(XTP_IDC_EDIT_CHK_STRIKEOUT, OnChkStrikeOut)*/
/* ON_BN_CLICKED(XTP_IDC_EDIT_CHK_UNDERLINE, OnChkUnderline)*/
ON_BN_CLICKED(XTP_IDC_EDIT_BTN_CUSTOM_TEXT, OnBtnCustomText)
ON_BN_CLICKED(XTP_IDC_EDIT_BTN_CUSTOM_BACK, OnBtnCustomBack)
ON_BN_CLICKED(XTP_IDC_EDIT_BTN_CUSTOM_TEXTSEL, OnBtnCustomHiliteText)
ON_BN_CLICKED(XTP_IDC_EDIT_BTN_CUSTOM_BACKSEL, OnBtnCustomtHiliteBack)
ON_CBN_SELENDOK(XTP_IDC_EDIT_COMB_TEXTSEL, OnSelEndOkHiliteText)
ON_CBN_SELENDOK(XTP_IDC_EDIT_COMB_BACKSEL, OnSelEndOkHiliteBack)
ON_CBN_SELENDOK(XTP_IDC_EDIT_COMB_TEXT, OnSelEndOkText)
ON_CBN_SELENDOK(XTP_IDC_EDIT_COMB_BACK, OnSelEndOkBack)
ON_CBN_SELENDOK(XTP_IDC_EDIT_COMB_SCRIPT, OnSelEndOkScript)
//}}AFX_MSG_MAP
END_MESSAGE_MAP()
BOOL CXTPSyntaxEditPropertiesPageFont::CreateSafeFontIndirect(CFont& editFont, const LOGFONT& lf)
{
if (editFont.GetSafeHandle())
editFont.DeleteObject();
if (!editFont.CreateFontIndirect(&lf))
return FALSE;
return TRUE;
}
BOOL CXTPSyntaxEditPropertiesPageFont::GetSafeLogFont(LOGFONT& lf)
{
if (m_editFont.GetSafeHandle())
{
m_editFont.GetLogFont(&lf);
return TRUE;
}
CFont* pFont = GetPaintManager() ? GetPaintManager()->GetFont() : NULL;
if (pFont && pFont->GetSafeHandle())
{
pFont->GetLogFont(&lf);
return TRUE;
}
return FALSE;
}
BOOL CXTPSyntaxEditPropertiesPageFont::ReadRegistryValues()
{
LOGFONT lf = {0};
if (!GetSafeLogFont(lf))
return FALSE;
if (!CreateSafeFontIndirect(m_editFont, lf))
return FALSE;
if (!GetPaintManager())
return FALSE;
m_crText = GetPaintManager()->GetTextColor();
m_crBack = GetPaintManager()->GetBackColor();
m_crHiliteText = GetPaintManager()->GetHiliteTextColor();
m_crHiliteBack = GetPaintManager()->GetHiliteBackColor();
m_bStrikeOut = (BOOL)lf.lfStrikeOut;
m_bUnderline = (BOOL)lf.lfUnderline;
return TRUE;
}
BOOL CXTPSyntaxEditPropertiesPageFont::WriteRegistryValues()
{
// update paint manager font(paint manager font is set with CXTPSyntaxEditCtrl::CreateFontIndirect).
LOGFONT lf = {0};
if (!GetSafeLogFont(lf))
return FALSE;
if (!m_pEditView || !GetPaintManager())
return FALSE;
m_pEditView->SetFontIndirect(&lf, TRUE);
// commit values to registry.
GetPaintManager()->SetTextColor(m_crText, TRUE);
GetPaintManager()->SetBackColor(m_crBack, TRUE);
GetPaintManager()->SetHiliteTextColor(m_crHiliteText, TRUE);
GetPaintManager()->SetHiliteBackColor(m_crHiliteBack, TRUE);
return TRUE;
}
CXTPSyntaxEditPaintManager* CXTPSyntaxEditPropertiesPageFont::GetPaintManager()
{
if (m_pEditView)
return m_pEditView->GetEditCtrl().GetPaintManager();
return NULL;
}
BOOL CXTPSyntaxEditPropertiesPageFont::OnInitDialog()
{
CPropertyPage::OnInitDialog();
// Initialize combo boxes.
InitFontCombo();
InitStyleCombo();
InitSizeCombo();
InitScriptCombo();
InitColorComboxes();
UpdateSampleFont();
return TRUE; // return TRUE unless you set the focus to a control
// EXCEPTION: OCX Property Pages should return FALSE
}
void CXTPSyntaxEditPropertiesPageFont::InitFontCombo()
{
m_wndComboName.ResetContent();
LOGFONT lfEnum = {0};
lfEnum.lfCharSet = DEFAULT_CHARSET;
lfEnum.lfPitchAndFamily = /*FIXED_PITCH | */ FF_DONTCARE;
lfEnum.lfFaceName[0] = 0;
CWindowDC dc(NULL);
::EnumFontFamiliesEx(dc.m_hDC, &lfEnum,
(FONTENUMPROC)EnumFontFamExProc, (LPARAM)&m_wndComboName, 0 );
if (!m_editFont.GetSafeHandle())
return;
LOGFONT lf = {0};
if (!GetSafeLogFont(lf))
return;
m_csName = lf.lfFaceName;
if (m_wndComboName.SelectString(-1, m_csName) == CB_ERR)
m_wndComboName.SetWindowText(m_csName);
}
void CXTPSyntaxEditPropertiesPageFont::InitStyleCombo()
{
m_wndComboStyle.ResetContent();
CString csBuffer;
XTPResourceManager()->LoadString(&csBuffer, XTP_IDS_EDIT_REGULAR);
m_wndComboStyle.AddString(csBuffer);
XTPResourceManager()->LoadString(&csBuffer, XTP_IDS_EDIT_BOLD);
m_wndComboStyle.AddString(csBuffer);
XTPResourceManager()->LoadString(&csBuffer, XTP_IDS_EDIT_ITALIC);
m_wndComboStyle.AddString(csBuffer);
XTPResourceManager()->LoadString(&csBuffer, XTP_IDS_EDIT_BOLDITALIC);
m_wndComboStyle.AddString(csBuffer);
if (!m_editFont.GetSafeHandle())
return;
LOGFONT lf = {0};
if (!GetSafeLogFont(lf))
return;
if (lf.lfWeight >= FW_BOLD && lf.lfItalic)
{
XTPResourceManager()->LoadString(&m_csStyle, XTP_IDS_EDIT_BOLDITALIC);
}
else if (lf.lfItalic)
{
XTPResourceManager()->LoadString(&m_csStyle, XTP_IDS_EDIT_ITALIC);
}
else if (lf.lfWeight >= FW_BOLD)
{
XTPResourceManager()->LoadString(&m_csStyle, XTP_IDS_EDIT_BOLD);
}
else
{
XTPResourceManager()->LoadString(&m_csStyle, XTP_IDS_EDIT_REGULAR);
}
if (m_wndComboStyle.SelectString(-1, m_csStyle) == CB_ERR)
m_wndComboStyle.SetWindowText(m_csStyle);
}
void CXTPSyntaxEditPropertiesPageFont::InitSizeCombo()
{
m_wndComboSize.ResetContent();
if (!m_editFont.GetSafeHandle())
return;
LOGFONT lf = {0};
if (!GetSafeLogFont(lf))
return;
CWindowDC dc(NULL);
::EnumFontFamiliesEx(dc.m_hDC, &lf,
(FONTENUMPROC)EnumFontFamExProc, (LPARAM)&m_wndComboSize, 0);
if (m_wndComboSize.GetCount() == 0)
{
TCHAR* szSize[] = {
_T("8"), _T("9"), _T("10"), _T("11"),
_T("12"), _T("14"), _T("16"), _T("18"),
_T("20"), _T("22"), _T("24"), _T("26"),
_T("28"), _T("36"), _T("48"), _T("72") };
for (int i = 0; i < (sizeof(szSize)/sizeof(szSize[0])); i++)
{
m_wndComboSize.AddString(szSize[i]);
}
}
m_csSize.Format(_T("%i"),-::MulDiv(lf.lfHeight,
72, ::GetDeviceCaps(dc.m_hDC, LOGPIXELSY)));
if (m_wndComboSize.SelectString(-1, m_csSize) == CB_ERR)
m_wndComboSize.SetWindowText(m_csSize);
}
void CXTPSyntaxEditPropertiesPageFont::InitScriptCombo()
{
m_wndComboScript.ResetContent();
if (!m_editFont.GetSafeHandle())
return;
LOGFONT lf = {0};
if (!GetSafeLogFont(lf))
return;
m_iCharSet = lf.lfCharSet;
lf.lfCharSet = DEFAULT_CHARSET;
lf.lfPitchAndFamily = FIXED_PITCH | FF_DONTCARE;
CWindowDC dc(NULL);
::EnumFontFamiliesEx(dc.m_hDC, &lf,
(FONTENUMPROC)EnumFontFamExProc, (LPARAM)&m_wndComboScript, 0);
int iCount = m_wndComboScript.GetCount();
int i;
for (i = 0; i < iCount; ++i)
{
BYTE lfCharSet = (BYTE)m_wndComboScript.GetItemData(i);
if (lfCharSet == (BYTE)m_iCharSet)
{
m_wndComboScript.SetCurSel(i);
break;
}
}
if (i == iCount)
m_wndComboScript.SetCurSel(0);
}
void CXTPSyntaxEditPropertiesPageFont::InitColorComboxes()
{
ASSERT(GetPaintManager());
if (!GetPaintManager())
return;
m_wndComboText.SetAutoColor(::GetSysColor(COLOR_WINDOWTEXT));
m_crText = GetPaintManager()->GetTextColor();
if (m_wndComboText.SetSelColor(m_crText) == CB_ERR)
{
m_wndComboText.SetUserColor(m_crText);
m_wndComboText.SetSelColor(m_crText);
}
m_wndComboBack.SetAutoColor(::GetSysColor(COLOR_WINDOW));
m_crBack = GetPaintManager()->GetBackColor();
if (m_wndComboBack.SetSelColor(m_crBack) == CB_ERR)
{
m_wndComboBack.SetUserColor(m_crBack);
m_wndComboBack.SetSelColor(m_crBack);
}
m_wndComboHiliteText.SetAutoColor(::GetSysColor(COLOR_HIGHLIGHTTEXT));
m_crHiliteText = GetPaintManager()->GetHiliteTextColor();
if (m_wndComboHiliteText.SetSelColor(m_crHiliteText) == CB_ERR)
{
m_wndComboHiliteText.SetUserColor(m_crHiliteText);
m_wndComboHiliteText.SetSelColor(m_crHiliteText);
}
m_wndComboHiliteBack.SetAutoColor(::GetSysColor(COLOR_HIGHLIGHT));
m_crHiliteBack = GetPaintManager()->GetHiliteBackColor();
if (m_wndComboHiliteBack.SetSelColor(m_crHiliteBack) == CB_ERR)
{
m_wndComboHiliteBack.SetUserColor(m_crHiliteBack);
m_wndComboHiliteBack.SetSelColor(m_crHiliteBack);
}
UpdateSampleColors();
}
void CXTPSyntaxEditPropertiesPageFont::UpdateSampleColors()
{
m_txtSample.SetBackColor(m_crBack);
m_txtSample.SetTextColor(m_crText);
m_txtSampleSel.SetBackColor(m_crHiliteBack);
m_txtSampleSel.SetTextColor(m_crHiliteText);
}
void CXTPSyntaxEditPropertiesPageFont::UpdateSampleFont()
{
if (m_editFont.GetSafeHandle())
{
m_txtSample.SetFont(&m_editFont);
m_txtSampleSel.SetFont(&m_editFont);
}
}
int CXTPSyntaxEditPropertiesPageFont::GetLBText(CComboBox& comboBox, CString& csItemText)
{
UpdateData();
if (!::IsWindow(comboBox.m_hWnd))
return CB_ERR;
int iCurSel = comboBox.GetCurSel();
if (iCurSel == CB_ERR)
return CB_ERR;
comboBox.GetLBText(iCurSel, csItemText);
if (!csItemText.IsEmpty())
{
if (comboBox.SelectString(-1, csItemText) == CB_ERR)
comboBox.SetWindowText(csItemText);
return iCurSel;
}
return CB_ERR;
}
void CXTPSyntaxEditPropertiesPageFont::OnSelChangeComboNames()
{
if (!m_wndComboName.GetListBox().SelChanged())
return;
if (GetLBText(m_wndComboName, m_csName) == CB_ERR)
return;
LOGFONT lf = {0};
if (!GetSafeLogFont(lf))
return;
STRCPY_S(lf.lfFaceName, m_csName.GetLength() + 1, m_csName);
if (CreateSafeFontIndirect(m_editFont, lf))
{
UpdateSampleFont();
InitSizeCombo();
InitScriptCombo();
SetModified(TRUE);
}
}
void CXTPSyntaxEditPropertiesPageFont::OnSelChangeComboStyles()
{
if (!m_wndComboStyle.GetListBox().SelChanged())
return;
if (GetLBText(m_wndComboStyle, m_csStyle) == CB_ERR)
return;
LOGFONT lf = {0};
if (!GetSafeLogFont(lf))
return;
CString csBuffer;
XTPResourceManager()->LoadString(&csBuffer, XTP_IDS_EDIT_ITALIC);
lf.lfItalic = (m_csStyle.Find(csBuffer) == -1)? (BYTE)FALSE: (BYTE)TRUE;
XTPResourceManager()->LoadString(&csBuffer, XTP_IDS_EDIT_BOLD);
lf.lfWeight = (m_csStyle.Find(csBuffer) == -1)? FW_NORMAL: FW_BOLD;
if (CreateSafeFontIndirect(m_editFont, lf))
{
UpdateSampleFont();
SetModified(TRUE);
}
}
void CXTPSyntaxEditPropertiesPageFont::OnSelChangeComboSizes()
{
if (!m_wndComboSize.GetListBox().SelChanged())
return;
if (GetLBText(m_wndComboSize, m_csSize) == CB_ERR)
return;
LOGFONT lf = {0};
if (!GetSafeLogFont(lf))
return;
CWindowDC dc(NULL);
lf.lfHeight = -MulDiv(_ttoi(m_csSize),
::GetDeviceCaps(dc.m_hDC, LOGPIXELSY), 72);
if (CreateSafeFontIndirect(m_editFont, lf))
{
UpdateSampleFont();
SetModified(TRUE);
}
}
void CXTPSyntaxEditPropertiesPageFont::OnChkStrikeOut()
{
UpdateData();
LOGFONT lf = {0};
if (!GetSafeLogFont(lf))
return;
lf.lfStrikeOut = (BYTE)m_bStrikeOut;
if (CreateSafeFontIndirect(m_editFont, lf))
{
UpdateSampleFont();
SetModified(TRUE);
}
}
void CXTPSyntaxEditPropertiesPageFont::OnChkUnderline()
{
UpdateData();
LOGFONT lf = {0};
if (!GetSafeLogFont(lf))
return;
lf.lfUnderline = (BYTE)m_bUnderline;
if (CreateSafeFontIndirect(m_editFont, lf))
{
UpdateSampleFont();
SetModified(TRUE);
}
}
void CXTPSyntaxEditPropertiesPageFont::OnSelEndOkScript()
{
if (!m_wndComboScript.GetListBox().SelChanged())
return;
UpdateData();
int iCurSel = m_wndComboScript.GetCurSel();
if (iCurSel == CB_ERR)
return;
LOGFONT lf = {0};
if (!GetSafeLogFont(lf))
return;
lf.lfCharSet = (BYTE)m_wndComboScript.GetItemData(iCurSel);
m_iCharSet = lf.lfCharSet;
if (CreateSafeFontIndirect(m_editFont, lf))
{
UpdateSampleFont();
SetModified(TRUE);
UpdateData(FALSE);
}
}
void CXTPSyntaxEditPropertiesPageFont::OnSelEndOkHiliteText()
{
UpdateData();
UpdateSampleColors();
SetModified(TRUE);
}
void CXTPSyntaxEditPropertiesPageFont::OnSelEndOkHiliteBack()
{
UpdateData();
UpdateSampleColors();
SetModified(TRUE);
}
void CXTPSyntaxEditPropertiesPageFont::OnSelEndOkText()
{
UpdateData();
UpdateSampleColors();
SetModified(TRUE);
}
void CXTPSyntaxEditPropertiesPageFont::OnSelEndOkBack()
{
UpdateData();
UpdateSampleColors();
SetModified(TRUE);
}
void CXTPSyntaxEditPropertiesPageFont::OnBtnCustomText()
{
if (m_wndComboText.SelectUserColor() != CB_ERR)
{
m_crText = m_wndComboText.GetSelColor();
OnSelEndOkText();
SetModified(TRUE);
}
}
void CXTPSyntaxEditPropertiesPageFont::OnBtnCustomBack()
{
if (m_wndComboBack.SelectUserColor() != CB_ERR)
{
m_crBack = m_wndComboBack.GetSelColor();
OnSelEndOkBack();
SetModified(TRUE);
}
}
void CXTPSyntaxEditPropertiesPageFont::OnBtnCustomHiliteText()
{
if (m_wndComboHiliteText.SelectUserColor() != CB_ERR)
{
m_crHiliteText = m_wndComboHiliteText.GetSelColor();
OnSelEndOkHiliteText();
SetModified(TRUE);
}
}
void CXTPSyntaxEditPropertiesPageFont::OnBtnCustomtHiliteBack()
{
if (m_wndComboHiliteBack.SelectUserColor() != CB_ERR)
{
m_crHiliteBack = m_wndComboHiliteBack.GetSelColor();
OnSelEndOkHiliteBack();
SetModified(TRUE);
}
}
BOOL CXTPSyntaxEditPropertiesPageFont::OnApply()
{
if (!CPropertyPage::OnApply())
return FALSE;
// no changes made or they have already been applied.
if (!m_bModified)
return TRUE;
// update registry settings.
if (!WriteRegistryValues())
return FALSE;
m_bModified = FALSE;
return TRUE;
}
void CXTPSyntaxEditPropertiesPageFont::SetModified(BOOL bChanged/*=TRUE*/)
{
CPropertyPage::SetModified();
m_bModified = bChanged;
}
//===========================================================================
// CXTPSyntaxEditPropertiesPageColor property page
//===========================================================================
CXTPSyntaxEditPropertiesPageColor::CXTPSyntaxEditPropertiesPageColor(CXTPSyntaxEditView* pEditView/*=NULL*/)
: //CPropertyPage(CXTPSyntaxEditPropertiesPageColor::IDD),
m_bModified(FALSE)
, m_pEditView(pEditView)
, m_parLexClassInfo(NULL)
{
m_psp.dwFlags |= PSP_DLGINDIRECT;
m_psp.pResource = XTPResourceManager()->LoadDialogTemplate(IDD);
//{{AFX_DATA_INIT(CXTPSyntaxEditPropertiesPageColor)
m_bBold = FALSE;
m_bItalic = FALSE;
m_bUnderline = FALSE;
//}}AFX_DATA_INIT
SetDefaults();
if (m_pEditView)
{
CXTPSyntaxEditConfigurationManager* ptrConfigMgr =
m_pEditView->GetEditCtrl().GetLexConfigurationManager();
if (ptrConfigMgr)
{
m_ptrConfigMgr.SetPtr(ptrConfigMgr, TRUE);
m_pTextSchemesMgr = &m_ptrConfigMgr->GetTextSchemesManager();
}
}
}
CXTPSyntaxEditPropertiesPageColor::~CXTPSyntaxEditPropertiesPageColor()
{
XTPSyntaxEditLexConfig()->CleanInfoMap(m_mapLexClassInfo);
}
void CXTPSyntaxEditPropertiesPageColor::SetDefaults()
{
// reset color values.
m_crText = ::GetSysColor(COLOR_WINDOWTEXT);
m_crBack = ::GetSysColor(COLOR_WINDOW);
m_crHiliteText = ::GetSysColor(COLOR_HIGHLIGHTTEXT);
m_crHiliteBack = ::GetSysColor(COLOR_HIGHLIGHT);
// reset font attribute flags.
m_bBold = FALSE;
m_bItalic = FALSE;
m_bUnderline = FALSE;
if (::IsWindow(m_hWnd))
{
UpdateData(FALSE);
}
}
void CXTPSyntaxEditPropertiesPageColor::DoDataExchange(CDataExchange* pDX)
{
CPropertyPage::DoDataExchange(pDX);
//{{AFX_DATA_MAP(CXTPSyntaxEditPropertiesPageColor)
DDX_Check(pDX, XTP_IDC_EDIT_CHK_BOLD, m_bBold);
DDX_Check(pDX, XTP_IDC_EDIT_CHK_ITALIC, m_bItalic);
DDX_Check(pDX, XTP_IDC_EDIT_CHK_UNDERLINE, m_bUnderline);
DDX_Control(pDX, XTP_IDC_EDIT_COMB_TEXT, m_wndComboText);
DDX_Control(pDX, XTP_IDC_EDIT_COMB_BACK, m_wndComboBack);
DDX_Control(pDX, XTP_IDC_EDIT_COMB_TEXTSEL, m_wndComboHiliteText);
DDX_Control(pDX, XTP_IDC_EDIT_COMB_BACKSEL, m_wndComboHiliteBack);
DDX_Control(pDX, XTP_IDC_EDIT_TXT_SAMPLE, m_txtSample);
DDX_Control(pDX, XTP_IDC_EDIT_TXT_SAMPLESEL, m_txtSampleSel);
DDX_Control(pDX, XTP_IDC_EDIT_LBOX_SCHEMANAMES, m_lboxName);
DDX_Control(pDX, XTP_IDC_EDIT_LBOX_SCHEMAPROP, m_lboxProp);
DDX_Control(pDX, XTP_IDC_EDIT_CHK_BOLD, m_btnBold);
DDX_Control(pDX, XTP_IDC_EDIT_CHK_ITALIC, m_btnItalic);
DDX_Control(pDX, XTP_IDC_EDIT_CHK_UNDERLINE, m_btnUnderline);
DDX_Control(pDX, XTP_IDC_EDIT_BTN_CUSTOM_TEXT, m_btnCustomText);
DDX_Control(pDX, XTP_IDC_EDIT_BTN_CUSTOM_BACK, m_btnCustomBack);
DDX_Control(pDX, XTP_IDC_EDIT_BTN_CUSTOM_TEXTSEL, m_btnCustomHiliteText);
DDX_Control(pDX, XTP_IDC_EDIT_BTN_CUSTOM_BACKSEL, m_btnCustomHiliteBack);
DDX_Control(pDX, XTP_IDC_EDIT_GRP_SAMPLE, m_gboxSampleText);
DDX_CBSyntaxColor(pDX, XTP_IDC_EDIT_COMB_TEXT, m_crText);
DDX_CBSyntaxColor(pDX, XTP_IDC_EDIT_COMB_BACK, m_crBack);
DDX_CBSyntaxColor(pDX, XTP_IDC_EDIT_COMB_TEXTSEL, m_crHiliteText);
DDX_CBSyntaxColor(pDX, XTP_IDC_EDIT_COMB_BACKSEL, m_crHiliteBack);
//}}AFX_DATA_MAP
}
IMPLEMENT_DYNCREATE(CXTPSyntaxEditPropertiesPageColor, CPropertyPage)
BEGIN_MESSAGE_MAP(CXTPSyntaxEditPropertiesPageColor, CPropertyPage)
//{{AFX_MSG_MAP(CXTPSyntaxEditPropertiesPageColor)
ON_BN_CLICKED(XTP_IDC_EDIT_CHK_BOLD, OnChkBold)
ON_BN_CLICKED(XTP_IDC_EDIT_CHK_ITALIC, OnChkItalic)
ON_BN_CLICKED(XTP_IDC_EDIT_CHK_UNDERLINE, OnChkUnderline)
ON_BN_CLICKED(XTP_IDC_EDIT_BTN_CUSTOM_TEXT, OnBtnCustomText)
ON_BN_CLICKED(XTP_IDC_EDIT_BTN_CUSTOM_BACK, OnBtnCustomBack)
ON_BN_CLICKED(XTP_IDC_EDIT_BTN_CUSTOM_TEXTSEL, OnBtnCustomHiliteText)
ON_BN_CLICKED(XTP_IDC_EDIT_BTN_CUSTOM_BACKSEL, OnBtnCustomtHiliteBack)
ON_CBN_SELENDOK(XTP_IDC_EDIT_COMB_TEXTSEL, OnSelEndOkHiliteText)
ON_CBN_SELENDOK(XTP_IDC_EDIT_COMB_BACKSEL, OnSelEndOkHiliteBack)
ON_CBN_SELENDOK(XTP_IDC_EDIT_COMB_TEXT, OnSelEndOkText)
ON_CBN_SELENDOK(XTP_IDC_EDIT_COMB_BACK, OnSelEndOkBack)
ON_LBN_SELCHANGE(XTP_IDC_EDIT_LBOX_SCHEMANAMES, OnSelChangeSchemaNames)
ON_LBN_SELCHANGE(XTP_IDC_EDIT_LBOX_SCHEMAPROP, OnSelChangeSchemaProp)
ON_LBN_DBLCLK(XTP_IDC_EDIT_LBOX_SCHEMANAMES, OnDblClickSchema)
ON_WM_CONTEXTMENU()
//}}AFX_MSG_MAP
END_MESSAGE_MAP()
void CXTPSyntaxEditPropertiesPageColor::UpdateSampleColors()
{
m_txtSampleSel.SetBackColor(m_crHiliteBack);
m_txtSampleSel.SetTextColor(m_crHiliteText);
m_txtSample.SetBackColor(m_crBack);
m_txtSample.SetTextColor(m_crText);
}
BOOL CXTPSyntaxEditPropertiesPageColor::OnInitDialog()
{
CPropertyPage::OnInitDialog();
// TODO: Add extra initialization here
m_wndComboHiliteBack.SetAutoColor(::GetSysColor(COLOR_HIGHLIGHT));
m_wndComboHiliteText.SetAutoColor(::GetSysColor(COLOR_HIGHLIGHTTEXT));
m_wndComboBack.SetAutoColor(::GetSysColor(COLOR_WINDOW));
m_wndComboText.SetAutoColor(::GetSysColor(COLOR_WINDOWTEXT));
if (m_wndComboBack.SetSelColor(m_crBack) == CB_ERR)
{
m_wndComboBack.SetUserColor(m_crBack);
m_wndComboBack.SetSelColor(m_crBack);
}
if (m_wndComboText.SetSelColor(m_crText) == CB_ERR)
{
m_wndComboText.SetUserColor(m_crText);
m_wndComboText.SetSelColor(m_crText);
}
if (m_wndComboHiliteBack.SetSelColor(m_crHiliteBack) == CB_ERR)
{
m_wndComboHiliteBack.SetUserColor(m_crHiliteBack);
m_wndComboHiliteBack.SetSelColor(m_crHiliteBack);
}
if (m_wndComboHiliteText.SetSelColor(m_crHiliteText) == CB_ERR)
{
m_wndComboHiliteText.SetUserColor(m_crHiliteText);
m_wndComboHiliteText.SetSelColor(m_crHiliteText);
}
XTPSyntaxEditLexConfig()->CopyInfoMap(m_mapLexClassInfo);
// Get all schemes names
CXTPSyntaxEditSchemaFileInfoList& infoList = m_pTextSchemesMgr->GetSchemaList();
for (POSITION pos = infoList.GetHeadPosition(); pos;)
{
XTP_EDIT_SCHEMAFILEINFO& info = infoList.GetNext(pos);
int iIndex = m_lboxName.AddString((info.csDesc.GetLength() > 0)? info.csDesc: info.csName);
if (iIndex != LB_ERR)
{
m_lboxName.SetItemData(iIndex, (DWORD_PTR)&info);
}
}
if (m_lboxName.GetCount() > 0)
{
m_lboxName.SetCurSel(0);
OnSelChangeSchemaNames();
}
return TRUE; // return TRUE unless you set the focus to a control
// EXCEPTION: OCX Property Pages should return FALSE
}
BOOL CXTPSyntaxEditPropertiesPageColor::WriteRegistryValues()
{
if (!::IsWindow(m_pEditView->GetSafeHwnd()))
return FALSE;
for (POSITION pos = m_mapLexClassInfo.GetStartPosition(); pos;)
{
CString csKey; CXTPSyntaxEditLexClassInfoArray* pLexClassArray = NULL;
m_mapLexClassInfo.GetNextAssoc(pos, csKey, (void*&)pLexClassArray);
XTPSyntaxEditLexConfig()->WriteCfgFile(csKey, *pLexClassArray);
}
return TRUE;
}
void CXTPSyntaxEditPropertiesPageColor::OnSelEndOkHiliteText()
{
UpdateData();
UpdateSampleColors();
SetModified(TRUE);
UpdateColorValue(m_wndComboHiliteText, m_crHiliteText, XTPLEX_ATTR_TXT_COLORSELFG);
}
void CXTPSyntaxEditPropertiesPageColor::OnSelEndOkHiliteBack()
{
UpdateData();
UpdateSampleColors();
SetModified(TRUE);
UpdateColorValue(m_wndComboHiliteBack, m_crHiliteBack, XTPLEX_ATTR_TXT_COLORSELBK);
}
void CXTPSyntaxEditPropertiesPageColor::OnSelEndOkText()
{
UpdateData();
UpdateSampleColors();
SetModified(TRUE);
UpdateColorValue(m_wndComboText, m_crText, XTPLEX_ATTR_TXT_COLORFG);
}
void CXTPSyntaxEditPropertiesPageColor::OnSelEndOkBack()
{
UpdateData();
UpdateSampleColors();
SetModified(TRUE);
UpdateColorValue(m_wndComboBack, m_crBack, XTPLEX_ATTR_TXT_COLORBK);
}
void CXTPSyntaxEditPropertiesPageColor::OnChkBold()
{
UpdateData();
UpdateFont();
SetModified(TRUE);
UpdateFontValue(m_bBold, XTPLEX_ATTR_TXT_BOLD);
}
void CXTPSyntaxEditPropertiesPageColor::OnChkItalic()
{
UpdateData();
UpdateFont();
SetModified(TRUE);
UpdateFontValue(m_bItalic, XTPLEX_ATTR_TXT_ITALIC);
}
void CXTPSyntaxEditPropertiesPageColor::OnChkUnderline()
{
UpdateData();
UpdateFont();
SetModified(TRUE);
UpdateFontValue(m_bUnderline, XTPLEX_ATTR_TXT_UNDERLINE);
}
void CXTPSyntaxEditPropertiesPageColor::OnBtnCustomText()
{
if (m_wndComboText.SelectUserColor() != CB_ERR)
{
m_crText = m_wndComboText.GetSelColor();
OnSelEndOkText();
}
}
void CXTPSyntaxEditPropertiesPageColor::OnBtnCustomBack()
{
if (m_wndComboBack.SelectUserColor() != CB_ERR)
{
m_crBack = m_wndComboBack.GetSelColor();
OnSelEndOkBack();
}
}
void CXTPSyntaxEditPropertiesPageColor::OnBtnCustomHiliteText()
{
if (m_wndComboHiliteText.SelectUserColor() != CB_ERR)
{
m_crHiliteText = m_wndComboHiliteText.GetSelColor();
OnSelEndOkHiliteText();
}
}
void CXTPSyntaxEditPropertiesPageColor::OnBtnCustomtHiliteBack()
{
if (m_wndComboHiliteBack.SelectUserColor() != CB_ERR)
{
m_crHiliteBack = m_wndComboHiliteBack.GetSelColor();
OnSelEndOkHiliteBack();
}
}
BOOL CXTPSyntaxEditPropertiesPageColor::OnSetActive()
{
UpdateFont();
return CPropertyPage::OnSetActive();
}
void CXTPSyntaxEditPropertiesPageColor::UpdateFont()
{
CXTPSyntaxEditPropertiesDlg* pParentDlg = DYNAMIC_DOWNCAST(
CXTPSyntaxEditPropertiesDlg, GetParent());
if (!pParentDlg)
return;
CXTPSyntaxEditPropertiesPageFont* pPage2 = DYNAMIC_DOWNCAST(
CXTPSyntaxEditPropertiesPageFont, pParentDlg->GetPage(1));
if (!pPage2)
return;
LOGFONT lf = {0};
if (!pPage2->GetSafeLogFont(lf))
return;
lf.lfStrikeOut = 0;
lf.lfItalic = (BYTE)m_bItalic;
lf.lfUnderline = (BYTE)m_bUnderline;
lf.lfWeight = m_bBold? FW_BOLD: FW_NORMAL;
if (pPage2->CreateSafeFontIndirect(m_editFont, lf))
{
m_txtSample.SetFont(&m_editFont);
m_txtSampleSel.SetFont(&m_editFont);
}
}
BOOL CXTPSyntaxEditPropertiesPageColor::OnApply()
{
if (!CPropertyPage::OnApply())
return FALSE;
// no changes made or they have already been applied.
if (!m_bModified)
return TRUE;
// update registry settings.
if (!WriteRegistryValues())
return FALSE;
m_bModified = FALSE;
return TRUE;
}
void CXTPSyntaxEditPropertiesPageColor::EnableControls()
{
BOOL bEnable = (m_lboxName.GetCurSel() != LB_ERR);
m_lboxProp.EnableWindow(bEnable);
bEnable = (bEnable && m_lboxProp.GetCurSel() != LB_ERR);
m_txtSampleSel.EnableWindow(bEnable);
m_txtSample.EnableWindow(bEnable);
m_gboxSampleText.EnableWindow(bEnable);
m_wndComboHiliteText.EnableWindow(bEnable);
m_wndComboHiliteBack.EnableWindow(bEnable);
m_wndComboText.EnableWindow(bEnable);
m_wndComboBack.EnableWindow(bEnable);
m_btnBold.EnableWindow(bEnable);
m_btnItalic.EnableWindow(bEnable);
m_btnUnderline.EnableWindow(bEnable);
m_btnCustomText.EnableWindow(bEnable);
m_btnCustomBack.EnableWindow(bEnable);
m_btnCustomHiliteText.EnableWindow(bEnable);
m_btnCustomHiliteBack.EnableWindow(bEnable);
}
void CXTPSyntaxEditPropertiesPageColor::OnSelChangeSchemaNames()
{
if (!m_lboxName.SelChanged())
return;
SetDefaults();
int iIndex = m_lboxName.GetCurSel();
if (iIndex != LB_ERR)
{
XTP_EDIT_SCHEMAFILEINFO* pSchemaInfo = (XTP_EDIT_SCHEMAFILEINFO*)m_lboxName.GetItemData(iIndex);
if (pSchemaInfo)
{
InitSchemaClasses(pSchemaInfo);
}
}
}
void CXTPSyntaxEditPropertiesPageColor::OnSelChangeSchemaProp()
{
if (!m_lboxProp.SelChanged())
return;
SetDefaults();
int iIndex = m_lboxProp.GetCurSel();
if (iIndex == LB_ERR)
return;
XTP_EDIT_LEXCLASSINFO* pInfoClass = (XTP_EDIT_LEXCLASSINFO*)m_lboxProp.GetItemData(iIndex);
if (!pInfoClass)
return;
InitClassData(*pInfoClass);
UpdateData(FALSE);
}
BOOL CXTPSyntaxEditPropertiesPageColor::IsTopLevelClass(const XTP_EDIT_LEXCLASSINFO& infoClass)
{
int nPropertiesCount = (int)infoClass.arPropertyDesc.GetSize();
for (int iIndex = 0; iIndex < nPropertiesCount; iIndex++)
{
// Process property name
const XTP_EDIT_LEXPROPINFO& infoProp =
infoClass.arPropertyDesc.GetAt(iIndex);
if (infoProp.arPropName.GetSize() != 2)
continue;
CString csParent = infoProp.arPropName.GetAt(0);
if (csParent.CompareNoCase(_T("parent")) != 0)
continue;
CString csFile = infoProp.arPropName.GetAt(1);
if (csFile.CompareNoCase(_T("file")) != 0)
continue;
return TRUE;
}
return FALSE;
}
CString CXTPSyntaxEditPropertiesPageColor::GetDisplayName(const XTP_EDIT_LEXCLASSINFO& info) const
{
for (int i = 0; i < info.arPropertyDesc.GetSize(); ++i)
{
if (MakeStr(info.arPropertyDesc[i].arPropName, _T(":")) == XTPLEX_ATTR_DISPLAYNAME)
{
CString csDisplayName = GetPropValue(info.arPropertyDesc[i]);
REMOVE_S(csDisplayName, 39);
return csDisplayName;
}
}
return info.csClassName;
}
BOOL CXTPSyntaxEditPropertiesPageColor::InitSchemaClasses(XTP_EDIT_SCHEMAFILEINFO* pSchemaInfo)
{
CString csKey = pSchemaInfo->csValue;
csKey.MakeLower();
m_parLexClassInfo = NULL;
if (!m_mapLexClassInfo.Lookup(csKey, (void*&)m_parLexClassInfo) || !m_parLexClassInfo)
return FALSE;
m_lboxProp.SetRedraw(FALSE);
m_lboxProp.ResetContent();
// For all classes in the current scheme
int iSize = (int)m_parLexClassInfo->GetSize();
for (int i = 0; i < iSize; i++)
{
int iIndex = m_lboxProp.AddString(GetDisplayName((*m_parLexClassInfo)[i]));
if (iIndex != LB_ERR)
m_lboxProp.SetItemData(iIndex, (DWORD_PTR)&(*m_parLexClassInfo)[i]);
}
m_lboxProp.SetCurSel(0);
OnSelChangeSchemaProp();
m_lboxProp.SetRedraw(TRUE);
m_lboxProp.RedrawWindow();
return TRUE;
}
CString CXTPSyntaxEditPropertiesPageColor::GetPropValue(const XTP_EDIT_LEXPROPINFO& infoProp) const
{
CString csValue;
for (int iItem = 0; iItem < infoProp.arPropValue.GetSize(); iItem++)
{
if (iItem > 0)
{
csValue += _T(", ");
}
CString strProp1 = infoProp.arPropValue.GetAt(iItem);
csValue += XTPSyntaxEditLexConfig()->ESToStr(strProp1, TRUE);
}
return csValue;
}
AFX_STATIC int AFX_CDECL AfxStrToInt(LPCTSTR pcszValue)
{
TCHAR* pCh = NULL;
return _tcstol(pcszValue, &pCh, 0);
}
AFX_STATIC DWORD AFX_CDECL AfxStrToRGB(LPCTSTR pcszValue)
{
return XTP_EDIT_RGB_INT2CLR(AfxStrToInt(pcszValue));
}
void CXTPSyntaxEditPropertiesPageColor::InitClassData(const XTP_EDIT_LEXCLASSINFO& infoClass)
{
int iCount = (int)infoClass.arPropertyDesc.GetSize();
for (int iIndex = 0; iIndex < iCount; ++iIndex)
{
const XTP_EDIT_LEXPROPINFO& infoProp = infoClass.arPropertyDesc.GetAt(iIndex);
CString csPropName = MakeStr(infoProp.arPropName, _T(":"));
if (csPropName == XTPLEX_ATTR_TXT_COLORFG)
{
m_crText = AfxStrToRGB(GetPropValue(infoProp));
}
else if (csPropName == XTPLEX_ATTR_TXT_COLORBK)
{
m_crBack = AfxStrToRGB(GetPropValue(infoProp));
}
else if (csPropName == XTPLEX_ATTR_TXT_COLORSELFG)
{
m_crHiliteText = AfxStrToRGB(GetPropValue(infoProp));
}
else if (csPropName == XTPLEX_ATTR_TXT_COLORSELBK)
{
m_crHiliteBack = AfxStrToRGB(GetPropValue(infoProp));
}
else if (csPropName == XTPLEX_ATTR_TXT_BOLD)
{
m_bBold = (BOOL)_ttoi(GetPropValue(infoProp));
}
else if (csPropName == XTPLEX_ATTR_TXT_ITALIC)
{
m_bItalic = (BOOL)_ttoi(GetPropValue(infoProp));
}
else if (csPropName == XTPLEX_ATTR_TXT_UNDERLINE)
{
m_bUnderline = (BOOL)_ttoi(GetPropValue(infoProp));
}
}
UpdateFont();
UpdateSampleColors();
EnableControls();
}
void CXTPSyntaxEditPropertiesPageColor::SetModified(BOOL bChanged/*=TRUE*/)
{
CPropertyPage::SetModified(bChanged);
m_bModified = bChanged;
if (m_parLexClassInfo)
m_parLexClassInfo->m_bModified = bChanged;
}
int CXTPSyntaxEditPropertiesPageColor::PropExists(CXTPSyntaxEditLexPropInfoArray& arrProp, LPCTSTR lpszPropName)
{
int iCount = (int)arrProp.GetSize();
for (int iIndex = 0; iIndex < iCount; ++iIndex)
{
const XTP_EDIT_LEXPROPINFO& infoProp = arrProp.GetAt(iIndex);
CString csPropName = MakeStr(infoProp.arPropName, _T(":"));
if (csPropName.CompareNoCase(lpszPropName) == 0)
{
return iIndex;
}
}
return -1;
}
BOOL CXTPSyntaxEditPropertiesPageColor::UpdateColorValue(CXTPSyntaxEditColorComboBox& combo, COLORREF& color, LPCTSTR lpszPropName)
{
int iSel = m_lboxProp.GetCurSel();
XTP_EDIT_LEXCLASSINFO* pInfoClass = (XTP_EDIT_LEXCLASSINFO*)m_lboxProp.GetItemData(iSel);
if (!pInfoClass)
return FALSE;
int iIndex = PropExists(pInfoClass->arPropertyDesc, lpszPropName);
// automatic color selected, remove from array.
if (combo.GetAutoColor() == color)
{
if (iIndex != -1)
{
pInfoClass->arPropertyDesc.RemoveAt(iIndex);
return TRUE;
}
}
else
{
CString csColor;
csColor.Format(_T("0x%06X"), XTP_EDIT_RGB_INT2CLR(color));
if (iIndex == -1)
{
XTP_EDIT_LEXPROPINFO infoProp;
infoProp.arPropValue.Add(csColor);
PropPathSplit(lpszPropName, infoProp.arPropName);
pInfoClass->arPropertyDesc.Add(infoProp);
}
else
{
XTP_EDIT_LEXPROPINFO& infoProp = pInfoClass->arPropertyDesc[iIndex];
infoProp.arPropValue.RemoveAll();
infoProp.arPropValue.Add(csColor);
}
return TRUE;
}
return FALSE;
}
BOOL CXTPSyntaxEditPropertiesPageColor::UpdateFontValue(BOOL& bValue, LPCTSTR lpszPropName)
{
CString csValue(_T("1"));
int iSel = m_lboxProp.GetCurSel();
XTP_EDIT_LEXCLASSINFO* pInfoClass = (XTP_EDIT_LEXCLASSINFO*)m_lboxProp.GetItemData(iSel);
if (!pInfoClass)
return FALSE;
int iIndex = PropExists(pInfoClass->arPropertyDesc, lpszPropName);
if (iIndex != -1)
{
pInfoClass->arPropertyDesc.RemoveAt(iIndex);
}
if (bValue == TRUE)
{
XTP_EDIT_LEXPROPINFO infoProp;
PropPathSplit(lpszPropName, infoProp.arPropName);
infoProp.arPropValue.Add(csValue);
pInfoClass->arPropertyDesc.Add(infoProp);
return TRUE;
}
return FALSE;
}
void CXTPSyntaxEditPropertiesPageColor::OnDblClickSchema()
{
int iIndex = m_lboxName.GetCurSel();
if (iIndex == LB_ERR)
return;
XTP_EDIT_SCHEMAFILEINFO* pSchemaInfo = (XTP_EDIT_SCHEMAFILEINFO*)m_lboxName.GetItemData(iIndex);
if (pSchemaInfo == NULL)
return;
if (!FILEEXISTS_S(pSchemaInfo->csValue))
return;
TCHAR szDrive[_MAX_DRIVE], szDir[_MAX_DIR], szFileName[_MAX_FNAME], szEx[_MAX_EXT];
SPLITPATH_S(pSchemaInfo->csValue, szDrive, szDir, szFileName, szEx);
CString csBuffer;
XTPResourceManager()->LoadString(
&csBuffer, XTP_IDS_EDIT_OPENSCHEMAMSG);
CString csMessage;
csMessage.Format(csBuffer, szFileName, szEx);
if (AfxMessageBox(csMessage, MB_ICONQUESTION | MB_YESNO) == IDYES)
{
// close the options dialog.
CPropertySheet* pWndParent = DYNAMIC_DOWNCAST(CPropertySheet, GetParent());
if (pWndParent)
pWndParent->EndDialog(IDCANCEL);
// open the document.
CWinApp* pWinApp = AfxGetApp();
if (pWinApp)
pWinApp->OpenDocumentFile(pSchemaInfo->csValue);
}
}
void CXTPSyntaxEditPropertiesPageColor::OnContextMenu(CWnd* pWnd, CPoint point)
{
UNREFERENCED_PARAMETER(pWnd);
int iItem = m_lboxName.HitTest(point);
if (iItem != LB_ERR)
{
m_lboxName.SetCurSel(iItem);
OnSelChangeSchemaNames();
CString csBuffer;
XTPResourceManager()->LoadString(
&csBuffer, XTP_IDS_EDIT_OPENSCHEMACMD);
CMenu menu;
menu.CreatePopupMenu();
menu.AppendMenu(MF_STRING, ID_FILE_OPEN, csBuffer);
UINT nFlags = TPM_LEFTALIGN|TPM_RIGHTBUTTON|TPM_NONOTIFY|TPM_RETURNCMD;
if (menu.TrackPopupMenu(nFlags, point.x, point.y, this) == ID_FILE_OPEN)
{
OnDblClickSchema();
}
}
}
//===========================================================================
// CXTPSyntaxEditTipWnd
//===========================================================================
CXTPSyntaxEditTipWnd::CXTPSyntaxEditTipWnd()
: m_pListBox(NULL)
, m_iIndex(LB_ERR)
, m_uIDEvent1(1001)
, m_uIDEvent2(1002)
{
RegisterWindowClass();
}
CXTPSyntaxEditTipWnd::~CXTPSyntaxEditTipWnd()
{
DestroyWindow();
}
BEGIN_MESSAGE_MAP(CXTPSyntaxEditTipWnd, CWnd)
//{{AFX_MSG_MAP(CXTPSyntaxEditTipWnd)
ON_WM_PAINT()
ON_WM_TIMER()
ON_WM_NCHITTEST_EX()
ON_WM_NCPAINT()
//}}AFX_MSG_MAP
END_MESSAGE_MAP()
//---------------------------------------------------------------------------
// CXTPSyntaxEditTipWnd diagnostics
//---------------------------------------------------------------------------
#ifdef _DEBUG
void CXTPSyntaxEditTipWnd::AssertValid() const
{
CWnd::AssertValid();
ASSERT(::IsWindow(m_hWnd));
ASSERT_VALID(m_pListBox);
}
void CXTPSyntaxEditTipWnd::Dump(CDumpContext& dc) const
{
CWnd::Dump(dc);
}
#endif //_DEBUG
//---------------------------------------------------------------------------
// CXTPSyntaxEditTipWnd registration
//---------------------------------------------------------------------------
BOOL CXTPSyntaxEditTipWnd::RegisterWindowClass(HINSTANCE hInstance /*= NULL*/)
{
WNDCLASS wndcls;
if (hInstance == NULL) hInstance = AfxGetInstanceHandle();
if (!(::GetClassInfo(hInstance, XTP_EDIT_CLASSNAME_LBOXTIP, &wndcls)))
{
// otherwise we need to register a new class
wndcls.style = CS_SAVEBITS | CS_HREDRAW | CS_VREDRAW;
wndcls.lpfnWndProc = ::DefWindowProc;
wndcls.cbClsExtra = wndcls.cbWndExtra = 0;
wndcls.hInstance = hInstance;
wndcls.hIcon = NULL;
wndcls.hCursor = ::LoadCursor(0, IDC_ARROW);
wndcls.hbrBackground = (HBRUSH)(COLOR_INFOBK + 1);
wndcls.lpszMenuName = NULL;
wndcls.lpszClassName = XTP_EDIT_CLASSNAME_LBOXTIP;
if (!AfxRegisterClass(&wndcls))
{
AfxThrowResourceException();
return FALSE;
}
}
return TRUE;
}
//---------------------------------------------------------------------------
// CXTPSyntaxEditTipWnd paint routines
//---------------------------------------------------------------------------
BOOL CXTPSyntaxEditTipWnd::OwnerDrawTip(CDC* pDC, CRect rClient)
{
ASSERT_VALID(this);
HWND hWndLBox = m_pListBox->GetSafeHwnd();
if (!::IsWindow(hWndLBox))
return FALSE;
DRAWITEMSTRUCT dis;
::ZeroMemory(&dis, sizeof(DRAWITEMSTRUCT));
dis.CtlType = ODT_LISTBOX;
dis.CtlID = (UINT)m_pListBox->GetDlgCtrlID();
dis.itemID = (UINT)m_iIndex;
dis.itemAction = ODA_DRAWENTIRE;
dis.hwndItem = hWndLBox;
dis.hDC = pDC->GetSafeHdc();
dis.rcItem = rClient;
dis.itemData = m_pListBox->GetItemData(m_iIndex);
if (m_pListBox->GetSel(m_iIndex) > 0)
dis.itemState |= ODS_SELECTED;
if (m_pListBox->GetCaretIndex() == m_iIndex)
dis.itemState |= ODS_FOCUS;
m_pListBox->DrawItem(&dis);
return TRUE;
}
BOOL CXTPSyntaxEditTipWnd::DrawTip(CDC* pDC, CRect rClient)
{
ASSERT_VALID(this);
CString csItemText;
m_pListBox->GetText(m_iIndex, csItemText);
CXTPFontDC fontDC(pDC, m_pListBox->GetFont(), GetTextColor());
pDC->SetBkColor(GetBackColor());
pDC->FillSolidRect(rClient, pDC->GetBkColor());
pDC->SetBkMode(TRANSPARENT);
pDC->DrawText(csItemText, rClient,
DT_VCENTER | DT_CENTER |DT_SINGLELINE | DT_NOPREFIX | DT_EXPANDTABS);
return TRUE;
}
COLORREF CXTPSyntaxEditTipWnd::GetTextColor() const
{
ASSERT_VALID(this);
return ::GetSysColor((m_pListBox->GetSel(m_iIndex) > 0)?
COLOR_HIGHLIGHTTEXT: COLOR_INFOTEXT);
}
COLORREF CXTPSyntaxEditTipWnd::GetBackColor() const
{
ASSERT_VALID(this);
return ::GetSysColor((m_pListBox->GetSel(m_iIndex) > 0)?
COLOR_HIGHLIGHT: COLOR_INFOBK);
}
void CXTPSyntaxEditTipWnd::OnPaint()
{
CPaintDC dc(this); // device context for painting
CXTPClientRect rClient(this);
if (IsOwnerDrawn())
OwnerDrawTip(&dc, rClient);
else
DrawTip(&dc, rClient);
}
void CXTPSyntaxEditTipWnd::OnNcPaint()
{
CXTPWindowRect rc(this);
rc.OffsetRect(-rc.TopLeft());
CWindowDC dc(this);
dc.SetBkColor(GetBackColor());
dc.SetTextColor(GetTextColor());
dc.FillSolidRect(&rc, dc.GetBkColor());
dc.DrawFocusRect(&rc);
}
//---------------------------------------------------------------------------
// CXTPSyntaxEditTipWnd message handlers
//---------------------------------------------------------------------------
void CXTPSyntaxEditTipWnd::OnTimer(UINT_PTR nIDEvent)
{
ASSERT_VALID(this);
if (nIDEvent == m_uIDEvent1)
{
HideTip();
}
if (nIDEvent == m_uIDEvent2)
{
CPoint point;
::GetCursorPos(&point);
ScreenToClient(&point);
BOOL bOutside = FALSE;
m_pListBox->ItemFromPoint(point, bOutside);
if (bOutside)
{
HideTip();
}
}
CWnd::OnTimer(nIDEvent);
}
LRESULT CXTPSyntaxEditTipWnd::OnNcHitTest(CPoint point)
{
UNREFERENCED_PARAMETER(point);
return (LRESULT)HTTRANSPARENT;
}
BOOL CXTPSyntaxEditTipWnd::Create(CListBox* pListBox)
{
ASSERT_VALID(pListBox);
m_pListBox = pListBox;
if (!::IsWindow(m_pListBox->GetSafeHwnd()))
return FALSE;
// Already created?
if (::IsWindow(m_hWnd))
return TRUE;
if (!CWnd::CreateEx(WS_EX_TOOLWINDOW, XTP_EDIT_CLASSNAME_LBOXTIP, NULL,
WS_POPUP | WS_BORDER | WS_CLIPSIBLINGS, CXTPEmptyRect(), NULL, 0))
{
TRACE0("Failed to create tooltip window.\n");
return FALSE;
}
return TRUE;
}
BOOL CXTPSyntaxEditTipWnd::IsOwnerDrawn()
{
ASSERT_VALID(this);
HWND hWndLBox = m_pListBox->GetSafeHwnd();
if (::IsWindow(hWndLBox))
{
return ((::GetWindowLong(hWndLBox, GWL_STYLE) &
(LBS_OWNERDRAWFIXED|LBS_OWNERDRAWVARIABLE)) != 0);
}
return FALSE;
}
BOOL CXTPSyntaxEditTipWnd::ShowTip(int iIndex)
{
ASSERT_VALID(this);
if ((iIndex < 0) || (iIndex >= m_pListBox->GetCount()))
return HideTip();
CPoint ptCursor;
::GetCursorPos(&ptCursor);
if (m_iIndex == iIndex)
{
if (ptCursor == m_ptCursor)
{
RedrawWindow(NULL, NULL, RDW_FRAME | RDW_INVALIDATE | RDW_UPDATENOW);
return TRUE;
}
}
m_ptCursor = ptCursor;
// stop existing timer.
KillTipTimer();
CRect rItem;
if (CalcItemRect(iIndex, rItem))
{
if ((m_rWindow == rItem) || m_rWindow.IsRectEmpty())
return HideTip();
m_rWindow.InflateRect(0,2);
if (m_iIndex != iIndex)
{
m_iIndex = iIndex;
RedrawWindow(NULL, NULL, RDW_FRAME | RDW_INVALIDATE | RDW_UPDATENOW);
}
ShowWindow(SW_SHOWNA);
MoveWindow(&m_rWindow);
// set timer.
SetTipTimer();
return TRUE;
}
return FALSE;
}
BOOL CXTPSyntaxEditTipWnd::HideTip()
{
if (::IsWindowVisible(m_hWnd))
{
// stop existing timer.
KillTipTimer();
ShowWindow(SW_HIDE);
return TRUE;
}
return FALSE;
}
BOOL CXTPSyntaxEditTipWnd::CalcItemRect(int iItem, CRect& rItem)
{
ASSERT_VALID(this);
if (m_pListBox->GetItemRect(iItem, &rItem) == LB_ERR)
return FALSE;
if (IsOwnerDrawn())
return FALSE;
CString csItem;
m_pListBox->GetText(iItem, csItem);
m_pListBox->ClientToScreen(rItem);
if (csItem.IsEmpty())
return FALSE;
CWindowDC dc(NULL);
CXTPFontDC fontDC(&dc, m_pListBox->GetFont());
int iAdjust = dc.GetTextExtent(csItem).cx + (::GetSystemMetrics(SM_CXEDGE)*2);
m_rWindow.CopyRect(rItem);
m_rWindow.right = max(rItem.right, rItem.left + iAdjust);
return TRUE;
}
void CXTPSyntaxEditTipWnd::SetTipTimer()
{
SetTimer(m_uIDEvent1, 5000, NULL); // 5 seconds.
SetTimer(m_uIDEvent2, 100, NULL); // 10th of a second.
}
void CXTPSyntaxEditTipWnd::KillTipTimer()
{
// stop existing timers.
KillTimer(m_uIDEvent1);
KillTimer(m_uIDEvent2);
}
//===========================================================================
// CXTPSyntaxEditTipListBox
//===========================================================================
CXTPSyntaxEditTipListBox::CXTPSyntaxEditTipListBox()
{
m_dwIdx = (DWORD)MAKELONG(-1,-2);
}
int CXTPSyntaxEditTipListBox::HitTest(LPPOINT pPoint /*= NULL*/) const
{
CPoint point;
if (pPoint == NULL)
{
::GetCursorPos(&point);
ScreenToClient(&point);
pPoint = &point;
}
BOOL bOutside;
int iIndex = (int)ItemFromPoint(*pPoint, bOutside);
if (bOutside)
return LB_ERR;
return iIndex;
}
int CXTPSyntaxEditTipListBox::HitTest(CPoint point, BOOL bIsClient /*= FALSE*/) const
{
if (!bIsClient)
ScreenToClient(&point);
return HitTest(&point);
}
int CXTPSyntaxEditTipListBox::ShowTip(CPoint point, BOOL bIsClient /*= FALSE*/)
{
if (!bIsClient)
ScreenToClient(&point);
if (!::IsWindow(m_wndInfoTip.m_hWnd))
m_wndInfoTip.Create(this);
int iIndex = HitTest(&point);
if (iIndex != LB_ERR)
{
m_wndInfoTip.ShowTip(iIndex);
}
return iIndex;
}
BOOL CXTPSyntaxEditTipListBox::SelChanged() const
{
return (LOWORD(m_dwIdx) != HIWORD(m_dwIdx));
}
BOOL CXTPSyntaxEditTipListBox::PreTranslateMessage(MSG* pMsg)
{
UINT uMessage = pMsg->message;
switch (uMessage)
{
case WM_MOUSEMOVE:
ShowTip(pMsg->pt);
break;
case WM_LBUTTONDOWN:
m_dwIdx = (DWORD)MAKELONG(GetCurSel(), HIWORD(m_dwIdx));
ShowTip(pMsg->pt);
break;
case WM_LBUTTONUP:
m_dwIdx = (DWORD)MAKELONG(LOWORD(m_dwIdx), GetCurSel());
break;
case WM_KEYDOWN:
case WM_MOUSEWHEEL:
m_wndInfoTip.HideTip();
break;
}
return CListBox::PreTranslateMessage(pMsg);
}
//===========================================================================
// CXTPSyntaxEditTipComboBox
//===========================================================================
BEGIN_MESSAGE_MAP(CXTPSyntaxEditTipComboBox, CComboBox)
//{{AFX_MSG_MAP(CXTPSyntaxEditTipComboBox)
ON_WM_CTLCOLOR()
ON_WM_DESTROY()
//}}AFX_MSG_MAP
END_MESSAGE_MAP()
HBRUSH CXTPSyntaxEditTipComboBox::OnCtlColor(CDC* pDC, CWnd* pWnd, UINT nCtlColor)
{
if (nCtlColor == CTLCOLOR_LISTBOX)
{
if (m_wndListBox.GetSafeHwnd() == NULL)
m_wndListBox.SubclassWindow(pWnd->GetSafeHwnd());
}
HBRUSH hbr = CComboBox::OnCtlColor(pDC, pWnd, nCtlColor);
return hbr;
}
void CXTPSyntaxEditTipComboBox::OnDestroy()
{
if (m_wndListBox.GetSafeHwnd() != NULL)
m_wndListBox.UnsubclassWindow();
CComboBox::OnDestroy();
}