diff options
author | Thorsten Behrens <thorsten.behrens@allotropia.de> | 2024-02-08 14:56:56 +0100 |
---|---|---|
committer | Thorsten Behrens <thorsten.behrens@allotropia.de> | 2024-02-08 14:56:56 +0100 |
commit | cc5241301a9775bd46606ba2fbc9f237b218ef39 (patch) | |
tree | ff8a755e6f441f943881a8d909427c6f524b5276 /sd | |
parent | 4793c0015c0bbd4a0fa788de9a51f79af9bb56c0 (diff) | |
parent | 7d3edae2c3c6b0c6667bcb9e3f9988f28eb82295 (diff) |
Merge tag 'libreoffice-7.6.5.1' into feature/cib_contract49
Tag libreoffice-7.6.5.1
Change-Id: I3baef049044d36500a4b98ed375d3242703d0e11
Diffstat (limited to 'sd')
-rw-r--r-- | sd/qa/unit/data/pptx/tdf156718.pptx | bin | 0 -> 14422 bytes | |||
-rw-r--r-- | sd/qa/unit/data/pptx/tdf157740.pptx | bin | 0 -> 16941 bytes | |||
-rw-r--r-- | sd/qa/unit/export-tests-ooxml1.cxx | 4 | ||||
-rw-r--r-- | sd/qa/unit/export-tests-ooxml2.cxx | 20 | ||||
-rw-r--r-- | sd/qa/unit/export-tests-ooxml3.cxx | 2 | ||||
-rw-r--r-- | sd/qa/unit/import-tests.cxx | 70 | ||||
-rw-r--r-- | sd/source/core/drawdoc3.cxx | 38 | ||||
-rw-r--r-- | sd/source/filter/eppt/epptbase.hxx | 1 | ||||
-rw-r--r-- | sd/source/filter/eppt/epptooxml.hxx | 8 | ||||
-rw-r--r-- | sd/source/filter/eppt/pptx-epptooxml.cxx | 284 | ||||
-rw-r--r-- | sd/source/ui/animations/CustomAnimationDialog.cxx | 2 | ||||
-rw-r--r-- | sd/source/ui/animations/CustomAnimationList.cxx | 2 | ||||
-rw-r--r-- | sd/source/ui/app/sddll.cxx | 24 | ||||
-rw-r--r-- | sd/source/ui/app/sdmod1.cxx | 29 | ||||
-rw-r--r-- | sd/source/ui/docshell/docshel4.cxx | 2 | ||||
-rw-r--r-- | sd/source/ui/remotecontrol/Receiver.cxx | 21 | ||||
-rw-r--r-- | sd/source/ui/slideshow/showwin.cxx | 12 | ||||
-rw-r--r-- | sd/uiconfig/simpress/ui/customanimationspanel.ui | 10 |
18 files changed, 266 insertions, 263 deletions
diff --git a/sd/qa/unit/data/pptx/tdf156718.pptx b/sd/qa/unit/data/pptx/tdf156718.pptx Binary files differnew file mode 100644 index 000000000000..8aeafa155762 --- /dev/null +++ b/sd/qa/unit/data/pptx/tdf156718.pptx diff --git a/sd/qa/unit/data/pptx/tdf157740.pptx b/sd/qa/unit/data/pptx/tdf157740.pptx Binary files differnew file mode 100644 index 000000000000..009e9eeb1da0 --- /dev/null +++ b/sd/qa/unit/data/pptx/tdf157740.pptx diff --git a/sd/qa/unit/export-tests-ooxml1.cxx b/sd/qa/unit/export-tests-ooxml1.cxx index 17a5ce94cbf6..407eef46f7b9 100644 --- a/sd/qa/unit/export-tests-ooxml1.cxx +++ b/sd/qa/unit/export-tests-ooxml1.cxx @@ -110,11 +110,11 @@ CPPUNIT_TEST_FIXTURE(SdOOXMLExportTest1, testTdf149128) xmlDocUniquePtr pXmlDoc = parseExport("ppt/slides/slide1.xml"); assertXPath(pXmlDoc, "/p:sld/p:cSld/p:spTree/p:cxnSp/p:nvCxnSpPr/p:cNvCxnSpPr/a:stCxn", "id", - "42"); + "8"); assertXPath(pXmlDoc, "/p:sld/p:cSld/p:spTree/p:cxnSp/p:nvCxnSpPr/p:cNvCxnSpPr/a:stCxn", "idx", "0"); assertXPath(pXmlDoc, "/p:sld/p:cSld/p:spTree/p:cxnSp/p:nvCxnSpPr/p:cNvCxnSpPr/a:endCxn", "id", - "43"); + "9"); assertXPath(pXmlDoc, "/p:sld/p:cSld/p:spTree/p:cxnSp/p:nvCxnSpPr/p:cNvCxnSpPr/a:endCxn", "idx", "2"); } diff --git a/sd/qa/unit/export-tests-ooxml2.cxx b/sd/qa/unit/export-tests-ooxml2.cxx index ed6568d0bc1f..65102c143c1d 100644 --- a/sd/qa/unit/export-tests-ooxml2.cxx +++ b/sd/qa/unit/export-tests-ooxml2.cxx @@ -157,6 +157,22 @@ CPPUNIT_TEST_FIXTURE(SdOOXMLExportTest2, testTdf153107) "tl"); } +CPPUNIT_TEST_FIXTURE(SdOOXMLExportTest2, testTdf157740_slideMasters) +{ + createSdImpressDoc("pptx/tdf157740.pptx"); + saveAndReload("Impress Office Open XML"); + + // Test how many slidemaster we have + xmlDocUniquePtr pXmlDocContent = parseExport("ppt/presentation.xml"); + assertXPath(pXmlDocContent, "/p:presentation/p:sldMasterIdLst/p:sldMasterId", 7); + + pXmlDocContent = parseExport("ppt/slideMasters/slideMaster1.xml"); + assertXPath(pXmlDocContent, "/p:sldMaster/p:sldLayoutIdLst/p:sldLayoutId", 1); + + pXmlDocContent = parseExport("ppt/slideMasters/slideMaster7.xml"); + assertXPath(pXmlDocContent, "/p:sldMaster/p:sldLayoutIdLst/p:sldLayoutId", 1); +} + CPPUNIT_TEST_FIXTURE(SdOOXMLExportTest2, testTdf142291) { createSdImpressDoc("pptx/tdt142291.pptx"); @@ -1313,7 +1329,7 @@ CPPUNIT_TEST_FIXTURE(SdOOXMLExportTest2, testTdf106867) "/p:sld/p:timing/p:tnLst/p:par/p:cTn/p:childTnLst/p:seq/p:cTn/p:childTnLst/p:par/" "p:cTn/p:childTnLst/p:par/p:cTn/p:childTnLst/p:par/p:cTn/p:childTnLst/p:cmd/" "p:cBhvr/p:tgtEl/p:spTgt", - "spid", "42"); + "spid", "67"); } CPPUNIT_TEST_FIXTURE(SdOOXMLExportTest2, testTdf112280) @@ -1692,7 +1708,7 @@ CPPUNIT_TEST_FIXTURE(SdOOXMLExportTest2, testAccentColor) xmlDocUniquePtr pXmlDocTheme1 = parseExport("ppt/theme/theme1.xml"); assertXPath(pXmlDocTheme1, "/a:theme/a:themeElements/a:clrScheme/a:accent6/a:srgbClr", "val", "70ad47"); - xmlDocUniquePtr pXmlDocTheme2 = parseExport("ppt/theme/theme2.xml"); + xmlDocUniquePtr pXmlDocTheme2 = parseExport("ppt/theme/theme12.xml"); assertXPath(pXmlDocTheme2, "/a:theme/a:themeElements/a:clrScheme/a:accent6/a:srgbClr", "val", "deb340"); diff --git a/sd/qa/unit/export-tests-ooxml3.cxx b/sd/qa/unit/export-tests-ooxml3.cxx index 3d630db22aa3..6a66e59af884 100644 --- a/sd/qa/unit/export-tests-ooxml3.cxx +++ b/sd/qa/unit/export-tests-ooxml3.cxx @@ -573,7 +573,7 @@ CPPUNIT_TEST_FIXTURE(SdOOXMLExportTest3, testTdf125573_FontWorkScaleX) // BoundRect is DPI dependent, thus allow some range. // Expected width is 13139 in 96dpi and is 13106 in 120 dpi, for example // (Without fix Expected less than: 85 Actual : 10432) - CPPUNIT_ASSERT_LESS(sal_Int32(85), std::abs(aBoundRectArch.Width - 13139)); + CPPUNIT_ASSERT_LESS(sal_Int32(85), std::abs(aBoundRectArch.Width - 13145)); // Error was, that text in shapes of category "Warp" was not scaled to the path. uno::Reference<beans::XPropertySet> xShapeWaveProps(getShapeFromPage(0, 1)); diff --git a/sd/qa/unit/import-tests.cxx b/sd/qa/unit/import-tests.cxx index adc7c12e4632..85d25f831e83 100644 --- a/sd/qa/unit/import-tests.cxx +++ b/sd/qa/unit/import-tests.cxx @@ -34,6 +34,7 @@ #include <sax/tools/converter.hxx> #include <com/sun/star/awt/Gradient.hpp> +#include <com/sun/star/awt/FontWeight.hpp> #include <com/sun/star/document/XDocumentPropertiesSupplier.hpp> #include <com/sun/star/document/XEventsSupplier.hpp> #include <com/sun/star/presentation/ClickAction.hpp> @@ -203,6 +204,75 @@ CPPUNIT_TEST_FIXTURE(SdImportTest, testDocumentLayout) } } +CPPUNIT_TEST_FIXTURE(SdImportTest, testTableStyle) +{ + createSdImpressDoc("pptx/tdf156718.pptx"); + const SdrPage* pPage = GetPage(1); + + sdr::table::SdrTableObj* pTableObj = dynamic_cast<sdr::table::SdrTableObj*>(pPage->GetObj(0)); + CPPUNIT_ASSERT(pTableObj); + + uno::Reference<table::XCellRange> xTable(pTableObj->getTable(), uno::UNO_QUERY_THROW); + uno::Reference<beans::XPropertySet> xCellPropSet; + uno::Reference<beans::XPropertySet> xRunPropSet; + uno::Reference<text::XTextRange> xParagraph; + uno::Reference<text::XTextRange> xRun; + table::BorderLine2 aBorderLine; + Color nFillColor, nCharColor; + float nFontWeight; + + xCellPropSet.set(xTable->getCellByPosition(0, 0), uno::UNO_QUERY_THROW); + xParagraph.set(getParagraphFromShape(0, xCellPropSet)); + xRun.set(getRunFromParagraph(0, xParagraph)); + xRunPropSet.set(xRun, uno::UNO_QUERY_THROW); + xRunPropSet->getPropertyValue("CharColor") >>= nCharColor; + xRunPropSet->getPropertyValue("CharWeight") >>= nFontWeight; + xCellPropSet->getPropertyValue("BottomBorder") >>= aBorderLine; + CPPUNIT_ASSERT_EQUAL(Color(0x000000), nCharColor); + CPPUNIT_ASSERT_EQUAL(awt::FontWeight::BOLD, nFontWeight); + CPPUNIT_ASSERT_EQUAL_MESSAGE("The bottom border is missing!", true, aBorderLine.LineWidth > 0); + + xCellPropSet.set(xTable->getCellByPosition(1, 0), uno::UNO_QUERY_THROW); + xParagraph.set(getParagraphFromShape(0, xCellPropSet)); + xRun.set(getRunFromParagraph(0, xParagraph)); + xRunPropSet.set(xRun, uno::UNO_QUERY_THROW); + xRunPropSet->getPropertyValue("CharColor") >>= nCharColor; + xRunPropSet->getPropertyValue("CharWeight") >>= nFontWeight; + CPPUNIT_ASSERT_EQUAL(Color(0x000000), nCharColor); + CPPUNIT_ASSERT_EQUAL(awt::FontWeight::BOLD, nFontWeight); + + xCellPropSet.set(xTable->getCellByPosition(2, 0), uno::UNO_QUERY_THROW); + xParagraph.set(getParagraphFromShape(0, xCellPropSet)); + xRun.set(getRunFromParagraph(0, xParagraph)); + xRunPropSet.set(xRun, uno::UNO_QUERY_THROW); + xRunPropSet->getPropertyValue("CharColor") >>= nCharColor; + xRunPropSet->getPropertyValue("CharWeight") >>= nFontWeight; + CPPUNIT_ASSERT_EQUAL(Color(0x000000), nCharColor); + CPPUNIT_ASSERT_EQUAL(awt::FontWeight::BOLD, nFontWeight); + + xCellPropSet.set(xTable->getCellByPosition(0, 1), uno::UNO_QUERY_THROW); + xParagraph.set(getParagraphFromShape(0, xCellPropSet)); + xRun.set(getRunFromParagraph(0, xParagraph)); + xRunPropSet.set(xRun, uno::UNO_QUERY_THROW); + xRunPropSet->getPropertyValue("CharColor") >>= nCharColor; + xRunPropSet->getPropertyValue("CharWeight") >>= nFontWeight; + xCellPropSet->getPropertyValue("FillColor") >>= nFillColor; + CPPUNIT_ASSERT_EQUAL(Color(0x000000), nCharColor); + CPPUNIT_ASSERT_EQUAL(awt::FontWeight::BOLD, nFontWeight); + CPPUNIT_ASSERT_EQUAL(Color(0x5b9bd5), nFillColor); + + xCellPropSet.set(xTable->getCellByPosition(2, 1), uno::UNO_QUERY_THROW); + xParagraph.set(getParagraphFromShape(0, xCellPropSet)); + xRun.set(getRunFromParagraph(0, xParagraph)); + xRunPropSet.set(xRun, uno::UNO_QUERY_THROW); + xRunPropSet->getPropertyValue("CharColor") >>= nCharColor; + xRunPropSet->getPropertyValue("CharWeight") >>= nFontWeight; + xCellPropSet->getPropertyValue("FillColor") >>= nFillColor; + CPPUNIT_ASSERT_EQUAL(Color(0x000000), nCharColor); + CPPUNIT_ASSERT_EQUAL(awt::FontWeight::BOLD, nFontWeight); + CPPUNIT_ASSERT_EQUAL(Color(0x5b9bd5), nFillColor); +} + CPPUNIT_TEST_FIXTURE(SdImportTest, testFreeformShapeGluePoints) { createSdImpressDoc("pptx/tdf156829.pptx"); diff --git a/sd/source/core/drawdoc3.cxx b/sd/source/core/drawdoc3.cxx index 00006fbefd24..eb830484b376 100644 --- a/sd/source/core/drawdoc3.cxx +++ b/sd/source/core/drawdoc3.cxx @@ -67,11 +67,11 @@ namespace { class InsertBookmarkAsPage_FindDuplicateLayouts { public: - explicit InsertBookmarkAsPage_FindDuplicateLayouts( std::vector<OUString> &rLayoutsToTransfer ) + explicit InsertBookmarkAsPage_FindDuplicateLayouts( std::map<OUString, sal_Int32> &rLayoutsToTransfer ) : mrLayoutsToTransfer(rLayoutsToTransfer) {} void operator()( SdDrawDocument&, SdPage const *, bool, SdDrawDocument* ); private: - std::vector<OUString> &mrLayoutsToTransfer; + std::map<OUString, sal_Int32> &mrLayoutsToTransfer; }; } @@ -85,11 +85,11 @@ void InsertBookmarkAsPage_FindDuplicateLayouts::operator()( SdDrawDocument& rDoc if( nIndex != -1 ) aLayout = aLayout.copy(0, nIndex); - std::vector<OUString>::const_iterator pIter = - find(mrLayoutsToTransfer.begin(),mrLayoutsToTransfer.end(),aLayout); + std::map<OUString, sal_Int32>::const_iterator pIter = mrLayoutsToTransfer.find(aLayout); bool bFound = pIter != mrLayoutsToTransfer.end(); + sal_Int32 nLayout = 20; // blank page - master slide layout ID const sal_uInt16 nMPageCount = rDoc.GetMasterPageCount(); for (sal_uInt16 nMPage = 0; nMPage < nMPageCount && !bFound; nMPage++) { @@ -110,6 +110,15 @@ void InsertBookmarkAsPage_FindDuplicateLayouts::operator()( SdDrawDocument& rDoc pBMMPage->GetLayoutName(), pBMMPage->GetName() + "_"); aLayout = pBMMPage->GetName(); + uno::Reference< drawing::XDrawPage > xOldPage(rDoc.GetMasterPage(nMPage)->getUnoPage(), uno::UNO_QUERY_THROW); + uno::Reference<beans::XPropertySet> xPropSet(xOldPage, uno::UNO_QUERY_THROW); + if (xPropSet.is()) + { + uno::Any aLayoutID = xPropSet->getPropertyValue("SlideLayout"); + if (aLayoutID.hasValue()) { + aLayoutID >>= nLayout; + } + } break; } else @@ -118,7 +127,7 @@ void InsertBookmarkAsPage_FindDuplicateLayouts::operator()( SdDrawDocument& rDoc } if (!bFound) - mrLayoutsToTransfer.push_back(aLayout); + mrLayoutsToTransfer.insert({ aLayout, nLayout }); } // Inserts a bookmark as a page @@ -499,7 +508,7 @@ bool SdDrawDocument::InsertBookmarkAsPage( // Refactored copy'n'pasted layout name collection into IterateBookmarkPages - std::vector<OUString> aLayoutsToTransfer; + std::map<OUString, sal_Int32> aLayoutsToTransfer; InsertBookmarkAsPage_FindDuplicateLayouts aSearchFunctor( aLayoutsToTransfer ); lcl_IterateBookmarkPages( *this, pBookmarkDoc, rBookmarkList, nBMSdPageCount, aSearchFunctor, ( rBookmarkList.empty() && pBookmarkDoc != this ) ); @@ -511,11 +520,11 @@ bool SdDrawDocument::InsertBookmarkAsPage( if( !aLayoutsToTransfer.empty() ) bMergeMasterPages = true; - for ( const OUString& layoutName : aLayoutsToTransfer ) + for ( const auto& layout : aLayoutsToTransfer ) { StyleSheetCopyResultVector aCreatedStyles; - rStyleSheetPool.CopyLayoutSheets(layoutName, rBookmarkStyleSheetPool,aCreatedStyles); + rStyleSheetPool.CopyLayoutSheets(layout.first, rBookmarkStyleSheetPool, aCreatedStyles); if(!aCreatedStyles.empty()) { @@ -897,6 +906,19 @@ bool SdDrawDocument::InsertBookmarkAsPage( pRefPage->SetSize(aSize); pRefPage->SetBorder(nLeft, nUpper, nRight, nLower); pRefPage->SetOrientation( eOrient ); + + uno::Reference< drawing::XDrawPage > xNewPage(GetMasterPage(nPage)->getUnoPage(), uno::UNO_QUERY_THROW); + uno::Reference<beans::XPropertySet> xNewPropSet(xNewPage, uno::UNO_QUERY_THROW); + if (xNewPropSet.is()) + { + OUString aLayout(pRefPage->GetName()); + sal_Int32 nLayout = 20; // blank page - master slide layout ID + if (auto it{ aLayoutsToTransfer.find(aLayout) }; it != std::end(aLayoutsToTransfer)) + { + nLayout = it->second; + } + xNewPropSet->setPropertyValue("SlideLayout", uno::Any(nLayout)); + } } else // Can only be notes { diff --git a/sd/source/filter/eppt/epptbase.hxx b/sd/source/filter/eppt/epptbase.hxx index c56866b248fe..70bcd3a4b6ce 100644 --- a/sd/source/filter/eppt/epptbase.hxx +++ b/sd/source/filter/eppt/epptbase.hxx @@ -74,6 +74,7 @@ enum class EppLayout }; #define EPP_LAYOUT_SIZE 25 +#define OOXML_LAYOUT_SIZE 36 struct PHLayout { diff --git a/sd/source/filter/eppt/epptooxml.hxx b/sd/source/filter/eppt/epptooxml.hxx index 6d804c80cf1f..d9d65a2e8300 100644 --- a/sd/source/filter/eppt/epptooxml.hxx +++ b/sd/source/filter/eppt/epptooxml.hxx @@ -89,7 +89,7 @@ private: bool bHasBackground, css::uno::Reference< css::beans::XPropertySet > const & aXBackgroundPropSet ) override; virtual void ImplWriteNotes( sal_uInt32 nPageNum ) override; virtual void ImplWriteSlideMaster( sal_uInt32 nPageNum, css::uno::Reference< css::beans::XPropertySet > const & aXBackgroundPropSet ) override; - void ImplWritePPTXLayout( sal_Int32 nOffset, sal_uInt32 nMasterNum ); + void ImplWritePPTXLayout( sal_Int32 nOffset, sal_uInt32 nMasterNum, const OUString& aSlideName ); static void WriteDefaultColorSchemes(const FSHelperPtr& pFS); void WriteTheme( sal_Int32 nThemeNum, model::Theme* pTheme ); @@ -131,8 +131,6 @@ private: css::uno::Reference<css::drawing::XShape> GetReferencedPlaceholderXShape(const PlaceholderType eType, PageType ePageType) const; void WritePlaceholderReferenceShapes(PowerPointShapeExport& rDML, PageType ePageType); - long FindEquivalentMasterPage(SdrPage* pMasterPage) const; - /// Should we export as .pptm, ie. do we contain macros? bool mbPptm; @@ -141,15 +139,13 @@ private: ::sax_fastparser::FSHelperPtr mPresentationFS; - LayoutInfo mLayoutInfo[EPP_LAYOUT_SIZE]; - std::vector<std::pair<SdrPage*, size_t>> mpSlidesMaster; + LayoutInfo mLayoutInfo[OOXML_LAYOUT_SIZE]; std::vector< ::sax_fastparser::FSHelperPtr > mpSlidesFSArray; sal_Int32 mnLayoutFileIdMax; sal_uInt32 mnSlideIdMax; sal_uInt32 mnSlideMasterIdMax; sal_uInt32 mnAnimationNodeIdMax; - sal_uInt32 mnThemeIdMax; sal_uInt32 mnDiagramId; diff --git a/sd/source/filter/eppt/pptx-epptooxml.cxx b/sd/source/filter/eppt/pptx-epptooxml.cxx index 9ef04c891ca1..0967b6a3b34e 100644 --- a/sd/source/filter/eppt/pptx-epptooxml.cxx +++ b/sd/source/filter/eppt/pptx-epptooxml.cxx @@ -25,8 +25,6 @@ #include <oox/ole/vbaproject.hxx> #include "epptooxml.hxx" #include <oox/export/shapes.hxx> -#include <svx/svdlayer.hxx> -#include <unokywds.hxx> #include <comphelper/sequenceashashmap.hxx> #include <comphelper/storagehelper.hxx> @@ -42,8 +40,6 @@ #include <com/sun/star/drawing/FillStyle.hpp> #include <com/sun/star/drawing/XDrawPages.hpp> #include <com/sun/star/drawing/XDrawPagesSupplier.hpp> -#include <com/sun/star/drawing/XMasterPageTarget.hpp> -#include <com/sun/star/drawing/XMasterPagesSupplier.hpp> #include <com/sun/star/embed/ElementModes.hpp> #include <com/sun/star/geometry/RealPoint2D.hpp> #include <com/sun/star/office/XAnnotationEnumeration.hpp> @@ -191,23 +187,6 @@ const char* getPlaceholderTypeName(PlaceholderType ePlaceholder) namespace { -enum PPTXLayout -{ - LAYOUT_BLANK, - LAYOUT_TITLE_SLIDE, - LAYOUT_TITLE_CONTENT, - LAYOUT_TITLE_2CONTENT, - LAYOUT_TITLE, - LAYOUT_CENTERED_TEXT, - LAYOUT_TITLE_2CONTENT_CONTENT, - LAYOUT_TITLE_CONTENT_2CONTENT, - LAYOUT_TITLE_2CONTENT_OVER_CONTENT, - LAYOUT_TITLE_CONTENT_OVER_CONTENT, - LAYOUT_TITLE_4CONTENT, - LAYOUT_TITLE_6CONTENT, - LAYOUT_SIZE -}; - struct PPTXLayoutInfo { int nType; @@ -217,72 +196,46 @@ struct PPTXLayoutInfo } -const PPTXLayoutInfo aLayoutInfo[LAYOUT_SIZE] = -{ - { 20, "Blank Slide", "blank" }, - { 0, "Title Slide", "tx" }, - { 1, "Title, Content", "obj" }, - { 3, "Title, 2 Content", "twoObj" }, +const PPTXLayoutInfo aLayoutInfo[OOXML_LAYOUT_SIZE] = +{ + { 0, "Title Slide", "title" }, + { 1, "Title and text", "tx" }, + { 2, "Title and chart", "chart" }, + { 3, "Title, text on left, text on right", "twoObj" }, + { 4, "Title, text on left and chart on right", "txAndChart" }, + { 6, "Title, text on left, clip art on right", "txAndClipArt" }, + { 6, "Title, text on left, media on right", "txAndMedia" }, + { 7, "Title, chart on left and text on right", "chartAndTx" }, + { 8, "Title and table", "tbl" }, + { 9, "Title, clipart on left, text on right", "clipArtAndTx" }, + { 10, "Title, text on left, object on right", "txAndObj" }, + { 1, "Title and object", "obj" }, + { 12, "Title, text on left, two objects on right", "txAndTwoObj" }, + { 13, "Title, object on left, text on right", "objAndTx" }, + { 14, "Title, object on top, text on bottom", "objOverTx" }, + { 15, "Title, two objects on left, text on right", "twoObjAndTx" }, + { 16, "Title, two objects on top, text on bottom", "twoObjOverTx" }, + { 17, "Title, text on top, object on bottom", "txOverObj" }, + { 18, "Title and four objects", "fourObj" }, { 19, "Title Only", "titleOnly" }, - { 32, "Centered Text", "objOnly" }, // not exactly, but close - { 15, "Title, 2 Content and Content", "twoObjAndObj" }, - { 12, "Title Content and 2 Content", "objAndTwoObj" }, - { 16, "Title, 2 Content over Content", "twoObjOverTx" }, // not exactly, but close - { 14, "Title, Content over Content", "objOverTx" }, // not exactly, but close - { 18, "Title, 4 Content", "fourObj" }, - { 34, "Title, 6 Content", "blank" } // not defined => blank + { 20, "Blank Slide", "blank" }, + { 21, "Vertical title on right, vertical text on top, chart on bottom", "vertTitleAndTxOverChart" }, + { 22, "Vertical title on right, vertical text on left", "vertTitleAndTx" }, + { 23, "Title and vertical text body", "vertTx" }, + { 24, "Title, clip art on left, vertical text on right", "clipArtAndVertTx" }, + { 20, "Title, two objects each with text", "twoTxTwoObj" }, + { 15, "Title, two objects on left, one object on right", "twoObjAndObj" }, + { 20, "Title, object and caption text", "objTx" }, + { 20, "Title, picture, and caption text", "picTx" }, + { 20, "Section header title and subtitle text", "secHead" }, + { 32, "Object only", "objOnly" }, + { 12, "Title, one object on left, two objects on right", "objAndTwoObj" }, + { 20, "Title, media on left, text on right", "mediaAndTx" }, + { 34, "Title, 6 Content", "blank" }, // not defined in OOXML => blank + { 2, "Title and diagram", "dgm" }, + { 0, "Custom layout defined by user", "cust" }, }; -int PowerPointExport::GetPPTXLayoutId(int nOffset) -{ - int nId = LAYOUT_BLANK; - - SAL_INFO("sd.eppt", "GetPPTXLayoutId " << nOffset); - - switch (nOffset) - { - case 0: - nId = LAYOUT_TITLE_SLIDE; - break; - case 1: - nId = LAYOUT_TITLE_CONTENT; - break; - case 3: - nId = LAYOUT_TITLE_2CONTENT; - break; - case 19: - nId = LAYOUT_TITLE; - break; - case 15: - nId = LAYOUT_TITLE_2CONTENT_CONTENT; - break; - case 12: - nId = LAYOUT_TITLE_CONTENT_2CONTENT; - break; - case 16: - nId = LAYOUT_TITLE_2CONTENT_OVER_CONTENT; - break; - case 14: - nId = LAYOUT_TITLE_CONTENT_OVER_CONTENT; - break; - case 18: - nId = LAYOUT_TITLE_4CONTENT; - break; - case 32: - nId = LAYOUT_CENTERED_TEXT; - break; - case 34: - nId = LAYOUT_TITLE_6CONTENT; - break; - case 20: - default: - nId = LAYOUT_BLANK; - break; - } - - return nId; -} - PowerPointShapeExport::PowerPointShapeExport(FSHelperPtr pFS, ShapeHashMap* pShapeMap, PowerPointExport* pFB) : ShapeExport(XML_p, std::move(pFS), pShapeMap, pFB) @@ -392,7 +345,6 @@ PowerPointExport::PowerPointExport(const Reference< XComponentContext >& rContex , mnSlideIdMax(1 << 8) , mnSlideMasterIdMax(1U << 31) , mnAnimationNodeIdMax(1) - , mnThemeIdMax(0) , mnDiagramId(1) , mbCreateNotes(false) , mnPlaceholderIndexMax(1) @@ -1428,7 +1380,7 @@ void PowerPointExport::ImplWriteSlide(sal_uInt32 nPageNum, sal_uInt32 nMasterNum addRelation(pFS->getOutputStream(), oox::getRelationship(Relationship::SLIDELAYOUT), Concat2View("../slideLayouts/slideLayout" + - OUString::number(GetLayoutFileId(GetPPTXLayoutId(GetLayoutOffset(mXPagePropSet)), nMasterNum)) + + OUString::number(GetLayoutFileId(GetLayoutOffset(mXPagePropSet), nMasterNum)) + ".xml")); if (WriteComments(nPageNum)) @@ -1496,111 +1448,8 @@ void PowerPointExport::AddLayoutIdAndRelation(const FSHelperPtr& pFS, sal_Int32 FSNS(XML_r, XML_id), sRelId); } -static bool lcl_ContainsEquivalentObject(SdrPage* pPage, SdrObject* pObj) -{ - bool bFound = false; - SdrObject* pObjNext; - - if (!pPage || !pObj) - return bFound; - - for (size_t nObj = 0; nObj < pPage->GetObjCount(); ++nObj) - { - pObjNext = pPage->GetObj(nObj); - if (pObjNext && pObjNext->GetMergedItemSet().Equals( - pObj->GetMergedItemSet(), false)) - { - bFound = true; - break; - } - } - - return bFound; -} - -static bool lcl_ComparePageObjects(SdrPage* pMasterPage, SdrPage* pMasterNext) -{ - if (!pMasterPage || !pMasterNext) - return false; - - bool bFound = true; - SdrObject* pObjNext; - SdrLayerID aLayer = - pMasterNext->GetLayerAdmin().GetLayerID(sUNO_LayerName_background_objects); - - for (size_t nObj = 0; nObj < pMasterPage->GetObjCount(); ++nObj) - { - pObjNext = pMasterPage->GetObj(nObj); - if (!pObjNext || pObjNext->GetLayer() == aLayer) - continue; - - if (!lcl_ContainsEquivalentObject(pMasterNext, pObjNext)) - { - bFound = false; - break; - } - } - - return bFound; -} - -long PowerPointExport::FindEquivalentMasterPage(SdrPage* pMasterPage) const -{ - SdrPage* pMasterNext; - long nFound = -1; - - if (!pMasterPage) - return nFound; - - for (size_t nMaster = 0; nMaster < mpSlidesMaster.size(); ++nMaster) - { - pMasterNext = mpSlidesMaster[nMaster].first; - if (!pMasterNext) - continue; - - if (pMasterNext->getSdrPageProperties().GetItemSet().Equals( - pMasterPage->getSdrPageProperties().GetItemSet(), false) && - lcl_ComparePageObjects(pMasterPage, pMasterNext)) - { - nFound = nMaster; - break; - } - } - - return nFound; -} - void PowerPointExport::ImplWriteSlideMaster(sal_uInt32 nPageNum, Reference< XPropertySet > const& aXBackgroundPropSet) { - SdrPage* pMasterPage = SdPage::getImplementation(mXDrawPage); - if (!pMasterPage) - return; - - uno::Reference<beans::XPropertySet> xPropSet(mXDrawPage, uno::UNO_QUERY_THROW); - if (!xPropSet.is()) - return; - - sal_Int32 nLayout = 0; - Any aLayout = xPropSet->getPropertyValue("SlideLayout"); - long nFound = FindEquivalentMasterPage(pMasterPage); - if (aLayout.hasValue() && nFound != -1) - { - aLayout >>= nLayout; - size_t nOffset = GetPPTXLayoutId(nLayout); - - if (mLayoutInfo[nOffset].mnFileIdArray.size() < mnMasterPages) - { - mLayoutInfo[nOffset].mnFileIdArray.resize(mnMasterPages); - } - - mLayoutInfo[nOffset].mnFileIdArray[nPageNum] = mpSlidesMaster[nFound].second; - - if (nPageNum == mnMasterPages - 1) - mPresentationFS->endElementNS(XML_p, XML_sldMasterIdLst); - - return; - } - SAL_INFO("sd.eppt", "write master slide: " << nPageNum << "\n--------------"); // slides list @@ -1623,7 +1472,7 @@ void PowerPointExport::ImplWriteSlideMaster(sal_uInt32 nPageNum, Reference< XPro OUString::number(nPageNum + 1) + ".xml", "application/vnd.openxmlformats-officedocument.presentationml.slideMaster+xml"); - + SdrPage* pMasterPage = SdPage::getImplementation(mXDrawPage); model::Theme* pTheme = nullptr; if (pMasterPage) { @@ -1631,12 +1480,12 @@ void PowerPointExport::ImplWriteSlideMaster(sal_uInt32 nPageNum, Reference< XPro } // write theme per master - WriteTheme(mnThemeIdMax, pTheme); + WriteTheme(nPageNum, pTheme); // add implicit relation to the presentation theme addRelation(pFS->getOutputStream(), oox::getRelationship(Relationship::THEME), - Concat2View("../theme/theme" + OUString::number(++mnThemeIdMax) + ".xml")); + Concat2View("../theme/theme" + OUString::number(nPageNum + 1) + ".xml")); pFS->startElementNS(XML_p, XML_sldMaster, PNMSS); @@ -1666,26 +1515,23 @@ void PowerPointExport::ImplWriteSlideMaster(sal_uInt32 nPageNum, Reference< XPro // use master's id type as they have same range, mso does that as well pFS->startElementNS(XML_p, XML_sldLayoutIdLst); - for (int i = 0; i < LAYOUT_SIZE; i++) + sal_Int32 nLayout = 0; + OUString aSlideName; + css::uno::Reference< css::beans::XPropertySet >xPagePropSet; + xPagePropSet.set(mXDrawPage, UNO_QUERY); + if (xPagePropSet.is()) { - sal_Int32 nLayoutFileId = GetLayoutFileId(i, nPageNum); - if (nLayoutFileId > 0) - { - AddLayoutIdAndRelation(pFS, nLayoutFileId); - } - else - { - ImplWritePPTXLayout(i, nPageNum); - AddLayoutIdAndRelation(pFS, GetLayoutFileId(i, nPageNum)); - } + uno::Any aAny; + if (GetPropertyValue(aAny, xPagePropSet, "SlideLayout")) + aAny >>= nLayout; } - if (aLayout.hasValue()) - { - aLayout >>= nLayout; - mpSlidesMaster.push_back(std::make_pair(pMasterPage, - GetLayoutFileId(GetPPTXLayoutId(nLayout), nPageNum))); - } + Reference< XNamed > xNamed(mXDrawPage, UNO_QUERY); + if (xNamed.is()) + aSlideName = xNamed->getName(); + + ImplWritePPTXLayout(nLayout, nPageNum, aSlideName); + AddLayoutIdAndRelation(pFS, GetLayoutFileId(nLayout, nPageNum)); pFS->endElementNS(XML_p, XML_sldLayoutIdLst); @@ -1705,7 +1551,7 @@ sal_Int32 PowerPointExport::GetLayoutFileId(sal_Int32 nOffset, sal_uInt32 nMaste return mLayoutInfo[ nOffset ].mnFileIdArray[ nMasterNum ]; } -void PowerPointExport::ImplWritePPTXLayout(sal_Int32 nOffset, sal_uInt32 nMasterNum) +void PowerPointExport::ImplWritePPTXLayout(sal_Int32 nOffset, sal_uInt32 nMasterNum, const OUString& aSlideName) { SAL_INFO("sd.eppt", "write layout: " << nOffset); @@ -1749,8 +1595,16 @@ void PowerPointExport::ImplWritePPTXLayout(sal_Int32 nOffset, sal_uInt32 nMaster XML_type, aLayoutInfo[ nOffset ].sType, XML_preserve, "1"); - pFS->startElementNS(XML_p, XML_cSld, - XML_name, aLayoutInfo[ nOffset ].sName); + if (!aSlideName.isEmpty()) + { + pFS->startElementNS(XML_p, XML_cSld, + XML_name, aSlideName); + } + else + { + pFS->startElementNS(XML_p, XML_cSld, + XML_name, aLayoutInfo[nOffset].sName); + } //pFS->write( MINIMAL_SPTREE ); // TODO: write actual shape tree WriteShapeTree(pFS, LAYOUT, true); @@ -2385,11 +2239,9 @@ Reference<XShape> PowerPointExport::GetReferencedPlaceholderXShape(const Placeho } else { - SdrPage* pPage = &SdPage::getImplementation(mXDrawPage)->TRG_GetMasterPage(); - long nFound = FindEquivalentMasterPage(pPage); - pMasterPage = dynamic_cast<SdPage*>(nFound != -1 ? mpSlidesMaster[nFound].first : pPage); + pMasterPage = &static_cast<SdPage&>(SdPage::getImplementation(mXDrawPage)->TRG_GetMasterPage()); } - if (SdrObject* pMasterFooter = (pMasterPage ? pMasterPage->GetPresObj(ePresObjKind) : nullptr)) + if (SdrObject* pMasterFooter = pMasterPage->GetPresObj(ePresObjKind)) return GetXShapeForSdrObject(pMasterFooter); } return nullptr; diff --git a/sd/source/ui/animations/CustomAnimationDialog.cxx b/sd/source/ui/animations/CustomAnimationDialog.cxx index e12e6ea123e7..8a2bdffcb162 100644 --- a/sd/source/ui/animations/CustomAnimationDialog.cxx +++ b/sd/source/ui/animations/CustomAnimationDialog.cxx @@ -528,7 +528,7 @@ void SdRotationPropertyBox::updateMenu() mxControl->set_item_active("360", nValue == 360); mxControl->set_item_active("720", nValue == 720); - mxControl->set_item_active("closewise", bDirection); + mxControl->set_item_active("clockwise", bDirection); mxControl->set_item_active("counterclock", !bDirection); } diff --git a/sd/source/ui/animations/CustomAnimationList.cxx b/sd/source/ui/animations/CustomAnimationList.cxx index 0128f210eb77..fecbfa38c52e 100644 --- a/sd/source/ui/animations/CustomAnimationList.cxx +++ b/sd/source/ui/animations/CustomAnimationList.cxx @@ -449,7 +449,7 @@ CustomAnimationList::CustomAnimationList(std::unique_ptr<weld::TreeView> xTreeVi mxTreeView->connect_drag_begin(LINK(this, CustomAnimationList, DragBeginHdl)); mxTreeView->connect_custom_get_size(LINK(this, CustomAnimationList, CustomGetSizeHdl)); mxTreeView->connect_custom_render(LINK(this, CustomAnimationList, CustomRenderHdl)); - mxTreeView->set_column_custom_renderer(0, true); + mxTreeView->set_column_custom_renderer(1, true); } CustomAnimationListDropTarget::CustomAnimationListDropTarget(CustomAnimationList& rTreeView) diff --git a/sd/source/ui/app/sddll.cxx b/sd/source/ui/app/sddll.cxx index c195869b790e..b4734310a39b 100644 --- a/sd/source/ui/app/sddll.cxx +++ b/sd/source/ui/app/sddll.cxx @@ -91,12 +91,24 @@ void SdDLL::RegisterFactorys() { ::sd::ImpressViewShellBase::RegisterFactory ( ::sd::IMPRESS_FACTORY_ID); - ::sd::SlideSorterViewShellBase::RegisterFactory ( - ::sd::SLIDE_SORTER_FACTORY_ID); - ::sd::OutlineViewShellBase::RegisterFactory ( - ::sd::OUTLINE_FACTORY_ID); - ::sd::PresentationViewShellBase::RegisterFactory ( - ::sd::PRESENTATION_FACTORY_ID); + if (comphelper::LibreOfficeKit::isActive()) + { + ::sd::ImpressViewShellBase::RegisterFactory ( + ::sd::SLIDE_SORTER_FACTORY_ID); + ::sd::ImpressViewShellBase::RegisterFactory ( + ::sd::OUTLINE_FACTORY_ID); + ::sd::ImpressViewShellBase::RegisterFactory ( + ::sd::PRESENTATION_FACTORY_ID); + } + else + { + ::sd::SlideSorterViewShellBase::RegisterFactory ( + ::sd::SLIDE_SORTER_FACTORY_ID); + ::sd::OutlineViewShellBase::RegisterFactory ( + ::sd::OUTLINE_FACTORY_ID); + ::sd::PresentationViewShellBase::RegisterFactory ( + ::sd::PRESENTATION_FACTORY_ID); + } } if (!utl::ConfigManager::IsFuzzing() && SvtModuleOptions().IsDraw()) { diff --git a/sd/source/ui/app/sdmod1.cxx b/sd/source/ui/app/sdmod1.cxx index 881d5aa1eefd..eeaa12166bb1 100644 --- a/sd/source/ui/app/sdmod1.cxx +++ b/sd/source/ui/app/sdmod1.cxx @@ -33,6 +33,7 @@ #include <sfx2/docfile.hxx> #include <sfx2/request.hxx> #include <sfx2/templatedlg.hxx> +#include <svl/stritem.hxx> #include <editeng/eeitem.hxx> #include <svx/svxids.hrc> @@ -192,26 +193,32 @@ void SdModule::Execute(SfxRequest& rReq) { bool bIntercept = false; ::sd::DrawDocShell* pDocShell = dynamic_cast< ::sd::DrawDocShell *>( SfxObjectShell::Current() ); - if (pDocShell) + ::sd::ViewShell* pViewShell = pDocShell ? pDocShell->GetViewShell() : nullptr; + if (pViewShell) { - ::sd::ViewShell* pViewShell = pDocShell->GetViewShell(); - if (pViewShell) + if( sd::SlideShow::IsRunning( pViewShell->GetViewShellBase() ) ) { - if( sd::SlideShow::IsRunning( pViewShell->GetViewShellBase() ) ) + // Prevent documents from opening while the slide + // show is running, except when this request comes + // from a shape interaction. + if (rReq.GetArgs() == nullptr) { - // Prevent documents from opening while the slide - // show is running, except when this request comes - // from a shape interaction. - if (rReq.GetArgs() == nullptr) - { - bIntercept = true; - } + bIntercept = true; } } } if (!bIntercept) { + if (const SfxStringItem* pURLItem = rReq.GetArg<SfxStringItem>(SID_FILE_NAME)) + { + if (!pViewShell || !SfxObjectShell::AllowedLinkProtocolFromDocument(pURLItem->GetValue(), + pViewShell->GetObjectShell(), + pViewShell->GetFrameWeld())) + { + return; + } + } SfxGetpApp()->ExecuteSlot(rReq, SfxGetpApp()->GetInterface()); } else diff --git a/sd/source/ui/docshell/docshel4.cxx b/sd/source/ui/docshell/docshel4.cxx index aeee4709208a..74c70579bde7 100644 --- a/sd/source/ui/docshell/docshel4.cxx +++ b/sd/source/ui/docshell/docshel4.cxx @@ -270,7 +270,7 @@ bool DrawDocShell::Load( SfxMedium& rMedium ) if (IsOwnStorageFormat(rMedium)) { mpDoc->SetCompatibilityFlag(SdrCompatibilityFlag::AnchoredTextOverflowLegacy, true); // for tdf#99729 - mpDoc->SetCompatibilityFlag(SdrCompatibilityFlag::LegacySingleLineFontwork, true); // for tdf#148000 + mpDoc->SetCompatibilityFlag(SdrCompatibilityFlag::LegacyFontwork, true); // for tdf#148000 } bool bRet = false; diff --git a/sd/source/ui/remotecontrol/Receiver.cxx b/sd/source/ui/remotecontrol/Receiver.cxx index 48d79e437d44..0846f5bbbe94 100644 --- a/sd/source/ui/remotecontrol/Receiver.cxx +++ b/sd/source/ui/remotecontrol/Receiver.cxx @@ -77,6 +77,12 @@ void Receiver::executeCommand( const std::vector<OString> &aCommand ) { } + if (aCommand.empty()) + { + SAL_WARN("sdremote", "Receiver::executeCommand: no command"); + return; + } + if ( aCommand[0] == "transition_next" ) { if ( xSlideShowController.is() ) @@ -89,6 +95,11 @@ void Receiver::executeCommand( const std::vector<OString> &aCommand ) } else if ( aCommand[0] == "goto_slide" ) { + if (aCommand.size() < 2) + { + SAL_WARN("sdremote", "Receiver::executeCommand: invalid goto_slide"); + return; + } // FIXME: if 0 returned, then not a valid number sal_Int32 aSlide = aCommand[1].toInt32(); if ( xSlideShowController.is() && @@ -121,6 +132,11 @@ void Receiver::executeCommand( const std::vector<OString> &aCommand ) } else if (aCommand[0] == "pointer_started" ) { + if (aCommand.size() < 3) + { + SAL_WARN("sdremote", "Receiver::executeCommand: invalid pointer_started"); + return; + } // std::cerr << "pointer_started" << std::endl; float x = aCommand[1].toFloat(); float y = aCommand[2].toFloat(); @@ -175,6 +191,11 @@ void Receiver::executeCommand( const std::vector<OString> &aCommand ) } else if (aCommand[0] == "pointer_coordination" ) { + if (aCommand.size() < 3) + { + SAL_WARN("sdremote", "Receiver::executeCommand: invalid pointer_coordination"); + return; + } float x = aCommand[1].toFloat(); float y = aCommand[2].toFloat(); diff --git a/sd/source/ui/slideshow/showwin.cxx b/sd/source/ui/slideshow/showwin.cxx index 8e1f8a6d49cd..dfa04f47a07e 100644 --- a/sd/source/ui/slideshow/showwin.cxx +++ b/sd/source/ui/slideshow/showwin.cxx @@ -97,6 +97,12 @@ void ShowWindow::dispose() void ShowWindow::KeyInput(const KeyEvent& rKEvt) { + // Ignore workaround of https://gitlab.gnome.org/GNOME/gtk/issues/1785 + // See calls to GtkSalFrame::makeFakeKeyPress (Fixed in GTK 3.24) + bool bFakeKeyPress = rKEvt.GetKeyCode().GetFullCode() == 0; + if (bFakeKeyPress) + return; + bool bReturn = false; if( SHOWWINDOWMODE_PREVIEW == meShowWindowMode ) @@ -126,11 +132,7 @@ void ShowWindow::KeyInput(const KeyEvent& rKEvt) } else if( SHOWWINDOWMODE_BLANK == meShowWindowMode ) { - bool bFakeKeyPress = rKEvt.GetKeyCode().GetFullCode() == 0; - // Ignore workaround of https://gitlab.gnome.org/GNOME/gtk/issues/1785 - // See calls to GtkSalFrame::makeFakeKeyPress (Fixed in GTK 2.34) - if (!bFakeKeyPress) - RestartShow(); + RestartShow(); bReturn = true; } else if( SHOWWINDOWMODE_PAUSE == meShowWindowMode ) diff --git a/sd/uiconfig/simpress/ui/customanimationspanel.ui b/sd/uiconfig/simpress/ui/customanimationspanel.ui index dda5cda5d1cc..277736f13280 100644 --- a/sd/uiconfig/simpress/ui/customanimationspanel.ui +++ b/sd/uiconfig/simpress/ui/customanimationspanel.ui @@ -111,14 +111,18 @@ <object class="GtkTreeSelection"/> </child> <child> - <object class="GtkTreeViewColumn" id="treeviewcolumn2"> - <property name="spacing">6</property> + <object class="GtkTreeViewColumn" id="treeviewcolumn1"> <child> - <object class="GtkCellRendererPixbuf" id="cellrenderertext4"/> + <object class="GtkCellRendererPixbuf" id="cellrendererpixbuf1"/> <attributes> <attribute name="pixbuf">0</attribute> </attributes> </child> + </object> + </child> + <child> + <object class="GtkTreeViewColumn" id="treeviewcolumn2"> + <property name="spacing">6</property> <child> <object class="GtkCellRendererText" id="cellrenderertext2"/> <attributes> |