/**************************************************************
 * 
 * Licensed to the Apache Software Foundation (ASF) under one
 * or more contributor license agreements.  See the NOTICE file
 * distributed with this work for additional information
 * regarding copyright ownership.  The ASF licenses this file
 * to you under the Apache License, Version 2.0 (the
 * "License"); you may not use this file except in compliance
 * with the License.  You may obtain a copy of the License at
 * 
 *   http://www.apache.org/licenses/LICENSE-2.0
 * 
 * Unless required by applicable law or agreed to in writing,
 * software distributed under the License is distributed on an
 * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
 * KIND, either express or implied.  See the License for the
 * specific language governing permissions and limitations
 * under the License.
 * 
 *************************************************************/



 #ifndef MATHTYPE_HXX
#define MATHTYPE_HXX

#include "node.hxx"
#include "eqnolefilehdr.hxx"

#include <sot/storage.hxx>

#include <set>

class SfxMedium;

class MathTypeFont
{
public:
	sal_uInt8 nTface;
	sal_uInt8 nStyle;
	MathTypeFont() : nTface(0),nStyle(0) {}
	MathTypeFont(sal_uInt8 nFace) : nTface(nFace),nStyle(0) {}
	void AppendStyleToText(String &rS);
};

struct LessMathTypeFont
{
	sal_Bool operator() (const MathTypeFont &rValue1,
		const MathTypeFont &rValue2) const
	{
		return rValue1.nTface < rValue2.nTface;
	}
};

typedef ::std::set< MathTypeFont, LessMathTypeFont > MathTypeFontSet;

class MathType
{
public:
    MathType(String &rIn) : 
        rRet(rIn), nHAlign(0), nVAlign(0), nDefaultSize(12),
        nLSize(0), nDSize(0), nCurSize(0), nLastSize(0), bIsSilent(sal_False)
	{
		Init();
	}

    MathType(String &rIn,SmNode *pIn) : 
        rRet(rIn), pTree(pIn), nHAlign(2), nVAlign(0), nInsertion(0), nDefaultSize(12),
        nLSize(0), nDSize(0), nCurSize(0), nLastSize(0), nSpec(0), bIsSilent(sal_False)
    {
		Init();
	}
    
    int Parse( SotStorage* pStor );
    int ConvertFromStarMath( SfxMedium& rMedium );
    
private:
/*Ver 2 Header*/
	sal_uInt8 nVersion;
	sal_uInt8 nPlatform;
	sal_uInt8 nProduct;
	sal_uInt8 nProdVersion;
	sal_uInt8 nProdSubVersion;

	SvStorageStream *pS;

	void Init();

    int HandleRecords(int nLevel=0,sal_uInt8 nSelector=0xFF,
        sal_uInt8 nVariation=0xFF,int nRows=0,int nCols=0);
	sal_Bool HandleSize(sal_Int16 nLSize,sal_Int16 nDSize, int &rSetSize);
	void HandleAlign(sal_uInt8 nHAlign,sal_uInt8 nVAlign, int &rSetAlign);
	int HandlePile(int &rSetAlign,int nLevel,sal_uInt8 nSelector,
		sal_uInt8 nVariation);
	int HandleMatrix(int nLevel,sal_uInt8 nSelector,sal_uInt8 nVariarion);
	void HandleMatrixSeperator(int nMatrixRows,int nMatrixCols,int &rCurCol,
		int &rCurRow);
	int HandleTemplate(int nLevel,sal_uInt8 &rSelector,sal_uInt8 &rVariation,
		xub_StrLen &rLastTemplateBracket);
	void HandleEmblishments();
	void HandleSetSize();
	int HandleChar(xub_StrLen &rTextStart,int &rSetSize,int nLevel,
		sal_uInt8 nTag,sal_uInt8 nSelector,sal_uInt8 nVariation,
		sal_Bool bSilent);
	void HandleNudge();
	int xfLMOVE(sal_uInt8 nTest) {return nTest&0x80;}
	int xfAUTO(sal_uInt8 nTest) {return nTest&0x10;}
	int xfEMBELL(sal_uInt8 nTest) {return nTest&0x20;}
	int xfNULL(sal_uInt8 nTest) {return nTest&0x10;}
	int xfLSPACE(sal_uInt8 nTest) {return nTest&0x40;}
	int xfRULER(sal_uInt8 nTest) {return nTest&0x20;}

	sal_uInt8 HandleNodes(SmNode *pNode,int nLevel=0);
	int StartTemplate(sal_uInt16 nSelector,sal_uInt16 nVariation=0);
	void EndTemplate(int nOldPendingAttributes);
	void HandleSmMatrix(SmMatrixNode *pMatrix,int nLevel);
	void HandleTable(SmNode *pNode,int nLevel);
	void HandleRoot(SmNode *pNode,int nLevel);
	void HandleSubSupScript(SmNode *pNode,int nLevel);
	sal_uInt8 HandleCScript(SmNode *pNode,SmNode *pContent,int nLevel,
		sal_uLong *pPos=NULL,sal_Bool bTest=sal_True);
	void HandleFractions(SmNode *pNode,int nLevel);
	void HandleBrace(SmNode *pNode,int nLevel);
	void HandleVerticalBrace(SmNode *pNode,int nLevel);
	void HandleOperator(SmNode *pNode,int nLevel);
	sal_Bool HandleLim(SmNode *pNode,int nLevel);
	void HandleMAlign(SmNode *pNode,int nLevel);
	void HandleMath(SmNode *pNode,int nLevel);
	void HandleText(SmNode *pNode,int nLevel);
	void HandleAttributes(SmNode *pNode,int nLevel);
	void TypeFaceToString(String &rRet,sal_uInt8 nFace);

	String &rRet;
	SmNode *pTree;

	sal_uInt8 nHAlign;
	sal_uInt8 nVAlign;

	int nPendingAttributes;
	sal_uLong nInsertion;

	sal_Int16 aSizeTable[7];
	sal_Int16 nDefaultSize;
	sal_Int16 nLSize;
	sal_Int16 nDSize;
	sal_Int16 nCurSize;
	sal_Int16 nLastSize;
	sal_uInt8 nSpec;
    sal_Bool bIsSilent, bIsReInterpBrace;
	String sPost;
	xub_StrLen nPostSup;
	xub_StrLen nPostlSup;
	sal_uInt8 nTypeFace;
	MathTypeFontSet aUserStyles;

	enum MTOKENS {END,LINE,CHAR,TMPL,PILE,MATRIX,EMBEL,RULER,FONT,SIZE};
	enum MTEMPLATES
	{
		tmANGLE,tmPAREN,tmBRACE,tmBRACK,tmBAR,tmDBAR,tmFLOOR,tmCEILING,
		tmLBLB,tmRBRB,tmRBLB,tmLBRP,tmLPRB,tmROOT,tmFRACT,tmSCRIPT,tmUBAR,
		tmOBAR,tmLARROW,tmRARROW,tmBARROW,tmSINT,tmDINT,tmTINT,tmSSINT,
		tmDSINT,tmTSINT,tmUHBRACE,tmLHBRACE,tmSUM
	};
public:
	static sal_Bool LookupChar(sal_Unicode nChar,String &rRet,
		sal_uInt8 nVersion=3,sal_uInt8 nTypeFace=0);
};


#endif
