1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210
|
/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
/*
* This file is part of the LibreOffice project.
*
* This Source Code Form is subject to the terms of the Mozilla Public
* License, v. 2.0. If a copy of the MPL was not distributed with this
* file, You can obtain one at http://mozilla.org/MPL/2.0/.
*
* This file incorporates work covered by the following license notice:
*
* 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 .
*/
#ifndef INCLUDED_STARMATH_SOURCE_MATHTYPE_HXX
#define INCLUDED_STARMATH_SOURCE_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(OUString &rS);
};
struct LessMathTypeFont
{
bool operator() (const MathTypeFont &rValue1,
const MathTypeFont &rValue2) const
{
return rValue1.nTface < rValue2.nTface;
}
};
typedef ::std::set< MathTypeFont, LessMathTypeFont > MathTypeFontSet;
class MathType
{
public:
MathType(OUString &rIn)
: nVersion(0)
, nPlatform(0)
, nProduct(0)
, nProdVersion(0)
, nProdSubVersion(0)
, pS(NULL)
, rRet(rIn)
, pTree(NULL)
, nHAlign(0)
, nVAlign(0)
, nPendingAttributes(0)
, nInsertion(0)
, nDefaultSize(12)
, nLSize(0)
, nDSize(0)
, nCurSize(0)
, nLastSize(0)
, nSpec(0)
, bIsSilent(false)
, bIsReInterpBrace(false)
, nPostSup(0)
, nPostlSup(0)
, nTypeFace(0)
{
Init();
}
MathType(OUString &rIn,SmNode *pIn)
: nVersion(0)
, nPlatform(0)
, nProduct(0)
, nProdVersion(0)
, nProdSubVersion(0)
, pS(NULL)
, rRet(rIn)
, pTree(pIn)
, nHAlign(2)
, nVAlign(0)
, nPendingAttributes(0)
, nInsertion(0)
, nDefaultSize(12)
, nLSize(0)
, nDSize(0)
, nCurSize(0)
, nLastSize(0)
, nSpec(0)
, bIsSilent(false)
, bIsReInterpBrace(false)
, nPostSup(0)
, nPostlSup(0)
, nTypeFace(0)
{
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);
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 HandleMatrixSeparator(int nMatrixRows,int nMatrixCols,int &rCurCol,
int &rCurRow);
int HandleTemplate(int nLevel,sal_uInt8 &rSelector,sal_uInt8 &rVariation,
sal_Int32 &rLastTemplateBracket);
void HandleEmblishments();
void HandleSetSize();
int HandleChar(sal_Int32 &rTextStart,int &rSetSize,int nLevel,
sal_uInt8 nTag,sal_uInt8 nSelector,sal_uInt8 nVariation,
bool bSilent);
void HandleNudge();
int xfLMOVE(sal_uInt8 nTest) const {return nTest&0x80;}
int xfAUTO(sal_uInt8 nTest) const {return nTest&0x10;}
int xfEMBELL(sal_uInt8 nTest) const {return nTest&0x20;}
int xfNULL(sal_uInt8 nTest) const {return nTest&0x10;}
int xfLSPACE(sal_uInt8 nTest) const {return nTest&0x40;}
int xfRULER(sal_uInt8 nTest) const {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,bool bTest=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);
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(OUString &rRet,sal_uInt8 nFace);
OUString &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;
bool bIsSilent, bIsReInterpBrace;
OUString sPost;
sal_Int32 nPostSup;
sal_Int32 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,tmTINTD
};
public:
static bool LookupChar(sal_Unicode nChar,OUString &rRet,
sal_uInt8 nVersion=3,sal_uInt8 nTypeFace=0);
};
#endif
/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
|