diff --git a/ASCOfficePPTFile/PPTFormatLib/PPTXWriter/Converter.cpp b/ASCOfficePPTFile/PPTFormatLib/PPTXWriter/Converter.cpp index aea0fbdc10..9cdc13c330 100644 --- a/ASCOfficePPTFile/PPTFormatLib/PPTXWriter/Converter.cpp +++ b/ASCOfficePPTFile/PPTFormatLib/PPTXWriter/Converter.cpp @@ -618,14 +618,14 @@ void PPT_FORMAT::CPPTXWriter::WriteThemes() } else { - WriteRoundTripThemes(arrRT, nIndexTheme); + WriteRoundTripThemes(arrRT, nIndexTheme, nStartLayout); } WriteTheme(m_pDocument->m_pNotesMaster, nIndexTheme, nStartLayout); WriteTheme(m_pDocument->m_pHandoutMaster, nIndexTheme, nStartLayout); } -void CPPTXWriter::WriteRoundTripThemes(const std::vector& arrRTThemes, int& nIndexTheme) +void CPPTXWriter::WriteRoundTripThemes(const std::vector& arrRTThemes, int& nIndexTheme, int & nStartLayout) { PPT_FORMAT::CRelsGenerator themeRels(&m_oManager); std::unordered_set writedFilesHash; @@ -721,6 +721,9 @@ void CPPTXWriter::WriteRoundTripThemes(const std::vectorm_arThemes.empty()) + WriteLayoutAfterTheme(m_pDocument->m_arThemes[0], nIndexTheme, nStartLayout); } void PPT_FORMAT::CPPTXWriter::WriteTheme(CThemePtr pTheme, int & nIndexTheme, int & nStartLayout) @@ -1549,6 +1552,191 @@ void PPT_FORMAT::CPPTXWriter::WriteNotes() } } +void CPPTXWriter::WriteLayoutAfterTheme(CThemePtr pTheme, const int nIndexTheme, int &nStartLayout) +{ + CRelsGenerator oRels(&m_oManager); + int nCountLayouts = (int)pTheme->m_arLayouts.size(); + oRels.StartMaster(nIndexTheme, nStartLayout, nCountLayouts); + + CStringWriter oWriter; + oWriter.WriteString(L""); + + if (pTheme->m_eType == typeMaster) + { + oWriter.WriteString(L""); + } + else if (pTheme->m_eType == typeNotesMaster) + { + oWriter.WriteString(L""); + } + else if (pTheme->m_eType == typeHandoutMaster) + { + oWriter.WriteString(L""); + } + oWriter.WriteString(L""); + + if (pTheme->m_bIsBackground) + { + WriteBackground(oWriter, oRels, pTheme->m_oBackground); + } + oWriter.WriteString(L"\ + "); + + CGroupElement *pGroupElement = !pTheme->m_arElements.empty() ? dynamic_cast(pTheme->m_arElements[0].get()) : NULL; + + size_t start_index = 0; + if (pGroupElement) + { + for (size_t i = 0; i < pGroupElement->m_pChildElements.size(); ++i) + { + if (isBodyPlaceholder(pGroupElement->m_pChildElements[i]->m_lPlaceholderType)) + pGroupElement->m_pChildElements[i]->m_lPlaceholderType = 100; //body тип прописывать !! + + //if (pGroupElement->m_pChildElements[i]->m_bAnchorEnabled == false && + // pGroupElement->m_pChildElements[i]->m_bChildAnchorEnabled == false) + // continue; + + //if (pTheme->m_eType == typeNotesMaster) + //{ + // pGroupElement->m_pChildElements[i]->m_lPlaceholderID = -1; + //} + //else if (pTheme->m_eType == typeHandoutMaster) + //{ + // pGroupElement->m_pChildElements[i]->m_lPlaceholderID = -1; + // pGroupElement->m_pChildElements[i]->m_lPlaceholderSizePreset = -1; + //} + WriteElement(oWriter, oRels, pGroupElement->m_pChildElements[i]); + } + + start_index = 1; + } + + for (size_t i = start_index; i < pTheme->m_arElements.size(); ++i) + { + if (isBodyPlaceholder(pTheme->m_arElements[i]->m_lPlaceholderType)) + pTheme->m_arElements[i]->m_lPlaceholderType = 100; //body тип прописывать !! + + //if (pTheme->m_arElements[i]->m_bAnchorEnabled == false && + // pTheme->m_arElements[i]->m_bChildAnchorEnabled == false) + // continue; + + //if (pTheme->m_eType == typeNotesMaster) + //{ + // pTheme->m_arElements[i]->m_lPlaceholderID = -1; + //} + //else if (pTheme->m_eType == typeHandoutMaster) + //{ + // pTheme->m_arElements[i]->m_lPlaceholderID = -1; + // pTheme->m_arElements[i]->m_lPlaceholderSizePreset = -1; + //} + + WriteElement(oWriter, oRels, pTheme->m_arElements[i]); + } + + oWriter.WriteString(std::wstring(L"")); + + std::wstring strOverrideColorScheme = _T(""); + oWriter.WriteString(strOverrideColorScheme); + + if (pTheme->m_eType == typeMaster) + { + oWriter.WriteString(std::wstring(L"")); + + size_t __nCountLayouts = 0; + for (int nIndexLayout = 0; nIndexLayout < nCountLayouts; ++nIndexLayout) + { + oWriter.WriteString(L""); + + WriteLayout(pTheme->m_arLayouts[nIndexLayout], nIndexLayout, nStartLayout, nIndexTheme); + } + + oWriter.WriteString(std::wstring(L"")); + } + + if (pTheme->m_bHasDate || pTheme->m_bHasFooter || pTheme->m_bHasSlideNumber) + { + oWriter.WriteString(std::wstring(L"m_bHasDate) oWriter.WriteString(std::wstring(L" dt=\"0\"")); + if (!pTheme->m_bHasSlideNumber) oWriter.WriteString(std::wstring(L" sldNum=\"0\"")); + oWriter.WriteString(std::wstring(L" hdr=\"0\"")); + if (!pTheme->m_bHasFooter) oWriter.WriteString(std::wstring(L" ftr=\"0\"")); + oWriter.WriteString(std::wstring(L"/>")); + } + CStylesWriter styleWriter; + styleWriter.m_pTheme = pTheme.get(); + + if (pTheme->m_eType == typeMaster) + { + oWriter.WriteString(std::wstring(L"")); + + oWriter.WriteString(std::wstring(L"")); + styleWriter.ConvertStyles(pTheme->m_pStyles[1], oWriter, 9); + oWriter.WriteString(std::wstring(L"")); + + oWriter.WriteString(std::wstring(L"")); + styleWriter.ConvertStyles(pTheme->m_pStyles[2], oWriter, 9); + oWriter.WriteString(std::wstring(L"")); + + oWriter.WriteString(std::wstring(L"")); + styleWriter.ConvertStyles(pTheme->m_pStyles[3], oWriter, 9); + oWriter.WriteString(std::wstring(L"")); + + oWriter.WriteString(std::wstring(L"")); + } + else if (pTheme->m_eType == typeNotesMaster) + { + oWriter.WriteString(std::wstring(L"")); + styleWriter.ConvertStyles(pTheme->m_pStyles[1], oWriter, 9); + oWriter.WriteString(std::wstring(L"")); + } + + std::wstring strPptDirectory = m_strTempDirectory + FILE_SEPARATOR_STR + _T("ppt") + FILE_SEPARATOR_STR ; + + std::wstring strSlideMasterFile; + std::wstring strSlideMasterRelsFile; + if (pTheme->m_eType == typeMaster) + { + oWriter.WriteString(std::wstring(L"")); + + strSlideMasterFile = L"slideMaster" + std::to_wstring(nIndexTheme + 1) + L".xml"; + strSlideMasterFile = strPptDirectory + _T("slideMasters") + FILE_SEPARATOR_STR + strSlideMasterFile; + + strSlideMasterRelsFile = L"slideMaster" + std::to_wstring(nIndexTheme + 1) + L".xml.rels"; + strSlideMasterRelsFile = strPptDirectory + _T("slideMasters") + FILE_SEPARATOR_STR + _T("_rels") + FILE_SEPARATOR_STR + strSlideMasterRelsFile; + } + else if (pTheme->m_eType == typeNotesMaster) + { + oWriter.WriteString(std::wstring(L"")); + + strSlideMasterFile = L"notesMaster1.xml"; + strSlideMasterFile = strPptDirectory + _T("notesMasters") + FILE_SEPARATOR_STR + strSlideMasterFile; + + strSlideMasterRelsFile = L"notesMaster1.xml.rels"; + strSlideMasterRelsFile = strPptDirectory + _T("notesMasters") + FILE_SEPARATOR_STR + _T("_rels") + FILE_SEPARATOR_STR + strSlideMasterRelsFile; + } + else if (pTheme->m_eType == typeHandoutMaster) + { + oWriter.WriteString(std::wstring(L"")); + + strSlideMasterFile = L"handoutMaster1.xml"; + strSlideMasterFile = strPptDirectory + _T("handoutMasters") + FILE_SEPARATOR_STR + strSlideMasterFile; + + strSlideMasterRelsFile = L"handoutMaster1.xml.rels"; + strSlideMasterRelsFile = strPptDirectory + _T("handoutMasters") + FILE_SEPARATOR_STR + _T("_rels") + FILE_SEPARATOR_STR + strSlideMasterRelsFile; + } + + CFile oFile; + oFile.CreateFile(strSlideMasterFile); + std::wstring strMaster = oWriter.GetData(); + oFile.WriteStringUTF8(strMaster); + oFile.CloseFile(); + + oRels.CloseRels(); + oRels.SaveRels(strSlideMasterRelsFile); + + nStartLayout += nCountLayouts; +} + void PPT_FORMAT::CPPTXWriter::WriteTiming(CStringWriter& oWriter, CRelsGenerator &oRels, int nIndexSlide) { diff --git a/ASCOfficePPTFile/PPTFormatLib/PPTXWriter/Converter.h b/ASCOfficePPTFile/PPTFormatLib/PPTXWriter/Converter.h index 457af07820..f9e41bd4b3 100644 --- a/ASCOfficePPTFile/PPTFormatLib/PPTXWriter/Converter.h +++ b/ASCOfficePPTFile/PPTFormatLib/PPTXWriter/Converter.h @@ -75,12 +75,13 @@ namespace PPT_FORMAT void WritePresInfo (); void WriteAll (); void WriteThemes (); - void WriteRoundTripThemes(const std::vector &arrRTThemes, int& nIndexTheme); + void WriteRoundTripThemes(const std::vector &arrRTThemes, int& nIndexTheme, int &nStartLayout); void WriteTheme (CThemePtr pTheme, int & nIndexTheme, int & nStartLayout); void WriteTheme (CRecordRoundTripThemeAtom *pTheme, int &nIndexTheme); void WriteSlides (); void WriteNotes (); - void WriteLayout (CLayoutPtr pLayout, int nIndexLayout, int nStartLayout, int nIndexTheme); + void WriteLayoutAfterTheme (CThemePtr pTheme, const int nIndexTheme, int &nStartLayout); + void WriteLayout (CLayoutPtr pLayout, int nIndexLayout, int nStartLayout, int nIndexTheme); void WriteSlide (int nIndexSlide); void WriteNotes (int nIndexNotes); void WriteTiming (CStringWriter& oWriter, CRelsGenerator &oRels, int nIndexSlide); // TODO write spec class for timing diff --git a/ASCOfficePPTFile/PPTFormatLib/Reader/PPTDocumentInfoOneUser.cpp b/ASCOfficePPTFile/PPTFormatLib/Reader/PPTDocumentInfoOneUser.cpp index b2f038d0ad..810df439d8 100644 --- a/ASCOfficePPTFile/PPTFormatLib/Reader/PPTDocumentInfoOneUser.cpp +++ b/ASCOfficePPTFile/PPTFormatLib/Reader/PPTDocumentInfoOneUser.cpp @@ -1635,10 +1635,14 @@ void CPPTUserInfo::LoadMainMaster(_UINT32 dwMasterID) for (auto& oMaster : m_mapMasters) - oMaster.second->GetRecordsByType(&pTheme->m_arrZipXml, false); + if (oMaster.second != nullptr) + oMaster.second->GetRecordsByType(&pTheme->m_arrZipXml, false); // for (auto& oNoteMaster : m_mapNotesMasters) -// oNoteMaster.second->GetRecordsByType(&pTheme->m_arrZipXml, false); +// if (oNoteMaster.second != nullptr) +// oNoteMaster.second->GetRecordsByType(&pTheme->m_arrZipXml, false); + // for (auto& oHandoutMaster : m_mapHandoutMasters) +// if (oHandoutMaster.second != nullptr) // oHandoutMaster.second->GetRecordsByType(&pTheme->m_arrZipXml, false); if (lLayoutID >= 0 && false == pTheme->m_arLayouts.empty())