Get previous array on return

This commit is contained in:
Svetlana Kulikova
2024-07-23 18:36:27 +03:00
parent 1b975c7048
commit 2e25f5dc64
3 changed files with 47 additions and 30 deletions

View File

@ -164,48 +164,60 @@ bool CPageRotate::Read(NSOnlineOfficeBinToPdf::CBufferReader* pReader, IMetafile
return true;
}
CHeadings::CHeading::CHeading()
{
nPage = 0;
dY = 0.0;
pParent = NULL;
}
CHeadings::CHeading::~CHeading()
{
for (int i = 0; i < arrHeading.size(); ++i)
RELEASEOBJECT(arrHeading[i]);
}
CHeadings::CHeadings() : IAdvancedCommand(AdvancedCommandType::Headings) {}
const std::vector<CHeadings::CHeading>& CHeadings::GetHeading() { return m_arrHeading; }
CHeadings::~CHeadings()
{
for (int i = 0; i < m_arrHeading.size(); ++i)
RELEASEOBJECT(m_arrHeading[i]);
}
const std::vector<CHeadings::CHeading*>& CHeadings::GetHeading() { return m_arrHeading; }
bool CHeadings::Read(NSOnlineOfficeBinToPdf::CBufferReader* pReader, IMetafileToRenderter* pCorrector)
{
int nPredLevel = 0;
std::vector<CHeading>* arrPredHeading = &m_arrHeading;
std::vector<CHeading>* arrHeading = &m_arrHeading;
std::vector<CHeading*>* arrHeading = &m_arrHeading;
CHeading* pParent = NULL;
int nHeadings = pReader->ReadInt();
for (int i = 0; i < nHeadings; ++i)
{
int nLevel = pReader->ReadInt();
// TODO если первым заголовком приходит заголовок 1+ уровня
// TODO если различие уровня вложенности на 2+
if (nLevel > nPredLevel)
{
arrPredHeading = arrHeading;
arrHeading = &arrHeading->back().arrHeading;
nPredLevel = nLevel;
pParent = arrHeading->back();
arrHeading = &pParent->arrHeading;
}
else if (nLevel < nPredLevel)
{
arrHeading = arrPredHeading;
arrPredHeading = 0; // TODO получить предыдущий массив на возврате
nPredLevel = nLevel;
}
else
{
//m_arrHeading.push_back(oHeading);
pParent = pParent ? pParent->pParent : NULL;
arrHeading = &pParent->arrHeading;
}
nPredLevel = nLevel;
//ReadHeading(pReader, nPredLevel, arrHeading);
CHeading* pHeading = new CHeading();
pHeading->nPage = pReader->ReadInt();
pHeading->dY = pReader->ReadDouble();
pHeading->wsTitle = pReader->ReadString();
pHeading->pParent = pParent;
CHeading oHeading;
oHeading.nPage = pReader->ReadInt();
oHeading.dY = pReader->ReadDouble();
oHeading.wsTitle = pReader->ReadString();
arrHeading->push_back(oHeading);
arrHeading->push_back(pHeading);
}
return true;
}
int CHeadings::ReadHeading(NSOnlineOfficeBinToPdf::CBufferReader* pReader, int nPredLevel, std::vector<CHeading>* arrHeading)
int CHeadings::ReadHeading(NSOnlineOfficeBinToPdf::CBufferReader* pReader, int nPredLevel, std::vector<CHeading*>* arrHeading)
{
CHeading oHeading;
oHeading.nPage = pReader->ReadInt();

View File

@ -178,19 +178,24 @@ public:
std::wstring wsTitle;
int nPage;
double dY;
std::vector<CHeading> arrHeading;
CHeading* pParent;
std::vector<CHeading*> arrHeading;
CHeading();
~CHeading();
};
CHeadings();
~CHeadings();
bool Read(NSOnlineOfficeBinToPdf::CBufferReader* pReader, IMetafileToRenderter* pCorrector);
const std::vector<CHeading>& GetHeading();
const std::vector<CHeading*>& GetHeading();
private:
std::vector<CHeading> m_arrHeading;
std::vector<CHeading*> m_arrHeading;
int ReadHeading(NSOnlineOfficeBinToPdf::CBufferReader* pReader, int nPredLevel, std::vector<CHeading>* arrHeading);
int ReadHeading(NSOnlineOfficeBinToPdf::CBufferReader* pReader, int nPredLevel, std::vector<CHeading*>* arrHeading);
};

View File

@ -2466,20 +2466,20 @@ HRESULT CPdfWriter::AddMetaData(const std::wstring& sMetaName, BYTE* pMetaData,
{
return m_pDocument->AddMetaData(sMetaName, pMetaData, nMetaLength) ? S_OK : S_FALSE;
}
void CreateOutlines(PdfWriter::CDocument* m_pDocument, const std::vector<CHeadings::CHeading>& arrHeadings, PdfWriter::COutline* pParent)
void CreateOutlines(PdfWriter::CDocument* m_pDocument, const std::vector<CHeadings::CHeading*>& arrHeadings, PdfWriter::COutline* pParent)
{
for (int i = 0; i < arrHeadings.size(); ++i)
{
std::string sTitle = U_TO_UTF8(arrHeadings[i].wsTitle);
std::string sTitle = U_TO_UTF8(arrHeadings[i]->wsTitle);
PdfWriter::COutline* pOutline = m_pDocument->CreateOutline(pParent, sTitle.c_str());
PdfWriter::CPage* pPageD = m_pDocument->GetPage(arrHeadings[i].nPage);
PdfWriter::CPage* pPageD = m_pDocument->GetPage(arrHeadings[i]->nPage);
PdfWriter::CDestination* pDest = m_pDocument->CreateDestination(pPageD);
if (pDest)
{
pOutline->SetDestination(pDest);
pDest->SetXYZ(0, arrHeadings[i].dY, 0);
pDest->SetXYZ(0, arrHeadings[i]->dY, 0);
}
CreateOutlines(m_pDocument, arrHeadings[i].arrHeading, pOutline);
CreateOutlines(m_pDocument, arrHeadings[i]->arrHeading, pOutline);
}
}
void CPdfWriter::SetHeadings(CHeadings* pCommand)