Files
core/ASCOfficeDocxFile2/BinWriter/BinWriters.h
2016-12-20 17:55:49 +03:00

7206 lines
261 KiB
C++
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

/*
* (c) Copyright Ascensio System SIA 2010-2016
*
* This program is a free software product. You can redistribute it and/or
* modify it under the terms of the GNU Affero General Public License (AGPL)
* version 3 as published by the Free Software Foundation. In accordance with
* Section 7(a) of the GNU AGPL its Section 15 shall be amended to the effect
* that Ascensio System SIA expressly excludes the warranty of non-infringement
* of any third-party rights.
*
* This program is distributed WITHOUT ANY WARRANTY; without even the implied
* warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. For
* details, see the GNU AGPL at: http://www.gnu.org/licenses/agpl-3.0.html
*
* You can contact Ascensio System SIA at Lubanas st. 125a-25, Riga, Latvia,
* EU, LV-1021.
*
* The interactive user interfaces in modified source and object code versions
* of the Program must display Appropriate Legal Notices, as required under
* Section 5 of the GNU AGPL version 3.
*
* Pursuant to Section 7(b) of the License you must retain the original Product
* logo when distributing the program. Pursuant to Section 7(e) we decline to
* grant you any rights under trademark law for use of our trademarks.
*
* All the Product's GUI elements, including illustrations and icon sets, as
* well as technical writing content are licensed under the terms of the
* Creative Commons Attribution-ShareAlike 4.0 International. See the License
* terms at http://creativecommons.org/licenses/by-sa/4.0/legalcode
*
*/
#ifndef BIN_WRITERS
#define BIN_WRITERS
#include "BinReaderWriterDefines.h"
#include "../DocWrapper/FontProcessor.h"
#include "../../Common/Base64.h"
#include "../../ASCOfficePPTXFile/Editor/FontCutter.h"
#include "../../XlsxSerializerCom/Reader/BinaryWriter.h"
#include "../../Common/DocxFormat/Source/DocxFormat/Docx.h"
#include "../../Common/DocxFormat/Source/MathEquation/MathEquation.h"
#include "BinEquationWriter.h"
namespace BinDocxRW
{
class ParamsWriter {
public:
NSBinPptxRW::CBinaryFileWriter* m_pCBufferedStream;
DocWrapper::FontProcessor* m_pFontProcessor;
NSBinPptxRW::CDrawingConverter* m_pOfficeDrawingConverter;
NSFontCutter::CEmbeddedFontsManager* m_pEmbeddedFontsManager;
OOX::CSettings* m_oSettings;
OOX::CTheme* m_poTheme;
OOX::IFileContainer* m_pCurRels;
CString m_sCurDocumentPath;
std::map<int, bool> m_mapIgnoreComments;
public: ParamsWriter(NSBinPptxRW::CBinaryFileWriter* pCBufferedStream, DocWrapper::FontProcessor* pFontProcessor, NSBinPptxRW::CDrawingConverter* pOfficeDrawingConverter, NSFontCutter::CEmbeddedFontsManager* pEmbeddedFontsManager):
m_pCBufferedStream(pCBufferedStream),m_pFontProcessor(pFontProcessor),m_pOfficeDrawingConverter(pOfficeDrawingConverter),m_pEmbeddedFontsManager(pEmbeddedFontsManager)
{
m_oSettings = NULL;
m_poTheme = NULL;
m_pCurRels = NULL;
}
};
class ParamsDocumentWriter {
public:
OOX::IFileContainer* m_pRels;
CString m_sDocumentPath;
public:
ParamsDocumentWriter(OOX::IFileContainer* pRels, const CString& sDocumentPath):m_pRels(pRels), m_sDocumentPath(sDocumentPath)
{
}
};
class FldStruct{
protected:
int m_nType;
public:
CString m_sFld;
public: FldStruct(CString sFld, int nType):m_sFld(sFld),m_nType(nType){}
public: int GetType()
{
return m_nType;
}
};
class BinaryCommonWriter
{
public:
NSFontCutter::CEmbeddedFontsManager* m_pEmbeddedFontsManager;
NSBinPptxRW::CBinaryFileWriter &m_oStream;
BinaryCommonWriter(ParamsWriter& oParamsWriter):m_oStream(*oParamsWriter.m_pCBufferedStream),m_pEmbeddedFontsManager(oParamsWriter.m_pEmbeddedFontsManager)
{
}
int WriteItemStart(BYTE type)
{
//type
m_oStream.WriteBYTE(type);
return WriteItemWithLengthStart();
}
void WriteItemEnd(int nStart)
{
WriteItemWithLengthEnd(nStart);
}
int WriteItemWithLengthStart()
{
//Запоминаем позицию чтобы в конце записать туда длину
int nStartPos = m_oStream.GetPosition();
m_oStream.Skip(4);
return nStartPos;
}
void WriteItemWithLengthEnd(int nStart)
{
//Length
int nEnd = m_oStream.GetPosition();
m_oStream.SetPosition(nStart);
m_oStream.WriteLONG(nEnd - nStart - 4);
m_oStream.SetPosition(nEnd);
}
void WriteBorder(const BYTE & type, const ComplexTypes::Word::CBorder& border)
{
//if ((border.m_oVal.IsInit()) && (border.m_oVal->GetValue() == SimpleTypes::bordervalueNone)) return;
int nCurPos = WriteItemStart(type);
WriteBorder(border);
WriteItemEnd(nCurPos);
}
void WriteBorder(const ComplexTypes::Word::CBorder& border)
{
if(border.m_oVal.IsInit())
{
if(border.m_oColor.IsInit())
WriteColor(c_oSerBorderType::Color, border.m_oColor.get());
WriteThemeColor(c_oSerBorderType::ColorTheme, border.m_oColor, border.m_oThemeColor, border.m_oThemeTint, border.m_oThemeShade);
if(border.m_oSpace.IsInit())
{
m_oStream.WriteBYTE(c_oSerBorderType::Space);
m_oStream.WriteBYTE(c_oSerPropLenType::Double);
m_oStream.WriteDouble(border.m_oSpace->ToMM());
}
if(border.m_oSz.IsInit())
{
m_oStream.WriteBYTE(c_oSerBorderType::Size);
m_oStream.WriteBYTE(c_oSerPropLenType::Double);
m_oStream.WriteDouble(border.m_oSz->ToMM());
}
//Val
m_oStream.WriteBYTE(c_oSerBorderType::Value);
m_oStream.WriteBYTE(c_oSerPropLenType::Byte);
switch(border.m_oVal.get().GetValue())
{
case SimpleTypes::bordervalueNone:
case SimpleTypes::bordervalueNil:m_oStream.WriteBYTE(border_None);break;
default:m_oStream.WriteBYTE(border_Single);break;
}
}
}
void WriteTblBorders(const OOX::Logic::CTblBorders& Borders)
{
int nCurPos = 0;
//Left
if(Borders.m_oStart.IsInit())
{
WriteBorder(c_oSerBordersType::left, Borders.m_oStart.get());
}
//Top
if(Borders.m_oTop.IsInit())
{
WriteBorder(c_oSerBordersType::top, Borders.m_oTop.get());
}
//Right
if(Borders.m_oEnd.IsInit())
{
WriteBorder(c_oSerBordersType::right, Borders.m_oEnd.get());
}
//Bottom
if(Borders.m_oBottom.IsInit())
{
WriteBorder(c_oSerBordersType::bottom, Borders.m_oBottom.get());
}
//InsideV
if(Borders.m_oInsideV.IsInit())
{
WriteBorder(c_oSerBordersType::insideV, Borders.m_oInsideV.get());
}
//InsideH
if(Borders.m_oInsideH.IsInit())
{
WriteBorder(c_oSerBordersType::insideH, Borders.m_oInsideH.get());
}
}
void WriteTcBorders(const OOX::Logic::CTcBorders& Borders)
{
int nCurPos = 0;
//Left
if(Borders.m_oStart.IsInit())
{
WriteBorder(c_oSerBordersType::left, Borders.m_oStart.get());
}
//Top
if(Borders.m_oTop.IsInit())
{
WriteBorder(c_oSerBordersType::top, Borders.m_oTop.get());
}
//Right
if(Borders.m_oEnd.IsInit())
{
WriteBorder(c_oSerBordersType::right, Borders.m_oEnd.get());
}
//Bottom
if(Borders.m_oBottom.IsInit())
{
WriteBorder(c_oSerBordersType::bottom, Borders.m_oBottom.get());
}
//InsideV
if(Borders.m_oInsideV.IsInit())
{
WriteBorder(c_oSerBordersType::insideV, Borders.m_oInsideV.get());
}
//InsideH
if(Borders.m_oInsideH.IsInit())
{
WriteBorder(c_oSerBordersType::insideH, Borders.m_oInsideH.get());
}
}
void WritePBorders(const OOX::Logic::CPBdr& Borders)
{
int nCurPos = 0;
//Left
if(Borders.m_oLeft.IsInit())
{
WriteBorder(c_oSerBordersType::left, Borders.m_oLeft.get());
}
//Top
if(Borders.m_oTop.IsInit())
{
WriteBorder(c_oSerBordersType::top, Borders.m_oTop.get());
}
//Right
if(Borders.m_oRight.IsInit())
{
WriteBorder(c_oSerBordersType::right, Borders.m_oRight.get());
}
//Bottom
if(Borders.m_oBottom.IsInit())
{
WriteBorder(c_oSerBordersType::bottom, Borders.m_oBottom.get());
}
//Between
if(Borders.m_oBetween.IsInit())
{
WriteBorder(c_oSerBordersType::between, Borders.m_oBetween.get());
}
}
void WriteColor(BYTE type, const SimpleTypes::CHexColor<>& color)
{
if(SimpleTypes::hexcolorRGB == color.GetValue())
{
m_oStream.WriteBYTE(type);
m_oStream.WriteBYTE(c_oSerPropLenType::Three);
m_oStream.WriteBYTE(color.Get_R());
m_oStream.WriteBYTE(color.Get_G());
m_oStream.WriteBYTE(color.Get_B());
}
}
void WriteThemeColor(BYTE type, const nullable<SimpleTypes::CHexColor<>>& oHexColor, const nullable<SimpleTypes::CThemeColor<>>& oThemeColor,
const nullable<SimpleTypes::CUcharHexNumber<>>& oThemeTint, const nullable<SimpleTypes::CUcharHexNumber<>>& oThemeShade)
{
if((oHexColor.IsInit() && SimpleTypes::hexcolorAuto == oHexColor->GetValue()) || oThemeColor.IsInit() || oThemeTint.IsInit() || oThemeShade.IsInit())
{
m_oStream.WriteBYTE(type);
m_oStream.WriteBYTE(c_oSerPropLenType::Variable);
int nCurPos = WriteItemWithLengthStart();
if(oHexColor.IsInit() && SimpleTypes::hexcolorAuto == oHexColor->GetValue())
{
m_oStream.WriteBYTE(c_oSer_ColorThemeType::Auto);
m_oStream.WriteBYTE(c_oSerPropLenType::Null);
}
if(oThemeColor.IsInit())
{
m_oStream.WriteBYTE(c_oSer_ColorThemeType::Color);
m_oStream.WriteBYTE(c_oSerPropLenType::Byte);
m_oStream.WriteBYTE(oThemeColor->GetValue());
}
if(oThemeTint.IsInit())
{
m_oStream.WriteBYTE(c_oSer_ColorThemeType::Tint);
m_oStream.WriteBYTE(c_oSerPropLenType::Byte);
m_oStream.WriteBYTE(oThemeTint->GetValue());
}
if(oThemeShade.IsInit())
{
m_oStream.WriteBYTE(c_oSer_ColorThemeType::Shade);
m_oStream.WriteBYTE(c_oSerPropLenType::Byte);
m_oStream.WriteBYTE(oThemeShade->GetValue());
}
WriteItemWithLengthEnd(nCurPos);
}
}
void WriteShd(const ComplexTypes::Word::CShading& Shd)
{
//Type
if(false != Shd.m_oVal.IsInit())
{
m_oStream.WriteBYTE(c_oSerShdType::Value);
m_oStream.WriteBYTE(c_oSerPropLenType::Byte);
switch(Shd.m_oVal.get().GetValue())
{
case SimpleTypes::shdNil: m_oStream.WriteBYTE(shd_Nil);break;
default: m_oStream.WriteBYTE(shd_Clear);break;
}
}
//Value
if(false != Shd.m_oFill.IsInit())
WriteColor(c_oSerShdType::Color, Shd.m_oFill.get());
WriteThemeColor(c_oSerShdType::ColorTheme, Shd.m_oFill, Shd.m_oThemeFill, Shd.m_oThemeFillTint, Shd.m_oThemeFillShade);
}
void WriteDistance(const NSCommon::nullable<SimpleTypes::CWrapDistance<>>& m_oDistL,
const NSCommon::nullable<SimpleTypes::CWrapDistance<>>& m_oDistT,
const NSCommon::nullable<SimpleTypes::CWrapDistance<>>& m_oDistR,
const NSCommon::nullable<SimpleTypes::CWrapDistance<>>& m_oDistB)
{
//left
if(false != m_oDistL.IsInit())
{
m_oStream.WriteBYTE(c_oSerPaddingType::left);
m_oStream.WriteBYTE(c_oSerPropLenType::Double);
m_oStream.WriteDouble(m_oDistL.get().ToMM());
}
//top
if(false != m_oDistT.IsInit())
{
m_oStream.WriteBYTE(c_oSerPaddingType::top);
m_oStream.WriteBYTE(c_oSerPropLenType::Double);
m_oStream.WriteDouble(m_oDistT.get().ToMM());
}
//Right
if(false != m_oDistR.IsInit())
{
m_oStream.WriteBYTE(c_oSerPaddingType::right);
m_oStream.WriteBYTE(c_oSerPropLenType::Double);
m_oStream.WriteDouble(m_oDistR.get().ToMM());
}
//bottom
if(false != m_oDistB.IsInit())
{
m_oStream.WriteBYTE(c_oSerPaddingType::bottom);
m_oStream.WriteBYTE(c_oSerPropLenType::Double);
m_oStream.WriteDouble(m_oDistB.get().ToMM());
}
}
void WritePaddings(const nullable<SimpleTypes::CTwipsMeasure>& left, const nullable<SimpleTypes::CTwipsMeasure>& top,
const nullable<SimpleTypes::CTwipsMeasure>& right, const nullable<SimpleTypes::CTwipsMeasure>& bottom)
{
//left
if(left.IsInit())
{
m_oStream.WriteBYTE(c_oSerPaddingType::left);
m_oStream.WriteBYTE(c_oSerPropLenType::Double);
m_oStream.WriteDouble(left.get().ToMm());
}
//top
if(top.IsInit())
{
m_oStream.WriteBYTE(c_oSerPaddingType::top);
m_oStream.WriteBYTE(c_oSerPropLenType::Double);
m_oStream.WriteDouble(top.get().ToMm());
}
//Right
if(right.IsInit())
{
m_oStream.WriteBYTE(c_oSerPaddingType::right);
m_oStream.WriteBYTE(c_oSerPropLenType::Double);
m_oStream.WriteDouble(right.get().ToMm());
}
//bottom
if(bottom.IsInit())
{
m_oStream.WriteBYTE(c_oSerPaddingType::bottom);
m_oStream.WriteBYTE(c_oSerPropLenType::Double);
m_oStream.WriteDouble(bottom.get().ToMm());
}
}
void WriteFont(CString& sFontName, BYTE bType, DocWrapper::FontProcessor& m_oFontProcessor)
{
if(!sFontName.IsEmpty())
{
//Подбор шрифтов
sFontName = m_oFontProcessor.getFont(sFontName);
if(NULL != m_pEmbeddedFontsManager)
m_pEmbeddedFontsManager->CheckFont(sFontName, m_oFontProcessor.getFontManager());
m_oStream.WriteBYTE(bType);
m_oStream.WriteBYTE(c_oSerPropLenType::Variable);
m_oStream.WriteStringW(sFontName);
}
}
void WriteBytesArray(BYTE* pData, long nDataSize)
{
int nCurPos = WriteItemWithLengthStart();
m_oStream.WriteBYTEArray(pData, nDataSize);
WriteItemWithLengthEnd(nCurPos);
}
template<typename T> void WriteTrackRevision(const T& elem)
{
int nCurPos = 0;
if(elem.m_sAuthor.IsInit())
{
nCurPos = WriteItemStart(c_oSerProp_RevisionType::Author);
m_oStream.WriteStringW3(elem.m_sAuthor.get());
WriteItemWithLengthEnd(nCurPos);
}
if(elem.m_oDate.IsInit())
{
nCurPos = WriteItemStart(c_oSerProp_RevisionType::Date);
m_oStream.WriteStringW3(elem.m_oDate->ToString());
WriteItemWithLengthEnd(nCurPos);
}
if(elem.m_oId.IsInit())
{
nCurPos = WriteItemStart(c_oSerProp_RevisionType::Id);
m_oStream.WriteLONG(elem.m_oId->GetValue());
WriteItemWithLengthEnd(nCurPos);
}
if(elem.m_sUserId.IsInit())
{
nCurPos = WriteItemStart(c_oSerProp_RevisionType::UserId);
m_oStream.WriteStringW3(elem.m_sUserId.get());
WriteItemWithLengthEnd(nCurPos);
}
}
};
class BinaryHeaderFooterTableWriter
{
BinaryCommonWriter m_oBcw;
ParamsWriter& m_oParamsWriter;
OOX::CSettings* m_oSettings;
OOX::CTheme* m_poTheme;
DocWrapper::FontProcessor& m_oFontProcessor;
NSBinPptxRW::CDrawingConverter* m_pOfficeDrawingConverter;
std::map<int, bool>* m_mapIgnoreComments;
public:
OOX::IFileContainer* m_oDocumentRels;
std::vector<OOX::CHdrFtr*> m_aHeaders;
std::vector<SimpleTypes::EHdrFtr> m_aHeaderTypes;
std::vector<OOX::Logic::CSectionProperty*> m_aHeaderSectPrs;
std::vector<OOX::CHdrFtr*> m_aFooters;
std::vector<SimpleTypes::EHdrFtr> m_aFooterTypes;
std::vector<OOX::Logic::CSectionProperty*> m_aFooterSectPrs;
public:
BinaryHeaderFooterTableWriter(ParamsWriter& oParamsWriter, OOX::IFileContainer* oDocumentRel, std::map<int, bool>* mapIgnoreComments);
void Write();
void WriteHdrFtrContent(std::vector<OOX::CHdrFtr*>& aHdrFtrs, std::vector<SimpleTypes::EHdrFtr>& aHdrFtrTypes, std::vector<OOX::Logic::CSectionProperty*>& aHdrSectPrs, bool bHdr);
void WriteHdrFtrItem(OOX::Logic::CSectionProperty* pSectPr, OOX::CHdrFtr* pHdrFtr, bool bHdr);
};
class BinarySigTableWriter
{
BinaryCommonWriter m_oBcw;
public:
BinarySigTableWriter(ParamsWriter& oParamsWriter):m_oBcw(oParamsWriter)
{
}
void Write()
{
//Write stVersion
m_oBcw.m_oStream.WriteBYTE(c_oSerSigTypes::Version);
m_oBcw.m_oStream.WriteBYTE(c_oSerPropLenType::Long);
m_oBcw.m_oStream.WriteLONG(g_nFormatVersion);
}
};
class Binary_rPrWriter
{
BinaryCommonWriter m_oBcw;
public:
OOX::CTheme* m_poTheme;
NSBinPptxRW::CDrawingConverter* m_pOfficeDrawingConverter;
public:
DocWrapper::FontProcessor& m_oFontProcessor;
public: Binary_rPrWriter(ParamsWriter& oParamsWriter) :m_oBcw(oParamsWriter), m_poTheme(oParamsWriter.m_poTheme), m_oFontProcessor(*oParamsWriter.m_pFontProcessor), m_pOfficeDrawingConverter(oParamsWriter.m_pOfficeDrawingConverter)
{
}
void Write_rPr(const OOX::Logic::CRunProperty& rPr)
{
int nCurPos = 0;
//Bold
if(false != rPr.m_oBold.IsInit())
{
bool bold = SimpleTypes::onoffTrue == rPr.m_oBold.get().m_oVal.GetValue();
m_oBcw.m_oStream.WriteBYTE(c_oSerProp_rPrType::Bold);
m_oBcw.m_oStream.WriteBYTE(c_oSerPropLenType::Byte);
m_oBcw.m_oStream.WriteBOOL(bold);
}
//Italic
if(false != rPr.m_oItalic.IsInit())
{
bool italic = SimpleTypes::onoffTrue == rPr.m_oItalic.get().m_oVal.GetValue();
m_oBcw.m_oStream.WriteBYTE(c_oSerProp_rPrType::Italic);
m_oBcw.m_oStream.WriteBYTE(c_oSerPropLenType::Byte);
m_oBcw.m_oStream.WriteBOOL(italic);
}
//Underline
if(false != rPr.m_oU.IsInit())
{
const ComplexTypes::Word::CUnderline& oU = rPr.m_oU.get();
if(oU.m_oVal.IsInit())
{
m_oBcw.m_oStream.WriteBYTE(c_oSerProp_rPrType::Underline);
m_oBcw.m_oStream.WriteBYTE(c_oSerPropLenType::Byte);
m_oBcw.m_oStream.WriteBOOL(SimpleTypes::underlineNone != oU.m_oVal.get().GetValue());
}
}
//Strikeout
if(false != rPr.m_oStrike.IsInit())
{
m_oBcw.m_oStream.WriteBYTE(c_oSerProp_rPrType::Strikeout);
m_oBcw.m_oStream.WriteBYTE(c_oSerPropLenType::Byte);
m_oBcw.m_oStream.WriteBOOL(SimpleTypes::onoffTrue == rPr.m_oStrike.get().m_oVal.GetValue());
}
//FontFamily
if(false != rPr.m_oRFonts.IsInit())
{
CString sFontAscii;
CString sFontHAnsi;
CString sFontAE;
CString sFontCS;
const ComplexTypes::Word::CFonts& oFont = rPr.m_oRFonts.get();
if(NULL != m_poTheme && oFont.m_oAsciiTheme.IsInit())
{
const SimpleTypes::ETheme& eTheme = oFont.m_oAsciiTheme.get().GetValue();
switch(eTheme)
{
case SimpleTypes::themeMajorAscii:
case SimpleTypes::themeMajorBidi:
case SimpleTypes::themeMajorEastAsia:
case SimpleTypes::themeMajorHAnsi:sFontAscii = m_poTheme->GetMajorFont();break;
case SimpleTypes::themeMinorAscii:
case SimpleTypes::themeMinorBidi:
case SimpleTypes::themeMinorEastAsia:
case SimpleTypes::themeMinorHAnsi:sFontAscii = m_poTheme->GetMinorFont();break;
}
}
else if(oFont.m_sAscii.IsInit())
sFontAscii = oFont.m_sAscii.get();
if(NULL != m_poTheme && oFont.m_oHAnsiTheme.IsInit())
{
const SimpleTypes::ETheme& eTheme = oFont.m_oHAnsiTheme.get().GetValue();
switch(eTheme)
{
case SimpleTypes::themeMajorAscii:
case SimpleTypes::themeMajorBidi:
case SimpleTypes::themeMajorEastAsia:
case SimpleTypes::themeMajorHAnsi:sFontHAnsi = m_poTheme->GetMajorFont();break;
case SimpleTypes::themeMinorAscii:
case SimpleTypes::themeMinorBidi:
case SimpleTypes::themeMinorEastAsia:
case SimpleTypes::themeMinorHAnsi:sFontHAnsi = m_poTheme->GetMinorFont();break;
}
}
else if(oFont.m_sHAnsi.IsInit())
sFontHAnsi = oFont.m_sHAnsi.get();
if(NULL != m_poTheme && oFont.m_oCsTheme.IsInit())
{
const SimpleTypes::ETheme& eTheme = oFont.m_oCsTheme.get().GetValue();
switch(eTheme)
{
case SimpleTypes::themeMajorAscii:
case SimpleTypes::themeMajorBidi:
case SimpleTypes::themeMajorEastAsia:
case SimpleTypes::themeMajorHAnsi:sFontCS = m_poTheme->GetMajorFont();break;
case SimpleTypes::themeMinorAscii:
case SimpleTypes::themeMinorBidi:
case SimpleTypes::themeMinorEastAsia:
case SimpleTypes::themeMinorHAnsi:sFontCS = m_poTheme->GetMinorFont();break;
}
}
else if(oFont.m_sCs.IsInit())
sFontCS = oFont.m_sCs.get();
if(NULL != m_poTheme && oFont.m_oEastAsiaTheme.IsInit())
{
const SimpleTypes::ETheme& eTheme = oFont.m_oEastAsiaTheme.get().GetValue();
switch(eTheme)
{
case SimpleTypes::themeMajorAscii:
case SimpleTypes::themeMajorBidi:
case SimpleTypes::themeMajorEastAsia:
case SimpleTypes::themeMajorHAnsi:sFontAE = m_poTheme->GetMajorFont();break;
case SimpleTypes::themeMinorAscii:
case SimpleTypes::themeMinorBidi:
case SimpleTypes::themeMinorEastAsia:
case SimpleTypes::themeMinorHAnsi:sFontAE = m_poTheme->GetMinorFont();break;
}
}
else if(oFont.m_sEastAsia.IsInit())
sFontAE = oFont.m_sEastAsia.get();
m_oBcw.WriteFont(sFontAscii, c_oSerProp_rPrType::FontAscii, m_oFontProcessor);
m_oBcw.WriteFont(sFontHAnsi, c_oSerProp_rPrType::FontHAnsi, m_oFontProcessor);
m_oBcw.WriteFont(sFontAE, c_oSerProp_rPrType::FontAE, m_oFontProcessor);
m_oBcw.WriteFont(sFontCS, c_oSerProp_rPrType::FontCS, m_oFontProcessor);
//Hint
if(false != oFont.m_oHint.IsInit())
{
m_oBcw.m_oStream.WriteBYTE(c_oSerProp_rPrType::FontHint);
m_oBcw.m_oStream.WriteBYTE(c_oSerPropLenType::Byte);
m_oBcw.m_oStream.WriteBYTE((BYTE)oFont.m_oHint->GetValue());
}
}
//FontSize
if((false != rPr.m_oSz.IsInit()) && (false != rPr.m_oSz.get().m_oVal.IsInit()))
{
m_oBcw.m_oStream.WriteBYTE(c_oSerProp_rPrType::FontSize);
m_oBcw.m_oStream.WriteBYTE(c_oSerPropLenType::Long);
m_oBcw.m_oStream.WriteLONG(rPr.m_oSz.get().m_oVal.get().ToHps());
}
//Color
if(false != rPr.m_oColor.IsInit())
{
if(rPr.m_oColor->m_oVal.IsInit())
m_oBcw.WriteColor(c_oSerProp_rPrType::Color, rPr.m_oColor->m_oVal.get());
m_oBcw.WriteThemeColor(c_oSerProp_rPrType::ColorTheme, rPr.m_oColor->m_oVal, rPr.m_oColor->m_oThemeColor, rPr.m_oColor->m_oThemeTint, rPr.m_oColor->m_oThemeShade);
}
//VertAlign
if(false != rPr.m_oVertAlign.IsInit())
{
m_oBcw.m_oStream.WriteBYTE(c_oSerProp_rPrType::VertAlign);
m_oBcw.m_oStream.WriteBYTE(c_oSerPropLenType::Byte);
switch(rPr.m_oVertAlign.get().m_oVal.get().GetValue())
{
case SimpleTypes::verticalalignrunSuperscript: m_oBcw.m_oStream.WriteBYTE(vertalign_SuperScript);break;
case SimpleTypes::verticalalignrunSubscript: m_oBcw.m_oStream.WriteBYTE(vertalign_SubScript);break;
default: m_oBcw.m_oStream.WriteBYTE(vertalign_Baseline);break;
}
}
//HighLight
if(false != rPr.m_oHighlight.IsInit() || false != rPr.m_oShd.IsInit())
{
if(false != rPr.m_oHighlight.IsInit())
{
const ComplexTypes::Word::CHighlight& oHighlight = rPr.m_oHighlight.get();
if(oHighlight.m_oVal.IsInit())
{
const SimpleTypes::CHighlightColor<>& oHighlightVal = oHighlight.m_oVal.get();
if(SimpleTypes::highlightcolorNone == oHighlightVal.GetValue())
{
m_oBcw.m_oStream.WriteBYTE(c_oSerProp_rPrType::HighLightTyped);
m_oBcw.m_oStream.WriteBYTE(c_oSerPropLenType::Byte);
m_oBcw.m_oStream.WriteBYTE(c_oSer_ColorType::None);
}
else
{
SimpleTypes::CHexColor<> oHexColor(oHighlightVal.Get_R(), oHighlightVal.Get_G(), oHighlightVal.Get_B());
m_oBcw.WriteColor(c_oSerProp_rPrType::HighLight, oHexColor);
}
}
}
}
//Shd
if(false != rPr.m_oShd.IsInit())
{
m_oBcw.m_oStream.WriteBYTE(c_oSerProp_rPrType::Shd);
m_oBcw.m_oStream.WriteBYTE(c_oSerPropLenType::Variable);
nCurPos = m_oBcw.WriteItemWithLengthStart();
m_oBcw.WriteShd(rPr.m_oShd.get());
m_oBcw.WriteItemWithLengthEnd(nCurPos);
}
//RStyle
if(false != rPr.m_oRStyle.IsInit())
{
m_oBcw.m_oStream.WriteBYTE(c_oSerProp_rPrType::RStyle);
m_oBcw.m_oStream.WriteBYTE(c_oSerPropLenType::Variable);
m_oBcw.m_oStream.WriteStringW(rPr.m_oRStyle->ToString2());
}
//Spacing
if(false != rPr.m_oSpacing.IsInit() && false != rPr.m_oSpacing->m_oVal.IsInit())
{
m_oBcw.m_oStream.WriteBYTE(c_oSerProp_rPrType::Spacing);
m_oBcw.m_oStream.WriteBYTE(c_oSerPropLenType::Double);
m_oBcw.m_oStream.WriteDouble(rPr.m_oSpacing->m_oVal->ToMm());
}
//DStrikeout
if(false != rPr.m_oDStrike.IsInit())
{
m_oBcw.m_oStream.WriteBYTE(c_oSerProp_rPrType::DStrikeout);
m_oBcw.m_oStream.WriteBYTE(c_oSerPropLenType::Byte);
m_oBcw.m_oStream.WriteBOOL(rPr.m_oDStrike->m_oVal.ToBool());
}
//Caps
if(false != rPr.m_oCaps.IsInit())
{
m_oBcw.m_oStream.WriteBYTE(c_oSerProp_rPrType::Caps);
m_oBcw.m_oStream.WriteBYTE(c_oSerPropLenType::Byte);
m_oBcw.m_oStream.WriteBOOL(rPr.m_oCaps->m_oVal.ToBool());
}
//SmallCaps
if(false != rPr.m_oSmallCaps.IsInit())
{
m_oBcw.m_oStream.WriteBYTE(c_oSerProp_rPrType::SmallCaps);
m_oBcw.m_oStream.WriteBYTE(c_oSerPropLenType::Byte);
m_oBcw.m_oStream.WriteBOOL(rPr.m_oSmallCaps->m_oVal.ToBool());
}
//Position
if(false != rPr.m_oPosition.IsInit() && false != rPr.m_oPosition->m_oVal.IsInit())
{
m_oBcw.m_oStream.WriteBYTE(c_oSerProp_rPrType::Position);
m_oBcw.m_oStream.WriteBYTE(c_oSerPropLenType::Double);
m_oBcw.m_oStream.WriteDouble(rPr.m_oPosition->m_oVal->ToMm());
}
//BoldCs
if(rPr.m_oBoldCs.IsInit())
{
bool boldCs = SimpleTypes::onoffTrue == rPr.m_oBoldCs.get().m_oVal.GetValue();
m_oBcw.m_oStream.WriteBYTE(c_oSerProp_rPrType::BoldCs);
m_oBcw.m_oStream.WriteBYTE(c_oSerPropLenType::Byte);
m_oBcw.m_oStream.WriteBOOL(boldCs);
}
//ItalicCs
if(rPr.m_oItalicCs.IsInit())
{
bool italicCs = SimpleTypes::onoffTrue == rPr.m_oItalicCs.get().m_oVal.GetValue();
m_oBcw.m_oStream.WriteBYTE(c_oSerProp_rPrType::ItalicCs);
m_oBcw.m_oStream.WriteBYTE(c_oSerPropLenType::Byte);
m_oBcw.m_oStream.WriteBOOL(italicCs);
}
//FontSizeCs
if(rPr.m_oSzCs.IsInit() && rPr.m_oSzCs->m_oVal.IsInit())
{
m_oBcw.m_oStream.WriteBYTE(c_oSerProp_rPrType::FontSizeCs);
m_oBcw.m_oStream.WriteBYTE(c_oSerPropLenType::Long);
m_oBcw.m_oStream.WriteLONG(rPr.m_oSzCs.get().m_oVal.get().ToHps());
}
//Cs
if(false != rPr.m_oCs.IsInit())
{
m_oBcw.m_oStream.WriteBYTE(c_oSerProp_rPrType::Cs);
m_oBcw.m_oStream.WriteBYTE(c_oSerPropLenType::Byte);
m_oBcw.m_oStream.WriteBOOL(rPr.m_oCs->m_oVal.ToBool());
}
//Rtl
if(false != rPr.m_oRtL.IsInit())
{
m_oBcw.m_oStream.WriteBYTE(c_oSerProp_rPrType::Rtl);
m_oBcw.m_oStream.WriteBYTE(c_oSerPropLenType::Byte);
m_oBcw.m_oStream.WriteBOOL(rPr.m_oRtL->m_oVal.ToBool());
}
//Lang
if(false != rPr.m_oLang.IsInit())
{
if(rPr.m_oLang->m_oVal.IsInit())
{
m_oBcw.m_oStream.WriteBYTE(c_oSerProp_rPrType::Lang);
m_oBcw.m_oStream.WriteBYTE(c_oSerPropLenType::Variable);
m_oBcw.m_oStream.WriteStringW(rPr.m_oLang->m_oVal->GetValue());
}
if(rPr.m_oLang->m_oBidi.IsInit())
{
m_oBcw.m_oStream.WriteBYTE(c_oSerProp_rPrType::LangBidi);
m_oBcw.m_oStream.WriteBYTE(c_oSerPropLenType::Variable);
m_oBcw.m_oStream.WriteStringW(rPr.m_oLang->m_oBidi->GetValue());
}
if(rPr.m_oLang->m_oEastAsia.IsInit())
{
m_oBcw.m_oStream.WriteBYTE(c_oSerProp_rPrType::LangEA);
m_oBcw.m_oStream.WriteBYTE(c_oSerPropLenType::Variable);
m_oBcw.m_oStream.WriteStringW(rPr.m_oLang->m_oEastAsia->GetValue());
}
}
//Vanish
if(false != rPr.m_oVanish.IsInit())
{
m_oBcw.m_oStream.WriteBYTE(c_oSerProp_rPrType::Vanish);
m_oBcw.m_oStream.WriteBYTE(c_oSerPropLenType::Byte);
m_oBcw.m_oStream.WriteBOOL(rPr.m_oVanish->m_oVal.ToBool());
}
if (false != rPr.m_sTextOutline.IsInit())
{
CString sTextOutline = rPr.m_sTextOutline.get2();
//делаем replace потому что читать имена node без namespace можем а атрибуты нет, потому что храним их в map
sTextOutline.Replace(_T("w14:"), _T(""));
m_oBcw.m_oStream.WriteBYTE(c_oSerProp_rPrType::TextOutline);
m_oBcw.m_oStream.WriteBYTE(c_oSerPropLenType::Variable);
int nCurPos = m_oBcw.WriteItemWithLengthStart();
m_pOfficeDrawingConverter->GetRecordBinary(XMLWRITER_RECORD_TYPE_TEXT_OUTLINE, sTextOutline);
m_oBcw.WriteItemWithLengthEnd(nCurPos);
}
if (false != rPr.m_sTextFill.IsInit())
{
CString sTextFill = rPr.m_sTextFill.get2();
//делаем replace потому что читать имена node без namespace можем а атрибуты нет, потому что храним их в map
sTextFill.Replace(_T("w14:"), _T(""));
m_oBcw.m_oStream.WriteBYTE(c_oSerProp_rPrType::TextFill);
m_oBcw.m_oStream.WriteBYTE(c_oSerPropLenType::Variable);
int nCurPos = m_oBcw.WriteItemWithLengthStart();
m_pOfficeDrawingConverter->GetRecordBinary(XMLWRITER_RECORD_TYPE_TEXT_FILL, sTextFill);
m_oBcw.WriteItemWithLengthEnd(nCurPos);
}
if(rPr.m_oDel.IsInit())
{
m_oBcw.m_oStream.WriteBYTE(c_oSerProp_rPrType::Del);
m_oBcw.m_oStream.WriteBYTE(c_oSerPropLenType::Variable);
nCurPos = m_oBcw.WriteItemWithLengthStart();
m_oBcw.WriteTrackRevision(rPr.m_oDel.get());
m_oBcw.WriteItemWithLengthEnd(nCurPos);
}
if(rPr.m_oIns.IsInit())
{
m_oBcw.m_oStream.WriteBYTE(c_oSerProp_rPrType::Ins);
m_oBcw.m_oStream.WriteBYTE(c_oSerPropLenType::Variable);
nCurPos = m_oBcw.WriteItemWithLengthStart();
m_oBcw.WriteTrackRevision(rPr.m_oIns.get());
m_oBcw.WriteItemWithLengthEnd(nCurPos);
}
if (rPr.m_oRPrChange.IsInit())
{
m_oBcw.m_oStream.WriteBYTE(c_oSerProp_rPrType::rPrChange);
m_oBcw.m_oStream.WriteBYTE(c_oSerPropLenType::Variable);
nCurPos = m_oBcw.WriteItemWithLengthStart();
Write_rPrChange(rPr.m_oRPrChange.get());
m_oBcw.WriteItemWithLengthEnd(nCurPos);
}
}
void Write_rPrChange(const OOX::Logic::CRPrChange& rPrChange)
{
int nCurPos = 0;
m_oBcw.WriteTrackRevision(rPrChange);
if(rPrChange.m_pRunPr.IsInit())
{
nCurPos = m_oBcw.WriteItemStart(c_oSerProp_RevisionType::rPrChange);
Write_rPr(rPrChange.m_pRunPr.get());
m_oBcw.WriteItemWithLengthEnd(nCurPos);
}
}
};
class Binary_pPrWriter
{
BinaryCommonWriter m_oBcw;
Binary_rPrWriter brPrs;
OOX::CSettings* m_oSettings;
public:
BinaryHeaderFooterTableWriter* m_oBinaryHeaderFooterTableWriter;
public: Binary_pPrWriter(ParamsWriter& oParamsWriter, BinaryHeaderFooterTableWriter* oBinaryHeaderFooterTableWriter):
m_oBcw(oParamsWriter),brPrs(oParamsWriter),m_oSettings(oParamsWriter.m_oSettings),m_oBinaryHeaderFooterTableWriter(oBinaryHeaderFooterTableWriter)
{
}
void Write_pPr(const OOX::Logic::CParagraphProperty& pPr)
{
int nCurPos = 0;
//Стили надо писать первыми, потому что применение стиля при открытии уничтажаются настройки параграфа
//ParaStyle
CString sStyleId;
if(false != pPr.m_oPStyle.IsInit())
{
sStyleId = pPr.m_oPStyle.get().ToString2();
m_oBcw.m_oStream.WriteBYTE(c_oSerProp_pPrType::ParaStyle);
m_oBcw.m_oStream.WriteBYTE(c_oSerPropLenType::Variable);
m_oBcw.m_oStream.WriteStringW(sStyleId);
}
//Списки надо писать после стилей, т.к. при открытии в методах добавления списка проверяются стили
//Списки могут быть заданы с стилях.Это надо учитывать.
//NumPr
if(pPr.m_oNumPr.IsInit() && (pPr.m_oNumPr->m_oNumID.IsInit() || pPr.m_oNumPr->m_oIlvl.IsInit()))
{
m_oBcw.m_oStream.WriteBYTE(c_oSerProp_pPrType::numPr);
m_oBcw.m_oStream.WriteBYTE(c_oSerPropLenType::Variable);
nCurPos = m_oBcw.WriteItemWithLengthStart();
WriteNumPr(pPr.m_oNumPr.get(), pPr);
m_oBcw.WriteItemWithLengthEnd(nCurPos);
}
//ContextualSpacing
if(false != pPr.m_oContextualSpacing.IsInit())
{
m_oBcw.m_oStream.WriteBYTE(c_oSerProp_pPrType::ContextualSpacing);
m_oBcw.m_oStream.WriteBYTE(c_oSerPropLenType::Byte);
m_oBcw.m_oStream.WriteBOOL(SimpleTypes::onoffTrue == pPr.m_oContextualSpacing.get().m_oVal.GetValue());
}
//Ind
if(false != pPr.m_oInd.IsInit())
{
m_oBcw.m_oStream.WriteBYTE(c_oSerProp_pPrType::Ind);
m_oBcw.m_oStream.WriteBYTE(c_oSerPropLenType::Variable);
nCurPos = m_oBcw.WriteItemWithLengthStart();
WriteInd(pPr.m_oInd.get());
m_oBcw.WriteItemWithLengthEnd(nCurPos);
}
//Jc
if(false != pPr.m_oJc.IsInit())
{
const ComplexTypes::Word::CJc& oJc = pPr.m_oJc.get();
if(oJc.m_oVal.IsInit())
{
const SimpleTypes::CJc<>& oEJc = oJc.m_oVal.get();
m_oBcw.m_oStream.WriteBYTE(c_oSerProp_pPrType::Jc);
m_oBcw.m_oStream.WriteBYTE(c_oSerPropLenType::Byte);
switch(oEJc.GetValue())
{
case SimpleTypes::jcCenter: m_oBcw.m_oStream.WriteBYTE(align_Center);break;
case SimpleTypes::jcStart:
case SimpleTypes::jcLeft: m_oBcw.m_oStream.WriteBYTE(align_Left);break;
case SimpleTypes::jcEnd:
case SimpleTypes::jcRight: m_oBcw.m_oStream.WriteBYTE(align_Right);break;
case SimpleTypes::jcBoth:
case SimpleTypes::jcThaiDistribute:
case SimpleTypes::jcDistribute: m_oBcw.m_oStream.WriteBYTE(align_Justify);break;
default: m_oBcw.m_oStream.WriteBYTE(align_Left);break;
}
}
}
//KeepLines
if(false != pPr.m_oKeepLines.IsInit())
{
m_oBcw.m_oStream.WriteBYTE(c_oSerProp_pPrType::KeepLines);
m_oBcw.m_oStream.WriteBYTE(c_oSerPropLenType::Byte);
m_oBcw.m_oStream.WriteBOOL(SimpleTypes::onoffTrue == pPr.m_oKeepLines.get().m_oVal.GetValue());
}
//KeepNext
if(false != pPr.m_oKeepNext.IsInit())
{
m_oBcw.m_oStream.WriteBYTE(c_oSerProp_pPrType::KeepNext);
m_oBcw.m_oStream.WriteBYTE(c_oSerPropLenType::Byte);
m_oBcw.m_oStream.WriteBOOL(SimpleTypes::onoffTrue == pPr.m_oKeepNext.get().m_oVal.GetValue());
}
//PageBreakBefore
if(false != pPr.m_oPageBreakBefore.IsInit())
{
m_oBcw.m_oStream.WriteBYTE(c_oSerProp_pPrType::PageBreakBefore);
m_oBcw.m_oStream.WriteBYTE(c_oSerPropLenType::Byte);
m_oBcw.m_oStream.WriteBOOL(SimpleTypes::onoffTrue == pPr.m_oPageBreakBefore.get().m_oVal.GetValue());
}
//Spacing
if(false != pPr.m_oSpacing.IsInit())
{
m_oBcw.m_oStream.WriteBYTE(c_oSerProp_pPrType::Spacing);
m_oBcw.m_oStream.WriteBYTE(c_oSerPropLenType::Variable);
nCurPos = m_oBcw.WriteItemWithLengthStart();
WriteSpacing(pPr.m_oSpacing.get());
m_oBcw.WriteItemWithLengthEnd(nCurPos);
}
//Shd
if(false != pPr.m_oShd.IsInit())
{
m_oBcw.m_oStream.WriteBYTE(c_oSerProp_pPrType::Shd);
m_oBcw.m_oStream.WriteBYTE(c_oSerPropLenType::Variable);
nCurPos = m_oBcw.WriteItemWithLengthStart();
m_oBcw.WriteShd(pPr.m_oShd.get());
m_oBcw.WriteItemWithLengthEnd(nCurPos);
}
//WidowControl
if(false != pPr.m_oWidowControl.IsInit())
{
m_oBcw.m_oStream.WriteBYTE(c_oSerProp_pPrType::WidowControl);
m_oBcw.m_oStream.WriteBYTE(c_oSerPropLenType::Byte);
m_oBcw.m_oStream.WriteBOOL(SimpleTypes::onoffTrue == pPr.m_oWidowControl.get().m_oVal.GetValue());
}
//Tabs
if(false != pPr.m_oTabs.IsInit())
{
m_oBcw.m_oStream.WriteBYTE(c_oSerProp_pPrType::Tab);
m_oBcw.m_oStream.WriteBYTE(c_oSerPropLenType::Variable);
nCurPos = m_oBcw.WriteItemWithLengthStart();
WriteTabs(pPr.m_oTabs.get(), pPr.m_oInd);
m_oBcw.WriteItemWithLengthEnd(nCurPos);
}
//pBdr
if(false != pPr.m_oPBdr.IsInit())
{
m_oBcw.m_oStream.WriteBYTE(c_oSerProp_pPrType::pBdr);
m_oBcw.m_oStream.WriteBYTE(c_oSerPropLenType::Variable);
nCurPos = m_oBcw.WriteItemWithLengthStart();
m_oBcw.WritePBorders(pPr.m_oPBdr.get());
m_oBcw.WriteItemWithLengthEnd(nCurPos);
}
//pPr_rPr
if(false != pPr.m_oRPr.IsInit())
{
m_oBcw.m_oStream.WriteBYTE(c_oSerProp_pPrType::pPr_rPr);
m_oBcw.m_oStream.WriteBYTE(c_oSerPropLenType::Variable);
nCurPos = m_oBcw.WriteItemWithLengthStart();
brPrs.Write_rPr(pPr.m_oRPr.get());
m_oBcw.WriteItemWithLengthEnd(nCurPos);
}
//FramePr
if(pPr.m_oFramePr.IsInit())
{
m_oBcw.m_oStream.WriteBYTE(c_oSerProp_pPrType::FramePr);
m_oBcw.m_oStream.WriteBYTE(c_oSerPropLenType::Variable);
nCurPos = m_oBcw.WriteItemWithLengthStart();
WriteFramePr(pPr.m_oFramePr.get());
m_oBcw.WriteItemWithLengthEnd(nCurPos);
}
if(pPr.m_oPPrChange.IsInit())
{
m_oBcw.m_oStream.WriteBYTE(c_oSerProp_pPrType::pPrChange);
m_oBcw.m_oStream.WriteBYTE(c_oSerPropLenType::Variable);
nCurPos = m_oBcw.WriteItemWithLengthStart();
WritePPrChange(pPr.m_oPPrChange.get());
m_oBcw.WriteItemWithLengthEnd(nCurPos);
}
//SectPr
if(NULL != m_oBinaryHeaderFooterTableWriter && pPr.m_oSectPr.IsInit())
{
m_oBcw.m_oStream.WriteBYTE(c_oSerProp_pPrType::SectPr);
m_oBcw.m_oStream.WriteBYTE(c_oSerPropLenType::Variable);
int nCurPos2 = m_oBcw.WriteItemWithLengthStart();
WriteSectPr(pPr.m_oSectPr.GetPointer());
m_oBcw.WriteItemWithLengthEnd(nCurPos2);
}
}
void WritePPrChange(const OOX::Logic::CPPrChange& pPrChange)
{
int nCurPos = 0;
m_oBcw.WriteTrackRevision(pPrChange);
if(pPrChange.m_pParPr.IsInit())
{
nCurPos = m_oBcw.WriteItemStart(c_oSerProp_RevisionType::pPrChange);
Write_pPr(pPrChange.m_pParPr.get());
m_oBcw.WriteItemWithLengthEnd(nCurPos);
}
}
void WriteInd(const ComplexTypes::Word::CInd& Ind)
{
//Left
if(false != Ind.m_oStart.IsInit())
{
m_oBcw.m_oStream.WriteBYTE(c_oSerProp_pPrType::Ind_Left);
m_oBcw.m_oStream.WriteBYTE(c_oSerPropLenType::Double);
m_oBcw.m_oStream.WriteDouble(Ind.m_oStart.get().ToMm());
}
//Right
if(false != Ind.m_oEnd.IsInit())
{
m_oBcw.m_oStream.WriteBYTE(c_oSerProp_pPrType::Ind_Right);
m_oBcw.m_oStream.WriteBYTE(c_oSerPropLenType::Double);
m_oBcw.m_oStream.WriteDouble(Ind.m_oEnd.get().ToMm());
}
//FirstLine
if(false != Ind.m_oFirstLine.IsInit())
{
m_oBcw.m_oStream.WriteBYTE(c_oSerProp_pPrType::Ind_FirstLine);
m_oBcw.m_oStream.WriteBYTE(c_oSerPropLenType::Double);
m_oBcw.m_oStream.WriteDouble(Ind.m_oFirstLine.get().ToMm());
}
else if(false != Ind.m_oHanging.IsInit())
{
m_oBcw.m_oStream.WriteBYTE(c_oSerProp_pPrType::Ind_FirstLine);
m_oBcw.m_oStream.WriteBYTE(c_oSerPropLenType::Double);
m_oBcw.m_oStream.WriteDouble( -1 * Ind.m_oHanging.get().ToMm());
}
}
void WriteSpacing(const ComplexTypes::Word::CSpacing& Spacing)
{
//LineRule
SimpleTypes::ELineSpacingRule eLineSpacingRule = SimpleTypes::linespacingruleAuto;
if(false != Spacing.m_oLineRule.IsInit())
eLineSpacingRule = Spacing.m_oLineRule->GetValue();
//Line
if(false != Spacing.m_oLine.IsInit())
{
const SimpleTypes::CSignedTwipsMeasure& oLine = Spacing.m_oLine.get();
double dLineMm = oLine.ToMm();
if(dLineMm < 0)
{
dLineMm = -dLineMm;
eLineSpacingRule = SimpleTypes::linespacingruleExact;
}
m_oBcw.m_oStream.WriteBYTE(c_oSerProp_pPrType::Spacing_Line);
m_oBcw.m_oStream.WriteBYTE(c_oSerPropLenType::Double);
if(SimpleTypes::linespacingruleAuto == eLineSpacingRule)
{
SimpleTypes::CSignedTwipsMeasure oTmp;oTmp.FromPoints(12);//240 twips
m_oBcw.m_oStream.WriteDouble(dLineMm / oTmp.ToMm());
}
else
{
m_oBcw.m_oStream.WriteDouble(dLineMm);
}
//Write LineRule
m_oBcw.m_oStream.WriteBYTE(c_oSerProp_pPrType::Spacing_LineRule);
m_oBcw.m_oStream.WriteBYTE(c_oSerPropLenType::Byte);
switch(eLineSpacingRule)
{
case SimpleTypes::linespacingruleAtLeast: m_oBcw.m_oStream.WriteBYTE(linerule_AtLeast);break;
case SimpleTypes::linespacingruleExact: m_oBcw.m_oStream.WriteBYTE(linerule_Exact);break;
default:m_oBcw.m_oStream.WriteBYTE(linerule_Auto);break;
}
}
//Before
if(Spacing.m_oBeforeAutospacing.IsInit())
{
m_oBcw.m_oStream.WriteBYTE(c_oSerProp_pPrType::Spacing_BeforeAuto);
m_oBcw.m_oStream.WriteBYTE(c_oSerPropLenType::Byte);
m_oBcw.m_oStream.WriteBOOL(Spacing.m_oBeforeAutospacing->ToBool());
}
if(false != Spacing.m_oBefore.IsInit())
{
m_oBcw.m_oStream.WriteBYTE(c_oSerProp_pPrType::Spacing_Before);
m_oBcw.m_oStream.WriteBYTE(c_oSerPropLenType::Double);
m_oBcw.m_oStream.WriteDouble(Spacing.m_oBefore.get().ToMm());
}
//After
if(Spacing.m_oAfterAutospacing.IsInit())
{
m_oBcw.m_oStream.WriteBYTE(c_oSerProp_pPrType::Spacing_AfterAuto);
m_oBcw.m_oStream.WriteBYTE(c_oSerPropLenType::Byte);
m_oBcw.m_oStream.WriteBOOL(Spacing.m_oAfterAutospacing->ToBool());
}
if(false != Spacing.m_oAfter.IsInit())
{
m_oBcw.m_oStream.WriteBYTE(c_oSerProp_pPrType::Spacing_After);
m_oBcw.m_oStream.WriteBYTE(c_oSerPropLenType::Double);
m_oBcw.m_oStream.WriteDouble(Spacing.m_oAfter.get().ToMm());
}
}
void WriteTabs(const OOX::Logic::CTabs& Tab, const nullable<ComplexTypes::Word::CInd>& oInd)
{
int nCurPos = 0;
//Len
for(int i = 0, length = Tab.m_arrTabs.size(); i < length; ++i)
{
const ComplexTypes::Word::CTabStop& tabItem = *Tab.m_arrTabs[i];
m_oBcw.m_oStream.WriteBYTE(c_oSerProp_pPrType::Tab_Item);
m_oBcw.m_oStream.WriteBYTE(c_oSerPropLenType::Variable);
nCurPos = m_oBcw.WriteItemWithLengthStart();
WriteTabItem(tabItem, oInd);
m_oBcw.WriteItemWithLengthEnd(nCurPos);
}
}
void WriteTabItem(const ComplexTypes::Word::CTabStop& TabItem, const nullable<ComplexTypes::Word::CInd>& oInd)
{
//type
bool bRight = false;
if(false != TabItem.m_oVal.IsInit())
{
m_oBcw.m_oStream.WriteBYTE(c_oSerProp_pPrType::Tab_Item_Val);
m_oBcw.m_oStream.WriteBYTE(c_oSerPropLenType::Byte);
switch(TabItem.m_oVal.get().GetValue())
{
case SimpleTypes::tabjcEnd:
case SimpleTypes::tabjcRight:
m_oBcw.m_oStream.WriteBYTE(g_tabtype_right);
bRight = true;
break;
case SimpleTypes::tabjcCenter:
m_oBcw.m_oStream.WriteBYTE(g_tabtype_center);
break;
case SimpleTypes::tabjcClear:
m_oBcw.m_oStream.WriteBYTE(g_tabtype_clear);
break;
default: m_oBcw.m_oStream.WriteBYTE(g_tabtype_left);break;
}
}
//pos
if(false != TabItem.m_oPos.IsInit())
{
m_oBcw.m_oStream.WriteBYTE(c_oSerProp_pPrType::Tab_Item_Pos);
m_oBcw.m_oStream.WriteBYTE(c_oSerPropLenType::Double);
m_oBcw.m_oStream.WriteDouble(TabItem.m_oPos.get().ToMm());
}
}
void WriteNumPr(const OOX::Logic::CNumPr& numPr, const OOX::Logic::CParagraphProperty& pPr)
{
int nCurPos = 0;
if(false != numPr.m_oNumID.IsInit())
{
const ComplexTypes::Word::CDecimalNumber& oCurNum = numPr.m_oNumID.get();
if(oCurNum.m_oVal.IsInit())
{
//pos
m_oBcw.m_oStream.WriteBYTE(c_oSerProp_pPrType::numPr_id);
m_oBcw.m_oStream.WriteBYTE(c_oSerPropLenType::Long);
m_oBcw.m_oStream.WriteLONG(oCurNum.m_oVal->GetValue());
}
}
if(false != numPr.m_oIlvl.IsInit())
{
const ComplexTypes::Word::CDecimalNumber& oCurLvl = numPr.m_oIlvl.get();
if(oCurLvl.m_oVal.IsInit())
{
//type
m_oBcw.m_oStream.WriteBYTE(c_oSerProp_pPrType::numPr_lvl);
m_oBcw.m_oStream.WriteBYTE(c_oSerPropLenType::Long);
m_oBcw.m_oStream.WriteLONG(oCurLvl.m_oVal->GetValue());
}
}
if(numPr.m_oIns.IsInit())
{
m_oBcw.m_oStream.WriteBYTE(c_oSerProp_pPrType::numPr_Ins);
m_oBcw.m_oStream.WriteBYTE(c_oSerPropLenType::Variable);
nCurPos = m_oBcw.WriteItemWithLengthStart();
m_oBcw.WriteTrackRevision(numPr.m_oIns.get());
m_oBcw.WriteItemWithLengthEnd(nCurPos);
}
}
void WriteFramePr(const ComplexTypes::Word::CFramePr& oFramePr)
{
if(oFramePr.m_oDropCap.IsInit())
{
m_oBcw.m_oStream.WriteBYTE(c_oSer_FramePrType::DropCap);
m_oBcw.m_oStream.WriteBYTE(c_oSerPropLenType::Byte);
m_oBcw.m_oStream.WriteBYTE((BYTE)oFramePr.m_oDropCap->GetValue());
}
if(oFramePr.m_oH.IsInit())
{
m_oBcw.m_oStream.WriteBYTE(c_oSer_FramePrType::H);
m_oBcw.m_oStream.WriteBYTE(c_oSerPropLenType::Long);
m_oBcw.m_oStream.WriteLONG(oFramePr.m_oH->ToTwips());
}
if(oFramePr.m_oHAnchor.IsInit())
{
m_oBcw.m_oStream.WriteBYTE(c_oSer_FramePrType::HAnchor);
m_oBcw.m_oStream.WriteBYTE(c_oSerPropLenType::Byte);
m_oBcw.m_oStream.WriteBYTE((BYTE)oFramePr.m_oHAnchor->GetValue());
}
if(oFramePr.m_oHRule.IsInit())
{
m_oBcw.m_oStream.WriteBYTE(c_oSer_FramePrType::HRule);
m_oBcw.m_oStream.WriteBYTE(c_oSerPropLenType::Byte);
m_oBcw.m_oStream.WriteBYTE((BYTE)oFramePr.m_oHRule->GetValue());
}
if(oFramePr.m_oHSpace.IsInit())
{
m_oBcw.m_oStream.WriteBYTE(c_oSer_FramePrType::HSpace);
m_oBcw.m_oStream.WriteBYTE(c_oSerPropLenType::Long);
m_oBcw.m_oStream.WriteLONG(oFramePr.m_oHSpace->ToTwips());
}
if(oFramePr.m_oLines.IsInit())
{
m_oBcw.m_oStream.WriteBYTE(c_oSer_FramePrType::Lines);
m_oBcw.m_oStream.WriteBYTE(c_oSerPropLenType::Long);
m_oBcw.m_oStream.WriteLONG(oFramePr.m_oLines->GetValue());
}
if(oFramePr.m_oVAnchor.IsInit())
{
m_oBcw.m_oStream.WriteBYTE(c_oSer_FramePrType::VAnchor);
m_oBcw.m_oStream.WriteBYTE(c_oSerPropLenType::Byte);
m_oBcw.m_oStream.WriteBYTE((BYTE)oFramePr.m_oVAnchor->GetValue());
}
if(oFramePr.m_oVSpace.IsInit())
{
m_oBcw.m_oStream.WriteBYTE(c_oSer_FramePrType::VSpace);
m_oBcw.m_oStream.WriteBYTE(c_oSerPropLenType::Long);
m_oBcw.m_oStream.WriteLONG(oFramePr.m_oVSpace->ToTwips());
}
if(oFramePr.m_oW.IsInit())
{
m_oBcw.m_oStream.WriteBYTE(c_oSer_FramePrType::W);
m_oBcw.m_oStream.WriteBYTE(c_oSerPropLenType::Long);
m_oBcw.m_oStream.WriteLONG(oFramePr.m_oW->ToTwips());
}
if(oFramePr.m_oWrap.IsInit())
{
m_oBcw.m_oStream.WriteBYTE(c_oSer_FramePrType::Wrap);
m_oBcw.m_oStream.WriteBYTE(c_oSerPropLenType::Byte);
m_oBcw.m_oStream.WriteBYTE((BYTE)oFramePr.m_oWrap->GetValue());
}
if(oFramePr.m_oX.IsInit())
{
m_oBcw.m_oStream.WriteBYTE(c_oSer_FramePrType::X);
m_oBcw.m_oStream.WriteBYTE(c_oSerPropLenType::Long);
m_oBcw.m_oStream.WriteLONG(oFramePr.m_oX->ToTwips());
}
if(oFramePr.m_oXAlign.IsInit())
{
m_oBcw.m_oStream.WriteBYTE(c_oSer_FramePrType::XAlign);
m_oBcw.m_oStream.WriteBYTE(c_oSerPropLenType::Byte);
m_oBcw.m_oStream.WriteBYTE((BYTE)oFramePr.m_oXAlign->GetValue());
}
if(oFramePr.m_oY.IsInit())
{
m_oBcw.m_oStream.WriteBYTE(c_oSer_FramePrType::Y);
m_oBcw.m_oStream.WriteBYTE(c_oSerPropLenType::Long);
m_oBcw.m_oStream.WriteLONG(oFramePr.m_oY->ToTwips());
}
if(oFramePr.m_oYAlign.IsInit())
{
m_oBcw.m_oStream.WriteBYTE(c_oSer_FramePrType::YAlign);
m_oBcw.m_oStream.WriteBYTE(c_oSerPropLenType::Byte);
m_oBcw.m_oStream.WriteBYTE((BYTE)oFramePr.m_oYAlign->GetValue());
}
}
void WriteSectPr (OOX::Logic::CSectionProperty* pSectPr)
{
if (pSectPr == NULL) return;
int nCurPos = 0;
//pgSz
nCurPos = m_oBcw.WriteItemStart(c_oSerProp_secPrType::pgSz);
WritePageSize(pSectPr);
m_oBcw.WriteItemEnd(nCurPos);
//pgMar
nCurPos = m_oBcw.WriteItemStart(c_oSerProp_secPrType::pgMar);
WritePageMargin(pSectPr);
m_oBcw.WriteItemEnd(nCurPos);
//titlePg
nCurPos = m_oBcw.WriteItemStart(c_oSerProp_secPrType::setting);
WritePageSettings(pSectPr);
m_oBcw.WriteItemEnd(nCurPos);
//Header
if(pSectPr->m_arrHeaderReference.size() > 0)
{
nCurPos = m_oBcw.WriteItemStart(c_oSerProp_secPrType::headers);
WriteHeaderFooter(pSectPr, pSectPr->m_arrHeaderReference, true);
m_oBcw.WriteItemEnd(nCurPos);
}
//Footer
if(pSectPr->m_arrFooterReference.size() > 0)
{
nCurPos = m_oBcw.WriteItemStart(c_oSerProp_secPrType::footers);
WriteHeaderFooter(pSectPr, pSectPr->m_arrFooterReference, false);
m_oBcw.WriteItemEnd(nCurPos);
}
if(pSectPr->m_oPgNumType.IsInit())
{
nCurPos = m_oBcw.WriteItemStart(c_oSerProp_secPrType::pageNumType);
WritePageNumType(pSectPr->m_oPgNumType.get());
m_oBcw.WriteItemEnd(nCurPos);
}
if(pSectPr->m_oSectPrChange.IsInit())
{
nCurPos = m_oBcw.WriteItemStart(c_oSerProp_secPrType::sectPrChange);
WriteSectPrChange(pSectPr->m_oSectPrChange.get());
m_oBcw.WriteItemEnd(nCurPos);
}
if(pSectPr->m_oCols.IsInit())
{
nCurPos = m_oBcw.WriteItemStart(c_oSerProp_secPrType::cols);
WriteColumns(pSectPr->m_oCols.get());
m_oBcw.WriteItemEnd(nCurPos);
}
if(pSectPr->m_oPgBorders.IsInit())
{
nCurPos = m_oBcw.WriteItemStart(c_oSerProp_secPrType::pgBorders);
WritePageBorders(pSectPr->m_oPgBorders.get());
m_oBcw.WriteItemEnd(nCurPos);
}
if(pSectPr->m_oFootnotePr.IsInit())
{
nCurPos = m_oBcw.WriteItemStart(c_oSerProp_secPrType::footnotePr);
WriteNotePr(pSectPr->m_oFootnotePr->m_oNumFmt, pSectPr->m_oFootnotePr->m_oNumRestart, pSectPr->m_oFootnotePr->m_oNumStart,
&pSectPr->m_oFootnotePr->m_oPos, NULL, NULL);
m_oBcw.WriteItemEnd(nCurPos);
}
if(pSectPr->m_oEndnotePr.IsInit())
{
nCurPos = m_oBcw.WriteItemStart(c_oSerProp_secPrType::endnotePr);
WriteNotePr(pSectPr->m_oEndnotePr->m_oNumFmt, pSectPr->m_oEndnotePr->m_oNumRestart, pSectPr->m_oEndnotePr->m_oNumStart,
NULL, &pSectPr->m_oEndnotePr->m_oPos, NULL);
m_oBcw.WriteItemEnd(nCurPos);
}
}
void WritePageSettings(OOX::Logic::CSectionProperty* pSectPr)
{
bool titlePg = false;
bool EvenAndOddHeaders = false;
if(NULL != pSectPr && pSectPr->m_oTitlePg.IsInit() && SimpleTypes::onoffTrue == pSectPr->m_oTitlePg->m_oVal.GetValue())
titlePg = true;
if(NULL != m_oSettings && m_oSettings->m_oEvenAndOddHeaders.IsInit() && SimpleTypes::onoffTrue == m_oSettings->m_oEvenAndOddHeaders.get().m_oVal.GetValue())
EvenAndOddHeaders = true;
//titlePg
m_oBcw.m_oStream.WriteBYTE(c_oSerProp_secPrSettingsType::titlePg);
m_oBcw.m_oStream.WriteBYTE(c_oSerPropLenType::Byte);
m_oBcw.m_oStream.WriteBOOL(titlePg);
//EvenAndOddHeaders
m_oBcw.m_oStream.WriteBYTE(c_oSerProp_secPrSettingsType::EvenAndOddHeaders);
m_oBcw.m_oStream.WriteBYTE(c_oSerPropLenType::Byte);
m_oBcw.m_oStream.WriteBOOL(EvenAndOddHeaders);
if(pSectPr->m_oType.IsInit() && pSectPr->m_oType->m_oVal.IsInit())
{
m_oBcw.m_oStream.WriteBYTE(c_oSerProp_secPrSettingsType::SectionType);
m_oBcw.m_oStream.WriteBYTE(c_oSerPropLenType::Byte);
m_oBcw.m_oStream.WriteBYTE(pSectPr->m_oType->m_oVal->GetValue());
}
}
void WritePageSize(OOX::Logic::CSectionProperty* pSectPr)
{
double W = Page_Width;
double H = Page_Height;
BYTE Orientation = orientation_Portrait;
if(NULL != pSectPr && pSectPr->m_oPgSz.IsInit())
{
const ComplexTypes::Word::CPageSz& pSz = pSectPr->m_oPgSz.get();
if(pSz.m_oW.IsInit())
W = pSz.m_oW.get().ToMm();
if(pSz.m_oH.IsInit())
H = pSz.m_oH.get().ToMm();
if(pSz.m_oOrient.IsInit())
{
switch(pSz.m_oOrient.get().GetValue())
{
case SimpleTypes::pageorientPortrait: Orientation = orientation_Portrait;break;
case SimpleTypes::pageorientLandscape: Orientation = orientation_Landscape;break;
}
}
}
//W
m_oBcw.m_oStream.WriteBYTE(c_oSer_pgSzType::W);
m_oBcw.m_oStream.WriteBYTE(c_oSerPropLenType::Double);
m_oBcw.m_oStream.WriteDouble(W);
//H
m_oBcw.m_oStream.WriteBYTE(c_oSer_pgSzType::H);
m_oBcw.m_oStream.WriteBYTE(c_oSerPropLenType::Double);
m_oBcw.m_oStream.WriteDouble(H);
//Orientation
m_oBcw.m_oStream.WriteBYTE(c_oSer_pgSzType::Orientation);
m_oBcw.m_oStream.WriteBYTE(c_oSerPropLenType::Byte);
m_oBcw.m_oStream.WriteBYTE(Orientation);
}
void WritePageMargin(OOX::Logic::CSectionProperty* pSectPr)
{
double H = Page_Height;
double L = X_Left_Margin;
double T = Y_Top_Margin;
double R = X_Right_Margin;
double B = Y_Bottom_Margin;
double Header = Y_Default_Header;
double Footer = Y_Default_Footer;
if(NULL != pSectPr && pSectPr->m_oPgSz.IsInit() && pSectPr->m_oPgMar.IsInit())
{
const ComplexTypes::Word::CPageSz& pSz = pSectPr->m_oPgSz.get();
if(pSz.m_oH.IsInit())
H = pSz.m_oH.get().ToMm();
const ComplexTypes::Word::CPageMar& pMar = pSectPr->m_oPgMar.get();
if(pMar.m_oLeft.IsInit())
L = pMar.m_oLeft.get().ToMm();
if(pMar.m_oTop.IsInit())
T = pMar.m_oTop.get().ToMm();
if(pMar.m_oRight.IsInit())
R = pMar.m_oRight.get().ToMm();
if(pMar.m_oBottom.IsInit())
B = pMar.m_oBottom.get().ToMm();
if(pMar.m_oHeader.IsInit())
Header = pMar.m_oHeader.get().ToMm();
if(pMar.m_oFooter.IsInit())
Footer = pMar.m_oFooter.get().ToMm();
}
//Left
m_oBcw.m_oStream.WriteBYTE(c_oSer_pgMarType::Left);
m_oBcw.m_oStream.WriteBYTE(c_oSerPropLenType::Double);
m_oBcw.m_oStream.WriteDouble(L);
//Top
m_oBcw.m_oStream.WriteBYTE(c_oSer_pgMarType::Top);
m_oBcw.m_oStream.WriteBYTE(c_oSerPropLenType::Double);
m_oBcw.m_oStream.WriteDouble(T);
//Right
m_oBcw.m_oStream.WriteBYTE(c_oSer_pgMarType::Right);
m_oBcw.m_oStream.WriteBYTE(c_oSerPropLenType::Double);
m_oBcw.m_oStream.WriteDouble(R);
//Bottom
m_oBcw.m_oStream.WriteBYTE(c_oSer_pgMarType::Bottom);
m_oBcw.m_oStream.WriteBYTE(c_oSerPropLenType::Double);
m_oBcw.m_oStream.WriteDouble(B);
//Header
m_oBcw.m_oStream.WriteBYTE(c_oSer_pgMarType::Header);
m_oBcw.m_oStream.WriteBYTE(c_oSerPropLenType::Double);
m_oBcw.m_oStream.WriteDouble(Header);
//Footer
m_oBcw.m_oStream.WriteBYTE(c_oSer_pgMarType::Footer);
m_oBcw.m_oStream.WriteBYTE(c_oSerPropLenType::Double);
m_oBcw.m_oStream.WriteDouble(Footer);
}
void WriteHeaderFooter(OOX::Logic::CSectionProperty* pSectPr, std::vector<ComplexTypes::Word::CHdrFtrRef*>& aRefs, bool bHdr)
{
int nCurPos = 0;
for(int i = 0, length = aRefs.size(); i < length; ++i)
{
const ComplexTypes::Word::CHdrFtrRef& oRef = *aRefs[i];
if( oRef.m_oType.IsInit() && oRef.m_oId.IsInit())
{
smart_ptr<OOX::File> oFile = m_oBinaryHeaderFooterTableWriter->m_oDocumentRels->Find(oRef.m_oId->GetValue());
if (oFile.IsInit() && (OOX::FileTypes::Header == oFile->type() || OOX::FileTypes::Footer == oFile->type()))
{
int nIndex = 0;
OOX::CHdrFtr* pHdrFtr = (OOX::CHdrFtr*)oFile.operator->();
if(bHdr)
{
nIndex = m_oBinaryHeaderFooterTableWriter->m_aHeaders.size();
m_oBinaryHeaderFooterTableWriter->m_aHeaders.push_back(pHdrFtr);
m_oBinaryHeaderFooterTableWriter->m_aHeaderTypes.push_back(oRef.m_oType->GetValue());
m_oBinaryHeaderFooterTableWriter->m_aHeaderSectPrs.push_back(pSectPr);
}
else
{
nIndex = m_oBinaryHeaderFooterTableWriter->m_aFooters.size();
m_oBinaryHeaderFooterTableWriter->m_aFooters.push_back(pHdrFtr);
m_oBinaryHeaderFooterTableWriter->m_aFooterTypes.push_back(oRef.m_oType->GetValue());
m_oBinaryHeaderFooterTableWriter->m_aFooterSectPrs.push_back(pSectPr);
}
nCurPos = m_oBcw.WriteItemStart(c_oSerProp_secPrType::hdrftrelem);
m_oBcw.m_oStream.WriteLONG(nIndex);
m_oBcw.WriteItemEnd(nCurPos);
}
}
}
}
void WritePageNumType(const ComplexTypes::Word::CPageNumber& pPageNumber)
{
int nCurPos = 0;
if(pPageNumber.m_oStart.IsInit())
{
nCurPos = m_oBcw.WriteItemStart(c_oSerProp_secPrPageNumType::start);
m_oBcw.m_oStream.WriteLONG(pPageNumber.m_oStart->GetValue());
m_oBcw.WriteItemEnd(nCurPos);
}
}
void WriteSectPrChange(const OOX::Logic::CSectPrChange& sectPrChange)
{
int nCurPos = 0;
m_oBcw.WriteTrackRevision(sectPrChange);
if(sectPrChange.m_pSecPr.IsInit())
{
nCurPos = m_oBcw.WriteItemStart(c_oSerProp_RevisionType::sectPrChange);
WriteSectPr(sectPrChange.m_pSecPr.GetPointer());
m_oBcw.WriteItemWithLengthEnd(nCurPos);
}
}
void WriteColumns(const OOX::Logic::CColumns& columns)
{
int nCurPos = 0;
if(columns.m_oEqualWidth.IsInit())
{
nCurPos = m_oBcw.WriteItemStart(c_oSerProp_Columns::EqualWidth);
m_oBcw.m_oStream.WriteBOOL(columns.m_oEqualWidth->ToBool());
m_oBcw.WriteItemWithLengthEnd(nCurPos);
}
if(columns.m_oNum.IsInit())
{
nCurPos = m_oBcw.WriteItemStart(c_oSerProp_Columns::Num);
m_oBcw.m_oStream.WriteLONG(columns.m_oNum->GetValue());
m_oBcw.WriteItemWithLengthEnd(nCurPos);
}
if(columns.m_oSep.IsInit())
{
nCurPos = m_oBcw.WriteItemStart(c_oSerProp_Columns::Sep);
m_oBcw.m_oStream.WriteBOOL(columns.m_oSep->ToBool());
m_oBcw.WriteItemWithLengthEnd(nCurPos);
}
if(columns.m_oSpace.IsInit())
{
nCurPos = m_oBcw.WriteItemStart(c_oSerProp_Columns::Space);
m_oBcw.m_oStream.WriteLONG(columns.m_oSpace->ToTwips());
m_oBcw.WriteItemWithLengthEnd(nCurPos);
}
for(int i = 0; i < columns.m_arrColumns.size(); ++i)
{
nCurPos = m_oBcw.WriteItemStart(c_oSerProp_Columns::Column);
WriteColumn(*columns.m_arrColumns[i]);
m_oBcw.WriteItemWithLengthEnd(nCurPos);
}
}
void WriteColumn(const ComplexTypes::Word::CColumn& column)
{
int nCurPos = 0;
if(column.m_oSpace.IsInit())
{
nCurPos = m_oBcw.WriteItemStart(c_oSerProp_Columns::ColumnSpace);
m_oBcw.m_oStream.WriteLONG(column.m_oSpace->ToTwips());
m_oBcw.WriteItemWithLengthEnd(nCurPos);
}
if(column.m_oW.IsInit())
{
nCurPos = m_oBcw.WriteItemStart(c_oSerProp_Columns::ColumnW);
m_oBcw.m_oStream.WriteLONG(column.m_oW->ToTwips());
m_oBcw.WriteItemWithLengthEnd(nCurPos);
}
}
void WritePageBorders(const OOX::Logic::CPageBorders& PageBorders)
{
int nCurPos = 0;
if(PageBorders.m_oDisplay.IsInit())
{
nCurPos = m_oBcw.WriteItemStart(c_oSerPageBorders::Display);
m_oBcw.m_oStream.WriteBYTE(PageBorders.m_oDisplay->GetValue());
m_oBcw.WriteItemWithLengthEnd(nCurPos);
}
if(PageBorders.m_oOffsetFrom.IsInit())
{
nCurPos = m_oBcw.WriteItemStart(c_oSerPageBorders::OffsetFrom);
m_oBcw.m_oStream.WriteBYTE(PageBorders.m_oOffsetFrom->GetValue());
m_oBcw.WriteItemWithLengthEnd(nCurPos);
}
if(PageBorders.m_oZOrder.IsInit())
{
nCurPos = m_oBcw.WriteItemStart(c_oSerPageBorders::ZOrder);
m_oBcw.m_oStream.WriteBYTE(PageBorders.m_oZOrder->GetValue());
m_oBcw.WriteItemWithLengthEnd(nCurPos);
}
if(PageBorders.m_oBottom.IsInit())
{
nCurPos = m_oBcw.WriteItemStart(c_oSerPageBorders::Bottom);
WritePageBorder(PageBorders.m_oBottom.get());
m_oBcw.WriteItemWithLengthEnd(nCurPos);
}
if(PageBorders.m_oLeft.IsInit())
{
nCurPos = m_oBcw.WriteItemStart(c_oSerPageBorders::Left);
WritePageBorder(PageBorders.m_oLeft.get());
m_oBcw.WriteItemWithLengthEnd(nCurPos);
}
if(PageBorders.m_oRight.IsInit())
{
nCurPos = m_oBcw.WriteItemStart(c_oSerPageBorders::Right);
WritePageBorder(PageBorders.m_oRight.get());
m_oBcw.WriteItemWithLengthEnd(nCurPos);
}
if(PageBorders.m_oTop.IsInit())
{
nCurPos = m_oBcw.WriteItemStart(c_oSerPageBorders::Top);
WritePageBorder(PageBorders.m_oTop.get());
m_oBcw.WriteItemWithLengthEnd(nCurPos);
}
}
void WritePageBorder(const ComplexTypes::Word::CPageBorder& pageBorder)
{
int nCurPos = 0;
if(pageBorder.m_oColor.IsInit())
{
m_oBcw.WriteColor(c_oSerPageBorders::Color, pageBorder.m_oColor.get());
}
m_oBcw.WriteThemeColor(c_oSerPageBorders::ColorTheme, pageBorder.m_oColor, pageBorder.m_oThemeColor, pageBorder.m_oThemeTint, pageBorder.m_oThemeShade);
if(pageBorder.m_oSpace.IsInit())
{
m_oBcw.m_oStream.WriteBYTE(c_oSerPageBorders::Space);
m_oBcw.m_oStream.WriteBYTE(c_oSerPropLenType::Long);
m_oBcw.m_oStream.WriteLONG(pageBorder.m_oSpace->GetValue());
}
if(pageBorder.m_oSz.IsInit())
{
m_oBcw.m_oStream.WriteBYTE(c_oSerPageBorders::Sz);
m_oBcw.m_oStream.WriteBYTE(c_oSerPropLenType::Long);
m_oBcw.m_oStream.WriteLONG(pageBorder.m_oSz->GetValue());
}
if(pageBorder.m_oVal.IsInit())
{
m_oBcw.m_oStream.WriteBYTE(c_oSerPageBorders::Val);
m_oBcw.m_oStream.WriteBYTE(c_oSerPropLenType::Long);
m_oBcw.m_oStream.WriteLONG(pageBorder.m_oVal.get().GetValue());
}
if(pageBorder.m_oFrame.IsInit())
{
m_oBcw.m_oStream.WriteBYTE(c_oSerPageBorders::Frame);
m_oBcw.m_oStream.WriteBYTE(c_oSerPropLenType::Byte);
m_oBcw.m_oStream.WriteBOOL(pageBorder.m_oFrame->ToBool());
}
if(pageBorder.m_oShadow.IsInit())
{
m_oBcw.m_oStream.WriteBYTE(c_oSerPageBorders::Shadow);
m_oBcw.m_oStream.WriteBYTE(c_oSerPropLenType::Byte);
m_oBcw.m_oStream.WriteBOOL(pageBorder.m_oShadow->ToBool());
}
//todo id
}
void WriteNotePr(const nullable<ComplexTypes::Word::CNumFmt>& numFmt, const nullable<ComplexTypes::Word::CNumRestart>& numRestart,
const nullable<ComplexTypes::Word::CDecimalNumber>& numStart, nullable<ComplexTypes::Word::CFtnPos>* ftnPos,
nullable<ComplexTypes::Word::CEdnPos>* endPos, std::vector<OOX::CFtnEdnSepRef*>* refs)
{
int nCurPos = 0;
if(numFmt.IsInit())
{
nCurPos = m_oBcw.WriteItemStart(c_oSerNotes::PrFmt);
WriteNumFmt(numFmt.get());
m_oBcw.WriteItemWithLengthEnd(nCurPos);
}
if(numRestart.IsInit() && numRestart->m_oVal.IsInit())
{
nCurPos = m_oBcw.WriteItemStart(c_oSerNotes::PrRestart);
m_oBcw.m_oStream.WriteBYTE(numRestart->m_oVal->GetValue());
m_oBcw.WriteItemWithLengthEnd(nCurPos);
}
if(numStart.IsInit() && numStart->m_oVal.IsInit())
{
nCurPos = m_oBcw.WriteItemStart(c_oSerNotes::PrStart);
m_oBcw.m_oStream.WriteLONG(numStart->m_oVal->GetValue());
m_oBcw.WriteItemWithLengthEnd(nCurPos);
}
if(NULL != ftnPos && ftnPos->IsInit() && (*ftnPos)->m_oVal.IsInit())
{
nCurPos = m_oBcw.WriteItemStart(c_oSerNotes::PrFntPos);
m_oBcw.m_oStream.WriteBYTE((*ftnPos)->m_oVal->GetValue());
m_oBcw.WriteItemWithLengthEnd(nCurPos);
}
if(NULL != endPos && endPos->IsInit() && (*endPos)->m_oVal.IsInit())
{
nCurPos = m_oBcw.WriteItemStart(c_oSerNotes::PrEndPos);
m_oBcw.m_oStream.WriteBYTE((*endPos)->m_oVal->GetValue());
m_oBcw.WriteItemWithLengthEnd(nCurPos);
}
if(NULL != refs)
{
for(size_t i = 0; i < refs->size(); ++i)
{
OOX::CFtnEdnSepRef* pRef = (*refs)[i];
if(NULL != pRef && pRef->m_oId.IsInit())
{
nCurPos = m_oBcw.WriteItemStart(c_oSerNotes::PrRef);
m_oBcw.m_oStream.WriteLONG(pRef->m_oId->GetValue());
m_oBcw.WriteItemWithLengthEnd(nCurPos);
}
}
}
}
void WriteNumFmt(const ComplexTypes::Word::CNumFmt& oNumFmt)
{
int nCurPos = 0;
if(oNumFmt.m_oVal.IsInit())
{
nCurPos = m_oBcw.WriteItemStart(c_oSerNumTypes::NumFmtVal);
m_oBcw.m_oStream.WriteBYTE(oNumFmt.m_oVal->GetValue());
m_oBcw.WriteItemEnd(nCurPos);
}
if(oNumFmt.m_sFormat.IsInit())
{
nCurPos = m_oBcw.WriteItemStart(c_oSerNumTypes::NumFmtFormat);
m_oBcw.m_oStream.WriteStringW3(oNumFmt.m_sFormat.get());
m_oBcw.WriteItemEnd(nCurPos);
}
}
};
class Binary_tblPrWriter
{
BinaryCommonWriter m_oBcw;
public:
public: Binary_tblPrWriter(ParamsWriter& oParamsWriter):m_oBcw(oParamsWriter)
{
}
void WriteTblPr(OOX::Logic::CTableProperty* p_tblPr)
{
OOX::Logic::CTableProperty& tblPr = *p_tblPr;
int nCurPos = 0;
if(tblPr.m_oTblStyleRowBandSize.IsInit() && tblPr.m_oTblStyleRowBandSize->m_oVal.IsInit())
{
nCurPos = m_oBcw.WriteItemStart(c_oSerProp_tblPrType::RowBandSize);
m_oBcw.m_oStream.WriteLONG(tblPr.m_oTblStyleRowBandSize->m_oVal->GetValue());
m_oBcw.WriteItemEnd(nCurPos);
}
if(tblPr.m_oTblStyleColBandSize.IsInit() && tblPr.m_oTblStyleColBandSize->m_oVal.IsInit())
{
nCurPos = m_oBcw.WriteItemStart(c_oSerProp_tblPrType::ColBandSize);
m_oBcw.m_oStream.WriteLONG(tblPr.m_oTblStyleColBandSize->m_oVal->GetValue());
m_oBcw.WriteItemEnd(nCurPos);
}
//Jc
if(false != tblPr.m_oJc.IsInit() && tblPr.m_oJc->m_oVal.IsInit())
{
nCurPos = m_oBcw.WriteItemStart(c_oSerProp_tblPrType::Jc);
switch(tblPr.m_oJc->m_oVal->GetValue())
{
case SimpleTypes::jctableCenter:m_oBcw.m_oStream.WriteBYTE(align_Center);break;
case SimpleTypes::jctableEnd:
case SimpleTypes::jctableRight:m_oBcw.m_oStream.WriteBYTE(align_Right);break;
case SimpleTypes::jctableStart:
case SimpleTypes::jctableLeft:m_oBcw.m_oStream.WriteBYTE(align_Left);break;
default:m_oBcw.m_oStream.WriteBYTE(align_Left);break;
}
m_oBcw.WriteItemEnd(nCurPos);
}
//TableInd
if(tblPr.m_oTblInd.IsInit())
{
if(tblPr.m_oTblInd->m_oW.IsInit() && false == tblPr.m_oTblInd->m_oW->IsPercent() &&
tblPr.m_oTblInd->m_oType.IsInit() && SimpleTypes::tblwidthDxa == tblPr.m_oTblInd->m_oType->GetValue())
{
SimpleTypes::CPoint oPoint;
oPoint.FromTwips(tblPr.m_oTblInd->m_oW->GetValue());
nCurPos = m_oBcw.WriteItemStart(c_oSerProp_tblPrType::TableInd);
m_oBcw.m_oStream.WriteDouble(oPoint.ToMm());
m_oBcw.WriteItemEnd(nCurPos);
}
}
//TableW
if(tblPr.m_oTblW.IsInit())
WriteW(c_oSerProp_tblPrType::TableW, tblPr.m_oTblW.get());
//TableCellMar
if(tblPr.m_oTblCellMar.IsInit())
{
nCurPos = m_oBcw.WriteItemStart(c_oSerProp_tblPrType::TableCellMar);
WriteTblMar(tblPr.m_oTblCellMar.get());
m_oBcw.WriteItemEnd(nCurPos);
}
//TableBorders
if(tblPr.m_oTblBorders.IsInit())
{
nCurPos = m_oBcw.WriteItemStart(c_oSerProp_tblPrType::TableBorders);
m_oBcw.WriteTblBorders(tblPr.m_oTblBorders.get());
m_oBcw.WriteItemEnd(nCurPos);
}
//Shd
if(tblPr.m_oShade.IsInit())
{
nCurPos = m_oBcw.WriteItemStart(c_oSerProp_tblPrType::Shd);
m_oBcw.WriteShd(tblPr.m_oShade.get());
m_oBcw.WriteItemEnd(nCurPos);
}
if(tblPr.m_oTblStyle.IsInit())
{
m_oBcw.m_oStream.WriteBYTE(c_oSerProp_tblPrType::Style);
m_oBcw.m_oStream.WriteStringW(tblPr.m_oTblStyle->ToString2());
}
//Look
if(tblPr.m_oTblLook.IsInit())
{
nCurPos = m_oBcw.WriteItemStart(c_oSerProp_tblPrType::Look);
m_oBcw.m_oStream.WriteLONG(tblPr.m_oTblLook->GetValue());
m_oBcw.WriteItemEnd(nCurPos);
}
//Layout
if(tblPr.m_oTblLayout.IsInit() && tblPr.m_oTblLayout->m_oType.IsInit())
{
nCurPos = m_oBcw.WriteItemStart(c_oSerProp_tblPrType::Layout);
m_oBcw.m_oStream.WriteBYTE((BYTE)tblPr.m_oTblLayout->m_oType->GetValue());
m_oBcw.WriteItemEnd(nCurPos);
}
//tblpPr
if(tblPr.m_oTblpPr.IsInit())
{
nCurPos = m_oBcw.WriteItemStart(c_oSerProp_tblPrType::tblpPr2);
Write_tblpPr(tblPr.m_oTblpPr.get());
m_oBcw.WriteItemEnd(nCurPos);
}
if(tblPr.m_oTblPrChange.IsInit())
{
nCurPos = m_oBcw.WriteItemStart(c_oSerProp_tblPrType::tblPrChange);
WriteTblPrChange(tblPr.m_oTblPrChange.get());
m_oBcw.WriteItemEnd(nCurPos);
}
if(tblPr.m_oTblCellSpacing.IsInit())
{
const ComplexTypes::Word::CTblWidth& cs = tblPr.m_oTblCellSpacing.get();
if(cs.m_oW.IsInit() && false == cs.m_oW->IsPercent() &&
cs.m_oType.IsInit() && SimpleTypes::tblwidthDxa == cs.m_oType->GetValue())
{
SimpleTypes::CPoint oPoint;
oPoint.FromTwips(cs.m_oW->GetValue());
nCurPos = m_oBcw.WriteItemStart(c_oSerProp_tblPrType::TableCellSpacing);
m_oBcw.m_oStream.WriteDouble(oPoint.ToMm() * 2);//Умножаем на 2 из-за разного понимания cellSpacing
m_oBcw.WriteItemEnd(nCurPos);
}
}
}
void WriteTblMar(const OOX::Logic::CTblCellMar& cellMar)
{
int nCurPos = 0;
//Left
if(cellMar.m_oStart.IsInit())
WriteW(c_oSerMarginsType::left, cellMar.m_oStart.get());
//Top
if(cellMar.m_oTop.IsInit())
WriteW(c_oSerMarginsType::top, cellMar.m_oTop.get());
//Right
if(cellMar.m_oEnd.IsInit())
WriteW(c_oSerMarginsType::right, cellMar.m_oEnd.get());
//Bottom
if(cellMar.m_oBottom.IsInit())
WriteW(c_oSerMarginsType::bottom, cellMar.m_oBottom.get());
}
void WriteCellMar(const OOX::Logic::CTcMar& cellMar)
{
int nCurPos = 0;
//Left
if(cellMar.m_oStart.IsInit())
WriteW(c_oSerMarginsType::left, cellMar.m_oStart.get());
//Top
if(cellMar.m_oTop.IsInit())
WriteW(c_oSerMarginsType::top, cellMar.m_oTop.get());
//Right
if(cellMar.m_oEnd.IsInit())
WriteW(c_oSerMarginsType::right, cellMar.m_oEnd.get());
//Bottom
if(cellMar.m_oBottom.IsInit())
WriteW(c_oSerMarginsType::bottom, cellMar.m_oBottom.get());
}
void Write_tblpPr(const ComplexTypes::Word::CTblPPr& pr)
{
int nCurPos = 0;
if(pr.m_oHorzAnchor.IsInit())
{
m_oBcw.m_oStream.WriteBYTE(c_oSer_tblpPrType2::HorzAnchor);
m_oBcw.m_oStream.WriteBYTE(c_oSerPropLenType::Byte);
m_oBcw.m_oStream.WriteBYTE((BYTE)pr.m_oHorzAnchor->GetValue());
}
if(pr.m_oTblpX.IsInit())
{
m_oBcw.m_oStream.WriteBYTE(c_oSer_tblpPrType2::TblpX);
m_oBcw.m_oStream.WriteBYTE(c_oSerPropLenType::Double);
m_oBcw.m_oStream.WriteDouble(pr.m_oTblpX->ToMm());
}
if(pr.m_oTblpXSpec.IsInit())
{
m_oBcw.m_oStream.WriteBYTE(c_oSer_tblpPrType2::TblpXSpec);
m_oBcw.m_oStream.WriteBYTE(c_oSerPropLenType::Byte);
m_oBcw.m_oStream.WriteBYTE((BYTE)pr.m_oTblpXSpec->GetValue());
}
if(pr.m_oVertAnchor.IsInit())
{
m_oBcw.m_oStream.WriteBYTE(c_oSer_tblpPrType2::VertAnchor);
m_oBcw.m_oStream.WriteBYTE(c_oSerPropLenType::Byte);
m_oBcw.m_oStream.WriteBYTE((BYTE)pr.m_oVertAnchor->GetValue());
}
if(pr.m_oTblpY.IsInit())
{
m_oBcw.m_oStream.WriteBYTE(c_oSer_tblpPrType2::TblpY);
m_oBcw.m_oStream.WriteBYTE(c_oSerPropLenType::Double);
m_oBcw.m_oStream.WriteDouble(pr.m_oTblpY->ToMm());
}
if(pr.m_oTblpYSpec.IsInit())
{
m_oBcw.m_oStream.WriteBYTE(c_oSer_tblpPrType2::TblpYSpec);
m_oBcw.m_oStream.WriteBYTE(c_oSerPropLenType::Byte);
m_oBcw.m_oStream.WriteBYTE((BYTE)pr.m_oTblpYSpec->GetValue());
}
if(pr.m_oLeftFromText.IsInit() || pr.m_oTopFromText.IsInit() || pr.m_oRightFromText.IsInit() || pr.m_oBottomFromText.IsInit())
{
m_oBcw.m_oStream.WriteBYTE(c_oSer_tblpPrType2::Paddings);
m_oBcw.m_oStream.WriteBYTE(c_oSerPropLenType::Variable);
nCurPos = m_oBcw.WriteItemWithLengthStart();
m_oBcw.WritePaddings(pr.m_oLeftFromText, pr.m_oTopFromText, pr.m_oRightFromText, pr.m_oBottomFromText);
m_oBcw.WriteItemWithLengthEnd(nCurPos);
}
}
void WriteRowPr(const OOX::Logic::CTableRowProperties& rowPr)
{
int nCurPos = 0;
//CantSplit
if(rowPr.m_oCantSplit.IsInit())
{
m_oBcw.m_oStream.WriteBYTE(c_oSerProp_rowPrType::CantSplit);
m_oBcw.m_oStream.WriteBYTE(c_oSerPropLenType::Byte);
m_oBcw.m_oStream.WriteBOOL( SimpleTypes::onoffTrue == rowPr.m_oCantSplit->m_oVal.GetValue());
}
//After
if(rowPr.m_oGridAfter.IsInit() || rowPr.m_oWAfter.IsInit())
{
m_oBcw.m_oStream.WriteBYTE(c_oSerProp_rowPrType::After);
m_oBcw.m_oStream.WriteBYTE(c_oSerPropLenType::Variable);
nCurPos = m_oBcw.WriteItemWithLengthStart();
WriteAfter(rowPr.m_oGridAfter, rowPr.m_oWAfter);
m_oBcw.WriteItemWithLengthEnd(nCurPos);
}
//Before
if(rowPr.m_oGridBefore.IsInit() || rowPr.m_oWBefore.IsInit())
{
m_oBcw.m_oStream.WriteBYTE(c_oSerProp_rowPrType::Before);
m_oBcw.m_oStream.WriteBYTE(c_oSerPropLenType::Variable);
nCurPos = m_oBcw.WriteItemWithLengthStart();
WriteBefore(rowPr.m_oGridBefore, rowPr.m_oWBefore);
m_oBcw.WriteItemWithLengthEnd(nCurPos);
}
//Jc
if(rowPr.m_oJc.IsInit())
{
m_oBcw.m_oStream.WriteBYTE(c_oSerProp_rowPrType::Jc);
m_oBcw.m_oStream.WriteBYTE(c_oSerPropLenType::Byte);
switch(rowPr.m_oJc->m_oVal->GetValue())
{
case SimpleTypes::jctableCenter:m_oBcw.m_oStream.WriteBYTE(align_Center);break;
case SimpleTypes::jctableEnd:
case SimpleTypes::jctableRight:m_oBcw.m_oStream.WriteBYTE(align_Right);break;
case SimpleTypes::jctableStart:
case SimpleTypes::jctableLeft:m_oBcw.m_oStream.WriteBYTE(align_Left);break;
default:m_oBcw.m_oStream.WriteBYTE(align_Left);break;
}
}
//TableCellSpacing
if(rowPr.m_oTblCellSpacing.IsInit())
{
const ComplexTypes::Word::CTblWidth& cs = rowPr.m_oTblCellSpacing.get();
if(cs.m_oW.IsInit() && false == cs.m_oW->IsPercent() &&
cs.m_oType.IsInit() && SimpleTypes::tblwidthDxa == cs.m_oType->GetValue())
{
SimpleTypes::CPoint oPoint;
oPoint.FromTwips(cs.m_oW->GetValue());
m_oBcw.m_oStream.WriteBYTE(c_oSerProp_rowPrType::TableCellSpacing);
m_oBcw.m_oStream.WriteBYTE(c_oSerPropLenType::Double);
m_oBcw.m_oStream.WriteDouble(oPoint.ToMm() * 2);//Умножаем на 2 из-за разного понимания cellSpacing
}
}
//Height
if(rowPr.m_oTblHeight.IsInit() && rowPr.m_oTblHeight->m_oVal.IsInit())
{
m_oBcw.m_oStream.WriteBYTE(c_oSerProp_rowPrType::Height);
m_oBcw.m_oStream.WriteBYTE(c_oSerPropLenType::Variable);
nCurPos = m_oBcw.WriteItemWithLengthStart();
WriteRowHeight(rowPr.m_oTblHeight.get());
m_oBcw.WriteItemWithLengthEnd(nCurPos);
}
//TableHeader
if(rowPr.m_oTblHeader.IsInit())
{
m_oBcw.m_oStream.WriteBYTE(c_oSerProp_rowPrType::TableHeader);
m_oBcw.m_oStream.WriteBYTE(c_oSerPropLenType::Byte);
m_oBcw.m_oStream.WriteBOOL(rowPr.m_oTblHeader->m_oVal.ToBool());
}
if(rowPr.m_oDel.IsInit())
{
m_oBcw.m_oStream.WriteBYTE(c_oSerProp_rowPrType::Del);
m_oBcw.m_oStream.WriteBYTE(c_oSerPropLenType::Variable);
nCurPos = m_oBcw.WriteItemWithLengthStart();
m_oBcw.WriteTrackRevision(rowPr.m_oDel.get());
m_oBcw.WriteItemWithLengthEnd(nCurPos);
}
if(rowPr.m_oIns.IsInit())
{
m_oBcw.m_oStream.WriteBYTE(c_oSerProp_rowPrType::Ins);
m_oBcw.m_oStream.WriteBYTE(c_oSerPropLenType::Variable);
nCurPos = m_oBcw.WriteItemWithLengthStart();
m_oBcw.WriteTrackRevision(rowPr.m_oIns.get());
m_oBcw.WriteItemWithLengthEnd(nCurPos);
}
if(rowPr.m_oTrPrChange.IsInit())
{
m_oBcw.m_oStream.WriteBYTE(c_oSerProp_rowPrType::trPrChange);
m_oBcw.m_oStream.WriteBYTE(c_oSerPropLenType::Variable);
nCurPos = m_oBcw.WriteItemWithLengthStart();
WriteTrPrChange(rowPr.m_oTrPrChange.get());
m_oBcw.WriteItemWithLengthEnd(nCurPos);
}
}
void WriteAfter(const nullable<ComplexTypes::Word::CDecimalNumber>& GridAfter, const nullable<ComplexTypes::Word::CTblWidth>& WAfter)
{
int nCurPos = 0;
//GridAfter
if(GridAfter.IsInit() && GridAfter->m_oVal.IsInit())
{
m_oBcw.m_oStream.WriteBYTE(c_oSerProp_rowPrType::GridAfter);
m_oBcw.m_oStream.WriteBYTE(c_oSerPropLenType::Long);
m_oBcw.m_oStream.WriteLONG(GridAfter->m_oVal->GetValue());
}
//WAfter
if(WAfter.IsInit())
{
WriteW(c_oSerProp_rowPrType::WAfter, WAfter.get(), true);
}
}
void WriteBefore(const nullable<ComplexTypes::Word::CDecimalNumber>& GridBefore, const nullable<ComplexTypes::Word::CTblWidth>& WBefore)
{
int nCurPos = 0;
//GridBefore
if(GridBefore.IsInit() && GridBefore->m_oVal.IsInit())
{
m_oBcw.m_oStream.WriteBYTE(c_oSerProp_rowPrType::GridBefore);
m_oBcw.m_oStream.WriteBYTE(c_oSerPropLenType::Long);
m_oBcw.m_oStream.WriteLONG(GridBefore->m_oVal->GetValue());
}
//WBefore
if(WBefore.IsInit())
{
WriteW(c_oSerProp_rowPrType::WBefore, WBefore.get(), true);
}
}
void WriteRowHeight(const ComplexTypes::Word::CHeight& rowHeight)
{
if(rowHeight.m_oVal.IsInit())
{
//HRule
//хотя по спецификации отсутсвие hRule долно трактоваться как auto(17.4.81 trHeight (Table Row Height))
//word трактует <w:trHeight w:val="542"/> как AtLeast
SimpleTypes::EHeightRule eHRule = SimpleTypes::heightruleAtLeast;
if(rowHeight.m_oHRule.IsInit())
eHRule = rowHeight.m_oHRule->GetValue();
m_oBcw.m_oStream.WriteBYTE(c_oSerProp_rowPrType::Height_Rule);
m_oBcw.m_oStream.WriteBYTE(c_oSerPropLenType::Byte);
switch(eHRule)
{
case SimpleTypes::heightruleAtLeast :
case SimpleTypes::heightruleExact :m_oBcw.m_oStream.WriteBYTE(heightrule_AtLeast);break;
default :m_oBcw.m_oStream.WriteBYTE(heightrule_Auto);break;
}
//Value
m_oBcw.m_oStream.WriteBYTE(c_oSerProp_rowPrType::Height_Value);
m_oBcw.m_oStream.WriteBYTE(c_oSerPropLenType::Double);
m_oBcw.m_oStream.WriteDouble(rowHeight.m_oVal->ToMm());
}
}
void WriteW(int nType, const ComplexTypes::Word::CTblWidth& tableW, bool bWrite2 = false)
{
int nCurPos = 0;
if(tableW.m_oW.IsInit() && tableW.m_oType.IsInit())
{
if(nType >= 0)
{
if(true == bWrite2)
{
m_oBcw.m_oStream.WriteBYTE(nType);
m_oBcw.m_oStream.WriteBYTE(c_oSerPropLenType::Variable);
nCurPos = m_oBcw.WriteItemWithLengthStart();
}
else
nCurPos = m_oBcw.WriteItemStart(nType);
}
else
{
if(true == bWrite2)
m_oBcw.m_oStream.WriteBYTE(c_oSerPropLenType::Variable);
nCurPos = m_oBcw.WriteItemWithLengthStart();
}
//Type
if(false != tableW.m_oType.IsInit())
{
m_oBcw.m_oStream.WriteBYTE(c_oSerWidthType::Type);
m_oBcw.m_oStream.WriteBYTE(c_oSerPropLenType::Byte);
switch(tableW.m_oType->GetValue())
{
case SimpleTypes::tblwidthAuto:m_oBcw.m_oStream.WriteBYTE(tblwidth_Auto);break;
case SimpleTypes::tblwidthDxa:m_oBcw.m_oStream.WriteBYTE(tblwidth_Mm);break;
case SimpleTypes::tblwidthNil:m_oBcw.m_oStream.WriteBYTE(tblwidth_Nil);break;
case SimpleTypes::tblwidthPct:m_oBcw.m_oStream.WriteBYTE(tblwidth_Pct);break;
default:m_oBcw.m_oStream.WriteBYTE(tblwidth_Auto);break;
}
}
//W
if(false != tableW.m_oW.IsInit())
{
m_oBcw.m_oStream.WriteBYTE(c_oSerWidthType::WDocx);
m_oBcw.m_oStream.WriteBYTE(c_oSerPropLenType::Long);
m_oBcw.m_oStream.WriteLONG(tableW.m_oW->GetValueIntegerPercent());
}
if(nType >= 0)
m_oBcw.WriteItemEnd(nCurPos);
else
m_oBcw.WriteItemWithLengthEnd(nCurPos);
}
}
void WriteCellPr(const OOX::Logic::CTableCellProperties& cellPr)
{
int nCurPos = 0;
//GridSpan
if(cellPr.m_oGridSpan.IsInit() && cellPr.m_oGridSpan->m_oVal.IsInit())
{
m_oBcw.m_oStream.WriteBYTE(c_oSerProp_cellPrType::GridSpan);
m_oBcw.m_oStream.WriteBYTE(c_oSerPropLenType::Long);
m_oBcw.m_oStream.WriteLONG(cellPr.m_oGridSpan->m_oVal->GetValue());
}
//Shd
if(cellPr.m_oShd.IsInit())
{
m_oBcw.m_oStream.WriteBYTE(c_oSerProp_cellPrType::Shd);
m_oBcw.m_oStream.WriteBYTE(c_oSerPropLenType::Variable);
nCurPos = m_oBcw.WriteItemWithLengthStart();
m_oBcw.WriteShd(cellPr.m_oShd.get());
m_oBcw.WriteItemWithLengthEnd(nCurPos);
}
//TableCellBorders
if(cellPr.m_oTcBorders.IsInit())
{
m_oBcw.m_oStream.WriteBYTE(c_oSerProp_cellPrType::TableCellBorders);
m_oBcw.m_oStream.WriteBYTE(c_oSerPropLenType::Variable);
nCurPos = m_oBcw.WriteItemWithLengthStart();
m_oBcw.WriteTcBorders(cellPr.m_oTcBorders.get());
m_oBcw.WriteItemWithLengthEnd(nCurPos);
}
//CellMar
if(cellPr.m_oTcMar.IsInit())
{
m_oBcw.m_oStream.WriteBYTE(c_oSerProp_cellPrType::CellMar);
m_oBcw.m_oStream.WriteBYTE(c_oSerPropLenType::Variable);
nCurPos = m_oBcw.WriteItemWithLengthStart();
WriteCellMar(cellPr.m_oTcMar.get());
m_oBcw.WriteItemWithLengthEnd(nCurPos);
}
//TableCellW
if(cellPr.m_oTcW.IsInit())
{
WriteW(c_oSerProp_cellPrType::TableCellW, cellPr.m_oTcW.get(), true);
}
//VAlign
if(cellPr.m_oVAlign.IsInit() && cellPr.m_oVAlign->m_oVal.IsInit())
{
m_oBcw.m_oStream.WriteBYTE(c_oSerProp_cellPrType::VAlign);
m_oBcw.m_oStream.WriteBYTE(c_oSerPropLenType::Byte);
switch(cellPr.m_oVAlign->m_oVal->GetValue())
{
case SimpleTypes::verticaljcBottom: m_oBcw.m_oStream.WriteBYTE(vertalignjc_Bottom); break;
case SimpleTypes::verticaljcCenter: m_oBcw.m_oStream.WriteBYTE(vertalignjc_Center); break;
case SimpleTypes::verticaljcBoth:
case SimpleTypes::verticaljcTop: m_oBcw.m_oStream.WriteBYTE(vertalignjc_Top); break;
default: m_oBcw.m_oStream.WriteBYTE(vertalignjc_Top);break;
}
}
//VMerge
if(cellPr.m_oVMerge.IsInit())
{
m_oBcw.m_oStream.WriteBYTE(c_oSerProp_cellPrType::VMerge);
m_oBcw.m_oStream.WriteBYTE(c_oSerPropLenType::Byte);
if(cellPr.m_oVMerge->m_oVal.IsInit())
{
switch(cellPr.m_oVMerge->m_oVal->GetValue())
{
case SimpleTypes::mergeContinue: m_oBcw.m_oStream.WriteBYTE(vmerge_Continue); break;
case SimpleTypes::mergeRestart: m_oBcw.m_oStream.WriteBYTE(vmerge_Restart); break;
default: m_oBcw.m_oStream.WriteBYTE(vmerge_Continue);break;
}
}
else
{
m_oBcw.m_oStream.WriteBYTE(vmerge_Continue);
}
}
if(cellPr.m_oCellDel.IsInit())
{
m_oBcw.m_oStream.WriteBYTE(c_oSerProp_cellPrType::CellDel);
m_oBcw.m_oStream.WriteBYTE(c_oSerPropLenType::Variable);
nCurPos = m_oBcw.WriteItemWithLengthStart();
m_oBcw.WriteTrackRevision(cellPr.m_oCellDel.get2());
m_oBcw.WriteItemWithLengthEnd(nCurPos);
}
if(cellPr.m_oCellIns.IsInit())
{
m_oBcw.m_oStream.WriteBYTE(c_oSerProp_cellPrType::CellIns);
m_oBcw.m_oStream.WriteBYTE(c_oSerPropLenType::Variable);
nCurPos = m_oBcw.WriteItemWithLengthStart();
m_oBcw.WriteTrackRevision(cellPr.m_oCellIns.get2());
m_oBcw.WriteItemWithLengthEnd(nCurPos);
}
if(cellPr.m_oCellMerge.IsInit())
{
m_oBcw.m_oStream.WriteBYTE(c_oSerProp_cellPrType::CellMerge);
m_oBcw.m_oStream.WriteBYTE(c_oSerPropLenType::Variable);
nCurPos = m_oBcw.WriteItemWithLengthStart();
WriteCellMerge(cellPr.m_oCellMerge.get());
m_oBcw.WriteItemWithLengthEnd(nCurPos);
}
if(cellPr.m_oTcPrChange.IsInit())
{
m_oBcw.m_oStream.WriteBYTE(c_oSerProp_cellPrType::tcPrChange);
m_oBcw.m_oStream.WriteBYTE(c_oSerPropLenType::Variable);
nCurPos = m_oBcw.WriteItemWithLengthStart();
WriteTcPrChange(cellPr.m_oTcPrChange.get());
m_oBcw.WriteItemWithLengthEnd(nCurPos);
}
if(cellPr.m_oTextDirection.IsInit() && cellPr.m_oTextDirection->m_oVal.IsInit())
{
m_oBcw.m_oStream.WriteBYTE(c_oSerProp_cellPrType::textDirection);
m_oBcw.m_oStream.WriteBYTE(c_oSerPropLenType::Byte);
m_oBcw.m_oStream.WriteBYTE(cellPr.m_oTextDirection->m_oVal->GetValue());
}
if(cellPr.m_oHideMark.IsInit())
{
m_oBcw.m_oStream.WriteBYTE(c_oSerProp_cellPrType::hideMark);
m_oBcw.m_oStream.WriteBYTE(c_oSerPropLenType::Byte);
m_oBcw.m_oStream.WriteBOOL(cellPr.m_oHideMark->m_oVal.ToBool());
}
if(cellPr.m_oNoWrap.IsInit())
{
m_oBcw.m_oStream.WriteBYTE(c_oSerProp_cellPrType::noWrap);
m_oBcw.m_oStream.WriteBYTE(c_oSerPropLenType::Byte);
m_oBcw.m_oStream.WriteBOOL(cellPr.m_oNoWrap->m_oVal.ToBool());
}
if(cellPr.m_oTcFitText.IsInit())
{
m_oBcw.m_oStream.WriteBYTE(c_oSerProp_cellPrType::tcFitText);
m_oBcw.m_oStream.WriteBYTE(c_oSerPropLenType::Byte);
m_oBcw.m_oStream.WriteBOOL(cellPr.m_oTcFitText->m_oVal.ToBool());
}
}
void WriteCellMerge(const ComplexTypes::Word::CCellMergeTrackChange& cellMerge)
{
int nCurPos = 0;
m_oBcw.WriteTrackRevision(cellMerge);
if(cellMerge.m_oVMerge.IsInit())
{
nCurPos = m_oBcw.WriteItemStart(c_oSerProp_RevisionType::VMerge);
m_oBcw.m_oStream.WriteLONG(cellMerge.m_oVMerge->GetValue());
m_oBcw.WriteItemWithLengthEnd(nCurPos);
}
if(cellMerge.m_oVMergeOrig.IsInit())
{
nCurPos = m_oBcw.WriteItemStart(c_oSerProp_RevisionType::VMergeOrigin);
m_oBcw.m_oStream.WriteLONG(cellMerge.m_oVMergeOrig->GetValue());
m_oBcw.WriteItemWithLengthEnd(nCurPos);
}
}
void WriteTblPrChange(const OOX::Logic::CTblPrChange& tblPrChange)
{
int nCurPos = 0;
m_oBcw.WriteTrackRevision(tblPrChange);
if(tblPrChange.m_pTblPr.IsInit())
{
nCurPos = m_oBcw.WriteItemStart(c_oSerProp_RevisionType::tblPrChange);
WriteTblPr(tblPrChange.m_pTblPr.GetPointer());
m_oBcw.WriteItemWithLengthEnd(nCurPos);
}
}
void WriteTcPrChange(const OOX::Logic::CTcPrChange& tcPrChange)
{
int nCurPos = 0;
m_oBcw.WriteTrackRevision(tcPrChange);
if(tcPrChange.m_pTcPr.IsInit())
{
nCurPos = m_oBcw.WriteItemStart(c_oSerProp_RevisionType::tcPrChange);
WriteCellPr(tcPrChange.m_pTcPr.get());
m_oBcw.WriteItemWithLengthEnd(nCurPos);
}
}
void WriteTrPrChange(const OOX::Logic::CTrPrChange& trPrChange)
{
int nCurPos = 0;
m_oBcw.WriteTrackRevision(trPrChange);
if(trPrChange.m_pTrPr.IsInit())
{
nCurPos = m_oBcw.WriteItemStart(c_oSerProp_RevisionType::trPrChange);
WriteRowPr(trPrChange.m_pTrPr.get());
m_oBcw.WriteItemWithLengthEnd(nCurPos);
}
}
};
class BinaryStyleTableWriter
{
BinaryCommonWriter m_oBcw;
Binary_pPrWriter bpPrs;
Binary_rPrWriter brPrs;
Binary_tblPrWriter btblPrs;
int m_nReaderGenName;
public:
BinaryStyleTableWriter(ParamsWriter& oParamsWriter):
m_oBcw(oParamsWriter),bpPrs(oParamsWriter, NULL),brPrs(oParamsWriter),btblPrs(oParamsWriter)
{
m_nReaderGenName = 0;
}
void Write(OOX::CStyles& styles)
{
int nStart = m_oBcw.WriteItemWithLengthStart();
WriteStylesContent(styles);
m_oBcw.WriteItemWithLengthEnd(nStart);
}
void WriteStylesContent(OOX::CStyles& styles)
{
int nCurPos;
if(false != styles.m_oDocDefaults.IsInit())
{
const OOX::CDocDefaults& oDocDefaults = styles.m_oDocDefaults.get();
//выставялем в качестве default настроек, те что word выставляет если нет тегов w:docDefaults
//default pPr
OOX::Logic::CParagraphProperty oWordDefParPr;
oWordDefParPr.m_oSpacing.Init();
oWordDefParPr.m_oSpacing->m_oAfter.Init();
oWordDefParPr.m_oSpacing->m_oAfter->FromPoints(0);
oWordDefParPr.m_oSpacing->m_oBefore.Init();
oWordDefParPr.m_oSpacing->m_oBefore->FromPoints(0);
oWordDefParPr.m_oSpacing->m_oLineRule.Init();
oWordDefParPr.m_oSpacing->m_oLineRule->SetValue(SimpleTypes::linespacingruleAuto);
oWordDefParPr.m_oSpacing->m_oLine.Init();
oWordDefParPr.m_oSpacing->m_oLine->FromPoints(12);//240 twips
if(false != oDocDefaults.m_oParPr.IsInit())
oWordDefParPr = OOX::Logic::CParagraphProperty::Merge(oWordDefParPr, oDocDefaults.m_oParPr.get());
nCurPos = m_oBcw.WriteItemStart(c_oSer_st::DefpPr);
bpPrs.Write_pPr(oWordDefParPr);
m_oBcw.WriteItemEnd(nCurPos);
//default rPr
OOX::Logic::CRunProperty oWordDefTextPr;
oWordDefTextPr.m_oRFonts.Init();
oWordDefTextPr.m_oRFonts->m_sAscii.Init();
CString sAscii = brPrs.m_oFontProcessor.getFont(CString(_T("Times New Roman")));
oWordDefTextPr.m_oRFonts->m_sAscii = sAscii;
if(NULL != m_oBcw.m_pEmbeddedFontsManager)
m_oBcw.m_pEmbeddedFontsManager->CheckFont(sAscii, brPrs.m_oFontProcessor.getFontManager());
oWordDefTextPr.m_oSz.Init();
oWordDefTextPr.m_oSz->m_oVal.Init();
oWordDefTextPr.m_oSz->m_oVal->FromPoints(10);
if(false != oDocDefaults.m_oRunPr.IsInit())
oWordDefTextPr = OOX::Logic::CRunProperty::Merge(oWordDefTextPr, oDocDefaults.m_oRunPr.get());
nCurPos = m_oBcw.WriteItemStart(c_oSer_st::DefrPr);
brPrs.Write_rPr(oWordDefTextPr);
m_oBcw.WriteItemEnd(nCurPos);
}
//styles
nCurPos = m_oBcw.WriteItemStart(c_oSer_st::Styles);
WriteStyles(styles.m_arrStyle);
m_oBcw.WriteItemEnd(nCurPos);
}
void WriteStyles(std::vector<OOX::CStyle*>& styles)
{
int nCurPos = 0;
for(int i = 0, length = styles.size(); i < length; ++i)
{
const OOX::CStyle& style = *styles[i];
if(false != style.m_sStyleId.IsInit())
{
nCurPos = m_oBcw.WriteItemStart(c_oSer_sts::Style);
WriteStyle(style);
m_oBcw.WriteItemEnd(nCurPos);
}
}
}
void WriteStyle(const OOX::CStyle& style)
{
int nCurPos = 0;
//ID
if(false != style.m_sStyleId.IsInit())
{
m_oBcw.m_oStream.WriteBYTE(c_oSer_sts::Style_Id);
m_oBcw.m_oStream.WriteStringW(style.m_sStyleId.get2());
}
//Name
CString sName;
if(false != style.m_oName.IsInit())
sName = style.m_oName->ToString2();
else
sName.Format(_T("StGen%d"), m_nReaderGenName++);
m_oBcw.m_oStream.WriteBYTE(c_oSer_sts::Style_Name);
m_oBcw.m_oStream.WriteStringW(sName);
//Type
if(false != style.m_oType.IsInit())
{
nCurPos = m_oBcw.WriteItemStart(c_oSer_sts::Style_Type);
BYTE byteType = 0;
switch(style.m_oType->GetValue())
{
case SimpleTypes::styletypeCharacter: byteType = styletype_Character;break;
case SimpleTypes::styletypeNumbering: byteType = styletype_Numbering;break;
case SimpleTypes::styletypeTable: byteType = styletype_Table;break;
default:byteType = styletype_Paragraph;break;
}
m_oBcw.m_oStream.WriteBYTE(byteType);
m_oBcw.WriteItemEnd(nCurPos);
}
//Default
if(false != style.m_oDefault.IsInit())
{
nCurPos = m_oBcw.WriteItemStart(c_oSer_sts::Style_Default);
m_oBcw.m_oStream.WriteBOOL(SimpleTypes::onoffTrue == style.m_oDefault->GetValue());
m_oBcw.WriteItemEnd(nCurPos);
}
//BasedOn
if(false != style.m_oBasedOn.IsInit())
{
m_oBcw.m_oStream.WriteBYTE(c_oSer_sts::Style_BasedOn);
m_oBcw.m_oStream.WriteStringW(style.m_oBasedOn.get().ToString2());
}
//NextId
if(false != style.m_oNext.IsInit())
{
m_oBcw.m_oStream.WriteBYTE(c_oSer_sts::Style_Next);
m_oBcw.m_oStream.WriteStringW(style.m_oNext.get().ToString2());
}
//qFormat
if(false != style.m_oQFormat.IsInit())
{
nCurPos = m_oBcw.WriteItemStart(c_oSer_sts::Style_qFormat);
m_oBcw.m_oStream.WriteBOOL(SimpleTypes::onoffTrue == style.m_oQFormat->m_oVal.GetValue());
m_oBcw.WriteItemEnd(nCurPos);
}
//uiPriority
if(false != style.m_oUiPriority.IsInit() && style.m_oUiPriority->m_oVal.IsInit())
{
nCurPos = m_oBcw.WriteItemStart(c_oSer_sts::Style_uiPriority);
m_oBcw.m_oStream.WriteLONG(style.m_oUiPriority->m_oVal->GetValue());
m_oBcw.WriteItemEnd(nCurPos);
}
//hidden
if(false != style.m_oHidden.IsInit())
{
nCurPos = m_oBcw.WriteItemStart(c_oSer_sts::Style_hidden);
m_oBcw.m_oStream.WriteBOOL(SimpleTypes::onoffTrue == style.m_oHidden->m_oVal.GetValue());
m_oBcw.WriteItemEnd(nCurPos);
}
//semiHidden
if(false != style.m_oSemiHidden.IsInit())
{
nCurPos = m_oBcw.WriteItemStart(c_oSer_sts::Style_semiHidden);
m_oBcw.m_oStream.WriteBOOL(SimpleTypes::onoffTrue == style.m_oSemiHidden->m_oVal.GetValue());
m_oBcw.WriteItemEnd(nCurPos);
}
//unhideWhenUsed
if(false != style.m_oUnhideWhenUsed.IsInit())
{
nCurPos = m_oBcw.WriteItemStart(c_oSer_sts::Style_unhideWhenUsed);
m_oBcw.m_oStream.WriteBOOL(SimpleTypes::onoffTrue == style.m_oUnhideWhenUsed->m_oVal.GetValue());
m_oBcw.WriteItemEnd(nCurPos);
}
//TextPr
if(false != style.m_oRunPr.IsInit())
{
nCurPos = m_oBcw.WriteItemStart(c_oSer_sts::Style_TextPr);
brPrs.Write_rPr(style.m_oRunPr.get());
m_oBcw.WriteItemEnd(nCurPos);
}
//ParaPr
if(false != style.m_oParPr.IsInit())
{
nCurPos = m_oBcw.WriteItemStart(c_oSer_sts::Style_ParaPr);
bpPrs.Write_pPr(style.m_oParPr.get());
m_oBcw.WriteItemEnd(nCurPos);
}
//TblPr
if(false != style.m_oTblPr.IsInit())
{
nCurPos = m_oBcw.WriteItemStart(c_oSer_sts::Style_TablePr);
btblPrs.WriteTblPr(style.m_oTblPr.operator ->());
m_oBcw.WriteItemEnd(nCurPos);
}
//TrPr
if(false != style.m_oTrPr.IsInit())
{
nCurPos = m_oBcw.WriteItemStart(c_oSer_sts::Style_RowPr);
btblPrs.WriteRowPr(style.m_oTrPr.get());
m_oBcw.WriteItemEnd(nCurPos);
}
//TcPr
if(false != style.m_oTcPr.IsInit())
{
nCurPos = m_oBcw.WriteItemStart(c_oSer_sts::Style_CellPr);
btblPrs.WriteCellPr(style.m_oTcPr.get());
m_oBcw.WriteItemEnd(nCurPos);
}
//TblStylePr
if(style.m_arrTblStylePr.size() > 0)
{
nCurPos = m_oBcw.WriteItemStart(c_oSer_sts::Style_TblStylePr);
WriteTblStylePr(style.m_arrTblStylePr);
m_oBcw.WriteItemEnd(nCurPos);
}
}
void WriteTblStylePr(const std::vector<OOX::Logic::CTableStyleProperties*>& aProperties)
{
int nCurPos = 0;
for(int i = 0, length = aProperties.size(); i < length; ++i)
{
nCurPos = m_oBcw.WriteItemStart(c_oSerProp_tblStylePrType::TblStylePr);
WriteTblStyleProperties(*aProperties[i]);
m_oBcw.WriteItemEnd(nCurPos);
}
}
void WriteTblStyleProperties(const OOX::Logic::CTableStyleProperties& oProperty)
{
int nCurPos = 0;
//Type
if(oProperty.m_oType.IsInit())
{
nCurPos = m_oBcw.WriteItemStart(c_oSerProp_tblStylePrType::Type);
m_oBcw.m_oStream.WriteBYTE(oProperty.m_oType->GetValue());
m_oBcw.WriteItemEnd(nCurPos);
//TextPr
if(false != oProperty.m_oRunPr.IsInit())
{
nCurPos = m_oBcw.WriteItemStart(c_oSerProp_tblStylePrType::RunPr);
brPrs.Write_rPr(oProperty.m_oRunPr.get());
m_oBcw.WriteItemEnd(nCurPos);
}
//ParaPr
if(false != oProperty.m_oParPr.IsInit())
{
nCurPos = m_oBcw.WriteItemStart(c_oSerProp_tblStylePrType::ParPr);
bpPrs.Write_pPr(oProperty.m_oParPr.get());
m_oBcw.WriteItemEnd(nCurPos);
}
//TblPr
if(false != oProperty.m_oTblPr.IsInit())
{
nCurPos = m_oBcw.WriteItemStart(c_oSerProp_tblStylePrType::TblPr);
btblPrs.WriteTblPr(oProperty.m_oTblPr.operator ->());
m_oBcw.WriteItemEnd(nCurPos);
}
//TrPr
if(false != oProperty.m_oTrPr.IsInit())
{
nCurPos = m_oBcw.WriteItemStart(c_oSerProp_tblStylePrType::TrPr);
btblPrs.WriteRowPr(oProperty.m_oTrPr.get());
m_oBcw.WriteItemEnd(nCurPos);
}
//TcPr
if(false != oProperty.m_oTcPr.IsInit())
{
nCurPos = m_oBcw.WriteItemStart(c_oSerProp_tblStylePrType::TcPr);
btblPrs.WriteCellPr(oProperty.m_oTcPr.get());
m_oBcw.WriteItemEnd(nCurPos);
}
}
}
};
class BinaryNumberingTableWriter
{
BinaryCommonWriter m_oBcw;
Binary_pPrWriter bpPrs;
Binary_rPrWriter brPrs;
public:
BinaryNumberingTableWriter(ParamsWriter& oParamsWriter):
m_oBcw(oParamsWriter),bpPrs(oParamsWriter, NULL),brPrs(oParamsWriter)
{
}
void Write(const OOX::CNumbering& numbering)
{
int nStart = m_oBcw.WriteItemWithLengthStart();
WriteNumberingContent(numbering);
m_oBcw.WriteItemWithLengthEnd(nStart);
}
void WriteNumberingContent(const OOX::CNumbering& numbering)
{
int nCurPos = 0;
//AbstractNums
nCurPos = m_oBcw.WriteItemStart(c_oSerNumTypes::AbstractNums);
WriteAbstractNums(numbering);
m_oBcw.WriteItemEnd(nCurPos);
//Nums
nCurPos = m_oBcw.WriteItemStart(c_oSerNumTypes::Nums);
WriteNums(numbering);
m_oBcw.WriteItemEnd(nCurPos);
}
void WriteNums(const OOX::CNumbering& numbering)
{
int nCurPos = 0;
for(int i = 0, length = numbering.m_arrNum.size(); i < length; ++i)
{
const OOX::Numbering::CNum& num = *numbering.m_arrNum[i];
//num
if(num.m_oAbstractNumId.IsInit() && num.m_oAbstractNumId->m_oVal.IsInit() && num.m_oNumId.IsInit())
{
nCurPos = m_oBcw.WriteItemStart(c_oSerNumTypes::Num);
WriteNum(num);
m_oBcw.WriteItemEnd(nCurPos);
}
}
}
void WriteNum(const OOX::Numbering::CNum& num)
{
int nCurPos = 0;
int nANumId = num.m_oAbstractNumId->m_oVal->GetValue();
int nNumId = num.m_oNumId->GetValue();
m_oBcw.m_oStream.WriteBYTE(c_oSerNumTypes::Num_ANumId);
m_oBcw.m_oStream.WriteBYTE(c_oSerPropLenType::Long);
m_oBcw.m_oStream.WriteLONG(nANumId);
m_oBcw.m_oStream.WriteBYTE(c_oSerNumTypes::Num_NumId);
m_oBcw.m_oStream.WriteBYTE(c_oSerPropLenType::Long);
m_oBcw.m_oStream.WriteLONG(nNumId);
}
void WriteAbstractNums(const OOX::CNumbering& numbering)
{
int nCurPos = 0;
int nRealCount = 0;
for(int i = 0, length = numbering.m_arrAbstractNum.size(); i < length; ++i)
{
const OOX::Numbering::CAbstractNum& num = *numbering.m_arrAbstractNum[i];
if(false != num.m_oAbstractNumId.IsInit())
{
nCurPos = m_oBcw.WriteItemStart(c_oSerNumTypes::AbstractNum);
WriteAbstractNum(num, nRealCount, numbering.m_arrNum);
m_oBcw.WriteItemEnd(nCurPos);
nRealCount++;
}
}
}
void WriteAbstractNum(const OOX::Numbering::CAbstractNum& num, int nIndex, const std::vector<OOX::Numbering::CNum*>& aNums)
{
int nCurPos = 0;
//Id
if(num.m_oAbstractNumId.IsInit())
{
nCurPos = m_oBcw.WriteItemStart(c_oSerNumTypes::AbstractNum_Id);
m_oBcw.m_oStream.WriteLONG(num.m_oAbstractNumId->GetValue());
m_oBcw.WriteItemEnd(nCurPos);
}
//Type
if(false != num.m_oMultiLevelType.IsInit())
{
//todo
//nCurPos = m_oBcw.WriteItemStart(c_oSerNumTypes::AbstractNum_Type);
//m_oBcw.m_oStream.WriteBYTE(num.Type);
//m_oBcw.WriteItemEnd(nCurPos);
}
//NumStyleLink
if(false != num.m_oNumStyleLink.IsInit())
{
m_oBcw.m_oStream.WriteBYTE(c_oSerNumTypes::NumStyleLink);
m_oBcw.m_oStream.WriteStringW(num.m_oNumStyleLink.get().ToString2());
}
//StyleLink
if(false != num.m_oStyleLink.IsInit())
{
m_oBcw.m_oStream.WriteBYTE(c_oSerNumTypes::StyleLink);
m_oBcw.m_oStream.WriteStringW(num.m_oStyleLink.get().ToString2());
}
//Lvl
nCurPos = m_oBcw.WriteItemStart(c_oSerNumTypes::AbstractNum_Lvls);
WriteLevels(num.m_arrLvl, num.m_oAbstractNumId.get().GetValue(), aNums);
m_oBcw.WriteItemEnd(nCurPos);
}
void WriteLevels(const std::vector<OOX::Numbering::CLvl*>& lvls, int nAId, const std::vector<OOX::Numbering::CNum*>& aNums)
{
int nCurPos = 0;
for(int i = 0, length = lvls.size(); i < length; ++i)
{
nCurPos = m_oBcw.WriteItemStart(c_oSerNumTypes::Lvl);
WriteLevel(*lvls[i], i, nAId, aNums);
m_oBcw.WriteItemEnd(nCurPos);
}
}
void WriteLevel(const OOX::Numbering::CLvl& lvl, int index, int nAId, const std::vector<OOX::Numbering::CNum*>& aNums)
{
int nCurPos = 0;
//Format
if(false != lvl.m_oNumFmt.IsInit())
{
const ComplexTypes::Word::CNumFmt& oNumFmt = lvl.m_oNumFmt.get();
if(false != oNumFmt.m_oVal.IsInit())
{
const SimpleTypes::CNumberFormat<>& oNumberFormat = oNumFmt.m_oVal.get();
m_oBcw.m_oStream.WriteBYTE(c_oSerNumTypes::lvl_Format);
m_oBcw.m_oStream.WriteBYTE(c_oSerPropLenType::Long);
switch(oNumberFormat.GetValue())
{
case SimpleTypes::numberformatNone: m_oBcw.m_oStream.WriteLONG(numbering_numfmt_None);break;
case SimpleTypes::numberformatBullet: m_oBcw.m_oStream.WriteLONG(numbering_numfmt_Bullet);break;
case SimpleTypes::numberformatDecimal: m_oBcw.m_oStream.WriteLONG(numbering_numfmt_Decimal);break;
case SimpleTypes::numberformatLowerRoman: m_oBcw.m_oStream.WriteLONG(numbering_numfmt_LowerRoman);break;
case SimpleTypes::numberformatUpperRoman: m_oBcw.m_oStream.WriteLONG(numbering_numfmt_UpperRoman);break;
case SimpleTypes::numberformatLowerLetter: m_oBcw.m_oStream.WriteLONG(numbering_numfmt_LowerLetter);break;
case SimpleTypes::numberformatUpperLetter: m_oBcw.m_oStream.WriteLONG(numbering_numfmt_UpperLetter);break;
case SimpleTypes::numberformatDecimalZero: m_oBcw.m_oStream.WriteLONG(numbering_numfmt_DecimalZero);break;
default: m_oBcw.m_oStream.WriteLONG(numbering_numfmt_Decimal);break;
}
}
}
//Jc
if(false != lvl.m_oLvlJc.IsInit())
{
const ComplexTypes::Word::CJc& oJc = lvl.m_oLvlJc.get();
if(false != oJc.m_oVal.IsInit())
{
m_oBcw.m_oStream.WriteBYTE(c_oSerNumTypes::lvl_Jc);
m_oBcw.m_oStream.WriteBYTE(c_oSerPropLenType::Byte);
switch(oJc.m_oVal.get().GetValue())
{
case SimpleTypes::jcCenter: m_oBcw.m_oStream.WriteBYTE(align_Center);break;
case SimpleTypes::jcStart:
case SimpleTypes::jcLeft: m_oBcw.m_oStream.WriteBYTE(align_Left);break;
case SimpleTypes::jcEnd:
case SimpleTypes::jcRight: m_oBcw.m_oStream.WriteBYTE(align_Right);break;
case SimpleTypes::jcBoth:
case SimpleTypes::jcThaiDistribute:
case SimpleTypes::jcDistribute: m_oBcw.m_oStream.WriteBYTE(align_Justify);break;
default: m_oBcw.m_oStream.WriteBYTE(align_Left);break;
}
}
}
//LvlText
if(false != lvl.m_oLvlText.IsInit())
{
const ComplexTypes::Word::CLevelText& oText = lvl.m_oLvlText.get();
if(false != oText.m_sVal.IsInit())
{
m_oBcw.m_oStream.WriteBYTE(c_oSerNumTypes::lvl_LvlText);
m_oBcw.m_oStream.WriteBYTE(c_oSerPropLenType::Variable);
nCurPos = m_oBcw.WriteItemWithLengthStart();
WriteLevelText(oText.m_sVal.get());
m_oBcw.WriteItemWithLengthEnd(nCurPos);
}
}
//Restart
if(false != lvl.m_oLvlRestart.IsInit())
{
const ComplexTypes::Word::CDecimalNumber& oVal = lvl.m_oLvlRestart.get();
if(oVal.m_oVal.IsInit())
{
int nVal = oVal.m_oVal.get().GetValue();
if(0 != nVal)
nVal = -1;
m_oBcw.m_oStream.WriteBYTE(c_oSerNumTypes::lvl_Restart);
m_oBcw.m_oStream.WriteBYTE(c_oSerPropLenType::Long);
m_oBcw.m_oStream.WriteLONG(nVal);
}
}
//Start
if(false != lvl.m_oStart.IsInit())
{
const ComplexTypes::Word::CDecimalNumber& oVal = lvl.m_oStart.get();
if(oVal.m_oVal.IsInit())
{
m_oBcw.m_oStream.WriteBYTE(c_oSerNumTypes::lvl_Start);
m_oBcw.m_oStream.WriteBYTE(c_oSerPropLenType::Long);
m_oBcw.m_oStream.WriteLONG(oVal.m_oVal.get().GetValue());
}
}
//Suff
if(false != lvl.m_oSuffix.IsInit())
{
const ComplexTypes::Word::CLevelSuffix& oSuff = lvl.m_oSuffix.get();
if(false != oSuff.m_oVal.IsInit())
{
m_oBcw.m_oStream.WriteBYTE(c_oSerNumTypes::lvl_Suff);
m_oBcw.m_oStream.WriteBYTE(c_oSerPropLenType::Byte);
switch(oSuff.m_oVal.get().GetValue())
{
case SimpleTypes::levelsuffixNothing: m_oBcw.m_oStream.WriteBYTE(numbering_suff_Nothing);break;
case SimpleTypes::levelsuffixSpace: m_oBcw.m_oStream.WriteBYTE(numbering_suff_Space);break;
case SimpleTypes::levelsuffixTab: m_oBcw.m_oStream.WriteBYTE(numbering_suff_Tab);break;
default: m_oBcw.m_oStream.WriteBYTE(numbering_suff_Tab);break;
}
}
}
//PStyle
if(false != lvl.m_oPStyle.IsInit() && lvl.m_oPStyle->m_sVal.IsInit())
{
m_oBcw.m_oStream.WriteBYTE(c_oSerNumTypes::lvl_PStyle);
m_oBcw.m_oStream.WriteBYTE(c_oSerPropLenType::Variable);
m_oBcw.m_oStream.WriteStringW(lvl.m_oPStyle->m_sVal.get2());
}
//ParaPr
if(false != lvl.m_oPPr.IsInit())
{
m_oBcw.m_oStream.WriteBYTE(c_oSerNumTypes::lvl_ParaPr);
m_oBcw.m_oStream.WriteBYTE(c_oSerPropLenType::Variable);
nCurPos = m_oBcw.WriteItemWithLengthStart();
bpPrs.Write_pPr(lvl.m_oPPr.get());
m_oBcw.WriteItemWithLengthEnd(nCurPos);
}
//TextPr
if(false != lvl.m_oRPr.IsInit())
{
OOX::Logic::CRunProperty* p_rPr = NULL;
if(false != lvl.m_oRPr.IsInit())
p_rPr = lvl.m_oRPr.operator ->();
m_oBcw.m_oStream.WriteBYTE(c_oSerNumTypes::lvl_TextPr);
m_oBcw.m_oStream.WriteBYTE(c_oSerPropLenType::Variable);
nCurPos = m_oBcw.WriteItemWithLengthStart();
if(NULL != p_rPr)
brPrs.Write_rPr(*p_rPr);
m_oBcw.WriteItemWithLengthEnd(nCurPos);
}
}
void WriteLevelText(const CString& text)
{
int nCurPos = 0;
for(int i = 0, length = text.GetLength(); i < length; ++i)
{
if('%' == text[i] && i + 1 < length && '0' <= text[i + 1] && text[i + 1] <= '9')
{
nCurPos = m_oBcw.WriteItemStart(c_oSerNumTypes::lvl_LvlTextItem);
m_oBcw.m_oStream.WriteBYTE(c_oSerNumTypes::lvl_LvlTextItemNum);
int nCurPos2 = m_oBcw.WriteItemWithLengthStart();
int nNum = text[i + 1] - '0';
if(nNum > 0)
nNum--;
m_oBcw.m_oStream.WriteBYTE(nNum);
m_oBcw.WriteItemWithLengthEnd(nCurPos2);
m_oBcw.WriteItemEnd(nCurPos);
i++;
}
else
{
nCurPos = m_oBcw.WriteItemStart(c_oSerNumTypes::lvl_LvlTextItem);
m_oBcw.m_oStream.WriteBYTE(c_oSerNumTypes::lvl_LvlTextItemText);
CString strChar;
strChar.AppendChar(text[i]);
m_oBcw.m_oStream.WriteStringW(strChar);
if(NULL != m_oBcw.m_pEmbeddedFontsManager)
m_oBcw.m_pEmbeddedFontsManager->CheckString(strChar);
m_oBcw.WriteItemEnd(nCurPos);
}
}
}
};
class BinaryOtherTableWriter
{
class EmbeddedBinaryWriter
{
private: NSBinPptxRW::CBinaryFileWriter &m_oStream;
public: EmbeddedBinaryWriter(NSBinPptxRW::CBinaryFileWriter &oStream):m_oStream(oStream)
{
}
public: void WriteBYTE(BYTE btVal)
{
m_oStream.WriteBYTE(btVal);
}
public: void WriteString(CString& sVal)
{
m_oStream.WriteStringW2(sVal);
}
public: void WriteULONG(long nVal)
{
m_oStream.WriteLONG(nVal);
}
};
BinaryCommonWriter m_oBcw;
BYTE* m_pThemeData;
long m_nThemeDataSize;
ParamsWriter& m_oParamsWriter;
public:
BinaryOtherTableWriter(ParamsWriter& oParamsWriter, BYTE* pThemeData, long nThemeDataSize):m_oParamsWriter(oParamsWriter),m_oBcw(oParamsWriter),m_pThemeData(pThemeData),m_nThemeDataSize(nThemeDataSize)
{
}
void Write()
{
int nStart = m_oBcw.WriteItemWithLengthStart();
WriteOtherContent();
m_oBcw.WriteItemWithLengthEnd(nStart);
}
void WriteOtherContent()
{
//ImageMap
//int nStart = m_oBcw.WriteItemStart(c_oSerOtherTableTypes::ImageMap);
//WriteImageMapContent();
//m_oBcw.WriteItemEnd(nStart);
//EmbeddedFonts
if(NULL != m_oBcw.m_pEmbeddedFontsManager)
{
EmbeddedBinaryWriter oEmbeddedBinaryWriter(m_oBcw.m_oStream);
int nStart = m_oBcw.WriteItemStart(c_oSerOtherTableTypes::EmbeddedFonts);
m_oBcw.m_pEmbeddedFontsManager->WriteEmbeddedFonts<EmbeddedBinaryWriter>(&oEmbeddedBinaryWriter);
m_oBcw.WriteItemEnd(nStart);
}
if(NULL != m_pThemeData)
{
m_oBcw.m_oStream.WriteBYTE(c_oSerOtherTableTypes::DocxTheme);
m_oBcw.WriteBytesArray(m_pThemeData, m_nThemeDataSize);
}
}
};
class BinaryDocumentTableWriter
{
ParamsWriter& m_oParamsWriter;
ParamsDocumentWriter& m_oParamsDocumentWriter;
BinaryCommonWriter m_oBcw;
Binary_pPrWriter bpPrs;
Binary_rPrWriter brPrs;
CString m_sCurParStyle;
OOX::CSettings* m_oSettings;
//для fldChar
//todo в документации описан случай если нет fldchartypeEnd, у нас работает не так.
std::vector<FldStruct*> m_aFldChars;
CString m_sFldChar;
SimpleTypes::EFldCharType m_eFldState;
NSBinPptxRW::CDrawingConverter* m_pOfficeDrawingConverter;
std::map<int, bool>* m_mapIgnoreComments;
public:
Binary_tblPrWriter btblPrs;
OOX::Logic::CSectionProperty* pSectPr;
OOX::Logic::CBackground * pBackground;
bool m_bWriteSectPr;//Записывать ли свойства верхнего уровня в данном экземпляре BinaryOtherTableWriter
//---------------------------------
BinaryDocumentTableWriter(ParamsWriter& oParamsWriter, ParamsDocumentWriter& oParamsDocumentWriter, std::map<int, bool>* mapIgnoreComments, BinaryHeaderFooterTableWriter* oBinaryHeaderFooterTableWriter):
m_oParamsWriter(oParamsWriter), m_oParamsDocumentWriter(oParamsDocumentWriter),m_oBcw(oParamsWriter),bpPrs(oParamsWriter, oBinaryHeaderFooterTableWriter),brPrs(oParamsWriter),btblPrs(oParamsWriter),m_oSettings(oParamsWriter.m_oSettings),m_pOfficeDrawingConverter(oParamsWriter.m_pOfficeDrawingConverter),m_mapIgnoreComments(mapIgnoreComments)
{
pBackground = NULL;
pSectPr = NULL;
m_bWriteSectPr = false;
m_eFldState = SimpleTypes::fldchartypeEnd;
}
~BinaryDocumentTableWriter()
{
for(int i = 0, length = m_aFldChars.size(); i < length; ++i)
{
RELEASEOBJECT(m_aFldChars[i]);
}
}
void prepareOfficeDrawingConverter(NSBinPptxRW::CDrawingConverter* pOfficeDrawingConverter, CString& sDocumentPath, std::vector<CString>& aShapeTypes)
{
pOfficeDrawingConverter->SetRelsPath(sDocumentPath);
for(int i = 0, length = aShapeTypes.size(); i < length; ++i)
{
CString& sShapeType = aShapeTypes[i];
pOfficeDrawingConverter->AddShapeType(sShapeType);
}
}
void Write(std::vector<OOX::WritingElement*>& aElems)
{
int nStart = m_oBcw.WriteItemWithLengthStart();
WriteDocumentContent(aElems);
m_oBcw.WriteItemWithLengthEnd(nStart);
}
void WriteDocumentContent(const std::vector<OOX::WritingElement*>& aElems)
{
int nCurPos = 0;
for ( size_t i = 0, length = aElems.size(); i < length; ++i )
{
OOX::WritingElement* item = aElems[i];
switch(item->getType())
{
case OOX::et_w_p:
{
OOX::Logic::CParagraph* pParagraph = static_cast<OOX::Logic::CParagraph*>(item);
OOX::Logic::CParagraphProperty* pPr = pParagraph->m_oParagraphProperty;
m_oBcw.m_oStream.WriteBYTE(c_oSerParType::Par);
nCurPos = m_oBcw.WriteItemWithLengthStart();
WriteParapraph(*pParagraph, pPr);
m_oBcw.WriteItemWithLengthEnd(nCurPos);
}break;
case OOX::et_w_tbl:
{
OOX::Logic::CTbl* pTbl = static_cast<OOX::Logic::CTbl*>(item);
m_oBcw.m_oStream.WriteBYTE(c_oSerParType::Table);
nCurPos = m_oBcw.WriteItemWithLengthStart();
WriteDocTable(*pTbl);
m_oBcw.WriteItemWithLengthEnd(nCurPos);
}break;
case OOX::et_w_sdt:
{
OOX::Logic::CSdt* pStd = static_cast<OOX::Logic::CSdt*>(item);
if(pStd->m_oSdtContent.IsInit())
WriteDocumentContent(pStd->m_oSdtContent.get().m_arrItems);
}break;
case OOX::et_w_smartTag:
{
OOX::Logic::CSmartTag* pSmartTag = static_cast<OOX::Logic::CSmartTag*>(item);
WriteDocumentContent(pSmartTag->m_arrItems);
}break;
case OOX::et_w_dir:
{
OOX::Logic::CDir* pDir = static_cast<OOX::Logic::CDir*>(item);
WriteDocumentContent(pDir->m_arrItems);
}break;
case OOX::et_w_bdo:
{
OOX::Logic::CBdo* pBdo = static_cast<OOX::Logic::CBdo*>(item);
WriteDocumentContent(pBdo->m_arrItems);
}break;
}
}
//SectPr & Background
if(true == m_bWriteSectPr && (NULL != pSectPr || NULL != pBackground))
{
if (NULL != pSectPr)
{
nCurPos = m_oBcw.WriteItemStart(c_oSerParType::sectPr);
bpPrs.WriteSectPr(pSectPr);
m_oBcw.WriteItemEnd(nCurPos);
}
if (NULL != pBackground)
{
nCurPos = m_oBcw.WriteItemStart(c_oSerParType::Background);
WriteBackground(pBackground);
m_oBcw.WriteItemEnd(nCurPos);
}
}
}
void WriteBackground (OOX::Logic::CBackground* pBackground)
{
if (pBackground == NULL) return;
CString sXml;
if (pBackground->m_oDrawing.IsInit())
{
sXml = pBackground->m_oDrawing->m_sXml.get2();
}
else if (pBackground->m_oBackground.IsInit())
{
sXml = pBackground->m_oBackground->toXML();
}
if (pBackground->m_oColor.IsInit())
{
m_oBcw.WriteColor(c_oSerBackgroundType::Color, pBackground->m_oColor.get());
}
if (pBackground->m_oThemeColor.IsInit())
{
m_oBcw.WriteThemeColor(c_oSerBackgroundType::ColorTheme, pBackground->m_oColor, pBackground->m_oThemeColor, pBackground->m_oThemeTint, pBackground->m_oThemeShade);
}
if (!sXml.IsEmpty())
{
m_oBcw.m_oStream.WriteBYTE(c_oSerBackgroundType::pptxDrawing);
m_oBcw.m_oStream.WriteBYTE(c_oSerPropLenType::Variable);
int nCurPos = m_oBcw.WriteItemWithLengthStart();
WriteDrawing(&sXml, NULL, NULL);
m_oBcw.WriteItemEnd(nCurPos);
}
}
void WriteParapraph(OOX::Logic::CParagraph& par, OOX::Logic::CParagraphProperty* pPr)
{
int nCurPos = 0;
//pPr
if(NULL != pPr)
{
m_oBcw.m_oStream.WriteBYTE(c_oSerParType::pPr);
nCurPos = m_oBcw.WriteItemWithLengthStart();
bpPrs.Write_pPr(*pPr);
m_oBcw.WriteItemWithLengthEnd(nCurPos);
}
//Content
m_oBcw.m_oStream.WriteBYTE(c_oSerParType::Content);
nCurPos = m_oBcw.WriteItemWithLengthStart();
WriteParagraphContent(par.m_arrItems);
m_oBcw.WriteItemWithLengthEnd(nCurPos);
}
FldStruct* ParseField(const CString& sFld)
{
CString sFldCopy = sFld;
sFldCopy.Trim();
sFldCopy.MakeUpper();
FldStruct* pRes = NULL;
int nIndex = 0;
if(-1 != (nIndex = sFldCopy.Find(_T("TOC"))))
pRes = new FldStruct(sFldCopy, fieldstruct_toc);
else if(-1 != (nIndex = sFldCopy.Find(_T("HYPERLINK"))))
pRes = new FldStruct(sFldCopy, fieldstruct_hyperlink);
else
pRes = new FldStruct(sFldCopy, fieldstruct_none);
return pRes;
}
void WriteParagraphContent(const std::vector<OOX::WritingElement *>& Content, bool bHyperlink = false)
{
int nCurPos = 0;
for ( int i = 0, length = Content.size(); i < length; ++i )
{
OOX::WritingElement* item = Content[i];
switch (item->getType())
{
case OOX::et_w_fldSimple:
{
OOX::Logic::CFldSimple* pFldSimple = static_cast<OOX::Logic::CFldSimple*>(item);
WriteFldSimple(pFldSimple);
break;
}
case OOX::et_w_hyperlink:
{
OOX::Logic::CHyperlink* pHyperlink = static_cast<OOX::Logic::CHyperlink*>(item);
WriteHyperlink(pHyperlink);
break;
}
case OOX::et_w_pPr:
break;
case OOX::et_w_r:
{
OOX::Logic::CRun* pRun = static_cast<OOX::Logic::CRun*>(item);
bool bMathRun = false;
WriteRun(pRun, bHyperlink, bMathRun);
break;
}
case OOX::et_w_sdt:
{
OOX::Logic::CSdt* pStd = static_cast<OOX::Logic::CSdt*>(item);
if(pStd->m_oSdtContent.IsInit())
WriteParagraphContent(pStd->m_oSdtContent.get().m_arrItems);
break;
}
case OOX::et_w_smartTag:
{
OOX::Logic::CSmartTag* pSmartTag = static_cast<OOX::Logic::CSmartTag*>(item);
WriteParagraphContent(pSmartTag->m_arrItems);
break;
}
case OOX::et_w_dir:
{
OOX::Logic::CDir* pDir = static_cast<OOX::Logic::CDir*>(item);
WriteParagraphContent(pDir->m_arrItems);
break;
}
case OOX::et_w_bdo:
{
OOX::Logic::CBdo* pBdo = static_cast<OOX::Logic::CBdo*>(item);
WriteParagraphContent(pBdo->m_arrItems);
break;
}
case OOX::et_w_del:
{
OOX::Logic::CDel* pDel = static_cast<OOX::Logic::CDel*>(item);
nCurPos = m_oBcw.WriteItemStart(c_oSerParType::Del);
WriteDel(*pDel);
m_oBcw.WriteItemEnd(nCurPos);
break;
}
case OOX::et_w_ins:
{
OOX::Logic::CIns* pIns = static_cast<OOX::Logic::CIns*>(item);
nCurPos = m_oBcw.WriteItemStart(c_oSerParType::Ins);
WriteIns(*pIns);
m_oBcw.WriteItemEnd(nCurPos);
break;
}
case OOX::et_w_commentRangeStart:
{
OOX::Logic::CCommentRangeStart* pCommentRangeStart = static_cast<OOX::Logic::CCommentRangeStart*>(item);
WriteComment(OOX::et_w_commentRangeStart, pCommentRangeStart->m_oId);
break;
}
case OOX::et_w_commentRangeEnd:
{
OOX::Logic::CCommentRangeEnd* pCommentRangeEnd = static_cast<OOX::Logic::CCommentRangeEnd*>(item);
WriteComment(OOX::et_w_commentRangeEnd, pCommentRangeEnd->m_oId);
break;
}
case OOX::et_m_oMathPara:
{
OOX::Logic::COMathPara* pOMathPara = static_cast<OOX::Logic::COMathPara*>(item);
nCurPos = m_oBcw.WriteItemStart(c_oSerParType::OMathPara);
WriteMathOMathPara(pOMathPara->m_arrItems);
m_oBcw.WriteItemEnd(nCurPos);
break;
}
case OOX::et_m_oMath:
{
OOX::Logic::COMath* pOMath = static_cast<OOX::Logic::COMath*>(item);
int nCurPos = m_oBcw.WriteItemStart(c_oSerParType::OMath);
WriteMathArgNodes( pOMath->m_arrItems );
m_oBcw.WriteItemEnd(nCurPos);
break;
}
}
}
}
void WriteDel(const OOX::Logic::CDel& oDel)
{
int nCurPos = 0;
m_oBcw.WriteTrackRevision(oDel);
nCurPos = m_oBcw.WriteItemStart(c_oSerProp_RevisionType::Content);
WriteParagraphContent(oDel.m_arrItems);
m_oBcw.WriteItemWithLengthEnd(nCurPos);
}
void WriteIns(const OOX::Logic::CIns& oIns)
{
int nCurPos = 0;
m_oBcw.WriteTrackRevision(oIns);
nCurPos = m_oBcw.WriteItemStart(c_oSerProp_RevisionType::Content);
WriteParagraphContent(oIns.m_arrItems);
m_oBcw.WriteItemWithLengthEnd(nCurPos);
}
void WriteComment(OOX::EElementType eType, nullable<SimpleTypes::CDecimalNumber<>>& oId)
{
int nCurPos = 0;
if(oId.IsInit() && (NULL == m_mapIgnoreComments || m_mapIgnoreComments->end() == m_mapIgnoreComments->find(oId->GetValue())))
{
switch(eType)
{
case OOX::et_w_commentRangeStart: nCurPos = m_oBcw.WriteItemStart(c_oSerParType::CommentStart); break;
case OOX::et_w_commentRangeEnd: nCurPos = m_oBcw.WriteItemStart(c_oSerParType::CommentEnd); break;
case OOX::et_w_commentReference: nCurPos = m_oBcw.WriteItemStart(c_oSerRunType::CommentReference);break;
}
int nCurPos2 = m_oBcw.WriteItemStart(c_oSer_CommentsType::Id);
m_oBcw.m_oStream.WriteLONG(oId->GetValue());
m_oBcw.WriteItemEnd(nCurPos2);
m_oBcw.WriteItemEnd(nCurPos);
}
}
void WriteFldSimple(OOX::Logic::CFldSimple* pFldSimple)
{
int nCurPos = 0;
if(pFldSimple->m_sInstr.IsInit() && !pFldSimple->m_sInstr->IsEmpty())
{
nCurPos = m_oBcw.WriteItemStart(c_oSerParType::FldSimple);
WriteFldSimpleContent(pFldSimple);
m_oBcw.WriteItemWithLengthEnd(nCurPos);
}
else
WriteParagraphContent(pFldSimple->m_arrItems);
}
void WriteFldSimpleContent(OOX::Logic::CFldSimple* pFldSimple)
{
int nCurPos = 0;
//порядок записи важен
//Instr
nCurPos = m_oBcw.WriteItemStart(c_oSer_FldSimpleType::Instr);
m_oBcw.m_oStream.WriteStringW3(pFldSimple->m_sInstr.get());
m_oBcw.WriteItemWithLengthEnd(nCurPos);
//Content
nCurPos = m_oBcw.WriteItemStart(c_oSer_FldSimpleType::Content);
WriteParagraphContent(pFldSimple->m_arrItems);
m_oBcw.WriteItemWithLengthEnd(nCurPos);
}
void WriteHyperlink(OOX::Logic::CHyperlink* pHyperlink)
{
int nCurPos = 0;
CString sField;
CString sLink;
if(pHyperlink->m_oId.IsInit())
{
OOX::Rels::CRelationShip* oRels = NULL;
smart_ptr<OOX::File> pFile = m_oParamsDocumentWriter.m_pRels->Find( OOX::RId(pHyperlink->m_oId.get().GetValue()));
if (pFile.IsInit() && OOX::FileTypes::HyperLink == pFile->type())
{
OOX::HyperLink* pHyperlinkFile = static_cast<OOX::HyperLink*>(pFile.operator ->());
sLink = pHyperlinkFile->Uri().GetPath();
}
}
if(!sLink.IsEmpty())
{
nCurPos = m_oBcw.WriteItemStart(c_oSerParType::Hyperlink);
WriteHyperlinkContent(sLink, pHyperlink);
m_oBcw.WriteItemWithLengthEnd(nCurPos);
}
else
{
WriteParagraphContent(pHyperlink->m_arrItems, true);
}
}
void WriteHyperlinkContent(CString& sLink, OOX::Logic::CHyperlink* pHyperlink)
{
int nCurPos = 0;
//Link
nCurPos = m_oBcw.WriteItemStart(c_oSer_HyperlinkType::Link);
m_oBcw.m_oStream.WriteStringW3(sLink);
m_oBcw.WriteItemWithLengthEnd(nCurPos);
//Anchor
if(pHyperlink->m_sAnchor.IsInit())
{
nCurPos = m_oBcw.WriteItemStart(c_oSer_HyperlinkType::Anchor);
m_oBcw.m_oStream.WriteStringW3(pHyperlink->m_sAnchor.get2());
m_oBcw.WriteItemWithLengthEnd(nCurPos);
}
//Tooltip
if(pHyperlink->m_sTooltip.IsInit())
{
nCurPos = m_oBcw.WriteItemStart(c_oSer_HyperlinkType::Tooltip);
m_oBcw.m_oStream.WriteStringW3(pHyperlink->m_sTooltip.get2());
m_oBcw.WriteItemWithLengthEnd(nCurPos);
}
//History
if(pHyperlink->m_oHistory.IsInit())
{
nCurPos = m_oBcw.WriteItemStart(c_oSer_HyperlinkType::History);
m_oBcw.m_oStream.WriteBOOL(pHyperlink->m_oHistory->ToBool());
m_oBcw.WriteItemWithLengthEnd(nCurPos);
}
//DocLocation
if(pHyperlink->m_sDocLocation.IsInit())
{
nCurPos = m_oBcw.WriteItemStart(c_oSer_HyperlinkType::DocLocation);
m_oBcw.m_oStream.WriteStringW3(pHyperlink->m_sDocLocation.get2());
m_oBcw.WriteItemWithLengthEnd(nCurPos);
}
//TgtFrame
if(pHyperlink->m_sTgtFrame.IsInit())
{
nCurPos = m_oBcw.WriteItemStart(c_oSer_HyperlinkType::TgtFrame);
m_oBcw.m_oStream.WriteStringW3(pHyperlink->m_sTgtFrame.get2());
m_oBcw.WriteItemWithLengthEnd(nCurPos);
}
//Content
nCurPos = m_oBcw.WriteItemStart(c_oSer_HyperlinkType::Content);
WriteParagraphContent(pHyperlink->m_arrItems, true);
m_oBcw.WriteItemWithLengthEnd(nCurPos);
}
void WriteRun(OOX::Logic::CRun* pRun, bool bHyperlink = false, bool bMathRun = false)
{
int nCurPos = 0;
int nIndexStart = 0;
int nLength = pRun->m_arrItems.size();
bool bWasText = false;
int nRecordType = 0;
if (bMathRun)
nRecordType = c_oSer_OMathContentType::Run;
else
nRecordType = c_oSerParType::Run;
//Разбиваем массив по знаку et_w_sym
for(int i = 0; i < nLength; ++i)
{
OOX::WritingElement* item = pRun->m_arrItems[i];
if(OOX::et_w_sym == item->getType())
{
if(bWasText)
{
bWasText = false;
nCurPos = m_oBcw.WriteItemStart(nRecordType);
WritePreparedRun(pRun, bHyperlink, nIndexStart, i);
m_oBcw.WriteItemWithLengthEnd(nCurPos);
}
nCurPos = m_oBcw.WriteItemStart(nRecordType);
WritePreparedRun( pRun, bHyperlink, i, i + 1);
m_oBcw.WriteItemWithLengthEnd(nCurPos);
nIndexStart = i + 1;
}
else if(OOX::et_w_rPr != item->getType())
bWasText = true;
}
if(nIndexStart < nLength)
{
nCurPos = m_oBcw.WriteItemStart(nRecordType);
WritePreparedRun( pRun, bHyperlink, nIndexStart, nLength);
m_oBcw.WriteItemWithLengthEnd(nCurPos);
}
}
void WriteMathArgNodes(const std::vector<OOX::WritingElement*>& m_arrItems)
{
for(int i = 0; i< m_arrItems.size(); ++i)
{
OOX::WritingElement* item = m_arrItems[i];
OOX::EElementType eType = item->getType();
int nCurPos = 0;
switch(eType)
{
case OOX::et_m_acc:
{
OOX::Logic::CAcc* pAcc = static_cast<OOX::Logic::CAcc*>(item);
nCurPos = m_oBcw.WriteItemStart(c_oSer_OMathContentType::Acc);
if ( pAcc->m_oAccPr.IsInit() )
WriteMathAccPr(pAcc->m_oAccPr.get());
if ( pAcc->m_oElement.IsInit() )
WriteMathElement(pAcc->m_oElement.get());
m_oBcw.WriteItemEnd(nCurPos);
break;
}
case OOX::et_m_argPr:
{
OOX::Logic::CArgPr* pArgPr = static_cast<OOX::Logic::CArgPr*>(item);
nCurPos = m_oBcw.WriteItemStart(c_oSer_OMathContentType::ArgPr);
if ( pArgPr->m_oArgSz.IsInit() )
WriteMathArgSz(pArgPr->m_oArgSz.get());
m_oBcw.WriteItemEnd(nCurPos);
break;
}
case OOX::et_m_bar:
{
OOX::Logic::CBar* pBar = static_cast<OOX::Logic::CBar*>(item);
nCurPos = m_oBcw.WriteItemStart(c_oSer_OMathContentType::Bar);
if ( pBar->m_oBarPr.IsInit() )
WriteMathBarPr(pBar->m_oBarPr.get());
if ( pBar->m_oElement.IsInit() )
WriteMathElement(pBar->m_oElement.get());
m_oBcw.WriteItemEnd(nCurPos);
break;
}
case OOX::et_m_borderBox:
{
OOX::Logic::CBorderBox* pBorderBox = static_cast<OOX::Logic::CBorderBox*>(item);
nCurPos = m_oBcw.WriteItemStart(c_oSer_OMathContentType::BorderBox);
if ( pBorderBox->m_oBorderBoxPr.IsInit() )
WriteMathBorderBoxPr(pBorderBox->m_oBorderBoxPr.get());
if ( pBorderBox->m_oElement.IsInit() )
WriteMathElement(pBorderBox->m_oElement.get());
m_oBcw.WriteItemEnd(nCurPos);
break;
}
case OOX::et_m_box:
{
OOX::Logic::CBox* pBox = static_cast<OOX::Logic::CBox*>(item);
nCurPos = m_oBcw.WriteItemStart(c_oSer_OMathContentType::Box);
if ( pBox->m_oBoxPr.IsInit() )
WriteMathBoxPr(pBox->m_oBoxPr.get());
if ( pBox->m_oElement.IsInit() )
WriteMathElement(pBox->m_oElement.get());
m_oBcw.WriteItemEnd(nCurPos);
break;
}
case OOX::et_m_ctrlPr:
{
OOX::Logic::CCtrlPr* pCtrlPr = static_cast<OOX::Logic::CCtrlPr*>(item);
WriteMathCtrlPr(*pCtrlPr, c_oSer_OMathContentType::CtrlPr);
break;
}
case OOX::et_m_d:
{
OOX::Logic::CDelimiter* pDelimiter = static_cast<OOX::Logic::CDelimiter*>(item);
nCurPos = m_oBcw.WriteItemStart(c_oSer_OMathContentType::Delimiter);
WriteMathDelimiter(pDelimiter->m_arrItems, pDelimiter->m_lColumn);
m_oBcw.WriteItemEnd(nCurPos);
break;
}
case OOX::et_m_eqArr:
{
OOX::Logic::CEqArr* pEqArr = static_cast<OOX::Logic::CEqArr*>(item);
nCurPos = m_oBcw.WriteItemStart(c_oSer_OMathContentType::EqArr);
WriteMathEqArr(pEqArr->m_arrItems, pEqArr->m_lRow);
m_oBcw.WriteItemEnd(nCurPos);
break;
}
case OOX::et_m_f:
{
OOX::Logic::CFraction* pFraction = static_cast<OOX::Logic::CFraction*>(item);
nCurPos = m_oBcw.WriteItemStart(c_oSer_OMathContentType::Fraction);
if ( pFraction->m_oFPr.IsInit() )
WriteMathFPr(pFraction->m_oFPr.get());
if ( pFraction->m_oDen.IsInit() )
WriteMathDen(pFraction->m_oDen.get());
if ( pFraction->m_oNum.IsInit() )
WriteMathNum(pFraction->m_oNum.get());
m_oBcw.WriteItemEnd(nCurPos);
break;
}
case OOX::et_m_func:
{
OOX::Logic::CFunc* pFunc = static_cast<OOX::Logic::CFunc*>(item);
nCurPos = m_oBcw.WriteItemStart(c_oSer_OMathContentType::Func);
if ( pFunc->m_oFuncPr.IsInit() )
WriteMathFuncPr(pFunc->m_oFuncPr.get());
if ( pFunc->m_oElement.IsInit() )
WriteMathElement(pFunc->m_oElement.get());
if ( pFunc->m_oFName.IsInit() )
WriteMathFName(pFunc->m_oFName.get());
m_oBcw.WriteItemEnd(nCurPos);
break;
}
case OOX::et_m_groupChr:
{
OOX::Logic::CGroupChr* pGroupChr = static_cast<OOX::Logic::CGroupChr*>(item);
nCurPos = m_oBcw.WriteItemStart(c_oSer_OMathContentType::GroupChr);
if ( pGroupChr->m_oGroupChrPr.IsInit() )
WriteMathGroupChrPr(pGroupChr->m_oGroupChrPr.get());
if ( pGroupChr->m_oElement.IsInit() )
WriteMathElement(pGroupChr->m_oElement.get());
m_oBcw.WriteItemEnd(nCurPos);
break;
}
case OOX::et_m_limLow:
{
OOX::Logic::CLimLow* pLimLow = static_cast<OOX::Logic::CLimLow*>(item);
nCurPos = m_oBcw.WriteItemStart(c_oSer_OMathContentType::LimLow);
if ( pLimLow->m_oLimLowPr.IsInit() )
WriteMathLimLowPr(pLimLow->m_oLimLowPr.get());
if ( pLimLow->m_oElement.IsInit() )
WriteMathElement(pLimLow->m_oElement.get());
if ( pLimLow->m_oLim.IsInit() )
WriteMathLim(pLimLow->m_oLim.get());
m_oBcw.WriteItemEnd(nCurPos);
break;
}
case OOX::et_m_limUpp:
{
OOX::Logic::CLimUpp* pLimUpp = static_cast<OOX::Logic::CLimUpp*>(item);
nCurPos = m_oBcw.WriteItemStart(c_oSer_OMathContentType::LimUpp);
if ( pLimUpp->m_oLimUppPr.IsInit() )
WriteMathLimUppPr(pLimUpp->m_oLimUppPr.get());
if ( pLimUpp->m_oElement.IsInit() )
WriteMathElement(pLimUpp->m_oElement.get());
if ( pLimUpp->m_oLim.IsInit() )
WriteMathLim(pLimUpp->m_oLim.get());
m_oBcw.WriteItemEnd(nCurPos);
break;
}
case OOX::et_m_m:
{
OOX::Logic::CMatrix* pMatrix = static_cast<OOX::Logic::CMatrix*>(item);
nCurPos = m_oBcw.WriteItemStart(c_oSer_OMathContentType::Matrix);
LONG lCol = 0;
for ( int j = 0; j < pMatrix->m_arrItems.size(); j++) //TODO убрать, тк при отсутствии m:mcs, к-во столбцов должно разруливаться динамически в скрипте
{
OOX::WritingElement* item = pMatrix->m_arrItems[j];
if (item->getType() == OOX::et_m_mr)
{
OOX::Logic::CMr* pMr = static_cast<OOX::Logic::CMr*>(item);
lCol = pMr->GetCol();
break;
}
}
WriteMathMatrix(pMatrix->m_arrItems, pMatrix->m_lRow, lCol);
m_oBcw.WriteItemEnd(nCurPos);
break;
}
case OOX::et_m_nary:
{
OOX::Logic::CNary* pNary = static_cast<OOX::Logic::CNary*>(item);
nCurPos = m_oBcw.WriteItemStart(c_oSer_OMathContentType::Nary);
if ( pNary->m_oNaryPr.IsInit() )
WriteMathNaryPr(pNary->m_oNaryPr.get());
if ( pNary->m_oSub.IsInit() )
WriteMathSub(pNary->m_oSub.get());
if ( pNary->m_oSup.IsInit() )
WriteMathSup(pNary->m_oSup.get());
if ( pNary->m_oElement.IsInit() )
WriteMathElement(pNary->m_oElement.get());
m_oBcw.WriteItemEnd(nCurPos);
break;
}
case OOX::et_m_oMath:
{
OOX::Logic::COMath* pOMath = static_cast<OOX::Logic::COMath*>(item);
nCurPos = m_oBcw.WriteItemStart(c_oSer_OMathContentType::OMath);
WriteMathArgNodes(pOMath->m_arrItems);
m_oBcw.WriteItemEnd(nCurPos);
break;
}
case OOX::et_m_oMathPara:
{
OOX::Logic::COMathPara* pOMathPara = static_cast<OOX::Logic::COMathPara*>(item);
nCurPos = m_oBcw.WriteItemStart(c_oSer_OMathContentType::OMathPara);
WriteMathOMathPara(pOMathPara->m_arrItems);
m_oBcw.WriteItemEnd(nCurPos);
break;
}
case OOX::et_m_phant:
{
OOX::Logic::CPhant* pPhant = static_cast<OOX::Logic::CPhant*>(item);
nCurPos = m_oBcw.WriteItemStart(c_oSer_OMathContentType::Phant);
if ( pPhant->m_oPhantPr.IsInit() )
WriteMathPhantPr(pPhant->m_oPhantPr.get());
if ( pPhant->m_oElement.IsInit() )
WriteMathElement(pPhant->m_oElement.get());
m_oBcw.WriteItemEnd(nCurPos);
break;
}
case OOX::et_m_r:
{
OOX::Logic::CMRun* pMRun = static_cast<OOX::Logic::CMRun*>(item);
nCurPos = m_oBcw.WriteItemStart(c_oSer_OMathContentType::MRun);
WriteMathRunContent(pMRun);
m_oBcw.WriteItemEnd(nCurPos);
break;
}
case OOX::et_m_rad:
{
OOX::Logic::CRad* pRad = static_cast<OOX::Logic::CRad*>(item);
nCurPos = m_oBcw.WriteItemStart(c_oSer_OMathContentType::Rad);
if ( pRad->m_oRadPr.IsInit() )
WriteMathRadPr(pRad->m_oRadPr.get());
if ( pRad->m_oDeg.IsInit() )
WriteMathDeg(pRad->m_oDeg.get());
if ( pRad->m_oElement.IsInit() )
WriteMathElement(pRad->m_oElement.get());
m_oBcw.WriteItemEnd(nCurPos);
break;
}
case OOX::et_m_sPre:
{
OOX::Logic::CSPre* pSPre = static_cast<OOX::Logic::CSPre*>(item);
nCurPos = m_oBcw.WriteItemStart(c_oSer_OMathContentType::SPre);
if ( pSPre->m_oSPrePr.IsInit() )
WriteMathSPrePr(pSPre->m_oSPrePr.get());
if ( pSPre->m_oSub.IsInit() )
WriteMathSub(pSPre->m_oSub.get());
if ( pSPre->m_oSup.IsInit() )
WriteMathSup(pSPre->m_oSup.get());
if ( pSPre->m_oElement.IsInit() )
WriteMathElement(pSPre->m_oElement.get());
m_oBcw.WriteItemEnd(nCurPos);
break;
}
case OOX::et_m_sSub:
{
OOX::Logic::CSSub* pSSub = static_cast<OOX::Logic::CSSub*>(item);
int nCurPos = m_oBcw.WriteItemStart(c_oSer_OMathContentType::SSub);
if ( pSSub->m_oSSubPr.IsInit() )
WriteMathSSubPr(pSSub->m_oSSubPr.get());
if ( pSSub->m_oSub.IsInit() )
WriteMathSub(pSSub->m_oSub.get());
if ( pSSub->m_oElement.IsInit() )
WriteMathElement(pSSub->m_oElement.get());
m_oBcw.WriteItemEnd(nCurPos);
break;
}
case OOX::et_m_sSubSup:
{
OOX::Logic::CSSubSup* pSSubSup = static_cast<OOX::Logic::CSSubSup*>(item);
nCurPos = m_oBcw.WriteItemStart(c_oSer_OMathContentType::SSubSup);
if ( pSSubSup->m_oSSubSupPr.IsInit() )
WriteMathSSubSupPr(pSSubSup->m_oSSubSupPr.get());
if ( pSSubSup->m_oSub.IsInit() )
WriteMathSub(pSSubSup->m_oSub.get());
if ( pSSubSup->m_oSup.IsInit() )
WriteMathSup(pSSubSup->m_oSup.get());
if ( pSSubSup->m_oElement.IsInit() )
WriteMathElement(pSSubSup->m_oElement.get());
m_oBcw.WriteItemEnd(nCurPos);
break;
}
case OOX::et_m_sSup:
{
OOX::Logic::CSSup* pSSup = static_cast<OOX::Logic::CSSup*>(item);
nCurPos = m_oBcw.WriteItemStart(c_oSer_OMathContentType::SSup);
if ( pSSup->m_oSSupPr.IsInit() )
WriteMathSSupPr(pSSup->m_oSSupPr.get());
if ( pSSup->m_oElement.IsInit() )
WriteMathElement(pSSup->m_oElement.get());
if ( pSSup->m_oSup.IsInit() )
WriteMathSup(pSSup->m_oSup.get());
m_oBcw.WriteItemEnd(nCurPos);
break;
}
}
}
}
void WriteMathRunContent(OOX::Logic::CMRun* pMRun)
{
if ( pMRun->m_oMRPr.IsInit() )
WriteMathMRPr(pMRun->m_oMRPr.get());
if ( pMRun->m_oRPr.IsInit() )
{
int nCurPos2 = m_oBcw.WriteItemStart(c_oSer_OMathContentType::RPr);
brPrs.Write_rPr(pMRun->m_oRPr.get());
m_oBcw.WriteItemEnd(nCurPos2);
}
if ( pMRun->m_oARPr.IsInit() )
{
int nCurPos2 = m_oBcw.WriteItemStart(c_oSer_OMathContentType::ARPr);
m_oBcw.m_oStream.WriteRecord2(0, pMRun->m_oARPr);
m_oBcw.WriteItemEnd(nCurPos2);
}
if ( pMRun->m_oMText.IsInit() )
WriteMathText(pMRun->m_oMText.get());
if ( pMRun->m_oBr.IsInit() )
{
int nBreakType = -1;
switch(pMRun->m_oBr->m_oType.GetValue())
{
case SimpleTypes::brtypeColumn: nBreakType = c_oSer_OMathContentType::columnbreak;break;
case SimpleTypes::brtypePage: nBreakType = c_oSer_OMathContentType::pagebreak;break;
case SimpleTypes::brtypeTextWrapping: nBreakType = c_oSer_OMathContentType::linebreak;break;
}
if(-1 != nBreakType)
{
m_oBcw.m_oStream.WriteBYTE(nBreakType);
m_oBcw.m_oStream.WriteLONG(c_oSerPropLenType::Null);
}
}
if ( pMRun->m_oDel.IsInit() )
{
int nCurPos2 = m_oBcw.WriteItemStart(c_oSer_OMathContentType::Del);
WriteMathDel(pMRun->m_oDel.get());
m_oBcw.WriteItemEnd(nCurPos2);
}
if ( pMRun->m_oIns.IsInit() )
{
int nCurPos2 = m_oBcw.WriteItemStart(c_oSer_OMathContentType::Ins);
WriteMathIns(pMRun->m_oIns.get());
m_oBcw.WriteItemEnd(nCurPos2);
}
}
void WriteMathAccPr(const OOX::Logic::CAccPr &pAccPr)
{
int nCurPos = m_oBcw.WriteItemStart(c_oSer_OMathContentType::AccPr);
if ( pAccPr.m_oChr.IsInit() )
WriteMathChr(pAccPr.m_oChr.get());
if ( pAccPr.m_oCtrlPr.IsInit() )
WriteMathCtrlPr(pAccPr.m_oCtrlPr.get());
m_oBcw.WriteItemEnd(nCurPos);
}
void WriteMathAln(const OOX::Logic::CAln &pAln)
{
int nCurPos = m_oBcw.WriteItemStart(c_oSer_OMathBottomNodesType::Aln);
if (pAln.m_val.IsInit())
{
m_oBcw.m_oStream.WriteBYTE(c_oSer_OMathBottomNodesValType::Val);
m_oBcw.m_oStream.WriteBYTE(c_oSerPropLenType::Byte);
m_oBcw.m_oStream.WriteBOOL(pAln.m_val->GetValue());
}
m_oBcw.WriteItemEnd(nCurPos);
}
void WriteMathAlnScr(const OOX::Logic::CAlnScr &pAlnScr)
{
int nCurPos = m_oBcw.WriteItemStart(c_oSer_OMathBottomNodesType::AlnScr);
if (pAlnScr.m_val.IsInit())
{
m_oBcw.m_oStream.WriteBYTE(c_oSer_OMathBottomNodesValType::Val);
m_oBcw.m_oStream.WriteBYTE(c_oSerPropLenType::Byte);
m_oBcw.m_oStream.WriteBOOL(pAlnScr.m_val->GetValue());
}
m_oBcw.WriteItemEnd(nCurPos);
}
void WriteMathArgPr(const OOX::Logic::CArgPr &pArgPr)
{
int nCurPos = m_oBcw.WriteItemStart(c_oSer_OMathContentType::ArgPr);
if ( pArgPr.m_oArgSz.IsInit() )
WriteMathArgSz(pArgPr.m_oArgSz.get());
m_oBcw.WriteItemEnd(nCurPos);
}
void WriteMathArgSz(const OOX::Logic::CArgSz &pArgSz)
{
int nCurPos = m_oBcw.WriteItemStart(c_oSer_OMathBottomNodesType::ArgSz);
if (pArgSz.m_val.IsInit())
{
m_oBcw.m_oStream.WriteBYTE(c_oSer_OMathBottomNodesValType::Val);
m_oBcw.m_oStream.WriteBYTE(c_oSerPropLenType::Long);
m_oBcw.m_oStream.WriteLONG(pArgSz.m_val->GetValue());
}
m_oBcw.WriteItemEnd(nCurPos);
}
void WriteMathBarPr(const OOX::Logic::CBarPr &pBarPr)
{
int nCurPos = m_oBcw.WriteItemStart(c_oSer_OMathContentType::BarPr);
if ( pBarPr.m_oCtrlPr.IsInit() )
WriteMathCtrlPr(pBarPr.m_oCtrlPr.get());
if ( pBarPr.m_oPos.IsInit() )
WriteMathPos(pBarPr.m_oPos.get());
m_oBcw.WriteItemEnd(nCurPos);
}
void WriteMathBaseJc(const OOX::Logic::CBaseJc &pBaseJc)
{
int nCurPos = m_oBcw.WriteItemStart(c_oSer_OMathBottomNodesType::BaseJc);
if (pBaseJc.m_val.IsInit())
{
m_oBcw.m_oStream.WriteBYTE(c_oSer_OMathBottomNodesValType::Val);
m_oBcw.m_oStream.WriteBYTE(c_oSerPropLenType::Byte);
m_oBcw.m_oStream.WriteBYTE(pBaseJc.m_val->GetValue());
}
m_oBcw.WriteItemEnd(nCurPos);
}
void WriteMathBegChr(const OOX::Logic::CBegChr &pBegChr)
{
int nCurPos = m_oBcw.WriteItemStart(c_oSer_OMathBottomNodesType::BegChr);
if (pBegChr.m_val.IsInit())
{
m_oBcw.m_oStream.WriteBYTE(c_oSer_OMathBottomNodesValType::Val);
m_oBcw.m_oStream.WriteBYTE(c_oSerPropLenType::Variable);
m_oBcw.m_oStream.WriteStringW(pBegChr.m_val->GetValue());
}
m_oBcw.WriteItemEnd(nCurPos);
}
void WriteMathBorderBoxPr(const OOX::Logic::CBorderBoxPr &pBorderBoxPr)
{
int nCurPos = m_oBcw.WriteItemStart(c_oSer_OMathContentType::BorderBoxPr);
if ( pBorderBoxPr.m_oCtrlPr.IsInit() )
WriteMathCtrlPr(pBorderBoxPr.m_oCtrlPr.get());
if ( pBorderBoxPr.m_oHideBot.IsInit() )
WriteMathHideBot(pBorderBoxPr.m_oHideBot.get());
if ( pBorderBoxPr.m_oHideLeft.IsInit() )
WriteMathHideLeft(pBorderBoxPr.m_oHideLeft.get());
if ( pBorderBoxPr.m_oHideRight.IsInit() )
WriteMathHideRight(pBorderBoxPr.m_oHideRight.get());
if ( pBorderBoxPr.m_oHideTop.IsInit() )
WriteMathHideTop(pBorderBoxPr.m_oHideTop.get());
if ( pBorderBoxPr.m_oStrikeBLTR.IsInit() )
WriteMathStrikeBLTR(pBorderBoxPr.m_oStrikeBLTR.get());
if ( pBorderBoxPr.m_oStrikeH.IsInit() )
WriteMathStrikeH(pBorderBoxPr.m_oStrikeH.get());
if ( pBorderBoxPr.m_oStrikeTLBR.IsInit() )
WriteMathStrikeTLBR(pBorderBoxPr.m_oStrikeTLBR.get());
if ( pBorderBoxPr.m_oStrikeV.IsInit() )
WriteMathStrikeV(pBorderBoxPr.m_oStrikeV.get());
m_oBcw.WriteItemEnd(nCurPos);
}
void WriteMathBoxPr(const OOX::Logic::CBoxPr &pBoxPr)
{
int nCurPos = m_oBcw.WriteItemStart(c_oSer_OMathContentType::BoxPr);
if ( pBoxPr.m_oAln.IsInit() )
WriteMathAln(pBoxPr.m_oAln.get());
if ( pBoxPr.m_oBrk.IsInit() )
WriteMathBrk(pBoxPr.m_oBrk.get());
if ( pBoxPr.m_oCtrlPr.IsInit() )
WriteMathCtrlPr(pBoxPr.m_oCtrlPr.get());
if ( pBoxPr.m_oDiff.IsInit() )
WriteMathDiff(pBoxPr.m_oDiff.get());
if ( pBoxPr.m_oNoBreak.IsInit() )
WriteMathNoBreak(pBoxPr.m_oNoBreak.get());
if ( pBoxPr.m_oOpEmu.IsInit() )
WriteMathOpEmu(pBoxPr.m_oOpEmu.get());
m_oBcw.WriteItemEnd(nCurPos);
}
void WriteMathBrk(const OOX::Logic::CBrk &pBrk)
{
int nCurPos = m_oBcw.WriteItemStart(c_oSer_OMathBottomNodesType::Brk);
if (pBrk.m_alnAt.IsInit())
{
m_oBcw.m_oStream.WriteBYTE(c_oSer_OMathBottomNodesValType::AlnAt);
m_oBcw.m_oStream.WriteBYTE(c_oSerPropLenType::Long);
m_oBcw.m_oStream.WriteLONG(pBrk.m_alnAt->GetValue());
}
//заглушка для <m:brk>
else
{
m_oBcw.m_oStream.WriteBYTE(c_oSer_OMathBottomNodesValType::Val);
m_oBcw.m_oStream.WriteBYTE(c_oSerPropLenType::Byte);
m_oBcw.m_oStream.WriteBOOL(false);
}
m_oBcw.WriteItemEnd(nCurPos);
}
void WriteMathCGp(const OOX::Logic::CCGp &pCGp)
{
int nCurPos = m_oBcw.WriteItemStart(c_oSer_OMathBottomNodesType::CGp);
if (pCGp.m_val.IsInit())
{
m_oBcw.m_oStream.WriteBYTE(c_oSer_OMathBottomNodesValType::Val);
m_oBcw.m_oStream.WriteBYTE(c_oSerPropLenType::Long);
m_oBcw.m_oStream.WriteLONG(pCGp.m_val->GetValue());
}
m_oBcw.WriteItemEnd(nCurPos);
}
void WriteMathCGpRule(const OOX::Logic::CCGpRule &pCGpRule)
{
int nCurPos = m_oBcw.WriteItemStart(c_oSer_OMathBottomNodesType::CGpRule);
if (pCGpRule.m_val.IsInit())
{
m_oBcw.m_oStream.WriteBYTE(c_oSer_OMathBottomNodesValType::Val);
m_oBcw.m_oStream.WriteBYTE(c_oSerPropLenType::Long);
m_oBcw.m_oStream.WriteLONG(pCGpRule.m_val->GetValue());
}
m_oBcw.WriteItemEnd(nCurPos);
}
void WriteMathChr(const OOX::Logic::CChr &pChr)
{
int nCurPos = m_oBcw.WriteItemStart(c_oSer_OMathBottomNodesType::Chr);
if (pChr.m_val.IsInit())
{
m_oBcw.m_oStream.WriteBYTE(c_oSer_OMathBottomNodesValType::Val);
m_oBcw.m_oStream.WriteBYTE(c_oSerPropLenType::Variable);
CString str = pChr.m_val->GetValue();
m_oBcw.m_oStream.WriteStringW(pChr.m_val->GetValue());
}
m_oBcw.WriteItemEnd(nCurPos);
}
void WriteMathCount(const OOX::Logic::CCount &pCount)
{
int nCurPos = m_oBcw.WriteItemStart(c_oSer_OMathBottomNodesType::Count);
if (pCount.m_val.IsInit())
{
m_oBcw.m_oStream.WriteBYTE(c_oSer_OMathBottomNodesValType::Val);
m_oBcw.m_oStream.WriteBYTE(c_oSerPropLenType::Long);
m_oBcw.m_oStream.WriteLONG(pCount.m_val->GetValue());
}
m_oBcw.WriteItemEnd(nCurPos);
}
void WriteMathCSp(const OOX::Logic::CCSp &pCSp)
{
int nCurPos = m_oBcw.WriteItemStart(c_oSer_OMathBottomNodesType::CSp);
if (pCSp.m_val.IsInit())
{
m_oBcw.m_oStream.WriteBYTE(c_oSer_OMathBottomNodesValType::Val);
m_oBcw.m_oStream.WriteBYTE(c_oSerPropLenType::Long);
m_oBcw.m_oStream.WriteLONG(pCSp.m_val->GetValue());
}
m_oBcw.WriteItemEnd(nCurPos);
}
void WriteMathCtrlPr(const OOX::Logic::CCtrlPr &pCtrlPr, BYTE type = c_oSer_OMathBottomNodesType::CtrlPr)
{
int nCurPos = m_oBcw.WriteItemStart(type);
if ( pCtrlPr.m_oRPr.IsInit() )
{
int nCurPos2 = m_oBcw.WriteItemStart(c_oSerRunType::rPr);
brPrs.Write_rPr(pCtrlPr.m_oRPr.get());
m_oBcw.WriteItemEnd(nCurPos2);
}
if ( pCtrlPr.m_oARPr.IsInit() )
{
int nCurPos2 = m_oBcw.WriteItemStart(c_oSerRunType::arPr);
m_oBcw.m_oStream.WriteRecord2(0, pCtrlPr.m_oARPr);
m_oBcw.WriteItemEnd(nCurPos2);
}
if ( pCtrlPr.m_oDel.IsInit() )
{
int nCurPos2 = m_oBcw.WriteItemStart(c_oSerRunType::del);
brPrs.Write_rPrChange(pCtrlPr.m_oDel.get());
m_oBcw.WriteItemEnd(nCurPos2);
}
if ( pCtrlPr.m_oIns.IsInit() )
{
int nCurPos2 = m_oBcw.WriteItemStart(c_oSerRunType::ins);
brPrs.Write_rPrChange(pCtrlPr.m_oIns.get());
m_oBcw.WriteItemEnd(nCurPos2);
}
m_oBcw.WriteItemEnd(nCurPos);
}
void WriteMathDelimiter(const std::vector<OOX::WritingElement*>& m_arrItems, LONG &lColumn)
{
for(int i = 0; i< m_arrItems.size(); ++i)
{
OOX::WritingElement* item = m_arrItems[i];
OOX::EElementType eType = item->getType();
int nCurPos = 0;
switch(eType)
{
case OOX::et_m_dPr:
{
OOX::Logic::CDelimiterPr* pDelimiterPr = static_cast<OOX::Logic::CDelimiterPr*>(item);
nCurPos = m_oBcw.WriteItemStart(c_oSer_OMathContentType::DelimiterPr);
if ( lColumn )
WriteMathColumn (lColumn);
if ( pDelimiterPr->m_oBegChr.IsInit() )
WriteMathBegChr(pDelimiterPr->m_oBegChr.get());
if ( pDelimiterPr->m_oEndChr.IsInit() )
WriteMathEndChr(pDelimiterPr->m_oEndChr.get());
if ( pDelimiterPr->m_oCtrlPr.IsInit() )
WriteMathCtrlPr(pDelimiterPr->m_oCtrlPr.get());
if ( pDelimiterPr->m_oGrow.IsInit() )
WriteMathGrow(pDelimiterPr->m_oGrow.get());
if ( pDelimiterPr->m_oSepChr.IsInit() )
WriteMathSepChr(pDelimiterPr->m_oSepChr.get());
if ( pDelimiterPr->m_oShp.IsInit() )
WriteMathShp(pDelimiterPr->m_oShp.get());
m_oBcw.WriteItemEnd(nCurPos);
break;
}
case OOX::et_m_e:
{
OOX::Logic::CElement* pElement = static_cast<OOX::Logic::CElement*>(item);
nCurPos = m_oBcw.WriteItemStart(c_oSer_OMathContentType::Element);
WriteMathArgNodes(pElement->m_arrItems);
m_oBcw.WriteItemEnd(nCurPos);
break;
}
}
}
}
void WriteMathDeg(const OOX::Logic::CDeg &pDeg)
{
int nCurPos = m_oBcw.WriteItemStart(c_oSer_OMathContentType::Deg);
WriteMathArgNodes(pDeg.m_arrItems);
m_oBcw.WriteItemEnd(nCurPos);
}
void WriteMathDegHide(const OOX::Logic::CDegHide &pDegHide)
{
int nCurPos = m_oBcw.WriteItemStart(c_oSer_OMathBottomNodesType::DegHide);
if (pDegHide.m_val.IsInit())
{
m_oBcw.m_oStream.WriteBYTE(c_oSer_OMathBottomNodesValType::Val);
m_oBcw.m_oStream.WriteBYTE(c_oSerPropLenType::Byte);
m_oBcw.m_oStream.WriteBOOL(pDegHide.m_val->GetValue());
}
m_oBcw.WriteItemEnd(nCurPos);
}
void WriteMathDen(const OOX::Logic::CDen &pDen)
{
int nCurPos = m_oBcw.WriteItemStart(c_oSer_OMathContentType::Den);
WriteMathArgNodes(pDen.m_arrItems);
m_oBcw.WriteItemEnd(nCurPos);
}
void WriteMathDiff(const OOX::Logic::CDiff &pDiff)
{
int nCurPos = m_oBcw.WriteItemStart(c_oSer_OMathBottomNodesType::Diff);
if (pDiff.m_val.IsInit())
{
m_oBcw.m_oStream.WriteBYTE(c_oSer_OMathBottomNodesValType::Val);
m_oBcw.m_oStream.WriteBYTE(c_oSerPropLenType::Byte);
m_oBcw.m_oStream.WriteBOOL(pDiff.m_val->GetValue());
}
m_oBcw.WriteItemEnd(nCurPos);
}
void WriteMathDelimiterPr(const OOX::Logic::CDelimiterPr &pDelimiterPr, long &lColumn)
{
int nCurPos = m_oBcw.WriteItemStart(c_oSer_OMathContentType::DelimiterPr);
if ( lColumn )
WriteMathColumn (lColumn);
if ( pDelimiterPr.m_oBegChr.IsInit() )
WriteMathBegChr(pDelimiterPr.m_oBegChr.get());
if ( pDelimiterPr.m_oCtrlPr.IsInit() )
WriteMathCtrlPr(pDelimiterPr.m_oCtrlPr.get());
if ( pDelimiterPr.m_oEndChr.IsInit() )
WriteMathEndChr(pDelimiterPr.m_oEndChr.get());
if ( pDelimiterPr.m_oGrow.IsInit() )
WriteMathGrow(pDelimiterPr.m_oGrow.get());
if ( pDelimiterPr.m_oSepChr.IsInit() )
WriteMathSepChr(pDelimiterPr.m_oSepChr.get());
if ( pDelimiterPr.m_oShp.IsInit() )
WriteMathShp(pDelimiterPr.m_oShp.get());
m_oBcw.WriteItemEnd(nCurPos);
}
void WriteMathElement(const OOX::Logic::CElement &pElement)
{
int nCurPos = m_oBcw.WriteItemStart(c_oSer_OMathContentType::Element);
WriteMathArgNodes(pElement.m_arrItems);
m_oBcw.WriteItemEnd(nCurPos);
}
void WriteMathEndChr(const OOX::Logic::CEndChr &pEndChr)
{
int nCurPos = m_oBcw.WriteItemStart(c_oSer_OMathBottomNodesType::EndChr);
if (pEndChr.m_val.IsInit())
{
m_oBcw.m_oStream.WriteBYTE(c_oSer_OMathBottomNodesValType::Val);
m_oBcw.m_oStream.WriteBYTE(c_oSerPropLenType::Variable);
m_oBcw.m_oStream.WriteStringW(pEndChr.m_val->GetValue());
}
m_oBcw.WriteItemEnd(nCurPos);
}
void WriteMathEqArr(const std::vector<OOX::WritingElement*>& m_arrItems, LONG& lRow)
{
for(int i = 0; i< m_arrItems.size(); ++i)
{
OOX::WritingElement* item = m_arrItems[i];
OOX::EElementType eType = item->getType();
int nCurPos = 0;
switch(eType)
{
case OOX::et_m_eqArrPr:
{
OOX::Logic::CEqArrPr* pEqArrPr = static_cast<OOX::Logic::CEqArrPr*>(item);
nCurPos = m_oBcw.WriteItemStart(c_oSer_OMathContentType::EqArrPr);
if ( lRow )
WriteMathRow (lRow);
if ( pEqArrPr->m_oBaseJc.IsInit() )
WriteMathBaseJc(pEqArrPr->m_oBaseJc.get());
if ( pEqArrPr->m_oCtrlPr.IsInit() )
WriteMathCtrlPr(pEqArrPr->m_oCtrlPr.get());
if ( pEqArrPr->m_oMaxDist.IsInit() )
WriteMathMaxDist(pEqArrPr->m_oMaxDist.get());
if ( pEqArrPr->m_oObjDist.IsInit() )
WriteMathObjDist(pEqArrPr->m_oObjDist.get());
if ( pEqArrPr->m_oRSp.IsInit() )
WriteMathRSp(pEqArrPr->m_oRSp.get());
if ( pEqArrPr->m_oRSpRule.IsInit() )
WriteMathRSpRule(pEqArrPr->m_oRSpRule.get());
m_oBcw.WriteItemEnd(nCurPos);
break;
}
case OOX::et_m_e:
{
OOX::Logic::CElement* pElement = static_cast<OOX::Logic::CElement*>(item);
nCurPos = m_oBcw.WriteItemStart(c_oSer_OMathContentType::Element);
WriteMathArgNodes(pElement->m_arrItems);
m_oBcw.WriteItemEnd(nCurPos);
break;
}
}
}
}
void WriteMathFName(const OOX::Logic::CFName &pFName)
{
int nCurPos = m_oBcw.WriteItemStart(c_oSer_OMathContentType::FName);
WriteMathArgNodes(pFName.m_arrItems);
m_oBcw.WriteItemEnd(nCurPos);
}
void WriteMathFPr(const OOX::Logic::CFPr &pFPr)
{
int nCurPos = m_oBcw.WriteItemStart(c_oSer_OMathContentType::FPr);
if ( pFPr.m_oCtrlPr.IsInit() )
WriteMathCtrlPr(pFPr.m_oCtrlPr.get());
if ( pFPr.m_oType.IsInit() )
WriteMathType(pFPr.m_oType.get());
m_oBcw.WriteItemEnd(nCurPos);
}
void WriteMathFuncPr(const OOX::Logic::CFuncPr &pFuncPr)
{
int nCurPos = m_oBcw.WriteItemStart(c_oSer_OMathContentType::FuncPr);
if ( pFuncPr.m_oCtrlPr.IsInit() )
WriteMathCtrlPr(pFuncPr.m_oCtrlPr.get());
m_oBcw.WriteItemEnd(nCurPos);
}
void WriteMathGroupChrPr(const OOX::Logic::CGroupChrPr &pGroupChrPr)
{
int nCurPos = m_oBcw.WriteItemStart(c_oSer_OMathContentType::GroupChrPr);
if ( pGroupChrPr.m_oChr.IsInit() )
WriteMathChr(pGroupChrPr.m_oChr.get());
if ( pGroupChrPr.m_oCtrlPr.IsInit() )
WriteMathCtrlPr(pGroupChrPr.m_oCtrlPr.get());
if ( pGroupChrPr.m_oPos.IsInit() )
WriteMathPos(pGroupChrPr.m_oPos.get());
if ( pGroupChrPr.m_oVertJc.IsInit() )
WriteMathVertJc(pGroupChrPr.m_oVertJc.get());
m_oBcw.WriteItemEnd(nCurPos);
}
void WriteMathGrow(const OOX::Logic::CGrow &pGrow)
{
int nCurPos = m_oBcw.WriteItemStart(c_oSer_OMathBottomNodesType::Grow);
if (pGrow.m_val.IsInit())
{
m_oBcw.m_oStream.WriteBYTE(c_oSer_OMathBottomNodesValType::Val);
m_oBcw.m_oStream.WriteBYTE(c_oSerPropLenType::Byte);
m_oBcw.m_oStream.WriteBOOL(pGrow.m_val->GetValue());
}
m_oBcw.WriteItemEnd(nCurPos);
}
void WriteMathHideBot(const OOX::Logic::CHideBot &pHideBot)
{
int nCurPos = m_oBcw.WriteItemStart(c_oSer_OMathBottomNodesType::HideBot);
if (pHideBot.m_val.IsInit())
{
m_oBcw.m_oStream.WriteBYTE(c_oSer_OMathBottomNodesValType::Val);
m_oBcw.m_oStream.WriteBYTE(c_oSerPropLenType::Byte);
m_oBcw.m_oStream.WriteBOOL(pHideBot.m_val->GetValue());
}
m_oBcw.WriteItemEnd(nCurPos);
}
void WriteMathHideLeft(const OOX::Logic::CHideLeft &pHideLeft)
{
int nCurPos = m_oBcw.WriteItemStart(c_oSer_OMathBottomNodesType::HideLeft);
if (pHideLeft.m_val.IsInit())
{
m_oBcw.m_oStream.WriteBYTE(c_oSer_OMathBottomNodesValType::Val);
m_oBcw.m_oStream.WriteBYTE(c_oSerPropLenType::Byte);
m_oBcw.m_oStream.WriteBOOL(pHideLeft.m_val->GetValue());
}
m_oBcw.WriteItemEnd(nCurPos);
}
void WriteMathHideRight(const OOX::Logic::CHideRight &pHideRight)
{
int nCurPos = m_oBcw.WriteItemStart(c_oSer_OMathBottomNodesType::HideRight);
if (pHideRight.m_val.IsInit())
{
m_oBcw.m_oStream.WriteBYTE(c_oSer_OMathBottomNodesValType::Val);
m_oBcw.m_oStream.WriteBYTE(c_oSerPropLenType::Byte);
m_oBcw.m_oStream.WriteBOOL(pHideRight.m_val->GetValue());
}
m_oBcw.WriteItemEnd(nCurPos);
}
void WriteMathHideTop(const OOX::Logic::CHideTop &pHideTop)
{
int nCurPos = m_oBcw.WriteItemStart(c_oSer_OMathBottomNodesType::HideTop);
if (pHideTop.m_val.IsInit())
{
m_oBcw.m_oStream.WriteBYTE(c_oSer_OMathBottomNodesValType::Val);
m_oBcw.m_oStream.WriteBYTE(c_oSerPropLenType::Byte);
m_oBcw.m_oStream.WriteBOOL(pHideTop.m_val->GetValue());
}
m_oBcw.WriteItemEnd(nCurPos);
}
void WriteMathMJc(const OOX::Logic::CMJc &pMJc)
{
int nCurPos = m_oBcw.WriteItemStart(c_oSer_OMathBottomNodesType::MJc);
if (pMJc.m_val.IsInit())
{
m_oBcw.m_oStream.WriteBYTE(c_oSer_OMathBottomNodesValType::Val);
m_oBcw.m_oStream.WriteBYTE(c_oSerPropLenType::Byte);
m_oBcw.m_oStream.WriteBYTE(pMJc.m_val->GetValue());
}
m_oBcw.WriteItemEnd(nCurPos);
}
void WriteMathLim(const OOX::Logic::CLim &pLim)
{
int nCurPos = m_oBcw.WriteItemStart(c_oSer_OMathContentType::Lim);
WriteMathArgNodes(pLim.m_arrItems);
m_oBcw.WriteItemEnd(nCurPos);
}
void WriteMathLimLoc(const OOX::Logic::CLimLoc &pLimLoc)
{
int nCurPos = m_oBcw.WriteItemStart(c_oSer_OMathBottomNodesType::LimLoc);
if (pLimLoc.m_val.IsInit())
{
m_oBcw.m_oStream.WriteBYTE(c_oSer_OMathBottomNodesValType::Val);
m_oBcw.m_oStream.WriteBYTE(c_oSerPropLenType::Byte);
m_oBcw.m_oStream.WriteBYTE(pLimLoc.m_val->GetValue());
}
m_oBcw.WriteItemEnd(nCurPos);
}
void WriteMathColumn(const LONG &lColumn)
{
int nCurPos = m_oBcw.WriteItemStart(c_oSer_OMathBottomNodesType::Column);
if (lColumn)
{
m_oBcw.m_oStream.WriteBYTE(c_oSer_OMathBottomNodesValType::Val);
m_oBcw.m_oStream.WriteBYTE(c_oSerPropLenType::Long);
m_oBcw.m_oStream.WriteLONG(lColumn);
}
m_oBcw.WriteItemEnd(nCurPos);
}
void WriteMathRow(const LONG &lRow)
{
int nCurPos = m_oBcw.WriteItemStart(c_oSer_OMathBottomNodesType::Row);
if (lRow)
{
m_oBcw.m_oStream.WriteBYTE(c_oSer_OMathBottomNodesValType::Val);
m_oBcw.m_oStream.WriteBYTE(c_oSerPropLenType::Long);
m_oBcw.m_oStream.WriteLONG(lRow);
}
m_oBcw.WriteItemEnd(nCurPos);
}
void WriteMathLimLowPr(const OOX::Logic::CLimLowPr &pLimLowPr)
{
int nCurPos = m_oBcw.WriteItemStart(c_oSer_OMathContentType::LimLowPr);
if ( pLimLowPr.m_oCtrlPr.IsInit() )
WriteMathCtrlPr(pLimLowPr.m_oCtrlPr.get());
m_oBcw.WriteItemEnd(nCurPos);
}
void WriteMathLimUppPr(const OOX::Logic::CLimUppPr &pLimUppPr)
{
int nCurPos = m_oBcw.WriteItemStart(c_oSer_OMathContentType::LimUppPr);
if ( pLimUppPr.m_oCtrlPr.IsInit() )
WriteMathCtrlPr(pLimUppPr.m_oCtrlPr.get());
m_oBcw.WriteItemEnd(nCurPos);
}
void WriteMathLit(const OOX::Logic::CLit &pLit)
{
int nCurPos = m_oBcw.WriteItemStart(c_oSer_OMathBottomNodesType::Lit);
if (pLit.m_val.IsInit())
{
m_oBcw.m_oStream.WriteBYTE(c_oSer_OMathBottomNodesValType::Val);
m_oBcw.m_oStream.WriteBYTE(c_oSerPropLenType::Byte);
m_oBcw.m_oStream.WriteBOOL(pLit.m_val->GetValue());
}
else
{
m_oBcw.m_oStream.WriteBYTE(c_oSer_OMathBottomNodesValType::Val);
m_oBcw.m_oStream.WriteBYTE(c_oSerPropLenType::Byte);
m_oBcw.m_oStream.WriteBOOL(true);
}
m_oBcw.WriteItemEnd(nCurPos);
}
void WriteMathMatrix(const std::vector<OOX::WritingElement*>& m_arrItems, LONG &lRow, LONG &lCol)
{
bool bColumn = false;
for(int i = 0; i< m_arrItems.size(); ++i)
{
OOX::WritingElement* item = m_arrItems[i];
OOX::EElementType eType = item->getType();
int nCurPos = 0;
switch(eType)
{
case OOX::et_m_mPr:
{
OOX::Logic::CMPr* pMPr = static_cast<OOX::Logic::CMPr*>(item);
nCurPos = m_oBcw.WriteItemStart(c_oSer_OMathContentType::MPr);
if (lRow)
WriteMathRow(lRow);
if ( pMPr->m_oBaseJc.IsInit() )
WriteMathBaseJc(pMPr->m_oBaseJc.get());
if ( pMPr->m_oCGp.IsInit() )
WriteMathCGp(pMPr->m_oCGp.get());
if ( pMPr->m_oCGpRule.IsInit() )
WriteMathCGpRule(pMPr->m_oCGpRule.get());
if ( pMPr->m_oCSp.IsInit() )
WriteMathCSp(pMPr->m_oCSp.get());
if ( pMPr->m_oCtrlPr.IsInit() )
WriteMathCtrlPr(pMPr->m_oCtrlPr.get());
if ( pMPr->m_oMcs.IsInit() )
WriteMathMcs(pMPr->m_oMcs.get());
else
WriteMathMcs(lCol);
if ( pMPr->m_oPlcHide.IsInit() )
WriteMathPlcHide(pMPr->m_oPlcHide.get());
if ( pMPr->m_oRSp.IsInit() )
WriteMathRSp(pMPr->m_oRSp.get());
if ( pMPr->m_oRSpRule.IsInit() )
WriteMathRSpRule(pMPr->m_oRSpRule.get());
m_oBcw.WriteItemEnd(nCurPos);
break;
}
case OOX::et_m_mr:
{
OOX::Logic::CMr* pMr = static_cast<OOX::Logic::CMr*>(item);
nCurPos = m_oBcw.WriteItemStart(c_oSer_OMathContentType::Mr);
WriteMathMr(pMr->m_arrItems);
m_oBcw.WriteItemEnd(nCurPos);
break;
}
}
}
}
void WriteMathMaxDist(const OOX::Logic::CMaxDist &pMaxDist)
{
int nCurPos = m_oBcw.WriteItemStart(c_oSer_OMathBottomNodesType::MaxDist);
if (pMaxDist.m_val.IsInit())
{
m_oBcw.m_oStream.WriteBYTE(c_oSer_OMathBottomNodesValType::Val);
m_oBcw.m_oStream.WriteBYTE(c_oSerPropLenType::Byte);
m_oBcw.m_oStream.WriteBOOL(pMaxDist.m_val->GetValue());
}
m_oBcw.WriteItemEnd(nCurPos);
}
void WriteMathMc(const OOX::Logic::CMc &pMc)
{
int nCurPos = m_oBcw.WriteItemStart(c_oSer_OMathContentType::Mc);
if ( pMc.m_oMcPr.IsInit() )
WriteMathMcPr(pMc.m_oMcPr.get());
m_oBcw.WriteItemEnd(nCurPos);
}
void WriteMathMcJc(const OOX::Logic::CMcJc &pMcJc)
{
int nCurPos = m_oBcw.WriteItemStart(c_oSer_OMathBottomNodesType::McJc);
if (pMcJc.m_val.IsInit())
{
m_oBcw.m_oStream.WriteBYTE(c_oSer_OMathBottomNodesValType::Val);
m_oBcw.m_oStream.WriteBYTE(c_oSerPropLenType::Byte);
m_oBcw.m_oStream.WriteBYTE(pMcJc.m_val->GetValue());
}
m_oBcw.WriteItemEnd(nCurPos);
}
void WriteMathMcPr(const OOX::Logic::CMcPr &pMcPr)
{
int nCurPos = m_oBcw.WriteItemStart(c_oSer_OMathContentType::McPr);
if ( pMcPr.m_oMcJc.IsInit() )
WriteMathMcJc(pMcPr.m_oMcJc.get());
if ( pMcPr.m_oCount.IsInit() )
WriteMathCount(pMcPr.m_oCount.get());
m_oBcw.WriteItemEnd(nCurPos);
}
void WriteMathMcs(const OOX::Logic::CMcs &pMcs)
{
int nCurPos = m_oBcw.WriteItemStart(c_oSer_OMathBottomNodesType::Mcs);
for(int i = 0; i< pMcs.m_arrItems.size(); ++i)
{
OOX::WritingElement* item = pMcs.m_arrItems[i];
OOX::EElementType eType = item->getType();
int nCurPos1 = 0;
if (eType == OOX::et_m_mc)
{
OOX::Logic::CMc* pMc = static_cast<OOX::Logic::CMc*>(item);
nCurPos1 = m_oBcw.WriteItemStart(c_oSer_OMathContentType::Mc);
if ( pMc->m_oMcPr.IsInit() )
WriteMathMcPr(pMc->m_oMcPr.get());
m_oBcw.WriteItemEnd(nCurPos1);
}
}
m_oBcw.WriteItemEnd(nCurPos);
}
void WriteMathMcs ( LONG lColumn )
{
int nCurPos = m_oBcw.WriteItemStart(c_oSer_OMathBottomNodesType::Mcs);
int nCurPos1 = m_oBcw.WriteItemStart(c_oSer_OMathContentType::Mc);
int nCurPos2 = m_oBcw.WriteItemStart(c_oSer_OMathContentType::McPr);
int nCurPos3 = m_oBcw.WriteItemStart(c_oSer_OMathBottomNodesType::Count);
m_oBcw.m_oStream.WriteBYTE(c_oSer_OMathBottomNodesValType::Val);
m_oBcw.m_oStream.WriteBYTE(c_oSerPropLenType::Long);
m_oBcw.m_oStream.WriteLONG(lColumn);
m_oBcw.WriteItemEnd(nCurPos3);
m_oBcw.WriteItemEnd(nCurPos2);
m_oBcw.WriteItemEnd(nCurPos1);
m_oBcw.WriteItemEnd(nCurPos);
}
void WriteMathMPr(const OOX::Logic::CMPr &pMPr)
{
int nCurPos = m_oBcw.WriteItemStart(c_oSer_OMathContentType::MPr);
if ( pMPr.m_oBaseJc.IsInit() )
WriteMathBaseJc(pMPr.m_oBaseJc.get());
if ( pMPr.m_oCGp.IsInit() )
WriteMathCGp(pMPr.m_oCGp.get());
if ( pMPr.m_oCGpRule.IsInit() )
WriteMathCGpRule(pMPr.m_oCGpRule.get());
if ( pMPr.m_oCSp.IsInit() )
WriteMathCSp(pMPr.m_oCSp.get());
if ( pMPr.m_oCtrlPr.IsInit() )
WriteMathCtrlPr(pMPr.m_oCtrlPr.get());
if ( pMPr.m_oMcs.IsInit() )
WriteMathMcs(pMPr.m_oMcs.get());
if ( pMPr.m_oPlcHide.IsInit() )
WriteMathPlcHide(pMPr.m_oPlcHide.get());
if ( pMPr.m_oRSp.IsInit() )
WriteMathRSp(pMPr.m_oRSp.get());
if ( pMPr.m_oRSpRule.IsInit() )
WriteMathRSpRule(pMPr.m_oRSpRule.get());
m_oBcw.WriteItemEnd(nCurPos);
}
void WriteMathMr(const std::vector<OOX::WritingElement*>& m_arrItems)
{
for(int i = 0; i< m_arrItems.size(); ++i)
{
OOX::WritingElement* item = m_arrItems[i];
OOX::EElementType eType = item->getType();
int nCurPos = 0;
if (eType == OOX::et_m_e)
{
OOX::Logic::CElement* pElement = static_cast<OOX::Logic::CElement*>(item);
nCurPos = m_oBcw.WriteItemStart(c_oSer_OMathContentType::Element);
WriteMathArgNodes(pElement->m_arrItems);
m_oBcw.WriteItemEnd(nCurPos);
}
}
}
void WriteMathNaryPr(const OOX::Logic::CNaryPr &pNaryPr)
{
int nCurPos = m_oBcw.WriteItemStart(c_oSer_OMathContentType::NaryPr);
if ( pNaryPr.m_oChr.IsInit() )
WriteMathChr(pNaryPr.m_oChr.get());
if ( pNaryPr.m_oCtrlPr.IsInit() )
WriteMathCtrlPr(pNaryPr.m_oCtrlPr.get());
if ( pNaryPr.m_oGrow.IsInit() )
WriteMathGrow(pNaryPr.m_oGrow.get());
if ( pNaryPr.m_oLimLoc.IsInit() )
WriteMathLimLoc(pNaryPr.m_oLimLoc.get());
if ( pNaryPr.m_oSubHide.IsInit() )
WriteMathSubHide(pNaryPr.m_oSubHide.get());
if ( pNaryPr.m_oSupHide.IsInit() )
WriteMathSupHide(pNaryPr.m_oSupHide.get());
m_oBcw.WriteItemEnd(nCurPos);
}
void WriteMathNoBreak(const OOX::Logic::CNoBreak &pNoBreak)
{
int nCurPos = m_oBcw.WriteItemStart(c_oSer_OMathBottomNodesType::NoBreak);
if (pNoBreak.m_val.IsInit())
{
m_oBcw.m_oStream.WriteBYTE(c_oSer_OMathBottomNodesValType::Val);
m_oBcw.m_oStream.WriteBYTE(c_oSerPropLenType::Byte);
m_oBcw.m_oStream.WriteBOOL(pNoBreak.m_val->GetValue());
}
m_oBcw.WriteItemEnd(nCurPos);
}
void WriteMathNor(const OOX::Logic::CNor &pNor)
{
int nCurPos = m_oBcw.WriteItemStart(c_oSer_OMathBottomNodesType::Nor);
m_oBcw.m_oStream.WriteBYTE(c_oSer_OMathBottomNodesValType::Val);
m_oBcw.m_oStream.WriteBYTE(c_oSerPropLenType::Byte);
if (pNor.m_val.IsInit())
m_oBcw.m_oStream.WriteBOOL(pNor.m_val->GetValue());
else
m_oBcw.m_oStream.WriteBOOL(true);
m_oBcw.WriteItemEnd(nCurPos);
}
void WriteMathNum(const OOX::Logic::CNum &pNum)
{
int nCurPos = m_oBcw.WriteItemStart(c_oSer_OMathContentType::Num);
WriteMathArgNodes(pNum.m_arrItems);
m_oBcw.WriteItemEnd(nCurPos);
}
void WriteMathObjDist(const OOX::Logic::CObjDist &pObjDist)
{
int nCurPos = m_oBcw.WriteItemStart(c_oSer_OMathBottomNodesType::ObjDist);
if (pObjDist.m_val.IsInit())
{
m_oBcw.m_oStream.WriteBYTE(c_oSer_OMathBottomNodesValType::Val);
m_oBcw.m_oStream.WriteBYTE(c_oSerPropLenType::Byte);
m_oBcw.m_oStream.WriteBOOL(pObjDist.m_val->GetValue());
}
m_oBcw.WriteItemEnd(nCurPos);
}
void WriteMathOMath(const OOX::Logic::COMath &pOMath)
{
int nCurPos = m_oBcw.WriteItemStart(c_oSer_OMathContentType::OMath);
WriteMathArgNodes(pOMath.m_arrItems);
m_oBcw.WriteItemEnd(nCurPos);
}
void WriteMathOMathPara(const std::vector<OOX::WritingElement*>& m_arrItems)
{
for(int i = 0; i< m_arrItems.size(); ++i)
{
OOX::WritingElement* item = m_arrItems[i];
OOX::EElementType eType = item->getType();
int nCurPos = 0;
if (eType == OOX::et_m_oMath)
{
OOX::Logic::COMath* pOMath = static_cast<OOX::Logic::COMath*>(item);
int nCurPos = m_oBcw.WriteItemStart(c_oSer_OMathContentType::OMath);
WriteMathArgNodes(pOMath->m_arrItems);
m_oBcw.WriteItemEnd(nCurPos);
}
else if (eType == OOX::et_m_oMathParaPr)
{
OOX::Logic::COMathParaPr* pOMathParaPr = static_cast<OOX::Logic::COMathParaPr*>(item);
nCurPos = m_oBcw.WriteItemStart(c_oSer_OMathContentType::OMathParaPr);
if ( pOMathParaPr->m_oMJc.IsInit() )
WriteMathMJc(pOMathParaPr->m_oMJc.get());
m_oBcw.WriteItemEnd(nCurPos);
}
else if (eType == OOX::et_w_r)
{
bool bHyperlink = false;
bool bMathRun = true;
OOX::Logic::CRun* pRun = static_cast<OOX::Logic::CRun*>(item);
WriteRun(pRun, bHyperlink, bMathRun);
}
}
}
void WriteMathOMathParaPr(const OOX::Logic::COMathParaPr &pOMathParaPr)
{
int nCurPos = m_oBcw.WriteItemStart(c_oSer_OMathContentType::OMathParaPr);
if ( pOMathParaPr.m_oMJc.IsInit() )
WriteMathMJc(pOMathParaPr.m_oMJc.get());
m_oBcw.WriteItemEnd(nCurPos);
}
void WriteMathOpEmu(const OOX::Logic::COpEmu &pOpEmu)
{
int nCurPos = m_oBcw.WriteItemStart(c_oSer_OMathBottomNodesType::OpEmu);
if (pOpEmu.m_val.IsInit())
{
m_oBcw.m_oStream.WriteBYTE(c_oSer_OMathBottomNodesValType::Val);
m_oBcw.m_oStream.WriteBYTE(c_oSerPropLenType::Byte);
m_oBcw.m_oStream.WriteBOOL(pOpEmu.m_val->GetValue());
}
m_oBcw.WriteItemEnd(nCurPos);
}
void WriteMathPhantPr(const OOX::Logic::CPhantPr &pPhantPr)
{
int nCurPos = m_oBcw.WriteItemStart(c_oSer_OMathContentType::PhantPr);
if ( pPhantPr.m_oCtrlPr.IsInit() )
WriteMathCtrlPr(pPhantPr.m_oCtrlPr.get());
if ( pPhantPr.m_oShow.IsInit() )
WriteMathShow(pPhantPr.m_oShow.get());
if ( pPhantPr.m_oTransp.IsInit() )
WriteMathTransp(pPhantPr.m_oTransp.get());
if ( pPhantPr.m_oZeroAsc.IsInit() )
WriteMathZeroAsc(pPhantPr.m_oZeroAsc.get());
if ( pPhantPr.m_oZeroDesc.IsInit() )
WriteMathZeroDesc(pPhantPr.m_oZeroDesc.get());
if ( pPhantPr.m_oZeroWid.IsInit() )
WriteMathZeroWid(pPhantPr.m_oZeroWid.get());
m_oBcw.WriteItemEnd(nCurPos);
}
void WriteMathPlcHide(const OOX::Logic::CPlcHide &pPlcHide)
{
int nCurPos = m_oBcw.WriteItemStart(c_oSer_OMathBottomNodesType::PlcHide);
if (pPlcHide.m_val.IsInit())
{
m_oBcw.m_oStream.WriteBYTE(c_oSer_OMathBottomNodesValType::Val);
m_oBcw.m_oStream.WriteBYTE(c_oSerPropLenType::Byte);
m_oBcw.m_oStream.WriteBOOL(pPlcHide.m_val->GetValue());
}
m_oBcw.WriteItemEnd(nCurPos);
}
void WriteMathPos(const OOX::Logic::CPos &pPos)
{
int nCurPos = m_oBcw.WriteItemStart(c_oSer_OMathBottomNodesType::Pos);
if (pPos.m_val.IsInit())
{
m_oBcw.m_oStream.WriteBYTE(c_oSer_OMathBottomNodesValType::Val);
m_oBcw.m_oStream.WriteBYTE(c_oSerPropLenType::Byte);
m_oBcw.m_oStream.WriteBYTE(pPos.m_val->GetValue());
}
m_oBcw.WriteItemEnd(nCurPos);
}
void WriteMathRadPr(const OOX::Logic::CRadPr &pRadPr)
{
int nCurPos = m_oBcw.WriteItemStart(c_oSer_OMathContentType::RadPr);
if ( pRadPr.m_oDegHide.IsInit() )
WriteMathDegHide(pRadPr.m_oDegHide.get());
if ( pRadPr.m_oCtrlPr.IsInit() )
WriteMathCtrlPr(pRadPr.m_oCtrlPr.get());
m_oBcw.WriteItemEnd(nCurPos);
}
void WriteMathMRPr(const OOX::Logic::CMRPr &pMRPr)
{
int nCurPos = m_oBcw.WriteItemStart(c_oSer_OMathContentType::MRPr);
if ( pMRPr.m_oAln.IsInit())
WriteMathAln(pMRPr.m_oAln.get());
if ( pMRPr.m_oBrk.IsInit() )
WriteMathBrk(pMRPr.m_oBrk.get());
if ( pMRPr.m_oLit.IsInit() )
WriteMathLit(pMRPr.m_oLit.get());
if ( pMRPr.m_oNor.IsInit() )
WriteMathNor(pMRPr.m_oNor.get());
if ( pMRPr.m_oScr.IsInit() )
WriteMathScr(pMRPr.m_oScr.get());
if ( pMRPr.m_oSty.IsInit() )
WriteMathSty(pMRPr.m_oSty.get());
m_oBcw.WriteItemEnd(nCurPos);
}
void WriteMathRSp(const OOX::Logic::CRSp &pRSp)
{
int nCurPos = m_oBcw.WriteItemStart(c_oSer_OMathBottomNodesType::RSp);
if (pRSp.m_val.IsInit())
{
m_oBcw.m_oStream.WriteBYTE(c_oSer_OMathBottomNodesValType::Val);
m_oBcw.m_oStream.WriteBYTE(c_oSerPropLenType::Long);
m_oBcw.m_oStream.WriteLONG(pRSp.m_val->GetValue());
}
m_oBcw.WriteItemEnd(nCurPos);
}
void WriteMathRSpRule(const OOX::Logic::CRSpRule &pRSpRule)
{
int nCurPos = m_oBcw.WriteItemStart(c_oSer_OMathBottomNodesType::RSpRule);
if (pRSpRule.m_val.IsInit())
{
m_oBcw.m_oStream.WriteBYTE(c_oSer_OMathBottomNodesValType::Val);
m_oBcw.m_oStream.WriteBYTE(c_oSerPropLenType::Long);
m_oBcw.m_oStream.WriteLONG(pRSpRule.m_val->GetValue());
}
m_oBcw.WriteItemEnd(nCurPos);
}
void WriteMathScr(const OOX::Logic::CScr &pScr)
{
int nCurPos = m_oBcw.WriteItemStart(c_oSer_OMathBottomNodesType::Scr);
if (pScr.m_val.IsInit())
{
m_oBcw.m_oStream.WriteBYTE(c_oSer_OMathBottomNodesValType::Val);
m_oBcw.m_oStream.WriteBYTE(c_oSerPropLenType::Byte);
m_oBcw.m_oStream.WriteBYTE(pScr.m_val->GetValue());
}
m_oBcw.WriteItemEnd(nCurPos);
}
void WriteMathSepChr(const OOX::Logic::CSepChr &pSepChr)
{
int nCurPos = m_oBcw.WriteItemStart(c_oSer_OMathBottomNodesType::SepChr);
if (pSepChr.m_val.IsInit())
{
m_oBcw.m_oStream.WriteBYTE(c_oSer_OMathBottomNodesValType::Val);
m_oBcw.m_oStream.WriteBYTE(c_oSerPropLenType::Variable);
m_oBcw.m_oStream.WriteStringW(pSepChr.m_val->GetValue());
}
m_oBcw.WriteItemEnd(nCurPos);
}
void WriteMathShow(const OOX::Logic::CShow &pShow)
{
int nCurPos = m_oBcw.WriteItemStart(c_oSer_OMathBottomNodesType::Show);
if (pShow.m_val.IsInit())
{
m_oBcw.m_oStream.WriteBYTE(c_oSer_OMathBottomNodesValType::Val);
m_oBcw.m_oStream.WriteBYTE(c_oSerPropLenType::Byte);
m_oBcw.m_oStream.WriteBOOL(pShow.m_val->GetValue());
}
m_oBcw.WriteItemEnd(nCurPos);
}
void WriteMathShp(const OOX::Logic::CShp &pShp)
{
int nCurPos = m_oBcw.WriteItemStart(c_oSer_OMathBottomNodesType::Shp);
if (pShp.m_val.IsInit())
{
m_oBcw.m_oStream.WriteBYTE(c_oSer_OMathBottomNodesValType::Val);
m_oBcw.m_oStream.WriteBYTE(c_oSerPropLenType::Byte);
m_oBcw.m_oStream.WriteBYTE(pShp.m_val->GetValue());
}
m_oBcw.WriteItemEnd(nCurPos);
}
void WriteMathSPrePr(const OOX::Logic::CSPrePr &pSPrePr)
{
int nCurPos = m_oBcw.WriteItemStart(c_oSer_OMathContentType::SPrePr);
if ( pSPrePr.m_oCtrlPr.IsInit() )
WriteMathCtrlPr(pSPrePr.m_oCtrlPr.get());
m_oBcw.WriteItemEnd(nCurPos);
}
void WriteMathSSubPr(const OOX::Logic::CSSubPr &pSSubPr)
{
int nCurPos = m_oBcw.WriteItemStart(c_oSer_OMathContentType::SSubPr);
if ( pSSubPr.m_oCtrlPr.IsInit() )
WriteMathCtrlPr(pSSubPr.m_oCtrlPr.get());
m_oBcw.WriteItemEnd(nCurPos);
}
void WriteMathSSubSupPr(const OOX::Logic::CSSubSupPr &pSSubSupPr)
{
int nCurPos = m_oBcw.WriteItemStart(c_oSer_OMathContentType::SSubSupPr);
if ( pSSubSupPr.m_oAlnScr.IsInit() )
WriteMathAlnScr(pSSubSupPr.m_oAlnScr.get());
if ( pSSubSupPr.m_oCtrlPr.IsInit() )
WriteMathCtrlPr(pSSubSupPr.m_oCtrlPr.get());
m_oBcw.WriteItemEnd(nCurPos);
}
void WriteMathSSupPr(const OOX::Logic::CSSupPr &pSSupPr)
{
int nCurPos = m_oBcw.WriteItemStart(c_oSer_OMathContentType::SSupPr);
if ( pSSupPr.m_oCtrlPr.IsInit() )
WriteMathCtrlPr(pSSupPr.m_oCtrlPr.get());
m_oBcw.WriteItemEnd(nCurPos);
}
void WriteMathStrikeBLTR(const OOX::Logic::CStrikeBLTR &pStrikeBLTR)
{
int nCurPos = m_oBcw.WriteItemStart(c_oSer_OMathBottomNodesType::StrikeBLTR);
if (pStrikeBLTR.m_val.IsInit())
{
m_oBcw.m_oStream.WriteBYTE(c_oSer_OMathBottomNodesValType::Val);
m_oBcw.m_oStream.WriteBYTE(c_oSerPropLenType::Byte);
m_oBcw.m_oStream.WriteBOOL(pStrikeBLTR.m_val->GetValue());
}
m_oBcw.WriteItemEnd(nCurPos);
}
void WriteMathStrikeH(const OOX::Logic::CStrikeH &pStrikeH)
{
int nCurPos = m_oBcw.WriteItemStart(c_oSer_OMathBottomNodesType::StrikeH);
if (pStrikeH.m_val.IsInit())
{
m_oBcw.m_oStream.WriteBYTE(c_oSer_OMathBottomNodesValType::Val);
m_oBcw.m_oStream.WriteBYTE(c_oSerPropLenType::Byte);
m_oBcw.m_oStream.WriteBOOL(pStrikeH.m_val->GetValue());
}
m_oBcw.WriteItemEnd(nCurPos);
}
void WriteMathStrikeTLBR(const OOX::Logic::CStrikeTLBR &pStrikeTLBR)
{
int nCurPos = m_oBcw.WriteItemStart(c_oSer_OMathBottomNodesType::StrikeTLBR);
if (pStrikeTLBR.m_val.IsInit())
{
m_oBcw.m_oStream.WriteBYTE(c_oSer_OMathBottomNodesValType::Val);
m_oBcw.m_oStream.WriteBYTE(c_oSerPropLenType::Byte);
m_oBcw.m_oStream.WriteBOOL(pStrikeTLBR.m_val->GetValue());
}
m_oBcw.WriteItemEnd(nCurPos);
}
void WriteMathStrikeV(const OOX::Logic::CStrikeV &pStrikeV)
{
int nCurPos = m_oBcw.WriteItemStart(c_oSer_OMathBottomNodesType::StrikeV);
if (pStrikeV.m_val.IsInit())
{
m_oBcw.m_oStream.WriteBYTE(c_oSer_OMathBottomNodesValType::Val);
m_oBcw.m_oStream.WriteBYTE(c_oSerPropLenType::Byte);
m_oBcw.m_oStream.WriteBOOL(pStrikeV.m_val->GetValue());
}
m_oBcw.WriteItemEnd(nCurPos);
}
void WriteMathSty(const OOX::Logic::CSty &pSty)
{
int nCurPos = m_oBcw.WriteItemStart(c_oSer_OMathBottomNodesType::Sty);
if (pSty.m_val.IsInit())
{
m_oBcw.m_oStream.WriteBYTE(c_oSer_OMathBottomNodesValType::Val);
m_oBcw.m_oStream.WriteBYTE(c_oSerPropLenType::Byte);
m_oBcw.m_oStream.WriteBYTE(pSty.m_val->GetValue());
}
m_oBcw.WriteItemEnd(nCurPos);
}
void WriteMathSub(const OOX::Logic::CSub &pSub)
{
int nCurPos = m_oBcw.WriteItemStart(c_oSer_OMathContentType::Sub);
WriteMathArgNodes(pSub.m_arrItems);
m_oBcw.WriteItemEnd(nCurPos);
}
void WriteMathSubHide(const OOX::Logic::CSubHide &pSubHide)
{
int nCurPos = m_oBcw.WriteItemStart(c_oSer_OMathBottomNodesType::SubHide);
if (pSubHide.m_val.IsInit())
{
m_oBcw.m_oStream.WriteBYTE(c_oSer_OMathBottomNodesValType::Val);
m_oBcw.m_oStream.WriteBYTE(c_oSerPropLenType::Byte);
m_oBcw.m_oStream.WriteBOOL(pSubHide.m_val->GetValue());
}
m_oBcw.WriteItemEnd(nCurPos);
}
void WriteMathSup(const OOX::Logic::CSup &pSup)
{
int nCurPos = m_oBcw.WriteItemStart(c_oSer_OMathContentType::Sup);
WriteMathArgNodes(pSup.m_arrItems);
m_oBcw.WriteItemEnd(nCurPos);
}
void WriteMathSupHide(const OOX::Logic::CSupHide &pSupHide)
{
int nCurPos = m_oBcw.WriteItemStart(c_oSer_OMathBottomNodesType::SupHide);
if (pSupHide.m_val.IsInit())
{
m_oBcw.m_oStream.WriteBYTE(c_oSer_OMathBottomNodesValType::Val);
m_oBcw.m_oStream.WriteBYTE(c_oSerPropLenType::Byte);
m_oBcw.m_oStream.WriteBOOL(pSupHide.m_val->GetValue());
}
m_oBcw.WriteItemEnd(nCurPos);
}
void WriteMathDel(const OOX::Logic::CMDel &pMDel)
{
int nCurPos = 0;
m_oBcw.WriteTrackRevision(pMDel);
if(pMDel.m_oRun.IsInit())
{
nCurPos = m_oBcw.WriteItemStart(c_oSerProp_RevisionType::ContentRun);
WriteMathRunContent(pMDel.m_oRun.GetPointer());
m_oBcw.WriteItemWithLengthEnd(nCurPos);
}
}
void WriteMathIns(const OOX::Logic::CMIns &pMIns)
{
int nCurPos = 0;
m_oBcw.WriteTrackRevision(pMIns);
if(pMIns.m_oRun.IsInit())
{
nCurPos = m_oBcw.WriteItemStart(c_oSerProp_RevisionType::ContentRun);
WriteMathRunContent(pMIns.m_oRun.GetPointer());
m_oBcw.WriteItemWithLengthEnd(nCurPos);
}
}
void WriteMathText(const OOX::Logic::CMText &pMText)
{
int nCurPos = m_oBcw.WriteItemStart(c_oSer_OMathContentType::MText);
if(!pMText.m_sText.IsEmpty())
{
m_oBcw.m_oStream.WriteBYTE(c_oSer_OMathBottomNodesValType::Val);
m_oBcw.m_oStream.WriteBYTE(c_oSerPropLenType::Variable);
m_oBcw.m_oStream.WriteStringW(pMText.m_sText);
}
m_oBcw.WriteItemEnd(nCurPos);
}
void WriteMathTransp(const OOX::Logic::CTransp &pTransp)
{
int nCurPos = m_oBcw.WriteItemStart(c_oSer_OMathBottomNodesType::Transp);
if (pTransp.m_val.IsInit())
{
m_oBcw.m_oStream.WriteBYTE(c_oSer_OMathBottomNodesValType::Val);
m_oBcw.m_oStream.WriteBYTE(c_oSerPropLenType::Byte);
m_oBcw.m_oStream.WriteBOOL(pTransp.m_val->GetValue());
}
m_oBcw.WriteItemEnd(nCurPos);
}
void WriteMathType(const OOX::Logic::CType &pType)
{
int nCurPos = m_oBcw.WriteItemStart(c_oSer_OMathBottomNodesType::Type);
if (pType.m_val.IsInit())
{
m_oBcw.m_oStream.WriteBYTE(c_oSer_OMathBottomNodesValType::Val);
m_oBcw.m_oStream.WriteBYTE(c_oSerPropLenType::Byte);
m_oBcw.m_oStream.WriteBYTE(pType.m_val->GetValue());
}
m_oBcw.WriteItemEnd(nCurPos);
}
void WriteMathVertJc(const OOX::Logic::CVertJc &pVertJc)
{
int nCurPos = m_oBcw.WriteItemStart(c_oSer_OMathBottomNodesType::VertJc);
if (pVertJc.m_val.IsInit())
{
m_oBcw.m_oStream.WriteBYTE(c_oSer_OMathBottomNodesValType::Val);
m_oBcw.m_oStream.WriteBYTE(c_oSerPropLenType::Byte);
m_oBcw.m_oStream.WriteBYTE(pVertJc.m_val->GetValue());
}
m_oBcw.WriteItemEnd(nCurPos);
}
void WriteMathZeroAsc(const OOX::Logic::CZeroAsc &pZeroAsc)
{
int nCurPos = m_oBcw.WriteItemStart(c_oSer_OMathBottomNodesType::ZeroAsc);
if (pZeroAsc.m_val.IsInit())
{
m_oBcw.m_oStream.WriteBYTE(c_oSer_OMathBottomNodesValType::Val);
m_oBcw.m_oStream.WriteBYTE(c_oSerPropLenType::Byte);
m_oBcw.m_oStream.WriteBOOL(pZeroAsc.m_val->GetValue());
}
m_oBcw.WriteItemEnd(nCurPos);
}
void WriteMathZeroDesc(const OOX::Logic::CZeroDesc &pZeroDesc)
{
int nCurPos = m_oBcw.WriteItemStart(c_oSer_OMathBottomNodesType::ZeroDesc);
if (pZeroDesc.m_val.IsInit())
{
m_oBcw.m_oStream.WriteBYTE(c_oSer_OMathBottomNodesValType::Val);
m_oBcw.m_oStream.WriteBYTE(c_oSerPropLenType::Byte);
m_oBcw.m_oStream.WriteBOOL(pZeroDesc.m_val->GetValue());
}
m_oBcw.WriteItemEnd(nCurPos);
}
void WriteMathZeroWid(const OOX::Logic::CZeroWid &pZeroWid)
{
int nCurPos = m_oBcw.WriteItemStart(c_oSer_OMathBottomNodesType::ZeroWid);
if (pZeroWid.m_val.IsInit())
{
m_oBcw.m_oStream.WriteBYTE(c_oSer_OMathBottomNodesValType::Val);
m_oBcw.m_oStream.WriteBYTE(c_oSerPropLenType::Byte);
m_oBcw.m_oStream.WriteBOOL(pZeroWid.m_val->GetValue());
}
m_oBcw.WriteItemEnd(nCurPos);
}
void WritePreparedRun(OOX::Logic::CRun *pRun, bool bHyperlink, int nIndexStart, int nIndexStop)
{
if (!pRun) return;
int nCurPos = 0;
OOX::Logic::CRunProperty* oCur_rPr = pRun->m_oRunProperty;
if(NULL != oCur_rPr)
{
//Заглушка для содержания
if(false == bHyperlink)
{
//Случай если Hyperlink задан как field
for(int i = 0, length = m_aFldChars.size(); i < length; ++i)
if(fieldstruct_hyperlink == m_aFldChars[i]->GetType())
{
bHyperlink = true;
break;
}
}
if(bHyperlink)
{
bool bInTOC = false;
for(int i = 0, length = m_aFldChars.size(); i < length; ++i)
{
if(fieldstruct_toc == m_aFldChars[i]->GetType())
{
bInTOC = true;
break;
}
}
if(bInTOC)
{
//убираем Runstyle
if(oCur_rPr->m_oRStyle.IsInit())
oCur_rPr->m_oRStyle.reset();
//Если настройки выставлены явно, то убираем их
if(oCur_rPr->m_oColor.IsInit() && oCur_rPr->m_oColor->m_oVal.IsInit() && SimpleTypes::hexcolorRGB == oCur_rPr->m_oColor->m_oVal->GetValue())
{
unsigned char bR = oCur_rPr->m_oColor->m_oVal->Get_R();
unsigned char bG = oCur_rPr->m_oColor->m_oVal->Get_G();
unsigned char bB = oCur_rPr->m_oColor->m_oVal->Get_B();
if(0x00 == bR && 0x00 == bG && 0xFF == bB)
oCur_rPr->m_oColor->m_oVal->Set_B(0x00);
}
if(oCur_rPr->m_oU.IsInit() && oCur_rPr->m_oU->m_oVal.IsInit() && SimpleTypes::underlineSingle == oCur_rPr->m_oU->m_oVal->GetValue())
oCur_rPr->m_oU->m_oVal->SetValue(SimpleTypes::underlineNone);
}
}
}
//Если первый элемент символ надо выставить в его настройки шрифт
if(nIndexStart < pRun->m_arrItems.size() && OOX::et_w_sym == pRun->m_arrItems[nIndexStart]->getType())
{
OOX::Logic::CSym* oSym = static_cast<OOX::Logic::CSym*>(pRun->m_arrItems[nIndexStart]);
if(oSym->m_oFont.IsInit())
{
const CString& sFont = oSym->m_oFont.get();
if(NULL == oCur_rPr)
oCur_rPr = new OOX::Logic::CRunProperty();
oCur_rPr->m_oRFonts.Init();
oCur_rPr->m_oRFonts->m_sAscii.Init();
oCur_rPr->m_oRFonts->m_sAscii->Append(sFont);
oCur_rPr->m_oRFonts->m_sCs.Init();
oCur_rPr->m_oRFonts->m_sCs->Append(sFont);
oCur_rPr->m_oRFonts->m_sEastAsia.Init();
oCur_rPr->m_oRFonts->m_sEastAsia->Append(sFont);
oCur_rPr->m_oRFonts->m_sHAnsi.Init();
oCur_rPr->m_oRFonts->m_sHAnsi->Append(sFont);
}
}
//пишем rPr
if(NULL != oCur_rPr)
{
nCurPos = m_oBcw.WriteItemStart(c_oSerRunType::rPr);
brPrs.Write_rPr(*oCur_rPr);
m_oBcw.WriteItemEnd(nCurPos);
}
//Content пишется начиная от индекса nIndexStart и заканчивая предшествующим элементом для nIndexStop
nCurPos = m_oBcw.WriteItemStart(c_oSerRunType::Content);
WriteRunContent(pRun->m_arrItems, nIndexStart, nIndexStop, bHyperlink);
m_oBcw.WriteItemWithLengthEnd(nCurPos);
}
void WriteRunContent(std::vector<OOX::WritingElement*>& m_arrItems, int nIndexStart, int nIndexStop, bool bHyperlink = false)
{
for ( int i = nIndexStart; i < nIndexStop; ++i )
{
OOX::WritingElement* item = m_arrItems[i];
switch (item->getType())
{
case OOX::et_w_br:
{
OOX::Logic::CBr* pBr = static_cast<OOX::Logic::CBr*>(item);
int nBreakType = -1;
switch(pBr->m_oType.GetValue())
{
case SimpleTypes::brtypeColumn: nBreakType = c_oSerRunType::columnbreak; break;
case SimpleTypes::brtypePage: nBreakType = c_oSerRunType::pagebreak; break;
case SimpleTypes::brtypeTextWrapping: nBreakType = c_oSerRunType::linebreak; break;
}
if(-1 != nBreakType)
{
m_oBcw.m_oStream.WriteBYTE(nBreakType);
m_oBcw.m_oStream.WriteLONG(c_oSerPropLenType::Null);
}
break;
}
case OOX::et_w_cr:
{
m_oBcw.m_oStream.WriteBYTE(c_oSerRunType::cr);
m_oBcw.m_oStream.WriteLONG(c_oSerPropLenType::Null);
break;
}
case OOX::et_mc_alternateContent:
case OOX::et_w_pict:
case OOX::et_w_drawing:
{
WriteDrawingPptx(item);
break;
}
case OOX::et_w_fldChar:
{
OOX::Logic::CFldChar* pFldChar = static_cast<OOX::Logic::CFldChar*>(item);
if(pFldChar->m_oFldCharType.IsInit())
{
if(SimpleTypes::fldchartypeBegin == pFldChar->m_oFldCharType.get().GetValue())
{
m_eFldState = SimpleTypes::fldchartypeBegin;
m_sFldChar.Empty();
}
else if(SimpleTypes::fldchartypeEnd == pFldChar->m_oFldCharType.get().GetValue())
{
m_eFldState = SimpleTypes::fldchartypeEnd;
if(m_aFldChars.size() > 0)
{
int nIndex = m_aFldChars.size() - 1;
FldStruct* pFldStruct = m_aFldChars[nIndex];
RELEASEOBJECT(pFldStruct);
m_aFldChars.erase(m_aFldChars.begin() + nIndex);
m_oBcw.m_oStream.WriteBYTE(c_oSerRunType::fldend);
m_oBcw.m_oStream.WriteLONG(c_oSerPropLenType::Null);
}
}
else if(SimpleTypes::fldchartypeSeparate == pFldChar->m_oFldCharType.get().GetValue())
{
m_eFldState = SimpleTypes::fldchartypeSeparate;
FldStruct* pFldStruct = ParseField(m_sFldChar);
m_aFldChars.push_back(pFldStruct);
m_oBcw.m_oStream.WriteBYTE(c_oSerRunType::fldstart);
m_oBcw.m_oStream.WriteStringW(m_sFldChar);
}
}
}
break;
case OOX::et_w_instrText:
{
OOX::Logic::CInstrText* pInstrText = static_cast<OOX::Logic::CInstrText*>(item);
if(SimpleTypes::fldchartypeBegin == m_eFldState)
m_sFldChar += pInstrText->m_sText;
else
{
if(!pInstrText->m_sText.IsEmpty())
{
WriteText(pInstrText->m_sText);
}
}
}
break;
case OOX::et_w_nonBreakHyphen:
{
m_oBcw.m_oStream.WriteBYTE(c_oSerRunType::noBreakHyphen);
m_oBcw.m_oStream.WriteLONG(c_oSerPropLenType::Null);
break;
}
break;
case OOX::et_w_pgNum:
{
m_oBcw.m_oStream.WriteBYTE(c_oSerRunType::pagenum);
m_oBcw.m_oStream.WriteLONG(c_oSerPropLenType::Null);
}
break;
case OOX::et_w_ptab:
break;
case OOX::et_w_rPr:
break;
case OOX::et_w_softHyphen:
{
m_oBcw.m_oStream.WriteBYTE(c_oSerRunType::softHyphen);
m_oBcw.m_oStream.WriteLONG(c_oSerPropLenType::Null);
break;
}
break;
case OOX::et_w_sym:
{
OOX::Logic::CSym* oSym = static_cast<OOX::Logic::CSym*>(item);
CString sText;
sText.AppendChar(0x0FFF & oSym->m_oChar->GetValue());
WriteText(sText);
break;
}
case OOX::et_w_delText:
{
CString& sText = static_cast<OOX::Logic::CDelText*>(item)->m_sText;
if(!sText.IsEmpty())
{
WriteDelText(sText);
}
}
break;
case OOX::et_w_t:
{
CString& sText = static_cast<OOX::Logic::CText*>(item)->m_sText;
if(!sText.IsEmpty())
{
WriteText(sText);
}
}
break;
case OOX::et_w_tab:
{
m_oBcw.m_oStream.WriteBYTE(c_oSerRunType::tab);
m_oBcw.m_oStream.WriteLONG(c_oSerPropLenType::Null);
}
break;
case OOX::et_w_separator:
{
m_oBcw.m_oStream.WriteBYTE(c_oSerRunType::separator);
m_oBcw.m_oStream.WriteLONG(c_oSerPropLenType::Null);
}
break;
case OOX::et_w_continuationSeparator:
{
m_oBcw.m_oStream.WriteBYTE(c_oSerRunType::continuationSeparator);
m_oBcw.m_oStream.WriteLONG(c_oSerPropLenType::Null);
}
break;
case OOX::et_w_commentReference:
{
OOX::Logic::CCommentReference* pCommentReference = static_cast<OOX::Logic::CCommentReference*>(item);
WriteComment(OOX::et_w_commentReference, pCommentReference->m_oId);
break;
}
case OOX::et_w_object:
{
OOX::Logic::CObject* pObject = static_cast<OOX::Logic::CObject*>(item);
CString* pXml = pObject ? pObject->m_sXml.GetPointer() : NULL;
int nPosObject = m_oBcw.WriteItemStart(c_oSerRunType::object);
if(pObject && pObject->m_oOleObject.IsInit() && pObject->m_oOleObject->m_sProgId.IsInit() && pObject->m_oOleObject->m_oId.IsInit())
{
CString sProgID = pObject->m_oOleObject->m_sProgId.get().GetString();
if ( _T("Word.Document") == sProgID)
{
int nPosEmbedded = m_oBcw.WriteItemStart(c_oSerImageType2::Embedded);
OOX::Rels::CRelationShip* oRels = NULL;
smart_ptr<OOX::File> pFile = m_oParamsDocumentWriter.m_pRels->Find( OOX::RId(pObject->m_oOleObject->m_oId.get().GetValue()));
CString sLink;
if (pFile.IsInit() && OOX::FileTypes::OleObject == pFile->type())
{
OOX::HyperLink* pHyperlinkFile = static_cast<OOX::HyperLink*>(pFile.operator ->());
sLink = pHyperlinkFile->Uri().GetPath();
}
OOX::CPath path(sLink);
OOX::CDocument poDocumentEmbedded(path, path);
WriteDocumentContent(poDocumentEmbedded.m_arrItems);
m_oBcw.WriteItemEnd(nPosEmbedded);
}
else if ( _T("Equation.3") == sProgID || _T("Equation.2") == sProgID)
{
//write equation
OOX::Rels::CRelationShip* oRels = NULL;
smart_ptr<OOX::File> pFile = m_oParamsDocumentWriter.m_pRels->Find( OOX::RId(pObject->m_oOleObject->m_oId.get().GetValue()));
CString sLink;
if (pFile.IsInit() && OOX::FileTypes::OleObject == pFile->type())
{
OOX::HyperLink* pHyperlinkFile = static_cast<OOX::HyperLink*>(pFile.operator ->());
sLink = pHyperlinkFile->Uri().GetPath();
}
MathEquation::BinaryEquationWriter oBinEqWriter(m_oBcw.m_oStream);
MathEquation::CEquationReader oReader(sLink);
oReader.SetOutputDev(&oBinEqWriter);
oReader.Parse();
}
}
//write Picture
int nPosImageCache = m_oBcw.WriteItemStart(c_oSerRunType::pptxDrawing);
WriteDrawing(pXml, NULL, NULL);
m_oBcw.WriteItemEnd(nPosImageCache);
m_oBcw.WriteItemEnd(nPosObject);
break;
}
case OOX::et_w_footnoteRef:
{
m_oBcw.m_oStream.WriteBYTE(c_oSerRunType::footnoteRef);
m_oBcw.m_oStream.WriteLONG(c_oSerPropLenType::Null);
}
break;
case OOX::et_w_endnoteRef:
{
m_oBcw.m_oStream.WriteBYTE(c_oSerRunType::endnoteRef);
m_oBcw.m_oStream.WriteLONG(c_oSerPropLenType::Null);
}
break;
case OOX::et_w_footnoteReference:
{
OOX::Logic::CFootnoteReference* pFootnoteReference = static_cast<OOX::Logic::CFootnoteReference*>(item);
int nCurPos = m_oBcw.WriteItemStart(c_oSerRunType::footnoteReference);
WriteNoteRef(pFootnoteReference->m_oCustomMarkFollows, pFootnoteReference->m_oId);
m_oBcw.WriteItemEnd(nCurPos);
break;
}
case OOX::et_w_endnoteReference:
{
OOX::Logic::CEndnoteReference* pEndnoteReference = static_cast<OOX::Logic::CEndnoteReference*>(item);
int nCurPos = m_oBcw.WriteItemStart(c_oSerRunType::endnoteReference);
WriteNoteRef(pEndnoteReference->m_oCustomMarkFollows, pEndnoteReference->m_oId);
m_oBcw.WriteItemEnd(nCurPos);
break;
}
}
}
}
void WriteNoteRef(const nullable<SimpleTypes::COnOff<>>& oCustomMarkFollows, const nullable<SimpleTypes::CDecimalNumber<>>& oId)
{
int nCurPos = 0;
if (oCustomMarkFollows.IsInit())
{
nCurPos = m_oBcw.WriteItemStart(c_oSerNotes::RefCustomMarkFollows);
m_oBcw.m_oStream.WriteBOOL(oCustomMarkFollows->ToBool());
m_oBcw.WriteItemEnd(nCurPos);
}
if (oId.IsInit())
{
nCurPos = m_oBcw.WriteItemStart(c_oSerNotes::RefId);
m_oBcw.m_oStream.WriteLONG(oId->GetValue());
m_oBcw.WriteItemEnd(nCurPos);
}
}
void WriteDelText(const CString& text)
{
m_oBcw.m_oStream.WriteBYTE(c_oSerRunType::delText);
m_oBcw.m_oStream.WriteStringW(text);
if(NULL != m_oBcw.m_pEmbeddedFontsManager)
m_oBcw.m_pEmbeddedFontsManager->CheckString(text);
}
void WriteText(const CString& text)
{
m_oBcw.m_oStream.WriteBYTE(c_oSerRunType::run);
m_oBcw.m_oStream.WriteStringW(text);
if(NULL != m_oBcw.m_pEmbeddedFontsManager)
m_oBcw.m_pEmbeddedFontsManager->CheckString(text);
}
void WriteDrawingPptx(OOX::WritingElement* item)
{
OOX::EElementType pElementType = item->getType();
CString* pXml = NULL;
OOX::Logic::CDrawing* pChartDrawing = NULL;
OOX::Drawing::CGraphic* pGraphic = NULL;
if(OOX::et_mc_alternateContent == pElementType)
{
OOX::Logic::CAlternateContent* pAlternateContent = static_cast<OOX::Logic::CAlternateContent*>(item);
pXml = pAlternateContent->m_sXml.GetPointer();
if(pAlternateContent->m_arrChoiceItems.size() > 0)
{
OOX::WritingElement* we = pAlternateContent->m_arrChoiceItems[0];
if(OOX::et_w_drawing == we->getType())
{
OOX::Logic::CDrawing* pDrawing = static_cast<OOX::Logic::CDrawing*>(we);
if(pDrawing->m_bAnchor && pDrawing->m_oAnchor.IsInit() && pDrawing->m_oAnchor->m_oGraphic.IsInit())
{
pChartDrawing = pDrawing;
pGraphic = pDrawing->m_oAnchor->m_oGraphic.GetPointer();
}
else if(pDrawing->m_oInline.IsInit() && pDrawing->m_oInline->m_oGraphic.IsInit())
{
pChartDrawing = pDrawing;
pGraphic = pDrawing->m_oInline->m_oGraphic.GetPointer();
}
}
}
}
else if(OOX::et_w_drawing == pElementType)
{
OOX::Logic::CDrawing* pDrawing = static_cast<OOX::Logic::CDrawing*>(item);
pXml = pDrawing->m_sXml.GetPointer();
if(pDrawing->m_bAnchor && pDrawing->m_oAnchor.IsInit() && pDrawing->m_oAnchor->m_oGraphic.IsInit())
{
pChartDrawing = pDrawing;
pGraphic = pDrawing->m_oAnchor->m_oGraphic.GetPointer();
}
else if(pDrawing->m_oInline.IsInit() && pDrawing->m_oInline->m_oGraphic.IsInit())
{
pChartDrawing = pDrawing;
pGraphic = pDrawing->m_oInline->m_oGraphic.GetPointer();
}
}
else if(OOX::et_w_pict == pElementType)
{
OOX::Logic::CPicture* pPicture = static_cast<OOX::Logic::CPicture*>(item);
pXml = pPicture->m_sXml.GetPointer();
}
if(NULL != pXml)
{
OOX::Drawing::CChart* pChart = NULL;
if(NULL != pGraphic)
{
for(int i = 0; i < pGraphic->m_arrItems.size(); i++)
{
OOX::WritingElement* we = pGraphic->m_arrItems[i];
if(OOX::et_c_chart == we->getType())
{
pChart = static_cast<OOX::Drawing::CChart*>(we);
break;
}
}
}
if(NULL != pChart)
{
if(pChart->m_oRId.IsInit())
{
smart_ptr<OOX::File> pFile = m_oParamsDocumentWriter.m_pRels->Find( OOX::RId(pChart->m_oRId->GetValue()));
if (pFile.IsInit() && OOX::FileTypes::Chart == pFile->type())
{
OOX::Spreadsheet::CChartSpace* pChartFile = static_cast<OOX::Spreadsheet::CChartSpace*>(pFile.operator ->());
CString sOldRelsPath = m_pOfficeDrawingConverter->GetRelsPath();
CString sChartPath = pChartFile->GetReadPath().GetPath();
m_pOfficeDrawingConverter->SetRelsPath(sChartPath);
int nCurPos = m_oBcw.WriteItemStart(c_oSerRunType::pptxDrawing);
WriteDrawing(NULL, pChartDrawing, pChartFile);
m_oBcw.WriteItemEnd(nCurPos);
m_pOfficeDrawingConverter->SetRelsPath(sOldRelsPath);
}
}
}
else
{
int nCurPos = m_oBcw.WriteItemStart(c_oSerRunType::pptxDrawing);
WriteDrawing(pXml, NULL, NULL);
m_oBcw.WriteItemEnd(nCurPos);
}
}
}
void WriteDrawing(CString* pXml, OOX::Logic::CDrawing* pDrawing, OOX::Spreadsheet::CChartSpace* pChart)
{
int nCurPos = 0;
bool bDeleteDrawing = false;
//pptxdata
if(NULL != pXml)
{
CString* bstrOutputXml = NULL;
m_oBcw.m_oStream.WriteBYTE(c_oSerImageType2::PptxData);
m_oBcw.m_oStream.WriteBYTE(c_oSerPropLenType::Variable);
nCurPos = m_oBcw.WriteItemWithLengthStart();
HRESULT hRes = m_pOfficeDrawingConverter->AddObject(*pXml, &bstrOutputXml);
m_oBcw.WriteItemWithLengthEnd(nCurPos);
if(S_OK == hRes && NULL != bstrOutputXml)
{
CString sBegin(_T("<root xmlns:wpc=\"http://schemas.microsoft.com/office/word/2010/wordprocessingCanvas\" xmlns:mc=\"http://schemas.openxmlformats.org/markup-compatibility/2006\" xmlns:o=\"urn:schemas-microsoft-com:office:office\" xmlns:r=\"http://schemas.openxmlformats.org/officeDocument/2006/relationships\" xmlns:m=\"http://schemas.openxmlformats.org/officeDocument/2006/math\" xmlns:v=\"urn:schemas-microsoft-com:vml\" xmlns:wp14=\"http://schemas.microsoft.com/office/word/2010/wordprocessingDrawing\" xmlns:wp=\"http://schemas.openxmlformats.org/drawingml/2006/wordprocessingDrawing\" xmlns:w10=\"urn:schemas-microsoft-com:office:word\" xmlns:w=\"http://schemas.openxmlformats.org/wordprocessingml/2006/main\" xmlns:w14=\"http://schemas.microsoft.com/office/word/2010/wordml\" xmlns:wpg=\"http://schemas.microsoft.com/office/word/2010/wordprocessingGroup\" xmlns:wpi=\"http://schemas.microsoft.com/office/word/2010/wordprocessingInk\" xmlns:wne=\"http://schemas.microsoft.com/office/word/2006/wordml\" xmlns:wps=\"http://schemas.microsoft.com/office/word/2010/wordprocessingShape\"><w:drawing>"));
CString sEnd(_T("</w:drawing></root>"));
CString sDrawingXml = sBegin + *bstrOutputXml + sEnd;
XmlUtils::CXmlLiteReader oReader;
if (oReader.FromString(sDrawingXml))
{
oReader.ReadNextNode();//root
oReader.ReadNextNode();//drawing
pDrawing = new OOX::Logic::CDrawing();
pDrawing->fromXML2(oReader, true);
}
bDeleteDrawing = true;
}
RELEASEOBJECT(bstrOutputXml);
}
//chart
if(NULL != pChart)
{
m_oBcw.m_oStream.WriteBYTE(c_oSerImageType2::Chart2);
m_oBcw.m_oStream.WriteBYTE(c_oSerPropLenType::Variable);
int nCurPos = m_oBcw.WriteItemWithLengthStart();
BinXlsxRW::BinaryChartWriter oBinaryChartWriter(m_oBcw.m_oStream, m_pOfficeDrawingConverter);
oBinaryChartWriter.WriteCT_ChartSpace(*pChart);
m_oBcw.WriteItemWithLengthEnd(nCurPos);
}
if(NULL != pDrawing)
{
OOX::Logic::CDrawing& img = *pDrawing;
if(img.m_oInline.IsInit())
{
const OOX::Drawing::CInline& pInline = img.m_oInline.get();
if(pInline.m_oExtent.IsInit())
{
//Type
m_oBcw.m_oStream.WriteBYTE(c_oSerImageType2::Type);
m_oBcw.m_oStream.WriteBYTE(c_oSerPropLenType::Byte);
m_oBcw.m_oStream.WriteBYTE(c_oAscWrapStyle::Inline);
//Extent
m_oBcw.m_oStream.WriteBYTE(c_oSerImageType2::Extent);
m_oBcw.m_oStream.WriteBYTE(c_oSerPropLenType::Variable);
nCurPos = m_oBcw.WriteItemWithLengthStart();
WriteExtent(pInline.m_oExtent.get());
m_oBcw.WriteItemWithLengthEnd(nCurPos);
//EffectExtent
if(pInline.m_oEffectExtent.IsInit())
{
m_oBcw.m_oStream.WriteBYTE(c_oSerImageType2::EffectExtent);
m_oBcw.m_oStream.WriteBYTE(c_oSerPropLenType::Variable);
nCurPos = m_oBcw.WriteItemWithLengthStart();
WriteEffectExtent(pInline.m_oEffectExtent.get());
m_oBcw.WriteItemWithLengthEnd(nCurPos);
}
if(pInline.m_oCNvGraphicFramePr.IsInit())
{
m_oBcw.m_oStream.WriteBYTE(c_oSerImageType2::GraphicFramePr);
m_oBcw.m_oStream.WriteBYTE(c_oSerPropLenType::Variable);
nCurPos = m_oBcw.WriteItemWithLengthStart();
WriteNvGraphicFramePr(pInline.m_oCNvGraphicFramePr.get());
m_oBcw.WriteItemWithLengthEnd(nCurPos);
}
}
}
else if(img.m_oAnchor.IsInit() )
{
const OOX::Drawing::CAnchor& pAnchor = img.m_oAnchor.get();
m_oBcw.m_oStream.WriteBYTE(c_oSerImageType2::Type);
m_oBcw.m_oStream.WriteBYTE(c_oSerPropLenType::Byte);
m_oBcw.m_oStream.WriteBYTE(c_oAscWrapStyle::Flow);
if(pAnchor.m_oAllowOverlap.IsInit())
{
m_oBcw.m_oStream.WriteBYTE(c_oSerImageType2::AllowOverlap);
m_oBcw.m_oStream.WriteBYTE(c_oSerPropLenType::Byte);
m_oBcw.m_oStream.WriteBOOL(pAnchor.m_oAllowOverlap->ToBool());
}
if(pAnchor.m_oBehindDoc.IsInit())
{
m_oBcw.m_oStream.WriteBYTE(c_oSerImageType2::BehindDoc);
m_oBcw.m_oStream.WriteBYTE(c_oSerPropLenType::Byte);
m_oBcw.m_oStream.WriteBOOL(pAnchor.m_oBehindDoc->ToBool());
}
if(pAnchor.m_oDistL.IsInit())
{
m_oBcw.m_oStream.WriteBYTE(c_oSerImageType2::DistL);
m_oBcw.m_oStream.WriteBYTE(c_oSerPropLenType::Double);
m_oBcw.m_oStream.WriteDouble(pAnchor.m_oDistL->ToMM());
}
if(pAnchor.m_oDistT.IsInit())
{
m_oBcw.m_oStream.WriteBYTE(c_oSerImageType2::DistT);
m_oBcw.m_oStream.WriteBYTE(c_oSerPropLenType::Double);
m_oBcw.m_oStream.WriteDouble(pAnchor.m_oDistT->ToMM());
}
if(pAnchor.m_oDistR.IsInit())
{
m_oBcw.m_oStream.WriteBYTE(c_oSerImageType2::DistR);
m_oBcw.m_oStream.WriteBYTE(c_oSerPropLenType::Double);
m_oBcw.m_oStream.WriteDouble(pAnchor.m_oDistR->ToMM());
}
if(pAnchor.m_oDistB.IsInit())
{
m_oBcw.m_oStream.WriteBYTE(c_oSerImageType2::DistB);
m_oBcw.m_oStream.WriteBYTE(c_oSerPropLenType::Double);
m_oBcw.m_oStream.WriteDouble(pAnchor.m_oDistB->ToMM());
}
if(pAnchor.m_oHidden.IsInit())
{
m_oBcw.m_oStream.WriteBYTE(c_oSerImageType2::Hidden);
m_oBcw.m_oStream.WriteBYTE(c_oSerPropLenType::Byte);
m_oBcw.m_oStream.WriteBOOL(pAnchor.m_oHidden->ToBool());
}
if(pAnchor.m_oLayoutInCell.IsInit())
{
m_oBcw.m_oStream.WriteBYTE(c_oSerImageType2::LayoutInCell);
m_oBcw.m_oStream.WriteBYTE(c_oSerPropLenType::Byte);
m_oBcw.m_oStream.WriteBOOL(pAnchor.m_oLayoutInCell->ToBool());
}
if(pAnchor.m_oLocked.IsInit())
{
m_oBcw.m_oStream.WriteBYTE(c_oSerImageType2::Locked);
m_oBcw.m_oStream.WriteBYTE(c_oSerPropLenType::Byte);
m_oBcw.m_oStream.WriteBOOL(pAnchor.m_oLocked->ToBool());
}
if(pAnchor.m_oRelativeHeight.IsInit())
{
m_oBcw.m_oStream.WriteBYTE(c_oSerImageType2::RelativeHeight);
m_oBcw.m_oStream.WriteBYTE(c_oSerPropLenType::Long);
m_oBcw.m_oStream.WriteLONG(pAnchor.m_oRelativeHeight->GetValue());
}
if(pAnchor.m_bSimplePos.IsInit())
{
m_oBcw.m_oStream.WriteBYTE(c_oSerImageType2::BSimplePos);
m_oBcw.m_oStream.WriteBYTE(c_oSerPropLenType::Byte);
m_oBcw.m_oStream.WriteBOOL(pAnchor.m_bSimplePos->ToBool());
}
if(pAnchor.m_oEffectExtent.IsInit())
{
m_oBcw.m_oStream.WriteBYTE(c_oSerImageType2::EffectExtent);
m_oBcw.m_oStream.WriteBYTE(c_oSerPropLenType::Variable);
nCurPos = m_oBcw.WriteItemWithLengthStart();
WriteEffectExtent(pAnchor.m_oEffectExtent.get());
m_oBcw.WriteItemWithLengthEnd(nCurPos);
}
if(pAnchor.m_oExtent.IsInit())
{
m_oBcw.m_oStream.WriteBYTE(c_oSerImageType2::Extent);
m_oBcw.m_oStream.WriteBYTE(c_oSerPropLenType::Variable);
nCurPos = m_oBcw.WriteItemWithLengthStart();
WriteExtent(pAnchor.m_oExtent.get());
m_oBcw.WriteItemWithLengthEnd(nCurPos);
}
if(pAnchor.m_oPositionH.IsInit())
{
m_oBcw.m_oStream.WriteBYTE(c_oSerImageType2::PositionH);
m_oBcw.m_oStream.WriteBYTE(c_oSerPropLenType::Variable);
nCurPos = m_oBcw.WriteItemWithLengthStart();
WritePositionH(pAnchor.m_oPositionH.get());
m_oBcw.WriteItemWithLengthEnd(nCurPos);
}
if(pAnchor.m_oPositionV.IsInit())
{
m_oBcw.m_oStream.WriteBYTE(c_oSerImageType2::PositionV);
m_oBcw.m_oStream.WriteBYTE(c_oSerPropLenType::Variable);
nCurPos = m_oBcw.WriteItemWithLengthStart();
WritePositionV(pAnchor.m_oPositionV.get());
m_oBcw.WriteItemWithLengthEnd(nCurPos);
}
if(pAnchor.m_oSimplePos.IsInit())
{
m_oBcw.m_oStream.WriteBYTE(c_oSerImageType2::SimplePos);
m_oBcw.m_oStream.WriteBYTE(c_oSerPropLenType::Variable);
nCurPos = m_oBcw.WriteItemWithLengthStart();
WriteSimplePos(pAnchor.m_oSimplePos.get());
m_oBcw.WriteItemWithLengthEnd(nCurPos);
}
if(pAnchor.m_oSizeRelH.IsInit())
{
m_oBcw.m_oStream.WriteBYTE(c_oSerImageType2::SizeRelH);
m_oBcw.m_oStream.WriteBYTE(c_oSerPropLenType::Variable);
nCurPos = m_oBcw.WriteItemWithLengthStart();
WriteSizeRelH(pAnchor.m_oSizeRelH.get());
m_oBcw.WriteItemWithLengthEnd(nCurPos);
}
if(pAnchor.m_oSizeRelV.IsInit())
{
m_oBcw.m_oStream.WriteBYTE(c_oSerImageType2::SizeRelV);
m_oBcw.m_oStream.WriteBYTE(c_oSerPropLenType::Variable);
nCurPos = m_oBcw.WriteItemWithLengthStart();
WriteSizeRelV(pAnchor.m_oSizeRelV.get());
m_oBcw.WriteItemWithLengthEnd(nCurPos);
}
if(pAnchor.m_oWrapNone.IsInit())
{
m_oBcw.m_oStream.WriteBYTE(c_oSerImageType2::WrapNone);
m_oBcw.m_oStream.WriteBYTE(c_oSerPropLenType::Null);
}
if(pAnchor.m_oWrapSquare.IsInit())
{
m_oBcw.m_oStream.WriteBYTE(c_oSerImageType2::WrapSquare);
m_oBcw.m_oStream.WriteBYTE(c_oSerPropLenType::Variable);
nCurPos = m_oBcw.WriteItemWithLengthStart();
WriteWrapSquare(pAnchor.m_oWrapSquare.get());
m_oBcw.WriteItemWithLengthEnd(nCurPos);
}
if(pAnchor.m_oWrapThrough.IsInit())
{
m_oBcw.m_oStream.WriteBYTE(c_oSerImageType2::WrapThrough);
m_oBcw.m_oStream.WriteBYTE(c_oSerPropLenType::Variable);
nCurPos = m_oBcw.WriteItemWithLengthStart();
WriteWrapThrough(pAnchor.m_oWrapThrough.get());
m_oBcw.WriteItemWithLengthEnd(nCurPos);
}
if(pAnchor.m_oWrapTight.IsInit())
{
m_oBcw.m_oStream.WriteBYTE(c_oSerImageType2::WrapTight);
m_oBcw.m_oStream.WriteBYTE(c_oSerPropLenType::Variable);
nCurPos = m_oBcw.WriteItemWithLengthStart();
WriteWrapTight(pAnchor.m_oWrapTight.get());
m_oBcw.WriteItemWithLengthEnd(nCurPos);
}
if(pAnchor.m_oWrapTopAndBottom.IsInit())
{
m_oBcw.m_oStream.WriteBYTE(c_oSerImageType2::WrapTopAndBottom);
m_oBcw.m_oStream.WriteBYTE(c_oSerPropLenType::Variable);
nCurPos = m_oBcw.WriteItemWithLengthStart();
WriteWrapTopBottom(pAnchor.m_oWrapTopAndBottom.get());
m_oBcw.WriteItemWithLengthEnd(nCurPos);
}
if(pAnchor.m_oCNvGraphicFramePr.IsInit())
{
m_oBcw.m_oStream.WriteBYTE(c_oSerImageType2::GraphicFramePr);
m_oBcw.m_oStream.WriteBYTE(c_oSerPropLenType::Variable);
nCurPos = m_oBcw.WriteItemWithLengthStart();
WriteNvGraphicFramePr(pAnchor.m_oCNvGraphicFramePr.get());
m_oBcw.WriteItemWithLengthEnd(nCurPos);
}
}
}
if(bDeleteDrawing)
RELEASEOBJECT(pDrawing);
}
void WriteNvGraphicFramePr(const OOX::Drawing::CNonVisualGraphicFrameProperties& oGraphicFramePr)
{
if(oGraphicFramePr.m_oGraphicFrameLocks.IsInit())
{
const OOX::Drawing::CGraphicalObjectFrameLocking& oLocks = oGraphicFramePr.m_oGraphicFrameLocks.get();
if(oLocks.m_oNoChangeAspect.IsInit())
{
m_oBcw.m_oStream.WriteBYTE(c_oSerGraphicFramePr::NoChangeAspect);
m_oBcw.m_oStream.WriteBYTE(c_oSerPropLenType::Byte);
m_oBcw.m_oStream.WriteBOOL(oLocks.m_oNoChangeAspect->ToBool());
}
if(oLocks.m_oNoDrilldown.IsInit())
{
m_oBcw.m_oStream.WriteBYTE(c_oSerGraphicFramePr::NoDrilldown);
m_oBcw.m_oStream.WriteBYTE(c_oSerPropLenType::Byte);
m_oBcw.m_oStream.WriteBOOL(oLocks.m_oNoDrilldown->ToBool());
}
if(oLocks.m_oNoGrp.IsInit())
{
m_oBcw.m_oStream.WriteBYTE(c_oSerGraphicFramePr::NoGrp);
m_oBcw.m_oStream.WriteBYTE(c_oSerPropLenType::Byte);
m_oBcw.m_oStream.WriteBOOL(oLocks.m_oNoGrp->ToBool());
}
if(oLocks.m_oNoMove.IsInit())
{
m_oBcw.m_oStream.WriteBYTE(c_oSerGraphicFramePr::NoMove);
m_oBcw.m_oStream.WriteBYTE(c_oSerPropLenType::Byte);
m_oBcw.m_oStream.WriteBOOL(oLocks.m_oNoMove->ToBool());
}
if(oLocks.m_oNoResize.IsInit())
{
m_oBcw.m_oStream.WriteBYTE(c_oSerGraphicFramePr::NoResize);
m_oBcw.m_oStream.WriteBYTE(c_oSerPropLenType::Byte);
m_oBcw.m_oStream.WriteBOOL(oLocks.m_oNoResize->ToBool());
}
if(oLocks.m_oNoSelect.IsInit())
{
m_oBcw.m_oStream.WriteBYTE(c_oSerGraphicFramePr::NoSelect);
m_oBcw.m_oStream.WriteBYTE(c_oSerPropLenType::Byte);
m_oBcw.m_oStream.WriteBOOL(oLocks.m_oNoSelect->ToBool());
}
}
}
void WriteEffectExtent(const OOX::Drawing::CEffectExtent& oEffectExtent)
{
m_oBcw.m_oStream.WriteBYTE(c_oSerEffectExtent::Left);
m_oBcw.m_oStream.WriteBYTE(c_oSerPropLenType::Double);
m_oBcw.m_oStream.WriteDouble(oEffectExtent.m_oL.ToMm());
m_oBcw.m_oStream.WriteBYTE(c_oSerEffectExtent::Top);
m_oBcw.m_oStream.WriteBYTE(c_oSerPropLenType::Double);
m_oBcw.m_oStream.WriteDouble(oEffectExtent.m_oT.ToMm());
m_oBcw.m_oStream.WriteBYTE(c_oSerEffectExtent::Right);
m_oBcw.m_oStream.WriteBYTE(c_oSerPropLenType::Double);
m_oBcw.m_oStream.WriteDouble(oEffectExtent.m_oR.ToMm());
m_oBcw.m_oStream.WriteBYTE(c_oSerEffectExtent::Bottom);
m_oBcw.m_oStream.WriteBYTE(c_oSerPropLenType::Double);
m_oBcw.m_oStream.WriteDouble(oEffectExtent.m_oB.ToMm());
}
void WriteExtent(const ComplexTypes::Drawing::CPositiveSize2D& oExtent)
{
m_oBcw.m_oStream.WriteBYTE(c_oSerExtent::Cx);
m_oBcw.m_oStream.WriteBYTE(c_oSerPropLenType::Double);
m_oBcw.m_oStream.WriteDouble(oExtent.m_oCx.ToMM());
m_oBcw.m_oStream.WriteBYTE(c_oSerExtent::Cy);
m_oBcw.m_oStream.WriteBYTE(c_oSerPropLenType::Double);
m_oBcw.m_oStream.WriteDouble(oExtent.m_oCy.ToMM());
}
void WritePositionH(const OOX::Drawing::CPosH& oPosH)
{
if(oPosH.m_oRelativeFrom.IsInit())
{
m_oBcw.m_oStream.WriteBYTE(c_oSerPosHV::RelativeFrom);
m_oBcw.m_oStream.WriteBYTE(c_oSerPropLenType::Byte);
m_oBcw.m_oStream.WriteBYTE((BYTE)oPosH.m_oRelativeFrom->GetValue());
}
if(oPosH.m_oAlign.IsInit())
{
m_oBcw.m_oStream.WriteBYTE(c_oSerPosHV::Align);
m_oBcw.m_oStream.WriteBYTE(c_oSerPropLenType::Byte);
m_oBcw.m_oStream.WriteBYTE((BYTE)oPosH.m_oAlign->GetValue());
}
if(oPosH.m_oPosOffset.IsInit())
{
m_oBcw.m_oStream.WriteBYTE(c_oSerPosHV::PosOffset);
m_oBcw.m_oStream.WriteBYTE(c_oSerPropLenType::Double);
m_oBcw.m_oStream.WriteDouble(oPosH.m_oPosOffset->ToMM());
}
if(oPosH.m_oPctOffset.IsInit())
{
m_oBcw.m_oStream.WriteBYTE(c_oSerPosHV::PctOffset);
m_oBcw.m_oStream.WriteBYTE(c_oSerPropLenType::Double);
m_oBcw.m_oStream.WriteDouble(oPosH.m_oPctOffset->GetValue());
}
}
void WritePositionV(const OOX::Drawing::CPosV& oPosV)
{
if(oPosV.m_oRelativeFrom.IsInit())
{
m_oBcw.m_oStream.WriteBYTE(c_oSerPosHV::RelativeFrom);
m_oBcw.m_oStream.WriteBYTE(c_oSerPropLenType::Byte);
m_oBcw.m_oStream.WriteBYTE((BYTE)oPosV.m_oRelativeFrom->GetValue());
}
if(oPosV.m_oAlign.IsInit())
{
m_oBcw.m_oStream.WriteBYTE(c_oSerPosHV::Align);
m_oBcw.m_oStream.WriteBYTE(c_oSerPropLenType::Byte);
m_oBcw.m_oStream.WriteBYTE((BYTE)oPosV.m_oAlign->GetValue());
}
if(oPosV.m_oPosOffset.IsInit())
{
m_oBcw.m_oStream.WriteBYTE(c_oSerPosHV::PosOffset);
m_oBcw.m_oStream.WriteBYTE(c_oSerPropLenType::Double);
m_oBcw.m_oStream.WriteDouble(oPosV.m_oPosOffset->ToMM());
}
if(oPosV.m_oPctOffset.IsInit())
{
m_oBcw.m_oStream.WriteBYTE(c_oSerPosHV::PctOffset);
m_oBcw.m_oStream.WriteBYTE(c_oSerPropLenType::Double);
m_oBcw.m_oStream.WriteDouble(oPosV.m_oPctOffset->GetValue());
}
}
void WriteSizeRelH(const OOX::Drawing::CSizeRelH& oSizeRelH)
{
if(oSizeRelH.m_oRelativeFrom.IsInit())
{
m_oBcw.m_oStream.WriteBYTE(c_oSerSizeRelHV::RelativeFrom);
m_oBcw.m_oStream.WriteBYTE(c_oSerPropLenType::Byte);
m_oBcw.m_oStream.WriteBYTE((BYTE)oSizeRelH.m_oRelativeFrom->GetValue());
}
if(oSizeRelH.m_oPctWidth.IsInit())
{
m_oBcw.m_oStream.WriteBYTE(c_oSerSizeRelHV::Pct);
m_oBcw.m_oStream.WriteBYTE(c_oSerPropLenType::Double);
m_oBcw.m_oStream.WriteDouble(oSizeRelH.m_oPctWidth->GetValue());
}
}
void WriteSizeRelV(const OOX::Drawing::CSizeRelV& oSizeRelV)
{
if(oSizeRelV.m_oRelativeFrom.IsInit())
{
m_oBcw.m_oStream.WriteBYTE(c_oSerSizeRelHV::RelativeFrom);
m_oBcw.m_oStream.WriteBYTE(c_oSerPropLenType::Byte);
m_oBcw.m_oStream.WriteBYTE((BYTE)oSizeRelV.m_oRelativeFrom->GetValue());
}
if(oSizeRelV.m_oPctHeight.IsInit())
{
m_oBcw.m_oStream.WriteBYTE(c_oSerSizeRelHV::Pct);
m_oBcw.m_oStream.WriteBYTE(c_oSerPropLenType::Double);
m_oBcw.m_oStream.WriteDouble(oSizeRelV.m_oPctHeight->GetValue());
}
}
void WriteSimplePos(const ComplexTypes::Drawing::CPoint2D& oSimplePos)
{
m_oBcw.m_oStream.WriteBYTE(c_oSerSimplePos::X);
m_oBcw.m_oStream.WriteBYTE(c_oSerPropLenType::Double);
m_oBcw.m_oStream.WriteDouble(oSimplePos.m_oX.ToMm());
m_oBcw.m_oStream.WriteBYTE(c_oSerSimplePos::Y);
m_oBcw.m_oStream.WriteBYTE(c_oSerPropLenType::Double);
m_oBcw.m_oStream.WriteDouble(oSimplePos.m_oY.ToMm());
}
void WriteWrapSquare(const OOX::Drawing::CWrapSquare& oWrapSquare)
{
int nCurPos = 0;
if(oWrapSquare.m_oDistL.IsInit())
{
m_oBcw.m_oStream.WriteBYTE(c_oSerWrapSquare::DistL);
m_oBcw.m_oStream.WriteBYTE(c_oSerPropLenType::Double);
m_oBcw.m_oStream.WriteDouble(oWrapSquare.m_oDistL->ToMM());
}
if(oWrapSquare.m_oDistT.IsInit())
{
m_oBcw.m_oStream.WriteBYTE(c_oSerWrapSquare::DistT);
m_oBcw.m_oStream.WriteBYTE(c_oSerPropLenType::Double);
m_oBcw.m_oStream.WriteDouble(oWrapSquare.m_oDistT->ToMM());
}
if(oWrapSquare.m_oDistR.IsInit())
{
m_oBcw.m_oStream.WriteBYTE(c_oSerWrapSquare::DistR);
m_oBcw.m_oStream.WriteBYTE(c_oSerPropLenType::Double);
m_oBcw.m_oStream.WriteDouble(oWrapSquare.m_oDistR->ToMM());
}
if(oWrapSquare.m_oDistB.IsInit())
{
m_oBcw.m_oStream.WriteBYTE(c_oSerWrapSquare::DistB);
m_oBcw.m_oStream.WriteBYTE(c_oSerPropLenType::Double);
m_oBcw.m_oStream.WriteDouble(oWrapSquare.m_oDistB->ToMM());
}
if(oWrapSquare.m_oWrapText.IsInit())
{
m_oBcw.m_oStream.WriteBYTE(c_oSerWrapSquare::WrapText);
m_oBcw.m_oStream.WriteBYTE(c_oSerPropLenType::Byte);
m_oBcw.m_oStream.WriteBYTE((BYTE)oWrapSquare.m_oWrapText->GetValue());
}
if(oWrapSquare.m_oEffectExtent.IsInit())
{
m_oBcw.m_oStream.WriteBYTE(c_oSerWrapSquare::EffectExtent);
m_oBcw.m_oStream.WriteBYTE(c_oSerPropLenType::Variable);
nCurPos = m_oBcw.WriteItemWithLengthStart();
WriteEffectExtent(oWrapSquare.m_oEffectExtent.get());
m_oBcw.WriteItemWithLengthEnd(nCurPos);
}
}
void WriteWrapThrough(const OOX::Drawing::CWrapThrough& oWrapThrough)
{
int nCurPos = 0;
if(oWrapThrough.m_oDistL.IsInit())
{
m_oBcw.m_oStream.WriteBYTE(c_oSerWrapThroughTight::DistL);
m_oBcw.m_oStream.WriteBYTE(c_oSerPropLenType::Double);
m_oBcw.m_oStream.WriteDouble(oWrapThrough.m_oDistL->ToMM());
}
if(oWrapThrough.m_oDistR.IsInit())
{
m_oBcw.m_oStream.WriteBYTE(c_oSerWrapThroughTight::DistR);
m_oBcw.m_oStream.WriteBYTE(c_oSerPropLenType::Double);
m_oBcw.m_oStream.WriteDouble(oWrapThrough.m_oDistR->ToMM());
}
if(oWrapThrough.m_oWrapText.IsInit())
{
m_oBcw.m_oStream.WriteBYTE(c_oSerWrapThroughTight::WrapText);
m_oBcw.m_oStream.WriteBYTE(c_oSerPropLenType::Byte);
m_oBcw.m_oStream.WriteBYTE((BYTE)oWrapThrough.m_oWrapText->GetValue());
}
if(oWrapThrough.m_oWrapPolygon.IsInit())
{
m_oBcw.m_oStream.WriteBYTE(c_oSerWrapThroughTight::WrapPolygon);
m_oBcw.m_oStream.WriteBYTE(c_oSerPropLenType::Variable);
nCurPos = m_oBcw.WriteItemWithLengthStart();
WriteWrapPolygon(oWrapThrough.m_oWrapPolygon.get());
m_oBcw.WriteItemWithLengthEnd(nCurPos);
}
}
void WriteWrapTight(const OOX::Drawing::CWrapTight& oWrapTight)
{
int nCurPos = 0;
if(oWrapTight.m_oDistL.IsInit())
{
m_oBcw.m_oStream.WriteBYTE(c_oSerWrapThroughTight::DistL);
m_oBcw.m_oStream.WriteBYTE(c_oSerPropLenType::Double);
m_oBcw.m_oStream.WriteDouble(oWrapTight.m_oDistL->ToMM());
}
if(oWrapTight.m_oDistR.IsInit())
{
m_oBcw.m_oStream.WriteBYTE(c_oSerWrapThroughTight::DistR);
m_oBcw.m_oStream.WriteBYTE(c_oSerPropLenType::Double);
m_oBcw.m_oStream.WriteDouble(oWrapTight.m_oDistR->ToMM());
}
if(oWrapTight.m_oWrapText.IsInit())
{
m_oBcw.m_oStream.WriteBYTE(c_oSerWrapThroughTight::WrapText);
m_oBcw.m_oStream.WriteBYTE(c_oSerPropLenType::Byte);
m_oBcw.m_oStream.WriteBYTE((BYTE)oWrapTight.m_oWrapText->GetValue());
}
if(oWrapTight.m_oWrapPolygon.IsInit())
{
m_oBcw.m_oStream.WriteBYTE(c_oSerWrapThroughTight::WrapPolygon);
m_oBcw.m_oStream.WriteBYTE(c_oSerPropLenType::Variable);
nCurPos = m_oBcw.WriteItemWithLengthStart();
WriteWrapPolygon(oWrapTight.m_oWrapPolygon.get());
m_oBcw.WriteItemWithLengthEnd(nCurPos);
}
}
void WriteWrapTopBottom(const OOX::Drawing::CWrapTopBottom& oWrapTopBottom)
{
int nCurPos = 0;
if(oWrapTopBottom.m_oDistT.IsInit())
{
m_oBcw.m_oStream.WriteBYTE(c_oSerWrapTopBottom::DistT);
m_oBcw.m_oStream.WriteBYTE(c_oSerPropLenType::Double);
m_oBcw.m_oStream.WriteDouble(oWrapTopBottom.m_oDistT->ToMM());
}
if(oWrapTopBottom.m_oDistB.IsInit())
{
m_oBcw.m_oStream.WriteBYTE(c_oSerWrapTopBottom::DistB);
m_oBcw.m_oStream.WriteBYTE(c_oSerPropLenType::Double);
m_oBcw.m_oStream.WriteDouble(oWrapTopBottom.m_oDistB->ToMM());
}
if(oWrapTopBottom.m_oEffectExtent.IsInit())
{
m_oBcw.m_oStream.WriteBYTE(c_oSerWrapTopBottom::EffectExtent);
m_oBcw.m_oStream.WriteBYTE(c_oSerPropLenType::Variable);
nCurPos = m_oBcw.WriteItemWithLengthStart();
WriteEffectExtent(oWrapTopBottom.m_oEffectExtent.get());
m_oBcw.WriteItemWithLengthEnd(nCurPos);
}
}
void WriteWrapPolygon(const OOX::Drawing::CWrapPath& oWrapPath)
{
int nCurPos = 0;
if(oWrapPath.m_oEdited.IsInit())
{
m_oBcw.m_oStream.WriteBYTE(c_oSerWrapPolygon::Edited);
m_oBcw.m_oStream.WriteBYTE(c_oSerPropLenType::Byte);
m_oBcw.m_oStream.WriteBOOL(oWrapPath.m_oEdited->ToBool());
}
if(oWrapPath.m_oStart.IsInit())
{
m_oBcw.m_oStream.WriteBYTE(c_oSerWrapPolygon::Start);
m_oBcw.m_oStream.WriteBYTE(c_oSerPropLenType::Variable);
nCurPos = m_oBcw.WriteItemWithLengthStart();
WritePoint2D(oWrapPath.m_oStart.get());
m_oBcw.WriteItemWithLengthEnd(nCurPos);
}
if(oWrapPath.m_arrLineTo.size() > 0)
{
m_oBcw.m_oStream.WriteBYTE(c_oSerWrapPolygon::ALineTo);
m_oBcw.m_oStream.WriteBYTE(c_oSerPropLenType::Variable);
nCurPos = m_oBcw.WriteItemWithLengthStart();
WriteLineTo(oWrapPath.m_arrLineTo);
m_oBcw.WriteItemWithLengthEnd(nCurPos);
}
}
void WriteLineTo(const std::vector<ComplexTypes::Drawing::CPoint2D*>& aLineTo)
{
int nCurPos = 0;
for(int i = 0, length = aLineTo.size(); i < length; ++i)
{
m_oBcw.m_oStream.WriteBYTE(c_oSerWrapPolygon::LineTo);
m_oBcw.m_oStream.WriteBYTE(c_oSerPropLenType::Variable);
nCurPos = m_oBcw.WriteItemWithLengthStart();
WritePoint2D(*aLineTo[i]);
m_oBcw.WriteItemWithLengthEnd(nCurPos);
}
}
void WritePoint2D(const ComplexTypes::Drawing::CPoint2D& oPoint2D)
{
int nCurPos = 0;
m_oBcw.m_oStream.WriteBYTE(c_oSerPoint2D::X);
m_oBcw.m_oStream.WriteBYTE(c_oSerPropLenType::Double);
m_oBcw.m_oStream.WriteDouble(oPoint2D.m_oX.ToMm());
m_oBcw.m_oStream.WriteBYTE(c_oSerPoint2D::Y);
m_oBcw.m_oStream.WriteBYTE(c_oSerPropLenType::Double);
m_oBcw.m_oStream.WriteDouble(oPoint2D.m_oY.ToMm());
}
void WriteDocTable(OOX::Logic::CTbl& tbl)
{
int nCurPos = 0;
//ищем tblPr
//tblPr должна идти раньше Content
int nRows = 0;
int nCols = 0;
OOX::Logic::CTableProperty* pTblPr = NULL;
//считаем количество строк и столбцов
GetTableSize(tbl.m_arrItems, nRows, nCols, &pTblPr);
if(nRows > 0 && nCols > 0)
{
//TblPr
if(NULL != pTblPr)
{
nCurPos = m_oBcw.WriteItemStart(c_oSerDocTableType::tblPr);
btblPrs.WriteTblPr(pTblPr);
m_oBcw.WriteItemEnd(nCurPos);
}
//tblGrid
if(tbl.m_oTblGrid.IsInit())
{
nCurPos = m_oBcw.WriteItemStart(c_oSerDocTableType::tblGrid);
WriteTblGrid(tbl.m_oTblGrid.get());
m_oBcw.WriteItemEnd(nCurPos);
}
//Content
nCurPos = m_oBcw.WriteItemStart(c_oSerDocTableType::Content);
WriteTableContent(tbl.m_arrItems, pTblPr, nRows, nCols);
m_oBcw.WriteItemEnd(nCurPos);
}
RELEASEOBJECT(pTblPr);
}
bool ValidateRow(const std::vector<OOX::WritingElement *>& arrItems)
{
//Проверяем чтобы не все ячейки в ряду были вертикально замержены
bool bRes = true;
for(int i = 0, length = arrItems.size(); i < length; ++i)
{
OOX::WritingElement* item = arrItems[i];
if(OOX::et_w_tc == item->getType())
{
OOX::Logic::CTc* tc = static_cast<OOX::Logic::CTc*>(item);
OOX::Logic::CTableCellProperties* pTcPr = tc->GetProperties();
bool bVMerge = false;
if(NULL != pTcPr)
{
if(pTcPr->m_oVMerge.IsInit() && pTcPr->m_oVMerge->m_oVal.IsInit() && SimpleTypes::mergeContinue == pTcPr->m_oVMerge->m_oVal->GetValue())
bVMerge = true;
}
if(false == bVMerge)
return true;
}
else if(OOX::et_w_sdt == item->getType())
{
OOX::Logic::CSdt* pStd = static_cast<OOX::Logic::CSdt*>(item);
if(pStd->m_oSdtContent.IsInit())
if(true == ValidateRow(pStd->m_oSdtContent.get().m_arrItems))
return true;
}
else if(OOX::et_w_smartTag == item->getType())
{
OOX::Logic::CSmartTag* pSmartTag = static_cast<OOX::Logic::CSmartTag*>(item);
if(true == ValidateRow(pSmartTag->m_arrItems))
return true;
}
else if(OOX::et_w_dir == item->getType())
{
OOX::Logic::CDir* pDir = static_cast<OOX::Logic::CDir*>(item);
if(true == ValidateRow(pDir->m_arrItems))
return true;
}
else if(OOX::et_w_bdo == item->getType())
{
OOX::Logic::CBdo* pBdo = static_cast<OOX::Logic::CBdo*>(item);
if(true == ValidateRow(pBdo->m_arrItems))
return true;
}
}
return false;
}
void GetTableSize(std::vector<OOX::WritingElement *>& rows, int& nRows, int& nCols, OOX::Logic::CTableProperty** ppTblPr)
{
for(int i = rows.size() - 1; i >= 0; i--)
{
OOX::WritingElement* item = rows[i];
if(OOX::et_w_tblPr == item->getType())
{
*ppTblPr = new OOX::Logic::CTableProperty();
**ppTblPr = *static_cast<OOX::Logic::CTableProperty*>(item);
}
else if(OOX::et_w_tr == item->getType())
{
OOX::Logic::CTr* pTr = static_cast<OOX::Logic::CTr*>(item);
if(ValidateRow(pTr->m_arrItems))
{
nRows++;
if(0 == nCols)
{
OOX::Logic::CTr* pTr = static_cast<OOX::Logic::CTr*>(item);
nCols = GetColsCount(pTr->m_arrItems);
}
}
else
{
//
rows.erase(rows.begin() + i);
}
}
else if(OOX::et_w_sdt == item->getType())
{
OOX::Logic::CSdt* pStd = static_cast<OOX::Logic::CSdt*>(item);
if(pStd->m_oSdtContent.IsInit())
GetTableSize(pStd->m_oSdtContent->m_arrItems, nRows, nCols, ppTblPr);
}
else if(OOX::et_w_smartTag == item->getType())
{
OOX::Logic::CSmartTag* pSmartTag = static_cast<OOX::Logic::CSmartTag*>(item);
GetTableSize(pSmartTag->m_arrItems, nRows, nCols, ppTblPr);
}
else if(OOX::et_w_dir == item->getType())
{
OOX::Logic::CDir* pDir = static_cast<OOX::Logic::CDir*>(item);
GetTableSize(pDir->m_arrItems, nRows, nCols, ppTblPr);
}
else if(OOX::et_w_bdo == item->getType())
{
OOX::Logic::CBdo* pBdo = static_cast<OOX::Logic::CBdo*>(item);
GetTableSize(pBdo->m_arrItems, nRows, nCols, ppTblPr);
}
}
}
int GetColsCount(const std::vector<OOX::WritingElement *>& arrItems)
{
int nColCount = 0;
for(int i = 0, length = arrItems.size(); i < length; ++i)
{
OOX::WritingElement* item = arrItems[i];
if(OOX::et_w_tc == item->getType())
{
nColCount++;
OOX::Logic::CTc* tc = static_cast<OOX::Logic::CTc*>(item);
for(int j = 0, length2 = tc->m_arrItems.size(); j < length2; ++j)
{
OOX::WritingElement* item2 = tc->m_arrItems[j];
if(OOX::et_w_tcPr == item2->getType())
{
OOX::Logic::CTableCellProperties* tcPr = static_cast<OOX::Logic::CTableCellProperties*>(item2);
if(tcPr->m_oGridSpan.IsInit() && tcPr->m_oGridSpan->m_oVal.IsInit())
{
int nGridSpan = tcPr->m_oGridSpan->m_oVal->GetValue();
if(nGridSpan > 0)
nColCount += nGridSpan;
}
}
}
}
else if(OOX::et_w_sdt == item->getType())
{
OOX::Logic::CSdt* pStd = static_cast<OOX::Logic::CSdt*>(item);
if(pStd->m_oSdtContent.IsInit())
nColCount += GetColsCount(pStd->m_oSdtContent.get().m_arrItems);
}
else if(OOX::et_w_smartTag == item->getType())
{
OOX::Logic::CSmartTag* pSmartTag = static_cast<OOX::Logic::CSmartTag*>(item);
nColCount += GetColsCount(pSmartTag->m_arrItems);
}
else if(OOX::et_w_dir == item->getType())
{
OOX::Logic::CDir* pDir = static_cast<OOX::Logic::CDir*>(item);
nColCount += GetColsCount(pDir->m_arrItems);
}
else if(OOX::et_w_bdo == item->getType())
{
OOX::Logic::CBdo* pBdo = static_cast<OOX::Logic::CBdo*>(item);
nColCount += GetColsCount(pBdo->m_arrItems);
}
}
return nColCount;
}
void WriteTblGrid(const OOX::Logic::CTblGrid& grid)
{
int nCurPos = 0;
for(int i = 0, length = grid.m_arrGridCol.size(); i < length; i++)
{
const ComplexTypes::Word::CTblGridCol& item = *grid.m_arrGridCol[i];
if(item.m_oW.IsInit())
{
m_oBcw.m_oStream.WriteBYTE(c_oSerDocTableType::tblGrid_Item);
m_oBcw.m_oStream.WriteBYTE(c_oSerPropLenType::Double);
m_oBcw.m_oStream.WriteDouble(item.m_oW->ToMm());
}
}
if(grid.m_oTblGridChange.IsInit())
{
m_oBcw.m_oStream.WriteBYTE(c_oSerDocTableType::tblGridChange);
m_oBcw.m_oStream.WriteBYTE(c_oSerPropLenType::Variable);
nCurPos = m_oBcw.WriteItemWithLengthStart();
WriteTblGridChange(grid.m_oTblGridChange.get());
m_oBcw.WriteItemWithLengthEnd(nCurPos);
}
}
void WriteTblGridChange(const OOX::Logic::CTblGridChange& tblGridChange)
{
int nCurPos = 0;
if(tblGridChange.m_oId.IsInit())
{
nCurPos = m_oBcw.WriteItemStart(c_oSerProp_RevisionType::Id);
m_oBcw.m_oStream.WriteLONG(tblGridChange.m_oId->GetValue());
m_oBcw.WriteItemWithLengthEnd(nCurPos);
}
if(NULL != tblGridChange.m_pTblGrid)
{
nCurPos = m_oBcw.WriteItemStart(c_oSerProp_RevisionType::tblGridChange);
WriteTblGrid(*tblGridChange.m_pTblGrid);
m_oBcw.WriteItemWithLengthEnd(nCurPos);
}
}
void WriteTableContent(std::vector<OOX::WritingElement *>& Content, OOX::Logic::CTableProperty* pTblPr, int nRows, int nCols)
{
int nCurPos = 0;
int nCurRowIndex = 0;
for(int i = 0, length = Content.size(); i < length; ++i)
{
OOX::WritingElement* item = Content[i];
if(OOX::et_w_tr == item->getType())
{
nCurPos = m_oBcw.WriteItemStart(c_oSerDocTableType::Row);
WriteRow(*static_cast<OOX::Logic::CTr*>(item), pTblPr, nCurRowIndex, nRows, nCols);
m_oBcw.WriteItemEnd(nCurPos);
nCurRowIndex++;
}
else if(OOX::et_w_sdt == item->getType())
{
OOX::Logic::CSdt* pStd = static_cast<OOX::Logic::CSdt*>(item);
if(pStd->m_oSdtContent.IsInit())
WriteTableContent(pStd->m_oSdtContent->m_arrItems, pTblPr, nRows, nCols);
}
else if(OOX::et_w_smartTag == item->getType())
{
OOX::Logic::CSmartTag* pSmartTag = static_cast<OOX::Logic::CSmartTag*>(item);
WriteTableContent(pSmartTag->m_arrItems, pTblPr, nRows, nCols);
}
else if(OOX::et_w_dir == item->getType())
{
OOX::Logic::CDir* pDir = static_cast<OOX::Logic::CDir*>(item);
WriteTableContent(pDir->m_arrItems, pTblPr, nRows, nCols);
}
else if(OOX::et_w_bdo == item->getType())
{
OOX::Logic::CBdo* pBdo = static_cast<OOX::Logic::CBdo*>(item);
WriteTableContent(pBdo->m_arrItems, pTblPr, nRows, nCols);
}
}
}
void WriteRow(const OOX::Logic::CTr& Row, OOX::Logic::CTableProperty* pTblPr, int nCurRowIndex, int nRows, int nCols)
{
int nCurPos = 0;
if(NULL != Row.m_oTableRowProperties)
{
nCurPos = m_oBcw.WriteItemStart(c_oSerDocTableType::Row_Pr);
btblPrs.WriteRowPr(*Row.m_oTableRowProperties);
m_oBcw.WriteItemEnd(nCurPos);
}
//Content
nCurPos = m_oBcw.WriteItemStart(c_oSerDocTableType::Row_Content);
WriteRowContent(Row.m_arrItems, pTblPr, nCurRowIndex, nRows, nCols);
m_oBcw.WriteItemEnd(nCurPos);
}
void WriteRowContent(const std::vector<OOX::WritingElement *>& Content, OOX::Logic::CTableProperty* pTblPr, int nCurRowIndex, int nRows, int nCols)
{
int nCurPos = 0;
int nCurColIndex = 0;
for(int i = 0, length = Content.size(); i < length; i++)
{
OOX::WritingElement* item = Content[i];
if(OOX::et_w_tc == item->getType())
{
OOX::Logic::CTc* tc = static_cast<OOX::Logic::CTc*>(item);
nCurPos = m_oBcw.WriteItemStart(c_oSerDocTableType::Cell);
WriteCell(*tc, pTblPr, nCurRowIndex, nCurColIndex, nRows, nCols);
m_oBcw.WriteItemEnd(nCurPos);
nCurColIndex++;
}
else if(OOX::et_w_sdt == item->getType())
{
OOX::Logic::CSdt* pStd = static_cast<OOX::Logic::CSdt*>(item);
if(pStd->m_oSdtContent.IsInit())
WriteRowContent(pStd->m_oSdtContent.get().m_arrItems, pTblPr, nCurRowIndex, nRows, nCols);
}
else if(OOX::et_w_smartTag == item->getType())
{
OOX::Logic::CSmartTag* pSmartTag = static_cast<OOX::Logic::CSmartTag*>(item);
WriteRowContent(pSmartTag->m_arrItems, pTblPr, nCurRowIndex, nRows, nCols);
}
else if(OOX::et_w_dir == item->getType())
{
OOX::Logic::CDir* pDir = static_cast<OOX::Logic::CDir*>(item);
WriteRowContent(pDir->m_arrItems, pTblPr, nCurRowIndex, nRows, nCols);
}
else if(OOX::et_w_bdo == item->getType())
{
OOX::Logic::CBdo* pBdo = static_cast<OOX::Logic::CBdo*>(item);
WriteRowContent(pBdo->m_arrItems, pTblPr, nCurRowIndex, nRows, nCols);
}
}
}
void WriteCell(OOX::Logic::CTc& tc, OOX::Logic::CTableProperty* pTblPr, int nCurRowIndex, int nCurColIndex, int nRows, int nCols)
{
int nCurPos = 0;
//св-ва ячейки
if(NULL != tc.m_oTableCellProperties)
{
nCurPos = m_oBcw.WriteItemStart(c_oSerDocTableType::Cell_Pr);
btblPrs.WriteCellPr(*tc.m_oTableCellProperties);
m_oBcw.WriteItemEnd(nCurPos);
}
//Content
BinaryDocumentTableWriter oBinaryDocumentTableWriter(m_oParamsWriter, m_oParamsDocumentWriter, m_mapIgnoreComments, bpPrs.m_oBinaryHeaderFooterTableWriter);
nCurPos = m_oBcw.WriteItemStart(c_oSerDocTableType::Cell_Content);
oBinaryDocumentTableWriter.WriteDocumentContent(tc.m_arrItems);
m_oBcw.WriteItemEnd(nCurPos);
}
};
class BinaryCommentsTableWriter
{
class CCommentWriteTemp
{
public:
OOX::CComment* pComment;
nullable<bool> bDone;
nullable<CString> sUserId;
std::vector<CCommentWriteTemp*> aReplies;
};
BinaryCommonWriter m_oBcw;
public:
BinaryCommentsTableWriter(ParamsWriter& oParamsWriter):m_oBcw(oParamsWriter)
{
};
void Write(OOX::CComments& oComments, OOX::CCommentsExt* pCommentsExt, OOX::CPeople* pPeople, std::map<int, bool>& mapIgnoreComments)
{
int nStart = m_oBcw.WriteItemWithLengthStart();
WriteCommentsContent(oComments, pCommentsExt, pPeople, mapIgnoreComments);
m_oBcw.WriteItemWithLengthEnd(nStart);
}
void WriteCommentsContent(OOX::CComments& oComments, OOX::CCommentsExt* pCommentsExt, OOX::CPeople* pPeople, std::map<int, bool>& mapIgnoreComments)
{
std::map<CString, CString> mapAuthorToUserId;
std::map<int, CCommentWriteTemp*> mapParaIdToComment;
std::map<int, bool> mapCommentsIgnore;
std::vector<CCommentWriteTemp*> aCommentsToWrite;
//map author -> userId
if(NULL != pPeople)
{
for(int i = 0, length = pPeople->m_arrPeoples.size(); i < length; i++)
{
OOX::CPerson* pPerson = pPeople->m_arrPeoples[i];
if(NULL != pPerson && pPerson->m_oAuthor.IsInit() && pPerson->m_oPresenceInfo.IsInit() && pPerson->m_oPresenceInfo->m_oProviderId.IsInit() && _T("Teamlab") == pPerson->m_oPresenceInfo->m_oProviderId.get2() && pPerson->m_oPresenceInfo->m_oUserId.IsInit())
mapAuthorToUserId[pPerson->m_oAuthor.get2()] = pPerson->m_oPresenceInfo->m_oUserId.get2();
}
}
//map paraId -> CCommentWriteTemp
for(int i = 0, length = oComments.m_arrComments.size(); i < length; ++i)
{
OOX::CComment* pComment = oComments.m_arrComments[i];
CCommentWriteTemp* pNewCommentWriteTemp = new CCommentWriteTemp();
pNewCommentWriteTemp->pComment = pComment;
if(pComment->m_oAuthor.IsInit())
{
std::map<CString, CString>::const_iterator pPair = mapAuthorToUserId.find(pComment->m_oAuthor.get2());
if(mapAuthorToUserId.end() != pPair)
pNewCommentWriteTemp->sUserId = pPair->second;
}
for(int j = 0, length2 = pComment->m_arrItems.size(); j < length2; j++)
{
OOX::WritingElement* pWe = pComment->m_arrItems[j];
if(OOX::et_w_p == pWe->getType())
{
OOX::Logic::CParagraph* pParagraph = static_cast<OOX::Logic::CParagraph*>(pWe);
if(pParagraph->m_oParaId.IsInit())
mapParaIdToComment[pParagraph->m_oParaId->GetValue()] = pNewCommentWriteTemp;
}
}
aCommentsToWrite.push_back(pNewCommentWriteTemp);
}
//разбираемся с reply и done
if(NULL != pCommentsExt)
{
for(int i = 0, length = pCommentsExt->m_arrComments.size(); i < length; i++)
{
OOX::CCommentExt* pCommentExt = pCommentsExt->m_arrComments[i];
if(pCommentExt->m_oParaId.IsInit())
{
std::map<int, CCommentWriteTemp*>::const_iterator pPair = mapParaIdToComment.find(pCommentExt->m_oParaId->GetValue());
if(mapParaIdToComment.end() != pPair)
{
CCommentWriteTemp* pCommentWriteTemp = pPair->second;
OOX::CComment* pComment = pCommentWriteTemp->pComment;
if(pCommentExt->m_oDone.IsInit())
pCommentWriteTemp->bDone = pCommentExt->m_oDone->ToBool();
if(pCommentExt->m_oParaIdParent.IsInit())
{
int nParaIdParent = pCommentExt->m_oParaIdParent->GetValue();
std::map<int, CCommentWriteTemp*>::const_iterator pPairParent = mapParaIdToComment.find(nParaIdParent);
if(mapParaIdToComment.end() != pPairParent)
{
CCommentWriteTemp* pCommentWriteTempParent = pPairParent->second;
pCommentWriteTempParent->aReplies.push_back(pCommentWriteTemp);
if(NULL != pComment && pComment->m_oId.IsInit())
mapIgnoreComments[pComment->m_oId->GetValue()] = true;
}
}
}
}
}
}
int nCurPos = 0;
for(int i = 0, length = aCommentsToWrite.size(); i < length; ++i)
{
CCommentWriteTemp* pCommentWriteTemp = aCommentsToWrite[i];
if(NULL != pCommentWriteTemp && NULL != pCommentWriteTemp->pComment && pCommentWriteTemp->pComment->m_oId.IsInit() && mapIgnoreComments.end() == mapIgnoreComments.find(pCommentWriteTemp->pComment->m_oId->GetValue()))
{
int nStart = m_oBcw.WriteItemStart(c_oSer_CommentsType::Comment);
WriteComment(*aCommentsToWrite[i]);
m_oBcw.WriteItemEnd(nStart);
}
}
for(int i = 0, length = aCommentsToWrite.size(); i < length; ++i)
delete aCommentsToWrite[i];
};
void WriteComment(CCommentWriteTemp& oComment)
{
int nCurPos = 0;
OOX::CComment* pComment = oComment.pComment;
if(NULL != pComment)
{
if(pComment->m_oAuthor.IsInit())
{
m_oBcw.m_oStream.WriteBYTE(c_oSer_CommentsType::UserName);
m_oBcw.m_oStream.WriteStringW(pComment->m_oAuthor.get2());
}
if(pComment->m_oDate.IsInit())
{
m_oBcw.m_oStream.WriteBYTE(c_oSer_CommentsType::Date);
m_oBcw.m_oStream.WriteStringW(pComment->m_oDate->ToString());
}
if(pComment->m_oId.IsInit())
{
nCurPos = m_oBcw.WriteItemStart(c_oSer_CommentsType::Id);
m_oBcw.m_oStream.WriteLONG(pComment->m_oId->GetValue());
m_oBcw.WriteItemEnd(nCurPos);
}
if(pComment->m_oInitials.IsInit())
{
m_oBcw.m_oStream.WriteBYTE(c_oSer_CommentsType::Initials);
m_oBcw.m_oStream.WriteStringW(pComment->m_oInitials.get2());
}
m_oBcw.m_oStream.WriteBYTE(c_oSer_CommentsType::Text);
m_oBcw.m_oStream.WriteStringW(pComment->getText());
if(oComment.sUserId.IsInit())
{
m_oBcw.m_oStream.WriteBYTE(c_oSer_CommentsType::UserId);
m_oBcw.m_oStream.WriteStringW(oComment.sUserId.get2());
}
if(oComment.bDone.IsInit())
{
nCurPos = m_oBcw.WriteItemStart(c_oSer_CommentsType::Solved);
m_oBcw.m_oStream.WriteBOOL(oComment.bDone.get2());
m_oBcw.WriteItemEnd(nCurPos);
}
if(oComment.aReplies.size() > 0)
{
nCurPos = m_oBcw.WriteItemStart(c_oSer_CommentsType::Replies);
WriteReplies(oComment.aReplies);
m_oBcw.WriteItemEnd(nCurPos);
}
}
};
void WriteReplies(std::vector<CCommentWriteTemp*>& aCommentWriteTemp)
{
int nCurPos = 0;
for(int i = 0, length = aCommentWriteTemp.size(); i < length; i++)
{
nCurPos = m_oBcw.WriteItemStart(c_oSer_CommentsType::Comment);
WriteComment(*aCommentWriteTemp[i]);
m_oBcw.WriteItemEnd(nCurPos);
}
}
};
class BinarySettingsTableWriter
{
BinaryCommonWriter m_oBcw;
Binary_pPrWriter bpPrs;
public:
BinarySettingsTableWriter(ParamsWriter& oParamsWriter):m_oBcw(oParamsWriter),bpPrs(oParamsWriter, NULL)
{
};
void Write(OOX::CSettings& oSettings)
{
int nStart = m_oBcw.WriteItemWithLengthStart();
WriteSettingsContent(oSettings);
m_oBcw.WriteItemWithLengthEnd(nStart);
}
void WriteSettingsContent(OOX::CSettings& oSettings)
{
int nCurPos = 0;
if(oSettings.m_oClrSchemeMapping.IsInit())
{
nCurPos = m_oBcw.WriteItemStart(c_oSer_SettingsType::ClrSchemeMapping);
WriteColorSchemeMapping(oSettings.m_oClrSchemeMapping.get());
m_oBcw.WriteItemEnd(nCurPos);
}
if(oSettings.m_oDefaultTabStop.IsInit() && oSettings.m_oDefaultTabStop->m_oVal.IsInit())
{
nCurPos = m_oBcw.WriteItemStart(c_oSer_SettingsType::DefaultTabStop);
m_oBcw.m_oStream.WriteDouble(oSettings.m_oDefaultTabStop->m_oVal->ToMm());
m_oBcw.WriteItemEnd(nCurPos);
}
if(oSettings.m_oMathPr.IsInit())
{
nCurPos = m_oBcw.WriteItemStart(c_oSer_SettingsType::MathPr);
WriteMathPr(oSettings.m_oMathPr.get());
m_oBcw.WriteItemEnd(nCurPos);
}
if(oSettings.m_oTrackRevisions.IsInit())
{
nCurPos = m_oBcw.WriteItemStart(c_oSer_SettingsType::TrackRevisions);
m_oBcw.m_oStream.WriteBOOL(oSettings.m_oTrackRevisions->m_oVal.ToBool());
m_oBcw.WriteItemEnd(nCurPos);
}
if(oSettings.m_oFootnotePr.IsInit())
{
nCurPos = m_oBcw.WriteItemStart(c_oSer_SettingsType::FootnotePr);
bpPrs.WriteNotePr(oSettings.m_oFootnotePr->m_oNumFmt, oSettings.m_oFootnotePr->m_oNumRestart, oSettings.m_oFootnotePr->m_oNumStart,
&oSettings.m_oFootnotePr->m_oPos, NULL, &oSettings.m_oFootnotePr->m_arrFootnote);
m_oBcw.WriteItemEnd(nCurPos);
}
if(oSettings.m_oEndnotePr.IsInit())
{
nCurPos = m_oBcw.WriteItemStart(c_oSer_SettingsType::EndnotePr);
bpPrs.WriteNotePr(oSettings.m_oEndnotePr->m_oNumFmt, oSettings.m_oEndnotePr->m_oNumRestart, oSettings.m_oEndnotePr->m_oNumStart,
NULL, &oSettings.m_oEndnotePr->m_oPos, &oSettings.m_oEndnotePr->m_arrEndnote);
m_oBcw.WriteItemEnd(nCurPos);
}
};
void WriteMathPr(const OOX::Logic::CMathPr &pMathPr)
{
for(int i = 0; i< pMathPr.m_arrItems.size(); ++i)
{
OOX::WritingElement* item = pMathPr.m_arrItems[i];
OOX::EElementType eType = item->getType();
switch(eType)
{
case OOX::et_m_brkBin:
{
OOX::Logic::CBrkBin* pBrkBin = static_cast<OOX::Logic::CBrkBin*>(item);
int nCurPos = m_oBcw.WriteItemStart(c_oSer_MathPrType::BrkBin);
if (pBrkBin->m_val.IsInit())
{
m_oBcw.m_oStream.WriteBYTE(c_oSer_OMathBottomNodesValType::Val);
m_oBcw.m_oStream.WriteBYTE(c_oSerPropLenType::Byte);
m_oBcw.m_oStream.WriteBYTE(pBrkBin->m_val->GetValue());
}
m_oBcw.WriteItemEnd(nCurPos);
break;
}
case OOX::et_m_brkBinSub:
{
OOX::Logic::CBrkBinSub* pBrkBinSub = static_cast<OOX::Logic::CBrkBinSub*>(item);
int nCurPos = m_oBcw.WriteItemStart(c_oSer_MathPrType::BrkBinSub);
if (pBrkBinSub->m_val.IsInit())
{
m_oBcw.m_oStream.WriteBYTE(c_oSer_OMathBottomNodesValType::Val);
m_oBcw.m_oStream.WriteBYTE(c_oSerPropLenType::Byte);
m_oBcw.m_oStream.WriteBYTE(pBrkBinSub->m_val->GetValue());
}
m_oBcw.WriteItemEnd(nCurPos);
break;
}
case OOX::et_m_defJc:
{
OOX::Logic::CDefJc* pDefJc = static_cast<OOX::Logic::CDefJc*>(item);
int nCurPos = m_oBcw.WriteItemStart(c_oSer_MathPrType::DefJc);
if (pDefJc->m_val.IsInit())
{
m_oBcw.m_oStream.WriteBYTE(c_oSer_OMathBottomNodesValType::Val);
m_oBcw.m_oStream.WriteBYTE(c_oSerPropLenType::Byte);
m_oBcw.m_oStream.WriteBYTE(pDefJc->m_val->GetValue());
}
m_oBcw.WriteItemEnd(nCurPos);
break;
}
case OOX::et_m_dispDef:
{
OOX::Logic::CDispDef* pDispDef = static_cast<OOX::Logic::CDispDef*>(item);
int nCurPos = m_oBcw.WriteItemStart(c_oSer_MathPrType::DispDef);
if (pDispDef->m_val.IsInit())
{
m_oBcw.m_oStream.WriteBYTE(c_oSer_OMathBottomNodesValType::Val);
m_oBcw.m_oStream.WriteBYTE(c_oSerPropLenType::Byte);
m_oBcw.m_oStream.WriteBOOL(pDispDef->m_val->GetValue());
}
m_oBcw.WriteItemEnd(nCurPos);
break;
}
case OOX::et_m_interSp:
{
OOX::Logic::CInterSp* pInterSp = static_cast<OOX::Logic::CInterSp*>(item);
int nCurPos = m_oBcw.WriteItemStart(c_oSer_MathPrType::InterSp);
if (pInterSp->m_val.IsInit())
{
m_oBcw.m_oStream.WriteBYTE(c_oSer_OMathBottomNodesValType::Val);
m_oBcw.m_oStream.WriteBYTE(c_oSerPropLenType::Double);
m_oBcw.m_oStream.WriteDouble(pInterSp->m_val->ToMm());
}
m_oBcw.WriteItemEnd(nCurPos);
break;
}
case OOX::et_m_intLim:
{
OOX::Logic::CIntLim* pIntLim = static_cast<OOX::Logic::CIntLim*>(item);
int nCurPos = m_oBcw.WriteItemStart(c_oSer_MathPrType::IntLim);
if (pIntLim->m_val.IsInit())
{
m_oBcw.m_oStream.WriteBYTE(c_oSer_OMathBottomNodesValType::Val);
m_oBcw.m_oStream.WriteBYTE(c_oSerPropLenType::Byte);
m_oBcw.m_oStream.WriteBYTE(pIntLim->m_val->GetValue());
}
m_oBcw.WriteItemEnd(nCurPos);
break;
}
case OOX::et_m_intraSp:
{
OOX::Logic::CIntraSp* pIntraSp = static_cast<OOX::Logic::CIntraSp*>(item);
int nCurPos = m_oBcw.WriteItemStart(c_oSer_MathPrType::IntraSp);
if (pIntraSp->m_val.IsInit())
{
m_oBcw.m_oStream.WriteBYTE(c_oSer_OMathBottomNodesValType::Val);
m_oBcw.m_oStream.WriteBYTE(c_oSerPropLenType::Double);
m_oBcw.m_oStream.WriteDouble(pIntraSp->m_val->ToMm());
}
m_oBcw.WriteItemEnd(nCurPos);
break;
}
case OOX::et_m_lMargin:
{
OOX::Logic::CLMargin* pLMargin = static_cast<OOX::Logic::CLMargin*>(item);
int nCurPos = m_oBcw.WriteItemStart(c_oSer_MathPrType::LMargin);
if (pLMargin->m_val.IsInit())
{
m_oBcw.m_oStream.WriteBYTE(c_oSer_OMathBottomNodesValType::Val);
m_oBcw.m_oStream.WriteBYTE(c_oSerPropLenType::Double);
m_oBcw.m_oStream.WriteDouble(pLMargin->m_val->ToMm());
}
m_oBcw.WriteItemEnd(nCurPos);
break;
}
case OOX::et_m_mathFont:
{
OOX::Logic::CMathFont* pMathFont = static_cast<OOX::Logic::CMathFont*>(item);
int nCurPos = m_oBcw.WriteItemStart(c_oSer_MathPrType::MathFont);
if (pMathFont->m_val.IsInit())
{
m_oBcw.m_oStream.WriteBYTE(c_oSer_OMathBottomNodesValType::Val);
m_oBcw.m_oStream.WriteBYTE(c_oSerPropLenType::Variable);
m_oBcw.m_oStream.WriteStringW(pMathFont->m_val.get2());
}
m_oBcw.WriteItemEnd(nCurPos);
break;
}
case OOX::et_m_naryLim:
{
OOX::Logic::CNaryLim* pNaryLim = static_cast<OOX::Logic::CNaryLim*>(item);
int nCurPos = m_oBcw.WriteItemStart(c_oSer_MathPrType::NaryLim);
if (pNaryLim->m_val.IsInit())
{
m_oBcw.m_oStream.WriteBYTE(c_oSer_OMathBottomNodesValType::Val);
m_oBcw.m_oStream.WriteBYTE(c_oSerPropLenType::Byte);
m_oBcw.m_oStream.WriteBYTE(pNaryLim->m_val->GetValue());
}
m_oBcw.WriteItemEnd(nCurPos);
break;
}
case OOX::et_m_postSp:
{
OOX::Logic::CPostSp* pPostSp = static_cast<OOX::Logic::CPostSp*>(item);
int nCurPos = m_oBcw.WriteItemStart(c_oSer_MathPrType::PostSp);
if (pPostSp->m_val.IsInit())
{
m_oBcw.m_oStream.WriteBYTE(c_oSer_OMathBottomNodesValType::Val);
m_oBcw.m_oStream.WriteBYTE(c_oSerPropLenType::Double);
m_oBcw.m_oStream.WriteDouble(pPostSp->m_val->ToMm());
}
m_oBcw.WriteItemEnd(nCurPos);
break;
}
case OOX::et_m_preSp:
{
OOX::Logic::CPreSp* pPreSp = static_cast<OOX::Logic::CPreSp*>(item);
int nCurPos = m_oBcw.WriteItemStart(c_oSer_MathPrType::PreSp);
if (pPreSp->m_val.IsInit())
{
m_oBcw.m_oStream.WriteBYTE(c_oSer_OMathBottomNodesValType::Val);
m_oBcw.m_oStream.WriteBYTE(c_oSerPropLenType::Double);
m_oBcw.m_oStream.WriteDouble(pPreSp->m_val->ToMm());
}
m_oBcw.WriteItemEnd(nCurPos);
break;
}
case OOX::et_m_rMargin:
{
OOX::Logic::CRMargin* pRMargin = static_cast<OOX::Logic::CRMargin*>(item);
int nCurPos = m_oBcw.WriteItemStart(c_oSer_MathPrType::RMargin);
if (pRMargin->m_val.IsInit())
{
m_oBcw.m_oStream.WriteBYTE(c_oSer_OMathBottomNodesValType::Val);
m_oBcw.m_oStream.WriteBYTE(c_oSerPropLenType::Double);
m_oBcw.m_oStream.WriteDouble(pRMargin->m_val->ToMm());
}
m_oBcw.WriteItemEnd(nCurPos);
break;
}
case OOX::et_m_smallFrac:
{
OOX::Logic::CSmallFrac* pSmallFrac = static_cast<OOX::Logic::CSmallFrac*>(item);
int nCurPos = m_oBcw.WriteItemStart(c_oSer_MathPrType::SmallFrac);
if (pSmallFrac->m_val.IsInit())
{
m_oBcw.m_oStream.WriteBYTE(c_oSer_OMathBottomNodesValType::Val);
m_oBcw.m_oStream.WriteBYTE(c_oSerPropLenType::Byte);
m_oBcw.m_oStream.WriteBOOL(pSmallFrac->m_val->GetValue());
}
m_oBcw.WriteItemEnd(nCurPos);
break;
}
case OOX::et_m_wrapIndent:
{
OOX::Logic::CWrapIndent* pWrapIndent = static_cast<OOX::Logic::CWrapIndent*>(item);
int nCurPos = m_oBcw.WriteItemStart(c_oSer_MathPrType::WrapIndent);
if (pWrapIndent->m_val.IsInit())
{
m_oBcw.m_oStream.WriteBYTE(c_oSer_OMathBottomNodesValType::Val);
m_oBcw.m_oStream.WriteBYTE(c_oSerPropLenType::Double);
m_oBcw.m_oStream.WriteDouble(pWrapIndent->m_val->ToMm());
}
m_oBcw.WriteItemEnd(nCurPos);
break;
}
case OOX::et_m_wrapRight:
{
OOX::Logic::CWrapRight* pWrapRight = static_cast<OOX::Logic::CWrapRight*>(item);
int nCurPos = m_oBcw.WriteItemStart(c_oSer_MathPrType::WrapRight);
if (pWrapRight->m_val.IsInit())
{
m_oBcw.m_oStream.WriteBYTE(c_oSer_OMathBottomNodesValType::Val);
m_oBcw.m_oStream.WriteBYTE(c_oSerPropLenType::Byte);
m_oBcw.m_oStream.WriteBOOL(pWrapRight->m_val->GetValue());
}
m_oBcw.WriteItemEnd(nCurPos);
break;
}
}
}
}
void WriteColorSchemeMapping(const OOX::Settings::CColorSchemeMapping& oColorSchemeMapping)
{
int nCurPos = 0;
if(oColorSchemeMapping.m_oAccent1.IsInit())
{
m_oBcw.m_oStream.WriteBYTE(c_oSer_ClrSchemeMappingType::Accent1);
m_oBcw.m_oStream.WriteBYTE(c_oSerPropLenType::Byte);
m_oBcw.m_oStream.WriteBYTE(oColorSchemeMapping.m_oAccent1->GetValue());
}
if(oColorSchemeMapping.m_oAccent2.IsInit())
{
m_oBcw.m_oStream.WriteBYTE(c_oSer_ClrSchemeMappingType::Accent2);
m_oBcw.m_oStream.WriteBYTE(c_oSerPropLenType::Byte);
m_oBcw.m_oStream.WriteBYTE(oColorSchemeMapping.m_oAccent2->GetValue());
}
if(oColorSchemeMapping.m_oAccent3.IsInit())
{
m_oBcw.m_oStream.WriteBYTE(c_oSer_ClrSchemeMappingType::Accent3);
m_oBcw.m_oStream.WriteBYTE(c_oSerPropLenType::Byte);
m_oBcw.m_oStream.WriteBYTE(oColorSchemeMapping.m_oAccent3->GetValue());
}
if(oColorSchemeMapping.m_oAccent4.IsInit())
{
m_oBcw.m_oStream.WriteBYTE(c_oSer_ClrSchemeMappingType::Accent4);
m_oBcw.m_oStream.WriteBYTE(c_oSerPropLenType::Byte);
m_oBcw.m_oStream.WriteBYTE(oColorSchemeMapping.m_oAccent4->GetValue());
}
if(oColorSchemeMapping.m_oAccent5.IsInit())
{
m_oBcw.m_oStream.WriteBYTE(c_oSer_ClrSchemeMappingType::Accent5);
m_oBcw.m_oStream.WriteBYTE(c_oSerPropLenType::Byte);
m_oBcw.m_oStream.WriteBYTE(oColorSchemeMapping.m_oAccent5->GetValue());
}
if(oColorSchemeMapping.m_oAccent6.IsInit())
{
m_oBcw.m_oStream.WriteBYTE(c_oSer_ClrSchemeMappingType::Accent6);
m_oBcw.m_oStream.WriteBYTE(c_oSerPropLenType::Byte);
m_oBcw.m_oStream.WriteBYTE(oColorSchemeMapping.m_oAccent6->GetValue());
}
if(oColorSchemeMapping.m_oBg1.IsInit())
{
m_oBcw.m_oStream.WriteBYTE(c_oSer_ClrSchemeMappingType::Bg1);
m_oBcw.m_oStream.WriteBYTE(c_oSerPropLenType::Byte);
m_oBcw.m_oStream.WriteBYTE(oColorSchemeMapping.m_oBg1->GetValue());
}
if(oColorSchemeMapping.m_oBg2.IsInit())
{
m_oBcw.m_oStream.WriteBYTE(c_oSer_ClrSchemeMappingType::Bg2);
m_oBcw.m_oStream.WriteBYTE(c_oSerPropLenType::Byte);
m_oBcw.m_oStream.WriteBYTE(oColorSchemeMapping.m_oBg2->GetValue());
}
if(oColorSchemeMapping.m_oFollowedHyperlink.IsInit())
{
m_oBcw.m_oStream.WriteBYTE(c_oSer_ClrSchemeMappingType::FollowedHyperlink);
m_oBcw.m_oStream.WriteBYTE(c_oSerPropLenType::Byte);
m_oBcw.m_oStream.WriteBYTE(oColorSchemeMapping.m_oFollowedHyperlink->GetValue());
}
if(oColorSchemeMapping.m_oHyperlink.IsInit())
{
m_oBcw.m_oStream.WriteBYTE(c_oSer_ClrSchemeMappingType::Hyperlink);
m_oBcw.m_oStream.WriteBYTE(c_oSerPropLenType::Byte);
m_oBcw.m_oStream.WriteBYTE(oColorSchemeMapping.m_oHyperlink->GetValue());
}
if(oColorSchemeMapping.m_oT1.IsInit())
{
m_oBcw.m_oStream.WriteBYTE(c_oSer_ClrSchemeMappingType::T1);
m_oBcw.m_oStream.WriteBYTE(c_oSerPropLenType::Byte);
m_oBcw.m_oStream.WriteBYTE(oColorSchemeMapping.m_oT1->GetValue());
}
if(oColorSchemeMapping.m_oT2.IsInit())
{
m_oBcw.m_oStream.WriteBYTE(c_oSer_ClrSchemeMappingType::T2);
m_oBcw.m_oStream.WriteBYTE(c_oSerPropLenType::Byte);
m_oBcw.m_oStream.WriteBYTE(oColorSchemeMapping.m_oT2->GetValue());
}
};
};
class BinaryNotesTableWriter
{
BinaryCommonWriter m_oBcw;
ParamsWriter& m_oParamsWriter;
NSBinPptxRW::CDrawingConverter* m_pOfficeDrawingConverter;
public:
BinaryNotesTableWriter(ParamsWriter& oParamsWriter):
m_oBcw(oParamsWriter),m_oParamsWriter(oParamsWriter),m_pOfficeDrawingConverter(oParamsWriter.m_pOfficeDrawingConverter)
{
}
void WriteFootnotes(OOX::CFootnotes& oFootnotes)
{
ParamsDocumentWriter oParamsDocumentWriter(&oFootnotes, oFootnotes.m_oReadPath.GetPath());
m_oParamsWriter.m_pCurRels = oParamsDocumentWriter.m_pRels;
m_oParamsWriter.m_sCurDocumentPath = oParamsDocumentWriter.m_sDocumentPath;
int nStart = m_oBcw.WriteItemWithLengthStart();
WriteNotes(oFootnotes.m_arrFootnote, oParamsDocumentWriter, oFootnotes.m_arrShapeTypes);
m_oBcw.WriteItemWithLengthEnd(nStart);
}
void WriteEndnotes(OOX::CEndnotes& oEndnotes)
{
ParamsDocumentWriter oParamsDocumentWriter(&oEndnotes, oEndnotes.m_oReadPath.GetPath());
m_oParamsWriter.m_pCurRels = oParamsDocumentWriter.m_pRels;
m_oParamsWriter.m_sCurDocumentPath = oParamsDocumentWriter.m_sDocumentPath;
int nStart = m_oBcw.WriteItemWithLengthStart();
WriteNotes(oEndnotes.m_arrEndnote, oParamsDocumentWriter, oEndnotes.m_arrShapeTypes);
m_oBcw.WriteItemWithLengthEnd(nStart);
}
void WriteNotes(const std::vector<OOX::CFtnEdn*>& arrNotes, ParamsDocumentWriter& oParamsDocumentWriter, std::vector<CString>& arrShapeTypes)
{
int nCurPos = 0;
for(size_t i = 0 ; i < arrNotes.size(); ++i)
{
nCurPos = m_oBcw.WriteItemStart(c_oSerNotes::Note);
WriteNote(*arrNotes[i], oParamsDocumentWriter, arrShapeTypes);
m_oBcw.WriteItemEnd(nCurPos);
}
}
void WriteNote(const OOX::CFtnEdn& oFtnEdn, ParamsDocumentWriter& oParamsDocumentWriter, std::vector<CString>& arrShapeTypes)
{
int nCurPos = 0;
if(oFtnEdn.m_oType.IsInit())
{
nCurPos = m_oBcw.WriteItemStart(c_oSerNotes::NoteType);
m_oBcw.m_oStream.WriteBYTE(oFtnEdn.m_oType->GetValue());
m_oBcw.WriteItemEnd(nCurPos);
}
if(oFtnEdn.m_oId.IsInit())
{
nCurPos = m_oBcw.WriteItemStart(c_oSerNotes::NoteId);
m_oBcw.m_oStream.WriteLONG(oFtnEdn.m_oId->GetValue());
m_oBcw.WriteItemEnd(nCurPos);
}
BinaryDocumentTableWriter oBinaryDocumentTableWriter(m_oParamsWriter, oParamsDocumentWriter, &m_oParamsWriter.m_mapIgnoreComments, NULL);
oBinaryDocumentTableWriter.prepareOfficeDrawingConverter(m_pOfficeDrawingConverter, oParamsDocumentWriter.m_sDocumentPath, arrShapeTypes);
nCurPos = m_oBcw.WriteItemStart(c_oSerNotes::NoteContent);
oBinaryDocumentTableWriter.WriteDocumentContent(oFtnEdn.m_arrItems);
m_oBcw.WriteItemEnd(nCurPos);
}
};
class BinaryFileWriter
{
BinaryCommonWriter m_oBcw;
int m_nLastFilePos;
int m_nRealTableCount;
int m_nMainTableStart;
public:
ParamsWriter& m_oParamsWriter;
public: BinaryFileWriter(ParamsWriter& oParamsWriter):m_oParamsWriter(oParamsWriter), m_oBcw(oParamsWriter)
{
m_nLastFilePos = 0;
m_nRealTableCount = 0;
}
static CString WriteFileHeader(long nDataSize)
{
CString sHeader;
sHeader.Format(_T("%ls;v%d;%d;"), g_sFormatSignature, g_nFormatVersion, nDataSize);
return sHeader;
}
void WriteMainTableStart()
{
int nTableCount = 128;//Специально ставим большое число, чтобы не увеличивать его при добавлении очередной таблицы.
m_nRealTableCount = 0;
m_nMainTableStart = m_oBcw.m_oStream.GetPosition();
//вычисляем с какой позиции можно писать таблицы
int nmtItemSize = 5;//5 byte
m_nLastFilePos = m_nMainTableStart + nTableCount * nmtItemSize;
//Write mtLen
m_oBcw.m_oStream.WriteBYTE(0);
//BinarySigTableWriter
int nCurPos = WriteTableStart(c_oSerTableTypes::Signature);
BinarySigTableWriter oBinarySigTableWriter(m_oParamsWriter);
oBinarySigTableWriter.Write();
WriteTableEnd(nCurPos);
}
void WriteMainTableEnd(BYTE* pThemeData, long& nThemeDataSize)
{
//OtherTable
int nCurPos = WriteTableStart(c_oSerTableTypes::Other);
BinaryOtherTableWriter oBinaryOtherTableWriter(m_oParamsWriter, pThemeData, nThemeDataSize);
oBinaryOtherTableWriter.Write();
WriteTableEnd(nCurPos);
//Количество таблиц
m_oBcw.m_oStream.SetPosition(m_nMainTableStart);
m_oBcw.m_oStream.WriteBYTE(m_nRealTableCount);
//Seek в конец
m_oBcw.m_oStream.SetPosition(m_nLastFilePos);
}
int WriteTableStart(BYTE type, int nStartPos = -1)
{
if(-1 != nStartPos)
m_oBcw.m_oStream.SetPosition(nStartPos);
//Write mtItem
//Write mtiType
m_oBcw.m_oStream.WriteBYTE(type);
//Write mtiOffBits
m_oBcw.m_oStream.WriteLONG(m_nLastFilePos);
//Write table
//Запоминаем позицию в MainTable
int nCurPos = m_oBcw.m_oStream.GetPosition();
//Seek в свободную область
m_oBcw.m_oStream.SetPosition(m_nLastFilePos);
return nCurPos;
}
void WriteTableEnd(int nCurPos)
{
//сдвигаем позицию куда можно следующую таблицу
m_nLastFilePos = m_oBcw.m_oStream.GetPosition();
m_nRealTableCount++;
//Seek вобратно в MainTable
m_oBcw.m_oStream.SetPosition(nCurPos);
}
void intoBindoc(const CString& sDir) {
NSBinPptxRW::CBinaryFileWriter& oBufferedStream = m_oBcw.m_oStream;
OOX::CDocx oDocx = OOX::CDocx(OOX::CPath(sDir));
m_oParamsWriter.m_poTheme = oDocx.GetTheme();
m_oParamsWriter.m_oSettings = oDocx.GetSettings();
OOX::CFontTable* pFontTable = oDocx.GetFontTable();
if(NULL != pFontTable)
m_oParamsWriter.m_pFontProcessor->setFontTable(pFontTable);
//ищем первый SectPr и расставляем pageBreak
OOX::CDocument* poDocument = oDocx.GetDocument();
if (poDocument == NULL) return;
OOX::Logic::CSectionProperty* pFirstSectPr = poDocument->m_oSectPr.GetPointer();
this->WriteMainTableStart();
int nCurPos = 0;
//важно в начале записать Theme и ClrMap, потому что они используются при дальнейшей записи для получения rgb цветов
BYTE* pThemeData = NULL;
long nThemeDataSize = 0;
if(NULL != m_oParamsWriter.m_poTheme)
m_oParamsWriter.m_pOfficeDrawingConverter->GetThemeBinary(&pThemeData, nThemeDataSize, m_oParamsWriter.m_poTheme->m_oReadPath.GetPath());
//Write Settings
OOX::CSettings* pSettings = oDocx.GetSettings();
if(NULL != pSettings)
{
BinDocxRW::BinarySettingsTableWriter oBinarySettingsTableWriter(m_oParamsWriter);
int nCurPos = this->WriteTableStart(BinDocxRW::c_oSerTableTypes::Settings);
oBinarySettingsTableWriter.Write(*pSettings);
this->WriteTableEnd(nCurPos);
}
//Write Comments
OOX::CComments* pComments = oDocx.GetComments();
OOX::CCommentsExt* pCommentsExt = oDocx.GetCommentsExt();
OOX::CPeople* pPeople = oDocx.GetPeople();
if(NULL != pComments)
{
BinDocxRW::BinaryCommentsTableWriter oBinaryCommentsTableWriter(m_oParamsWriter);
int nCurPos = this->WriteTableStart(BinDocxRW::c_oSerTableTypes::Comments);
oBinaryCommentsTableWriter.Write(*pComments, pCommentsExt, pPeople, m_oParamsWriter.m_mapIgnoreComments);
this->WriteTableEnd(nCurPos);
}
//Write StyleTable
OOX::CStyles* pStyles = oDocx.GetStyles();
BinDocxRW::BinaryStyleTableWriter oBinaryStyleTableWriter(m_oParamsWriter);
if(NULL != pStyles)
{
int nCurPos = this->WriteTableStart(BinDocxRW::c_oSerTableTypes::Style);
oBinaryStyleTableWriter.Write(*pStyles);
this->WriteTableEnd(nCurPos);
}
//Write Numbering
OOX::CNumbering* pNumbering = oDocx.GetNumbering();
BinDocxRW::BinaryNumberingTableWriter oBinaryNumberingTableWriter(m_oParamsWriter);
if(NULL != pNumbering)
{
nCurPos = this->WriteTableStart(BinDocxRW::c_oSerTableTypes::Numbering);
oBinaryNumberingTableWriter.Write(*pNumbering);
this->WriteTableEnd(nCurPos);
}
BinDocxRW::BinaryNotesTableWriter oBinaryNotesWriter(m_oParamsWriter);
//Write Footnotes
OOX::CFootnotes* pFootnotes = oDocx.GetFootnotes();
if(NULL != pFootnotes)
{
nCurPos = this->WriteTableStart(BinDocxRW::c_oSerTableTypes::Footnotes);
oBinaryNotesWriter.WriteFootnotes(*pFootnotes);
this->WriteTableEnd(nCurPos);
}
//Write Endnotes
OOX::CEndnotes* pEndnotes = oDocx.GetEndnotes();
if(NULL != pEndnotes)
{
nCurPos = this->WriteTableStart(BinDocxRW::c_oSerTableTypes::Endnotes);
oBinaryNotesWriter.WriteEndnotes(*pEndnotes);
this->WriteTableEnd(nCurPos);
}
BinDocxRW::BinaryHeaderFooterTableWriter oBinaryHeaderFooterTableWriter(m_oParamsWriter, poDocument, &m_oParamsWriter.m_mapIgnoreComments);
//Write DocumentTable
ParamsDocumentWriter oParamsDocumentWriter(poDocument, poDocument->m_oReadPath.GetPath());
m_oParamsWriter.m_pCurRels = oParamsDocumentWriter.m_pRels;
m_oParamsWriter.m_sCurDocumentPath = oParamsDocumentWriter.m_sDocumentPath;
//DocumentTable всегда пишем последней, чтобы сначала заполнить все вспомогательные структуры, а при заполении документа, вызывать методы типа Style_Add...
nCurPos = this->WriteTableStart(BinDocxRW::c_oSerTableTypes::Document);
BinDocxRW::BinaryDocumentTableWriter oBinaryDocumentTableWriter(m_oParamsWriter, oParamsDocumentWriter, &m_oParamsWriter.m_mapIgnoreComments, &oBinaryHeaderFooterTableWriter);
oBinaryDocumentTableWriter.prepareOfficeDrawingConverter(m_oParamsWriter.m_pOfficeDrawingConverter, oParamsDocumentWriter.m_sDocumentPath, poDocument->m_arrShapeTypes);
oBinaryDocumentTableWriter.pSectPr = pFirstSectPr;
oBinaryDocumentTableWriter.pBackground = poDocument->m_oBackground.GetPointer();
oBinaryDocumentTableWriter.m_bWriteSectPr = true;
// Write content
oBinaryDocumentTableWriter.Write(poDocument->m_arrItems);
this->WriteTableEnd(nCurPos);
nCurPos = this->WriteTableStart(BinDocxRW::c_oSerTableTypes::HdrFtr);
oBinaryHeaderFooterTableWriter.Write();
this->WriteTableEnd(nCurPos);
this->WriteMainTableEnd(pThemeData, nThemeDataSize);
RELEASEARRAYOBJECTS(pThemeData);
}
void ParagraphAddBreak(OOX::Logic::CParagraph* pParagraph)
{
if(NULL != pParagraph)
{
OOX::Logic::CParagraphProperty* pPr = NULL;
for(int i = 0, length = pParagraph->m_arrItems.size(); i < length; ++i)
{
OOX::WritingElement* we = pParagraph->m_arrItems[i];
if(OOX::et_w_pPr == we->getType())
{
pPr = static_cast<OOX::Logic::CParagraphProperty*>(we);
break;
}
}
if(NULL == pPr)
{
pPr = new OOX::Logic::CParagraphProperty();
if(pParagraph->m_arrItems.size() > 0)
pParagraph->m_arrItems.insert(pParagraph->m_arrItems.begin(), pPr);
else
pParagraph->m_arrItems.push_back(pPr);
}
pPr->m_oPageBreakBefore.Init();
pPr->m_oPageBreakBefore->m_oVal.FromBool(true);
}
}
};
}
#endif // #ifndef BIN_WRITERS