/////////////////////////////////////////////////////////////////////////////
// File: nodeentities.cpp
// Version: 1.0.0.0
// Created: 03-april-2002
//
// Author: Thorsten Wack
// E-mail: wt@umsicht.fhg.de
//
//
// This code may be used in compiled form in any way you desire. This
// file may be redistributed unmodified by any means PROVIDING it is
// not sold for profit without the authors written consent, and
// providing that this notice and the authors name is included. If
// the source code in this file is used in any commercial application
// then a simple email would be nice.
//
// This file is provided "as is" with no expressed or implied warranty.
// The author accepts no liability if it causes any damage whatsoever.
//
// Version 1.0.0.1: CRange Node has got an own GetNodeFromPoint implementation
// o fix the selection miss-behaviour. Suggested by Paolo Messina
/////////////////////////////////////////////////////////////////////////////
#include "stdafx.h"
#include "nodeentities.h"
#include "bintree.h"
// some handy defines for the offsets
#define DIV_LINE_OFFSET 5 // for the dividion Node
//////////////////
//CTypedNode
//
// Baseclass for typed nodes (a typed node manages two or more shortcuts)
// the used shortcut is specified by m_nType (e.g Equation: =, <, >, etc.)
CTypedNode::CTypedNode()
{
m_nType=0;
for (int i=0; i<LT_COUNT; i++)
m_straKeyWords[i].SetSize(0, 1);
}
CTypedNode::~CTypedNode()
{
m_straShortCuts.RemoveAll();
m_straFontNames.RemoveAll();
for (int i=0; i<LT_COUNT; i++)
m_straKeyWords[i].RemoveAll();
}
const void CTypedNode::operator=(const CNode& Node)
{
CNode::operator=(Node);
CTypedNode& rNode = (CTypedNode&) Node;
m_nType=rNode.GetType();
}
void CTypedNode::SetType(int nType)
{
m_nType=nType;
}
int CTypedNode::GetType()
{
return m_nType;
}
void CTypedNode::Serialize(CArchive& ar, CBinTree* pTree)
{
CNode::Serialize(ar, pTree);
if(ar.IsStoring())
{
ar << m_nType;
}
else
{
ar >> m_nType;
}
}
CString CTypedNode::WriteNode(int nLanguageType)
{
ASSERT(nLanguageType>=0 && nLanguageType<LT_COUNT);
if(m_straKeyWords[nLanguageType].GetSize()==0 )
return CNode::WriteNode(nLanguageType);
ASSERT(m_nType < m_straKeyWords[nLanguageType].GetSize());
if(m_straCodeFormats[nLanguageType].GetSize()==0 )
{
m_strKeyWord[nLanguageType]=m_straKeyWords[nLanguageType].GetAt(m_nType);
return CNode::WriteNode(nLanguageType);
}
ASSERT(m_nType < m_straCodeFormats[nLanguageType].GetSize());
m_strCodeFormat[nLanguageType]=m_straCodeFormats[nLanguageType].GetAt(m_nType);
m_strKeyWord[nLanguageType]=m_straKeyWords[nLanguageType].GetAt(m_nType);
return CNode::WriteNode(nLanguageType);
}
//////////////////
//CValueNode
//
// Baseclass for nodes which can have a value (constants, variables etc)
//
CValueNode::CValueNode()
{
m_dValue=0;
m_lIDContext=1;
m_lIDUnit=1;
}
CValueNode::~CValueNode()
{
}
const void CValueNode::operator=(const CNode& Node)
{
CNode::operator=(Node);
CValueNode& rNode = (CValueNode&) Node;
m_dValue=rNode.GetValue();
m_lIDContext=rNode.GetContext();
m_lIDUnit=rNode.GetUnit();
}
void CValueNode::SetValue(double dValue)
{
m_dValue=dValue;
}
double CValueNode::GetValue()
{
return m_dValue;
}
void CValueNode::SetUnit(long lIDUnit)
{
m_lIDUnit=lIDUnit;
}
long CValueNode::GetUnit()
{
return m_lIDUnit;
}
void CValueNode::SetContext(long lIDContext)
{
m_lIDContext=lIDContext;
}
long CValueNode::GetContext()
{
return m_lIDContext;
}
void CValueNode::FormatNode(CBinTreeFormat* pFormat)
{
CString strFaceName=GetFaceName();
CNode::FormatNode(pFormat);
if(strFaceName=="Symbol")
SetFaceName(strFaceName);
}
void CValueNode::Serialize(CArchive& ar, CBinTree* pTree)
{
CNode::Serialize(ar, pTree);
if(ar.IsStoring())
{
ar << m_dValue;
ar << m_lIDContext;
ar << m_lIDUnit;
}
else
{
ar >> m_dValue;
ar >> m_lIDContext;
ar >> m_lIDUnit;
}
}
//////////////////
//CVariableNode
CVariableNode::CVariableNode()
{
m_strNodeType=NT_VARIABLE;
m_strShortCut="var";
m_strName="variable";
m_nAssociativityLevel=0;
m_dwEditMode |= NE_ALLOWEDIT;
m_strCodeFormat [LT_FORTRAN]=_T("%s%s%s");
m_strKeyWord [LT_FORTRAN]=_T("");
}
CVariableNode::~CVariableNode()
{
}
//////////////////
//COpNode
COpNode::COpNode()
{
}
COpNode::~COpNode()
{
}
//////////////////
//CFunctionNode
CFunctionNode::CFunctionNode()
{
}
CFunctionNode::~CFunctionNode()
{
}
//////////////////
//CConstantNode
CConstantNode::CConstantNode()
{
m_strNodeType=NT_CONSTANT;
m_strShortCut="const";
m_dwEditMode |= NE_ALLOWEDIT;
m_strCodeFormat [LT_FORTRAN]=_T("%s%s%s");
m_strKeyWord [LT_FORTRAN]=_T("");
}
CConstantNode::~CConstantNode()
{
}
//////////////////
//CNumberNode
CNumberNode::CNumberNode()
{
m_strNodeType=NT_NUMBER;
m_strShortCut="0.0";
m_strName="number";
m_nAssociativityLevel=0;
m_dwEditMode |= NE_ALLOWEDIT;
m_strCodeFormat [LT_FORTRAN]=_T("%s%s%s");
m_strKeyWord [LT_FORTRAN]=_T("");
}
CNumberNode::~CNumberNode()
{
}
//////////////////
//CDivisionNode
CDivisionNode::CDivisionNode()
{
m_strNodeType=NT_DIVISION;
m_nType=0;
m_strShortCut="/";
m_strName="over";
m_nAssociativityLevel= 4;
m_strCodeFormat [LT_FORTRAN]=_T("(%s)%s(%s)");
m_strKeyWord [LT_FORTRAN]=_T("/");
}
CDivisionNode::~CDivisionNode()
{
}
void CDivisionNode::TransformRects(CRect& rect, CRect& leftRect, CRect& rightRect, CRect& contentRect)
{
int nTop= rect.top;
int nLeft= rect.left;
if(m_nType==0)
{
leftRect.OffsetRect(nLeft, nTop);
nTop+=leftRect.Height()+1;
contentRect.OffsetRect(nLeft, nTop);
nTop+=contentRect.Height()+1;
rightRect.OffsetRect(nLeft, nTop);
nTop+=rightRect.Height()+1;
rect.right=(DIV_LINE_OFFSET-1)+rect.left+ternary_max(leftRect.Width(), contentRect.Width(), rightRect.Width());
rect.bottom=nTop;
contentRect.right+=rect.Width();
CenterRectHorz(leftRect, rect);
CenterRectHorz(rightRect, rect);
m_nBaseLine=contentRect.top-rect.top+(DIV_LINE_OFFSET-1)/2;
return;
}
if(m_nType==1)
{
CNode::TransformRects(rect, leftRect, rightRect, contentRect);
contentRect.top=rect.top;
contentRect.bottom=rect.bottom;
contentRect.right=contentRect.left+contentRect.Height()*1/4;
rightRect.OffsetRect(contentRect.Width(),0);
rect.right+=contentRect.Width();
}
}
CRect CDivisionNode::GetContentRect(CDC* pDC)
{
if(m_nType==0)
{
return CRect(0,0,0,DIV_LINE_OFFSET);
}
if(m_nType==1)
{
return CRect(0,0,0,0);
}
return CRect(0,0,0,0);
}
void CDivisionNode::DrawContent(CDC* pDC, CRect rect, DWORD dwSelect)
{
if(m_nType==0)
{
pDC->MoveTo(rect.left,rect.top+(DIV_LINE_OFFSET-1)/2);
pDC->LineTo(rect.right,rect.top+(DIV_LINE_OFFSET-1)/2);
}
if(m_nType==1)
{
pDC->MoveTo(rect.right, rect.top);
pDC->LineTo(rect.left, rect.bottom);
}
}
//=======================================================
CNthRootNode::CNthRootNode()
{
m_strNodeType=NT_NTHROOT;
m_strShortCut="�";
m_strName="n-th root";
m_nAssociativityLevel= 1;
m_nSubLevelRightInc=1;
m_strCodeFormat [LT_FORTRAN]=_T("(%s) %s (%s)))");
m_strKeyWord [LT_FORTRAN]=_T("** (-(1.0D0 /");
}
CNthRootNode::~CNthRootNode()
{
}
void CNthRootNode::TransformRects(CRect& rect, CRect& leftRect, CRect& rightRect, CRect& contentRect)
{
int nTop= rect.top;
int nLeft= rect.left;
int nPatternWidth=5+(int)(leftRect.Height()*2./7.);
rightRect.OffsetRect(nLeft, nTop);
nLeft+=rightRect.Width();
contentRect.OffsetRect(nLeft, nTop);
nLeft+=nPatternWidth+1;
leftRect.OffsetRect(nLeft, nTop+2);
nLeft+=leftRect.Width()+1;
rect.right=nLeft;
rect.bottom=rect.top+2+ternary_max(leftRect.Height(), contentRect.Height(), rightRect.Height());
contentRect.bottom=rect.bottom;
contentRect.right=rect.right;
m_nBaseLine=contentRect.Height()/2;
}
CRect CNthRootNode::GetContentRect(CDC* pDC)
{
return CNode::GetContentRect(pDC);
}
void CNthRootNode::DrawContent(CDC* pDC, CRect rect, DWORD dwSelect)
{
CFont ctrlFont;
int nTempHeight=m_lf.lfHeight;
int nPatternWidth=5+(int)(rect.Height()*2./7.);
m_lf.lfHeight=(int)((rect.Height()-2)*200./27.);
m_lf.lfWidth=nPatternWidth;
ctrlFont.CreatePointFontIndirect
(
&m_lf,
pDC
);
CFont* pOldFont=pDC->SelectObject(&ctrlFont);
pDC->DrawText(m_strShortCut, rect, DT_NOCLIP | DT_NOPREFIX | DT_SINGLELINE | DT_LEFT | DT_VCENTER);
m_lf.lfHeight=nTempHeight;
pDC->SelectObject(pOldFont);
ctrlFont.DeleteObject();
pDC->MoveTo(rect.left+nPatternWidth*9/10, rect.top);
pDC->LineTo(rect.right, rect.top);
}
//=======================================================
CSquareRootNode::CSquareRootNode()
{
m_strNodeType=NT_ROOT;
m_strShortCut="�";
m_strName="square root";
m_nAssociativityLevel= 1;
m_nSubLevelRightInc=1;
m_strCodeFormat [LT_FORTRAN]=_T("SQRT(%s%s%s");
m_strKeyWord [LT_FORTRAN]=_T(")");
}
CSquareRootNode::~CSquareRootNode()
{
}
//=======================================================
CPowerToNode::CPowerToNode()
{
m_strNodeType=NT_POWERTO;
m_strShortCut="^";
m_strName="power to";
m_nAssociativityLevel= 1;
m_nSubLevelRightInc=1;
m_strCodeFormat [LT_FORTRAN]=_T("(%s) %s (%s)");
m_strKeyWord [LT_FORTRAN]=_T("**");
}
CPowerToNode::~CPowerToNode()
{
}
void CPowerToNode::TransformRects(CRect& rect, CRect& leftRect, CRect& rightRect, CRect& contentRect)
{
int nTop= rect.top;
int nLeft= rect.left;
leftRect.OffsetRect(nLeft, nTop);
nLeft+=leftRect.Width();
rightRect.OffsetRect(nLeft, nTop);
nLeft+=rightRect.Width()+1;
leftRect.OffsetRect(0, rightRect.Height());
contentRect=rightRect | leftRect;
rect.right=nLeft;
rect.bottom=rect.top+leftRect.Height()+rightRect.Height();
m_nBaseLine=leftRect.top-rect.top+leftRect.Height()/2;
}
CRect CPowerToNode::GetContentRect(CDC* pDC)
{
return CRect(0,0,0,0);
}
void CPowerToNode::DrawContent(CDC* pDC, CRect rect, DWORD dwSelect)
{
}
//=======================================================
CPlaceHolderNode::CPlaceHolderNode()
{
m_strNodeType=NT_PLACEHOLDER;
m_nAssociativityLevel= -1;
m_lf.lfHeight=GetFormat()->m_nFontHeight[FH_STANDARD]*10;
m_strCodeFormat [LT_FORTRAN]=_T("%s%s%s");
m_strKeyWord [LT_FORTRAN]=_T("EMPTY");
}
CPlaceHolderNode::~CPlaceHolderNode()
{
}
void CPlaceHolderNode::TransformRects(CRect& rect, CRect& leftRect, CRect& rightRect, CRect& contentRect)
{
CNode::TransformRects(rect, leftRect, rightRect ,contentRect);
}
CRect CPlaceHolderNode::GetContentRect(CDC* pDC)
{
return CRect(0, 0, m_lf.lfHeight/10-2, m_lf.lfHeight/10+2);
}
void CPlaceHolderNode::DrawContent(CDC* pDC, CRect rect, DWORD dwSelect)
{
// setup devices
CPen pen;
CPen* pOldPen;
CBrush brush;
CBrush* pOldBrush;
if(!dwSelect)
{
pen.CreatePen(PS_SOLID, 1, RGB(0,0,128));
pOldPen=pDC->SelectObject(&pen);
brush.CreateHatchBrush(HS_BDIAGONAL, RGB(0,0,128));
pOldBrush=pDC->SelectObject(&brush);
}
else
{
pen.CreatePen(PS_SOLID, 1, ::GetSysColor(COLOR_HIGHLIGHTTEXT));
pOldPen=pDC->SelectObject(&pen);
brush.CreateHatchBrush(HS_BDIAGONAL, ::GetSysColor(COLOR_HIGHLIGHTTEXT));
pOldBrush=pDC->SelectObject(&brush);
}
// draw content
rect.DeflateRect(1,1);
pDC->Rectangle(&rect);
// clear up devices
pDC->SelectObject(pOldPen);
pDC->SelectObject(pOldBrush);
pen.DeleteObject();
brush.DeleteObject();
}
//=======================================================
CBraceNode::CBraceNode()
{
m_strNodeType=NT_BRACE;
m_straShortCuts.SetSize(0,1);
m_straFontNames.SetSize(0,1);
m_straShortCuts.Add("()");
m_straFontNames.Add("Symbol");
m_straShortCuts.Add("[]");
m_straFontNames.Add("Symbol");
m_straShortCuts.Add("{}");
m_straFontNames.Add("Symbol");
m_straShortCuts.Add("��");
m_straFontNames.Add("Symbol");
m_straShortCuts.Add("||");
m_straFontNames.Add("Symbol");
m_straShortCuts.Add("||");
m_straFontNames.Add("Symbol");
m_straShortCuts.Add("[[");
m_straFontNames.Add("Symbol");
m_straShortCuts.Add("]]");
m_straFontNames.Add("Symbol");
m_straShortCuts.Add("][");
m_straFontNames.Add("Symbol");
m_straShortCuts.Add("[)");
m_straFontNames.Add("Symbol");
m_straShortCuts.Add("(]");
m_straFontNames.Add("Symbol");
m_straShortCuts.Add("( ");
m_straFontNames.Add("Symbol");
m_straShortCuts.Add(" )");
m_straFontNames.Add("Symbol");
m_straShortCuts.Add("[ ");
m_straFontNames.Add("Symbol");
m_straShortCuts.Add(" ]");
m_straFontNames.Add("Symbol");
m_straShortCuts.Add("{ ");
m_straFontNames.Add("Symbol");
m_straShortCuts.Add(" }");
m_straFontNames.Add("Symbol");
m_straShortCuts.Add("� ");
m_straFontNames.Add("Symbol");
m_straShortCuts.Add(" �");
m_straFontNames.Add("Symbol");
m_straShortCuts.Add("| ");
m_straFontNames.Add("Symbol");
m_straShortCuts.Add(" |");
m_straFontNames.Add("Symbol");
m_straShortCuts.Add("| ");
m_straFontNames.Add("Symbol");
m_straShortCuts.Add(" |");
m_straFontNames.Add("Symbol");
m_straShortCuts.Add("|�");
m_straFontNames.Add("Symbol");
m_straShortCuts.Add("�|");
m_straFontNames.Add("Symbol");
m_strShortCut="";
m_strName="brace";
m_nType=0;
m_nAssociativityLevel=1;
m_strCodeFormat [LT_FORTRAN]=_T("(%s%s%s");
m_strKeyWord [LT_FORTRAN]=_T(")");
}
CBraceNode::~CBraceNode()
{
}
void CBraceNode::TransformRects(CRect& rect, CRect& leftRect, CRect& rightRect, CRect& contentRect)
{
int nTop= rect.top;
int nLeft= rect.left;
int nPatternWidth=5+(leftRect.Height())/5;
contentRect.OffsetRect(nLeft, nTop);
nLeft+=nPatternWidth+1;
leftRect.OffsetRect(nLeft, nTop);
nLeft+=leftRect.Width()+1;
contentRect.right=nLeft+nPatternWidth;
contentRect.bottom=contentRect.top+leftRect.Height();
nLeft+=nPatternWidth+1;
rect.right=nLeft;
rect.bottom=rect.top+contentRect.Height();
m_nBaseLine=contentRect.Height()/2;
}
CRect CBraceNode::GetContentRect(CDC* pDC)
{
SetFaceName(m_straFontNames.GetAt(m_nType));
m_strShortCut=m_straShortCuts.GetAt(m_nType);
return CNode::GetContentRect(pDC);
}
void CBraceNode::DrawContent(CDC* pDC, CRect rect, DWORD dwSelect)
{
SetFaceName(m_straFontNames.GetAt(m_nType));
m_strShortCut=m_straShortCuts.GetAt(m_nType);
int nPatternWidth=5+rect.Height()/5;
CFont ctrlFont;
CString strOut;
CRect rectOut;
m_lf.lfHeight=(int)((rect.Height()-2)*100./12.);
m_lf.lfWidth=nPatternWidth;
ctrlFont.CreatePointFontIndirect
(
&m_lf,
pDC
);
CFont* pOldFont=pDC->SelectObject(&ctrlFont);
strOut.Format("%c",m_strShortCut[0]);
rectOut=CRect(
rect.left,
rect.top,
rect.left+nPatternWidth,
rect.bottom);
pDC->DrawText(strOut, rectOut, DT_NOCLIP | DT_EXTERNALLEADING |DT_NOPREFIX | DT_SINGLELINE | DT_LEFT | DT_BOTTOM);
strOut.Format("%c",m_strShortCut[1]);
rectOut=CRect(
rect.right-nPatternWidth,
rect.top,
rect.right,
rect.bottom);
pDC->DrawText(strOut, rectOut, DT_NOCLIP | DT_EXTERNALLEADING |DT_NOPREFIX | DT_SINGLELINE | DT_RIGHT| DT_BOTTOM);
pDC->SelectObject(pOldFont);
ctrlFont.DeleteObject();
}
//=======================================================
CEquationNode::CEquationNode()
{
m_strNodeType=NT_EQUATION;
m_straShortCuts.SetSize(0,1);
m_straFontNames.SetSize(0,1);
m_straShortCuts.Add("=");
m_straFontNames.Add("Symbol");
m_straKeyWords[LT_FORTRAN].Add(_T("="));
m_straShortCuts.Add("�");
m_straFontNames.Add("Symbol");
m_straKeyWords[LT_FORTRAN].Add(_T(".LE."));
m_straShortCuts.Add("�");
m_straFontNames.Add("Symbol");
m_straKeyWords[LT_FORTRAN].Add(_T(".GE."));
m_straShortCuts.Add("<");
m_straFontNames.Add("Symbol");
m_straKeyWords[LT_FORTRAN].Add(_T(".LT."));
m_straShortCuts.Add(">");
m_straFontNames.Add("Symbol");
m_straKeyWords[LT_FORTRAN].Add(_T(".GT."));
m_straShortCuts.Add("�");
m_straFontNames.Add("Symbol");
m_straKeyWords[LT_FORTRAN].Add(_T(".NE."));
m_straShortCuts.Add("�");
m_straFontNames.Add("Symbol");
m_straKeyWords[LT_FORTRAN].Add(_T("="));
m_straShortCuts.Add("�");
m_straFontNames.Add("Symbol");
m_straKeyWords[LT_FORTRAN].Add(_T("="));
m_straShortCuts.Add("@");
m_straFontNames.Add("Symbol");
m_straKeyWords[LT_FORTRAN].Add(_T("="));
m_straShortCuts.Add("�");
m_straFontNames.Add("Symbol");
m_straKeyWords[LT_FORTRAN].Add(_T("="));
m_straShortCuts.Add("�");
m_straFontNames.Add("Symbol");
m_straKeyWords[LT_FORTRAN].Add(_T("="));
m_straShortCuts.Add("�");
m_straFontNames.Add("Symbol");
m_straKeyWords[LT_FORTRAN].Add(_T("="));
m_straShortCuts.Add("�");
m_straFontNames.Add("Symbol");
m_straKeyWords[LT_FORTRAN].Add(_T("="));
m_straShortCuts.Add("�");
m_straFontNames.Add("Symbol");
m_straKeyWords[LT_FORTRAN].Add(_T("="));
m_straShortCuts.Add("�");
m_straFontNames.Add("Symbol");
m_straKeyWords[LT_FORTRAN].Add(_T("="));
m_straShortCuts.Add("�");
m_straFontNames.Add("Symbol");
m_straKeyWords[LT_FORTRAN].Add(_T("="));
m_straShortCuts.Add("�");
m_straFontNames.Add("Symbol");
m_straKeyWords[LT_FORTRAN].Add(_T("="));
m_straShortCuts.Add("�");
m_straFontNames.Add("Symbol");
m_straKeyWords[LT_FORTRAN].Add(_T("="));
m_straShortCuts.Add("'");
m_straFontNames.Add("Symbol");
m_straKeyWords[LT_FORTRAN].Add(_T("="));
m_straShortCuts.Add("$");
m_straFontNames.Add("Symbol");
m_straKeyWords[LT_FORTRAN].Add(_T("="));
m_straShortCuts.Add("\"");
m_straFontNames.Add("Symbol");
m_straKeyWords[LT_FORTRAN].Add(_T("="));
m_strShortCut="";
m_strName="equation";
m_nType=0;
m_nAssociativityLevel=20;
}
CEquationNode::~CEquationNode()
{
}
void CEquationNode::TransformRects(CRect& rect, CRect& leftRect, CRect& rightRect, CRect& contentRect)
{
CNode::TransformRects(rect, leftRect, rightRect, contentRect);
}
CRect CEquationNode::GetContentRect(CDC* pDC)
{
SetFaceName(m_straFontNames.GetAt(m_nType));
m_strShortCut=m_straShortCuts.GetAt(m_nType);
return CNode::GetContentRect(pDC);
}
void CEquationNode::DrawContent(CDC* pDC, CRect rect, DWORD dwSelect)
{
m_strShortCut=m_straShortCuts.GetAt(m_nType);
SetFaceName(m_straFontNames.GetAt(m_nType));
CNode::DrawContent(pDC, rect, dwSelect);
}
//=======================================================
CPartialDerivativeNode::CPartialDerivativeNode()
{
m_strNodeType=NT_PARTDERIVE;
m_strShortCut="�";
m_strName="partial d/dt";
m_nAssociativityLevel= 1;
m_strCodeFormat [LT_FORTRAN]=_T("DERIVE(%s %s %s)");
m_strKeyWord [LT_FORTRAN]=_T(",");
}
CPartialDerivativeNode::~CPartialDerivativeNode()
{
}
void CPartialDerivativeNode::TransformRects(CRect& rect, CRect& leftRect, CRect& rightRect, CRect& contentRect)
{
int nTop= rect.top;
int nLeft= rect.left;
int nContentBaseLine=0;
int nRightBaseLine=0;
nContentBaseLine=contentRect.Height()+(DIV_LINE_OFFSET-1)/2;
if(rightRect.Height() && m_pRightChild!=NULL)
nRightBaseLine=m_pRightChild->m_nBaseLine;
if(nRightBaseLine>nContentBaseLine)
{
contentRect.OffsetRect(nLeft, nTop+nRightBaseLine-nContentBaseLine);
nLeft+=contentRect.Width()+1;
nLeft+=leftRect.Width()+1;
rightRect.OffsetRect(nLeft, nTop);
}
else
{
contentRect.OffsetRect(nLeft, nTop);
nLeft+=contentRect.Width()+1;
nLeft+=leftRect.Width()+1;
rightRect.OffsetRect(nLeft, nTop+nContentBaseLine-nRightBaseLine);
}
nLeft+=rightRect.Width()+1;
contentRect.right+=leftRect.Width();
contentRect.bottom+=leftRect.Height()+DIV_LINE_OFFSET+1;
rect.right=nLeft;
rect.bottom=rect.top+(contentRect | rightRect).Height();
nLeft+=contentRect.Width()+1;
nLeft+=leftRect.Width()+1;
leftRect.OffsetRect(contentRect.left+contentRect.Width()+1-leftRect.Width(),
contentRect.bottom-leftRect.Height());
m_nBaseLine=contentRect.top-rect.top+nContentBaseLine;
}
CRect CPartialDerivativeNode::GetContentRect(CDC* pDC)
{
return CNode::GetContentRect(pDC);
}
void CPartialDerivativeNode::DrawContent(CDC* pDC, CRect rect, DWORD dwSelect)
{
CRect fontRect;
fontRect=GetContentRect(pDC);
CFont ctrlFont;
ctrlFont.CreatePointFontIndirect
(
&m_lf,
pDC
);
CFont* pOldFont=pDC->SelectObject(&ctrlFont);
pDC->DrawText(m_strShortCut, rect, DT_NOCLIP | DT_NOPREFIX | DT_SINGLELINE | DT_CENTER | DT_TOP);
pDC->MoveTo(rect.left,rect.top+fontRect.Height()+(DIV_LINE_OFFSET-1)/2);
pDC->LineTo(rect.right,rect.top+fontRect.Height()+(DIV_LINE_OFFSET-1)/2);
rect.top+=fontRect.Height()+DIV_LINE_OFFSET;
pDC->DrawText(m_strShortCut, rect, DT_NOCLIP | DT_NOPREFIX | DT_SINGLELINE | DT_LEFT | DT_VCENTER);
pDC->SelectObject(pOldFont);
ctrlFont.DeleteObject();
}
//=======================================================
CDerivativeNode::CDerivativeNode()
{
m_strNodeType=NT_DERIVE;
m_strShortCut="d";
m_strName="d/dt";
m_nAssociativityLevel= 1;
m_strCodeFormat [LT_FORTRAN]=_T("DERIVE(%s %s %s)");
m_strKeyWord [LT_FORTRAN]=_T(",");
}
CDerivativeNode::~CDerivativeNode()
{
}
//=======================================================
CSumNode::CSumNode()
{
m_strNodeType=NT_SUM;
m_strShortCut="�";
m_strName="sum";
m_lf.lfHeight=GetFormat()->GetFontHeight(FH_SYMBOL)*10;
m_pLeftChild=(CNode*) (new CRangeNode(this));
m_nAssociativityLevel=-1;
m_strCodeFormat [LT_FORTRAN]=_T("SUM(%s %s %s)");
m_strKeyWord [LT_FORTRAN]=_T(",");
}
CSumNode::~CSumNode()
{
}
// return the node of a given point (mouse coordinate)
/*CNode* CSumNode::GetNodeFromPoint(CDC* pDC, CRect& rect, CPoint point)
{
CRect contentRect(0,0,0,0);
CRect leftRect(0,0,0,0);
CRect rightRect(0,0,0,0);
CNode* pNode=NULL;
if(m_pLeftChild)
leftRect=m_pLeftChild->GetRect(pDC);
contentRect=GetContentRect(pDC);
if(m_pRightChild)
rightRect=m_pRightChild->GetRect(pDC);
TransformRects(rect, leftRect, rightRect, contentRect);
if(rightRect.PtInRect(point))
if(m_pRightChild)
{
pNode=m_pRightChild->GetNodeFromPoint(pDC, rightRect, point);
rect=rightRect;
return pNode;
}
if(contentRect.PtInRect(point))
{
rect=contentRect;
return this;
}
if(leftRect.PtInRect(point))
if(m_pLeftChild)
{
pNode=m_pLeftChild->GetNodeFromPoint(pDC, leftRect, point);
rect=leftRect;
return pNode;
}
return this;
}*/
void CSumNode::FormatNode(CBinTreeFormat* pFormat)
{
CNode::FormatNode(pFormat);
m_lf.lfHeight=pFormat->m_nFontHeight[m_nSubLevel > 1 ? FH_SUB_SYMBOL : FH_SYMBOL+m_nSubLevel]*10;
}
void CSumNode::TransformRects(CRect& rect, CRect& leftRect, CRect& rightRect, CRect& contentRect)
{
int nTop= rect.top;
int nLeft= rect.left;
int nRightBaseLine=0;
int nOffset=0;
if(rightRect.Height() && m_pRightChild!=NULL)
nRightBaseLine=m_pRightChild->m_nBaseLine;
nOffset=m_pLeftChild->m_nBaseLine+contentRect.Height()/2;
if(nRightBaseLine>nOffset)
{
leftRect.OffsetRect(nLeft, nTop+(nRightBaseLine-nOffset));
m_pLeftChild->m_nBaseLine+=(nRightBaseLine-nOffset);
}
else
{
leftRect.OffsetRect(nLeft, nTop);
}
if(m_pLeftChild)
{
contentRect.OffsetRect(nLeft, nTop+m_pLeftChild->m_nBaseLine);
CenterRectHorz(contentRect, leftRect);
nLeft+=leftRect.Width()+1;
}
else
{
contentRect.OffsetRect(nLeft, nTop);
nLeft+=contentRect.Width()+1;
}
if(nRightBaseLine>nOffset)
{
rightRect.OffsetRect(nLeft, nTop);
}
else
{
rightRect.OffsetRect(nLeft, nTop+nOffset-nRightBaseLine);
}
nLeft+=rightRect.Width()+1;
rect.right=nLeft;
rect.bottom=rect.top+(leftRect |rightRect).Height();
m_nBaseLine=contentRect.top-rect.top+contentRect.Height()/2;
}
CRect CSumNode::GetContentRect(CDC* pDC)
{
return CNode::GetContentRect(pDC);
}
void CSumNode::DrawContent(CDC* pDC, CRect rect, DWORD dwSelect)
{
CFont ctrlFont;
ctrlFont.CreatePointFontIndirect
(
&m_lf,
pDC
);
CFont* pOldFont=pDC->SelectObject(&ctrlFont);
pDC->DrawText(m_strShortCut, rect, DT_NOCLIP | DT_NOPREFIX | DT_SINGLELINE | DT_CENTER | DT_BOTTOM);
pDC->SelectObject(pOldFont);
ctrlFont.DeleteObject();
}
void CSumNode::Serialize(CArchive& ar, CBinTree* pTree)
{
CString strType;
CNode* pRightChild=NULL;
if (ar.IsStoring())
{
if(m_pLeftChild)
{
strType=m_pLeftChild->GetNodeType();
ar << strType;
m_pLeftChild->Serialize(ar, pTree);
}
else
{
strType="";
ar << strType;
}
if(m_pRightChild)
{
strType=m_pRightChild->GetNodeType();
ar << strType;
m_pRightChild->Serialize(ar, pTree);
}
else
{
strType="";
ar << strType;
}
ar << m_dwEditMode;
ar << m_nAssociativityLevel;
ar << m_nSubLevel;
ar << m_nSubLevelLeftInc;
ar << m_nSubLevelRightInc;
ar << m_strNodeType;
ar << m_strShortCut;
ar << m_strName;
ar << m_crColor;
ar << m_NodeRect;
ar << m_nBaseLine;
}
else
{
ar >> strType;
if(strType!="")
{
m_pLeftChild->Serialize(ar, pTree);
}
ar >> strType;
if(strType!="")
{
if(m_pRightChild)
delete m_pRightChild;
pRightChild=pTree->CreateNode(strType);
pRightChild->Serialize(ar, pTree);
}
ar >> m_dwEditMode;
ar >> m_nAssociativityLevel;
ar >> m_nSubLevel;
ar >> m_nSubLevelLeftInc;
ar >> m_nSubLevelRightInc;
ar >> m_strNodeType;
ar >> m_strShortCut;
ar >> m_strName;
ar >> m_crColor;
ar >> m_NodeRect;
ar >> m_nBaseLine;
SetRightChild(pRightChild);
}
}
//=======================================================
CProdNode::CProdNode()
{
m_strNodeType=NT_PROD;
m_strShortCut="�";
m_strName="product";
m_lf.lfHeight=GetFormat()->m_nFontHeight[FH_SYMBOL]*10;
m_nAssociativityLevel=-1;
m_strCodeFormat [LT_FORTRAN]=_T("PROD(%s %s %s)");
m_strKeyWord [LT_FORTRAN]=_T(",");
}
CProdNode::~CProdNode()
{
}
//=======================================================
CRangeNode::CRangeNode(CNode* pParent)
{
m_strNodeType=NT_RANGE;
m_pParent=pParent;
m_strShortCut="range";
m_strName="placeholder for ranges";
m_nAssociativityLevel= -1;
m_dwEditMode &= ~NE_ALLOWDELETE;// strip NE_ALLOWDELETE flag
m_nSubLevelRightInc=1;
m_nSubLevelLeftInc=1;
m_strCodeFormat [LT_FORTRAN]=_T("RANGE(%s %s %s)");
m_strKeyWord [LT_FORTRAN]=_T(",");
}
CRangeNode::~CRangeNode()
{
}
// return the node of a given point (mouse coordinate)
CNode* CRangeNode::GetNodeFromPoint(CDC* pDC, CRect& rect, CPoint point)
{
CRect contentRect(0,0,0,0);
CRect leftRect(0,0,0,0);
CRect rightRect(0,0,0,0);
CNode* pNode=NULL;
if(m_pLeftChild)
leftRect=m_pLeftChild->GetRect(pDC);
contentRect=GetContentRect(pDC);
if(m_pRightChild)
rightRect=m_pRightChild->GetRect(pDC);
TransformRects(rect, leftRect, rightRect, contentRect);
if(rightRect.PtInRect(point))
if(m_pRightChild)
{
pNode=m_pRightChild->GetNodeFromPoint(pDC, rightRect, point);
rect=rightRect;
return pNode;
}
if(leftRect.PtInRect(point))
if(m_pLeftChild)
{
pNode=m_pLeftChild->GetNodeFromPoint(pDC, leftRect, point);
rect=leftRect;
return pNode;
}
return NULL;
}
void CRangeNode::TransformRects(CRect& rect, CRect& leftRect, CRect& rightRect, CRect& contentRect)
{
int nTop= rect.top;
int nLeft= rect.left;
leftRect.OffsetRect(nLeft, nTop);
nTop+=leftRect.Height()+1;
m_nBaseLine=nTop; // here the top level of the content of the parent
contentRect.OffsetRect(nLeft, nTop);
nTop+=contentRect.Height()+1;
rightRect.OffsetRect(nLeft, nTop);
nTop+=rightRect.Height()+1;
rect.right=rect.left+ternary_max(leftRect.Width(), contentRect.Width(), rightRect.Width());
rect.bottom=nTop;
contentRect=CRect(0,0,0,0);
//CenterRectHorz(contentRect,rect);
CenterRectHorz(leftRect,rect);
CenterRectHorz(rightRect,rect);
}
CRect CRangeNode::GetContentRect(CDC* pDC)
{
if(m_pParent)
return m_pParent->GetContentRect(pDC);
else
return CRect(0,0,0,0);
}
void CRangeNode::DrawContent(CDC* pDC, CRect rect, DWORD dwSelect)
{
}
//=======================================================
CIntegrandNode::CIntegrandNode()
{
m_strNodeType=NT_INTEGRAND;
m_strShortCut="d";
m_strName="integrand";
m_nAssociativityLevel=-1;
m_dwEditMode &= ~NE_ALLOWDELETE;// strip NE_ALLOWDELETE flag
m_strCodeFormat [LT_FORTRAN]=_T("%s%s %s");
m_strKeyWord [LT_FORTRAN]=_T(",");
}
CIntegrandNode::~CIntegrandNode()
{
}
//=======================================================
CIntegralNode::CIntegralNode()
{
m_strNodeType=NT_INTEGRAL;
m_straShortCuts.SetSize(0,1);
m_straFontNames.SetSize(0,1);
m_straShortCuts.Add("�");
m_straFontNames.Add("Symbol");
m_straShortCuts.Add("�");
m_straFontNames.Add("Symbol");
m_straShortCuts.Add("�");
m_straFontNames.Add("Symbol");
m_straShortCuts.Add("��");
m_straFontNames.Add("Symbol");
m_straShortCuts.Add("��");
m_straFontNames.Add("Symbol");
m_straShortCuts.Add("��");
m_straFontNames.Add("Symbol");
m_straShortCuts.Add("���");
m_straFontNames.Add("Symbol");
m_straShortCuts.Add("���");
m_straFontNames.Add("Symbol");
m_straShortCuts.Add("���");
m_straFontNames.Add("Symbol");
m_lf.lfHeight=GetFormat()->m_nFontHeight[FH_SYMBOL]*10;
m_nType=0;
m_strShortCut="";
m_strName="Integral";
m_nAssociativityLevel=-1;
m_strCodeFormat [LT_FORTRAN]=_T("INT(%s %s %s)");
m_strKeyWord [LT_FORTRAN]=_T(",");
m_pLeftChild=(CNode*) (new CRangeNode(this));
}
CIntegralNode::~CIntegralNode()
{
}
// return the node of a given point (mouse coordinate)
/*CNode* CIntegralNode::GetNodeFromPoint(CDC* pDC, CRect& rect, CPoint point)
{
CRect contentRect(0,0,0,0);
CRect leftRect(0,0,0,0);
CRect rightRect(0,0,0,0);
CNode* pNode=NULL;
if(m_pLeftChild)
leftRect=m_pLeftChild->GetRect(pDC);
contentRect=GetContentRect(pDC);
if(m_pRightChild)
rightRect=m_pRightChild->GetRect(pDC);
TransformRects(rect, leftRect, rightRect, contentRect);
if(rightRect.PtInRect(point))
if(m_pRightChild)
{
pNode=m_pRightChild->GetNodeFromPoint(pDC, rightRect, point);
rect=rightRect;
return pNode;
}
if(contentRect.PtInRect(point))
{
rect=contentRect;
return this;
}
if(leftRect.PtInRect(point))
if(m_pLeftChild)
{
pNode=m_pLeftChild->GetNodeFromPoint(pDC, leftRect, point);
rect=leftRect;
return pNode;
}
return this;
}*/
void CIntegralNode::FormatNode(CBinTreeFormat* pFormat)
{
CNode::FormatNode(pFormat);
m_lf.lfHeight=pFormat->m_nFontHeight[m_nSubLevel > 1 ? FH_SUB_SYMBOL : FH_SYMBOL+m_nSubLevel]*10;
}
void CIntegralNode::TransformRects(CRect& rect, CRect& leftRect, CRect& rightRect, CRect& contentRect)
{
int nTop= rect.top;
int nLeft= rect.left;
int nRightBaseLine=0;
int nOffset=0;
if(rightRect.Height() && m_pRightChild!=NULL)
nRightBaseLine=m_pRightChild->m_nBaseLine;
nOffset=m_pLeftChild->m_nBaseLine+contentRect.Height()/2;
if(nRightBaseLine>nOffset)
{
leftRect.OffsetRect(nLeft, nTop+(nRightBaseLine-nOffset));
m_pLeftChild->m_nBaseLine+=(nRightBaseLine-nOffset);
}
else
{
leftRect.OffsetRect(nLeft, nTop);
}
if(m_pLeftChild)
{
contentRect.OffsetRect(nLeft, nTop+m_pLeftChild->m_nBaseLine);
CenterRectHorz(contentRect, leftRect);
nLeft+=leftRect.Width()+1;
}
else
{
contentRect.OffsetRect(nLeft, nTop);
nLeft+=contentRect.Width()+1;
}
if(nRightBaseLine>nOffset)
{
rightRect.OffsetRect(nLeft, nTop);
}
else
{
rightRect.OffsetRect(nLeft, nTop+nOffset-nRightBaseLine);
}
nLeft+=rightRect.Width()+1;
rect.right=nLeft;
rect.bottom=rect.top+(leftRect |rightRect).Height();
m_nBaseLine=contentRect.top-rect.top+contentRect.Height()/2;
}
CRect CIntegralNode::GetContentRect(CDC* pDC)
{
SetFaceName(m_straFontNames.GetAt(m_nType));
m_strShortCut=m_straShortCuts.GetAt(m_nType);
return CNode::GetContentRect(pDC);
}
void CIntegralNode::DrawContent(CDC* pDC, CRect rect, DWORD dwSelect)
{
m_strShortCut=m_straShortCuts.GetAt(m_nType);
SetFaceName(m_straFontNames.GetAt(m_nType));
CFont ctrlFont;
ctrlFont.CreatePointFontIndirect
(
&m_lf,
pDC
);
CFont* pOldFont=pDC->SelectObject(&ctrlFont);
pDC->DrawText(m_strShortCut, rect, DT_NOCLIP | DT_NOPREFIX | DT_SINGLELINE | DT_CENTER | DT_BOTTOM);
pDC->SelectObject(pOldFont);
ctrlFont.DeleteObject();
}
void CIntegralNode::Serialize(CArchive& ar, CBinTree* pTree)
{
CString strType;
CNode* pRightChild=NULL;
if (ar.IsStoring())
{
if(m_pLeftChild)
{
strType=m_pLeftChild->GetNodeType();
ar << strType;
m_pLeftChild->Serialize(ar, pTree);
}
else
{
strType="";
ar << strType;
}
if(m_pRightChild)
{
strType=m_pRightChild->GetNodeType();
ar << strType;
m_pRightChild->Serialize(ar, pTree);
}
else
{
strType="";
ar << strType;
}
ar << m_dwEditMode;
ar << m_nAssociativityLevel;
ar << m_nSubLevel;
ar << m_nSubLevelLeftInc;
ar << m_nSubLevelRightInc;
ar << m_strNodeType;
ar << m_strShortCut;
ar << m_strName;
ar << m_crColor;
ar << m_NodeRect;
ar << m_nBaseLine;
ar << m_nType;
}
else
{
ar >> strType;
if(strType!="")
{
m_pLeftChild->Serialize(ar, pTree);
}
ar >> strType;
if(strType!="")
{
if(m_pRightChild)
delete m_pRightChild;
pRightChild=pTree->CreateNode(strType);
pRightChild->Serialize(ar, pTree);
}
ar >> m_dwEditMode;
ar >> m_nAssociativityLevel;
ar >> m_nSubLevel;
ar >> m_nSubLevelLeftInc;
ar >> m_nSubLevelRightInc;
ar >> m_strNodeType;
ar >> m_strShortCut;
ar >> m_strName;
ar >> m_crColor;
ar >> m_NodeRect;
ar >> m_nBaseLine;
ar >> m_nType;
SetRightChild(pRightChild);
}
}
//////////////////
//CExtFuncNode, not used yet
CExtFuncNode::CExtFuncNode()
{
}
CExtFuncNode::~CExtFuncNode()
{
}
//////////////////
//CUserFuncNode
CUserFuncNode::CUserFuncNode()
{
m_strNodeType=NT_USERFUNC;
m_nType=0;
m_strShortCut="f";
m_strName="user function";
m_nAssociativityLevel=-1;
m_dwEditMode |= NE_ALLOWEDIT;
m_strCodeFormat [LT_FORTRAN]=_T("%s%s%s");
}
CUserFuncNode::~CUserFuncNode()
{
}
//=======================================================
CFuncNode::CFuncNode()
{
m_strNodeType=NT_FUNC;
// name of function and clamps typ from database
m_straShortCuts.SetSize(0,1);
m_straFontNames.SetSize(0,1);
m_straShortCuts.Add("sin");
m_straFontNames.Add("Times New Roman"); //0
m_straKeyWords[LT_FORTRAN].Add(_T("SIN"));
m_straShortCuts.Add("cos");
m_straFontNames.Add("Times New Roman"); //1
m_straKeyWords[LT_FORTRAN].Add(_T("COS"));
m_straShortCuts.Add("tan");
m_straFontNames.Add("Times New Roman"); //2
m_straKeyWords[LT_FORTRAN].Add(_T("TAN"));
m_straShortCuts.Add("cot");
m_straFontNames.Add("Times New Roman"); //3
m_straKeyWords[LT_FORTRAN].Add(_T("COTAN"));
m_straShortCuts.Add("arcsin");
m_straFontNames.Add("Times New Roman"); //4
m_straKeyWords[LT_FORTRAN].Add(_T("ASIN"));
m_straShortCuts.Add("arccos");
m_straFontNames.Add("Times New Roman"); //5
m_straKeyWords[LT_FORTRAN].Add(_T("ACOS"));
m_straShortCuts.Add("arctan");
m_straFontNames.Add("Times New Roman"); //6
m_straKeyWords[LT_FORTRAN].Add(_T("ATAN"));
m_straShortCuts.Add("arccot");
m_straFontNames.Add("Times New Roman"); //7
m_straKeyWords[LT_FORTRAN].Add(_T("3.141592654D0/2.0D0-ATAN"));
m_straShortCuts.Add("sinh");
m_straFontNames.Add("Times New Roman"); //8
m_straKeyWords[LT_FORTRAN].Add(_T("SINH"));
m_straShortCuts.Add("cosh");
m_straFontNames.Add("Times New Roman"); //9
m_straKeyWords[LT_FORTRAN].Add(_T("COSH"));
m_straShortCuts.Add("tanh");
m_straFontNames.Add("Times New Roman"); //10
m_straKeyWords[LT_FORTRAN].Add(_T("TANH"));
m_straShortCuts.Add("coth");
m_straFontNames.Add("Times New Roman"); //11
m_straKeyWords[LT_FORTRAN].Add(_T("1.0D0/TANH"));
m_straShortCuts.Add("arsinh");
m_straFontNames.Add("Times New Roman"); //12
m_straKeyWords[LT_FORTRAN].Add(_T("ASINH"));
m_straShortCuts.Add("arcosh");
m_straFontNames.Add("Times New Roman"); //13
m_straKeyWords[LT_FORTRAN].Add(_T("ACOSH"));
m_straShortCuts.Add("artanh");
m_straFontNames.Add("Times New Roman"); //14
m_straKeyWords[LT_FORTRAN].Add(_T("ATANH"));
m_straShortCuts.Add("arcoth");
m_straFontNames.Add("Times New Roman"); //15
m_straKeyWords[LT_FORTRAN].Add(_T("ACOTANH"));
m_straShortCuts.Add("exp");
m_straFontNames.Add("Times New Roman"); //16
m_straKeyWords[LT_FORTRAN].Add(_T("EXP"));
m_straShortCuts.Add("ln");
m_straFontNames.Add("Times New Roman"); //17
m_straKeyWords[LT_FORTRAN].Add(_T("LOG"));
m_straShortCuts.Add("log2");
m_straFontNames.Add("Times New Roman"); //18
m_straKeyWords[LT_FORTRAN].Add(_T("LOG2"));
m_straShortCuts.Add("log10");
m_straFontNames.Add("Times New Roman"); //19
m_straKeyWords[LT_FORTRAN].Add(_T("LOG10"));
m_straShortCuts.Add("G");
m_straFontNames.Add("Symbol"); //20
m_straKeyWords[LT_FORTRAN].Add(_T("GAMMA"));
m_nType=0;
m_strShortCut="";
m_strName="function";
m_nAssociativityLevel=-1;
m_strCodeFormat [LT_FORTRAN]=_T("%s%s%s");
}
// Set the Font properties of the node
void CFuncNode::FormatNode(CBinTreeFormat* pFormat)
{
CNode::FormatNode(pFormat);
CString strFaceName=pFormat->m_FormatMap[m_strNodeType]->m_strFaceName;
m_straFontNames.SetAt(0, strFaceName);
m_straFontNames.SetAt(1, strFaceName);
m_straFontNames.SetAt(2, strFaceName);
m_straFontNames.SetAt(3, strFaceName);
m_straFontNames.SetAt(4, strFaceName);
m_straFontNames.SetAt(5, strFaceName);
m_straFontNames.SetAt(6, strFaceName);
m_straFontNames.SetAt(7, strFaceName);
m_straFontNames.SetAt(8, strFaceName);
m_straFontNames.SetAt(9, strFaceName);
m_straFontNames.SetAt(10, strFaceName);
m_straFontNames.SetAt(11, strFaceName);
m_straFontNames.SetAt(12, strFaceName);
m_straFontNames.SetAt(13, strFaceName);
m_straFontNames.SetAt(14, strFaceName);
m_straFontNames.SetAt(15, strFaceName);
m_straFontNames.SetAt(16, strFaceName);
m_straFontNames.SetAt(17, strFaceName);
m_straFontNames.SetAt(18, strFaceName);
m_straFontNames.SetAt(19, strFaceName);
m_straFontNames.SetAt(20, "Symbol");
}
CFuncNode::~CFuncNode()
{
}
void CFuncNode::TransformRects(CRect& rect, CRect& leftRect, CRect& rightRect, CRect& contentRect)
{
CNode::TransformRects(rect, leftRect, rightRect, contentRect);
}
CRect CFuncNode::GetContentRect(CDC* pDC)
{
if(m_nType!=-1)
{
SetFaceName(m_straFontNames.GetAt(m_nType));
m_strShortCut=m_straShortCuts.GetAt(m_nType);
}
return CNode::GetContentRect(pDC);
}
void CFuncNode::DrawContent(CDC* pDC, CRect rect, DWORD dwSelect)
{
if(m_nType!=-1)
{
m_strShortCut=m_straShortCuts.GetAt(m_nType);
SetFaceName(m_straFontNames.GetAt(m_nType));
}
CFont ctrlFont;
ctrlFont.CreatePointFontIndirect
(
&m_lf,
pDC
);
CFont* pOldFont=pDC->SelectObject(&ctrlFont);
pDC->DrawText(m_strShortCut, rect, DT_NOCLIP | DT_NOPREFIX | DT_SINGLELINE | DT_LEFT | DT_BOTTOM);
pDC->SelectObject(pOldFont);
ctrlFont.DeleteObject();
}
//=======================================================
CPoisonNode::CPoisonNode()
{
m_strNodeType=NT_POISON;
m_nType=0;
m_nAssociativityLevel=-1;
}
CPoisonNode::~CPoisonNode()
{
}
void CPoisonNode::DrawContent(CDC* pDC, CRect rect, DWORD dwSelect)
{
CBraceNode::DrawContent(pDC, rect, dwSelect);
}
//=======================================================
CIndexNode::CIndexNode(CNode* pParent)
{
m_strNodeType=NT_INDEX;
m_pParent=pParent;
m_nAssociativityLevel= 1;
m_dwEditMode &= ~NE_ALLOWDELETE;// strip NE_ALLOWDELETE flag
m_nSubLevelRightInc=1;
m_nSubLevelLeftInc=1;
m_strCodeFormat [LT_FORTRAN]=_T("_%s_%s%s");
m_strKeyWord [LT_FORTRAN]=_T("");
}
CIndexNode::~CIndexNode()
{
}
void CIndexNode::TransformRects(CRect& rect, CRect& leftRect, CRect& rightRect, CRect& contentRect)
{
int nTop= rect.top;
int nLeft= rect.left;
leftRect.OffsetRect(nLeft, nTop);
nTop+=leftRect.Height()+1;
m_nBaseLine=leftRect.Height()+2;
rightRect.OffsetRect(nLeft, nTop);
nTop+=rightRect.Height()+1;
rect.right=rect.left+max(leftRect.Width(), rightRect.Width());
rect.bottom=nTop;
contentRect=CRect(0,0,0,0);
}
CRect CIndexNode::GetContentRect(CDC* pDC)
{
return CRect(0,0,0,0);
}
void CIndexNode::DrawContent(CDC* pDC, CRect rect, DWORD dwSelect)
{
}
//=======================================================
CVectorNode::CVectorNode()
{
m_strNodeType=NT_VECTOR;
m_nType=0;
m_straShortCuts.SetSize(0,1);
m_straFontNames.SetSize(0,1);
m_straShortCuts.Add("�");
m_straFontNames.Add("Symbol");
m_straKeyWords[LT_FORTRAN].Add(_T("_P"));
m_straShortCuts.Add("� �");
m_straFontNames.Add("Symbol");
m_straKeyWords[LT_FORTRAN].Add(_T("_PP"));
m_straShortCuts.Add("���");
m_straFontNames.Add("Symbol");
m_straKeyWords[LT_FORTRAN].Add(_T("_PPP"));
m_straShortCuts.Add("�");
m_straFontNames.Add("Symbol");
m_straKeyWords[LT_FORTRAN].Add(_T("_MEAN"));
m_straShortCuts.Add("�");
m_straFontNames.Add("Symbol");
m_straKeyWords[LT_FORTRAN].Add(_T("_NORM"));
m_straShortCuts.Add("�");
m_straFontNames.Add("Symbol");
m_straKeyWords[LT_FORTRAN].Add(_T("_VEC"));
m_straShortCuts.Add("~");
m_straFontNames.Add("Symbol");
m_straKeyWords[LT_FORTRAN].Add(_T("_WINDED"));
m_straShortCuts.Add("�");
m_straFontNames.Add("Symbol");
m_straKeyWords[LT_FORTRAN].Add(_T("_DOUBLE_WINDED"));
m_lf.lfHeight=GetFormat()->m_nFontHeight[FH_SUB_SUB];
m_strShortCut="";
m_strName="overline";
m_nAssociativityLevel= 1;
m_strCodeFormat [LT_FORTRAN]=_T("%s%s%s");
}
CVectorNode::~CVectorNode()
{
}
void CVectorNode::TransformRects(CRect& rect, CRect& leftRect, CRect& rightRect, CRect& contentRect)
{
int nTop= rect.top;
int nLeft= rect.left;
int nLeftBaseLine=0;
if(leftRect.Height() && m_pLeftChild!=NULL)
nLeftBaseLine=m_pLeftChild->m_nBaseLine;
contentRect.OffsetRect(nLeft, nTop);
nTop+=contentRect.Height()+1;
leftRect.OffsetRect(nLeft, nTop);
nTop+=leftRect.Height()+1;
rect.right=rect.left+max(leftRect.Width(), contentRect.Width());
rect.bottom=nTop;
contentRect.right=rect.right;
CenterRectHorz(leftRect,rect);
CenterRectHorz(contentRect,rect);
m_nBaseLine=contentRect.Height()+nLeftBaseLine+1;
}
CRect CVectorNode::GetContentRect(CDC* pDC)
{
SetFaceName(m_straFontNames.GetAt(m_nType));
m_lf.lfHeight=GetFormat()->m_nFontHeight[FH_SUB_SUB]*10;
m_strShortCut=m_straShortCuts.GetAt(m_nType);
return CNode::GetContentRect(pDC);
}
void CVectorNode::DrawContent(CDC* pDC, CRect rect, DWORD dwSelect)
{
m_strShortCut=m_straShortCuts.GetAt(m_nType);
SetFaceName(m_straFontNames.GetAt(m_nType));
CFont ctrlFont;
ctrlFont.CreatePointFontIndirect
(
&m_lf,
pDC
);
CFont* pOldFont=pDC->SelectObject(&ctrlFont);
if (m_nType ==3 || m_nType ==5)
{
pDC->DrawText(m_strShortCut, rect, DT_NOCLIP | DT_NOPREFIX | DT_SINGLELINE | DT_RIGHT| DT_BOTTOM);
pDC->MoveTo(CPoint(rect.left, rect.top+(rect.bottom-rect.top)/2+1));
pDC->LineTo(CPoint(rect.right-m_lf.lfHeight/10, rect.top+(rect.bottom-rect.top)/2+1));
}
else if (m_nType ==4)
{
pDC->DrawText(m_strShortCut, rect, DT_NOCLIP | DT_NOPREFIX | DT_SINGLELINE | DT_RIGHT| DT_BOTTOM);
pDC->MoveTo(CPoint(rect.left, rect.top+(rect.bottom-rect.top)/2+1));
pDC->LineTo(CPoint(rect.right-m_lf.lfHeight/10, rect.top+(rect.bottom-rect.top)/2+1));
pDC->MoveTo(CPoint(rect.left, rect.top+(rect.bottom-rect.top)/2+5));
pDC->LineTo(CPoint(rect.right+1, rect.top+(rect.bottom-rect.top)/2+5));
}
else
pDC->DrawText(m_strShortCut, rect, DT_NOCLIP | DT_NOPREFIX | DT_SINGLELINE | DT_CENTER| DT_BOTTOM);
pDC->SelectObject(pOldFont);
ctrlFont.DeleteObject();
}
//=======================================================
CLimesNode::CLimesNode()
{
m_strNodeType=NT_LIMES;
m_strShortCut="lim";
m_strName="lim";
m_nAssociativityLevel=1;
m_nSubLevelLeftInc=1;
m_strCodeFormat [LT_FORTRAN]=_T("LIMES(%s %s %s)");
m_strKeyWord [LT_FORTRAN]=_T(",");
}
CLimesNode::~CLimesNode()
{
}
void CLimesNode::TransformRects(CRect& rect, CRect& leftRect, CRect& rightRect, CRect& contentRect)
{
int nTop= rect.top;
int nLeft= rect.left;
int nRightBaseLine=0;
int nContentBaseLine=0;
int nOffset=0;
nContentBaseLine=contentRect.Height()/2;
nRightBaseLine=0;
if(rightRect.Height() && m_pRightChild!=NULL)
nRightBaseLine=m_pRightChild->m_nBaseLine;
if(nRightBaseLine>nContentBaseLine)
{
contentRect.OffsetRect(nLeft, nTop+nRightBaseLine-nContentBaseLine);
nTop+=contentRect.Height()+nRightBaseLine-nContentBaseLine+1;
}
else
{
contentRect.OffsetRect(nLeft, nTop);
nTop+=contentRect.Height()+1;
}
leftRect.OffsetRect(nLeft, nTop);
nTop+=leftRect.Height()+1;
rect.right=rect.left+max(leftRect.Width(), contentRect.Width());
CenterRectHorz(leftRect,rect);
CenterRectHorz(contentRect,rect);
if(nRightBaseLine>nContentBaseLine)
{
rightRect.OffsetRect(rect.right+1, rect.top);
}
else
{
rightRect.OffsetRect(rect.right+1, rect.top+nContentBaseLine-nRightBaseLine);
}
rect.right+=rightRect.Width()+1;
rect.bottom=rect.top+(contentRect | rightRect | leftRect).Height();
m_nBaseLine=contentRect.top-rect.top+contentRect.Height()/2;
}
CRect CLimesNode::GetContentRect(CDC* pDC)
{
return CNode::GetContentRect(pDC);
}
void CLimesNode::DrawContent(CDC* pDC, CRect rect, DWORD dwSelect)
{
CNode::DrawContent(pDC, rect, dwSelect);
}
//=======================================================
COperatorNode::COperatorNode()
{
m_strNodeType=NT_OPERATOR;
m_strShortCut="�";
m_strName="->";
m_nType=0;
m_nAssociativityLevel=1;
m_lf.lfHeight=GetFormat()->m_nFontHeight[FH_SUB]*10;
m_strCodeFormat [LT_FORTRAN]=_T("%s %s %s");
m_strKeyWord [LT_FORTRAN]=_T(",");
}
COperatorNode::~COperatorNode()
{
}
//=======================================================
CArrowNode::CArrowNode()
{
m_strNodeType=NT_ARROWS;
m_nType=0;
m_straShortCuts.SetSize(0,1);
m_straFontNames.SetSize(0,1);
m_straShortCuts.Add("�");
m_straFontNames.Add("Symbol");
m_straShortCuts.Add("�");
m_straFontNames.Add("Symbol");
m_straShortCuts.Add("�");
m_straFontNames.Add("Symbol");
m_straShortCuts.Add("�");
m_straFontNames.Add("Symbol");
m_straShortCuts.Add("�");
m_straFontNames.Add("Symbol");
m_straShortCuts.Add("b");
m_straFontNames.Add("MT Extra");
m_straShortCuts.Add("�");
m_straFontNames.Add("Symbol");
m_straShortCuts.Add("�");
m_straFontNames.Add("Symbol");
m_straShortCuts.Add("�");
m_straFontNames.Add("Symbol");
m_straShortCuts.Add("�");
m_straFontNames.Add("Symbol");
m_straShortCuts.Add("�");
m_straFontNames.Add("Symbol");
m_straShortCuts.Add("c");
m_straFontNames.Add("MT Extra");
m_strShortCut="";
m_strName="arrow";
m_nAssociativityLevel=1;
m_lf.lfHeight=GetFormat()->m_nFontHeight[FH_SUB]*10;
}
CArrowNode::~CArrowNode()
{
}
void CArrowNode::TransformRects(CRect& rect, CRect& leftRect, CRect& rightRect, CRect& contentRect)
{
CNode::TransformRects(rect, leftRect, rightRect, contentRect);
}
CRect CArrowNode::GetContentRect(CDC* pDC)
{
SetFaceName(m_straFontNames.GetAt(m_nType));
m_strShortCut=m_straShortCuts.GetAt(m_nType);
return CNode::GetContentRect(pDC);
}
void CArrowNode::DrawContent(CDC* pDC, CRect rect, DWORD dwSelect)
{
m_strShortCut=m_straShortCuts.GetAt(m_nType);
SetFaceName(m_straFontNames.GetAt(m_nType));
CFont ctrlFont;
ctrlFont.CreatePointFontIndirect
(
&m_lf,
pDC
);
CFont* pOldFont=pDC->SelectObject(&ctrlFont);
pDC->DrawText(m_strShortCut, rect, DT_NOCLIP | DT_NOPREFIX | DT_SINGLELINE | DT_CENTER | DT_BOTTOM);
pDC->SelectObject(pOldFont);
ctrlFont.DeleteObject();
}
//=======================================================
CBinomialNode::CBinomialNode()
{
m_strNodeType=NT_BINOMIAL;
m_nAssociativityLevel=1;
}
CBinomialNode::~CBinomialNode()
{
}
void CBinomialNode::TransformRects(CRect& rect, CRect& leftRect, CRect& rightRect, CRect& contentRect)
{
int nTop= rect.top;
int nLeft= rect.left;
leftRect.OffsetRect(nLeft, nTop);
nTop+=leftRect.Height()+1;
contentRect.OffsetRect(nLeft, nTop);
nTop+=contentRect.Height()+1;
rightRect.OffsetRect(nLeft, nTop);
nTop+=rightRect.Height()+1;
rect.right=rect.left+max(leftRect.Width(), rightRect.Width());
rect.bottom=nTop;
contentRect=CRect(0,0,0,0);
CenterRectHorz(leftRect,rect);
CenterRectHorz(rightRect,rect);
}
CRect CBinomialNode::GetContentRect(CDC* pDC)
{
return CNode::GetContentRect(pDC);
}
void CBinomialNode::DrawContent(CDC* pDC, CRect rect, DWORD dwSelect)
{
}
//=======================================================
CMatrixNode::CMatrixNode()
{
m_strNodeType=NT_MATRIX;
m_nCols=0;
m_nRows=0;
m_nAssociativityLevel=1;
m_strCodeFormat [LT_FORTRAN]=_T("MATRIX(%s%s%s");
m_strKeyWord [LT_FORTRAN]=_T(")");
}
CMatrixNode::~CMatrixNode()
{
}
void CMatrixNode::TransformRects(CRect& rect, CRect& leftRect, CRect& rightRect, CRect& contentRect)
{
int nTop= rect.top;
int nLeft= rect.left;
leftRect.OffsetRect(nLeft, nTop);
nTop+=leftRect.Height()+1;
rightRect.OffsetRect(nLeft, nTop);
nTop+=rightRect.Height()+1;
rect.right=rect.left+ternary_max(leftRect.Width(), contentRect.Width(), rightRect.Width());
rect.bottom=nTop;
contentRect=CRect(0,0,0,0);
CenterRectHorz(leftRect,rect);
CenterRectHorz(rightRect,rect);
}
CRect CMatrixNode::GetContentRect(CDC* pDC)
{
return CRect(0,0,0,0);
}
void CMatrixNode::DrawContent(CDC* pDC, CRect rect, DWORD dwSelect)
{
}
//=======================================================
CLineNode::CLineNode()
{
m_strNodeType=NT_LINE;
m_nCol=0;
m_nRow=0;
m_nAssociativityLevel=1;
m_strCodeFormat [LT_FORTRAN]=_T("%s%s%s)");
m_strKeyWord [LT_FORTRAN]=_T(" LINE(");
}
CLineNode::~CLineNode()
{
}
void CLineNode::TransformRects(CRect& rect, CRect& leftRect, CRect& rightRect, CRect& contentRect)
{
int nTop= rect.top;
int nLeft= rect.left;
rightRect.OffsetRect(nLeft, nTop);
nTop+=rightRect.Height();//+1;
leftRect.OffsetRect(nLeft, nTop);
nTop+=leftRect.Height();//+1;
rect.right=rect.left+ternary_max(leftRect.Width(), contentRect.Width(), rightRect.Width());
rect.bottom=nTop;
CenterRectHorz(leftRect,rect);
CenterRectHorz(rightRect,rect);
}
CRect CLineNode::GetContentRect(CDC* pDC)
{
return CRect(0,0,0,0);
}
void CLineNode::DrawContent(CDC* pDC, CRect rect, DWORD dwSelect)
{
}
//=======================================================
CElementNode::CElementNode()
{
m_strNodeType=NT_ELEMENT;
m_nCol=0;
m_nAssociativityLevel=1;
m_strCodeFormat [LT_FORTRAN]=_T(" ELEMENT(%s%s%s");
m_strKeyWord [LT_FORTRAN]=_T(")");
}
CElementNode::~CElementNode()
{
}
void CElementNode::TransformRects(CRect& rect, CRect& leftRect, CRect& rightRect, CRect& contentRect)
{
int nTop= rect.top;
int nLeft= rect.left;
leftRect.OffsetRect(nLeft, nTop);
nLeft+=leftRect.Width()+1;
contentRect.OffsetRect(nLeft, nTop);
nLeft+=contentRect.Width()+1;
rightRect.OffsetRect(nLeft, nTop);
nLeft+=rightRect.Width();
rect.right=nLeft;
rect.bottom=rect.top+ternary_max(leftRect.Height(), contentRect.Height(), rightRect.Height());
CenterRectVert(leftRect, rect);
CenterRectVert(contentRect, rect);
CenterRectVert(rightRect, rect);
m_nBaseLine=contentRect.top+contentRect.Height()/2;
contentRect=CRect(0,0,0,0);
}
CRect CElementNode::GetContentRect(CDC* pDC)
{
return CRect(0,0,0,0);
}
void CElementNode::DrawContent(CDC* pDC, CRect rect, DWORD dwSelect)
{
}
//=======================================================
CNablaNode::CNablaNode()
{
m_strNodeType=NT_NABLA;
m_strShortCut="�";
m_strName="nabla";
m_nAssociativityLevel=1;
m_lf.lfHeight=GetFormat()->m_nFontHeight[FH_SUB]*10;
m_strCodeFormat [LT_FORTRAN]=_T("%s%s%s");
m_strKeyWord [LT_FORTRAN]=_T("NABLA");
}
CNablaNode::~CNablaNode()
{
}
void CNablaNode::TransformRects(CRect& rect, CRect& leftRect, CRect& rightRect, CRect& contentRect)
{
CNode::TransformRects(rect, leftRect, rightRect, contentRect);
}
CRect CNablaNode::GetContentRect(CDC* pDC)
{
CRect rect=CNode::GetContentRect(pDC);
return rect;
}
void CNablaNode::DrawContent(CDC* pDC, CRect rect, DWORD dwSelect)
{
CNode::DrawContent(pDC, rect, dwSelect);
pDC->MoveTo(rect.left+1, rect.top+(DIV_LINE_OFFSET-1)/2);
pDC->LineTo(rect.right-1, rect.top+(DIV_LINE_OFFSET-1)/2);
pDC->LineTo(rect.right-3, rect.top+(DIV_LINE_OFFSET-1)/2-2);
pDC->LineTo(rect.right-3, rect.top+(DIV_LINE_OFFSET-1)/2);
}
//=======================================================
CLaplaceNode::CLaplaceNode()
{
m_strNodeType=NT_LAPLACE;
m_strShortCut="D";
m_strName="laplace";
m_nAssociativityLevel=1;
m_lf.lfHeight=GetFormat()->m_nFontHeight[FH_SUB]*10;
m_strCodeFormat [LT_FORTRAN]=_T("%s%s_%s");
m_strKeyWord [LT_FORTRAN]=_T("DELTA");
}
CLaplaceNode::~CLaplaceNode()
{
}
//=======================================================
CInfinityNode::CInfinityNode()
{
m_strNodeType=NT_INFINITY;
m_strShortCut="�";
m_strName="infinity";
m_nAssociativityLevel=1;
m_dwEditMode &= ~NE_ALLOWEDIT;
m_strCodeFormat [LT_FORTRAN]=_T("%s%s%s");
m_strKeyWord [LT_FORTRAN]=_T("INFINITY");
}
CInfinityNode::~CInfinityNode()
{
}
//=======================================================
CPlanckNode::CPlanckNode()
{
m_strNodeType=NT_PLANCK;
m_strShortCut="h";
m_strName="planck";
m_nAssociativityLevel=1;
m_dwEditMode &= ~NE_ALLOWEDIT;
m_strCodeFormat [LT_FORTRAN]=_T("%s%s%s");
m_strKeyWord [LT_FORTRAN]=_T("PLANCK");
}
CPlanckNode::~CPlanckNode()
{
}
//=======================================================
CLambdaNode::CLambdaNode()
{
m_strNodeType=NT_LAMBDA;
m_strShortCut="D";
m_strName="Lambda";
m_nAssociativityLevel=1;
m_dwEditMode &= ~NE_ALLOWEDIT;
m_strCodeFormat [LT_FORTRAN]=_T("%s%s%s");
m_strKeyWord [LT_FORTRAN]=_T("LAMBDA");
}
CLambdaNode::~CLambdaNode()
{
}
//=======================================================
CPlusNode::CPlusNode()
{
m_strNodeType=NT_PLUS;
m_nType=0;
m_strShortCut="+";
m_strName="plus";
m_nAssociativityLevel= 6;
m_strCodeFormat [LT_FORTRAN]=_T("%s %s %s");
m_strKeyWord [LT_FORTRAN]=_T("+");
}
CPlusNode::~CPlusNode()
{
}
//=======================================================
CMinusNode::CMinusNode()
{
m_strNodeType=NT_MINUS;
m_nType=0;
m_strShortCut="-";
m_strName="minus";
m_nAssociativityLevel= 6;
m_strCodeFormat [LT_FORTRAN]=_T("%s %s %s");
m_strKeyWord [LT_FORTRAN]=_T("-");
}
CMinusNode::~CMinusNode()
{
}
//=======================================================
CTimesNode::CTimesNode()
{
m_strNodeType=NT_TIMES;
m_nType=0;
m_strShortCut="�";
m_strName="times";
m_nAssociativityLevel= 4;
m_strCodeFormat [LT_FORTRAN]=_T("(%s)%s(%s)");
m_strKeyWord [LT_FORTRAN]=_T("*");
}
CTimesNode::~CTimesNode()
{
}
//=======================================================
CCrossNode::CCrossNode()
{
m_strNodeType=NT_CROSS;
m_nType=0;
m_strShortCut="�";
m_strName="vectorproduct";
m_nAssociativityLevel= 4;
m_strCodeFormat [LT_FORTRAN]=_T("(%s)%s(%s)");
m_strKeyWord [LT_FORTRAN]=_T("VEC_PROD");
}
CCrossNode::~CCrossNode()
{
}
//=======================================================
CLabelNode::CLabelNode()
{
m_strNodeType=NT_LABEL;
m_strShortCut="label";
m_strName="label";
m_nAssociativityLevel= 0;
m_dwEditMode &= ~NE_ALLOWDELETE;
m_dwEditMode |= NE_ALLOWEDIT;
m_nSubLevelRightInc=1;
m_nSubLevelLeftInc=1;
m_strCodeFormat [LT_FORTRAN]=_T("%s%s%s");
m_strKeyWord [LT_FORTRAN]=_T("");
}
CLabelNode::~CLabelNode()
{
}