Ejemplo n.º 1
0
long CCompileEditView::Compile(CDlgFormulaEdit* pDlg, LPARAM lParam /*= 0*/)
{
	if(m_pListCtrl != NULL)
	{ 
		m_pListCtrl->DeleteAllItems();
	}

	if( m_pParentDlg == NULL && pDlg != NULL )
	{
		m_pParentDlg = pDlg;
	}
	if( pDlg == NULL )
		return 0;

	this->SetFocus();

	CString strValue;
	GetRichEditCtrl().GetWindowText(strValue);
	if(strValue.IsEmpty()) 
		return -1;

	CString strName;
	CWnd* pNameEdit = pDlg->GetDlgItem(IDC_NAMEEDIT); // 名称
	if( pNameEdit != NULL )
	{
		pNameEdit->GetWindowText(strName);
	}

	if(strName.IsEmpty())
	{
		MessageBox(_T("请输入名称!"),_T("提示"),MB_ICONINFORMATION);
		if(pNameEdit != NULL)
		{
			pNameEdit->SetFocus();
		}
		return FALSE;
	}

	strName.TrimLeft();
	strName.TrimRight();
	strName.MakeUpper();
	CValue* pValoare = NULL;
	if( pDlg->IsType(CDlgFormulaEdit::Update) )
	{
		if( strName.CompareNoCase(pDlg->m_strOldName) &&
			m_pExternExpression->Lookup(strName,pDlg->m_nExpressType,pValoare) )
		{
			CString strPrompt;
			strPrompt.Format(_T("公式 \"%s\" 已经存在,请改名保存"),strName);
			MessageBox(strPrompt,_T("提示"),MB_ICONINFORMATION);
			pNameEdit->SetFocus();
			((CEdit*)pNameEdit)->SetSel(0,-1);
			return 0;
		}

		if( m_pExternExpression->Lookup(pDlg->m_strOldName,pDlg->m_nExpressType,pValoare) )
		{
		}
	}
	else if ( m_pExternExpression->Lookup(strName,pDlg->m_nExpressType,pValoare) )
	{
		if( pDlg->IsType(CDlgFormulaEdit::NewExp) )
		{
			CString strPrompt;
			strPrompt.Format(_T("公式 \"%s\" 已经存在,请改名保存"),strName);
			MessageBox(strPrompt,_T("提示"),MB_ICONINFORMATION);
			pNameEdit->SetFocus();
			((CEdit*)pNameEdit)->SetSel(0,-1);
			return 0;
		}
	}
	
	CExpression* pExpresie = new CExpression(m_pExternExpression,
		m_pExternVariabile,m_pExternFunction);

	if( pDlg)
	{
		pDlg->AddToParamerList(pExpresie);
	}

	//CWnd* pPromptWnd = m_pParentDlg->GetDlgItem(IDC_PROMTEDIT);
	//CWnd* pBtError = m_pParentDlg->GetDlgItem(IDC_ERROR);
	CWnd* pPromptWnd = m_pParentDlg->m_pErrorDlg;
	CString strErroText;

	nodErrorInfo info(0,0,0,strName);
	int nErrorCount = pExpresie->ChangeExpression(strValue);
	if( nErrorCount == 0 )
	{
		strErroText = _T("公式编译(测试)通过!");
		CTreeCtrlFormula* pHxTreeCtrl = NULL;	

		BOOL bAdd = FALSE;
		CExpValue* pValue = NULL;
		if(pValoare != NULL)
		{
			pValue = (CExpValue*)pValoare;
			CExpression* pOldExpress = pValue->GetExp();
			if(pOldExpress != NULL)
			{
				pExpresie->SetExpressType(pDlg->m_nExpressType);
				//qinhn 20090729 Add 保证在修改编译公式时,其"常用指标"的属性不变
				if (pOldExpress->IsStyle(HS_EXP_DEFAULT_TECH))
				{
					pExpresie->AddStyle(HS_EXP_DEFAULT_TECH);
				}
				//qinhn 20090729 Add End
			}
			pValue->Clean();

			if( pDlg->IsType(CDlgFormulaEdit::Update) &&
				strName.CompareNoCase(pDlg->m_strOldName) )
			{
				m_pExternExpression->RemoveKey(pDlg->m_strOldName,pDlg->m_nExpressType);
				bAdd = TRUE;
			}
		}
		else
		{
			pExpresie->SetExpressType(pDlg->m_nExpressType);
		}

		if(pValue == NULL)
		{
			pValue = new CExpValue;
			bAdd   = TRUE;
		}

		pValue->SetValue(pExpresie);
		pExpresie->SetName(strName);
		//qinhn 20090727 modify  设置类型,只编译保存则类型不变
		if (CDlgFormulaEdit::bNeedChangeStyle )
			pExpresie->AddStyle( ((!pDlg->m_nMainChart)?HS_EXP_MAINCHART:HS_EXP_SUBCHART) );
		else
			pExpresie->AddStyle(((!pDlg->m_CharType)?HS_EXP_MAINCHART:HS_EXP_SUBCHART));
		pExpresie->AddStyle( HS_EXP_OUTTYPE(pDlg->m_dStyle) );
		CDlgFormulaEdit::bNeedChangeStyle = false;
		//qinhn 20090717 modify End

		if( bAdd )
		{
			m_pExternExpression->AddExpress(strName,pValue);
		}

		CString strText;
		CWnd* pWnd = pDlg->GetDlgItem(IDC_DESCRIBEEDIT);    // 公式描述
		if(pWnd != NULL)
		{
			pWnd->GetWindowText(strText);
			pExpresie->SetDescribe(strText);
		}
		pWnd = pDlg->GetDlgItem(IDC_PWDEDIT);        // 密码
		if(pWnd != NULL && !(pWnd->GetStyle() & WS_DISABLED) )
		{
			pWnd->GetWindowText(strText);
			pExpresie->SetPWD(strText);
		}
		
		if(pDlg->m_pDlgNotes != NULL)  // 注释
		{
			strText = pDlg->m_pDlgNotes->GetText();
			pExpresie->SetNotes(strText); 
		}
		
		if( pDlg->m_pDlgEidolon )       // 参数精灵
		{
			strText = pDlg->m_pDlgEidolon->GetText();
			pExpresie->SetEidolon(strText);
		}

		if( m_pEstopPeriodDlg != NULL )
		{
			*pExpresie->GetEstopPeriod()   = m_pEstopPeriodDlg->GetEstopPeriod();   // 禁用周期
			*pExpresie->GetDefaultPeriod() = m_pEstopPeriodDlg->GetDefaultPeriod(); // 缺省周期
		}

		// 更新树
		if( pDlg->m_pFormulaMan != NULL )
		{
			pHxTreeCtrl = pDlg->m_pFormulaMan->GetCurTree((WORD)pDlg->m_nExpressType);
			if(pHxTreeCtrl != NULL)
			{
				//pExpresie->SetExpressType(pHxTreeCtrl->GetType());

				if(pValoare != NULL)
				{	
					//pHxTreeCtrl->UpdateTreeItemData(pValoare,pValue);
				}
				else
				{
					if(pDlg != NULL)
					{
						pDlg->SetTitle(pExpresie->GetExpressType(),strName);
					}

					pHxTreeCtrl->AddItem(strName,pValue,m_pExternExpression);

					if( pDlg->IsType(CDlgFormulaEdit::NewExp) )
					{
						pDlg->m_strOldName = strName;
						pExpresie->AddStyle(HS_EXP_USEREDIT);
						pDlg->SetType(CDlgFormulaEdit::Update | pDlg->IsType(CDlgFormulaEdit::SpeedNew));
					}
				}
			}
		}

		// 更新绘图窗口
		ExpPropery NameProp;
		NameProp.m_dExpType = pExpresie->GetExpressType();
		NameProp.m_strName.Format("%s", pExpresie->GetName());
		NameProp.m_strDescribe.Format("%s",  pExpresie->GetDescribe());
		NameProp.m_bStyle = pExpresie->GetStyle();
		if ( g_pFormulaMan )
			g_pFormulaMan->SendLinkMsg(DiagramMsg_FormulaParamChanged,(LPARAM)&NameProp);

		if(pPromptWnd != NULL)
		{
			pPromptWnd->SendMessage(HX_USER_COMPILE_INFO,0,0);
			//pPromptWnd->SetWindowText(strErroText);
		}

		m_pParentDlg->ShowResult(CDlgFormulaEdit::CompileResult);
		::SendMessage(g_hParentWnd,g_SendReLoadTabItemMsg,0,0); //qinhn 20090721 Add 重新载入T指标ab页,防止点修改公式对话框里面的"保存"后出错
		
		return (long)pExpresie;
	}
	else
	{
		/*strErroText = "公式有几个错误!";
		if(pBtError != NULL)
		{
			pBtError->EnableWindow(TRUE);
		}
		if(pPromptWnd != NULL)
		{
			pPromptWnd->SetWindowText(strErroText);
		}*/

		//AddCompileInfotoList(11,(LPARAM)&info);


		m_pParentDlg->ShowResult(CDlgFormulaEdit::CompileResult);

		delete pExpresie;
	}

	return 0;
}