📄 symbolpropertiesgeneralpage.cpp
字号:
ASSERT(hIcon != NULL);
m_ctrlIcon.SetIcon(hIcon);
return true;
}
return false;
}
void CSymbolPropertiesGeneralPage::DDX_SymbolName(CDataExchange* pDX,
UINT uIDC,
CString& rsSymbolName)
{
if (pDX->m_bSaveAndValidate)
{
CString sNewSymbolName;
::DDX_Text(pDX, uIDC, sNewSymbolName);
// Remove whitespace before validating
sNewSymbolName.TrimLeft();
sNewSymbolName.TrimRight();
// Now work out whether it's valid
if (CResourceSymbol::IsValidName(sNewSymbolName) )
{
rsSymbolName = sNewSymbolName;
}
else
{
// Nope - alert the user
CNGMessageBox dlg;
dlg.FormatMsgEx(MAKEINTRESOURCE(IDP_SYM_NAME_INVALID),
_T("RTF"),
sNewSymbolName);
dlg.SetRtf();
dlg.SetStandardIcon(IDI_ERROR);
dlg.AddButton(IDOK, true, true, _T("OK") );
dlg.DoModal();
pDX->Fail();
}
}
else
{
::DDX_Text(pDX, uIDC, rsSymbolName);
}
}
void CSymbolPropertiesGeneralPage::DDV_SymbolName(CDataExchange* pDX,
CString& rsSymbolName)
{
if (pDX->m_bSaveAndValidate)
{
if ( (m_pSymbol != NULL) && !IsNameUnique(m_pSymbol, rsSymbolName, true) )
{
CNGMessageBox dlg;
dlg.SetMsgEx( MAKEINTRESOURCE(IDP_SYM_NAME_WARNING), _T("RTF") );
dlg.SetRtf();
dlg.SetStandardIcon(IDI_ERROR);
dlg.AddButton(IDOK, true, true, _T("OK") );
dlg.DoModal();
pDX->Fail();
}
}
}
bool CSymbolPropertiesGeneralPage::IsNameUnique(CResourceSymbol* pSymbol,
const CString& sName,
bool bCheckSameFileOnly) const
{
bool bUnique = true;
if ( (m_pSymbols != NULL) && (pSymbol != NULL) )
{
CResourceSymbolList listSymbols;
m_pSymbols->GetSymbols(sName, listSymbols);
POSITION pos = listSymbols.GetHeadPosition();
while (pos != NULL)
{
CResourceSymbol* pNextSymbol = listSymbols.GetNext(pos);
if (pNextSymbol != NULL)
{
if (pNextSymbol != pSymbol)
{
if (bCheckSameFileOnly)
{
if (AreSymbolsInSameFile(pNextSymbol, pSymbol) )
{
bUnique = false;
}
}
else
{
bUnique = false;
break;
}
}
}
}
}
return bUnique;
}
bool CSymbolPropertiesGeneralPage::IsValueUnique(CResourceSymbol* pSymbol,
UINT uValue,
bool bCheckSameFileOnly) const
{
bool bUnique = true;
if ( (NULL != m_pSymbols) && (NULL != pSymbol) )
{
CResourceSymbolList listSymbols;
m_pSymbols->GetSymbols(uValue, listSymbols);
POSITION pos = listSymbols.GetHeadPosition();
while (pos != NULL)
{
CResourceSymbol* pNextSymbol = listSymbols.GetNext(pos);
if (pNextSymbol != NULL)
{
if (pNextSymbol != pSymbol)
{
if (bCheckSameFileOnly)
{
if (AreSymbolsInSameFile(pNextSymbol, pSymbol) )
{
bUnique = false;
}
}
else
{
bUnique = false;
break;
}
}
}
}
}
return bUnique;
}
bool CSymbolPropertiesGeneralPage::SetWarningText( const CString& sWarning,
LPCTSTR pszIconID /*= NULL*/)
{
if (!sWarning.IsEmpty() )
{
// Set the icon
m_ctrlWarningIcon.SetIcon(AfxGetApp()->LoadStandardIcon(pszIconID));
// Set the text
m_ctrlWarning.SetWindowText(sWarning);
m_ctrlWarningIcon.ShowWindow(true);
m_ctrlWarning.ShowWindow(true);
return true;
}
m_ctrlWarningIcon.ShowWindow(false);
m_ctrlWarning.ShowWindow(false);
return false;
}
bool CSymbolPropertiesGeneralPage::AreSymbolsInSameFile(CResourceSymbol* pSymbol1, CResourceSymbol* pSymbol2) const
{
return (pSymbol1->GetUserData() == pSymbol2->GetUserData() );
}
void CSymbolPropertiesGeneralPage::CheckNameAndValue(void)
{
CString sWarning;
if (!IsNameUnique(m_pSymbol, m_sName, true) )
{
sWarning.LoadString(IDS_SYM_NAME_CONFLICT_CAPTION);
SetWarningText( sWarning,
IDI_ERROR); // Check same files
ShowDlgControl(IDC_SYM_FIX_VALUE, false);
}
else if (!IsNameUnique(m_pSymbol, m_sName, false) ) // Check other files
{
sWarning.LoadString(IDS_SYM_NAME_CONFLICT_CAPTION_EXTERNAL);
SetWarningText( sWarning,
IDI_WARNING);
ShowDlgControl(IDC_SYM_FIX_VALUE, false);
}
else if (!IsValueUnique(m_pSymbol, m_uValue, true) ) // Check same file
{
sWarning.LoadString(IDS_SYM_VALUE_CONFLICT_CAPTION);
SetWarningText( sWarning,
IDI_WARNING);
ShowDlgControl(IDC_SYM_FIX_VALUE, true);
}
else if (!IsValueUnique(m_pSymbol, m_uValue, false) ) // Check other files
{
sWarning.LoadString(IDS_SYM_VALUE_CONFLICT_CAPTION_EXTERNAL);
SetWarningText( sWarning,
IDI_WARNING);
ShowDlgControl(IDC_SYM_FIX_VALUE, true);
}
else if (m_pSymbols->IsOutOfRange(SymbolTypes.GetType(m_sName), m_uValue) ) // Check if out of range
{
sWarning.LoadString(IDS_SYM_VALUE_OUT_OF_RANGE_CAPTION);
SetWarningText( sWarning,
IDI_WARNING);
ShowDlgControl(IDC_SYM_FIX_VALUE, true);
}
else
{
SetWarningText( _T("") );
ShowDlgControl(IDC_SYM_FIX_VALUE, false);
}
// Force a repaint so the warning paints correctly
Invalidate();
// Inform the parent that the symbol is changing
// This is used to update the "Conflicts" page
GetParent()->SendMessage( WM_SYM_CHANGING,
m_uValue,
(LPARAM)(LPCTSTR)m_sName);
}
/////////////////////////////////////////////////////////////////////////////
// CSymbolPropertiesGeneralPage message handlers
void CSymbolPropertiesGeneralPage::OnCmdSymbolName(void)
{
// Update type control and icon
int eType = SymbolTypes.GetType(m_sName);
// Set the icon...
SetTypeIcon( SymbolTypes.GetIconID(eType) );
// ...and the displayed description
CString sNewType = SymbolTypes.GetTypeName(eType);
bool bTypeChanged = (!m_sType.IsEmpty() && (sNewType != m_sType) );
m_sType = sNewType;
ASSERT(!m_sType.IsEmpty());
if (bTypeChanged)
{
// Pick a value for the symbol which is within range for its new type
OnClickedFixValue();
}
UpdateData(false);
// Check for name conflicts...
CheckNameAndValue();
}
void CSymbolPropertiesGeneralPage::OnCmdSymbolValue(void)
{
CheckNameAndValue();
}
void CSymbolPropertiesGeneralPage::OnCmdReadOnly(void)
{
ShowDlgControl( IDC_SYM_READONLY_CAUTION, m_bReadOnly);
SetReadOnly( IDC_SYM_NAME, m_bReadOnly || m_bEditValueOnly);
SetReadOnly( IDC_SYM_VALUE, m_bReadOnly);
EnableDlgControl( IDC_SYM_FIX_VALUE, !m_bReadOnly);
if (m_bEditValueOnly)
{
// If only the value is editable, set the focus to it
GetDlgItem(IDC_SYM_VALUE)->SetFocus();
}
}
void CSymbolPropertiesGeneralPage::OnClickedFixValue(void)
{
BOOL bFailed = false;
UINT uNewValue = m_pSymbols->GetBaseSymbolValue( SymbolTypes.GetType(m_sName) );
while (!IsValueUnique(m_pSymbol, uNewValue, false) )
{
uNewValue++;
if (uNewValue >= IDC_STATIC)
{
bFailed = true;
ASSERT(false);
break; // Can't fix this one
}
}
if (!bFailed)
{
m_uValue = uNewValue;
UpdateData(false);
CheckNameAndValue();
}
else
{
::AfxMessageBox(IDP_SYM_FIX_VALUE_FAILED,
MB_OK | MB_ICONEXCLAMATION);
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -