/* * (c) Copyright Ascensio System SIA 2010-2023 * * 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-6 Ernesta Birznieka-Upish * 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 * */ #include "TableProperty.h" namespace ComplexTypes { namespace Word { //-------------------------------------------------------------------------------- // CellMergeTrackChange //-------------------------------------------------------------------------------- CCellMergeTrackChange::CCellMergeTrackChange() { } CCellMergeTrackChange::~CCellMergeTrackChange() { } void CCellMergeTrackChange::FromXML(XmlUtils::CXmlNode& oNode) { XmlMacroReadAttributeBase( oNode, L"w:author", m_sAuthor ); XmlMacroReadAttributeBase( oNode, L"w:date", m_oDate ); XmlMacroReadAttributeBase( oNode, L"w:id", m_oId ); XmlMacroReadAttributeBase( oNode, L"w:vMerge", m_oVMerge ); XmlMacroReadAttributeBase( oNode, L"w:vMergeOrig", m_oVMergeOrig ); XmlMacroReadAttributeBase( oNode, L"oouserid", m_sUserId ); } void CCellMergeTrackChange::FromXML(XmlUtils::CXmlLiteReader& oReader) { ReadAttributes(oReader); if ( !oReader.IsEmptyNode() ) oReader.ReadTillEnd(); } std::wstring CCellMergeTrackChange::ToString() const { std::wstring sResult; if ( m_sAuthor.IsInit() ) { sResult += L"w:author=\""; sResult += XmlUtils::EncodeXmlString(m_sAuthor.get2()); sResult += L"\" "; } ComplexTypes_WriteAttribute( L"w:date=\"", m_oDate ); ComplexTypes_WriteAttribute( L"w:id=\"", m_oId ); ComplexTypes_WriteAttribute( L"w:vMerge=\"", m_oVMerge ); ComplexTypes_WriteAttribute( L"w:vMergeOrig=\"", m_oVMergeOrig ); if ( m_sUserId.IsInit() ) { sResult += L"oouserid=\""; sResult += m_sUserId.get2(); sResult += L"\" "; } return sResult; } void CCellMergeTrackChange::ReadAttributes(XmlUtils::CXmlLiteReader& oReader) { // Читаем атрибуты WritingElement_ReadAttributes_Start( oReader ) WritingElement_ReadAttributes_Read_if ( oReader, L"w:author", m_sAuthor ) WritingElement_ReadAttributes_Read_else_if( oReader, L"w:date", m_oDate ) WritingElement_ReadAttributes_Read_else_if( oReader, L"w:id", m_oId ) WritingElement_ReadAttributes_Read_else_if( oReader, L"w:vMerge", m_oVMerge ) WritingElement_ReadAttributes_Read_else_if( oReader, L"w:vMergeOrig", m_oVMergeOrig ) WritingElement_ReadAttributes_Read_else_if( oReader, L"oouserid", m_sUserId ) WritingElement_ReadAttributes_End( oReader ) } //-------------------------------------------------------------------------------- // HMerge //-------------------------------------------------------------------------------- CHMerge::CHMerge() { } CHMerge::~CHMerge() { } void CHMerge::FromXML(XmlUtils::CXmlNode& oNode) { XmlMacroReadAttributeBase( oNode, L"w:val", m_oVal ); } void CHMerge::FromXML(XmlUtils::CXmlLiteReader& oReader) { ReadAttributes(oReader); if ( !oReader.IsEmptyNode() ) oReader.ReadTillEnd(); } std::wstring CHMerge::ToString() const { std::wstring sResult; ComplexTypes_WriteAttribute( L"w:val=\"", m_oVal ); return sResult; } void CHMerge::ReadAttributes(XmlUtils::CXmlLiteReader& oReader) { // Читаем атрибуты WritingElement_ReadAttributes_Start( oReader ) WritingElement_ReadAttributes_ReadSingle( oReader, L"w:val", m_oVal ) WritingElement_ReadAttributes_End( oReader ) } //-------------------------------------------------------------------------------- // VMerge //-------------------------------------------------------------------------------- CVMerge::CVMerge() { } CVMerge::~CVMerge() { } void CVMerge::FromXML(XmlUtils::CXmlNode& oNode) { XmlMacroReadAttributeBase( oNode, L"w:val", m_oVal ); } void CVMerge::FromXML(XmlUtils::CXmlLiteReader& oReader) { ReadAttributes(oReader); if ( !oReader.IsEmptyNode() ) oReader.ReadTillEnd(); } std::wstring CVMerge::ToString() const { std::wstring sResult; ComplexTypes_WriteAttribute( L"w:val=\"", m_oVal ); return sResult; } void CVMerge::ReadAttributes(XmlUtils::CXmlLiteReader& oReader) { // Читаем атрибуты WritingElement_ReadAttributes_Start( oReader ) WritingElement_ReadAttributes_ReadSingle( oReader, L"w:val", m_oVal ) WritingElement_ReadAttributes_End( oReader ) } //-------------------------------------------------------------------------------- // Height //-------------------------------------------------------------------------------- CHeight::CHeight() { } CHeight::~CHeight() { } void CHeight::FromXML(XmlUtils::CXmlNode& oNode) { XmlMacroReadAttributeBase( oNode, L"w:hRule", m_oHRule ); XmlMacroReadAttributeBase( oNode, L"w:val", m_oVal ); XmlMacroReadAttributeBase(oNode, L"w:h-rule", m_oHRule); } void CHeight::FromXML(XmlUtils::CXmlLiteReader& oReader) { ReadAttributes(oReader); if ( !oReader.IsEmptyNode() ) oReader.ReadTillEnd(); } std::wstring CHeight::ToString() const { std::wstring sResult; ComplexTypes_WriteAttribute( L"w:hRule=\"", m_oHRule ); ComplexTypes_WriteAttribute( L"w:val=\"", m_oVal ); return sResult; } void CHeight::ReadAttributes(XmlUtils::CXmlLiteReader& oReader) { WritingElement_ReadAttributes_Start( oReader ) WritingElement_ReadAttributes_Read_if ( oReader, L"w:hRule", m_oHRule ) WritingElement_ReadAttributes_Read_else_if( oReader, L"w:val", m_oVal ) WritingElement_ReadAttributes_Read_else_if(oReader, L"w:h-rule", m_oHRule) WritingElement_ReadAttributes_End( oReader ) } //-------------------------------------------------------------------------------- // JcTable //-------------------------------------------------------------------------------- CJcTable::CJcTable() { } CJcTable::~CJcTable() { } void CJcTable::FromXML(XmlUtils::CXmlNode& oNode) { XmlMacroReadAttributeBase( oNode, L"w:val", m_oVal ); } void CJcTable::FromXML(XmlUtils::CXmlLiteReader& oReader) { ReadAttributes(oReader); if ( !oReader.IsEmptyNode() ) oReader.ReadTillEnd(); } std::wstring CJcTable::ToString() const { std::wstring sResult; if ( m_oVal.IsInit() ) { sResult += L"w:val=\""; sResult += m_oVal->ToString(); sResult += L"\" "; } return sResult; } void CJcTable::ReadAttributes(XmlUtils::CXmlLiteReader& oReader) { // Читаем атрибуты WritingElement_ReadAttributes_Start( oReader ) WritingElement_ReadAttributes_ReadSingle( oReader, L"w:val", m_oVal ) WritingElement_ReadAttributes_End( oReader ) } //-------------------------------------------------------------------------------- // TblLayoutType //-------------------------------------------------------------------------------- CTblLayoutType::CTblLayoutType() { } CTblLayoutType::~CTblLayoutType() { } void CTblLayoutType::FromXML(XmlUtils::CXmlNode& oNode) { XmlMacroReadAttributeBase( oNode, L"w:type", m_oType ); } void CTblLayoutType::FromXML(XmlUtils::CXmlLiteReader& oReader) { ReadAttributes(oReader); if ( !oReader.IsEmptyNode() ) oReader.ReadTillEnd(); } std::wstring CTblLayoutType::ToString() const { std::wstring sResult; if ( m_oType.IsInit() ) { sResult += L"w:type=\""; sResult += m_oType->ToString(); sResult += L"\" "; } return sResult; } void CTblLayoutType::ReadAttributes(XmlUtils::CXmlLiteReader& oReader) { // Читаем атрибуты WritingElement_ReadAttributes_Start( oReader ) WritingElement_ReadAttributes_ReadSingle( oReader, L"w:type", m_oType ) WritingElement_ReadAttributes_End( oReader ) } //-------------------------------------------------------------------------------- // TblLook //-------------------------------------------------------------------------------- CTblLook::CTblLook() { } CTblLook::~CTblLook() { } void CTblLook::FromXML(XmlUtils::CXmlNode& oNode) { XmlMacroReadAttributeBase( oNode, L"w:firstColumn", m_oFirstColumn ); XmlMacroReadAttributeBase( oNode, L"w:firstRow", m_oFirstRow ); XmlMacroReadAttributeBase( oNode, L"w:lastColumn", m_oLastColumn ); XmlMacroReadAttributeBase( oNode, L"w:lastRow", m_oLastRow ); XmlMacroReadAttributeBase( oNode, L"w:noHBand", m_oNoHBand ); XmlMacroReadAttributeBase( oNode, L"w:noVBand", m_oNoVBand ); XmlMacroReadAttributeBase( oNode, L"w:val", m_oVal ); } void CTblLook::FromXML(XmlUtils::CXmlLiteReader& oReader) { ReadAttributes(oReader); if ( !oReader.IsEmptyNode() ) oReader.ReadTillEnd(); } std::wstring CTblLook::ToString() const { std::wstring sResult; if ( m_oFirstColumn.IsInit() ) { sResult += L"w:firstColumn=\""; sResult += m_oFirstColumn->ToString(); sResult += L"\" "; } if ( m_oFirstRow.IsInit() ) { sResult += L"w:firstRow=\""; sResult += m_oFirstRow->ToString(); sResult += L"\" "; } if ( m_oLastColumn.IsInit() ) { sResult += L"w:lastColumn=\""; sResult += m_oLastColumn->ToString(); sResult += L"\" "; } if ( m_oLastRow.IsInit() ) { sResult += L"w:lastRow=\""; sResult += m_oLastRow->ToString(); sResult += L"\" "; } if ( m_oNoHBand.IsInit() ) { sResult += L"w:noHBand=\""; sResult += m_oNoHBand->ToString(); sResult += L"\" "; } if ( m_oNoVBand.IsInit() ) { sResult += L"w:noVBand=\""; sResult += m_oNoVBand->ToString(); sResult += L"\" "; } ComplexTypes_WriteAttribute( L"w:val=\"", m_oVal ); return sResult; } const bool CTblLook::IsFirstRow() const { if ( m_oFirstRow.IsInit() ) return ( SimpleTypes::onoffTrue == m_oFirstRow->GetValue() ); if ( m_oVal.IsInit() ) return ( 0 != ( m_oVal->GetValue() & 0x0020 ) ); return false; } const bool CTblLook::IsLastRow() const { if ( m_oLastRow.IsInit() ) return ( SimpleTypes::onoffTrue == m_oLastRow->GetValue() ); if ( m_oVal.IsInit() ) return ( 0 != ( m_oVal->GetValue() & 0x0040 ) ); return false; } const bool CTblLook::IsFirstColumn() const { if ( m_oFirstColumn.IsInit() ) return ( SimpleTypes::onoffTrue == m_oFirstColumn->GetValue() ); if ( m_oVal.IsInit() ) return ( 0 != ( m_oVal->GetValue() & 0x0080 ) ); return false; } const bool CTblLook::IsLastColumn () const { if ( m_oLastColumn.IsInit() ) return ( SimpleTypes::onoffTrue == m_oLastColumn->GetValue() ); if ( m_oVal.IsInit() ) return ( 0 != ( m_oVal->GetValue() & 0x0100 ) ); return false; } const bool CTblLook::IsNoHBand () const { if ( m_oNoHBand.IsInit() ) return ( SimpleTypes::onoffTrue == m_oNoHBand->GetValue() ); if ( m_oVal.IsInit() ) return ( 0 != ( m_oVal->GetValue() & 0x0200 ) ); return false; } const bool CTblLook::IsNoVBand () const { if ( m_oNoVBand.IsInit() ) return ( SimpleTypes::onoffTrue == m_oNoVBand->GetValue() ); if ( m_oVal.IsInit() ) return ( 0 != ( m_oVal->GetValue() & 0x0400 ) ); return false; } const int CTblLook::GetValue() const { int nRes = 0; if(m_oVal.IsInit()) nRes = m_oVal->GetValue(); else { if ( m_oNoVBand.IsInit() && SimpleTypes::onoffTrue == m_oNoVBand->GetValue()) nRes |= 0x0400; if ( m_oNoHBand.IsInit() && SimpleTypes::onoffTrue == m_oNoHBand->GetValue()) nRes |= 0x0200; if ( m_oLastColumn.IsInit() && SimpleTypes::onoffTrue == m_oLastColumn->GetValue()) nRes |= 0x0100; if ( m_oFirstColumn.IsInit() && SimpleTypes::onoffTrue == m_oFirstColumn->GetValue()) nRes |= 0x0080; if ( m_oLastRow.IsInit() && SimpleTypes::onoffTrue == m_oLastRow->GetValue()) nRes |= 0x0040; if ( m_oFirstRow.IsInit() && SimpleTypes::onoffTrue == m_oFirstRow->GetValue()) nRes |= 0x0020; } return nRes; } void CTblLook::SetValue(int nVal) { m_oVal.Init(); m_oVal->SetValue(nVal); if ( 0 != (nVal & 0x0400)) { m_oNoVBand.Init(); m_oNoVBand->FromBool(true); } if ( 0 != (nVal & 0x0200)) { m_oNoHBand.Init(); m_oNoHBand->FromBool(true); } if ( 0 != (nVal & 0x0100)) { m_oLastColumn.Init(); m_oLastColumn->FromBool(true); } if ( 0 != (nVal & 0x0080)) { m_oFirstColumn.Init(); m_oFirstColumn->FromBool(true); } if ( 0 != (nVal & 0x0040)) { m_oLastRow.Init(); m_oLastRow->FromBool(true); } if ( 0 != (nVal & 0x0020)) { m_oFirstRow.Init(); m_oFirstRow->FromBool(true); } } void CTblLook::ReadAttributes(XmlUtils::CXmlLiteReader& oReader) { // Читаем атрибуты WritingElement_ReadAttributes_Start( oReader ) WritingElement_ReadAttributes_Read_if ( oReader, L"w:firstColumn", m_oFirstColumn ) WritingElement_ReadAttributes_Read_else_if( oReader, L"w:firstRow", m_oFirstRow ) WritingElement_ReadAttributes_Read_else_if( oReader, L"w:lastColumn", m_oLastColumn ) WritingElement_ReadAttributes_Read_else_if( oReader, L"w:lastRow", m_oLastRow ) WritingElement_ReadAttributes_Read_else_if( oReader, L"w:noHBand", m_oNoHBand ) WritingElement_ReadAttributes_Read_else_if( oReader, L"w:noVBand", m_oNoVBand ) WritingElement_ReadAttributes_Read_else_if( oReader, L"w:val", m_oVal ) WritingElement_ReadAttributes_End( oReader ) } //-------------------------------------------------------------------------------- // TblOverlap //-------------------------------------------------------------------------------- CTblOverlap::CTblOverlap() { } CTblOverlap::~CTblOverlap() { } void CTblOverlap::FromXML(XmlUtils::CXmlNode& oNode) { XmlMacroReadAttributeBase( oNode, L"w:val", m_oVal ); } void CTblOverlap::FromXML(XmlUtils::CXmlLiteReader& oReader) { // Читаем атрибуты WritingElement_ReadAttributes_Start( oReader ) WritingElement_ReadAttributes_ReadSingle( oReader, L"w:val", m_oVal ) WritingElement_ReadAttributes_End( oReader ) } std::wstring CTblOverlap::ToString() const { std::wstring sResult; if ( m_oVal.IsInit() ) { sResult += L"w:val=\""; sResult += m_oVal->ToString(); sResult += L"\" "; } return sResult; } //-------------------------------------------------------------------------------- // TblPPr //-------------------------------------------------------------------------------- CTblPPr::CTblPPr() { } CTblPPr::~CTblPPr() { } void CTblPPr::PrepareAfterRead() { if(false == m_oHorzAnchor.IsInit()) { m_oHorzAnchor.Init(); m_oHorzAnchor->SetValue(SimpleTypes::hanchorText); } if(false == m_oVertAnchor.IsInit()) { m_oVertAnchor.Init(); m_oVertAnchor->SetValue(SimpleTypes::vanchorMargin); } if(false == m_oTblpXSpec.IsInit()) { if(false == m_oTblpX.IsInit()) { m_oTblpX.Init(); m_oTblpX->FromTwips(0); } //Several values of sprmTDxaAbs have special meanings as specified by //[ECMA-376] Part 4, Section 2.18.114. These values are specified as //follows. switch(m_oTblpX->ToTwips()) { case 0: m_oTblpX.reset(NULL); m_oTblpXSpec.Init(); m_oTblpXSpec->SetValue(SimpleTypes::xalignLeft); break; case -4: m_oTblpX.reset(NULL); m_oTblpXSpec.Init(); m_oTblpXSpec->SetValue(SimpleTypes::xalignCenter); break; case -8: m_oTblpX.reset(NULL); m_oTblpXSpec.Init(); m_oTblpXSpec->SetValue(SimpleTypes::xalignRight); break; case -12: m_oTblpX.reset(NULL); m_oTblpXSpec.Init(); m_oTblpXSpec->SetValue(SimpleTypes::xalignInside); break; case -16: m_oTblpX.reset(NULL); m_oTblpXSpec.Init(); m_oTblpXSpec->SetValue(SimpleTypes::xalignOutside); break; } } if(false == m_oTblpYSpec.IsInit()) { if(false == m_oTblpY.IsInit()) { m_oTblpY.Init(); m_oTblpY->FromTwips(0); } //The meanings that are provided correspond to //values that are defined in [ECMA-376] Part 4, Section 2.18.115 ST_YAlign //(Vertical Alignment Location). switch(m_oTblpY->ToTwips()) { case 0: m_oVertAnchor.Init(); m_oVertAnchor->SetValue(SimpleTypes::vanchorText); break; case -4: m_oTblpY.reset(NULL); m_oTblpYSpec.Init(); m_oTblpYSpec->SetValue(SimpleTypes::yalignTop); break; case -8: m_oTblpY.reset(NULL); m_oTblpYSpec.Init(); m_oTblpYSpec->SetValue(SimpleTypes::yalignCenter); break; case -12: m_oTblpY.reset(NULL); m_oTblpYSpec.Init(); m_oTblpYSpec->SetValue(SimpleTypes::yalignBottom); break; case -16: m_oTblpY.reset(NULL); m_oTblpYSpec.Init(); m_oTblpYSpec->SetValue(SimpleTypes::yalignInside); break; case -20: m_oTblpY.reset(NULL); m_oTblpYSpec.Init(); m_oTblpYSpec->SetValue(SimpleTypes::yalignOutside); break; } } } void CTblPPr::FromXML(XmlUtils::CXmlNode& oNode) { XmlMacroReadAttributeBase( oNode, L"w:bottomFromText", m_oBottomFromText ); XmlMacroReadAttributeBase( oNode, L"w:horzAnchor", m_oHorzAnchor ); XmlMacroReadAttributeBase( oNode, L"w:leftFromText", m_oLeftFromText ); XmlMacroReadAttributeBase( oNode, L"w:rightFromText", m_oRightFromText ); XmlMacroReadAttributeBase( oNode, L"w:tblpX", m_oTblpX ); XmlMacroReadAttributeBase( oNode, L"w:tblpXSpec", m_oTblpXSpec ); XmlMacroReadAttributeBase( oNode, L"w:tblpY", m_oTblpY ); XmlMacroReadAttributeBase( oNode, L"w:tblpYSpec", m_oTblpYSpec ); XmlMacroReadAttributeBase( oNode, L"w:topFromText", m_oTopFromText ); XmlMacroReadAttributeBase( oNode, L"w:vertAnchor", m_oVertAnchor ); PrepareAfterRead(); } void CTblPPr::FromXML(XmlUtils::CXmlLiteReader& oReader) { ReadAttributes(oReader); if ( !oReader.IsEmptyNode() ) oReader.ReadTillEnd(); PrepareAfterRead(); } std::wstring CTblPPr::ToString() const { std::wstring sResult; ComplexTypes_WriteAttribute( L"w:bottomFromText=\"", m_oBottomFromText ); ComplexTypes_WriteAttribute( L"w:horzAnchor=\"", m_oHorzAnchor ); ComplexTypes_WriteAttribute( L"w:leftFromText=\"", m_oLeftFromText ); ComplexTypes_WriteAttribute( L"w:rightFromText=\"", m_oRightFromText ); ComplexTypes_WriteAttribute( L"w:tblpX=\"", m_oTblpX ); ComplexTypes_WriteAttribute( L"w:tblpXSpec=\"", m_oTblpXSpec ); ComplexTypes_WriteAttribute( L"w:tblpY=\"", m_oTblpY ); ComplexTypes_WriteAttribute( L"w:tblpYSpec=\"", m_oTblpYSpec ); ComplexTypes_WriteAttribute( L"w:topFromText=\"", m_oTopFromText ); ComplexTypes_WriteAttribute( L"w:vertAnchor=\"", m_oVertAnchor ); return sResult; } void CTblPPr::ReadAttributes(XmlUtils::CXmlLiteReader& oReader) { // Читаем атрибуты WritingElement_ReadAttributes_Start( oReader ) WritingElement_ReadAttributes_Read_if ( oReader, L"w:bottomFromText", m_oBottomFromText ) WritingElement_ReadAttributes_Read_else_if( oReader, L"w:horzAnchor", m_oHorzAnchor ) WritingElement_ReadAttributes_Read_else_if( oReader, L"w:leftFromText", m_oLeftFromText ) WritingElement_ReadAttributes_Read_else_if( oReader, L"w:rightFromText", m_oRightFromText ) WritingElement_ReadAttributes_Read_else_if( oReader, L"w:tblpX", m_oTblpX ) WritingElement_ReadAttributes_Read_else_if( oReader, L"w:tblpXSpec", m_oTblpXSpec ) WritingElement_ReadAttributes_Read_else_if( oReader, L"w:tblpY", m_oTblpY ) WritingElement_ReadAttributes_Read_else_if( oReader, L"w:tblpYSpec", m_oTblpYSpec ) WritingElement_ReadAttributes_Read_else_if( oReader, L"w:topFromText", m_oTopFromText ) WritingElement_ReadAttributes_Read_else_if( oReader, L"w:vertAnchor", m_oVertAnchor ) WritingElement_ReadAttributes_End( oReader ) } } // Word } // ComplexTypes namespace OOX { namespace Logic { //-------------------------------------------------------------------------------- // TblBorders //-------------------------------------------------------------------------------- CTblBorders::CTblBorders() { } CTblBorders::~CTblBorders() { } void CTblBorders::fromXML(XmlUtils::CXmlNode& oNode) { if ( L"w:tblBorders" != oNode.GetName() ) return; XmlUtils::CXmlNode oChild; if ( oNode.GetNode( L"w:bottom", oChild ) ) m_oBottom = oChild; if ( oNode.GetNode( L"w:end", oChild ) ) m_oEnd = oChild; if ( oNode.GetNode( L"w:insideH", oChild ) ) m_oInsideH = oChild; if ( oNode.GetNode( L"w:insideV", oChild ) ) m_oInsideV = oChild; if ( oNode.GetNode( L"w:start", oChild ) ) m_oStart = oChild; if ( oNode.GetNode( L"w:top", oChild ) ) m_oTop = oChild; if ( !m_oEnd.IsInit() && oNode.GetNode( L"w:right", oChild ) ) m_oEnd = oChild; if ( !m_oStart.IsInit() && oNode.GetNode( L"w:left", oChild ) ) m_oStart = oChild; } void CTblBorders::fromXML(XmlUtils::CXmlLiteReader& oReader) { if ( oReader.IsEmptyNode() ) return; int nParentDepth = oReader.GetDepth(); while( oReader.ReadNextSiblingNode( nParentDepth ) ) { std::wstring sName = oReader.GetName(); if ( L"w:bottom" == sName ) m_oBottom = oReader; else if ( L"w:end" == sName ) m_oEnd = oReader; else if ( L"w:insideH" == sName ) m_oInsideH = oReader; else if ( L"w:insideV" == sName ) m_oInsideV = oReader; else if ( L"w:start" == sName ) m_oStart = oReader; else if ( L"w:top" == sName ) m_oTop = oReader; else if ( L"w:right" == sName ) m_oEnd = oReader; else if ( L"w:left" == sName ) m_oStart = oReader; } } std::wstring CTblBorders::toXML() const { std::wstring sResult = L""; if (m_oTop.IsInit()) { sResult += L"ToString(); sResult += L"/>"; } if (m_oStart.IsInit()) { //sResult += L"ToString(); sResult += L"/>"; } if ( m_oBottom.IsInit() ) { sResult += L"ToString(); sResult += L"/>"; } if ( m_oEnd.IsInit() ) { //sResult += L"ToString(); sResult += L"/>"; } if ( m_oInsideH.IsInit() ) { sResult += L"ToString(); sResult += L"/>"; } if ( m_oInsideV.IsInit() ) { sResult += L"ToString(); sResult += L"/>"; } sResult += L""; return sResult; } EElementType CTblBorders::getType() const { return et_w_tblBorders; } const CTblBorders CTblBorders::Merge(const CTblBorders& oPrev, const CTblBorders& oCurrent) { CTblBorders oProperties; oProperties.m_oBottom = Merge( oPrev.m_oBottom, oCurrent.m_oBottom ); oProperties.m_oEnd = Merge( oPrev.m_oEnd, oCurrent.m_oEnd ); oProperties.m_oInsideH = Merge( oPrev.m_oInsideH, oCurrent.m_oInsideH ); oProperties.m_oInsideV = Merge( oPrev.m_oInsideV, oCurrent.m_oInsideV ); oProperties.m_oStart = Merge( oPrev.m_oStart, oCurrent.m_oStart ); oProperties.m_oTop = Merge( oPrev.m_oTop, oCurrent.m_oTop ); return oProperties; } //-------------------------------------------------------------------------------- // TblCellMar //-------------------------------------------------------------------------------- CTblCellMar::CTblCellMar() { } CTblCellMar::~CTblCellMar() { } void CTblCellMar::fromXML(XmlUtils::CXmlNode& oNode) { if ( L"w:tblCellMar" != oNode.GetName() ) return; XmlUtils::CXmlNode oChild; if ( oNode.GetNode( L"w:bottom", oChild ) ) m_oBottom = oChild; if ( oNode.GetNode( L"w:end", oChild ) ) m_oEnd = oChild; if ( oNode.GetNode( L"w:start", oChild ) ) m_oStart = oChild; if ( oNode.GetNode( L"w:top", oChild ) ) m_oTop = oChild; if ( !m_oEnd.IsInit() && oNode.GetNode( L"w:right", oChild ) ) m_oEnd = oChild; if ( !m_oStart.IsInit() && oNode.GetNode( L"w:left", oChild ) ) m_oStart = oChild; } void CTblCellMar::fromXML(XmlUtils::CXmlLiteReader& oReader) { if ( oReader.IsEmptyNode() ) return; int nParentDepth = oReader.GetDepth(); while( oReader.ReadNextSiblingNode( nParentDepth ) ) { std::wstring sName = oReader.GetName(); if ( L"w:bottom" == sName ) m_oBottom = oReader; else if ( L"w:end" == sName ) m_oEnd = oReader; else if ( L"w:start" == sName ) m_oStart = oReader; else if ( L"w:top" == sName ) m_oTop = oReader; else if ( L"w:right" == sName ) m_oEnd = oReader; else if ( L"w:left" == sName ) m_oStart = oReader; } } std::wstring CTblCellMar::toXML() const { std::wstring sResult = L""; if ( m_oBottom.IsInit() ) { sResult += L"ToString(); sResult += L"/>"; } if ( m_oEnd.IsInit() ) { sResult += L"ToString(); sResult += L"/>"; } if ( m_oStart.IsInit() ) { sResult += L"ToString(); sResult += L"/>"; } if ( m_oTop.IsInit() ) { sResult += L"ToString(); sResult += L"/>"; } sResult += L""; return sResult; } EElementType CTblCellMar::getType() const { return et_w_tblCellMar; } const CTblCellMar CTblCellMar::Merge(const CTblCellMar& oPrev, const CTblCellMar& oCurrent) { CTblCellMar oProperties; oProperties.m_oBottom = Merge( oPrev.m_oBottom, oCurrent.m_oBottom ); oProperties.m_oEnd = Merge( oPrev.m_oEnd, oCurrent.m_oEnd ); oProperties.m_oStart = Merge( oPrev.m_oStart, oCurrent.m_oStart ); oProperties.m_oTop = Merge( oPrev.m_oTop, oCurrent.m_oTop ); return oProperties; } //-------------------------------------------------------------------------------- // TblPrChange + //-------------------------------------------------------------------------------- CTblPrChange::CTblPrChange(OOX::Document *pMain) : WritingElement(pMain) { m_pTblPr = new CTableProperty(pMain); m_pTblPr->m_bTblPrChange = true; } CTblPrChange::~CTblPrChange() { } const CTblPrChange& CTblPrChange::operator = (const XmlUtils::CXmlNode &oNode) { fromXML( (XmlUtils::CXmlNode &)oNode ); return *this; } const CTblPrChange& CTblPrChange::operator = (const XmlUtils::CXmlLiteReader& oReader) { fromXML( (XmlUtils::CXmlLiteReader&)oReader ); return *this; } void CTblPrChange::fromXML(XmlUtils::CXmlNode& oNode) { if ( _T("w:tblPrChange") != oNode.GetName() ) return; XmlMacroReadAttributeBase( oNode, _T("w:author"), m_sAuthor ); XmlMacroReadAttributeBase( oNode, _T("w:date"), m_oDate ); XmlMacroReadAttributeBase( oNode, _T("w:id"), m_oId ); XmlMacroReadAttributeBase( oNode, _T("oouserid"), m_sUserId ); XmlUtils::CXmlNode oNode_tblPr; if ( m_pTblPr.IsInit() && oNode.GetNode( _T("w:tblPr"), oNode_tblPr ) ) m_pTblPr->fromXML( oNode_tblPr ); } void CTblPrChange::fromXML(XmlUtils::CXmlLiteReader& oReader) { ReadAttributes( oReader ); if ( oReader.IsEmptyNode() ) return; int nParentDepth = oReader.GetDepth(); while( oReader.ReadNextSiblingNode( nParentDepth ) ) { std::wstring sName = oReader.GetName(); if ( m_pTblPr.IsInit() && _T("w:tblPr") == sName ) m_pTblPr->fromXML( oReader ); } } std::wstring CTblPrChange::toXML() const { std::wstring sResult = _T("ToString(); sResult += _T("\" "); } if ( m_oId.IsInit() ) { sResult += _T("w:id=\""); sResult += m_oId->ToString(); sResult += _T("\" "); } if ( m_sUserId.IsInit() ) { sResult += _T("oouserid=\""); sResult += m_sUserId.get2(); sResult += _T("\" "); } sResult += _T(">"); if ( m_pTblPr.IsInit() ) sResult += m_pTblPr->toXML(); sResult += _T(""); return sResult; } EElementType CTblPrChange::getType() const { return et_w_tblPrChange; } void CTblPrChange::ReadAttributes(XmlUtils::CXmlLiteReader& oReader) { WritingElement_ReadAttributes_Start( oReader ) WritingElement_ReadAttributes_Read_if ( oReader, _T("w:author"), m_sAuthor ) WritingElement_ReadAttributes_Read_else_if( oReader, _T("w:date"), m_oDate ) WritingElement_ReadAttributes_Read_else_if( oReader, _T("w:id"), m_oId ) WritingElement_ReadAttributes_Read_if ( oReader, _T("oouserid"), m_sUserId ) WritingElement_ReadAttributes_End( oReader ) } //-------------------------------------------------------------------------------- // TableProperty //-------------------------------------------------------------------------------- CTableProperty::CTableProperty(OOX::Document *pMain) { m_bTblPrChange = false; } CTableProperty::~CTableProperty() { } const CTableProperty& CTableProperty::operator=(const XmlUtils::CXmlNode &oNode) { fromXML( (XmlUtils::CXmlNode &)oNode ); return *this; } const CTableProperty& CTableProperty::operator=(const XmlUtils::CXmlLiteReader& oReader) { fromXML( (XmlUtils::CXmlLiteReader&)oReader ); return *this; } void CTableProperty::fromXML(XmlUtils::CXmlNode& oNode) { if ( L"w:tblPr" != oNode.GetName() ) return; XmlUtils::CXmlNode oChild; WritingElement_ReadNode( oNode, oChild, L"w:bidiVisual", m_oBidiVisual ); WritingElement_ReadNode( oNode, oChild, L"w:jc", m_oJc ); WritingElement_ReadNode( oNode, oChild, L"w:shd", m_oShade ); WritingElement_ReadNode( oNode, oChild, L"w:tblBorders", m_oTblBorders ); WritingElement_ReadNode( oNode, oChild, L"w:tblCaption", m_oTblCaption ); WritingElement_ReadNode( oNode, oChild, L"w:tblCellMar", m_oTblCellMar ); WritingElement_ReadNode( oNode, oChild, L"w:tblCellSpacing", m_oTblCellSpacing ); WritingElement_ReadNode( oNode, oChild, L"w:tblDescription", m_oTblDescription ); WritingElement_ReadNode( oNode, oChild, L"w:tblInd", m_oTblInd ); WritingElement_ReadNode( oNode, oChild, L"w:tblLayout", m_oTblLayout ); WritingElement_ReadNode( oNode, oChild, L"w:tblLook", m_oTblLook ); WritingElement_ReadNode( oNode, oChild, L"w:tblOverlap", m_oTblOverlap ); WritingElement_ReadNode( oNode, oChild, L"w:tblpPr", m_oTblpPr ); if ( !m_bTblPrChange ) WritingElement_ReadNode( oNode, oChild, L"w:tblPrChange", m_oTblPrChange ); WritingElement_ReadNode( oNode, oChild, L"w:tblStyle", m_oTblStyle ); WritingElement_ReadNode( oNode, oChild, L"w:tblStyleColBandSize", m_oTblStyleColBandSize ); WritingElement_ReadNode( oNode, oChild, L"w:tblStyleRowBandSize", m_oTblStyleRowBandSize ); WritingElement_ReadNode( oNode, oChild, L"w:tblW", m_oTblW ); } void CTableProperty::fromXML(XmlUtils::CXmlLiteReader& oReader) { if ( oReader.IsEmptyNode() ) return; int nParentDepth = oReader.GetDepth(); while( oReader.ReadNextSiblingNode( nParentDepth ) ) { std::wstring sName = oReader.GetName(); if ( L"w:bidiVisual" == sName ) m_oBidiVisual = oReader; else if ( L"w:jc" == sName ) m_oJc = oReader; else if ( L"w:shd" == sName ) m_oShade = oReader; else if ( L"w:tblBorders" == sName ) m_oTblBorders = oReader; else if ( L"w:tblCaption" == sName ) m_oTblCaption = oReader; else if ( L"w:tblCellMar" == sName ) m_oTblCellMar = oReader; else if ( L"w:tblCellSpacing" == sName ) m_oTblCellSpacing = oReader; else if ( L"w:tblDescription" == sName ) m_oTblDescription = oReader; else if ( L"w:tblInd" == sName ) m_oTblInd = oReader; else if ( L"w:tblLayout" == sName ) m_oTblLayout = oReader; else if ( L"w:tblLook" == sName ) m_oTblLook = oReader; else if ( L"w:tblOverlap" == sName ) m_oTblOverlap = oReader; else if ( L"w:tblpPr" == sName ) m_oTblpPr = oReader; else if ( !m_bTblPrChange && L"w:tblPrChange" == sName ) m_oTblPrChange = oReader; else if ( L"w:tblStyle" == sName ) m_oTblStyle = oReader; else if ( L"w:tblStyleColBandSize" == sName ) m_oTblStyleColBandSize = oReader; else if ( L"w:tblStyleRowBandSize" == sName ) m_oTblStyleRowBandSize = oReader; else if ( L"w:tblW" == sName ) m_oTblW = oReader; else if ( L"w:tblPr" == sName) {//387.docx fromXML(oReader); } } } std::wstring CTableProperty::toXML() const { std::wstring sResult = L""; WritingElement_WriteNode_1(L""; return sResult; } EElementType CTableProperty::getType() const { return et_w_tblPr; } const CTableProperty CTableProperty::Merge(const CTableProperty& oPrev, const CTableProperty& oCurrent) { CTableProperty oProperties; oProperties.m_bTblPrChange = oPrev.m_bTblPrChange || oCurrent.m_bTblPrChange; oProperties.m_oBidiVisual = Merge( oPrev.m_oBidiVisual, oCurrent.m_oBidiVisual ); oProperties.m_oJc = Merge( oPrev.m_oJc, oCurrent.m_oJc ); oProperties.m_oShade = Merge( oPrev.m_oShade, oCurrent.m_oShade ); if ( oCurrent.m_oTblBorders.IsInit() && oPrev.m_oTblBorders.IsInit() ) oProperties.m_oTblBorders = OOX::Logic::CTblBorders::Merge(oPrev.m_oTblBorders.get(), oCurrent.m_oTblBorders.get()); else oProperties.m_oTblBorders = Merge( oPrev.m_oTblBorders, oCurrent.m_oTblBorders ); oProperties.m_oTblCaption = Merge( oPrev.m_oTblCaption, oCurrent.m_oTblCaption ); if ( oCurrent.m_oTblCellMar.IsInit() && oPrev.m_oTblCellMar.IsInit() ) oProperties.m_oTblCellMar = OOX::Logic::CTblCellMar::Merge(oPrev.m_oTblCellMar.get(), oCurrent.m_oTblCellMar.get()); else oProperties.m_oTblCellMar = Merge( oPrev.m_oTblCellMar, oCurrent.m_oTblCellMar ); oProperties.m_oTblCellSpacing = Merge( oPrev.m_oTblCellSpacing, oCurrent.m_oTblCellSpacing ); oProperties.m_oTblDescription = Merge( oPrev.m_oTblDescription, oCurrent.m_oTblDescription ); oProperties.m_oTblInd = Merge( oPrev.m_oTblInd, oCurrent.m_oTblInd ); oProperties.m_oTblLayout = Merge( oPrev.m_oTblLayout, oCurrent.m_oTblLayout ); oProperties.m_oTblLook = Merge( oPrev.m_oTblLook, oCurrent.m_oTblLook ); oProperties.m_oTblOverlap = Merge( oPrev.m_oTblOverlap, oCurrent.m_oTblOverlap ); oProperties.m_oTblpPr = Merge( oPrev.m_oTblpPr, oCurrent.m_oTblpPr ); oProperties.m_oTblPrChange = Merge( oPrev.m_oTblPrChange, oCurrent.m_oTblPrChange ); oProperties.m_oTblStyle = Merge( oPrev.m_oTblStyle, oCurrent.m_oTblStyle ); oProperties.m_oTblStyleColBandSize = Merge( oPrev.m_oTblStyleColBandSize, oCurrent.m_oTblStyleColBandSize ); oProperties.m_oTblStyleRowBandSize = Merge( oPrev.m_oTblStyleRowBandSize, oCurrent.m_oTblStyleRowBandSize ); oProperties.m_oTblW = Merge( oPrev.m_oTblW, oCurrent.m_oTblW ); return oProperties; } //-------------------------------------------------------------------------------- // TrPrChange + //-------------------------------------------------------------------------------- CTrPrChange::CTrPrChange(OOX::Document *pMain) : WritingElement(pMain) { m_pTrPr.Init(); m_pTrPr->m_bTrPrChange = true; } CTrPrChange::~CTrPrChange() { } const CTrPrChange& CTrPrChange::operator = (const XmlUtils::CXmlNode &oNode) { fromXML( (XmlUtils::CXmlNode &)oNode ); return *this; } const CTrPrChange& CTrPrChange::operator = (const XmlUtils::CXmlLiteReader& oReader) { fromXML( (XmlUtils::CXmlLiteReader&)oReader ); return *this; } void CTrPrChange::fromXML(XmlUtils::CXmlNode& oNode) { if ( _T("w:trPrChange") != oNode.GetName() ) return; XmlMacroReadAttributeBase( oNode, _T("w:author"), m_sAuthor ); XmlMacroReadAttributeBase( oNode, _T("w:date"), m_oDate ); XmlMacroReadAttributeBase( oNode, _T("w:id"), m_oId ); XmlMacroReadAttributeBase( oNode, _T("oouserid"), m_sUserId ); XmlUtils::CXmlNode oNode_tblPr; if ( m_pTrPr.IsInit() && oNode.GetNode( _T("w:trPr"), oNode_tblPr ) ) m_pTrPr->fromXML( oNode_tblPr ); } void CTrPrChange::fromXML(XmlUtils::CXmlLiteReader& oReader) { ReadAttributes( oReader ); if ( oReader.IsEmptyNode() ) return; int nParentDepth = oReader.GetDepth(); while( oReader.ReadNextSiblingNode( nParentDepth ) ) { std::wstring sName = oReader.GetName(); if ( m_pTrPr.IsInit() && _T("w:trPr") == sName ) m_pTrPr->fromXML( oReader ); } } std::wstring CTrPrChange::toXML() const { std::wstring sResult = _T("ToString(); sResult += _T("\" "); } if ( m_oId.IsInit() ) { sResult += _T("w:id=\""); sResult += m_oId->ToString(); sResult += _T("\" "); } if ( m_sUserId.IsInit() ) { sResult += _T("oouserid=\""); sResult += m_sUserId.get2(); sResult += _T("\" "); } sResult += _T(">"); if ( m_pTrPr.IsInit() ) sResult += m_pTrPr->toXML(); sResult += _T(""); return sResult; } EElementType CTrPrChange::getType() const { return et_w_trPrChange; } void CTrPrChange::ReadAttributes(XmlUtils::CXmlLiteReader& oReader) { WritingElement_ReadAttributes_Start( oReader ) WritingElement_ReadAttributes_Read_if ( oReader, _T("w:author"), m_sAuthor ) WritingElement_ReadAttributes_Read_else_if( oReader, _T("w:date"), m_oDate ) WritingElement_ReadAttributes_Read_else_if( oReader, _T("w:id"), m_oId ) WritingElement_ReadAttributes_Read_else_if( oReader, _T("oouserid"), m_sUserId ) WritingElement_ReadAttributes_End( oReader ) } //-------------------------------------------------------------------------------- // TableRowProperties + //-------------------------------------------------------------------------------- CTableRowProperties::CTableRowProperties(OOX::Document *pMain) : WritingElement(pMain) { m_bTrPrChange = false; } CTableRowProperties::~CTableRowProperties() { } const CTableRowProperties& CTableRowProperties::operator =(const XmlUtils::CXmlNode &oNode) { fromXML( (XmlUtils::CXmlNode &)oNode ); return *this; } const CTableRowProperties& CTableRowProperties::operator =(const XmlUtils::CXmlLiteReader& oReader) { fromXML( (XmlUtils::CXmlLiteReader&)oReader ); return *this; } void CTableRowProperties::fromXML(XmlUtils::CXmlNode& oNode) { if ( L"w:trPr" != oNode.GetName() ) return; XmlUtils::CXmlNode oChild; WritingElement_ReadNode( oNode, oChild, L"w:cantSplit", m_oCantSplit ); WritingElement_ReadNode( oNode, oChild, L"w:cnfStyle", m_oCnfStyle ); WritingElement_ReadNode( oNode, oChild, L"w:del", m_oDel ); WritingElement_ReadNode( oNode, oChild, L"w:divId", m_oDivId ); WritingElement_ReadNode( oNode, oChild, L"w:gridAfter", m_oGridAfter ); WritingElement_ReadNode( oNode, oChild, L"w:gridBefore", m_oGridBefore ); WritingElement_ReadNode( oNode, oChild, L"w:hidden", m_oHidden ); WritingElement_ReadNode( oNode, oChild, L"w:ins", m_oIns ); WritingElement_ReadNode( oNode, oChild, L"w:jc", m_oJc ); WritingElement_ReadNode( oNode, oChild, L"w:tblCellSpacing", m_oTblCellSpacing ); WritingElement_ReadNode( oNode, oChild, L"w:tblHeader", m_oTblHeader ); WritingElement_ReadNode( oNode, oChild, L"w:trHeight", m_oTblHeight ); if ( !m_bTrPrChange ) WritingElement_ReadNode( oNode, oChild, L"w:trPrChange", m_oTrPrChange ); WritingElement_ReadNode( oNode, oChild, L"w:wAfter", m_oWAfter ); WritingElement_ReadNode( oNode, oChild, L"w:wBefore", m_oWBefore ); } void CTableRowProperties::fromXML(XmlUtils::CXmlLiteReader& oReader) { if ( oReader.IsEmptyNode() ) return; int nParentDepth = oReader.GetDepth(); while( oReader.ReadNextSiblingNode( nParentDepth ) ) { std::wstring sName = oReader.GetName(); if ( L"w:cantSplit" == sName ) m_oCantSplit = oReader; else if ( L"w:cnfStyle" == sName ) m_oCnfStyle = oReader; else if ( L"w:del" == sName ) m_oDel = oReader; else if ( L"w:divId" == sName ) m_oDivId = oReader; else if ( L"w:gridAfter" == sName ) m_oGridAfter = oReader; else if ( L"w:gridBefore" == sName ) m_oGridBefore = oReader; else if ( L"w:hidden" == sName ) m_oHidden = oReader; else if ( L"w:ins" == sName ) m_oIns = oReader; else if ( L"w:jc" == sName ) m_oJc = oReader; else if ( L"w:tblCellSpacing" == sName ) m_oTblCellSpacing = oReader; else if ( L"w:tblHeader" == sName ) m_oTblHeader = oReader; else if ( L"w:trHeight" == sName ) m_oTblHeight = oReader; else if ( !m_bTrPrChange && L"w:trPrChange" == sName ) m_oTrPrChange = oReader; else if ( L"w:wAfter" == sName ) m_oWAfter = oReader; else if ( L"w:wBefore" == sName ) m_oWBefore = oReader; } } std::wstring CTableRowProperties::toXML() const { std::wstring sResult = L""; WritingElement_WriteNode_1( L""; return sResult; } EElementType CTableRowProperties::getType() const { return et_w_trPr; } const CTableRowProperties CTableRowProperties::Merge(const CTableRowProperties& oPrev, const CTableRowProperties& oCurrent) { CTableRowProperties oProperties; oProperties.m_bTrPrChange = oPrev.m_bTrPrChange || oCurrent.m_bTrPrChange; oProperties.m_oCantSplit = Merge( oPrev.m_oCantSplit, oCurrent.m_oCantSplit ); oProperties.m_oCnfStyle = Merge( oPrev.m_oCnfStyle, oCurrent.m_oCnfStyle ); oProperties.m_oDel = Merge( oPrev.m_oDel, oCurrent.m_oDel ); oProperties.m_oDivId = Merge( oPrev.m_oDivId, oCurrent.m_oDivId ); oProperties.m_oGridAfter = Merge( oPrev.m_oGridAfter, oCurrent.m_oGridAfter ); oProperties.m_oGridBefore = Merge( oPrev.m_oGridBefore, oCurrent.m_oGridBefore ); oProperties.m_oHidden = Merge( oPrev.m_oHidden, oCurrent.m_oHidden ); oProperties.m_oIns = Merge( oPrev.m_oIns, oCurrent.m_oIns ); oProperties.m_oJc = Merge( oPrev.m_oJc, oCurrent.m_oJc ); oProperties.m_oTblCellSpacing = Merge( oPrev.m_oTblCellSpacing, oCurrent.m_oTblCellSpacing ); oProperties.m_oTblHeader = Merge( oPrev.m_oTblHeader, oCurrent.m_oTblHeader ); oProperties.m_oTblHeight = Merge( oPrev.m_oTblHeight, oCurrent.m_oTblHeight ); oProperties.m_oTrPrChange = Merge( oPrev.m_oTrPrChange, oCurrent.m_oTrPrChange ); oProperties.m_oWAfter = Merge( oPrev.m_oWAfter, oCurrent.m_oWAfter ); oProperties.m_oWBefore = Merge( oPrev.m_oWBefore, oCurrent.m_oWBefore ); return oProperties; } //-------------------------------------------------------------------------------- // Headers //-------------------------------------------------------------------------------- CHeaders::CHeaders(OOX::Document *pMain) : WritingElement(pMain) { } CHeaders::~CHeaders() { for ( unsigned int nIndex = 0; nIndex < m_arrHeaders.size(); nIndex++ ) { if ( m_arrHeaders[nIndex] ) delete m_arrHeaders[nIndex]; m_arrHeaders[nIndex] = NULL; } m_arrHeaders.clear(); } void CHeaders::fromXML(XmlUtils::CXmlNode& oNode) { if ( L"w:headers" != oNode.GetName() ) return; std::vector oHeaders; if ( oNode.GetNodes( L"w:header", oHeaders ) ) { for ( size_t nIndex = 0; nIndex < oHeaders.size(); nIndex++ ) { XmlUtils::CXmlNode& oHeader = oHeaders[nIndex]; if ( oHeader.IsValid() ) { ComplexTypes::Word::String *oHead = new ComplexTypes::Word::String(); *oHead = oHeader; if (oHead) m_arrHeaders.push_back( oHead ); } } } } void CHeaders::fromXML(XmlUtils::CXmlLiteReader& oReader) { if ( oReader.IsEmptyNode() ) return; int nParentDepth = oReader.GetDepth(); while( oReader.ReadNextSiblingNode( nParentDepth ) ) { std::wstring sName = oReader.GetName(); if ( L"w:header" == sName ) { ComplexTypes::Word::String *oHead = new ComplexTypes::Word::String(); *oHead = oReader; if (oHead) m_arrHeaders.push_back( oHead ); } } } std::wstring CHeaders::toXML() const { std::wstring sResult = L""; for (unsigned int nIndex = 0; nIndex < m_arrHeaders.size(); nIndex++ ) { sResult += L"ToString(); sResult += L"/>"; } sResult += L""; return sResult; } EElementType CHeaders::getType() const { return et_w_headers; } //-------------------------------------------------------------------------------- // TcBorders //-------------------------------------------------------------------------------- CTcBorders::CTcBorders() { } CTcBorders::~CTcBorders() { } void CTcBorders::fromXML(XmlUtils::CXmlNode& oNode) { if ( L"w:tcBorders" != oNode.GetName() ) return; XmlUtils::CXmlNode oChild; WritingElement_ReadNode( oNode, oChild, L"w:bottom", m_oBottom ); WritingElement_ReadNode( oNode, oChild, L"w:end", m_oEnd ); WritingElement_ReadNode( oNode, oChild, L"w:insideH", m_oInsideH ); WritingElement_ReadNode( oNode, oChild, L"w:insideV", m_oInsideV ); WritingElement_ReadNode( oNode, oChild, L"w:start", m_oStart ); WritingElement_ReadNode( oNode, oChild, L"w:tl2br", m_oTL2BR ); WritingElement_ReadNode( oNode, oChild, L"w:top", m_oTop ); WritingElement_ReadNode( oNode, oChild, L"w:tr2bl", m_oTR2BL ); if ( !m_oEnd.IsInit() ) WritingElement_ReadNode( oNode, oChild, L"w:right", m_oEnd ); if ( !m_oStart.IsInit() ) WritingElement_ReadNode( oNode, oChild, L"w:left", m_oStart ); } void CTcBorders::fromXML(XmlUtils::CXmlLiteReader& oReader) { if ( oReader.IsEmptyNode() ) return; int nParentDepth = oReader.GetDepth(); while( oReader.ReadNextSiblingNode( nParentDepth ) ) { std::wstring sName = oReader.GetName(); if ( L"w:bottom" == sName ) m_oBottom = oReader; else if ( L"w:end" == sName ) m_oEnd = oReader; else if ( L"w:insideH" == sName ) m_oInsideH = oReader; else if ( L"w:insideV" == sName ) m_oInsideV = oReader; else if ( L"w:start" == sName ) m_oStart = oReader; else if ( L"w:tl2br" == sName ) m_oTL2BR = oReader; else if ( L"w:top" == sName ) m_oTop = oReader; else if ( L"w:tr2bl" == sName ) m_oTR2BL = oReader; else if ( !m_oEnd.IsInit() && L"w:right" == sName ) m_oEnd = oReader; else if ( !m_oStart.IsInit() && L"w:left" == sName ) m_oStart = oReader; } } std::wstring CTcBorders::toXML() const { std::wstring sResult = L""; WritingElement_WriteNode_1( L""; return sResult; } EElementType CTcBorders::getType() const { return et_w_tcBorders; } const CTcBorders CTcBorders::Merge(const CTcBorders& oPrev, const CTcBorders& oCurrent) { CTcBorders oProperties; oProperties.m_oBottom = Merge( oPrev.m_oBottom, oCurrent.m_oBottom ); oProperties.m_oEnd = Merge( oPrev.m_oEnd, oCurrent.m_oEnd ); oProperties.m_oInsideH = Merge( oPrev.m_oInsideH, oCurrent.m_oInsideH ); oProperties.m_oInsideV = Merge( oPrev.m_oInsideV, oCurrent.m_oInsideV ); oProperties.m_oStart = Merge( oPrev.m_oStart, oCurrent.m_oStart ); oProperties.m_oTL2BR = Merge( oPrev.m_oTL2BR, oCurrent.m_oTL2BR ); oProperties.m_oTop = Merge( oPrev.m_oTop, oCurrent.m_oTop ); oProperties.m_oTR2BL = Merge( oPrev.m_oTR2BL, oCurrent.m_oTR2BL ); return oProperties; } //-------------------------------------------------------------------------------- // TcMar //-------------------------------------------------------------------------------- CTcMar::CTcMar() { } CTcMar::~CTcMar() { } void CTcMar::fromXML(XmlUtils::CXmlNode& oNode) { if ( L"w:tcMar" != oNode.GetName() ) return; XmlUtils::CXmlNode oChild; WritingElement_ReadNode( oNode, oChild, L"w:bottom", m_oBottom ); WritingElement_ReadNode( oNode, oChild, L"w:end", m_oEnd ); WritingElement_ReadNode( oNode, oChild, L"w:start", m_oStart ); WritingElement_ReadNode( oNode, oChild, L"w:top", m_oTop ); if ( !m_oEnd.IsInit() ) WritingElement_ReadNode( oNode, oChild, L"w:right", m_oEnd ); if ( !m_oStart.IsInit() ) WritingElement_ReadNode( oNode, oChild, L"w:left", m_oStart ); } void CTcMar::fromXML(XmlUtils::CXmlLiteReader& oReader) { if ( oReader.IsEmptyNode() ) return; int nParentDepth = oReader.GetDepth(); while( oReader.ReadNextSiblingNode( nParentDepth ) ) { std::wstring sName = oReader.GetName(); if ( L"w:bottom" == sName ) m_oBottom = oReader; else if ( L"w:end" == sName ) m_oEnd = oReader; else if ( L"w:start" == sName ) m_oStart = oReader; else if ( L"w:top" == sName ) m_oTop = oReader; else if ( !m_oEnd.IsInit() && L"w:right" == sName ) m_oEnd = oReader; else if ( !m_oStart.IsInit() && L"w:left" == sName ) m_oStart = oReader; } } std::wstring CTcMar::toXML() const { std::wstring sResult = L""; WritingElement_WriteNode_1( L""; return sResult; } EElementType CTcMar::getType() const { return et_w_tcMar; } const CTcMar CTcMar::Merge(const CTcMar& oPrev, const CTcMar& oCurrent) { CTcMar oProperties; oProperties.m_oBottom = Merge( oPrev.m_oBottom, oCurrent.m_oBottom ); oProperties.m_oEnd = Merge( oPrev.m_oEnd, oCurrent.m_oEnd ); oProperties.m_oStart = Merge( oPrev.m_oStart, oCurrent.m_oStart ); oProperties.m_oTop = Merge( oPrev.m_oTop, oCurrent.m_oTop ); return oProperties; } //-------------------------------------------------------------------------------- // TcPrChange + //-------------------------------------------------------------------------------- CTcPrChange::CTcPrChange(OOX::Document *pMain) : WritingElement(pMain) { m_pTcPr.Init(); m_pTcPr->m_bTcPrChange = true; } CTcPrChange::~CTcPrChange() { } const CTcPrChange& CTcPrChange::operator = (const XmlUtils::CXmlNode &oNode) { fromXML( (XmlUtils::CXmlNode &)oNode ); return *this; } const CTcPrChange& CTcPrChange::operator = (const XmlUtils::CXmlLiteReader& oReader) { fromXML( (XmlUtils::CXmlLiteReader&)oReader ); return *this; } void CTcPrChange::fromXML(XmlUtils::CXmlNode& oNode) { if ( _T("w:tcPrChange") != oNode.GetName() ) return; XmlMacroReadAttributeBase( oNode, _T("w:author"), m_sAuthor ); XmlMacroReadAttributeBase( oNode, _T("w:date"), m_oDate ); XmlMacroReadAttributeBase( oNode, _T("w:id"), m_oId ); XmlMacroReadAttributeBase( oNode, _T("oouserid"), m_sUserId ); XmlUtils::CXmlNode oNode_tcPr; if ( m_pTcPr.IsInit() && oNode.GetNode( _T("w:tcPr"), oNode_tcPr ) ) m_pTcPr->fromXML( oNode_tcPr ); } void CTcPrChange::fromXML(XmlUtils::CXmlLiteReader& oReader) { ReadAttributes( oReader ); if ( oReader.IsEmptyNode() ) return; int nParentDepth = oReader.GetDepth(); while( oReader.ReadNextSiblingNode( nParentDepth ) ) { std::wstring sName = oReader.GetName(); if ( m_pTcPr.IsInit() && _T("w:tcPr") == sName ) m_pTcPr->fromXML( oReader ); } } std::wstring CTcPrChange::toXML() const { std::wstring sResult = _T("ToString(); sResult += _T("\" "); } if ( m_oId.IsInit() ) { sResult += _T("w:id=\""); sResult += m_oId->ToString(); sResult += _T("\" "); } if ( m_sUserId.IsInit() ) { sResult += _T("oouserid=\""); sResult += m_sUserId.get2(); sResult += _T("\" "); } sResult += _T(">"); if ( m_pTcPr.IsInit() ) sResult += m_pTcPr->toXML(); sResult += _T(""); return sResult; } EElementType CTcPrChange::getType() const { return et_w_tcPrChange; } void CTcPrChange::ReadAttributes(XmlUtils::CXmlLiteReader& oReader) { WritingElement_ReadAttributes_Start( oReader ) WritingElement_ReadAttributes_Read_if ( oReader, _T("w:author"), m_sAuthor ) WritingElement_ReadAttributes_Read_else_if( oReader, _T("w:date"), m_oDate ) WritingElement_ReadAttributes_Read_else_if( oReader, _T("w:id"), m_oId ) WritingElement_ReadAttributes_Read_else_if( oReader, _T("oouserid"), m_sUserId ) WritingElement_ReadAttributes_End( oReader ) } //-------------------------------------------------------------------------------- // TableCellProperties //-------------------------------------------------------------------------------- CTableCellProperties::CTableCellProperties(OOX::Document *pMain) : WritingElement(pMain) { m_bTcPrChange = false; } CTableCellProperties::~CTableCellProperties() { } const CTableCellProperties& CTableCellProperties::operator =(const XmlUtils::CXmlNode &oNode) { fromXML( (XmlUtils::CXmlNode &)oNode ); return *this; } const CTableCellProperties& CTableCellProperties::operator =(const XmlUtils::CXmlLiteReader& oReader) { fromXML( (XmlUtils::CXmlLiteReader&)oReader ); return *this; } void CTableCellProperties::fromXML(XmlUtils::CXmlNode& oNode) { if ( L"w:tcPr" != oNode.GetName() ) return; XmlUtils::CXmlNode oChild; WritingElement_ReadNode( oNode, oChild, L"w:cellDel", m_oCellDel ); WritingElement_ReadNode( oNode, oChild, L"w:cellIns", m_oCellIns ); WritingElement_ReadNode( oNode, oChild, L"w:cellMerge", m_oCellMerge ); WritingElement_ReadNode( oNode, oChild, L"w:cnfStyle", m_oCnfStyle ); WritingElement_ReadNode( oNode, oChild, L"w:gridSpan", m_oGridSpan ); WritingElement_ReadNode( oNode, oChild, L"w:headers", m_oHeaders ); WritingElement_ReadNode( oNode, oChild, L"w:hideMark", m_oHideMark ); // В списке аттрибутов написано "hMerge", а в примере "hmerge" WritingElement_ReadNode( oNode, oChild, L"w:hmerge", m_oHMerge ); if ( !m_oHMerge.IsInit() ) WritingElement_ReadNode( oNode, oChild, L"w:hMerge", m_oHMerge ); WritingElement_ReadNode( oNode, oChild, L"w:noWrap", m_oNoWrap ); WritingElement_ReadNode( oNode, oChild, L"w:shd", m_oShd ); WritingElement_ReadNode( oNode, oChild, L"w:tcBorders", m_oTcBorders ); WritingElement_ReadNode( oNode, oChild, L"w:tcFitText", m_oTcFitText ); WritingElement_ReadNode( oNode, oChild, L"w:tcMar", m_oTcMar ); if ( !m_bTcPrChange ) WritingElement_ReadNode( oNode, oChild, L"w:tcPrChange", m_oTcPrChange ); WritingElement_ReadNode( oNode, oChild, L"w:tcW", m_oTcW ); WritingElement_ReadNode( oNode, oChild, L"w:textDirection", m_oTextDirection ); WritingElement_ReadNode( oNode, oChild, L"w:vAlign", m_oVAlign ); // В списке аттрибутов написано "vMerge", а в примере "vmerge" WritingElement_ReadNode( oNode, oChild, L"w:vmerge", m_oVMerge ); if ( !m_oVMerge.IsInit() ) WritingElement_ReadNode( oNode, oChild, L"w:vMerge", m_oVMerge ); } void CTableCellProperties::fromXML(XmlUtils::CXmlLiteReader& oReader) { if ( oReader.IsEmptyNode() ) return; int nParentDepth = oReader.GetDepth(); while( oReader.ReadNextSiblingNode( nParentDepth ) ) { std::wstring sName = oReader.GetName(); if ( L"w:cellDel" == sName ) m_oCellDel = oReader; else if ( L"w:cellIns" == sName ) m_oCellIns = oReader; else if ( L"w:cellMerge" == sName ) m_oCellMerge = oReader; else if ( L"w:cnfStyle" == sName ) m_oCnfStyle = oReader; else if ( L"w:gridSpan" == sName ) m_oGridSpan = oReader; else if ( L"w:headers" == sName ) m_oHeaders = oReader; else if ( L"w:hideMark" == sName ) m_oHideMark = oReader; else if ( L"w:noWrap" == sName ) m_oNoWrap = oReader; else if ( L"w:shd" == sName ) m_oShd = oReader; else if ( L"w:tcBorders" == sName ) m_oTcBorders = oReader; else if ( L"w:tcFitText" == sName ) m_oTcFitText = oReader; else if ( L"w:tcMar" == sName ) m_oTcMar = oReader; else if ( !m_bTcPrChange && L"w:tcPrChange" == sName ) m_oTcPrChange = oReader; else if ( L"w:tcW" == sName ) m_oTcW = oReader; else if ( L"w:vAlign" == sName ) m_oVAlign = oReader; else if ( L"w:textDirection" == sName || L"w:textFlow" == sName) m_oTextDirection = oReader; else if ( L"w:hMerge" == sName || L"w:hmerge" == sName) m_oHMerge = oReader; else if ( L"w:vMerge" == sName || L"w:vmerge" == sName) m_oVMerge = oReader; } } std::wstring CTableCellProperties::toXML() const { std::wstring sResult = L""; WritingElement_WriteNode_1(L""; return sResult; } EElementType CTableCellProperties::getType() const { return et_w_tcPr; } const CTableCellProperties CTableCellProperties::Merge(const CTableCellProperties& oPrev, const CTableCellProperties& oCurrent) { CTableCellProperties oProperties; oProperties.m_bTcPrChange = oPrev.m_bTcPrChange || oCurrent.m_bTcPrChange; oProperties.m_oCellDel = Merge( oPrev.m_oCellDel, oCurrent.m_oCellDel ); oProperties.m_oCellIns = Merge( oPrev.m_oCellIns, oCurrent.m_oCellIns ); oProperties.m_oCellMerge = Merge( oPrev.m_oCellMerge, oCurrent.m_oCellMerge ); oProperties.m_oCnfStyle = Merge( oPrev.m_oCnfStyle, oCurrent.m_oCnfStyle ); oProperties.m_oGridSpan = Merge( oPrev.m_oGridSpan, oCurrent.m_oGridSpan ); oProperties.m_oHeaders = Merge( oPrev.m_oHeaders, oCurrent.m_oHeaders ); oProperties.m_oHideMark = Merge( oPrev.m_oHideMark, oCurrent.m_oHideMark ); oProperties.m_oHMerge = Merge( oPrev.m_oHMerge, oCurrent.m_oHMerge ); oProperties.m_oNoWrap = Merge( oPrev.m_oNoWrap, oCurrent.m_oNoWrap ); oProperties.m_oShd = Merge( oPrev.m_oShd, oCurrent.m_oShd ); if ( oCurrent.m_oTcBorders.IsInit() && oPrev.m_oTcBorders.IsInit() ) oProperties.m_oTcBorders = OOX::Logic::CTcBorders::Merge(oPrev.m_oTcBorders.get(), oCurrent.m_oTcBorders.get()); else oProperties.m_oTcBorders = Merge( oPrev.m_oTcBorders, oCurrent.m_oTcBorders ); oProperties.m_oTcFitText = Merge( oPrev.m_oTcFitText, oCurrent.m_oTcFitText ); if ( oCurrent.m_oTcMar.IsInit() && oPrev.m_oTcMar.IsInit() ) oProperties.m_oTcMar = OOX::Logic::CTcMar::Merge(oPrev.m_oTcMar.get(), oCurrent.m_oTcMar.get()); else oProperties.m_oTcMar = Merge( oPrev.m_oTcMar, oCurrent.m_oTcMar ); oProperties.m_oTcPrChange = Merge( oPrev.m_oTcPrChange, oCurrent.m_oTcPrChange ); oProperties.m_oTcW = Merge( oPrev.m_oTcW, oCurrent.m_oTcW ); oProperties.m_oTextDirection = Merge( oPrev.m_oTextDirection, oCurrent.m_oTextDirection ); oProperties.m_oVAlign = Merge( oPrev.m_oVAlign, oCurrent.m_oVAlign ); oProperties.m_oVMerge = Merge( oPrev.m_oVMerge, oCurrent.m_oVMerge ); return oProperties; } } // namespace Logic } // namespace OOX