Click here to Skip to main content
15,892,005 members
Articles / Desktop Programming / MFC

Formula Editor

Rate me:
Please Sign up or sign in to vote.
4.98/5 (306 votes)
15 Apr 20039 min read 558.9K   14.7K   361  
Formula-editor for editing and exporting mathematical content
/////////////////////////////////////////////////////////////////////////////
//  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()
{
}

By viewing downloads associated with this article you agree to the Terms of Service and the article's licence.

If a file you wish to view isn't highlighted, and is a text file (not binary), please let us know and we'll add colourisation support for it.

License

This article has no explicit license attached to it but may contain usage terms in the article text or the download files themselves. If in doubt please contact the author via the discussion board below.

A list of licenses authors might use can be found here


Written By
tbw
Web Developer
Germany Germany
This member has not yet provided a Biography. Assume it's interesting and varied, and probably something to do with programming.

Comments and Discussions