mirror of
https://github.com/ONLYOFFICE/core.git
synced 2026-02-10 18:05:41 +08:00
Get previous array on return
This commit is contained in:
@ -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();
|
||||
|
||||
@ -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);
|
||||
};
|
||||
|
||||
|
||||
|
||||
@ -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)
|
||||
|
||||
Reference in New Issue
Block a user