From bd04ab5efea069d5aa9dbaa323c47c5a1b3c3ca1 Mon Sep 17 00:00:00 2001 From: "Elen.Subbotina" Date: Thu, 5 Nov 2015 17:27:50 +0000 Subject: [PATCH] PPTFormat git-svn-id: svn://fileserver/activex/AVS/Sources/TeamlabOffice/trunk/ServerComponents@65623 954022d7-b5bf-4e40-9824-e11837661b57 --- .../Reader/PPTDocumentInfoOneUser.cpp | 181 +++++++++++++----- ASCPresentationEditor/OfficeDrawing/Layout.h | 1 + ASCPresentationEditor/OfficeDrawing/Slide.h | 2 +- .../PPTXWriter/Converter.cpp | 26 ++- .../PPTXWriter/ShapeWriter.cpp | 17 +- 5 files changed, 160 insertions(+), 67 deletions(-) diff --git a/ASCOfficePPTFile/PPTFormatLib/Reader/PPTDocumentInfoOneUser.cpp b/ASCOfficePPTFile/PPTFormatLib/Reader/PPTDocumentInfoOneUser.cpp index 893b144441..4e0870ddb8 100644 --- a/ASCOfficePPTFile/PPTFormatLib/Reader/PPTDocumentInfoOneUser.cpp +++ b/ASCOfficePPTFile/PPTFormatLib/Reader/PPTDocumentInfoOneUser.cpp @@ -465,7 +465,13 @@ void CPPTUserInfo::LoadSlide(DWORD dwSlideID, CSlide* pSlide) //????? ñëàéäó íå ïðèñâîåíà òåìà !!! pPairTheme = m_mapMasterToTheme.begin(); } +//------------------íàëè÷èå êîëîíòèòóëîâ + std::vector oArrayHeadersFootersAtoms; + pRecordSlide->GetRecordsByType(&oArrayHeadersFootersAtoms, true, true); + CRecordHeadersFootersAtom* headers_footers = NULL; + if (!oArrayHeadersFootersAtoms.empty()) headers_footers = oArrayHeadersFootersAtoms[0]; +//----------------- pSlide->m_lThemeID = pPairTheme->second; CTheme * pTheme = &m_arThemes [pSlide->m_lThemeID]; @@ -487,12 +493,6 @@ void CPPTUserInfo::LoadSlide(DWORD dwSlideID, CSlide* pSlide) if (pPairLayoutGeom == pTheme->m_mapGeomToLayout.end()) { - std::vector oArrayHeadersFootersAtoms; - pRecordSlide->GetRecordsByType(&oArrayHeadersFootersAtoms, true, true); - - CRecordHeadersFootersAtom* headers_footers = NULL; - if (!oArrayHeadersFootersAtoms.empty()) headers_footers = oArrayHeadersFootersAtoms[0]; - pSlide->m_lLayoutID = AddNewLayout(pTheme, &oArraySlideAtoms[0]->m_oLayout, pRecordSlide->m_oPersist.m_arTextAttrs, headers_footers); pLayout = &pTheme->m_arLayouts[pSlide->m_lLayoutID]; pLayout->m_bShowMasterShapes = true; @@ -545,6 +545,16 @@ void CPPTUserInfo::LoadSlide(DWORD dwSlideID, CSlide* pSlide) } } } + std::vector oArrayStrings; + pRecordSlide->GetRecordsByType(&oArrayStrings, false, false); + + for (int i=0; i < oArrayStrings.size(); i++) + { + if (oArrayStrings[i]->m_oHeader.RecType == 0x0fba) + { + pSlide->m_sName = oArrayStrings[i]->m_strText; + } + } // ÷èòàåì âñå ýëåìåíòû... std::vector oArrayShapes; @@ -553,7 +563,7 @@ void CPPTUserInfo::LoadSlide(DWORD dwSlideID, CSlide* pSlide) pSlide->m_bShowMasterShapes = bMasterObjects; pSlide->m_bIsBackground = false; - std::vector slidePlaceholders; + std::map slidePlaceholders; for (int nShape = 0; nShape < oArrayShapes.size(); ++nShape) { @@ -585,19 +595,45 @@ void CPPTUserInfo::LoadSlide(DWORD dwSlideID, CSlide* pSlide) pSlide->m_arElements.push_back(pElem); } if (pElem->m_lPlaceholderType > 0 ) - slidePlaceholders.push_back( pElem->m_lPlaceholderType ); + slidePlaceholders.insert(std::pair(pElem->m_lPlaceholderType, pSlide->m_arElements.size() - 1) ); } } +//------------- êîëîíòèòóëû íà ñëàéäå (íàñëåäóåìûå) + std::map::iterator it; + + it = pLayout->m_pPlaceholders.find(NSOfficePPT::MasterSlideNumber); + if ( it != pLayout->m_pPlaceholders.end() && + slidePlaceholders.find(NSOfficePPT::MasterSlideNumber) == slidePlaceholders.end()) + { + IElement* pElement = pLayout->m_arElements[it->second]->CreateDublicate(); + pSlide->m_arElements.push_back(pElement); + + } + + it = pLayout->m_pPlaceholders.find(MasterDate); + if ( it != pLayout->m_pPlaceholders.end() && + slidePlaceholders.find(NSOfficePPT::MasterDate) == slidePlaceholders.end()) + { + IElement* pElement = pLayout->m_arElements[it->second]->CreateDublicate(); + pSlide->m_arElements.push_back(pElement); + } + + it = pLayout->m_pPlaceholders.find(MasterHeader); + if ( it != pLayout->m_pPlaceholders.end() && + slidePlaceholders.find(NSOfficePPT::MasterHeader) == slidePlaceholders.end()) + { + IElement* pElement = pLayout->m_arElements[it->second]->CreateDublicate(); + pSlide->m_arElements.push_back(pElement); + } + + it = pLayout->m_pPlaceholders.find(MasterFooter); + if ( it != pLayout->m_pPlaceholders.end() && + slidePlaceholders.find(NSOfficePPT::MasterFooter) == slidePlaceholders.end()) + { + IElement* pElement = pLayout->m_arElements[it->second]->CreateDublicate(); + pSlide->m_arElements.push_back(pElement); + } - //ýëåìåíòû èç øàáëîíà êîòîðûå ÿâíî íà ñëàéäå íå ïðîïèñàíû - //for (std::map::iterator it = pLayout->m_pPlaceholders.begin(); it != pLayout->m_pPlaceholders.end(); it++) - //{ - // if ( std::find(slidePlaceholders.begin(), slidePlaceholders.end(), it->first) == slidePlaceholders.end() ) - // { - // IElement * elm = pLayout->m_arElements[it->second]->CreateDublicate(); - // pSlide->m_arElements.push_back(elm); - // } - //} } IElement* CPPTUserInfo::AddNewLayoutElement (CLayout *pLayout, int placeholderType, int placeholderSizePreset) @@ -677,7 +713,37 @@ int CPPTUserInfo::AddNewLayout(NSPresentationEditor::CTheme* pTheme, SSlideLayou for (int i = 0 ; i < 8; i ++) { if (layoutRecord->m_pPlaceHolderID[i] == 0) break; - AddNewLayoutElement(pLayout, layoutRecord->m_pPlaceHolderID[i], defObjSize); + + switch(layoutRecord->m_pPlaceHolderID[i]) + { + case NSOfficePPT::MasterTitle : + case NSOfficePPT::MasterBody : + case NSOfficePPT::MasterCenteredTitle : + case NSOfficePPT::MasterSubtitle : + case NSOfficePPT::MasterNotesSlideImage : + case NSOfficePPT::MasterNotesBody: + case NSOfficePPT::MasterSlideNumber: + case NSOfficePPT::MasterDate: + case NSOfficePPT::MasterHeader: + case NSOfficePPT::MasterFooter: + { + int usualType = layoutRecord->m_pPlaceHolderID[i]; + CorrectPlaceholderType(usualType); + + std::map::iterator it = pTheme->m_pPlaceholders.find(NSOfficePPT::MasterSlideNumber); + if (it != pTheme->m_pPlaceholders.end()) + { + IElement* pElement = pTheme->m_arElements[it->second]->CreateDublicate(); + pLayout->m_arElements.push_back(dynamic_cast(pElement)); + pLayout->m_pPlaceholders.insert(std::pair(NSOfficePPT::MasterSlideNumber, pLayout->m_arElements.size()-1)); + } + else + AddNewLayoutElement(pLayout, usualType, defObjSize); + }break; + default: + AddNewLayoutElement(pLayout, layoutRecord->m_pPlaceHolderID[i], defObjSize); + break; + } } if (headers_footers) @@ -690,14 +756,15 @@ int CPPTUserInfo::AddNewLayout(NSPresentationEditor::CTheme* pTheme, SSlideLayou it = pLayout->m_pPlaceholders.find(NSOfficePPT::MasterSlideNumber); if ( it == pLayout->m_pPlaceholders.end()) { - pElement = AddNewLayoutElement(pLayout, MasterSlideNumber, 4); - } - else - { - pElement = pLayout->m_arElements[it->second]; - } - if (pElement) - { + it = pTheme->m_pPlaceholders.find(NSOfficePPT::MasterSlideNumber); + if (it != pTheme->m_pPlaceholders.end()) + { + pElement = pTheme->m_arElements[it->second]->CreateDublicate(); + pLayout->m_arElements.push_back(dynamic_cast(pElement)); + pLayout->m_pPlaceholders.insert(std::pair(NSOfficePPT::MasterSlideNumber, pLayout->m_arElements.size()-1)); + } + else + pElement = AddNewLayoutElement(pLayout, MasterSlideNumber, 4); } } if (headers_footers->m_bHasTodayDate || @@ -708,14 +775,15 @@ int CPPTUserInfo::AddNewLayout(NSPresentationEditor::CTheme* pTheme, SSlideLayou it = pLayout->m_pPlaceholders.find(MasterDate); if (it == pLayout->m_pPlaceholders.end()) { - pElement = AddNewLayoutElement(pLayout, MasterDate, 2); - } - else - { - pElement = pLayout->m_arElements[it->second]; - } - if (pElement) - { + it = pTheme->m_pPlaceholders.find(NSOfficePPT::MasterDate); + if (it != pTheme->m_pPlaceholders.end()) + { + pElement = pTheme->m_arElements[it->second]->CreateDublicate(); + pLayout->m_arElements.push_back(dynamic_cast(pElement)); + pLayout->m_pPlaceholders.insert(std::pair(NSOfficePPT::MasterDate, pLayout->m_arElements.size()-1)); + } + else + pElement = AddNewLayoutElement(pLayout, MasterDate, 2); } } if (headers_footers->m_bHasHeader) @@ -724,14 +792,15 @@ int CPPTUserInfo::AddNewLayout(NSPresentationEditor::CTheme* pTheme, SSlideLayou it = pLayout->m_pPlaceholders.find(MasterHeader); if (it == pLayout->m_pPlaceholders.end()) { - pElement = AddNewLayoutElement(pLayout, MasterHeader, 2); - } - else - { - pElement = pLayout->m_arElements[it->second]; - } - if (pElement) - { + it = pTheme->m_pPlaceholders.find(NSOfficePPT::MasterHeader); + if (it != pTheme->m_pPlaceholders.end()) + { + pElement = pTheme->m_arElements[it->second]->CreateDublicate(); + pLayout->m_arElements.push_back(dynamic_cast(pElement)); + pLayout->m_pPlaceholders.insert(std::pair(NSOfficePPT::MasterHeader, pLayout->m_arElements.size()-1)); + } + else + pElement = AddNewLayoutElement(pLayout, MasterHeader, 2); } } if (headers_footers->m_bHasFooter) @@ -740,14 +809,15 @@ int CPPTUserInfo::AddNewLayout(NSPresentationEditor::CTheme* pTheme, SSlideLayou it = pLayout->m_pPlaceholders.find(MasterFooter); if (it == pLayout->m_pPlaceholders.end()) { - pElement = AddNewLayoutElement(pLayout, MasterFooter, 4); - } - else - { - pElement = pLayout->m_arElements[it->second]; - } - if (pElement) - { + it = pTheme->m_pPlaceholders.find(NSOfficePPT::MasterFooter); + if (it != pTheme->m_pPlaceholders.end()) + { + pElement = pTheme->m_arElements[it->second]->CreateDublicate(); + pLayout->m_arElements.push_back(dynamic_cast(pElement)); + pLayout->m_pPlaceholders.insert(std::pair(NSOfficePPT::MasterFooter, pLayout->m_arElements.size()-1)); + } + else + pElement = AddNewLayoutElement(pLayout, MasterFooter, 4); } } } @@ -960,6 +1030,7 @@ void CPPTUserInfo::LoadMainMaster(DWORD dwMasterID, const LONG& lOriginWidth, co continue; } pTheme->m_arElements.push_back(pElem); + if ( pElem->m_lPlaceholderType >0) pTheme->m_pPlaceholders.insert(std::pair(pElem->m_lPlaceholderType, pTheme->m_arElements.size()-1)); @@ -1139,6 +1210,16 @@ void CPPTUserInfo::LoadNoMainMaster(DWORD dwMasterID, const LONG& lOriginWidth, } } } + std::vector oArrayStrings; + pCurMaster->GetRecordsByType(&oArrayStrings, false, false); + + for (int i=0; i < oArrayStrings.size(); i++) + { + if (oArrayStrings[i]->m_oHeader.RecType == 0x0fba) + { + pLayout->m_sName = oArrayStrings[i]->m_strText; + } + } // ÷èòàåì âñå ýëåìåíòû... std::vector oArrayShapes; pCurMaster->GetRecordsByType(&oArrayShapes, true); diff --git a/ASCPresentationEditor/OfficeDrawing/Layout.h b/ASCPresentationEditor/OfficeDrawing/Layout.h index dfaf6c24d7..f242a4d0d2 100644 --- a/ASCPresentationEditor/OfficeDrawing/Layout.h +++ b/ASCPresentationEditor/OfficeDrawing/Layout.h @@ -29,6 +29,7 @@ namespace NSPresentationEditor bool m_bShowMasterShapes; std::wstring m_strLayoutType; + std::wstring m_sName; public: CLayout() { diff --git a/ASCPresentationEditor/OfficeDrawing/Slide.h b/ASCPresentationEditor/OfficeDrawing/Slide.h index 2058bab646..282a1c442e 100644 --- a/ASCPresentationEditor/OfficeDrawing/Slide.h +++ b/ASCPresentationEditor/OfficeDrawing/Slide.h @@ -35,7 +35,7 @@ namespace NSPresentationEditor CMetricInfo m_oInfo; CString m_strComment; - + std::wstring m_sName; public: CSlide() : m_arElements(), m_oSlideShow() { diff --git a/ASCPresentationEditor/PPTXWriter/Converter.cpp b/ASCPresentationEditor/PPTXWriter/Converter.cpp index 3e997a3822..599f514a8c 100644 --- a/ASCPresentationEditor/PPTXWriter/Converter.cpp +++ b/ASCPresentationEditor/PPTXWriter/Converter.cpp @@ -776,7 +776,11 @@ void NSPresentationEditor::CPPTXWriter::WriteLayout(CLayout& oLayout, int nIndex oWriter.WriteString(std::wstring(L"")); + oWriter.WriteString(std::wstring(L"\" preserve=\"1\">")); if (oLayout.m_bIsBackground) { @@ -789,7 +793,9 @@ void NSPresentationEditor::CPPTXWriter::WriteLayout(CLayout& oLayout, int nIndex size_t nElements = oLayout.m_arElements.size(); for (size_t nEl = 0; nEl < nElements; ++nEl) + { WriteElement(oWriter, oRels, oLayout.m_arElements[nEl]); + } oWriter.WriteString(std::wstring(L"")); @@ -830,20 +836,23 @@ void NSPresentationEditor::CPPTXWriter::WriteSlide(int nIndexSlide) oRels.StartSlide(nLayout, nIndexSlide); } - CString str1 = _T(""); - oWriter.WriteString(str1); + oWriter.WriteString(std::wstring(L"")); + oWriter.WriteString(std::wstring(L"m_sName.empty() == false) + oWriter.WriteString(std::wstring(L" name=\"") + pSlide->m_sName + std::wstring(L"\"")); + + oWriter.WriteString(std::wstring(L">")); if (pSlide->m_bIsBackground) { WriteBackground(oWriter, oRels, pSlide->m_oBackground); } - CString strElems = _T("\ -"); - oWriter.WriteString(strElems); + oWriter.WriteString(std::wstring(L"\ +")); - size_t nElements = pSlide->m_arElements.size(); - for (size_t nEl = 0; nEl < nElements; ++nEl) + for (size_t nEl = 0; nEl < pSlide->m_arElements.size(); ++nEl) { WriteElement(oWriter, oRels, pSlide->m_arElements[nEl], &m_pDocument->m_arThemes[pSlide->m_lThemeID].m_arLayouts[pSlide->m_lLayoutID]); } @@ -874,6 +883,7 @@ void NSPresentationEditor::CPPTXWriter::WriteSlide(int nIndexSlide) void NSPresentationEditor::CPPTXWriter::WriteSlides() { size_t nCountSlides = m_pDocument->m_arSlides.size(); + for (size_t nIndexS = 0; nIndexS < nCountSlides; ++nIndexS) { CRelsGenerator::StartNotes((int)nIndexS, m_strTempDirectory, m_pDocument->m_arSlides[nIndexS]->m_strComment); diff --git a/ASCPresentationEditor/PPTXWriter/ShapeWriter.cpp b/ASCPresentationEditor/PPTXWriter/ShapeWriter.cpp index e0b7989c5c..3219027d44 100644 --- a/ASCPresentationEditor/PPTXWriter/ShapeWriter.cpp +++ b/ASCPresentationEditor/PPTXWriter/ShapeWriter.cpp @@ -895,12 +895,6 @@ void NSPresentationEditor::CShapeWriter::WriteTextInfo() std::wstring typeRun = L"a:r"; - //if (m_pShapeElement->m_lPlaceholderType == PT_MasterSlideNumber) - //{ - // m_oWriter.WriteString(std::wstring(L"")); - // m_oWriter.WriteString(std::wstring(L"‹#›")); - //} - size_t nCountSpans = pParagraph->m_arSpans.size(); for (size_t nSpan = 0; nSpan < nCountSpans; ++nSpan) { @@ -945,10 +939,14 @@ void NSPresentationEditor::CShapeWriter::WriteTextInfo() } else { - if (m_pShapeElement->m_lPlaceholderType == PT_MasterSlideNumber)//todooo + date + if (m_pShapeElement->m_lPlaceholderType == PT_MasterSlideNumber) { m_oWriter.WriteString(std::wstring(L"m_lPlaceholderType == PT_MasterDate) + { + m_oWriter.WriteString(std::wstring(L""); m_oWriter.WriteString(strT2); - if (m_pShapeElement->m_lPlaceholderType == PT_MasterSlideNumber) + if (m_pShapeElement->m_lPlaceholderType == PT_MasterSlideNumber || + m_pShapeElement->m_lPlaceholderType == PT_MasterDate) + { m_oWriter.WriteString(std::wstring(L"")); + } else m_oWriter.WriteString(std::wstring(L"")); }