28#include <com/sun/star/container/XNamed.hpp>
29#include <com/sun/star/drawing/XMasterPagesSupplier.hpp>
30#include <com/sun/star/drawing/XDrawPages.hpp>
31#include <com/sun/star/drawing/XDrawPagesSupplier.hpp>
32#include <com/sun/star/drawing/XMasterPageTarget.hpp>
33#include <com/sun/star/frame/XModel.hpp>
34#include <com/sun/star/io/XInputStream.hpp>
35#include <com/sun/star/text/XTextField.hpp>
36#include <com/sun/star/xml/dom/XDocument.hpp>
37#include <com/sun/star/xml/sax/XFastSAXSerializable.hpp>
38#include <com/sun/star/presentation/XPresentationPage.hpp>
39#include <com/sun/star/task/XStatusIndicator.hpp>
40#include <com/sun/star/presentation/XCustomPresentationSupplier.hpp>
41#include <com/sun/star/container/XIndexContainer.hpp>
42#include <com/sun/star/lang/XMultiServiceFactory.hpp>
43#include <com/sun/star/lang/XSingleServiceFactory.hpp>
44#include <com/sun/star/container/XNameContainer.hpp>
58#include <oox/token/namespaces.hxx>
59#include <oox/token/tokens.hxx>
61#include <com/sun/star/office/XAnnotation.hpp>
62#include <com/sun/star/office/XAnnotationAccess.hpp>
94 : FragmentHandler2( rFilter, rFragmentPath )
96 , mbCommentAuthorsRead(false)
99 for (
auto & elem : rParagraphDefaultsVector)
103 elem.getParaBottomMargin() = TextSpacing( 0 );
113 sal_Int32 nMaxPages = rSlidePersist.size();
114 for (sal_Int32 nPage = 0; nPage < nMaxPages; nPage++)
116 auto aShapeMap = rSlidePersist[nPage]->getShapeMap();
117 auto aIter = std::find_if(aShapeMap.begin(), aShapeMap.end(),
118 [](
const std::pair<OUString, ShapePtr>& element) {
119 auto pShapePtr = element.second;
121 && (pShapePtr->getSubType() == XML_title
122 || pShapePtr->getSubType() == XML_ctrTitle));
124 if (aIter != aShapeMap.end())
127 Reference<text::XTextRange> xText(aIter->second->getXShape(), UNO_QUERY_THROW);
128 aTitleText = xText->getString();
130 if (aTitleText.getLength() > 63)
131 aTitleText = aTitleText.copy(0, 63);
132 bool bUseTitleAsSlideName = !aTitleText.isEmpty();
134 if (bUseTitleAsSlideName)
137 Reference<XDrawPagesSupplier> xDPS(rFilter.getModel(), UNO_QUERY_THROW);
138 Reference<XDrawPages> xDrawPages(xDPS->getDrawPages(), UNO_SET_THROW);
139 for (sal_Int32
i = 0;
i < nPage; ++
i)
141 Reference<XDrawPage> xDrawPage(xDrawPages->getByIndex(
i), UNO_QUERY);
142 Reference<container::XNamed> xNamed(xDrawPage, UNO_QUERY_THROW);
143 std::u16string_view sRest;
150 Reference<container::XNamed> xName(rSlidePersist[nPage]->getPage(), UNO_QUERY_THROW);
153 + (
nCount == 1 ? OUString(
"") :
" (" + OUString::number(
nCount) +
")"));
163 Reference<XDrawPagesSupplier> xDrawPagesSupplier(
xModel, UNO_QUERY_THROW);
164 Reference<XDrawPages> xDrawPages(xDrawPagesSupplier->getDrawPages(), UNO_SET_THROW);
166 Reference<css::lang::XSingleServiceFactory> mxShowFactory;
167 Reference<css::container::XNameContainer> mxShows;
168 Reference<XCustomPresentationSupplier> xShowsSupplier(
xModel, UNO_QUERY);
169 if (xShowsSupplier.is())
171 mxShows = xShowsSupplier->getCustomPresentations();
172 mxShowFactory.set(mxShows, UNO_QUERY);
175 for (
size_t i = 0;
i < rCustomShowList.size(); ++
i)
177 Reference<com::sun::star::container::XIndexContainer> xShow(mxShowFactory->createInstance(),
181 static const OUStringLiteral sSlide =
u"slides/slide";
182 for (
size_t j = 0; j < rCustomShowList[
i].maSldLst.size(); ++j)
184 OUString sCustomSlide = rCustomShowList[
i].maSldLst[j];
185 sal_Int32 nPageNumber = 0;
186 if (sCustomSlide.match(sSlide))
187 nPageNumber =
o3tl::toInt32(sCustomSlide.subView(sSlide.getLength()));
189 Reference<XDrawPage> xPage;
190 xDrawPages->getByIndex(nPageNumber - 1) >>= xPage;
192 xShow->insertByIndex(xShow->getCount(),
Any(xPage));
197 mxShows->insertByName(rCustomShowList[
i].maCustomShowName, aAny);
210 uno::Reference<beans::XPropertySet> xDocProps(getFilter().getModel(), uno::UNO_QUERY);
213 uno::Reference<beans::XPropertySetInfo> xPropsInfo = xDocProps->getPropertySetInfo();
215 static const OUStringLiteral aGrabBagPropName =
u"InteropGrabBag";
216 if (xPropsInfo.is() && xPropsInfo->hasPropertyByName(aGrabBagPropName))
225 auto pCurrentTheme = aCurrentTheme.getArray();
227 ClrScheme rClrScheme = pThemePtr->getClrScheme();
234 rClrScheme.getColor(
nToken, nColor);
238 pCurrentTheme[
nId].Value = rColor;
242 uno::Sequence<beans::PropertyValue> aTheme{
247 "ppt/theme/theme" + OUString::number(nThemeIdx) +
".xml", aCurrentTheme),
252 aThemesHashMap << aTheme;
255 aGrabBag.
update(aThemesHashMap);
262 catch (
const uno::Exception&)
264 SAL_WARN(
"oox",
"oox::ppt::PresentationFragmentHandler::saveThemeToGrabBag, Failed to save grab bag");
273 Reference< drawing::XDrawPage > xSlide;
276 Reference< drawing::XDrawPagesSupplier > xDPS(
xModel, uno::UNO_QUERY_THROW );
277 Reference< drawing::XDrawPages > xDrawPages( xDPS->getDrawPages(), uno::UNO_SET_THROW );
282 xDrawPages->getByIndex( 0 ) >>= xSlide;
284 xSlide = xDrawPages->insertNewByIndex( xDrawPages->getCount() );
286 OUString aSlideFragmentPath = getFragmentPathFromRelId(
maSlidesVector[ nSlide ] );
287 if( !aSlideFragmentPath.isEmpty() )
290 SlidePersistPtr pSlidePersistPtr = std::make_shared<SlidePersist>( rFilter,
false,
false, xSlide,
296 OUString aLayoutFragmentPath = xSlideFragmentHandler->getFragmentPathFromFirstTypeFromOfficeDoc(
u"slideLayout" );
297 OUString aCommentFragmentPath = xSlideFragmentHandler->getFragmentPathFromFirstTypeFromOfficeDoc(
u"comments" );
298 if ( !aLayoutFragmentPath.isEmpty() )
302 OUString aMasterFragmentPath = xLayoutRelations->getFragmentPathFromFirstTypeFromOfficeDoc(
u"slideMaster" );
303 if( !aMasterFragmentPath.isEmpty() )
306 std::vector< SlidePersistPtr >& rMasterPages( rFilter.
getMasterPages() );
307 for (
auto const& masterPage : rMasterPages)
309 if ( ( masterPage->getPath() == aMasterFragmentPath ) && ( masterPage->getLayoutPath() == aLayoutFragmentPath ) )
311 pMasterPersistPtr = masterPage;
316 if ( !pMasterPersistPtr )
318 Reference< drawing::XDrawPage > xMasterPage;
319 Reference< drawing::XMasterPagesSupplier > xMPS(
xModel, uno::UNO_QUERY_THROW );
320 Reference< drawing::XDrawPages > xMasterPages( xMPS->getMasterPages(), uno::UNO_SET_THROW );
326 xMasterPages->getByIndex(
nIndex ) >>= xMasterPage;
330 nIndex = xMasterPages->getCount();
331 xMasterPage = xMasterPages->insertNewByIndex(
nIndex );
334 pMasterPersistPtr = std::make_shared<SlidePersist>( rFilter,
true,
false, xMasterPage,
336 pMasterPersistPtr->setLayoutPath( aLayoutFragmentPath );
342 OUString aThemeFragmentPath = xMasterFragmentHandler->getFragmentPathFromFirstTypeFromOfficeDoc(
u"theme" );
343 if( !aThemeFragmentPath.isEmpty() )
345 std::map< OUString, oox::drawingml::ThemePtr >& rThemes( rFilter.
getThemes() );
346 std::map< OUString, oox::drawingml::ThemePtr >::iterator aIter2( rThemes.find( aThemeFragmentPath ) );
347 if( aIter2 == rThemes.end() )
350 pMasterPersistPtr->setTheme( pThemePtr );
351 Reference<xml::dom::XDocument> xDoc=
354 auto pTheme = std::make_shared<model::Theme>();
355 pThemePtr->setTheme(pTheme);
358 new ThemeFragmentHandler(rFilter, aThemeFragmentPath, *pThemePtr, *pTheme),
359 Reference<xml::sax::XFastSAXSerializable>(
362 rThemes[ aThemeFragmentPath ] = pThemePtr;
363 pThemePtr->setFragment(xDoc);
368 pMasterPersistPtr->setTheme( (*aIter2).second );
371 importSlide( xMasterFragmentHandler, pMasterPersistPtr );
373 pMasterPersistPtr->createBackground( rFilter );
374 pMasterPersistPtr->createXShapes( rFilter );
379 pTheme->addTheme(pMasterPersistPtr->getPage());
386 if (pMasterPersistPtr) {
387 pSlidePersistPtr->setMasterPersist( pMasterPersistPtr );
388 pSlidePersistPtr->setTheme( pMasterPersistPtr->getTheme() );
389 Reference< drawing::XMasterPageTarget > xMasterPageTarget( pSlidePersistPtr->getPage(), UNO_QUERY );
390 if( xMasterPageTarget.is() )
391 xMasterPageTarget->setMasterPage( pMasterPersistPtr->getPage() );
395 importSlide( xSlideFragmentHandler, pSlidePersistPtr );
396 pSlidePersistPtr->createBackground( rFilter );
397 pSlidePersistPtr->createXShapes( rFilter );
399 if(bImportNotesPage) {
402 OUString aNotesFragmentPath = xSlideFragmentHandler->getFragmentPathFromFirstTypeFromOfficeDoc(
u"notesSlide" );
403 if( !aNotesFragmentPath.isEmpty() )
405 Reference< XPresentationPage > xPresentationPage( xSlide, UNO_QUERY );
406 if ( xPresentationPage.is() )
408 Reference< XDrawPage > xNotesPage( xPresentationPage->getNotesPage() );
409 if ( xNotesPage.is() )
411 SlidePersistPtr pNotesPersistPtr = std::make_shared<SlidePersist>( rFilter,
false,
true, xNotesPage,
416 importSlide( xNotesFragmentHandler, pNotesPersistPtr );
417 pNotesPersistPtr->createBackground( rFilter );
418 pNotesPersistPtr->createXShapes( rFilter );
428 Reference< XPresentationPage > xPresentationPage( xSlide, UNO_QUERY );
429 Reference< XDrawPage > xCommentAuthorsPage( xPresentationPage->getNotesPage() );
431 std::make_shared<SlidePersist>( rFilter,
false,
true, xCommentAuthorsPage,
432 std::make_shared<PPTShape>(
433 Slide,
"com.sun.star.drawing.GroupShape" ),
437 "ppt/commentAuthors.xml",
438 pCommentAuthorsPersistPtr,
441 getFilter().importFragment( xCommentAuthorsFragmentHandler );
444 if( !aCommentFragmentPath.isEmpty() )
446 Reference< XPresentationPage > xPresentationPage( xSlide, UNO_QUERY );
447 Reference< XDrawPage > xCommentsPage( xPresentationPage->getNotesPage() );
449 std::make_shared<SlidePersist>(
450 rFilter,
false,
true, xCommentsPage,
451 std::make_shared<PPTShape>(
452 Slide,
"com.sun.star.drawing.GroupShape" ),
458 aCommentFragmentPath,
461 pCommentsPersistPtr->getCommentsList().cmLst.clear();
462 getFilter().importFragment( xCommentsFragmentHandler );
464 if (!pCommentsPersistPtr->getCommentsList().cmLst.empty())
469 assert(comment_handler);
473 pCommentsPersistPtr->getCommentsList().cmLst.back().setText(
477 pCommentsPersistPtr->getCommentAuthors().setValues(
maAuthorList);
480 for(
int i=0;
i<pCommentsPersistPtr->getCommentsList().getSize();
i++)
483 Comment aComment = pCommentsPersistPtr->getCommentsList().getCommentAtIndex(
i);
484 uno::Reference< office::XAnnotationAccess > xAnnotationAccess( xSlide, UNO_QUERY_THROW );
485 uno::Reference< office::XAnnotation > xAnnotation( xAnnotationAccess->createAndInsertAnnotation() );
486 int nPosX = aComment.
getIntX();
487 int nPosY = aComment.
getIntY();
488 xAnnotation->setPosition(
489 geometry::RealPoint2D(
493 xAnnotation->setDateTime( aComment.
getDateTime() );
494 uno::Reference< text::XText > xText( xAnnotation->getTextRange() );
495 xText->setString( aComment.
get_text());
496 }
catch( css::lang::IllegalArgumentException& ) {}
501 catch( uno::Exception& )
518 rFilterData[
"OriginalPageCount"] <<= nPageCount;
522 if( !aPageRange.getLength() )
524 aPageRange =
"1-" + OUString::number( nPageCount );
528 if (aRangeEnumerator.
size())
531 const Reference< task::XStatusIndicator >& rxStatusIndicator( getFilter().getStatusIndicator() );
532 if ( rxStatusIndicator.is() )
533 rxStatusIndicator->start( OUString(), 10000 );
537 int nPagesImported = 0;
538 for (sal_Int32 elem : aRangeEnumerator)
540 if ( rxStatusIndicator.is() )
541 rxStatusIndicator->setValue((nPagesImported * 10000) / aRangeEnumerator.size());
543 importSlide(elem, !nPagesImported, bImportNotesPages);
550 catch( uno::Exception& )
555 if ( rxStatusIndicator.is() )
556 rxStatusIndicator->end();
561 if (!aVbaFragmentPath.isEmpty())
563 uno::Reference<io::XInputStream> xInStrm = getFilter().openInputStream(aVbaFragmentPath);
567 getFilter().getVbaProject().importVbaProject(*xPrjStrg);
575 switch( aElementToken )
577 case PPT_TOKEN( presentation ):
578 case PPT_TOKEN( sldMasterIdLst ):
579 case PPT_TOKEN( notesMasterIdLst ):
580 case PPT_TOKEN( sldIdLst ):
582 case PPT_TOKEN( sldMasterId ):
585 case PPT_TOKEN( sldId ):
588 case PPT_TOKEN( notesMasterId ):
591 case PPT_TOKEN( sldSz ):
594 case PPT_TOKEN( notesSz ):
597 case PPT_TOKEN( custShowLst ):
599 case PPT_TOKEN( defaultTextStyle ):
601 case PPT_TOKEN( modifyVerifier ):
604 sal_Int32 nAlgorithmSid = rAttribs.
getInteger(XML_cryptAlgorithmSid, 0);
605 sal_Int32 nSpinCount = rAttribs.
getInteger(XML_spinCount, 0);
608 if (sAlgorithmClass ==
"hash" && sAlgorithmType ==
"typeAny" && nAlgorithmSid != 0
609 && !sSalt.isEmpty() && !
sHash.isEmpty())
611 OUString sAlgorithmName;
612 switch (nAlgorithmSid)
615 sAlgorithmName =
"MD2";
618 sAlgorithmName =
"MD4";
621 sAlgorithmName =
"MD5";
624 sAlgorithmName =
"SHA-1";
627 sAlgorithmName =
"MAC";
630 sAlgorithmName =
"RIPEMD";
633 sAlgorithmName =
"RIPEMD-160";
636 sAlgorithmName =
"HMAC";
639 sAlgorithmName =
"SHA-256";
642 sAlgorithmName =
"SHA-384";
645 sAlgorithmName =
"SHA-512";
650 if (!sAlgorithmName.isEmpty())
652 uno::Sequence<beans::PropertyValue> aResult{
660 uno::Reference<beans::XPropertySet> xDocSettings(
662 "com.sun.star.document.Settings"),
664 xDocSettings->setPropertyValue(
"ModifyPasswordInfo",
uno::Any(aResult));
666 catch (
const uno::Exception&)
679 Reference< drawing::XDrawPage > xSlide( rSlidePersistPtr->getPage() );
680 SlidePersistPtr pMasterPersistPtr( rSlidePersistPtr->getMasterPersist() );
681 if ( pMasterPersistPtr )
684 Reference< drawing::XDrawPage > xMasterSlide(pMasterPersistPtr->getPage());
685 const int nCount = xMasterSlide->getCount();
687 uno::Reference< beans::XPropertySet > xSet( xSlide, uno::UNO_QUERY_THROW );
688 xSet->setPropertyValue(
"Layout",
Any( pMasterPersistPtr->getLayoutFromValueToken() ) );
690 while( nCount < xMasterSlide->getCount())
692 Reference< drawing::XShape > xShape;
693 xMasterSlide->getByIndex(xMasterSlide->getCount()-1) >>= xShape;
694 xMasterSlide->remove(xShape);
697 while( xSlide->getCount() )
699 Reference< drawing::XShape > xShape;
700 xSlide->getByIndex(0) >>= xShape;
701 xSlide->remove( xShape );
704 Reference< XPropertySet > xPropertySet( xSlide, UNO_QUERY );
705 if ( xPropertySet.is() )
708 xPropertySet->setPropertyValue(
"Width",
Any( rPageSize.Width ) );
709 xPropertySet->setPropertyValue(
"Height",
Any( rPageSize.Height ) );
712 if ( !rSlidePersistPtr->isMasterPage() )
713 aHeaderFooter.mbSlideNumber = aHeaderFooter.mbHeader = aHeaderFooter.mbFooter = aHeaderFooter.mbDateTime =
false;
716 if ( rSlidePersistPtr->isNotesPage() )
717 xPropertySet->setPropertyValue(
"IsHeaderVisible",
Any( aHeaderFooter.mbHeader ) );
718 xPropertySet->setPropertyValue(
"IsFooterVisible",
Any( aHeaderFooter.mbFooter ) );
719 xPropertySet->setPropertyValue(
"IsDateTimeVisible",
Any( aHeaderFooter.mbDateTime ) );
720 xPropertySet->setPropertyValue(
"IsPageNumberVisible",
Any( aHeaderFooter.mbSlideNumber ) );
722 catch( uno::Exception& )
726 rSlidePersistPtr->setPath( rxSlideFragmentHandler->getFragmentPath() );
727 getFilter().importFragment( rxSlideFragmentHandler );
HRESULT createInstance(REFIID iid, Ifc **ppIfc)
TValueType getUnpackedValueOrDefault(const OUString &sKey, const TValueType &aDefault) const
css::uno::Sequence< css::beans::PropertyValue > getAsConstPropertyValueList() const
void update(const SequenceAsHashMap &rSource)
Provides access to attribute values of an element.
OUString getStringDefaulted(sal_Int32 nAttrToken) const
Returns the string value of the specified attribute, returns an empty string if attribute not present...
std::optional< sal_Int32 > getInteger(sal_Int32 nAttrToken) const
Returns the 32-bit signed integer value of the specified attribute (decimal).
const css::uno::Reference< css::xml::sax::XFastAttributeList > & getFastAttributeList() const
Returns the wrapped com.sun.star.xml.sax.XFastAttributeList object.
::comphelper::SequenceAsHashMap & getFilterData() const
Returns the FilterData.
const css::uno::Reference< css::frame::XModel > & getModel() const
Returns the document model (always existing).
RelationsRef importRelations(const OUString &rFragmentPath)
Imports the relations fragment associated with the specified fragment.
bool importFragment(const rtl::Reference< FragmentHandler > &rxHandler)
Imports a fragment using the passed fragment handler, which contains the full path to the fragment st...
std::vector< SlidePersistPtr > & getNotesPages()
std::vector< SlidePersistPtr > & getMasterPages()
std::vector< SlidePersistPtr > & getDrawPages()
void setActualSlidePersist(SlidePersistPtr pActualSlidePersist)
std::map< OUString, oox::drawingml::ThemePtr > & getThemes()
static void importSlideNames(::oox::core::XmlFilterBase &rFilter, const std::vector< SlidePersistPtr > &rSlidePersist)
void importSlide(const ::oox::core::FragmentHandlerRef &rSlideFragmentHandler, const oox::ppt::SlidePersistPtr &rPersist)
virtual ~PresentationFragmentHandler() noexcept override
PresentationFragmentHandler(::oox::core::XmlFilterBase &rFilter, const OUString &rFragmentPath)
::oox::drawingml::TextListStylePtr mpTextListStyle
std::vector< OUString > maSlidesVector
CommentAuthorList maAuthorList
virtual void finalizeImport() override
void importCustomSlideShow(std::vector< CustomShow > &rCustomShowList)
bool mbCommentAuthorsRead
std::vector< OUString > maSlideMasterVector
css::awt::Size maSlideSize
void saveThemeToGrabBag(const oox::drawingml::ThemePtr &pThemePtr, sal_Int32 nThemeIdx)
std::vector< OUString > maNotesMasterVector
virtual ::oox::core::ContextHandlerRef onCreateContext(sal_Int32 aElementToken, const AttributeList &rAttribs) override
std::vector< CustomShow > maCustomShowList
css::awt::Size maNotesSize
const ::std::vector< OUString > & getCharVector() const
#define TOOLS_WARN_EXCEPTION(area, stream)
#define SAL_WARN(area, stream)
Reference< XComponentContext > getComponentContext(Reference< XMultiServiceFactory > const &factory)
css::beans::PropertyValue makePropertyValue(const OUString &rName, T &&rValue)
std::shared_ptr< T > make_shared(Args &&... args)
constexpr bool ends_with(std::basic_string_view< charT, traits > sv, std::basic_string_view< charT, traits > x) noexcept
sal_Int32 toInt32(std::u16string_view str, sal_Int16 radix=10)
constexpr bool starts_with(std::basic_string_view< charT, traits > sv, std::basic_string_view< charT, traits > x) noexcept
std::shared_ptr< Relations > RelationsRef
::rtl::Reference< FragmentHandler > FragmentHandlerRef
sal_Int32 convertEmuToHmm(sal_Int64 nValue)
Converts the passed 64-bit integer value from EMUs to 1/100 mm.
awt::Size GetSize2D(const Reference< XFastAttributeList > &xAttribs)
converts the attributes from a CT_Size2D into an awt Size with 1/100thmm
std::shared_ptr< Theme > ThemePtr
std::array< TextParagraphProperties, NUM_TEXT_LIST_STYLE_ENTRIES > TextParagraphPropertiesArray
static std::map< PredefinedClrSchemeId, OUString > PredefinedClrNames
std::shared_ptr< SlidePersist > SlidePersistPtr
static std::map< PredefinedClrSchemeId, sal_Int32 > PredefinedClrTokens
std::shared_ptr< StorageBase > StorageRef
#define CREATE_MSOFFICE_RELATION_TYPE(ascii)
Expands to an OUString containing an MS Office specific relation type created from the passed literal...
Reference< XModel > xModel