Files
DocumentServer-v-9.2.0/core/OOXML/XlsxFormat/NamedSheetViews/NamedSheetViews.cpp
Yajbir Singh f1b860b25c
Some checks failed
check / markdownlint (push) Has been cancelled
check / spellchecker (push) Has been cancelled
updated
2025-12-11 19:03:17 +05:30

808 lines
23 KiB
C++

/*
* (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 "NamedSheetViews.h"
#include "../Styles/dxf.h"
#include "../../Binary/Sheets/Reader/BinaryWriterS.h"
#include "../../Binary/Sheets/Writer/BinaryReaderS.h"
#include "../../Common/SimpleTypes_Spreadsheet.h"
#include "../Styles/Colors.h"
#include "../../DocxFormat/Drawing/DrawingExt.h"
namespace OOX
{
namespace Spreadsheet
{
void CSortRule::ReadAttributes(XmlUtils::CXmlLiteReader& oReader)
{
WritingElement_ReadAttributes_StartChar_No_NS(oReader)
WritingElement_ReadAttributes_Read_ifChar( oReader, "colId", m_oColId)
WritingElement_ReadAttributes_Read_else_ifChar( oReader, "id", m_oId)
WritingElement_ReadAttributes_EndChar_No_NS( oReader )
}
void CSortRule::fromXML(XmlUtils::CXmlLiteReader& oReader)
{
ReadAttributes(oReader);
if (oReader.IsEmptyNode())
return;
int nCurDepth = oReader.GetDepth();
while (oReader.ReadNextSiblingNode(nCurDepth))
{
const char* sName = XmlUtils::GetNameNoNS(oReader.GetNameChar());
if (strcmp("dxf", sName) == 0)
m_oDxf = oReader;
// else if (strcmp("richSortCondition", sName) == 0)
// m_oRichSortCondition = oReader;
else if (strcmp("sortCondition", sName) == 0)
m_oSortCondition = oReader;
}
}
void CSortRule::toXML(NSStringUtils::CStringBuilder& writer, const std::wstring& sName) const
{
writer.StartNode(sName);
writer.StartAttributes();
WritingNullable(m_oColId, writer.WriteAttribute(L"colId", *m_oColId););
WritingNullable(m_oId, writer.WriteAttributeEncodeXml(L"id", *m_oId););
writer.EndAttributes();
WritingNullable(m_oDxf, m_oDxf->toXMLWithNS(writer, L"", L"dxf", L"x:"););
// WritingNullable(m_oRichSortCondition, m_oRichSortCondition->toXML(writer, L"richSortCondition"););
WritingNullable(m_oSortCondition, m_oSortCondition->toXMLWithNS(writer, L"", L"sortCondition", L"x:"););
writer.EndNode(sName);
}
void CSortRule::toPPTY(NSBinPptxRW::CBinaryFileWriter* pWriter) const
{
pWriter->WriteBYTE(NSBinPptxRW::g_nodeAttributeStart);
pWriter->WriteUInt2(0, m_oColId);
pWriter->WriteString2(1, m_oId);
pWriter->WriteBYTE(NSBinPptxRW::g_nodeAttributeEnd);
if (m_oDxf.is_init())
{
pWriter->StartRecord(0);
BinXlsxRW::BinaryStyleTableWriter oBinaryStyleTableWriter(*pWriter, &pWriter->m_pCommon->m_pNativePicker->m_oEmbeddedFonts);
DocWrapper::FontProcessor oFontProcessor;
OOX::Spreadsheet::CIndexedColors* pIndexedColors = NULL;
CXlsx* xlsx = dynamic_cast<CXlsx*>(pWriter->m_pMainDocument);
if (xlsx && xlsx->m_pStyles && xlsx->m_pStyles->m_oColors.IsInit() && xlsx->m_pStyles->m_oColors->m_oIndexedColors.IsInit())
{
pIndexedColors = xlsx->m_pStyles->m_oColors->m_oIndexedColors.GetPointer();
}
oBinaryStyleTableWriter.WriteDxf(m_oDxf.get(), pIndexedColors, pWriter->m_pTheme->GetPointer(), oFontProcessor);
pWriter->EndRecord();
}
// pWriter->WriteRecord2(1, m_oRichSortCondition);
if (m_oSortCondition.IsInit())
{
pWriter->StartRecord(2);
BinXlsxRW::BinaryTableWriter oBinaryTableWriter(*pWriter);
oBinaryTableWriter.WriteSortCondition(*m_oSortCondition);
pWriter->EndRecord();
}
}
void CSortRule::fromPPTY(NSBinPptxRW::CBinaryFileReader* pReader)
{
LONG _end_rec = pReader->GetPos() + pReader->GetRecordSize() + 4;
pReader->Skip(1); // start attributes
while (true)
{
BYTE _at = pReader->GetUChar_TypeNode();
if (_at == NSBinPptxRW::g_nodeAttributeEnd)
break;
switch (_at)
{
case 0:
{
m_oColId = pReader->GetULong();
break;
}
case 1:
{
m_oId = pReader->GetString2();
break;
}
}
}
while (pReader->GetPos() < _end_rec)
{
BYTE _at = pReader->GetUChar();
switch (_at)
{
case 0:
{
OOX::Spreadsheet::CStyles oStyles(NULL);
BinXlsxRW::BinaryStyleTableReader style_reader(*pReader, oStyles);
m_oDxf.Init();
style_reader.ReadDxfExternal(m_oDxf.GetPointer());
break;
}
// case 1:
// {
// m_oRichSortCondition.Init();
// m_oRichSortCondition->fromPPTY(pReader);
// break;
// }
case 2:
{
BinXlsxRW::BinaryTableReader table_reader(*pReader, NULL);
m_oSortCondition.Init();
table_reader.ReadSortConditionExternal(m_oSortCondition.GetPointer());
break;
}
default:
{
pReader->SkipRecord();
break;
}
}
}
pReader->Seek(_end_rec);
}
void CSortRules::ReadAttributes(XmlUtils::CXmlLiteReader& oReader)
{
WritingElement_ReadAttributes_StartChar_No_NS(oReader)
WritingElement_ReadAttributes_Read_ifChar( oReader, "sortMethod", m_oSortMethod)
WritingElement_ReadAttributes_Read_else_ifChar( oReader, "caseSensitive", m_oCaseSensitive)
WritingElement_ReadAttributes_EndChar_No_NS( oReader )
}
void CSortRules::fromXML(XmlUtils::CXmlLiteReader& oReader)
{
ReadAttributes(oReader);
if (oReader.IsEmptyNode())
return;
int nCurDepth = oReader.GetDepth();
while (oReader.ReadNextSiblingNode(nCurDepth))
{
const char* sName = XmlUtils::GetNameNoNS(oReader.GetNameChar());
if (strcmp("sortRule", sName) == 0)
{
CSortRule* pSortRule = new CSortRule();
*pSortRule = oReader;
m_arrItems.push_back(pSortRule);
}
else if (strcmp("extLst", sName) == 0)
m_oExtLst = oReader;
}
}
void CSortRules::toXML(NSStringUtils::CStringBuilder& writer, const std::wstring& sName) const
{
writer.StartNode(sName);
writer.StartAttributes();
WritingNullable(m_oSortMethod, writer.WriteAttribute(L"sortMethod", m_oSortMethod->ToString()););
WritingNullable(m_oCaseSensitive, writer.WriteAttribute(L"caseSensitive", *m_oCaseSensitive););
writer.EndAttributes();
for(size_t i = 0; i < m_arrItems.size(); ++i)
{
m_arrItems[i]->toXML(writer, L"sortRule");
}
WritingNullable(m_oExtLst, writer.WriteString(m_oExtLst->toXMLWithNS(L"")););
writer.EndNode(sName);
}
void CSortRules::toPPTY(NSBinPptxRW::CBinaryFileWriter* pWriter) const
{
pWriter->WriteBYTE(NSBinPptxRW::g_nodeAttributeStart);
if(m_oSortMethod.IsInit())
{
pWriter->WriteByte1(0, m_oSortMethod->GetValue());
}
pWriter->WriteBool2(1, m_oCaseSensitive);
pWriter->WriteBYTE(NSBinPptxRW::g_nodeAttributeEnd);
pWriter->WriteRecordArrayOfPointers(0, 0, m_arrItems);
// pWriter->WriteRecord2(1, m_oExtLst);
}
void CSortRules::fromPPTY(NSBinPptxRW::CBinaryFileReader* pReader)
{
LONG _end_rec = pReader->GetPos() + pReader->GetRecordSize() + 4;
pReader->Skip(1); // start attributes
while (true)
{
BYTE _at = pReader->GetUChar_TypeNode();
if (_at == NSBinPptxRW::g_nodeAttributeEnd)
break;
switch (_at)
{
case 0:
{
m_oSortMethod.Init();
m_oSortMethod->SetValue((SimpleTypes::Spreadsheet::ESortMethod)pReader->GetUChar());
break;
}
case 1:
{
m_oCaseSensitive = pReader->GetBool();
break;
}
}
}
while (pReader->GetPos() < _end_rec)
{
BYTE _at = pReader->GetUChar();
switch (_at)
{
case 0:
{
pReader->Skip(4);
ULONG _c = pReader->GetULong();
for (ULONG i = 0; i < _c; ++i)
{
pReader->Skip(1); // type
m_arrItems.push_back(new CSortRule());
m_arrItems.back()->fromPPTY(pReader);
}
break;
}
// case 1:
// {
// m_oExtLst.Init();
// m_oExtLst->fromPPTY(pReader);
// break;
// }
default:
{
pReader->SkipRecord();
break;
}
}
}
pReader->Seek(_end_rec);
}
void CColumnFilter::ReadAttributes(XmlUtils::CXmlLiteReader& oReader)
{
WritingElement_ReadAttributes_StartChar_No_NS(oReader)
WritingElement_ReadAttributes_Read_ifChar( oReader, "colId", m_oColId)
WritingElement_ReadAttributes_Read_else_ifChar( oReader, "id", m_oId)
WritingElement_ReadAttributes_EndChar_No_NS( oReader )
}
void CColumnFilter::fromXML(XmlUtils::CXmlLiteReader& oReader)
{
ReadAttributes(oReader);
if (oReader.IsEmptyNode())
return;
int nCurDepth = oReader.GetDepth();
while (oReader.ReadNextSiblingNode(nCurDepth))
{
const char* sName = XmlUtils::GetNameNoNS(oReader.GetNameChar());
if (strcmp("dxf", sName) == 0)
m_oDxf = oReader;
else if (strcmp("filter", sName) == 0)
{
CFilterColumn* pFilterColumn = new CFilterColumn();
*pFilterColumn = oReader;
m_arrItems.push_back(pFilterColumn);
}
else if (strcmp("extLst", sName) == 0)
m_oExtLst = oReader;
}
}
void CColumnFilter::toXML(NSStringUtils::CStringBuilder& writer, const std::wstring& sName) const
{
writer.StartNode(sName);
writer.StartAttributes();
WritingNullable(m_oColId, writer.WriteAttribute(L"colId", *m_oColId););
WritingNullable(m_oId, writer.WriteAttributeEncodeXml(L"id", *m_oId););
writer.EndAttributes();
WritingNullable(m_oDxf, m_oDxf->toXMLWithNS(writer, L"", L"dxf", L"x:"););
for(size_t i = 0; i < m_arrItems.size(); ++i)
{
m_arrItems[i]->toXMLWithNS(writer, L"", L"filter", L"x:");
}
WritingNullable(m_oExtLst, writer.WriteString(m_oExtLst->toXMLWithNS(L"")););
writer.EndNode(sName);
}
void CColumnFilter::toPPTY(NSBinPptxRW::CBinaryFileWriter* pWriter) const
{
pWriter->WriteBYTE(NSBinPptxRW::g_nodeAttributeStart);
pWriter->WriteUInt2(0, m_oColId);
pWriter->WriteString2(1, m_oId);
pWriter->WriteBYTE(NSBinPptxRW::g_nodeAttributeEnd);
if (m_oDxf.is_init())
{
pWriter->StartRecord(0);
BinXlsxRW::BinaryStyleTableWriter oBinaryStyleTableWriter(*pWriter, &pWriter->m_pCommon->m_pNativePicker->m_oEmbeddedFonts);
DocWrapper::FontProcessor oFontProcessor;
OOX::Spreadsheet::CIndexedColors* pIndexedColors = NULL;
CXlsx* xlsx = dynamic_cast<CXlsx*>(pWriter->m_pMainDocument);
if (xlsx && xlsx->m_pStyles && xlsx->m_pStyles->m_oColors.IsInit() && xlsx->m_pStyles->m_oColors->m_oIndexedColors.IsInit())
{
pIndexedColors = xlsx->m_pStyles->m_oColors->m_oIndexedColors.GetPointer();
}
oBinaryStyleTableWriter.WriteDxf(m_oDxf.get(), pIndexedColors, pWriter->m_pTheme->GetPointer(), oFontProcessor);
pWriter->EndRecord();
}
{
BinXlsxRW::BinaryTableWriter oBinaryTableWriter(*pWriter);
pWriter->StartRecord(1);
pWriter->WriteULONG(m_arrItems.size());
for (_UINT32 i = 0; i < m_arrItems.size(); ++i)
{
pWriter->StartRecord(0);
oBinaryTableWriter.WriteFilterColumn(*m_arrItems[i]);
pWriter->EndRecord();
}
pWriter->EndRecord();
}
// pWriter->WriteRecord2(2, m_oExtLst);
}
void CColumnFilter::fromPPTY(NSBinPptxRW::CBinaryFileReader* pReader)
{
LONG _end_rec = pReader->GetPos() + pReader->GetRecordSize() + 4;
pReader->Skip(1); // start attributes
while (true)
{
BYTE _at = pReader->GetUChar_TypeNode();
if (_at == NSBinPptxRW::g_nodeAttributeEnd)
break;
switch (_at)
{
case 0:
{
m_oColId = pReader->GetULong();
break;
}
case 1:
{
m_oId = pReader->GetString2();
break;
}
}
}
while (pReader->GetPos() < _end_rec)
{
BYTE _at = pReader->GetUChar();
switch (_at)
{
case 0:
{
OOX::Spreadsheet::CStyles oStyles(NULL);
BinXlsxRW::BinaryStyleTableReader style_reader(*pReader, oStyles);
m_oDxf.Init();
style_reader.ReadDxfExternal(m_oDxf.GetPointer());
break;
}
case 1:
{
pReader->Skip(4);
BinXlsxRW::BinaryTableReader table_reader(*pReader, NULL);
ULONG _c = pReader->GetULong();
for (ULONG i = 0; i < _c; ++i)
{
pReader->Skip(1); // type
CFilterColumn* pFilterColumn = new CFilterColumn();
table_reader.ReadFilterColumnExternal(pFilterColumn);
m_arrItems.push_back(pFilterColumn);
}
break;
}
// case 2:
// {
// m_oExtLst.Init();
// m_oExtLst->fromPPTY(pReader);
// break;
// }
default:
{
pReader->SkipRecord();
break;
}
}
}
pReader->Seek(_end_rec);
}
void CNsvFilter::ReadAttributes(XmlUtils::CXmlLiteReader& oReader)
{
WritingElement_ReadAttributes_StartChar_No_NS(oReader)
WritingElement_ReadAttributes_Read_ifChar( oReader, "filterId", m_oFilterId)
WritingElement_ReadAttributes_Read_else_ifChar( oReader, "ref", m_oRef)
WritingElement_ReadAttributes_Read_else_ifChar( oReader, "tableId", m_oTableId)
WritingElement_ReadAttributes_EndChar_No_NS( oReader )
}
void CNsvFilter::fromXML(XmlUtils::CXmlLiteReader& oReader)
{
ReadAttributes(oReader);
if (oReader.IsEmptyNode())
return;
int nCurDepth = oReader.GetDepth();
while (oReader.ReadNextSiblingNode(nCurDepth))
{
const char* sName = XmlUtils::GetNameNoNS(oReader.GetNameChar());
if (strcmp("columnFilter", sName) == 0)
{
CColumnFilter* pColumnFilter = new CColumnFilter();
*pColumnFilter = oReader;
m_arrItems.push_back(pColumnFilter);
}
else if (strcmp("sortRules", sName) == 0)
m_oSortRules = oReader;
else if (strcmp("extLst", sName) == 0)
m_oExtLst = oReader;
}
}
void CNsvFilter::toXML(NSStringUtils::CStringBuilder& writer, const std::wstring& sName) const
{
writer.StartNode(sName);
writer.StartAttributes();
WritingNullable(m_oFilterId, writer.WriteAttributeEncodeXml(L"filterId", *m_oFilterId););
WritingNullable(m_oRef, writer.WriteAttributeEncodeXml(L"ref", *m_oRef););
WritingNullable(m_oTableId, writer.WriteAttribute(L"tableId", *m_oTableId););
writer.EndAttributes();
for(size_t i = 0; i < m_arrItems.size(); ++i)
{
m_arrItems[i]->toXML(writer, L"columnFilter");
}
WritingNullable(m_oSortRules, m_oSortRules->toXML(writer, L"sortRules"););
WritingNullable(m_oExtLst, writer.WriteString(m_oExtLst->toXMLWithNS(L"")););
writer.EndNode(sName);
}
void CNsvFilter::toPPTY(NSBinPptxRW::CBinaryFileWriter* pWriter) const
{
pWriter->WriteBYTE(NSBinPptxRW::g_nodeAttributeStart);
pWriter->WriteString2(0, m_oFilterId);
pWriter->WriteString2(1, m_oRef);
pWriter->WriteUInt2(2, m_oTableId);
pWriter->WriteBYTE(NSBinPptxRW::g_nodeAttributeEnd);
pWriter->WriteRecordArrayOfPointers(0, 0, m_arrItems);
pWriter->WriteRecord2(1, m_oSortRules);
// pWriter->WriteRecord2(2, m_oExtLst);
}
void CNsvFilter::fromPPTY(NSBinPptxRW::CBinaryFileReader* pReader)
{
LONG _end_rec = pReader->GetPos() + pReader->GetRecordSize() + 4;
pReader->Skip(1); // start attributes
while (true)
{
BYTE _at = pReader->GetUChar_TypeNode();
if (_at == NSBinPptxRW::g_nodeAttributeEnd)
break;
switch (_at)
{
case 0:
{
m_oFilterId = pReader->GetString2();
break;
}
case 1:
{
m_oRef = pReader->GetString2();
break;
}
case 2:
{
m_oTableId = pReader->GetULong();
break;
}
}
}
while (pReader->GetPos() < _end_rec)
{
BYTE _at = pReader->GetUChar();
switch (_at)
{
case 0:
{
pReader->Skip(4);
ULONG _c = pReader->GetULong();
for (ULONG i = 0; i < _c; ++i)
{
pReader->Skip(1); // type
m_arrItems.push_back(new CColumnFilter());
m_arrItems.back()->fromPPTY(pReader);
}
break;
}
case 1:
{
m_oSortRules.Init();
m_oSortRules->fromPPTY(pReader);
break;
}
// case 2:
// {
// m_oExtLst.Init();
// m_oExtLst->fromPPTY(pReader);
// break;
// }
default:
{
pReader->SkipRecord();
break;
}
}
}
pReader->Seek(_end_rec);
}
void CNamedSheetView::ReadAttributes(XmlUtils::CXmlLiteReader& oReader)
{
WritingElement_ReadAttributes_StartChar_No_NS(oReader)
WritingElement_ReadAttributes_Read_ifChar( oReader, "name", m_oName)
WritingElement_ReadAttributes_Read_else_ifChar( oReader, "id", m_oId)
WritingElement_ReadAttributes_EndChar_No_NS( oReader )
}
void CNamedSheetView::fromXML(XmlUtils::CXmlLiteReader& oReader)
{
ReadAttributes(oReader);
if (oReader.IsEmptyNode())
return;
int nCurDepth = oReader.GetDepth();
while (oReader.ReadNextSiblingNode(nCurDepth))
{
const char* sName = XmlUtils::GetNameNoNS(oReader.GetNameChar());
if (strcmp("nsvFilter", sName) == 0)
{
CNsvFilter* pNsvFilter = new CNsvFilter();
*pNsvFilter = oReader;
m_arrItems.push_back(pNsvFilter);
}
else if (strcmp("extLst", sName) == 0)
m_oExtLst = oReader;
}
}
void CNamedSheetView::toXML(NSStringUtils::CStringBuilder& writer, const std::wstring& sName) const
{
writer.StartNode(sName);
writer.StartAttributes();
WritingNullable(m_oName, writer.WriteAttributeEncodeXml(L"name", *m_oName););
WritingNullable(m_oId, writer.WriteAttributeEncodeXml(L"id", *m_oId););
writer.EndAttributes();
for(size_t i = 0; i < m_arrItems.size(); ++i)
{
m_arrItems[i]->toXML(writer, L"nsvFilter");
}
WritingNullable(m_oExtLst, writer.WriteString(m_oExtLst->toXMLWithNS(L"")););
writer.EndNode(sName);
}
void CNamedSheetView::toPPTY(NSBinPptxRW::CBinaryFileWriter* pWriter) const
{
pWriter->WriteBYTE(NSBinPptxRW::g_nodeAttributeStart);
pWriter->WriteString2(0, m_oName);
pWriter->WriteString2(1, m_oId);
pWriter->WriteBYTE(NSBinPptxRW::g_nodeAttributeEnd);
pWriter->WriteRecordArrayOfPointers(0, 0, m_arrItems);
// pWriter->WriteRecord2(1, m_oExtLst);
}
void CNamedSheetView::fromPPTY(NSBinPptxRW::CBinaryFileReader* pReader)
{
LONG _end_rec = pReader->GetPos() + pReader->GetRecordSize() + 4;
pReader->Skip(1); // start attributes
while (true)
{
BYTE _at = pReader->GetUChar_TypeNode();
if (_at == NSBinPptxRW::g_nodeAttributeEnd)
break;
switch (_at)
{
case 0:
{
m_oName = pReader->GetString2();
break;
}
case 1:
{
m_oId = pReader->GetString2();
break;
}
}
}
while (pReader->GetPos() < _end_rec)
{
BYTE _at = pReader->GetUChar();
switch (_at)
{
case 0:
{
pReader->Skip(4);
ULONG _c = pReader->GetULong();
for (ULONG i = 0; i < _c; ++i)
{
pReader->Skip(1); // type
m_arrItems.push_back(new CNsvFilter());
m_arrItems.back()->fromPPTY(pReader);
}
break;
}
// case 1:
// {
// m_oExtLst.Init();
// m_oExtLst->fromPPTY(pReader);
// break;
// }
default:
{
pReader->SkipRecord();
break;
}
}
}
pReader->Seek(_end_rec);
}
void CNamedSheetViews::ReadAttributes(XmlUtils::CXmlLiteReader& oReader)
{
WritingElement_ReadAttributes_StartChar_No_NS(oReader)
WritingElement_ReadAttributes_EndChar_No_NS( oReader )
}
void CNamedSheetViews::fromXML(XmlUtils::CXmlLiteReader& oReader)
{
ReadAttributes(oReader);
if (oReader.IsEmptyNode())
return;
int nCurDepth = oReader.GetDepth();
while (oReader.ReadNextSiblingNode(nCurDepth))
{
const char* sName = XmlUtils::GetNameNoNS(oReader.GetNameChar());
if (strcmp("namedSheetView", sName) == 0)
{
CNamedSheetView* pNamedSheetView = new CNamedSheetView();
*pNamedSheetView = oReader;
m_arrItems.push_back(pNamedSheetView);
}
else if (strcmp("extLst", sName) == 0)
m_oExtLst = oReader;
}
}
void CNamedSheetViews::toXML(NSStringUtils::CStringBuilder& writer, const std::wstring& sName) const
{
writer.StartNode(sName);
writer.StartAttributes();
writer.WriteString(L" xmlns=\"http://schemas.microsoft.com/office/spreadsheetml/2019/namedsheetviews\" xmlns:x=\"http://schemas.openxmlformats.org/spreadsheetml/2006/main\"");
writer.EndAttributes();
for(size_t i = 0; i < m_arrItems.size(); ++i)
{
m_arrItems[i]->toXML(writer, L"namedSheetView");
}
WritingNullable(m_oExtLst, writer.WriteString(m_oExtLst->toXMLWithNS(L"")););
writer.EndNode(sName);
}
void CNamedSheetViews::toPPTY(NSBinPptxRW::CBinaryFileWriter* pWriter) const
{
pWriter->WriteBYTE(NSBinPptxRW::g_nodeAttributeStart);
pWriter->WriteBYTE(NSBinPptxRW::g_nodeAttributeEnd);
pWriter->WriteRecordArrayOfPointers(0, 0, m_arrItems);
// pWriter->WriteRecord2(1, m_oExtLst);
}
void CNamedSheetViews::fromPPTY(NSBinPptxRW::CBinaryFileReader* pReader)
{
pReader->Skip(1); // type
LONG _end_rec = pReader->GetPos() + pReader->GetRecordSize() + 4;
pReader->Skip(1); // start attributes
while (true)
{
BYTE _at = pReader->GetUChar_TypeNode();
if (_at == NSBinPptxRW::g_nodeAttributeEnd)
break;
}
while (pReader->GetPos() < _end_rec)
{
BYTE _at = pReader->GetUChar();
switch (_at)
{
case 0:
{
pReader->Skip(4);
ULONG _c = pReader->GetULong();
for (ULONG i = 0; i < _c; ++i)
{
pReader->Skip(1); // type
m_arrItems.push_back(new CNamedSheetView());
m_arrItems.back()->fromPPTY(pReader);
}
break;
}
// case 1:
// {
// m_oExtLst.Init();
// m_oExtLst->fromPPTY(pReader);
// break;
// }
default:
{
pReader->SkipRecord();
break;
}
}
}
pReader->Seek(_end_rec);
}
CNamedSheetViewFile::CNamedSheetViewFile(OOX::Document* pMain) : OOX::FileGlobalEnumerated(pMain), OOX::IFileContainer(pMain)
{
m_bSpreadsheets = true;
}
CNamedSheetViewFile::CNamedSheetViewFile(OOX::Document* pMain, const CPath& oRootPath, const CPath& oPath) : OOX::FileGlobalEnumerated(pMain), OOX::IFileContainer(pMain)
{
m_bSpreadsheets = true;
read( oRootPath, oPath );
}
void CNamedSheetViewFile::read(const CPath& oPath)
{
//don't use this. use read(const CPath& oRootPath, const CPath& oFilePath)
CPath oRootPath;
read(oRootPath, oPath);
}
const OOX::FileType CNamedSheetViewFile::type() const
{
return OOX::Spreadsheet::FileTypes::NamedSheetView;
}
const CPath CNamedSheetViewFile::DefaultDirectory() const
{
return type().DefaultDirectory();
}
const CPath CNamedSheetViewFile::DefaultFileName() const
{
return type().DefaultFileName();
}
const CPath& CNamedSheetViewFile::GetReadPath()
{
return m_oReadPath;
}
void CNamedSheetViewFile::read(const CPath& oRootPath, const CPath& oPath)
{
m_oReadPath = oPath;
IFileContainer::Read( oRootPath, oPath );
XmlUtils::CXmlLiteReader oReader;
if ( !oReader.FromFile( oPath.GetPath() ) )
return;
if ( !oReader.ReadNextNode() )
return;
m_oNamedSheetViews = oReader;
}
void CNamedSheetViewFile::write(const CPath& oPath, const CPath& oDirectory, CContentTypes& oContent) const
{
if(!m_oNamedSheetViews.IsInit())
return;
NSStringUtils::CStringBuilder sXml;
sXml.WriteString(L"<?xml version=\"1.0\" encoding=\"UTF-8\" standalone=\"yes\"?>");
m_oNamedSheetViews->toXML(sXml, L"namedSheetViews");
std::wstring sPath = oPath.GetPath();
NSFile::CFileBinary::SaveToFile(sPath, sXml.GetData());
oContent.Registration( type().OverrideType(), oDirectory, oPath.GetFilename() );
IFileContainer::Write( oPath, oDirectory, oContent );
}
void CNamedSheetViewFile::ReadAttributes(XmlUtils::CXmlLiteReader& oReader)
{
}
} //Spreadsheet
} // namespace OOX