/* * (c) Copyright Ascensio System SIA 2010-2019 * * 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 20A-12 Ernesta Birznieka-Upisha * street, Riga, Latvia, EU, LV-1050. * * 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 * */ #pragma once #include "HeaderFooterWriter.h" #include "../../Common/DocxFormat/Source/XML/Utils.h" #include "../../Common/DocxFormat/Source/Common/SimpleTypes_Word.h" #include namespace BinDocxRW { class SectPr { public: std::wstring sHeaderFooterReference; long W; long H; BYTE cOrientation; long Left; long Top; long Right; long Bottom; long Header; long Footer; bool TitlePg; bool EvenAndOddHeaders; BYTE SectionType; int PageNumStart; std::wstring sectPrChange; std::wstring cols; std::wstring pgBorders; std::wstring footnotePr; std::wstring endnotePr; std::wstring lineNum; bool RtlGutter; long Gutter; bool bW; bool bH; bool bOrientation; bool bLeft; bool bTop; bool bRight; bool bBottom; bool bHeader; bool bFooter; bool bTitlePg; bool bEvenAndOddHeaders; bool bSectionType; bool bPageNumStart; bool bRtlGutter; bool bGutter; SectPr() { sHeaderFooterReference = _T(""); cols = _T(""); bW = false; bH = false; bOrientation = false; bLeft = false; bTop = false; bRight = false; bBottom = false; bHeader = false; bFooter = false; bTitlePg = false; bEvenAndOddHeaders = false; bSectionType = false; bPageNumStart = false; bRtlGutter = false; bGutter = false; } std::wstring Write() { std::wstring sRes = _T(""); if(!sHeaderFooterReference.empty()) sRes += sHeaderFooterReference; if(!footnotePr.empty()) sRes += footnotePr; if(!endnotePr.empty()) sRes += endnotePr; if(bSectionType) { std::wstring sType; switch(SectionType) { case 0: sType = _T("continuous");break; case 1: sType = _T("evenPage");break; case 2: sType = _T("nextColumn");break; case 3: sType = _T("nextPage");break; case 4: sType = _T("oddPage");break; default: sType = _T("nextPage");break; } sRes += L""; } if((bW && bH) || bOrientation) { sRes += L""; } if(bLeft || bTop || bRight || bBottom || bHeader || bFooter) { sRes += L""; } if(!pgBorders.empty()) sRes += pgBorders; if(!lineNum.empty()) sRes += lineNum; if(bPageNumStart) sRes += L""; if(bRtlGutter) { if(RtlGutter) sRes += L""; else sRes += L""; } if(!cols.empty()) sRes += cols; sRes += L""; if(bTitlePg && TitlePg) sRes += L""; if(!sectPrChange.empty()) sRes += sectPrChange; return sRes; } }; class docRGB { public: BYTE R; BYTE G; BYTE B; docRGB() { R = 255; G = 255; B = 255; } std::wstring ToString() { return XmlUtils::IntToString(R, L"%02X") + XmlUtils::IntToString(G, L"%02X") + XmlUtils::IntToString(B, L"%02X"); } }; class CThemeColor{ public: bool Auto; BYTE Color; BYTE Tint; BYTE Shade; bool bShade; bool bTint; bool bColor; CThemeColor(){ Reset(); } void Reset() { bShade = false; bTint = false; bColor = false; Auto = false; } bool IsNoEmpty() { return bShade || bTint || bColor || Auto; } std::wstring ToStringColor() { std::wstring sRes; if(bColor) { switch(Color) { case 0: sRes = _T("accent1");break; case 1: sRes = _T("accent2");break; case 2: sRes = _T("accent3");break; case 3: sRes = _T("accent4");break; case 4: sRes = _T("accent5");break; case 5: sRes = _T("accent6");break; case 6: sRes = _T("background1");break; case 7: sRes = _T("background2");break; case 8: sRes = _T("dark1");break; case 9: sRes = _T("dark2");break; case 10: sRes = _T("followedHyperlink");break; case 11: sRes = _T("hyperlink");break; case 12: sRes = _T("light1");break; case 13: sRes = _T("light2");break; case 14: sRes = _T("none");break; case 15: sRes = _T("text1");break; case 16: sRes = _T("text2");break; default : sRes = _T("none");break; } } return sRes; } std::wstring ToStringTint() { std::wstring sRes; if(bTint) { sRes = XmlUtils::IntToString(Tint, L"%02X"); } return sRes; } std::wstring ToStringShade() { std::wstring sRes; if(bShade) { sRes = XmlUtils::IntToString(Shade, L"%02X"); } return sRes; } void ToCThemeColor( nullable>& oColor, nullable>& oThemeColor, nullable>& oThemeTint, nullable>& oThemeShade) { if (Auto) { if(!oColor.IsInit()) oColor.Init(); oColor->SetValue(SimpleTypes::hexcolorAuto); } if (bColor) { oThemeColor.Init(); oThemeColor->SetValue((SimpleTypes::EThemeColor)Color); } if (bTint) { oThemeTint.Init(); oThemeTint->SetValue(Tint); } if (bShade) { oThemeShade.Init(); oThemeShade->SetValue(Shade); } } }; class Spacing { public: bool bLineRule; bool bLine; bool bLineTwips; bool bAfter; bool bBefore; bool bAfterAuto; bool bBeforeAuto; BYTE LineRule; double Line; long LineTwips; long After; long Before; bool AfterAuto; bool BeforeAuto; Spacing() { bLineRule = false; bLine = false; bLineTwips = false; bAfter = false; bBefore = false; bAfterAuto = false; bBeforeAuto = false; } }; class Background { public: docRGB Color; CThemeColor ThemeColor; std::wstring sObject; bool bColor; bool bThemeColor; Background() : bColor (false), bThemeColor(false) {} std::wstring Write() { std::wstring sBackground = L""; sBackground += sObject; sBackground += L""; return sBackground; } }; class Tab { public: SimpleTypes::CTabJc<> Val; long Pos; BYTE Leader; bool bLeader; Tab() { Pos = 0; bLeader = false; } }; class Tabs { public: std::vector m_aTabs; }; class rPr { private: boost::unordered_map& m_mapFonts; public: bool Bold; bool Italic; bool Underline; bool Strikeout; std::wstring FontAscii; std::wstring FontHAnsi; std::wstring FontAE; std::wstring FontCS; std::wstring FontAsciiTheme; std::wstring FontHAnsiTheme; std::wstring FontAETheme; std::wstring FontCSTheme; long FontSize; docRGB Color; BYTE VertAlign; docRGB HighLight; BYTE nHighLight; std::wstring Shd; std::wstring RStyle; long Spacing; bool DStrikeout; bool Caps; bool SmallCaps; long Position; BYTE FontHint; bool BoldCs; bool ItalicCs; long FontSizeCs; bool Cs; bool Rtl; std::wstring Lang; std::wstring LangBidi; std::wstring LangEA; CThemeColor ThemeColor; bool Vanish; std::wstring Outline; std::wstring Fill; std::wstring Del; std::wstring Ins; std::wstring MoveFrom; std::wstring MoveTo; std::wstring rPrChange; bool bBold; bool bItalic; bool bUnderline; bool bStrikeout; bool bFontAscii; bool bFontHAnsi; bool bFontAE; bool bFontCS; bool bFontSize; bool bColor; bool bVertAlign; bool bShd; bool bRStyle; bool bSpacing; bool bDStrikeout; bool bCaps; bool bSmallCaps; bool bPosition; bool bFontHint; bool bBoldCs; bool bItalicCs; bool bFontSizeCs; bool bCs; bool bRtl; bool bLang; bool bLangBidi; bool bLangEA; bool bThemeColor; bool bVanish; bool bSnapToGrid; long CompressText; bool bDoNotWriteNullProp; public: rPr(boost::unordered_map& mapFonts) : m_mapFonts(mapFonts) { Reset(); bDoNotWriteNullProp = false; } void Reset() { Bold = false; Italic = false; Underline = false; Strikeout = false; DStrikeout = false; Caps = false; SmallCaps = false; bBold = false; bItalic = false; bUnderline = false; bStrikeout = false; bFontAscii = false; bFontHAnsi = false; bFontAE = false; bFontCS = false; bFontSize = false; bColor = false; bVertAlign = false; bShd = false; bRStyle = false; bSpacing = false; bDStrikeout = false; bCaps = false; bSmallCaps = false; bPosition = false; bFontHint = false; bBoldCs = false; bItalicCs = false; bFontSizeCs = false; bCs = false; bRtl = false; bLang = false; bLangBidi = false; bLangEA = false; bThemeColor = false; ThemeColor.Reset(); bVanish = false; bSnapToGrid = true; nHighLight = 0; //not set Outline.clear(); Fill.clear(); Del.clear(); Ins.clear(); MoveFrom.clear(); MoveTo.clear(); rPrChange.clear(); FontAscii.clear(); FontHAnsi.clear(); FontAE.clear(); FontCS.clear(); FontAsciiTheme.clear(); FontHAnsiTheme.clear(); FontAETheme.clear(); FontCSTheme.clear(); Shd.clear(); RStyle.clear(); LangBidi.clear(); LangEA.clear(); CompressText = -1; //not set } bool IsNoEmpty() { return !bSnapToGrid || bBold || bItalic || bUnderline || bStrikeout || bFontAscii || bFontHAnsi || bFontAE || bFontCS || bFontSize || bColor || bVertAlign || nHighLight > 0 || bShd || bRStyle || bSpacing || bDStrikeout || bCaps || bSmallCaps || bPosition || bFontHint || bBoldCs || bItalicCs || bFontSizeCs || bCs || bRtl || bLang || bLangBidi || bLangEA || bThemeColor || bVanish || !Outline.empty() || !Fill.empty() || !Del.empty() || !Ins.empty() || !MoveFrom.empty() || !MoveTo.empty() || !rPrChange.empty() || !FontAsciiTheme.empty() || !FontHAnsiTheme.empty() || !FontAETheme.empty() || !FontCSTheme.empty(); } void Write(NSStringUtils::CStringBuilder* pCStringWriter) { pCStringWriter->WriteString(L""); if(bRStyle) { pCStringWriter->WriteString(L""); } if(bFontAscii || bFontHAnsi || bFontAE || bFontCS || bFontHint || !FontAsciiTheme.empty() || !FontHAnsiTheme.empty() || !FontAETheme.empty() || !FontCSTheme.empty()) { std::wstring sFont = _T(""); pCStringWriter->WriteString(sFont); } if (CompressText >= 0 && CompressText <= 600) { pCStringWriter->WriteString(L""); } if(bBold) { if(Bold) pCStringWriter->WriteString(L""); else if(false == bDoNotWriteNullProp) pCStringWriter->WriteString(L""); } if(bBoldCs) { if(BoldCs) pCStringWriter->WriteString(L""); else if(false == bDoNotWriteNullProp) pCStringWriter->WriteString(L""); } if(bItalic) { if(Italic) pCStringWriter->WriteString(L""); else if(false == bDoNotWriteNullProp) pCStringWriter->WriteString(L""); } if(bItalicCs) { if(ItalicCs) pCStringWriter->WriteString(L""); else if(false == bDoNotWriteNullProp) pCStringWriter->WriteString(L""); } if(bCaps) { if(Caps) pCStringWriter->WriteString(L""); else if(false == bDoNotWriteNullProp) pCStringWriter->WriteString(L""); } if(bSmallCaps) { if(SmallCaps) pCStringWriter->WriteString(L""); else if(false == bDoNotWriteNullProp) pCStringWriter->WriteString(L""); } if(bStrikeout) { if(Strikeout) pCStringWriter->WriteString(L""); else if(false == bDoNotWriteNullProp) pCStringWriter->WriteString(L""); } if(bDStrikeout) { if(DStrikeout) pCStringWriter->WriteString(L""); //else if(false == bDoNotWriteNullProp) // pCStringWriter->WriteString(L""); } if(bVanish) { if(Vanish) pCStringWriter->WriteString(L""); else if(false == bDoNotWriteNullProp) pCStringWriter->WriteString(L""); } if(bColor || (bThemeColor && ThemeColor.IsNoEmpty())) { std::wstring sColor(L""; pCStringWriter->WriteString(sColor); } if (!bSnapToGrid) { pCStringWriter->WriteString(L""); } if(bSpacing) { pCStringWriter->WriteString(L""); } if(bPosition) { std::wstring sPosition = L""; pCStringWriter->WriteString(sPosition); } if(bFontSize) { pCStringWriter->WriteString(L""); } if(bFontSizeCs) { //if(false == bFontSize) - Sample Doc.docx // pCStringWriter->WriteString(L""); pCStringWriter->WriteString(L""); } if(nHighLight > 0) { docRGB& H = HighLight; std::wstring sColor; if (nHighLight == 1) sColor = L"none"; else if(0x00 == H.R && 0x00 == H.G && 0x00 == H.B ) sColor = _T("black"); else if(0x00 == H.R && 0x00 == H.G && 0xFF == H.B ) sColor = _T("blue"); else if(0x00 == H.R && 0xFF == H.G && 0xFF == H.B ) sColor = _T("cyan"); else if(0x00 == H.R && 0x00 == H.G && 0x8B == H.B ) sColor = _T("darkBlue"); else if(0x00 == H.R && 0x8B == H.G && 0x8B == H.B ) sColor = _T("darkCyan"); else if(0xA9 == H.R && 0xA9 == H.G && 0xA9 == H.B ) sColor = _T("darkGray"); else if(0x00 == H.R && 0x64 == H.G && 0x00 == H.B ) sColor = _T("darkGreen"); else if(0x80 == H.R && 0x00 == H.G && 0x80 == H.B ) sColor = _T("darkMagenta"); else if(0x8B == H.R && 0x00 == H.G && 0x00 == H.B ) sColor = _T("darkRed"); else if(0x80 == H.R && 0x80 == H.G && 0x00 == H.B ) sColor = _T("darkYellow"); else if(0x00 == H.R && 0xFF == H.G && 0x00 == H.B ) sColor = _T("green"); else if(0xD3 == H.R && 0xD3 == H.G && 0xD3 == H.B ) sColor = _T("lightGray"); else if(0xFF == H.R && 0x00 == H.G && 0xFF == H.B ) sColor = _T("magenta"); else if(0xFF == H.R && 0x00 == H.G && 0x00 == H.B ) sColor = _T("red"); else if(0xFF == H.R && 0xFF == H.G && 0xFF == H.B ) sColor = _T("white"); else if(0xFF == H.R && 0xFF == H.G && 0x00 == H.B ) sColor = _T("yellow"); if(!sColor.empty()) { pCStringWriter->WriteString(L""); } else if(g_nCurFormatVersion < 5) { //добавляем как shading pCStringWriter->WriteString(L""); } } if(bUnderline) { if(Underline) pCStringWriter->WriteString(L""); else if(false == bDoNotWriteNullProp) pCStringWriter->WriteString(L""); } if(bShd) pCStringWriter->WriteString(Shd); if(bVertAlign) { switch(VertAlign) { case vertalign_Baseline: if(false == bDoNotWriteNullProp) pCStringWriter->WriteString(L"" ); break; case vertalign_SuperScript:pCStringWriter->WriteString(L"" );break; case vertalign_SubScript:pCStringWriter->WriteString(L"" );break; } } if(bRtl) { if(Rtl) pCStringWriter->WriteString(L""); else if(false == bDoNotWriteNullProp) pCStringWriter->WriteString(L""); } if(bCs) { if(Cs) pCStringWriter->WriteString(L""); else if(false == bDoNotWriteNullProp) pCStringWriter->WriteString(L""); } if(bLang || bLangBidi || bLangEA) { pCStringWriter->WriteString(L"WriteString(L" w:val=\"" + Lang + L"\""); } if(bLangBidi) { pCStringWriter->WriteString(L" w:bidi=\"" + LangBidi + L"\""); } if(bLangEA) { pCStringWriter->WriteString(L" w:eastAsia=\"" + LangEA + L"\""); } pCStringWriter->WriteString(L"/>"); } if (!Outline.empty()) pCStringWriter->WriteString(Outline); if (!Fill.empty()) pCStringWriter->WriteString(Fill); if (!Del.empty()) pCStringWriter->WriteString(Del); if (!Ins.empty()) pCStringWriter->WriteString(Ins); if (!MoveFrom.empty()) pCStringWriter->WriteString(MoveFrom); if (!MoveTo.empty()) pCStringWriter->WriteString(MoveTo); if (!rPrChange.empty()) pCStringWriter->WriteString(rPrChange); pCStringWriter->WriteString(L""); } }; class docStyle { public: std::wstring Name; std::wstring Id; BYTE byteType; bool Default; bool Custom; std::wstring Aliases; std::wstring BasedOn; std::wstring NextId; std::wstring Link; bool qFormat; long uiPriority; bool hidden; bool semiHidden; bool unhideWhenUsed; bool autoRedefine; bool locked; bool personal; bool personalCompose; bool personalReply; std::wstring TextPr; std::wstring ParaPr; std::wstring TablePr; std::wstring RowPr; std::wstring CellPr; std::vector TblStylePr; bool bDefault; bool bCustom; bool bqFormat; bool buiPriority; bool bhidden; bool bsemiHidden; bool bunhideWhenUsed; bool bautoRedefine; bool blocked; bool bpersonal; bool bpersonalCompose; bool bpersonalReply; public: docStyle() { byteType = styletype_Paragraph; bDefault = false; bCustom = false; bqFormat = false; buiPriority = false; bhidden = false; bsemiHidden = false; bunhideWhenUsed = false; bautoRedefine = false; blocked = false; bpersonal = false; bpersonalCompose = false; bpersonalReply = false; } void Write(NSStringUtils::CStringBuilder* pCStringWriter) { std::wstring sType; switch(byteType) { case styletype_Character: sType = _T("character");break; case styletype_Numbering: sType = _T("numbering");break; case styletype_Table: sType = _T("table");break; default: sType = _T("paragraph");break; } if(!Id.empty()) { std::wstring sStyle = L""; pCStringWriter->WriteString(sStyle); if(!Name.empty()) { pCStringWriter->WriteString(L""); } if (!Aliases.empty()) { pCStringWriter->WriteString(L"WriteEncodeXmlString(Aliases); pCStringWriter->WriteString(L"\"/>"); } if (!BasedOn.empty()) { pCStringWriter->WriteString(L""); } if (!NextId.empty()) { pCStringWriter->WriteString(L""); } if (!Link.empty()) { pCStringWriter->WriteString(L"WriteEncodeXmlString(Link); pCStringWriter->WriteString(L"\"/>"); } if(bautoRedefine) { if(autoRedefine) pCStringWriter->WriteString(L""); else pCStringWriter->WriteString(L""); } if (bhidden) { if (hidden) pCStringWriter->WriteString(L""); else pCStringWriter->WriteString(L""); } if (buiPriority) { pCStringWriter->WriteString(L""); } if (bsemiHidden) { if (semiHidden) pCStringWriter->WriteString(L""); else pCStringWriter->WriteString(L""); } if (bunhideWhenUsed) { if (unhideWhenUsed) pCStringWriter->WriteString(L""); else pCStringWriter->WriteString(L""); } if (bqFormat) { if (qFormat) pCStringWriter->WriteString(L""); else pCStringWriter->WriteString(L""); } if (blocked) { if (locked) pCStringWriter->WriteString(L""); else pCStringWriter->WriteString(L""); } if(bpersonal) { if(personal) pCStringWriter->WriteString(L""); else pCStringWriter->WriteString(L""); } if(bpersonalCompose) { if(personalCompose) pCStringWriter->WriteString(L""); else pCStringWriter->WriteString(L""); } if(bpersonalReply) { if(personalReply) pCStringWriter->WriteString(L""); else pCStringWriter->WriteString(L""); } if(!ParaPr.empty()) { pCStringWriter->WriteString(L""); pCStringWriter->WriteString(ParaPr); pCStringWriter->WriteString(L""); } if(!TextPr.empty()) { pCStringWriter->WriteString(TextPr); } if(!TablePr.empty()) pCStringWriter->WriteString(TablePr); if(!RowPr.empty()) { pCStringWriter->WriteString(L""); pCStringWriter->WriteString(RowPr); pCStringWriter->WriteString(L""); } if(!CellPr.empty()) { pCStringWriter->WriteString(L""); pCStringWriter->WriteString(CellPr); pCStringWriter->WriteString(L""); } for(int i = 0, length = (int)TblStylePr.size(); i < length; ++i) { pCStringWriter->WriteString(TblStylePr[i]); } pCStringWriter->WriteString(L""); } } }; class tblStylePr { public: NSStringUtils::CStringBuilder Writer; BYTE Type; bool bType; public: tblStylePr() { bType = false; } }; class PaddingsToWrite { public: long Left; long Top; long Right; long Bottom; bool bLeft; bool bTop; bool bRight; bool bBottom; public: PaddingsToWrite() { bLeft = false; bTop = false; bRight = false; bBottom = false; } }; class PaddingsToWriteMM { public: double Left; double Top; double Right; double Bottom; bool bLeft; bool bTop; bool bRight; bool bBottom; public: PaddingsToWriteMM() { bLeft = false; bTop = false; bRight = false; bBottom = false; } }; class docImg { public: long MediaId; BYTE Type; double X; double Y; double Width; double Height; PaddingsToWriteMM Paddings; int m_nDocPr; bool bMediaId; bool bType; bool bX; bool bY; bool bWidth; bool bHeight; bool bPaddings; std::wstring srId; docImg(int nDocPr) { m_nDocPr = nDocPr; bMediaId = false; bType = false; bX = false; bY = false; bWidth = false; bHeight = false; bPaddings = false; } void Write(NSStringUtils::CStringBuilder* pCStringWriter) { if(bType) { if(c_oAscWrapStyle::Inline == Type) { if(bWidth && bHeight) { __int64 nWidth = (__int64)(g_dKoef_mm_to_emu * Width); __int64 nHeight = (__int64)(g_dKoef_mm_to_emu * Height); std::wstring sDrawing = L""; pCStringWriter->WriteString(sDrawing); } } else if(c_oAscWrapStyle::Flow == Type) { if(bX && bY && bWidth && bHeight) { __int64 nX = (__int64)(g_dKoef_mm_to_emu * X); __int64 nY = (__int64)(g_dKoef_mm_to_emu * Y); __int64 nWidth = (__int64)(g_dKoef_mm_to_emu * Width); __int64 nHeight = (__int64)(g_dKoef_mm_to_emu * Height); unsigned long nPaddingLeft = 0; unsigned long nPaddingTop = 0; unsigned long nPaddingRight = 0; unsigned long nPaddingBottom = 0; if(bPaddings) { if(Paddings.bLeft) nPaddingLeft = (unsigned long)(g_dKoef_mm_to_emu * Paddings.Left); if(Paddings.bTop) nPaddingTop = (unsigned long)(g_dKoef_mm_to_emu * Paddings.Top); if(Paddings.bRight) nPaddingRight = (unsigned long)(g_dKoef_mm_to_emu * Paddings.Right); if(Paddings.bBottom) nPaddingBottom = (unsigned long)(g_dKoef_mm_to_emu * Paddings.Bottom); } std::wstring sDrawing = L"" + std::to_wstring(nX) + L"" + std::to_wstring(nY) + L"\ \ "; pCStringWriter->WriteString(sDrawing); } } } } }; //class tblPr //{ //public: // tblPr() // { // } // void Write(NSStringUtils::CStringBuilder* pCStringWriter) // { // } //}; class docW { public: BYTE Type; double W; long WDocx; bool bType; bool bW; bool bWDocx; docW() { bType = false; bW = false; bWDocx = false; } void Write(NSStringUtils::CStringBuilder& pCStringWriter, const std::wstring& sName) { pCStringWriter.WriteString(Write(sName)); } std::wstring Write(const std::wstring& sName) { std::wstring sXml; if(bW || (bType && bWDocx)) { std::wstring sType; int nVal; if(bW) { sType = _T("dxa"); nVal = SerializeCommon::Round( g_dKoef_mm_to_twips * W); } else { switch(Type) { case 0: sType = _T("auto"); break; case 1: sType = _T("dxa"); break; case 2: sType = _T("nil"); break; case 3: sType = _T("pct"); break; } nVal = WDocx; } sXml = L"<" + sName + L" w:w=\"" + std::to_wstring(nVal) + L"\" w:type=\"" + sType + L"\"/>"; } return sXml; } }; class docBorder { public: docRGB Color; long Space; long Size; BYTE Value; CThemeColor ThemeColor; bool bColor; bool bSpace; bool bSize; bool bValue; bool bThemeColor; docBorder() { bColor = false; bSpace = false; bSize = false; bValue = false; bThemeColor = false; } void Write(std::wstring sName, NSStringUtils::CStringBuilder* pCStringWriter, bool bCell) { if(bValue) { pCStringWriter->WriteString(L"<"); pCStringWriter->WriteString(sName); if(border_Single == Value) pCStringWriter->WriteString(L" w:val=\"single\""); else pCStringWriter->WriteString(L" w:val=\"none\""); if(bColor) { pCStringWriter->WriteString(L" w:color=\"" + Color.ToString() + L"\""); } if(bThemeColor && ThemeColor.IsNoEmpty()) { if(ThemeColor.Auto && !bColor) { std::wstring sAuto(L" w:color=\"auto\""); pCStringWriter->WriteString(sAuto); } if(ThemeColor.bColor) { pCStringWriter->WriteString(L" w:themeColor=\"" + ThemeColor.ToStringColor() + L"\""); } if(ThemeColor.bTint) { pCStringWriter->WriteString(L" w:themeTint=\"" + ThemeColor.ToStringTint() + L"\""); } if(ThemeColor.bShade) { pCStringWriter->WriteString(L" w:themeShade=\"" + ThemeColor.ToStringShade() + L"\""); } } if(bSize) { pCStringWriter->WriteString(L" w:sz=\"" + std::to_wstring(Size) + L"\""); } if(bSpace) { pCStringWriter->WriteString(L" w:space=\"" + std::to_wstring(Space) + L"\""); } pCStringWriter->WriteString(L"/>"); } else { pCStringWriter->WriteString(L"<"); pCStringWriter->WriteString(sName); if(false != bCell) pCStringWriter->WriteString(L" w:val=\"nil\""); else pCStringWriter->WriteString(L" w:val=\"none\" w:sz=\"0\" w:space=\"0\" w:color=\"auto\""); pCStringWriter->WriteString(L"/>"); } } }; class docBorders { public: docBorder oLeft; docBorder oTop; docBorder oRight; docBorder oBottom; docBorder oInsideV; docBorder oInsideH; docBorder oBetween; bool bLeft; bool bTop; bool bRight; bool bBottom; bool bInsideV; bool bInsideH; bool bBetween; public: docBorders() { bLeft = false; bTop = false; bRight = false; bBottom = false; bInsideV = false; bInsideH = false; bBetween = false; } bool IsEmpty() { return !(bLeft || bTop || bRight || bBottom || bInsideV || bInsideH || bBetween); } void Write(NSStringUtils::CStringBuilder* pCStringWriter, bool bCell) { if(bTop) oTop.Write(L"w:top", pCStringWriter, bCell); if(bLeft) oLeft.Write(L"w:left", pCStringWriter, bCell); if(bBottom) oBottom.Write(L"w:bottom", pCStringWriter, bCell); if(bRight) oRight.Write(L"w:right", pCStringWriter, bCell); if(bInsideH) oInsideH.Write(L"w:insideH", pCStringWriter, bCell); if(bInsideV) oInsideV.Write(L"w:insideV", pCStringWriter, bCell); if(bBetween) oBetween.Write(L"w:between", pCStringWriter, bCell); } }; class docLvlText { public: std::wstring Text; BYTE Number; bool bText; bool bNumber; docLvlText() { bText = false; bNumber = false; } }; class docLvl { public: long ILvl; long Format; std::wstring sFormat; BYTE Jc; std::wstring sJc; std::vector Text; long Restart; long Start; BYTE Suff; NSStringUtils::CStringBuilder ParaPr; NSStringUtils::CStringBuilder TextPr; std::wstring PStyle; bool Tentative; unsigned long Tplc; bool IsLgl; bool Legacy; long LegacyIndent; unsigned long LegacySpace; bool bILvl; bool bFormat; bool bJc; bool bText; bool bRestart; bool bStart; bool bSuff; bool bParaPr; bool bTextPr; bool bPStyle; bool bTentative; bool bTplc; bool bIsLgl; bool bLvlLegacy; bool bLegacy; bool bLegacyIndent; bool bLegacySpace; docLvl() { bILvl = false; bFormat = false; bJc = false; bText = false; bRestart = false; bStart = false; bSuff = false; bParaPr = false; bTextPr = false; bPStyle = false; bTentative = false; bTplc = false; bIsLgl = false; bLvlLegacy = false; bLegacy = false; bLegacyIndent = false; bLegacySpace = false; } ~docLvl() { for(int i = 0,length = (int)Text.size(); i < length; i++) { delete Text[i]; } } void Write(NSStringUtils::CStringBuilder& oWriter) { oWriter.WriteString(L""); if(bStart) { oWriter.WriteString(L""); } if(!sFormat.empty()) { oWriter.WriteString(sFormat); } else if(bFormat) { std::wstring sFormat; switch(Format) { case numbering_numfmt_None: sFormat = L"none"; break; case numbering_numfmt_Bullet: sFormat = L"bullet"; break; case numbering_numfmt_Decimal: sFormat = L"decimal"; break; case numbering_numfmt_LowerRoman: sFormat = L"lowerRoman"; break; case numbering_numfmt_UpperRoman: sFormat = L"upperRoman"; break; case numbering_numfmt_LowerLetter: sFormat = L"lowerLetter"; break; case numbering_numfmt_UpperLetter: sFormat = L"upperLetter"; break; case numbering_numfmt_DecimalZero: sFormat = L"decimalZero"; break; default: { Format -= 0x2008; if (Format >= 0) { SimpleTypes::CNumberFormat<> numFormat; numFormat.SetValue((SimpleTypes::ENumberFormat)Format); sFormat = numFormat.ToString(); } }break; } if(!sFormat.empty()) { oWriter.WriteString(L""); } } if(bRestart) { oWriter.WriteString(L""); } if(bPStyle) { std::wstring sStyleName = XmlUtils::EncodeXmlString(PStyle); oWriter.WriteString(L""); } if(bIsLgl) { if(IsLgl) oWriter.WriteString(L""); else oWriter.WriteString(L""); } if(bSuff) { std::wstring sSuff; switch(Suff) { case numbering_suff_Nothing: sSuff = _T("nothing");break; case numbering_suff_Space: sSuff = _T("space");break; default: sSuff = _T("tab");break; } oWriter.WriteString(L""); } if(bText) { std::wstring sText; for(int i = 0, length = (int)Text.size(); i < length; ++i) { docLvlText* item = Text[i]; if(item->bText) { sText += (item->Text); } else if(item->bNumber) { sText += L"%" + std::to_wstring(item->Number+1); } } sText = XmlUtils::EncodeXmlString(sText); //std::wstring sTextXml;sTextXml.Format(L"", sText); std::wstring sTextXml(L""); oWriter.WriteString(sTextXml); } if(bLvlLegacy) { oWriter.WriteString(L""); } if(!sJc.empty()) { oWriter.WriteString(sJc); } else if(bJc) { std::wstring sJcType; switch(Jc) { case align_Right:sJcType = _T("right");break; case align_Left:sJcType = _T("left");break; case align_Center:sJcType = _T("center");break; case align_Justify:sJcType = _T("distribute");break; } if(!sJcType.empty()) { oWriter.WriteString(L""); } } if(bParaPr) { oWriter.Write(ParaPr); } if(bTextPr) { oWriter.Write(TextPr); } oWriter.WriteString(L""); } }; class docLvlOverride { public: long ILvl; long StartOverride; docLvl* Lvl; bool bILvl; bool bStartOverride; docLvlOverride() { bILvl = false; bStartOverride = false; Lvl = NULL; } ~docLvlOverride() { RELEASEOBJECT(Lvl); } void Write(NSStringUtils::CStringBuilder& oWriter) { oWriter.WriteString(L""); if (bStartOverride) { oWriter.WriteString(L""); } if(NULL != Lvl) { Lvl->Write(oWriter); } oWriter.WriteString(L""); } }; class docANum { public: long Id; std::wstring NumStyleLink; std::wstring StyleLink; std::vector Lvls; bool bId; docANum() { bId = false; } ~docANum() { for(int i = 0, length = (int)Lvls.size(); i < length; i++) { delete Lvls[i]; } } void Write(NSStringUtils::CStringBuilder& oWriterANum) { if(bId) { oWriterANum.WriteString(L""); if(!StyleLink.empty()) { std::wstring sCorrectStyleLink = XmlUtils::EncodeXmlString(StyleLink); oWriterANum.WriteString(L""); } if(!NumStyleLink.empty()) { std::wstring sCorrectNumStyleLink = XmlUtils::EncodeXmlString(NumStyleLink); oWriterANum.WriteString(L""); } for(int i = 0, length = (int)Lvls.size(); i < length; ++i) { Lvls[i]->Write(oWriterANum); } oWriterANum.WriteString(L""); } } }; class docNum { public: long AId; long Id; std::vector LvlOverrides; bool bAId; bool bId; docNum() { bAId = false; bId = false; } ~docNum() { for(size_t i = 0; i < LvlOverrides.size(); ++i){ RELEASEOBJECT(LvlOverrides[i]); } } void Write(NSStringUtils::CStringBuilder& oWriterNumList) { if(bAId && bId) { oWriterNumList.WriteString(L""); for(size_t i = 0; i < LvlOverrides.size(); ++i){ LvlOverrides[i]->Write(oWriterNumList); } oWriterNumList.WriteString(L""); } } }; class rowPrAfterBefore { public: std::wstring sName; long nGridAfter; docW oAfterWidth; bool bGridAfter; rowPrAfterBefore(std::wstring name) { sName = name; bGridAfter = false; } void Write(NSStringUtils::CStringBuilder& writer) { if(bGridAfter && nGridAfter > 0) { writer.WriteString(L""); } if(oAfterWidth.bW) oAfterWidth.Write(writer, _T("w:w") + sName); } }; class WriteHyperlink { public: std::wstring rId; std::wstring href; std::wstring anchor; std::wstring tooltip; NSStringUtils::CStringBuilder writer; static WriteHyperlink* Parse(std::wstring fld) { WriteHyperlink* res = NULL; if(-1 != fld.find(L"HYPERLINK")) { std::wstring sLink; std::wstring sTooltip; bool bNextLink = false; bool bNextTooltip = false; //разбиваем по пробелам, но с учетом кавычек std::vector aItems; std::wstring sCurItem; bool bDQuot = false; for(int i = 0, length = (int)fld.length(); i < length; ++i) { wchar_t sCurLetter = fld[i]; if('\"' == sCurLetter) bDQuot = !bDQuot; else if('\\' == sCurLetter && true == bDQuot && i + 1 < length && '\"' == fld[i + 1]) { i++; sCurItem += fld[i]; } else if(' ' == sCurLetter && false == bDQuot) { if(sCurItem.length() > 0) { aItems.push_back(sCurItem); sCurItem = _T(""); } } else sCurItem += sCurLetter; } if(sCurItem.length() > 0) aItems.push_back(sCurItem); for(int i = 0, length = (int)aItems.size(); i < length; ++i) { std::wstring item = aItems[i]; if(bNextLink) { bNextLink = false; sLink = item; } if(bNextTooltip) { bNextTooltip = false; sTooltip = item; } if(L"HYPERLINK" == item) bNextLink = true; else if(L"\\o" == item) bNextTooltip = true; } if(false == sLink.empty()) { res = new WriteHyperlink(); boost::algorithm::trim(sLink); int nAnchorIndex = (int)sLink.find(L"#"); if(-1 != nAnchorIndex) { res->href = sLink.substr(0, nAnchorIndex); res->anchor = sLink.substr(nAnchorIndex); } else res->href = sLink; if(false == sTooltip.empty()) { res->tooltip = boost::algorithm::trim_copy(sTooltip); } } } return res; } void Write(NSStringUtils::CStringBuilder& wr) { if(false == rId.empty()) { std::wstring sCorrect_rId = XmlUtils::EncodeXmlString(rId); std::wstring sCorrect_tooltip = XmlUtils::EncodeXmlString(tooltip); std::wstring sCorrect_anchor = XmlUtils::EncodeXmlString(anchor); std::wstring sStart = L""; wr.WriteString(sStart); wr.Write(writer); wr.WriteString(L""); } } }; class IdCounter { private: int m_nId; public: IdCounter(int nStart = 0) { m_nId = nStart; } int getNextId(int nCount = 1) { int nRes = m_nId; m_nId += nCount; return nRes; } int getCurrentId() { return m_nId; } }; class CComment { private: IdCounter& m_oParaIdCounter; IdCounter& m_oFormatIdCounter; public: void *pBinary_DocumentTableReader; int IdOpen; int IdFormat; std::wstring UserName; std::wstring Initials; std::wstring UserId; std::wstring ProviderId; std::wstring Date; std::wstring OOData; std::wstring DateUtc; std::wstring UserData; bool Solved; unsigned int DurableId; std::wstring Text; std::wstring sContent; std::wstring sParaId; std::wstring sParaIdParent; std::vector replies; bool bIdOpen; bool bIdFormat; bool bSolved; bool bDurableId; public: CComment(IdCounter& oParaIdCounter, IdCounter& oFormatIdCounter):m_oParaIdCounter(oParaIdCounter),m_oFormatIdCounter(oFormatIdCounter) { bIdOpen = false; bIdFormat = false; bSolved = false; bDurableId = false; } ~CComment() { for(size_t i = 0; i bIdFormat = true; pComment->IdFormat = (int)(IdFormatStart + i + 1); } } std::wstring writeRef(const std::wstring& sBefore, const std::wstring& sRef, const std::wstring& sAfter) { std::wstring sRes; sRes += (writeRef(this, sBefore, sRef, sAfter)); for(size_t i = 0; i< replies.size(); ++i) { sRes += (writeRef(replies[i], sBefore, sRef, sAfter)); } return sRes; } static std::wstring writeRef(CComment* pComment, const std::wstring& sBefore, const std::wstring& sRef, const std::wstring& sAfter) { std::wstring sRes; if(!pComment->bIdFormat) { pComment->bIdFormat = true; pComment->IdFormat = pComment->m_oFormatIdCounter.getNextId(); } sRes += (sBefore); sRes += L"<" + sRef + L" w:id=\"" + std::to_wstring(pComment->IdFormat) + L"\"/>"; sRes += (sAfter); return sRes; } static void writeContentWritePart(CComment* pComment, std::wstring& sText, int nPrevIndex, int nCurIndex, std::wstring& sRes) { std::wstring sPart; if(nPrevIndex < nCurIndex) sPart = XmlUtils::EncodeXmlString(sText.substr(nPrevIndex, nCurIndex - nPrevIndex)); int nId = pComment->m_oParaIdCounter.getNextId(); pComment->sParaId = XmlUtils::IntToString(nId, L"%08X"); sRes += L"sParaId + L"\" w14:textId=\"" + pComment->sParaId + L"\">"; sRes += L""; sRes += sPart; sRes += L""; } static std::wstring writeContent(CComment* pComment) { std::wstring sRes; if(!pComment->bIdFormat) { pComment->bIdFormat = true; pComment->IdFormat = pComment->m_oFormatIdCounter.getNextId(); } sRes += L"IdFormat) + L"\""; if(false == pComment->UserName.empty()) { std::wstring sUserName = XmlUtils::EncodeXmlString(pComment->UserName); sRes += L" w:author=\""; sRes += (sUserName); sRes += L"\""; } if(false == pComment->Date.empty()) { std::wstring sDate = XmlUtils::EncodeXmlString(pComment->Date); sRes += L" w:date=\""; sRes += sDate; sRes += L"\""; } if(false == pComment->Initials.empty()) { sRes += L" w:initials=\""; sRes += XmlUtils::EncodeXmlString(pComment->Initials); sRes += L"\""; } sRes += L">"; if (false == pComment->sContent.empty()) { sRes += pComment->sContent; } else { //old comments std::wstring sText = pComment->Text; XmlUtils::replace_all(sText, L"\r", L""); int nPrevIndex = 0; for (int i = 0; i < (int)sText.length(); i++) { wchar_t cToken = sText[i]; if('\n' == cToken) { writeContentWritePart(pComment, sText, nPrevIndex, i, sRes); nPrevIndex = i + 1; } } writeContentWritePart(pComment, sText, nPrevIndex, (int)sText.length(), sRes); } sRes += L""; return sRes; } static std::wstring writeContentExt(CComment* pComment) { std::wstring sRes; if(false == pComment->sParaId.empty()) { std::wstring sDone(L"0"); if(pComment->bSolved && pComment->Solved) sDone = _T("1"); if(!pComment->sParaIdParent.empty()) sRes += L"sParaId + L"\" \ w15:paraIdParent=\"" + pComment->sParaIdParent + L"\" w15:done=\"" + sDone + L"\"/>"; else sRes += L"sParaId + L"\" w15:done=\"" + sDone + L"\"/>"; //расставляем paraIdParent for(size_t i = 0; i < pComment->replies.size(); i++) pComment->replies[i]->sParaIdParent = pComment->sParaId; } return sRes; } static std::wstring writeContentExtensible(CComment* pComment) { std::wstring sRes; if(pComment->bDurableId && !pComment->DateUtc.empty()) { sRes += L"DurableId, L"%08X") + L"\" w16cex:dateUtc=\"" + pComment->DateUtc + L"\"/>"; } return sRes; } static std::wstring writeContentUserData(CComment* pComment) { std::wstring sRes; if(pComment->bDurableId && !pComment->UserData.empty()) { sRes += L"DurableId, L"%08X") + L"\">"; sRes += L"UserData); sRes += L"\" providerId=\"AD\"/>"; } return sRes; } static std::wstring writeContentsIds(CComment* pComment) { std::wstring sRes; if(!pComment->sParaId.empty() && pComment->bDurableId) { sRes += L"sParaId + L"\" w16cid:durableId=\"" + XmlUtils::IntToString(pComment->DurableId, L"%08X") + L"\"/>"; } return sRes; } static std::wstring writePeople(CComment* pComment) { std::wstring sRes; if(false == pComment->UserName.empty()) { sRes += L"UserName); sRes += L"\">"; if(!pComment->ProviderId.empty() && !pComment->UserId.empty()) { sRes += L"ProviderId); sRes += L"\" w15:userId=\""; sRes += XmlUtils::EncodeXmlString(pComment->UserId); sRes += L"\"/>"; } sRes += L""; } return sRes; } }; class CComments { boost::unordered_map m_mapComments; boost::unordered_map m_mapAuthors; public: IdCounter m_oFormatIdCounter; IdCounter m_oParaIdCounter; CComments() : m_oParaIdCounter(1) { } ~CComments() { for (boost::unordered_map::const_iterator it = m_mapComments.begin(); it != m_mapComments.end(); ++it) { delete it->second; } m_mapComments.clear(); } void add(CComment* pComment) { if(pComment->bIdOpen) { m_mapComments[pComment->IdOpen] = pComment; addAuthor(pComment); for(size_t i = 0; i < pComment->replies.size(); i++) addAuthor(pComment->replies[i]); } } void addAuthor(CComment* pComment) { if(false == pComment->UserName.empty() && false == pComment->UserId.empty()) m_mapAuthors[pComment->UserName] = pComment; } CComment* get(int nInd) { CComment* pRes = NULL; boost::unordered_map::const_iterator pair = m_mapComments.find(nInd); if(m_mapComments.end() != pair) pRes = pair->second; return pRes; } int getNextId(int nCount = 1) { return m_oFormatIdCounter.getNextId(nCount); } std::wstring writeContent() { std::wstring sRes; for (boost::unordered_map::const_iterator it = m_mapComments.begin(); it != m_mapComments.end(); ++it) { sRes += CComment::writeContent(it->second); for(size_t i = 0; i < it->second->replies.size(); ++i) sRes += CComment::writeContent(it->second->replies[i]); } return sRes; } std::wstring writeContentExt() { std::wstring sRes; for (boost::unordered_map::const_iterator it = m_mapComments.begin(); it != m_mapComments.end(); ++it) { sRes += CComment::writeContentExt(it->second); for(size_t i = 0; i < it->second->replies.size(); ++i) sRes += CComment::writeContentExt(it->second->replies[i]); } return sRes; } std::wstring writeContentExtensible() { std::wstring sRes; for (boost::unordered_map::const_iterator it = m_mapComments.begin(); it != m_mapComments.end(); ++it) { sRes += CComment::writeContentExtensible(it->second); for(size_t i = 0; i < it->second->replies.size(); ++i) sRes += CComment::writeContentExtensible(it->second->replies[i]); } return sRes; } std::wstring writeContentUserData() { std::wstring sRes; for (boost::unordered_map::const_iterator it = m_mapComments.begin(); it != m_mapComments.end(); ++it) { sRes += CComment::writeContentUserData(it->second); for(size_t i = 0; i < it->second->replies.size(); ++i) sRes += CComment::writeContentUserData(it->second->replies[i]); } return sRes; } std::wstring writeContentsIds() { std::wstring sRes; for (boost::unordered_map::const_iterator it = m_mapComments.begin(); it != m_mapComments.end(); ++it) { sRes += CComment::writeContentsIds(it->second); for(size_t i = 0; i < it->second->replies.size(); ++i) sRes += CComment::writeContentsIds(it->second->replies[i]); } return sRes; } std::wstring writePeople() { std::wstring sRes; for (boost::unordered_map::const_iterator it = m_mapAuthors.begin(); it != m_mapAuthors.end(); ++it) { sRes += (it->second->writePeople(it->second)); } return sRes; } }; class CDrawingPropertyWrapPoint { public: __int64 X; __int64 Y; bool bX; bool bY; CDrawingPropertyWrapPoint() { bX = false; bY = false; } }; class CDrawingPropertyWrap { public: BYTE WrappingType; bool Edited; CDrawingPropertyWrapPoint Start; std::vector Points; bool bWrappingType; bool bEdited; bool bStart; CDrawingPropertyWrap() { bWrappingType = false; bEdited = false; bStart = false; } ~CDrawingPropertyWrap() { for(size_t i = 0; i < Points.size(); ++i) delete Points[i]; Points.clear(); } }; class CDrawingProperty { public: bool bObject; std::wstring sObjectProgram; unsigned int nObjectId; BYTE nObjectType; long DataPos; long DataLength; BYTE Type; bool BehindDoc; __int64 DistL; __int64 DistT; __int64 DistR; __int64 DistB; bool LayoutInCell; unsigned long RelativeHeight; bool BSimplePos; __int64 EffectExtentL; __int64 EffectExtentT; __int64 EffectExtentR; __int64 EffectExtentB; __int64 Width; __int64 Height; BYTE PositionHRelativeFrom; BYTE PositionHAlign; __int64 PositionHPosOffset; double PositionHPctOffset; BYTE PositionVRelativeFrom; BYTE PositionVAlign; __int64 PositionVPosOffset; double PositionVPctOffset; __int64 SimplePosX; __int64 SimplePosY; std::wstring sSizeRelH; std::wstring sSizeRelV; int m_nDocPr; std::wstring sGraphicFramePr; std::wstring sDocPr; std::wstring sGraphicFrameContent; CDrawingPropertyWrap DrawingPropertyWrap; bool bDataPos; bool bDataLength; bool bType; bool bBehindDoc; bool bDistL; bool bDistT; bool bDistR; bool bDistB; bool bLayoutInCell; bool bRelativeHeight; bool bBSimplePos; bool bEffectExtentL; bool bEffectExtentT; bool bEffectExtentR; bool bEffectExtentB; bool bWidth; bool bHeight; bool bPositionHRelativeFrom; bool bPositionHAlign; bool bPositionHPosOffset; bool bPositionHPctOffset; bool bPositionVRelativeFrom; bool bPositionVAlign; bool bPositionVPosOffset; bool bPositionVPctOffset; bool bSimplePosX; bool bSimplePosY; bool bDrawingPropertyWrap; CDrawingProperty(int nDocPr) { m_nDocPr = nDocPr; bObject = false; nObjectType = 0; nObjectId = 0; bDataPos = false; bDataLength = false; bType = false; bBehindDoc = false; bDistL = false; bDistT = false; bDistR = false; bDistB = false; bLayoutInCell = false; bRelativeHeight = false; bBSimplePos = false; bEffectExtentL = false; bEffectExtentT = false; bEffectExtentR = false; bEffectExtentB = false; bWidth = false; bHeight = false; bPositionHRelativeFrom = false; bPositionHAlign = false; bPositionHPosOffset = false; bPositionHPctOffset = false; bPositionVRelativeFrom = false; bPositionVAlign = false; bPositionVPosOffset = false; bPositionVPctOffset = false; bSimplePosX = false; bSimplePosY = false; bDrawingPropertyWrap = false; } bool IsGraphicFrameContent() { return false == sGraphicFrameContent.empty(); } std::wstring Write() { if(!bType) return L""; std::wstring sXml; bool bGraphicFrameContent = IsGraphicFrameContent(); if(c_oAscWrapStyle::Inline == Type) { if(bWidth && bHeight) { if (bGraphicFrameContent) { sXml += L"\ "; } else { sXml += L""; } if(bEffectExtentL && bEffectExtentT && bEffectExtentR && bEffectExtentB) { sXml += L""; } if(!sDocPr.empty()) { sXml += sDocPr; } else { sXml += L""; } if (!sGraphicFramePr.empty()) { sXml += sGraphicFramePr; } else { sXml += L""; } if (bGraphicFrameContent) { sXml += sGraphicFrameContent + L""; } else { sXml += L""; } } } else { if(bWidth && bHeight && ((bPositionHRelativeFrom && (bPositionHAlign || bPositionHPosOffset || bPositionHPctOffset) && bPositionVRelativeFrom && (bPositionVAlign || bPositionVPosOffset || bPositionVPctOffset)) || (bBSimplePos && bSimplePosX && bSimplePosY))) { __int64 emuDistL = 0; __int64 emuDistT = 0; __int64 emuDistR = 0; __int64 emuDistB = 0; if(bDistL) emuDistL = DistL; if(bDistT) emuDistT = DistT; if(bDistR) emuDistR = DistR; if(bDistB) emuDistB = DistB; int nSimplePos = 0; if(bBSimplePos && BSimplePos) nSimplePos = 1; unsigned long nRelativeHeight = 0; if(bRelativeHeight) nRelativeHeight = RelativeHeight; int nBehindDoc = 0; if(bBehindDoc && BehindDoc) nBehindDoc = 1; int nLayoutInCell = 1; if(bLayoutInCell && false == LayoutInCell) nLayoutInCell = 0; if (bGraphicFrameContent) { sXml += L""; } sXml += L""; __int64 emuX = 0; if(bSimplePosX) emuX = SimplePosX; __int64 emuY = 0; if(bSimplePosY) emuY = SimplePosY; sXml += L""; if (bPositionHRelativeFrom && (bPositionHAlign || bPositionHPosOffset || bPositionHPctOffset)) { std::wstring sRelativeFrom; switch(PositionHRelativeFrom) { case 0: sRelativeFrom = _T("character");break; case 1: sRelativeFrom = _T("column");break; case 2: sRelativeFrom = _T("insideMargin");break; case 3: sRelativeFrom = _T("leftMargin");break; case 4: sRelativeFrom = _T("margin");break; case 5: sRelativeFrom = _T("outsideMargin");break; case 6: sRelativeFrom = _T("page");break; case 7: sRelativeFrom = _T("rightMargin");break; } std::wstring sContent; if(bPositionHAlign) { switch(PositionHAlign) { case 0: sContent = _T("center"); break; case 1: sContent = _T("inside"); break; case 2: sContent = _T("left"); break; case 3: sContent = _T("outside"); break; case 4: sContent = _T("right"); break; } } else if(bPositionHPosOffset) { sContent = L"" + std::to_wstring(PositionHPosOffset) + L""; } else if(bPositionHPctOffset) { long pctOffset = (long)(1000 * PositionHPctOffset); sContent = L"" + std::to_wstring(pctOffset) + L""; } sXml += L"" + sContent + L""; } if (bPositionVRelativeFrom && (bPositionVAlign || bPositionVPosOffset || bPositionVPctOffset)) { std::wstring sRelativeFrom; switch(PositionVRelativeFrom) { case 0: sRelativeFrom = _T("bottomMargin");break; case 1: sRelativeFrom = _T("insideMargin");break; case 2: sRelativeFrom = _T("line");break; case 3: sRelativeFrom = _T("margin");break; case 4: sRelativeFrom = _T("outsideMargin");break; case 5: sRelativeFrom = _T("page");break; case 6: sRelativeFrom = _T("paragraph");break; case 7: sRelativeFrom = _T("topMargin");break; } std::wstring sContent; if (bPositionVAlign) { switch(PositionVAlign) { case 0: sContent = _T("bottom");break; case 1: sContent = _T("center");break; case 2: sContent = _T("inside");break; case 3: sContent = _T("outside");break; case 4: sContent = _T("top");break; } } else if(bPositionVPosOffset) { sContent = L"" + std::to_wstring(PositionVPosOffset) + L""; } else if(bPositionVPctOffset) { long pctOffset = (long)(1000 * PositionVPctOffset); sContent = L"" + std::to_wstring(pctOffset) + L""; } sXml += L"" + sContent + L""; } sXml += L""; if (bEffectExtentL && bEffectExtentT && bEffectExtentR && bEffectExtentB) { sXml += L""; } if (bDrawingPropertyWrap && DrawingPropertyWrap.bWrappingType) { std::wstring sTagName; switch(DrawingPropertyWrap.WrappingType) { case c_oSerImageType2::WrapNone:sTagName = _T("wrapNone"); break; case c_oSerImageType2::WrapSquare:sTagName = _T("wrapSquare"); break; case c_oSerImageType2::WrapThrough:sTagName = _T("wrapThrough"); break; case c_oSerImageType2::WrapTight:sTagName = _T("wrapTight"); break; case c_oSerImageType2::WrapTopAndBottom:sTagName = _T("wrapTopAndBottom"); break; } if(DrawingPropertyWrap.bStart || DrawingPropertyWrap.Points.size() > 0) { if( c_oSerImageType2::WrapSquare == DrawingPropertyWrap.WrappingType || c_oSerImageType2::WrapThrough == DrawingPropertyWrap.WrappingType || c_oSerImageType2::WrapTight == DrawingPropertyWrap.WrappingType) { sXml += L""; } else sXml += L""; int nEdited = 0; if(DrawingPropertyWrap.bEdited && DrawingPropertyWrap.Edited) nEdited = 1; sXml += L""; if(DrawingPropertyWrap.bStart && DrawingPropertyWrap.Start.bX && DrawingPropertyWrap.Start.bY) { sXml += L""; } for(size_t i = 0; i < DrawingPropertyWrap.Points.size(); ++i) { CDrawingPropertyWrapPoint* pWrapPoint = DrawingPropertyWrap.Points[i]; if(pWrapPoint->bX && pWrapPoint->bY) { sXml += L"X) + L"\" y=\"" + std::to_wstring(pWrapPoint->Y) + L"\"/>"; } } sXml += L""; sXml += L""; } else { //для wrapThrough и wrapTight wrapPolygon обязательное поле, если его нет - меняем тип. if( c_oSerImageType2::WrapSquare == DrawingPropertyWrap.WrappingType || c_oSerImageType2::WrapThrough == DrawingPropertyWrap.WrappingType || c_oSerImageType2::WrapTight == DrawingPropertyWrap.WrappingType) { sXml += L""; } else sXml += L""; } } else sXml += L""; if(!sDocPr.empty()) { sXml += sDocPr; } else { sXml += L""; } if(!sGraphicFramePr.empty()) { sXml += sGraphicFramePr; } else { sXml += L""; } if (bGraphicFrameContent) { sXml += sGraphicFrameContent; } if(!sSizeRelH.empty()) { sXml += sSizeRelH; } if(!sSizeRelV.empty()) { sXml += sSizeRelV; } sXml += L""; if (bGraphicFrameContent) sXml += L""; } } return sXml; } }; class CWiterTblPr { public: std::wstring Jc; std::wstring TableInd; std::wstring TableW; std::wstring TableCellMar; std::wstring TableBorders; std::wstring Shd; std::wstring tblpPr; std::wstring Style; std::wstring RowBandSize; std::wstring ColBandSize; std::wstring Look; std::wstring Layout; std::wstring tblPrChange; std::wstring TableCellSpacing; std::wstring Caption; std::wstring Description; std::wstring Overlap; bool IsEmpty() { return Jc.empty() && TableInd.empty() && TableW.empty() && TableCellMar.empty() && TableBorders.empty() && Shd.empty() && tblpPr.empty()&& Style.empty() && Look.empty() && tblPrChange.empty() && TableCellSpacing.empty() && RowBandSize.empty() && ColBandSize.empty(); } std::wstring Write() { std::wstring sRes; sRes += L""; if(false == Style.empty()) sRes += (Style); if(false == tblpPr.empty()) sRes += (tblpPr); if(!RowBandSize.empty()) sRes += (RowBandSize); if(!ColBandSize.empty()) sRes += (ColBandSize); if (!Overlap.empty()) sRes += (Overlap); if(false == TableW.empty()) sRes += (TableW); if(false == Jc.empty()) sRes += (Jc); if(false == TableCellSpacing.empty()) sRes += (TableCellSpacing); if(false == TableInd.empty()) sRes += (TableInd); if(false == TableBorders.empty()) sRes += (TableBorders); if(false == Shd.empty()) sRes += (Shd); if(false == Layout.empty()) sRes += (Layout); if(false == TableCellMar.empty()) sRes += (TableCellMar); if(false == Look.empty()) sRes += (Look); if(!Caption.empty()) { sRes += L""; } if(!Description.empty()) { sRes += L""; } if(!tblPrChange.empty()) sRes += (tblPrChange); sRes += L""; return sRes; } }; class CFramePr { public: bool bDropCap; bool bH; bool bHAnchor; bool bHRule; bool bHSpace; bool bLines; bool bVAnchor; bool bVSpace; bool bW; bool bWrap; bool bX; bool bXAlign; bool bY; bool bYAlign; BYTE DropCap; long H; BYTE HAnchor; BYTE HRule; long HSpace; long Lines; BYTE VAnchor; long VSpace; long W; BYTE Wrap; long X; BYTE XAlign; long Y; BYTE YAlign; public: CFramePr() { bDropCap = false; bH = false; bHAnchor = false; bHRule = false; bHSpace = false; bLines = false; bVAnchor = false; bVSpace = false; bW = false; bWrap = false; bX = false; bXAlign = false; bY = false; bYAlign = false; } bool IsEmpty() { return !(bDropCap || bH || bHAnchor || bHRule || bHSpace || bLines || bVAnchor || bVSpace || bW || bWrap || bX || bXAlign || bY || bYAlign); } void Write(NSStringUtils::CStringBuilder& oStringWriter) { oStringWriter.WriteString(L""); } }; class CHyperlink{ public: std::wstring rId; std::wstring sLink; std::wstring sAnchor; std::wstring sTooltip; bool History; std::wstring sDocLocation; std::wstring sTgtFrame; NSStringUtils::CStringBuilder writer; bool bHistory; public: CHyperlink() { bHistory = false; } void Write(NSStringUtils::CStringBuilder& wr) { wr.WriteString(L""); wr.Write(writer); wr.WriteString(L""); } }; class CFldSimple{ public: std::wstring sInstr; NSStringUtils::CStringBuilder writer; public: CFldSimple() { } void Write(NSStringUtils::CStringBuilder& wr) { if(false == sInstr.empty()) { std::wstring sCorrect_Instr = XmlUtils::EncodeXmlString(sInstr); std::wstring sStart(L""; wr.WriteString(sStart); wr.Write(writer); wr.WriteString(L""); } } }; class TrackRevision { public: std::wstring Author; std::wstring Date; long* Id; std::wstring UserId; long* vMerge; long* vMergeOrigin; rPr* RPr; NSStringUtils::CStringBuilder* PPr; SectPr* sectPr; CWiterTblPr* tblPr; NSStringUtils::CStringBuilder* tblGridChange; NSStringUtils::CStringBuilder* trPr; NSStringUtils::CStringBuilder* tcPr; NSStringUtils::CStringBuilder* content; NSStringUtils::CStringBuilder* contentRun; TrackRevision() { Id = NULL; vMerge = NULL; vMergeOrigin = NULL; RPr = NULL; PPr = NULL; sectPr = NULL; tblPr = NULL; tblGridChange = NULL; trPr = NULL; tcPr = NULL; content = NULL; contentRun = NULL; } ~TrackRevision() { RELEASEOBJECT(Id); RELEASEOBJECT(vMerge); RELEASEOBJECT(vMergeOrigin); RELEASEOBJECT(RPr); RELEASEOBJECT(PPr); RELEASEOBJECT(sectPr); RELEASEOBJECT(tblPr); RELEASEOBJECT(tblGridChange); RELEASEOBJECT(trPr); RELEASEOBJECT(tcPr); RELEASEOBJECT(content); RELEASEOBJECT(contentRun); } bool IsNoEmpty() { return !Author.empty() || !Date.empty() || NULL != Id; } std::wstring ToString(std::wstring sName) { NSStringUtils::CStringBuilder writer; Write(&writer, sName); return writer.GetData(); } void Write(NSStringUtils::CStringBuilder* pCStringWriter, std::wstring sName) { if(IsNoEmpty()) { pCStringWriter->WriteString(L"<"); pCStringWriter->WriteString(sName); if(NULL != Id) { pCStringWriter->WriteString(L" w:id=\"" + std::to_wstring(*Id) + L"\""); } if(!Author.empty()) { pCStringWriter->WriteString(L" w:author=\""); pCStringWriter->WriteEncodeXmlString(Author); pCStringWriter->WriteString(L"\""); } if(!Date.empty()) { pCStringWriter->WriteString(L" w:date=\""); pCStringWriter->WriteEncodeXmlString(Date); pCStringWriter->WriteString(L"\""); } if(!UserId.empty()) { pCStringWriter->WriteString(L" oouserid=\""); pCStringWriter->WriteEncodeXmlString(UserId); pCStringWriter->WriteString(L"\""); } if(NULL != vMerge) { pCStringWriter->WriteString(L" w:vMerge=\"" + std::to_wstring(*vMerge) + L"\""); } if(NULL != vMergeOrigin) { pCStringWriter->WriteString(L" w:vMergeOrig=\"" + std::to_wstring(*vMergeOrigin) + L"\""); } if(NULL != RPr || NULL != PPr || NULL != sectPr || NULL != tblPr || NULL != tblGridChange || NULL != trPr || NULL != tcPr || NULL != content|| NULL != contentRun) { pCStringWriter->WriteString(L">"); if(NULL != RPr) { RPr->Write(pCStringWriter); } if(NULL != PPr) { pCStringWriter->WriteString(L""); pCStringWriter->Write(*PPr); pCStringWriter->WriteString(L""); } if(NULL != sectPr) { pCStringWriter->WriteString(L""); pCStringWriter->WriteString(sectPr->Write()); pCStringWriter->WriteString(L""); } if(NULL != tblPr) { pCStringWriter->WriteString(tblPr->Write()); } if(NULL != tblGridChange) { pCStringWriter->WriteString(L""); pCStringWriter->Write(*tblGridChange); pCStringWriter->WriteString(L""); } if(NULL != trPr) { pCStringWriter->WriteString(L""); pCStringWriter->Write(*trPr); pCStringWriter->WriteString(L""); } if(NULL != tcPr) { pCStringWriter->WriteString(L""); pCStringWriter->Write(*tcPr); pCStringWriter->WriteString(L""); } if(NULL != content) { pCStringWriter->Write(*content); } if(NULL != contentRun) { pCStringWriter->Write(*contentRun); } pCStringWriter->WriteString(L"WriteString(sName); pCStringWriter->WriteString(L" >"); } else { pCStringWriter->WriteString(L" />"); } } } }; }