BOOL CFileBasedProjectTemplateItem::CreateMainFile(LPCTSTR lpszTargetPath, LPCTSTR lpszCrLf)
{
	CStringW text;
	TextDocument doc;

	bool result = doc.Read(m_strPath,text);

	if (result)
	{
		const CStringW lineendings(L"\r\n");
		int index = text.FindOneOf(lineendings);

		if (index != -1)
		{
			CStringW line = text.Left(index);
			const CStringW strKey(L"%DESCRIPTION: ");
			CStringW strStartOfLine = line.Left(strKey.GetLength());

			strStartOfLine.MakeUpper();

			if (strKey == strStartOfLine) 
			{
				text.Delete(0,index);
				text.TrimLeft(lineendings + L' ');
			}
		}

		LPCWSTR le = GetLineEnding(static_cast<LPCWSTR>(text),text.GetLength());

		USES_CONVERSION;

		if (std::wcscmp(le,T2CW(lpszCrLf)) != 0) // Line endings not equal
			text.Replace(le,lpszCrLf);

		result = doc.Write(lpszTargetPath,text);
	}

	return result;
}
HRESULT CIfExpressEditorDlg::OnMsgStructSelectParam(WPARAM,LPARAM lp)
{
	CCxStructTreeNode *pNode = reinterpret_cast< CCxStructTreeNode * >(lp);

	CCxStructTreeNode *pNodeBackUpTmp = NULL;
	if (IDC_EDIT_LEFT == m_iFocusEidtPCtrlID)
	{
		pNodeBackUpTmp = m_pNodeLeft;
		m_pNodeLeft = pNode;
		GetCheckDataType(m_pNodeLeft); // 左侧节点重新选择后,需更新校验类型
		if (m_ComboRightType.GetCurSel()==TP_CONST)
			CheckGetConst(TRUE); // 切换类型后就检查
	}
	else if (IDC_EDIT_RIGHT == m_iFocusEidtPCtrlID)
	{
		pNodeBackUpTmp = m_pNodeRight;
		m_pNodeRight = pNode;
	}
	CString strText;
	BOOL bHaveArry = FALSE;
	if (pNode->m_NodeType == CCxStructTreeNode::NT_PARAM_ARRAY) // 数组参数ID需要去掉后面的元素名称,否则全路径找不到
	{
		bHaveArry = TRUE;
		strText = pNode->m_strText; //获取数组下标
		while(pNode && pNode->m_NodeType==CCxStructTreeNode::NT_PARAM_ARRAY)
				pNode = pNode->m_pParent;
	}
	CString strParamID = pNode->m_strID;
	CString strFullPath = GetDataFullPathByID(strParamID,NULL); // 获取参数全路径
	CString strArry = "";
	if (bHaveArry)
	{
		// 以下代码从带下标的数组参数中获取下标部分,例如doubel-数组.test[10]得到[10]
		strArry = strText;
		CString strParamName = pNode->m_strOriName;
		CStringW strWArry		= LPCWSTR(_bstr_t(strArry));
		CStringW strWParamName  = LPCWSTR(_bstr_t(strParamName));
		strWArry.TrimLeft(strWParamName); //得到只剩数组下标的部分
		strArry = LPCTSTR(_bstr_t(strWArry));
	}
	if (IDC_EDIT_LEFT == m_iFocusEidtPCtrlID) //给左编辑框赋值
	{
		UpdateComboBoxSymbol(); // 根据节点类型调整运算符
		m_Express.m_LeftParam.Clear();
		m_Express.m_LeftParam.strID = strParamID; // 记录参数ID
		m_Express.m_LeftParam.strParamFullPath = strFullPath;	// 记录参数全路径
		m_EditLeft.SetWindowText(strFullPath);
		if (bHaveArry)
		{
			m_Express.m_LeftParam.strArry = strArry; //记录选择的数组下标
			m_EditLeftArry.SetWindowText(strArry);
			m_EditLeftArry.ShowWindow(SW_SHOW);
			m_EditLeftArry.ChangeBkColor(false);
		}
		else
			m_EditLeftArry.ShowWindow(SW_HIDE);

		AdjustLeftEditSize();
		if (bHaveArry)
			m_EditLeftArry.SetFocus();
		else
			m_EditLeft.SetFocus();

		m_EditLeft.ChangeBkColor(false);
	}
	else if (IDC_EDIT_RIGHT == m_iFocusEidtPCtrlID)
	{
		int iTempCheck = m_iCheckType;
		GetCheckDataType(pNode);
		int iCurType = m_iCheckType;
		m_iCheckType = iTempCheck;
		if (iCurType!=m_iCheckType && m_iCheckType!=-1) // 运算符左右类型不一致
		{
			MessageBox("所选节点与运算符左侧参数类型不一致!",g_lpszAppTitle,MB_OK|MB_ICONINFORMATION);
			m_pNodeRight = pNodeBackUpTmp;
			return S_OK;
		}
		m_Express.m_RightParam.Clear();
		m_Express.m_RightParam.strID = strParamID; // 记录参数ID
		m_Express.m_RightParam.strParamFullPath = strFullPath;	// 记录参数全路径
		m_EditRight.SetWindowText(strFullPath);
		if (bHaveArry)
		{
			m_Express.m_RightParam.strArry = strArry; //记录选择的数组下标
			m_EditRightArry.SetWindowText(strArry);
			m_EditRightArry.ShowWindow(SW_SHOW);
			m_EditRightArry.ChangeBkColor(false);
		}
		else
			m_EditRightArry.ShowWindow(SW_HIDE);

		AdjustRightEditSize();
		if (bHaveArry)
			m_EditRightArry.SetFocus();
		else
			m_EditRight.SetFocus();

		m_EditRight.ChangeBkColor(false); // 重置错误状态
		m_EditRightArry.ChangeBkColor(false);
	}
	m_wndTreeDropDown.ShowWindow(SW_HIDE);
	return S_OK;
}
Example #3
0
void Definition::GetAsNumber(Number<T>& n, StringMapW<T>* n2n)
{
    CStringW str = m_value;
    str.Replace(L" ", L"");

    n.value = 0;
    n.unit = m_unit;
    n.sign = 0;

    if(n2n)
    {
        if(m_status == node) throw Exception(_T("expected value type"));

        if(StringMapW<T>::CPair* p = n2n->Lookup(str))
        {
            n.value = p->m_value;
            return;
        }
    }

    if(m_status != number) throw Exception(_T("expected number"));

    n.sign = str.Find('+') == 0 ? 1 : str.Find('-') == 0 ? -1 : 0;
    str.TrimLeft(L"+-");

    if(str.Find(L"0x") == 0)
    {
        if(n.sign) throw Exception(_T("hex values must be unsigned"));

        n.value = (T)wcstoul(str.Mid(2), NULL, 16);
    }
    else
    {
        CStringW num_string = m_value + m_unit;

        if(m_num_string != num_string)
        {
            Split sa(':', str);
            Split sa2('.', sa ? sa[sa-1] : L"");

            if(sa == 0 || sa2 == 0 || sa2 > 2) throw Exception(_T("invalid number"));

            float f = 0;
            for(size_t i = 0; i < sa; i++)
            {
                f *= 60;
                f += wcstoul(sa[i], NULL, 10);
            }
            if(sa2 > 1) f += (float)wcstoul(sa2[1], NULL, 10) / pow((float)10, sa2[1].GetLength());

            if(n.unit == L"ms")
            {
                f /= 1000;
                n.unit = L"s";
            }
            else if(n.unit == L"m")
            {
                f *= 60;
                n.unit = L"s";
            }
            else if(n.unit == L"h")
            {
                f *= 3600;
                n.unit = L"s";
            }

            m_num.value = f;
            m_num.unit = n.unit;
            m_num_string = num_string;

            n.value = (T)f;
        }
        else
        {
            n.value = (T)m_num.value;
            n.unit = m_num.unit;
        }

        if(n.sign) n.value *= n.sign;
    }
}