editeng/source/xml/xmltxtexp.cxx | 2 include/oox/drawingml/shape.hxx | 5 include/oox/ppt/pptshape.hxx | 3 include/svx/svdobj.hxx | 4 include/svx/svdpage.hxx | 2 include/xmloff/xmlexp.hxx | 2 offapi/com/sun/star/presentation/Shape.idl | 8 oox/inc/drawingml/textbody.hxx | 14 + oox/source/drawingml/shape.cxx | 21 + oox/source/drawingml/shapecontext.cxx | 2 oox/source/drawingml/textbody.cxx | 52 +++ oox/source/export/shapes.cxx | 1 oox/source/ppt/pptshape.cxx | 65 ++++ oox/source/token/properties.txt | 1 sc/qa/unit/data/functions/spreadsheet/fods/xmatch.fods | 236 ++++++++++++----- sc/qa/unit/uicalc/data/tdf140027.ods |binary sc/qa/unit/uicalc/uicalc2.cxx | 24 + sc/source/core/data/attarray.cxx | 8 sc/source/core/tool/interpr1.cxx | 6 sd/inc/sdpage.hxx | 6 sd/qa/unit/data/pptx/tdf163239.pptx |binary sd/qa/unit/export-tests-ooxml4.cxx | 66 ++++ sd/qa/unit/import-tests.cxx | 44 +++ sd/qa/unit/import-tests2.cxx | 8 sd/qa/unit/tiledrendering/data/tdf166882.odp |binary sd/qa/unit/tiledrendering/tiledrendering.cxx | 135 +++++---- sd/source/core/sdpage.cxx | 53 +++ sd/source/filter/eppt/pptx-epptooxml.cxx | 24 + sd/source/ui/inc/unoprnms.hxx | 1 sd/source/ui/unoidl/unoobj.cxx | 46 +++ sd/source/ui/unoidl/unoobj.hxx | 3 sd/source/ui/view/NotesPanelView.cxx | 2 sd/source/ui/view/drawview.cxx | 2 sd/source/ui/view/outlnvsh.cxx | 4 sd/source/ui/view/outlview.cxx | 4 sd/source/ui/view/sdview.cxx | 2 svx/source/svdraw/svdobj.cxx | 5 svx/source/svdraw/svdpage.cxx | 6 xmloff/source/core/xmlexp.cxx | 5 xmloff/source/core/xmlimp.cxx | 5 40 files changed, 705 insertions(+), 172 deletions(-)
New commits: commit 520a744d3024e96e40514cd656e324eb64feb37d Author: Balazs Varga <balazs.va...@collabora.com> AuthorDate: Fri Aug 15 10:32:20 2025 +0200 Commit: Andras Timar <andras.ti...@collabora.com> CommitDate: Tue Aug 19 15:37:11 2025 +0200 Related: tdf#111927 - PPTX: fix placeholder title text becomes small after clicking in&out Add some clean-up for 78e0581ec09078ea5f344bae66d07978396bb23e Change-Id: I48958d77ceaa79de83df54538bc4820f119c022c Reviewed-on: https://gerrit.libreoffice.org/c/core/+/189663 Reviewed-by: Balazs Varga <balazs.va...@collabora.com> Tested-by: Jenkins (cherry picked from commit a7a02a742237d739e7b6b25fcfb9dbe2d4675c28) Reviewed-on: https://gerrit.libreoffice.org/c/core/+/189839 Tested-by: Jenkins CollaboraOffice <jenkinscollaboraoff...@gmail.com> diff --git a/oox/inc/drawingml/textbody.hxx b/oox/inc/drawingml/textbody.hxx index e0683c606a8b..3f4cd0cb7f55 100644 --- a/oox/inc/drawingml/textbody.hxx +++ b/oox/inc/drawingml/textbody.hxx @@ -96,6 +96,7 @@ public: const TextCharacterProperties& rTextStyleProperties, const TextListStylePtr& pMasterTextListStylePtr) const; + /// throws exception void ApplyMasterTextStyle( const ::oox::core::XmlFilterBase& rFilterBase, const css::uno::Reference< css::style::XStyle > & aXStyle, diff --git a/oox/source/ppt/pptshape.cxx b/oox/source/ppt/pptshape.cxx index 5b80d96e0add..a5a0c57aed8f 100644 --- a/oox/source/ppt/pptshape.cxx +++ b/oox/source/ppt/pptshape.cxx @@ -168,49 +168,37 @@ void PPTShape::setTextMasterStyles( const SlidePersist& rSlidePersist, const oox { Reference< style::XStyleFamiliesSupplier > aXStyleFamiliesSupplier(rFilterBase.getModel(), UNO_QUERY_THROW); Reference< container::XNameAccess > aXNameAccess(aXStyleFamiliesSupplier->getStyleFamilies()); + + if (!aXNameAccess.is()) + return; + Reference< container::XNamed > aXNamed(rSlidePersist.getPage(), UNO_QUERY_THROW); + OUString aFamily = aXNamed->getName(); + + if (!aXNameAccess->hasByName(aFamily)) + return; - if (aXNameAccess.is()) + Reference< container::XNameAccess > xFamilies; + if (aXNameAccess->getByName(aFamily) >>= xFamilies) { OUString aStyle; - OUString aFamily; - if (sType == u"com.sun.star.presentation.TitleTextShape") // title style - { aStyle = u"title"_ustr; - aFamily = aXNamed->getName(); - } else if (sType == u"com.sun.star.presentation.SubtitleShape") // subtitle - { aStyle = u"subtitle"_ustr; - aFamily = aXNamed->getName(); - } else if (sType == u"com.sun.star.presentation.OutlinerShape") // body style - { aStyle = u"outline1"_ustr; - aFamily = aXNamed->getName(); - } else if (sType == u"com.sun.star.presentation.NotesShape") // notes style - { aStyle = u"title"_ustr; - aFamily = aXNamed->getName(); - } - Reference< container::XNameAccess > xFamilies; - if (aXNameAccess->hasByName(aFamily)) + if (!xFamilies->hasByName(aStyle)) + return; + + Reference< style::XStyle > aXStyle; + if (xFamilies->getByName(aStyle) >>= aXStyle) { - if (aXNameAccess->getByName(aFamily) >>= xFamilies) - { - if (xFamilies->hasByName(aStyle)) - { - Reference< style::XStyle > aXStyle; - if (xFamilies->getByName(aStyle) >>= aXStyle) - { - TextCharacterProperties aCharStyleProperties; - getTextBody()->ApplyMasterTextStyle(rFilterBase, aXStyle, aCharStyleProperties, mpMasterTextListStyle); - } - } - } + TextCharacterProperties aCharStyleProperties; + getTextBody()->ApplyMasterTextStyle(rFilterBase, aXStyle, aCharStyleProperties, mpMasterTextListStyle); } } } commit 2f2a4c0649808c20411388848a22ae1ac8e2508d Author: Balazs Varga <balazs.va...@collabora.com> AuthorDate: Thu Aug 14 17:30:48 2025 +0200 Commit: Andras Timar <andras.ti...@collabora.com> CommitDate: Tue Aug 19 15:37:11 2025 +0200 tdf#140027 - sc fix inserting rows before pivot table in row 1 Do not copy flags except Scenario when we insert a new row before/ after. Also remove hard attributes when we insert a very new first row on the sheet. (Same what MSO does.) Change-Id: Ia825683ab221f445b1c9977006b3f1cdffb2ea24 Reviewed-on: https://gerrit.libreoffice.org/c/core/+/189614 Tested-by: Jenkins Reviewed-by: Balazs Varga <balazs.va...@collabora.com> (cherry picked from commit f85188809d28dfe01ac8ed8b93e62e17f59773d2) Reviewed-on: https://gerrit.libreoffice.org/c/core/+/189717 Tested-by: Jenkins CollaboraOffice <jenkinscollaboraoff...@gmail.com> diff --git a/sc/qa/unit/uicalc/data/tdf140027.ods b/sc/qa/unit/uicalc/data/tdf140027.ods new file mode 100644 index 000000000000..35cc3089dbfa Binary files /dev/null and b/sc/qa/unit/uicalc/data/tdf140027.ods differ diff --git a/sc/qa/unit/uicalc/uicalc2.cxx b/sc/qa/unit/uicalc/uicalc2.cxx index 83bf9fcd36f5..a8a8a54edab6 100644 --- a/sc/qa/unit/uicalc/uicalc2.cxx +++ b/sc/qa/unit/uicalc/uicalc2.cxx @@ -1649,6 +1649,30 @@ CPPUNIT_TEST_FIXTURE(ScUiCalcTest2, testTdf154044) } } +CPPUNIT_TEST_FIXTURE(ScUiCalcTest2, testTdf140027) +{ + // testing the correct import of autofilter from XLSB + createScDoc("tdf140027.ods"); + + goToCell(u"A1"_ustr); + + ScDocShell* pDocSh = getScDocShell(); + lcl_AssertCurrentCursorPosition(*pDocSh, u"A1"); + + dispatchCommand(mxComponent, u".uno:SelectRow"_ustr, {}); + dispatchCommand(mxComponent, u".uno:InsertRowsBefore"_ustr, {}); + + // check we have no any unnecessary flags + ScDocument* pDoc = getScDoc(); + auto nFlag = pDoc->GetAttr(0, 0, 1, ATTR_MERGE_FLAG)->GetValue(); + CPPUNIT_ASSERT_EQUAL(ScMF::NONE, nFlag); + + const ScPatternAttr* pPattern = pDoc->GetPattern(1, 0, 1); + const ScPatternAttr aDefPattern = pPattern->getCellAttributeHelper().getDefaultCellAttribute(); + // check that the default pattern is not changed + CPPUNIT_ASSERT(ScPatternAttr::areSame(pPattern, &aDefPattern)); +} + CPPUNIT_PLUGIN_IMPLEMENT(); /* vim:set shiftwidth=4 softtabstop=4 expandtab: */ diff --git a/sc/source/core/data/attarray.cxx b/sc/source/core/data/attarray.cxx index 852db370cf54..044ef2102916 100644 --- a/sc/source/core/data/attarray.cxx +++ b/sc/source/core/data/attarray.cxx @@ -2255,7 +2255,13 @@ void ScAttrArray::InsertRow( SCROW nStartRow, SCSIZE nSize ) // Don't duplicate the merge flags in the inserted row. // #i108488# ScMF::Scenario has to be allowed. - RemoveFlags( nStartRow, nStartRow+nSize-1, ScMF::Hor | ScMF::Ver | ScMF::Auto | ScMF::Button ); + RemoveFlags(nStartRow, nStartRow + nSize - 1, (ScMF::All & ~ScMF::Scenario)); + // tdf#140027: set new default attributes if we insert very first rows. + if (nStartRow == 0) + { + const CellAttributeHolder aDefHolder(&rDocument.getCellAttributeHelper().getDefaultCellAttribute()); + SetPatternArea(nStartRow, nStartRow + nSize - 1, aDefHolder); + } } void ScAttrArray::DeleteRow( SCROW nStartRow, SCSIZE nSize ) commit 5ba87dd8dfb0fcc450581b372cde5257d173dcf6 Author: Balazs Varga <balazs.va...@collabora.com> AuthorDate: Tue Aug 12 19:16:55 2025 +0200 Commit: Andras Timar <andras.ti...@collabora.com> CommitDate: Tue Aug 19 15:37:11 2025 +0200 tdf#111927 - PPTX: fix placeholder title text becomes small after clicking in&out Set the first paragraph of text styles for placeholder shapes. Change-Id: Ib44a5b2752a1e9aaad4fe7333c0652f0578db7f9 Reviewed-on: https://gerrit.libreoffice.org/c/core/+/189445 Tested-by: Jenkins Reviewed-by: Balazs Varga <balazs.va...@collabora.com> (cherry picked from commit 78e0581ec09078ea5f344bae66d07978396bb23e) Reviewed-on: https://gerrit.libreoffice.org/c/core/+/189563 Reviewed-by: Justin Luth <jl...@mail.com> Tested-by: Jenkins CollaboraOffice <jenkinscollaboraoff...@gmail.com> diff --git a/include/oox/ppt/pptshape.hxx b/include/oox/ppt/pptshape.hxx index 02c60a69a759..a20c8d5487d6 100644 --- a/include/oox/ppt/pptshape.hxx +++ b/include/oox/ppt/pptshape.hxx @@ -55,6 +55,9 @@ class PPTShape final : public oox::drawingml::Shape bool IsPlaceHolderCandidate(const SlidePersist& rSlidePersist) const; + void setTextMasterStyles(const SlidePersist& rSlidePersist, const oox::core::XmlFilterBase& rFilterBase, + const std::u16string_view& sType); + public: PPTShape( const oox::ppt::ShapeLocation eShapeLocation, diff --git a/oox/inc/drawingml/textbody.hxx b/oox/inc/drawingml/textbody.hxx index d059ed501306..e0683c606a8b 100644 --- a/oox/inc/drawingml/textbody.hxx +++ b/oox/inc/drawingml/textbody.hxx @@ -31,6 +31,10 @@ namespace com::sun::star::text { class XTextCursor; } +namespace com::sun::star::style { + class XStyle; +} + namespace oox::core { class XmlFilterBase; } namespace oox::drawingml { @@ -91,6 +95,12 @@ public: const css::uno::Reference < css::text::XText > & xText, const TextCharacterProperties& rTextStyleProperties, const TextListStylePtr& pMasterTextListStylePtr) const; + + void ApplyMasterTextStyle( + const ::oox::core::XmlFilterBase& rFilterBase, + const css::uno::Reference< css::style::XStyle > & aXStyle, + const TextCharacterProperties& rTextStyleProperties, + const TextListStylePtr& pMasterTextListStylePtr) const; private: TextParagraphVector maParagraphs; TextBodyProperties maTextProperties; diff --git a/oox/source/drawingml/textbody.cxx b/oox/source/drawingml/textbody.cxx index 9e1c68b5206f..34a80115a231 100644 --- a/oox/source/drawingml/textbody.cxx +++ b/oox/source/drawingml/textbody.cxx @@ -19,6 +19,7 @@ #include <drawingml/textbody.hxx> #include <com/sun/star/beans/XPropertySet.hpp> +#include <com/sun/star/style/XStyle.hpp> #include <drawingml/textparagraph.hxx> #include <oox/helper/propertyset.hxx> #include <oox/token/properties.hxx> @@ -166,6 +167,42 @@ void TextBody::ApplyStyleEmpty( } } +void TextBody::ApplyMasterTextStyle( + const ::oox::core::XmlFilterBase& rFilterBase, + const css::uno::Reference< css::style::XStyle >& aXStyle, + const TextCharacterProperties& rTextStyleProperties, + const TextListStylePtr& pMasterTextListStylePtr) const +{ + assert(!isEmpty()); + + if (maParagraphs.empty()) + return; + + // Apply character properties + PropertySet aPropSet(aXStyle); + TextCharacterProperties aTextCharacterProps(maParagraphs[0]->getCharacterStyle( + rTextStyleProperties, *pMasterTextListStylePtr, maTextListStyle)); + aTextCharacterProps.pushToPropSet(aPropSet, rFilterBase); + + // Apply paragraph properties + TextListStyle aCombinedTextStyle; + aCombinedTextStyle.apply(*pMasterTextListStylePtr); + aCombinedTextStyle.apply(maTextListStyle); + + TextParagraphProperties* pTextParagraphStyle = maParagraphs[0]->getParagraphStyle(aCombinedTextStyle); + if (pTextParagraphStyle) + { + Reference< XPropertySet > xProps(aXStyle, UNO_QUERY_THROW); + PropertyMap aioBulletList; + aioBulletList.setProperty< sal_Int32 >(PROP_LeftMargin, 0); // Init bullets left margin to 0 (no bullets). + float nCharHeight = xProps->getPropertyValue(u"CharHeight"_ustr).get<float>(); + TextParagraphProperties aParaProp; + aParaProp.apply(*pTextParagraphStyle); + aParaProp.pushToPropSet(&rFilterBase, xProps, aioBulletList, &pTextParagraphStyle->getBulletList(), + true, nCharHeight, true); + } +} + } /* vim:set shiftwidth=4 softtabstop=4 expandtab: */ diff --git a/oox/source/ppt/pptshape.cxx b/oox/source/ppt/pptshape.cxx index 61adfbd87512..5b80d96e0add 100644 --- a/oox/source/ppt/pptshape.cxx +++ b/oox/source/ppt/pptshape.cxx @@ -26,6 +26,8 @@ #include <editeng/flditem.hxx> #include <com/sun/star/text/XTextField.hpp> +#include <com/sun/star/style/XStyle.hpp> +#include <com/sun/star/style/XStyleFamiliesSupplier.hpp> #include <com/sun/star/container/XNamed.hpp> #include <com/sun/star/frame/XModel.hpp> #include <com/sun/star/lang/XMultiServiceFactory.hpp> @@ -157,6 +159,66 @@ bool PPTShape::IsPlaceHolderCandidate(const SlidePersist& rSlidePersist) const return ShapeHasNoVisualPropertiesOnImport(*this); } +void PPTShape::setTextMasterStyles( const SlidePersist& rSlidePersist, const oox::core::XmlFilterBase& rFilterBase, const std::u16string_view& sType ) +{ + if (!rSlidePersist.isMasterPage()) + return; + + try + { + Reference< style::XStyleFamiliesSupplier > aXStyleFamiliesSupplier(rFilterBase.getModel(), UNO_QUERY_THROW); + Reference< container::XNameAccess > aXNameAccess(aXStyleFamiliesSupplier->getStyleFamilies()); + Reference< container::XNamed > aXNamed(rSlidePersist.getPage(), UNO_QUERY_THROW); + + if (aXNameAccess.is()) + { + OUString aStyle; + OUString aFamily; + + if (sType == u"com.sun.star.presentation.TitleTextShape") // title style + { + aStyle = u"title"_ustr; + aFamily = aXNamed->getName(); + } + else if (sType == u"com.sun.star.presentation.SubtitleShape") // subtitle + { + aStyle = u"subtitle"_ustr; + aFamily = aXNamed->getName(); + } + else if (sType == u"com.sun.star.presentation.OutlinerShape") // body style + { + aStyle = u"outline1"_ustr; + aFamily = aXNamed->getName(); + } + else if (sType == u"com.sun.star.presentation.NotesShape") // notes style + { + aStyle = u"title"_ustr; + aFamily = aXNamed->getName(); + } + + Reference< container::XNameAccess > xFamilies; + if (aXNameAccess->hasByName(aFamily)) + { + if (aXNameAccess->getByName(aFamily) >>= xFamilies) + { + if (xFamilies->hasByName(aStyle)) + { + Reference< style::XStyle > aXStyle; + if (xFamilies->getByName(aStyle) >>= aXStyle) + { + TextCharacterProperties aCharStyleProperties; + getTextBody()->ApplyMasterTextStyle(rFilterBase, aXStyle, aCharStyleProperties, mpMasterTextListStyle); + } + } + } + } + } + } + catch (const Exception&) + { + } +} + void PPTShape::addShape( oox::core::XmlFilterBase& rFilterBase, const SlidePersist& rSlidePersist, @@ -462,6 +524,11 @@ void PPTShape::addShape( getTextBody()->ApplyStyleEmpty(rFilterBase, xText, aCharStyleProperties, mpMasterTextListStyle); } } + // Apply text properties on master placeholder styles + if (meShapeLocation == Layout && getTextBody() && !getTextBody()->isEmpty()) + { + setTextMasterStyles(rSlidePersist, rFilterBase, sServiceName); + } if (pShapeMap) { // bnc#705982 - if optional model id reference is diff --git a/sd/qa/unit/import-tests.cxx b/sd/qa/unit/import-tests.cxx index 41beb185e0c6..4f71fcd9665e 100644 --- a/sd/qa/unit/import-tests.cxx +++ b/sd/qa/unit/import-tests.cxx @@ -2092,6 +2092,50 @@ CPPUNIT_TEST_FIXTURE(SdImportTest, testTdf143603) CPPUNIT_ASSERT_EQUAL(size_t(0), pDoc->GetUndoManager()->GetUndoActionCount()); } +CPPUNIT_TEST_FIXTURE(SdImportTest, testTdf111927) +{ + createSdImpressDoc("pptx/tdf163239.pptx"); + + uno::Reference<style::XStyleFamiliesSupplier> xStyleFamiliesSupplier(mxComponent, + uno::UNO_QUERY); + uno::Reference<container::XNameAccess> xStyleFamilies + = xStyleFamiliesSupplier->getStyleFamilies(); + + // 1st slide + uno::Reference<container::XNameAccess> xStyleFamily( + xStyleFamilies->getByName(u"Title Slide"_ustr), uno::UNO_QUERY); + { + uno::Reference<style::XStyle> xStyle(xStyleFamily->getByName(u"title"_ustr), + uno::UNO_QUERY); + uno::Reference<beans::XPropertySet> xPropSet(xStyle, uno::UNO_QUERY); + + CPPUNIT_ASSERT_EQUAL(44.0f, xPropSet->getPropertyValue(u"CharHeight"_ustr).get<float>()); + CPPUNIT_ASSERT_EQUAL(sal_Int16(style::ParagraphAdjust_CENTER), + xPropSet->getPropertyValue(u"ParaAdjust"_ustr).get<sal_Int16>()); + } + { + uno::Reference<style::XStyle> xStyle(xStyleFamily->getByName(u"subtitle"_ustr), + uno::UNO_QUERY); + uno::Reference<beans::XPropertySet> xPropSet(xStyle, uno::UNO_QUERY); + + CPPUNIT_ASSERT_EQUAL(32.0f, xPropSet->getPropertyValue(u"CharHeight"_ustr).get<float>()); + CPPUNIT_ASSERT_EQUAL(sal_Int16(style::ParagraphAdjust_CENTER), + xPropSet->getPropertyValue(u"ParaAdjust"_ustr).get<sal_Int16>()); + } + // 2nd slide + xStyleFamily.set(xStyleFamilies->getByName(u"simple text placeholder"_ustr), uno::UNO_QUERY); + { + uno::Reference<style::XStyle> xStyle(xStyleFamily->getByName(u"outline1"_ustr), + uno::UNO_QUERY); + uno::Reference<beans::XPropertySet> xPropSet(xStyle, uno::UNO_QUERY); + + float nCharHeight = xPropSet->getPropertyValue(u"CharHeight"_ustr).get<float>(); + CPPUNIT_ASSERT_EQUAL(60.0f, nCharHeight); + CPPUNIT_ASSERT_EQUAL(sal_Int16(style::ParagraphAdjust_CENTER), + xPropSet->getPropertyValue(u"ParaAdjust"_ustr).get<sal_Int16>()); + } +} + CPPUNIT_PLUGIN_IMPLEMENT(); /* vim:set shiftwidth=4 softtabstop=4 expandtab: */ diff --git a/sd/qa/unit/import-tests2.cxx b/sd/qa/unit/import-tests2.cxx index c0b18df3855a..c9986b17b924 100644 --- a/sd/qa/unit/import-tests2.cxx +++ b/sd/qa/unit/import-tests2.cxx @@ -174,18 +174,18 @@ CPPUNIT_TEST_FIXTURE(SdImportTest2, testTdf157285) sal_Int32 nHeight1 = xShape1->getSize().Height; // Without the fix in place, this test would have failed with - // Expected: placeholder height: 2795 + // Expected: placeholder height: 2565 // Actual : placeholder height: 3435 - CPPUNIT_ASSERT_EQUAL(sal_Int32(2795), nHeight1); + CPPUNIT_ASSERT_EQUAL(sal_Int32(2565), nHeight1); uno::Reference<drawing::XShape> xShape2(getShapeFromPage(1, 0), uno::UNO_QUERY); CPPUNIT_ASSERT(xShape2.is()); sal_Int32 nHeight2 = xShape2->getSize().Height; // Without the fix in place, this test would have failed with - // Expected: placeholder height: 1271 + // Expected: placeholder height: 1180 // Actual : placeholder height: 11303 - CPPUNIT_ASSERT_EQUAL(sal_Int32(1271), nHeight2); + CPPUNIT_ASSERT_EQUAL(sal_Int32(1180), nHeight2); } CPPUNIT_TEST_FIXTURE(SdImportTest2, testTdf152186) commit 66ea35681a263b48a0e290aae0606db76171abf3 Author: Balazs Varga <balazs.va...@collabora.com> AuthorDate: Fri Aug 8 13:06:38 2025 +0200 Commit: Andras Timar <andras.ti...@collabora.com> CommitDate: Tue Aug 19 15:37:10 2025 +0200 tdf#163239 - OOXML sd: fix customized placeholder text in master slide to be shown as the "prompt" text in the final slides What should works - New sd specific uno api shape property: CustomPromptText - With this property, the corresponding master slide SdrObj's and their final slide SdrObj's placeholder text can be set. - If we have CustomPromptText value it will be used for the PresetObj and will be created (CreatePresObj) with those texts as a default prompt text. If we do not have the usual default ones will be used. - OOXML import and export (partly since we have many other problems around export) are works - Enable to OOXML import of com.sun.star.presentation.SubtitleShape (partly, since in the core we handle them as Text objects) to handle them a bit better. OOXML export is still not good for different reasons: see tdf#112557 - Unit tests for custom "prompt" text TODO - odf import/export - we cannot set in runtime new custom placeholder texts, so the new placeholders/presobj will be created with the usual default texts. Change-Id: Ic2b06a10f7a19f0cfdb2b705645b08a24b3e433b Reviewed-on: https://gerrit.libreoffice.org/c/core/+/189185 Tested-by: Jenkins Reviewed-by: Balazs Varga <balazs.va...@collabora.com> (cherry picked from commit 41c59a730ffce72202083b8ce3438c10ba18f1d1) Reviewed-on: https://gerrit.libreoffice.org/c/core/+/189517 Tested-by: Jenkins CollaboraOffice <jenkinscollaboraoff...@gmail.com> Reviewed-by: Justin Luth <jl...@mail.com> diff --git a/include/oox/drawingml/shape.hxx b/include/oox/drawingml/shape.hxx index 81797757faaf..40c207be2edd 100644 --- a/include/oox/drawingml/shape.hxx +++ b/include/oox/drawingml/shape.hxx @@ -244,6 +244,8 @@ public: void setTxbxHasLinkedTxtBox( const bool rhs){ mbHasLinkedTxbx = rhs; }; const LinkedTxbxAttr& getLinkedTxbxAttributes() const { return maLinkedTxbxAttr; }; bool isLinkedTxbx() const { return mbHasLinkedTxbx; }; + void setCustomPrompt( bool bValue ) { mbHasCustomPrompt = bValue; } + bool getCustomPrompt() const { return mbHasCustomPrompt; } void setZOrder(sal_Int32 nZOrder) { mnZOrder = nZOrder; } @@ -298,7 +300,7 @@ protected: const Theme* pTheme, const css::uno::Reference< css::drawing::XShapes >& rxShapes, bool bClearText, - bool bDoNotInsertEmptyTextBody, + const oox::drawingml::ShapePtr& pPlaceholder, basegfx::B2DHomMatrix& aTransformation, const FillProperties& rShapeOrParentShapeFillProps, const oox::drawingml::ShapePtr& pParentGroupShape = nullptr @@ -430,6 +432,7 @@ private: bool mbTextBox; ///< This shape has a textbox. LinkedTxbxAttr maLinkedTxbxAttr; bool mbHasLinkedTxbx; // this text box has linked text box ? + bool mbHasCustomPrompt; // indicates that it's not a generic placeholder css::uno::Sequence<css::beans::PropertyValue> maDiagramDoms; diff --git a/include/svx/svdobj.hxx b/include/svx/svdobj.hxx index 621c44e78c4a..524e57e59f44 100644 --- a/include/svx/svdobj.hxx +++ b/include/svx/svdobj.hxx @@ -826,6 +826,8 @@ public: void SetEmptyPresObj(bool bEpt); bool IsEmptyPresObj() const { return m_bEmptyPresObj;} + void SetCustomPromptText(const OUString& aVal); + OUString GetCustomPromptText() const { return m_aCustomPromptText; } void SetNotVisibleAsMaster(bool bFlg); bool IsNotVisibleAsMaster() const { return m_bNotVisibleAsMaster;} void SetUserCall(SdrObjUserCall* pUser); @@ -915,6 +917,8 @@ protected: bool mbLineIsOutsideGeometry : 1; // #i25616# bool mbSupportTextIndentingOnLineWidthChange : 1; + // custom prompt text for empty presentation object + OUString m_aCustomPromptText; std::unique_ptr<sdr::annotation::ObjectAnnotationData> mpAnnotationData; diff --git a/include/svx/svdpage.hxx b/include/svx/svdpage.hxx index f64af22e1353..4b0a4eb84b51 100644 --- a/include/svx/svdpage.hxx +++ b/include/svx/svdpage.hxx @@ -520,6 +520,8 @@ public: void MakePageObjectsNamesUnique(); + virtual bool RestoreDefaultText(SdrObject* pObj, const OUString& rStr); + protected: void TRG_ImpMasterPageRemoved(const SdrPage& rRemovedPage); diff --git a/offapi/com/sun/star/presentation/Shape.idl b/offapi/com/sun/star/presentation/Shape.idl index 0539228e090d..07abc55e8a81 100644 --- a/offapi/com/sun/star/presentation/Shape.idl +++ b/offapi/com/sun/star/presentation/Shape.idl @@ -128,6 +128,14 @@ published service Shape */ [property] long Verb; + /** Determines if the shape has custom placeholder text. + + This is the custom placeholder text for Presentation objects. + + @since LibreOffice 26.2 + */ + [optional, property] string CustomPromptText; + }; diff --git a/oox/inc/drawingml/textbody.hxx b/oox/inc/drawingml/textbody.hxx index 245589e86ac3..d059ed501306 100644 --- a/oox/inc/drawingml/textbody.hxx +++ b/oox/inc/drawingml/textbody.hxx @@ -64,7 +64,10 @@ public: const TextCharacterProperties& rTextStyleProperties, const TextListStylePtr& pMasterTextListStyle ) const; bool isEmpty() const; + /// Returns first run of text OUString toString() const; + /// Returns first paragraph of text + OUString firstParatoString() const; /** Returns whether the textbody had a rPr tag in it that alters it visually * diff --git a/oox/source/drawingml/shape.cxx b/oox/source/drawingml/shape.cxx index 4cb0160facee..54b8d91ba663 100644 --- a/oox/source/drawingml/shape.cxx +++ b/oox/source/drawingml/shape.cxx @@ -153,6 +153,7 @@ Shape::Shape() , mbWps( false ) , mbTextBox( false ) , mbHasLinkedTxbx( false ) +, mbHasCustomPrompt( false ) , maDiagramDoms( 0 ) , mpDiagramHelper( nullptr ) { @@ -186,6 +187,7 @@ Shape::Shape( const OUString& rServiceName, bool bDefaultHeight ) , mbWps( false ) , mbTextBox( false ) , mbHasLinkedTxbx( false ) +, mbHasCustomPrompt( false ) , maDiagramDoms( 0 ) , mpDiagramHelper( nullptr ) { @@ -230,6 +232,7 @@ Shape::Shape( const ShapePtr& pSourceShape ) , mbWps( pSourceShape->mbWps ) , mbTextBox( pSourceShape->mbTextBox ) , mbHasLinkedTxbx(false) +, mbHasCustomPrompt( pSourceShape->mbHasCustomPrompt ) , maDiagramDoms( pSourceShape->maDiagramDoms ) , mnZOrder(pSourceShape->mnZOrder) , mnZOrderOff(pSourceShape->mnZOrderOff) @@ -394,7 +397,7 @@ void Shape::addShape( if( !sServiceName.isEmpty() ) { basegfx::B2DHomMatrix aMatrix( aTransformation ); - Reference< XShape > xShape( createAndInsert( rFilterBase, sServiceName, pTheme, rxShapes, false, false, aMatrix, rShapeOrParentShapeFillProps, pParentGroupShape) ); + Reference< XShape > xShape( createAndInsert( rFilterBase, sServiceName, pTheme, rxShapes, false, nullptr, aMatrix, rShapeOrParentShapeFillProps, pParentGroupShape) ); if( pShapeMap && !msId.isEmpty() ) { @@ -916,7 +919,7 @@ Reference< XShape > const & Shape::createAndInsert( const Theme* pTheme, const css::uno::Reference< css::drawing::XShapes >& rxShapes, bool bClearText, - bool bDoNotInsertEmptyTextBody, + const oox::drawingml::ShapePtr& pPlaceholder, basegfx::B2DHomMatrix& aParentTransformation, const FillProperties& rShapeOrParentShapeFillProps, const oox::drawingml::ShapePtr& pParentGroupShape) @@ -1816,6 +1819,16 @@ Reference< XShape > const & Shape::createAndInsert( propertySet->setPropertyValue(u"InteropGrabBag"_ustr,uno::Any(aGrabBag)); } + // set custom prompt text if available + if (getCustomPrompt() && getTextBody() && !getTextBody()->isEmpty()) + { + aShapeProps.setProperty(PROP_CustomPromptText, getTextBody()->firstParatoString()); + } + else if (pPlaceholder && pPlaceholder->getCustomPrompt() && pPlaceholder->getTextBody() && !pPlaceholder->getTextBody()->isEmpty()) + { + aShapeProps.setProperty(PROP_CustomPromptText, pPlaceholder->getTextBody()->firstParatoString()); + } + PropertySet( xSet ).setProperties( aShapeProps ); if (mpTablePropertiesPtr && aServiceName == "com.sun.star.drawing.TableShape") @@ -2132,7 +2145,7 @@ Reference< XShape > const & Shape::createAndInsert( mpTextBody.reset(); // in some cases, we don't have any text body. - if( mpTextBody && ( !bDoNotInsertEmptyTextBody || !mpTextBody->isEmpty() ) ) + if( mpTextBody && ( !pPlaceholder || !mpTextBody->isEmpty() ) ) { Reference < XText > xText( mxShape, UNO_QUERY ); if ( xText.is() ) // not every shape is supporting an XText interface (e.g. GroupShape) @@ -2223,7 +2236,7 @@ Reference< XShape > const & Shape::createAndInsert( } // Set text glow effect for shapes - if (mpTextBody && (!bDoNotInsertEmptyTextBody || !mpTextBody->isEmpty())) + if (mpTextBody && (!pPlaceholder || !mpTextBody->isEmpty())) { const TextParagraphVector& rParagraphs = mpTextBody->getParagraphs(); if (!rParagraphs.empty()) diff --git a/oox/source/drawingml/shapecontext.cxx b/oox/source/drawingml/shapecontext.cxx index 1cd22c7cd422..2dc77a0e676f 100644 --- a/oox/source/drawingml/shapecontext.cxx +++ b/oox/source/drawingml/shapecontext.cxx @@ -86,6 +86,8 @@ ContextHandlerRef ShapeContext::onCreateContext( sal_Int32 aElementToken, const mpShapePtr->setSubType( rAttribs.getToken( XML_type, XML_obj ) ); if( rAttribs.hasAttribute( XML_idx ) ) mpShapePtr->setSubTypeIndex( rAttribs.getInteger( XML_idx, 0 ) ); + if( rAttribs.hasAttribute( XML_hasCustomPrompt ) ) + mpShapePtr->setCustomPrompt( rAttribs.getBool( XML_hasCustomPrompt, false ) ); break; // nvSpPr CT_ShapeNonVisual end diff --git a/oox/source/drawingml/textbody.cxx b/oox/source/drawingml/textbody.cxx index 1d9e45f505f5..9e1c68b5206f 100644 --- a/oox/source/drawingml/textbody.cxx +++ b/oox/source/drawingml/textbody.cxx @@ -95,6 +95,21 @@ OUString TextBody::toString() const return OUString(); } +OUString TextBody::firstParatoString() const +{ + OUStringBuffer aRet; + if (!isEmpty()) + { + const TextRunVector& rRuns = maParagraphs.front()->getRuns(); + for (TextRunVector::const_iterator aRIt = rRuns.begin(), aREnd = rRuns.end(); aRIt != aREnd; ++aRIt) + { + const TextRun& rTextRun = **aRIt; + aRet.append(rTextRun.getText()); + } + } + return aRet.makeStringAndClear(); +} + bool TextBody::hasVisualRunProperties() const { for ( auto& pTextParagraph : getParagraphs() ) diff --git a/oox/source/export/shapes.cxx b/oox/source/export/shapes.cxx index d8c396382217..b4062cda91f5 100644 --- a/oox/source/export/shapes.cxx +++ b/oox/source/export/shapes.cxx @@ -2185,6 +2185,7 @@ constexpr auto constMap = frozen::make_unordered_map<std::u16string_view, ShapeC { u"com.sun.star.presentation.OutlinerShape", &ShapeExport::WriteTextShape }, { u"com.sun.star.presentation.SlideNumberShape", &ShapeExport::WriteTextShape }, { u"com.sun.star.presentation.TitleTextShape", &ShapeExport::WriteTextShape }, + //{ u"com.sun.star.presentation.SubtitleShape", &ShapeExport::WriteTextShape }, TODO: handle subtitle shape: see tdf#112557 workaround }); } // end anonymous namespace diff --git a/oox/source/ppt/pptshape.cxx b/oox/source/ppt/pptshape.cxx index 634c46dc5255..61adfbd87512 100644 --- a/oox/source/ppt/pptshape.cxx +++ b/oox/source/ppt/pptshape.cxx @@ -195,12 +195,8 @@ void PPTShape::addShape( break; case XML_subTitle : { - if ((meShapeLocation == Master) || (meShapeLocation == Layout)) - sServiceName = OUString(); - else { - sServiceName = "com.sun.star.presentation.SubtitleShape"; - aMasterTextListStyle = rSlidePersist.getMasterPersist() ? rSlidePersist.getMasterPersist()->getBodyTextStyle() : rSlidePersist.getBodyTextStyle(); - } + sServiceName = "com.sun.star.presentation.SubtitleShape"; + aMasterTextListStyle = rSlidePersist.getMasterPersist() ? rSlidePersist.getMasterPersist()->getBodyTextStyle() : rSlidePersist.getBodyTextStyle(); } break; case XML_obj : @@ -454,7 +450,7 @@ void PPTShape::addShape( } else setMasterTextListStyle( aMasterTextListStyle ); - Reference< XShape > xShape( createAndInsert( rFilterBase, sServiceName, pTheme, rxShapes, bClearText, bool(mpPlaceholder), aTransformation, getFillProperties() ) ); + Reference< XShape > xShape( createAndInsert( rFilterBase, sServiceName, pTheme, rxShapes, bClearText, mpPlaceholder, aTransformation, getFillProperties() ) ); // Apply text properties on placeholder text inside this placeholder shape if (meShapeLocation == Slide && mpPlaceholder && getTextBody() && getTextBody()->isEmpty()) diff --git a/oox/source/token/properties.txt b/oox/source/token/properties.txt index d73008a80539..36e9a16991ef 100644 --- a/oox/source/token/properties.txt +++ b/oox/source/token/properties.txt @@ -125,6 +125,7 @@ CurveName CurveStyle CustomLabelPosition CustomLabelSize +CustomPromptText CustomShapeGeometry D3DSceneAmbientColor D3DSceneLightColor2 diff --git a/sd/inc/sdpage.hxx b/sd/inc/sdpage.hxx index 71b47e4b7cc9..1b2cafc550c9 100644 --- a/sd/inc/sdpage.hxx +++ b/sd/inc/sdpage.hxx @@ -167,7 +167,7 @@ public: sd::ShapeList& GetPresentationShapeList() { return maPresentationShapeList; } void EnsureMasterPageDefaultBackground(); - SD_DLLPUBLIC SdrObject* CreatePresObj(PresObjKind eObjKind, bool bVertical, const ::tools::Rectangle& rRect); + SD_DLLPUBLIC SdrObject* CreatePresObj(PresObjKind eObjKind, bool bVertical, const ::tools::Rectangle& rRect, const OUString& rCustomPrompt = OUString()); SD_DLLPUBLIC rtl::Reference<SdrObject> CreateDefaultPresObj(PresObjKind eObjKind); SD_DLLPUBLIC void DestroyDefaultPresObj(PresObjKind eObjKind); SD_DLLPUBLIC SdrObject* GetPresObj(PresObjKind eObjKind, int nIndex = 1, bool bFuzzySearch = false ); @@ -177,7 +177,7 @@ public: SfxStyleSheet* GetStyleSheetForPresObj(PresObjKind eObjKind) const; void GetPageInfo(::tools::JsonWriter& jsonWriter); void NotifyPagePropertyChanges(); - bool RestoreDefaultText( SdrObject* pObj ); + bool RestoreDefaultText( SdrObject* pObj, const OUString& rStr ) override; /** @return true if the given SdrObject is inside the presentation object list */ bool IsPresObj(const SdrObject* pObj); @@ -191,7 +191,7 @@ public: SD_DLLPUBLIC void SetAutoLayout(AutoLayout eLayout, bool bInit=false, bool bCreate=false); AutoLayout GetAutoLayout() const { return meAutoLayout; } void CreateTitleAndLayout(bool bInit=false, bool bCreate=false); - SdrObject* InsertAutoLayoutShape(SdrObject* pObj, PresObjKind eObjKind, bool bVertical, const ::tools::Rectangle& rRect, bool bInit); + SdrObject* InsertAutoLayoutShape(SdrObject* pObj, PresObjKind eObjKind, bool bVertical, const ::tools::Rectangle& rRect, const OUString& rCustomPrompt, bool bInit); virtual void NbcInsertObject(SdrObject* pObj, size_t nPos=SAL_MAX_SIZE) override; virtual rtl::Reference<SdrObject> NbcRemoveObject(size_t nObjNum) override; diff --git a/sd/qa/unit/data/pptx/tdf163239.pptx b/sd/qa/unit/data/pptx/tdf163239.pptx new file mode 100644 index 000000000000..7dbc2e2a9862 Binary files /dev/null and b/sd/qa/unit/data/pptx/tdf163239.pptx differ diff --git a/sd/qa/unit/export-tests-ooxml4.cxx b/sd/qa/unit/export-tests-ooxml4.cxx index d9bea30c1334..c88f71db7db4 100644 --- a/sd/qa/unit/export-tests-ooxml4.cxx +++ b/sd/qa/unit/export-tests-ooxml4.cxx @@ -797,7 +797,7 @@ CPPUNIT_TEST_FIXTURE(SdOOXMLExportTest4, testTdf140912_PicturePlaceholder) CPPUNIT_ASSERT(isEmptyPresentationObject); // If we supported custom prompt text, here we would also test "String" property, - // which would be equal to "Insert Image". + // which would be equal to "Insert Image". See first tests: testCustomPromptTexts } CPPUNIT_TEST_FIXTURE(SdOOXMLExportTest4, testEnhancedPathViewBox) @@ -1374,6 +1374,70 @@ CPPUNIT_TEST_FIXTURE(SdOOXMLExportTest4, testTdf165261HorzAnchor) CPPUNIT_ASSERT_EQUAL(drawing::TextHorizontalAdjust::TextHorizontalAdjust_CENTER, eHori); } +CPPUNIT_TEST_FIXTURE(SdOOXMLExportTest4, testCustomPromptTexts) +{ + createSdImpressDoc("pptx/tdf163239.pptx"); + saveAndReload(u"Impress Office Open XML"_ustr); + + const SdrPage* pPage1 = GetPage(1); + { + // subtitle placeholder text + SdrTextObj* pTxtObj = DynCastSdrTextObj(pPage1->GetObj(0)); + CPPUNIT_ASSERT_MESSAGE("no text object", pTxtObj != nullptr); + CPPUNIT_ASSERT_EQUAL_MESSAGE("Wrong object type!", SdrObjKind::Text, + pTxtObj->GetObjIdentifier()); + const EditTextObject& aEdit = pTxtObj->GetOutlinerParaObject()->GetTextObject(); + OUString aText = aEdit.GetText(0); + CPPUNIT_ASSERT_EQUAL_MESSAGE("Wrong placeholder text!", aText, u"Click to add Text"_ustr); + /* TODO: handle subtitle shape: see tdf#112557 workaround + - Expected: Click to edit customized Master Subtitle style + - Actual : Click to add Text + - Wrong placeholder text! + */ + + auto xShapeProps(getShapeFromPage(0, 0)); + CPPUNIT_ASSERT(xShapeProps->getPropertyValue(u"CustomPromptText"_ustr) >>= aText); + CPPUNIT_ASSERT_EQUAL_MESSAGE("Wrong placeholder text was set!", aText, u""_ustr); + /* TODO: handle subtitle shape: see tdf#112557 workaround + - Expected: Click to edit customized Master Subtitle style + - Actual : + - Wrong placeholder text was set! + */ + } + + { + SdrTextObj* pTxtObj = DynCastSdrTextObj(pPage1->GetObj(1)); + CPPUNIT_ASSERT_MESSAGE("no text object", pTxtObj != nullptr); + CPPUNIT_ASSERT_EQUAL_MESSAGE("Wrong object type!", SdrObjKind::TitleText, + pTxtObj->GetObjIdentifier()); + const EditTextObject& aEdit = pTxtObj->GetOutlinerParaObject()->GetTextObject(); + OUString aText = aEdit.GetText(0); + CPPUNIT_ASSERT_EQUAL_MESSAGE("Wrong placeholder text!", aText, u"Custom Title 1"_ustr); + + auto xShapeProps(getShapeFromPage(1, 0)); + CPPUNIT_ASSERT(xShapeProps->getPropertyValue(u"CustomPromptText"_ustr) >>= aText); + CPPUNIT_ASSERT_EQUAL_MESSAGE("Wrong placeholder text was set!", aText, + u"Custom Title 1"_ustr); + } + + const SdrPage* pPage2 = GetPage(3); + { + // body placeholder text + SdrTextObj* pTxtObj = DynCastSdrTextObj(pPage2->GetObj(0)); + CPPUNIT_ASSERT_MESSAGE("no text object", pTxtObj != nullptr); + CPPUNIT_ASSERT_EQUAL_MESSAGE("Wrong object type!", SdrObjKind::OutlineText, + pTxtObj->GetObjIdentifier()); + const EditTextObject& aEdit = pTxtObj->GetOutlinerParaObject()->GetTextObject(); + OUString aText = aEdit.GetText(0); + CPPUNIT_ASSERT_EQUAL_MESSAGE("Wrong placeholder text!", aText, u"Text placeholder"_ustr); + + auto xShapeProps(getShapeFromPage(0, 1)); + CPPUNIT_ASSERT(xShapeProps->getPropertyValue(u"CustomPromptText"_ustr) >>= aText); + CPPUNIT_ASSERT_EQUAL_MESSAGE("Wrong placeholder text was set!", aText, + u"Text placeholder"_ustr); + } +} + CPPUNIT_PLUGIN_IMPLEMENT(); /* vim:set shiftwidth=4 softtabstop=4 expandtab: */ diff --git a/sd/source/core/sdpage.cxx b/sd/source/core/sdpage.cxx index 76ab8e4b42cd..0d8d5aeebd6c 100644 --- a/sd/source/core/sdpage.cxx +++ b/sd/source/core/sdpage.cxx @@ -284,7 +284,7 @@ void SdPage::EnsureMasterPageDefaultBackground() /** creates a presentation object with the given PresObjKind on this page. A user call will be set */ -SdrObject* SdPage::CreatePresObj(PresObjKind eObjKind, bool bVertical, const ::tools::Rectangle& rRect ) +SdrObject* SdPage::CreatePresObj(PresObjKind eObjKind, bool bVertical, const ::tools::Rectangle& rRect, const OUString& rCustomPrompt) { SfxUndoManager* pUndoManager(static_cast< SdDrawDocument& >(getSdrModelFromSdrPage()).GetUndoManager()); const bool bUndo = pUndoManager && pUndoManager->IsInListAction() && IsInserted(); @@ -498,7 +498,15 @@ SdrObject* SdPage::CreatePresObj(PresObjKind eObjKind, bool bVertical, const ::t pSdrObj->SetLogicRect(rRect); } - OUString aString = GetPresObjText(eObjKind); + OUString aString; + if (!rCustomPrompt.isEmpty()) + { + pSdrObj->SetCustomPromptText(rCustomPrompt); + aString = rCustomPrompt; + } + else + aString = GetPresObjText(eObjKind); + if(!aString.isEmpty() || bForceText) if (auto pTextObj = DynCastSdrTextObj( pSdrObj.get() ) ) { @@ -1479,6 +1487,32 @@ static void CalcAutoLayoutRectangles( SdPage const & rPage,::tools::Rectangle* r } } +static void GetAutoLayoutCustomPromptTexts( SdPage& rPage, const LayoutDescriptor& rDescriptor, std::array<OUString, MAX_PRESOBJS>& rCustomPrompts ) +{ + // init layout shapes with their corresponding prompt text (if they have) + // for each presentation shape kind + if (rPage.GetPageKind() == PageKind::Handout || !rPage.TRG_HasMasterPage()) + return; + + SdPage& rMasterPage = static_cast<SdPage&>(rPage.TRG_GetMasterPage()); + + o3tl::enumarray<PresObjKind,int> PresObjIndex; + PresObjIndex.fill(1); + + // for each entry in the layoutdescriptor, arrange a presentation shape + for (int i = 0; (i < MAX_PRESOBJS) && (rDescriptor.meKind[i] != PresObjKind::NONE); i++) + { + PresObjKind eKind = rDescriptor.meKind[i]; + SdrObject* pObj = nullptr; + while( (pObj = rMasterPage.GetPresObj( eKind, PresObjIndex[eKind], true )) != nullptr ) + { + PresObjIndex[eKind]++; // on next search for eKind, find next shape with same eKind + rCustomPrompts[i] = pObj->GetCustomPromptText(); + break; + } + } +} + static void findAutoLayoutShapesImpl( SdPage& rPage, const LayoutDescriptor& rDescriptor, std::array<SdrObject*, MAX_PRESOBJS>& rShapes, bool bInit, bool bSwitchLayout ) { // init list of indexes for each presentation shape kind @@ -1662,6 +1696,9 @@ void SdPage::SetAutoLayout(AutoLayout eLayout, bool bInit, bool bCreate ) OUString sLayoutName( enumtoString(meAutoLayout) ); CalcAutoLayoutRectangles( *this, aRectangle, sLayoutName); + std::array<OUString, MAX_PRESOBJS > aCustomPromptTexts; + GetAutoLayoutCustomPromptTexts( *this, aDescriptor, aCustomPromptTexts ); + o3tl::sorted_vector< SdrObject* > aUsedPresentationObjects; std::array<SdrObject*, MAX_PRESOBJS > aLayoutShapes; @@ -1672,7 +1709,7 @@ void SdPage::SetAutoLayout(AutoLayout eLayout, bool bInit, bool bCreate ) for (int i = 0; (i < MAX_PRESOBJS) && (aDescriptor.meKind[i] != PresObjKind::NONE); i++) { PresObjKind eKind = aDescriptor.meKind[i]; - SdrObject* pObj = InsertAutoLayoutShape( aLayoutShapes[i], eKind, aDescriptor.mbVertical[i], aRectangle[i], bInit ); + SdrObject* pObj = InsertAutoLayoutShape( aLayoutShapes[i], eKind, aDescriptor.mbVertical[i], aRectangle[i], aCustomPromptTexts[i], bInit ); if( pObj ) aUsedPresentationObjects.insert(pObj); // remember that we used this empty shape } @@ -2247,12 +2284,14 @@ static rtl::Reference<SdrObject> convertPresentationObjectImpl(SdPage& rPage, Sd If true, the shape is created vertical if bInit is true @param rRect The rectangle that should be used to transform the shape + @param rCustomPrompt + The custom prompt text for placeholder text in presObj's, if its empty the default is used @param bInit If true the shape is created if not found @returns A presentation shape that was either found or created with the given parameters */ -SdrObject* SdPage::InsertAutoLayoutShape(SdrObject* pObj1, PresObjKind eObjKind, bool bVertical, const ::tools::Rectangle& rRect, bool bInit) +SdrObject* SdPage::InsertAutoLayoutShape(SdrObject* pObj1, PresObjKind eObjKind, bool bVertical, const ::tools::Rectangle& rRect, const OUString& rCustomPrompt, bool bInit) { rtl::Reference<SdrObject> pObj = pObj1; SfxUndoManager* pUndoManager(static_cast< SdDrawDocument& >(getSdrModelFromSdrPage()).GetUndoManager()); @@ -2260,7 +2299,7 @@ SdrObject* SdPage::InsertAutoLayoutShape(SdrObject* pObj1, PresObjKind eObjKind, if (!pObj && bInit) { - pObj = CreatePresObj(eObjKind, bVertical, rRect); + pObj = CreatePresObj(eObjKind, bVertical, rRect, rCustomPrompt); } else if ( pObj && (pObj->GetUserCall() || bInit) ) { @@ -2922,7 +2961,7 @@ bool SdPage::checkVisibility( return true; } -bool SdPage::RestoreDefaultText( SdrObject* pObj ) +bool SdPage::RestoreDefaultText( SdrObject* pObj, const OUString& rStr ) { bool bRet = false; @@ -2939,7 +2978,7 @@ bool SdPage::RestoreDefaultText( SdrObject* pObj ) { sd::ModifyGuard aGuard(static_cast<SdDrawDocument*>(&getSdrModelFromSdrPage())); - OUString aString( GetPresObjText(ePresObjKind) ); + OUString aString = rStr.isEmpty() ? GetPresObjText(ePresObjKind) : rStr; if (!aString.isEmpty()) { diff --git a/sd/source/filter/eppt/pptx-epptooxml.cxx b/sd/source/filter/eppt/pptx-epptooxml.cxx index 80c41260545b..30977208cf16 100644 --- a/sd/source/filter/eppt/pptx-epptooxml.cxx +++ b/sd/source/filter/eppt/pptx-epptooxml.cxx @@ -345,6 +345,12 @@ ShapeExport& PowerPointShapeExport::WriteTextShape(const Reference< XShape >& xS if (!WritePlaceholder(xShape, Title, mbMaster)) ShapeExport::WriteTextShape(xShape); } + /*else if (sShapeType == "com.sun.star.presentation.SubtitleShape") + { + TODO: handle subtitle shape: see tdf#112557 workaround + if (!WritePlaceholder(xShape, Subtitle, mbMaster)) + ShapeExport::WriteTextShape(xShape); + }*/ else SAL_WARN("sd.eppt", "PowerPointShapeExport::WriteTextShape: shape of type '" << sShapeType << "' is ignored"); @@ -2420,20 +2426,32 @@ ShapeExport& PowerPointShapeExport::WritePlaceholderShape(const Reference< XShap const char* pType = getPlaceholderTypeName(ePlaceholder); SAL_INFO("sd.eppt", "write placeholder " << pType); + + // export Custom Prompt + bool bUseCustomPrompt(false); + if (xProps.is() && xProps->getPropertySetInfo()->hasPropertyByName(u"CustomPromptText"_ustr)) + { + OUString aCustomPromptText; + xProps->getPropertyValue(u"CustomPromptText"_ustr) >>= aCustomPromptText; + if (!aCustomPromptText.isEmpty()) + bUseCustomPrompt = true; + } + if (bUsePlaceholderIndex) { mpFS->singleElementNS( XML_p, XML_ph, XML_type, pType, XML_idx, OString::number( - static_cast<PowerPointExport*>(GetFB())->CreateNewPlaceholderIndex(xShape))); + static_cast<PowerPointExport*>(GetFB())->CreateNewPlaceholderIndex(xShape)), + XML_hasCustomPrompt, sax_fastparser::UseIf("1", bUseCustomPrompt)); } else { if ((mePageType == PageType::LAYOUT || mePageType == PageType::NORMAL) && ePlaceholder == Outliner) - mpFS->singleElementNS(XML_p, XML_ph); + mpFS->singleElementNS(XML_p, XML_ph, XML_hasCustomPrompt, sax_fastparser::UseIf("1", bUseCustomPrompt)); else - mpFS->singleElementNS(XML_p, XML_ph, XML_type, pType); + mpFS->singleElementNS(XML_p, XML_ph, XML_type, pType, XML_hasCustomPrompt, sax_fastparser::UseIf("1", bUseCustomPrompt)); } mpFS->endElementNS(XML_p, XML_nvPr); mpFS->endElementNS(XML_p, XML_nvSpPr); diff --git a/sd/source/ui/inc/unoprnms.hxx b/sd/source/ui/inc/unoprnms.hxx index 9753c1a2871a..062d898f4992 100644 --- a/sd/source/ui/inc/unoprnms.hxx +++ b/sd/source/ui/inc/unoprnms.hxx @@ -59,6 +59,7 @@ #define UNO_NAME_OBJ_MASTERDEPENDENT "IsPlaceholderDependent" #define UNO_NAME_OBJ_ANIMATIONPATH "AnimationPath" #define UNO_NAME_OBJ_LEGACYFRAGMENT "LegacyFragment" +#define UNO_NAME_OBJ_CUSTOMPROMPT "CustomPromptText" #define UNO_NAME_LAYER_LOCKED "IsLocked" #define UNO_NAME_LAYER_PRINTABLE "IsPrintable" diff --git a/sd/source/ui/unoidl/unoobj.cxx b/sd/source/ui/unoidl/unoobj.cxx index 49633f61bc30..2dd93e58097d 100644 --- a/sd/source/ui/unoidl/unoobj.cxx +++ b/sd/source/ui/unoidl/unoobj.cxx @@ -104,6 +104,8 @@ using ::com::sun::star::drawing::XShape; #define WID_PLACEHOLDERTEXT 24 #define WID_LEGACYFRAGMENT 25 +#define WID_CUSTOMPROMPT 26 + #define IMPRESS_MAP_ENTRIES \ { u"" UNO_NAME_OBJ_LEGACYFRAGMENT ""_ustr,WID_LEGACYFRAGMENT, cppu::UnoType<drawing::XShape>::get(), 0, 0},\ { u"" UNO_NAME_OBJ_ANIMATIONPATH ""_ustr, WID_ANIMPATH, cppu::UnoType<drawing::XShape>::get(), 0, 0},\ @@ -128,6 +130,7 @@ using ::com::sun::star::drawing::XShape; { u"IsAnimation"_ustr, WID_ISANIMATION, cppu::UnoType<bool>::get(), 0, 0},\ { u"NavigationOrder"_ustr, WID_NAVORDER, cppu::UnoType<sal_Int32>::get(), 0, 0},\ { u"PlaceholderText"_ustr, WID_PLACEHOLDERTEXT, cppu::UnoType<OUString>::get(), 0, 0},\ + { u"" UNO_NAME_OBJ_CUSTOMPROMPT ""_ustr, WID_CUSTOMPROMPT, cppu::UnoType<OUString>::get(), 0, 0},\ static std::span<const SfxItemPropertyMapEntry> lcl_GetImpress_SdXShapePropertyGraphicMap_Impl() { @@ -574,6 +577,14 @@ void SAL_CALL SdXShape::setPropertyValue( const OUString& aPropertyName, const c case WID_ISEMPTYPRESOBJ: SetEmptyPresObj( ::cppu::any2bool(aValue) ); break; + case WID_CUSTOMPROMPT: + { + OUString aString; + if (!(aValue >>= aString)) + throw lang::IllegalArgumentException(); + SetCustomPromptText(aString); + break; + } case WID_MASTERDEPEND: SetMasterDepend( ::cppu::any2bool(aValue) ); break; @@ -672,6 +683,9 @@ css::uno::Any SAL_CALL SdXShape::getPropertyValue( const OUString& PropertyName case WID_ISEMPTYPRESOBJ: aRet <<= IsEmptyPresObj(); break; + case WID_CUSTOMPROMPT: + aRet <<= GetCustomPromptText(); + break; case WID_MASTERDEPEND: aRet <<= IsMasterDepend(); break; @@ -948,6 +962,38 @@ void SdXShape::SetEmptyPresObj(bool bEmpty) pObj->SetEmptyPresObj(bEmpty); } +OUString SdXShape::GetCustomPromptText() const +{ + if (!IsPresObj()) + return OUString(); + + SdrObject* pObj = mpShape->GetSdrObject(); + if (pObj == nullptr) + return OUString(); + + return pObj->GetCustomPromptText(); +} + +void SdXShape::SetCustomPromptText(const OUString& aVal) +{ + if (!IsPresObj() || aVal.isEmpty()) + return; + + SdrObject* pObj = mpShape->GetSdrObject(); + if (pObj == nullptr) + return; + + if (!pObj->getSdrPageFromSdrObject()->IsMasterPage()) + { + if (pObj->getSdrPageFromSdrObject()->RestoreDefaultText(pObj, aVal)) + pObj->SetCustomPromptText(aVal); + } + else + { + pObj->SetCustomPromptText(aVal); + } +} + bool SdXShape::IsMasterDepend() const noexcept { SdrObject* pObj = mpShape->GetSdrObject(); diff --git a/sd/source/ui/unoidl/unoobj.hxx b/sd/source/ui/unoidl/unoobj.hxx index 7c78bc520dcd..52206ea21a4a 100644 --- a/sd/source/ui/unoidl/unoobj.hxx +++ b/sd/source/ui/unoidl/unoobj.hxx @@ -57,6 +57,9 @@ private: bool IsEmptyPresObj() const; void SetEmptyPresObj(bool bEmpty); + OUString GetCustomPromptText() const; + void SetCustomPromptText(const OUString& aVal); + bool IsMasterDepend() const noexcept; void SetMasterDepend( bool bDepend ) noexcept; diff --git a/sd/source/ui/view/NotesPanelView.cxx b/sd/source/ui/view/NotesPanelView.cxx index 42562275b70f..3ed6d4690f6b 100644 --- a/sd/source/ui/view/NotesPanelView.cxx +++ b/sd/source/ui/view/NotesPanelView.cxx @@ -219,7 +219,7 @@ void NotesPanelView::onLoseFocus() // if the notes are empty restore the placeholder text and state. SdPage* pPage = dynamic_cast<SdPage*>(pNotesTextObj->getSdrPageFromSdrObject()); if (pPage) - pPage->RestoreDefaultText(pNotesTextObj); + pPage->RestoreDefaultText(pNotesTextObj, pNotesTextObj->GetCustomPromptText()); } else setNotesToDoc(); diff --git a/sd/source/ui/view/drawview.cxx b/sd/source/ui/view/drawview.cxx index c6da08c44f29..5f139cb620b4 100644 --- a/sd/source/ui/view/drawview.cxx +++ b/sd/source/ui/view/drawview.cxx @@ -592,7 +592,7 @@ void DrawView::DeleteMarked() SdrTextObj* pTextObj = DynCastSdrTextObj( pObj ); bool bVertical = pTextObj && pTextObj->IsVerticalWriting(); ::tools::Rectangle aRect( pObj->GetLogicRect() ); - SdrObject* pNewObj = pPage->InsertAutoLayoutShape( nullptr, ePresObjKind, bVertical, aRect, true ); + SdrObject* pNewObj = pPage->InsertAutoLayoutShape(nullptr, ePresObjKind, bVertical, aRect, OUString(), true); // pUndoManager should not be NULL (see assert above) // but since we have defensive code diff --git a/sd/source/ui/view/outlnvsh.cxx b/sd/source/ui/view/outlnvsh.cxx index e6e66c77558d..ea1347ccc42b 100644 --- a/sd/source/ui/view/outlnvsh.cxx +++ b/sd/source/ui/view/outlnvsh.cxx @@ -1620,7 +1620,7 @@ void OutlineViewShell::UpdateTitleObject( SdPage* pPage, Paragraph const * pPara // make it empty if( pOlView->isRecordingUndo() ) pOlView->AddUndo(GetDoc()->GetSdrUndoFactory().CreateUndoObjectSetText(*pTO,0)); - pPage->RestoreDefaultText( pTO ); + pPage->RestoreDefaultText( pTO, pTO->GetCustomPromptText() ); pTO->SetEmptyPresObj(true); pTO->ActionChanged(); } @@ -1720,7 +1720,7 @@ void OutlineViewShell::UpdateOutlineObject( SdPage* pPage, Paragraph* pPara ) // delete old OutlinerParaObject, too if( pOlView->isRecordingUndo() ) pOlView->AddUndo(GetDoc()->GetSdrUndoFactory().CreateUndoObjectSetText(*pTO,0)); - pPage->RestoreDefaultText( pTO ); + pPage->RestoreDefaultText( pTO, pTO->GetCustomPromptText() ); pTO->SetEmptyPresObj(true); pTO->ActionChanged(); } diff --git a/sd/source/ui/view/outlview.cxx b/sd/source/ui/view/outlview.cxx index cf5d0e081ae6..256a505dd9e6 100644 --- a/sd/source/ui/view/outlview.cxx +++ b/sd/source/ui/view/outlview.cxx @@ -908,7 +908,7 @@ SdrTextObj* OutlineView::CreateTitleTextObject(SdPage* pPage) { // we already have a layout with a title but the title // object was deleted, create a new one - pPage->InsertAutoLayoutShape( nullptr, PresObjKind::Title, false, pPage->GetTitleRect(), true ); + pPage->InsertAutoLayoutShape( nullptr, PresObjKind::Title, false, pPage->GetTitleRect(), OUString(), true ); } return GetTitleTextObject(pPage); @@ -944,7 +944,7 @@ SdrTextObj* OutlineView::CreateOutlineTextObject(SdPage* pPage) // object was deleted, create a new one pPage->InsertAutoLayoutShape( nullptr, PresObjKind::Outline, - false, pPage->GetLayoutRect(), true ); + false, pPage->GetLayoutRect(), OUString(), true ); } return GetOutlineTextObject(pPage); diff --git a/sd/source/ui/view/sdview.cxx b/sd/source/ui/view/sdview.cxx index 5a6be3034fb8..4ae79b48177e 100644 --- a/sd/source/ui/view/sdview.cxx +++ b/sd/source/ui/view/sdview.cxx @@ -853,7 +853,7 @@ bool View::RestoreDefaultText( SdrTextObj* pTextObj ) if(pPage) { - bRestored = pPage->RestoreDefaultText( pTextObj ); + bRestored = pPage->RestoreDefaultText( pTextObj, pTextObj->GetCustomPromptText() ); if( bRestored ) { SdrOutliner* pOutliner = GetTextEditOutliner(); diff --git a/svx/source/svdraw/svdobj.cxx b/svx/source/svdraw/svdobj.cxx index 4eb5146a0c0e..88226a6bfa1a 100644 --- a/svx/source/svdraw/svdobj.cxx +++ b/svx/source/svdraw/svdobj.cxx @@ -1779,6 +1779,7 @@ bool SdrObject::Equals(const SdrObject& rOtherObj) const return (m_aAnchor.X() == rOtherObj.m_aAnchor.X() && m_aAnchor.Y() == rOtherObj.m_aAnchor.Y() && m_nOrdNum == rOtherObj.m_nOrdNum && mnNavigationPosition == rOtherObj.mnNavigationPosition && mbSupportTextIndentingOnLineWidthChange == rOtherObj.mbSupportTextIndentingOnLineWidthChange && + m_aCustomPromptText == rOtherObj.m_aCustomPromptText && mbLineIsOutsideGeometry == rOtherObj.mbLineIsOutsideGeometry && m_bMarkProt == rOtherObj.m_bMarkProt && m_bIs3DObj == rOtherObj.m_bIs3DObj && m_bIsEdge == rOtherObj.m_bIsEdge && m_bClosedObj == rOtherObj.m_bClosedObj && m_bNotVisibleAsMaster == rOtherObj.m_bNotVisibleAsMaster && m_bEmptyPresObj == rOtherObj.m_bEmptyPresObj && @@ -2578,6 +2579,10 @@ void SdrObject::SetEmptyPresObj(bool bEpt) m_bEmptyPresObj = bEpt; } +void SdrObject::SetCustomPromptText(const OUString& rVal) +{ + m_aCustomPromptText = rVal; +} void SdrObject::SetNotVisibleAsMaster(bool bFlg) { diff --git a/svx/source/svdraw/svdpage.cxx b/svx/source/svdraw/svdpage.cxx index 672f89b2bb87..755b95c284f2 100644 --- a/svx/source/svdraw/svdpage.cxx +++ b/svx/source/svdraw/svdpage.cxx @@ -1726,6 +1726,12 @@ void SdrPage::MakePageObjectsNamesUnique() } } +bool SdrPage::RestoreDefaultText(SdrObject* /*pObj*/, const OUString& /*rStr*/) +{ + assert(false); + return false; +} + const SdrPageGridFrameList* SdrPage::GetGridFrameList(const SdrPageView* /*pPV*/, const tools::Rectangle* /*pRect*/) const { return nullptr; commit f1dffd7b792dcf2e8a06ad52896f3dd0c90d5881 Author: Balazs Varga <balazs.va...@collabora.com> AuthorDate: Tue Jul 29 16:22:25 2025 +0200 Commit: Andras Timar <andras.ti...@collabora.com> CommitDate: Tue Aug 19 15:37:10 2025 +0200 tdf#166882 - sd odf clipboard: fix missing copy/pasted graphic bullets Export/import to/from odf clipboard the bitmap of the graphic bullets numbering rules. This is a follow up commit of: 66ed51712bb323bba7d1a0b0d21b256e5f5f9ccf (Bug 128046 - List hierachy not maintained on copy'n'paste) With this extra patch we can also copy/paste the graphic bullets numbering rules together with their texts. However, this goes against the MS Office and OnlyOffice behaviour, where copying text/paragraphs only copies the text, not the list rules. So if we would just want to follow that way, it would be enough to remove UNO_NAME_NUMBERING_RULES, EE_PARA_NUMBULLET from SvxXMLTextImportComponentPropertyMap and SvxXMLTextExportComponentPropertyMap See more info in: https://bugs.documentfoundation.org/show_bug.cgi?id=166882#c5 Change-Id: I3c0b7389adf0d8efee95cc94f02905c3600342c8 Reviewed-on: https://gerrit.libreoffice.org/c/core/+/188532 Tested-by: Jenkins Reviewed-by: Balazs Varga <balazs.va...@collabora.com> Reviewed-on: https://gerrit.libreoffice.org/c/core/+/188729 Tested-by: Jenkins CollaboraOffice <jenkinscollaboraoff...@gmail.com> Reviewed-by: Miklos Vajna <vmik...@collabora.com> diff --git a/editeng/source/xml/xmltxtexp.cxx b/editeng/source/xml/xmltxtexp.cxx index feab612a9d9d..4b29cd700544 100644 --- a/editeng/source/xml/xmltxtexp.cxx +++ b/editeng/source/xml/xmltxtexp.cxx @@ -265,7 +265,7 @@ SvxXMLTextExportComponent::SvxXMLTextExportComponent( const ESelection& rSel, const css::uno::Reference< css::xml::sax::XDocumentHandler > & xHandler) : SvXMLExport( xContext, u""_ustr, /*rFileName*/u""_ustr, xHandler, static_cast<frame::XModel*>(new SvxSimpleUnoModel()), FieldUnit::CM, - SvXMLExportFlags::OASIS | SvXMLExportFlags::AUTOSTYLES | SvXMLExportFlags::CONTENT ) + SvXMLExportFlags::OASIS | SvXMLExportFlags::AUTOSTYLES | SvXMLExportFlags::CONTENT | SvXMLExportFlags::EMBEDDED ) { SvxEditEngineSource aEditSource( pEditEngine ); diff --git a/include/xmloff/xmlexp.hxx b/include/xmloff/xmlexp.hxx index e02d864c3f34..4ff51e19bc50 100644 --- a/include/xmloff/xmlexp.hxx +++ b/include/xmloff/xmlexp.hxx @@ -99,7 +99,7 @@ enum class SvXMLExportFlags { SCRIPTS = 0x0020, SETTINGS = 0x0040, FONTDECLS = 0x0080, - EMBEDDED = 0x0100, + EMBEDDED = 0x0100, // for flat-ODF export PRETTY = 0x0400, OASIS = 0x8000, ALL = 0x05ff diff --git a/sd/qa/unit/tiledrendering/data/tdf166882.odp b/sd/qa/unit/tiledrendering/data/tdf166882.odp new file mode 100644 index 000000000000..f6ca6a5f1a93 Binary files /dev/null and b/sd/qa/unit/tiledrendering/data/tdf166882.odp differ diff --git a/sd/qa/unit/tiledrendering/tiledrendering.cxx b/sd/qa/unit/tiledrendering/tiledrendering.cxx index 3892b36b5a85..5b8e6bd3c2a1 100644 --- a/sd/qa/unit/tiledrendering/tiledrendering.cxx +++ b/sd/qa/unit/tiledrendering/tiledrendering.cxx @@ -1114,73 +1114,80 @@ CPPUNIT_TEST_FIXTURE(SdTiledRenderingTest, testPostKeyEventInvalidation) } /** - * tests a cut/paste bug around bullet items in a list + * tests a cut/paste bug around bullet items in a list and + * graphic (bitmap) bullet items in a list (Tdf103083, Tdf166882) */ -CPPUNIT_TEST_FIXTURE(SdTiledRenderingTest, testTdf103083) +CPPUNIT_TEST_FIXTURE(SdTiledRenderingTest, testClipNumRules) { - // Load the document. - SdXImpressDocument* pXImpressDocument = createDoc("tdf103083.fodp"); - sd::ViewShell* pViewShell = pXImpressDocument->GetDocShell()->GetViewShell(); - SdPage* pActualPage = pViewShell->GetActualPage(); - - SdrObject* pObject1 = pActualPage->GetObj(1); - CPPUNIT_ASSERT_EQUAL(SdrObjKind::OutlineText, pObject1->GetObjIdentifier()); - SdrTextObj* pTextObject = static_cast<SdrTextObj*>(pObject1); - - SdrView* pView = pViewShell->GetView(); - - // select contents of bullet item - ::tools::Rectangle aRect = pTextObject->GetCurrentBoundRect(); - pXImpressDocument->postMouseEvent(LOK_MOUSEEVENT_MOUSEBUTTONDOWN, - o3tl::toTwips(aRect.Left() + 2, o3tl::Length::mm100), o3tl::toTwips(aRect.Top() + 2, o3tl::Length::mm100), - 1, MOUSE_LEFT, 0); - pXImpressDocument->postMouseEvent(LOK_MOUSEEVENT_MOUSEBUTTONUP, - o3tl::toTwips(aRect.Left() + 2, o3tl::Length::mm100), o3tl::toTwips(aRect.Top() + 2, o3tl::Length::mm100), - 1, MOUSE_LEFT, 0); - Scheduler::ProcessEventsToIdle(); - pView->SdrBeginTextEdit(pTextObject); - CPPUNIT_ASSERT(pView->GetTextEditObject()); - EditView& rEditView = pView->GetTextEditOutlinerView()->GetEditView(); - rEditView.SetSelection(ESelection(2, 0, 2, 33)); // start para, start char, end para, end char. - CPPUNIT_ASSERT_EQUAL(u"They have all the same formatting"_ustr, rEditView.GetSelected()); - SdrOutliner* pOutliner = pView->GetTextEditOutliner(); - CPPUNIT_ASSERT_EQUAL(u"No-Logo Content~LT~Gliederung 2"_ustr, - pOutliner->GetStyleSheet(2)->GetName()); - const EditTextObject& aEdit = pTextObject->GetOutlinerParaObject()->GetTextObject(); - const SvxNumBulletItem* pNumFmt = aEdit.GetParaAttribs(2).GetItem(EE_PARA_NUMBULLET); - SvxNumberFormat aNumFmt(pNumFmt->GetNumRule().GetLevel(2)); - - // cut contents of bullet item - dispatchCommand(mxComponent, u".uno:Cut"_ustr, uno::Sequence<beans::PropertyValue>()); - - CPPUNIT_ASSERT(pView->GetTextEditObject()); - EditView& rEditView2 = pView->GetTextEditOutlinerView()->GetEditView(); - rEditView2.SetSelection(ESelection(2, 0, 2, 10)); // start para, start char, end para, end char. - CPPUNIT_ASSERT_EQUAL(OUString(), rEditView2.GetSelected()); - - // paste contents of bullet item - dispatchCommand(mxComponent, u".uno:Paste"_ustr, uno::Sequence<beans::PropertyValue>()); - - // send an ESC key to trigger the commit of the edit to the main model - pXImpressDocument->postKeyEvent(LOK_KEYEVENT_KEYINPUT, 0, awt::Key::ESCAPE); - pXImpressDocument->postKeyEvent(LOK_KEYEVENT_KEYUP, 0, awt::Key::ESCAPE); - Scheduler::ProcessEventsToIdle(); + std::vector<const char*> aFileNames = { "tdf103083.fodp", "tdf166882.odp" }; + for (const char* pFileName : aFileNames) + { + // Load the document. + SdXImpressDocument* pXImpressDocument = createDoc(pFileName); + CPPUNIT_ASSERT(pXImpressDocument); + + sd::ViewShell* pViewShell = pXImpressDocument->GetDocShell()->GetViewShell(); + SdPage* pActualPage = pViewShell->GetActualPage(); + + SdrObject* pObject1 = pActualPage->GetObj(1); + CPPUNIT_ASSERT_EQUAL(SdrObjKind::OutlineText, pObject1->GetObjIdentifier()); + SdrTextObj* pTextObject = static_cast<SdrTextObj*>(pObject1); + + SdrView* pView = pViewShell->GetView(); + + // select contents of bullet item + ::tools::Rectangle aRect = pTextObject->GetCurrentBoundRect(); + pXImpressDocument->postMouseEvent(LOK_MOUSEEVENT_MOUSEBUTTONDOWN, + o3tl::toTwips(aRect.Left() + 2, o3tl::Length::mm100), o3tl::toTwips(aRect.Top() + 2, o3tl::Length::mm100), + 1, MOUSE_LEFT, 0); + pXImpressDocument->postMouseEvent(LOK_MOUSEEVENT_MOUSEBUTTONUP, + o3tl::toTwips(aRect.Left() + 2, o3tl::Length::mm100), o3tl::toTwips(aRect.Top() + 2, o3tl::Length::mm100), + 1, MOUSE_LEFT, 0); + Scheduler::ProcessEventsToIdle(); + pView->SdrBeginTextEdit(pTextObject); + CPPUNIT_ASSERT(pView->GetTextEditObject()); + EditView& rEditView = pView->GetTextEditOutlinerView()->GetEditView(); + rEditView.SetSelection(ESelection(2, 0, 2, 33)); // start para, start char, end para, end char. + CPPUNIT_ASSERT_EQUAL(u"They have all the same formatting"_ustr, rEditView.GetSelected()); + SdrOutliner* pOutliner = pView->GetTextEditOutliner(); + CPPUNIT_ASSERT_EQUAL(u"No-Logo Content~LT~Gliederung 2"_ustr, + pOutliner->GetStyleSheet(2)->GetName()); + const EditTextObject& aEdit = pTextObject->GetOutlinerParaObject()->GetTextObject(); + const SvxNumBulletItem* pNumFmt = aEdit.GetParaAttribs(2).GetItem(EE_PARA_NUMBULLET); + SvxNumberFormat aNumFmt(pNumFmt->GetNumRule().GetLevel(2)); + + // cut contents of bullet item + dispatchCommand(mxComponent, u".uno:Cut"_ustr, uno::Sequence<beans::PropertyValue>()); + + CPPUNIT_ASSERT(pView->GetTextEditObject()); + EditView& rEditView2 = pView->GetTextEditOutlinerView()->GetEditView(); + rEditView2.SetSelection(ESelection(2, 0, 2, 10)); // start para, start char, end para, end char. + CPPUNIT_ASSERT_EQUAL(OUString(), rEditView2.GetSelected()); + + // paste contents of bullet item + dispatchCommand(mxComponent, u".uno:Paste"_ustr, uno::Sequence<beans::PropertyValue>()); + + // send an ESC key to trigger the commit of the edit to the main model + pXImpressDocument->postKeyEvent(LOK_KEYEVENT_KEYINPUT, 0, awt::Key::ESCAPE); + pXImpressDocument->postKeyEvent(LOK_KEYEVENT_KEYUP, 0, awt::Key::ESCAPE); + Scheduler::ProcessEventsToIdle(); - pView->SdrBeginTextEdit(pTextObject); - CPPUNIT_ASSERT(pView->GetTextEditObject()); - pOutliner = pView->GetTextEditOutliner(); - EditView& rEditView3 = pView->GetTextEditOutlinerView()->GetEditView(); - rEditView3.SetSelection(ESelection(2, 0, 2, 33)); // start para, start char, end para, end char. - CPPUNIT_ASSERT_EQUAL(u"They have all the same formatting"_ustr, rEditView3.GetSelected()); - CPPUNIT_ASSERT_EQUAL(u"No-Logo Content~LT~Gliederung 2"_ustr, - pOutliner->GetStyleSheet(2)->GetName()); - - const EditTextObject& aEdit2 = pTextObject->GetOutlinerParaObject()->GetTextObject(); - const SvxNumBulletItem* pNumFmt2 = aEdit2.GetParaAttribs(2).GetItem(EE_PARA_NUMBULLET); - SvxNumberFormat aNumFmt2(pNumFmt2->GetNumRule().GetLevel(2)); - - bool bEqual(aNumFmt2 == aNumFmt); - CPPUNIT_ASSERT_MESSAGE("Bullet properties changed after paste", bEqual); + pView->SdrBeginTextEdit(pTextObject); + CPPUNIT_ASSERT(pView->GetTextEditObject()); + pOutliner = pView->GetTextEditOutliner(); + EditView& rEditView3 = pView->GetTextEditOutlinerView()->GetEditView(); + rEditView3.SetSelection(ESelection(2, 0, 2, 33)); // start para, start char, end para, end char. + CPPUNIT_ASSERT_EQUAL(u"They have all the same formatting"_ustr, rEditView3.GetSelected()); + CPPUNIT_ASSERT_EQUAL(u"No-Logo Content~LT~Gliederung 2"_ustr, + pOutliner->GetStyleSheet(2)->GetName()); + + const EditTextObject& aEdit2 = pTextObject->GetOutlinerParaObject()->GetTextObject(); + const SvxNumBulletItem* pNumFmt2 = aEdit2.GetParaAttribs(2).GetItem(EE_PARA_NUMBULLET); + SvxNumberFormat aNumFmt2(pNumFmt2->GetNumRule().GetLevel(2)); + + bool bEqual(aNumFmt2 == aNumFmt); + CPPUNIT_ASSERT_MESSAGE("Bullet properties changed after paste", bEqual); + } } /** diff --git a/xmloff/source/core/xmlexp.cxx b/xmloff/source/core/xmlexp.cxx index 4d77d6bc26db..a5524b33f416 100644 --- a/xmloff/source/core/xmlexp.cxx +++ b/xmloff/source/core/xmlexp.cxx @@ -1242,7 +1242,10 @@ ErrCode SvXMLExport::exportDoc( enum ::xmloff::token::XMLTokenEnum eClass ) { if (!mxGraphicStorageHandler.is()) { - mxGraphicStorageHandler.set(xFactory->createInstance( u"com.sun.star.document.ExportGraphicStorageHandler"_ustr), UNO_QUERY); + mxGraphicStorageHandler.set( + getComponentContext()->getServiceManager()->createInstanceWithArgumentsAndContext( + u"com.sun.star.comp.Svx.GraphicExportHelper"_ustr, uno::Sequence<uno::Any>(), getComponentContext()), + uno::UNO_QUERY ); bOwnGraphicResolver = mxGraphicStorageHandler.is(); } diff --git a/xmloff/source/core/xmlimp.cxx b/xmloff/source/core/xmlimp.cxx index 94bf7e41b7a7..886b8f10d6df 100644 --- a/xmloff/source/core/xmlimp.cxx +++ b/xmloff/source/core/xmlimp.cxx @@ -589,8 +589,9 @@ void SAL_CALL SvXMLImport::startDocument() { // #99870# Import... instead of Export... mxGraphicStorageHandler.set( - xFactory->createInstance(u"com.sun.star.document.ImportGraphicStorageHandler"_ustr), - UNO_QUERY); + GetComponentContext()->getServiceManager()->createInstanceWithArgumentsAndContext( + u"com.sun.star.comp.Svx.GraphicImportHelper"_ustr, uno::Sequence<uno::Any>(), GetComponentContext()), + uno::UNO_QUERY ); mpImpl->mbOwnGraphicResolver = mxGraphicStorageHandler.is(); } commit fbae160d8bcf29bb5747c4a65a3a7945285f385b Author: Balazs Varga <balazs.va...@collabora.com> AuthorDate: Thu Jul 17 18:32:29 2025 +0200 Commit: Andras Timar <andras.ti...@collabora.com> CommitDate: Tue Aug 19 15:37:10 2025 +0200 tdf#167468 - sc: fix XMATCH with mode=0 and searchdirection=-1 returns wrong value. Off-by-one error during the calculation of the result with Reverse search mode. follow-up of XMatch implementation: c9245c153d349ee414fdd4f878fd10cbd8471cff Co-authored-by: Regina Henschel <rb.hensc...@t-online.de> Change-Id: If77289d314f5960c19911c889f8d5b8eb0b839cf Reviewed-on: https://gerrit.libreoffice.org/c/core/+/188019 Tested-by: Jenkins Reviewed-by: Balazs Varga <balazs.va...@collabora.com> (cherry picked from commit 649346506b8ec0670e35d30c5e04358e40244c36) Reviewed-on: https://gerrit.libreoffice.org/c/core/+/188242 Reviewed-by: Adolfo Jayme Barrientos <fit...@ubuntu.com> diff --git a/sc/qa/unit/data/functions/spreadsheet/fods/xmatch.fods b/sc/qa/unit/data/functions/spreadsheet/fods/xmatch.fods index c5156957acde..fa17e53c03cc 100644 --- a/sc/qa/unit/data/functions/spreadsheet/fods/xmatch.fods +++ b/sc/qa/unit/data/functions/spreadsheet/fods/xmatch.fods @@ -1,13 +1,13 @@ <?xml version="1.0" encoding="UTF-8"?> <office:document xmlns:office="urn:oasis:names:tc:opendocument:xmlns:office:1.0" xmlns:ooo="http://openoffice.org/2004/office" xmlns:fo="urn:oasis:names:tc:opendocument:xmlns:xsl-fo-compatible:1.0" xmlns:xlink="http://www.w3.org/1999/xlink" xmlns:config="urn:oasis:names:tc:opendocument:xmlns:config:1.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:meta="urn:oasis:names:tc:opendocument:xmlns:meta:1.0" xmlns:style="urn:oasis:names:tc:opendocument:xmlns:style:1.0" xmlns:text="urn:oasis:names:tc:opendocument:xmlns:text:1.0" xmlns:rpt="http://openoffice.org/2005/report" xmlns:draw="urn:oasis:names:tc:opendocument:xmlns:drawing:1.0" xmlns:dr3d="urn:oasis:names:tc:opendocument:xmlns:dr3d:1.0" xmlns:svg="urn:oasis:names:tc:opendocument:xmlns:svg-compatible:1.0" xmlns:chart="urn:oasis:names:tc:opendocument:xmlns:chart:1.0" xmlns:table="urn:oasis:names:tc:opendocument:xmlns:table:1.0" xmlns:number="urn:oasis:names:tc:opendocument:xmlns:datastyle:1.0" xmlns:ooow="http://openoffice.org/200 4/writer" xmlns:oooc="http://openoffice.org/2004/calc" xmlns:of="urn:oasis:names:tc:opendocument:xmlns:of:1.2" xmlns:xforms="http://www.w3.org/2002/xforms" xmlns:tableooo="http://openoffice.org/2009/table" xmlns:calcext="urn:org:documentfoundation:names:experimental:calc:xmlns:calcext:1.0" xmlns:drawooo="http://openoffice.org/2010/draw" xmlns:loext="urn:org:documentfoundation:names:experimental:office:xmlns:loext:1.0" xmlns:field="urn:openoffice:names:experimental:ooo-ms-interop:xmlns:field:1.0" xmlns:math="http://www.w3.org/1998/Math/MathML" xmlns:form="urn:oasis:names:tc:opendocument:xmlns:form:1.0" xmlns:script="urn:oasis:names:tc:opendocument:xmlns:script:1.0" xmlns:formx="urn:openoffice:names:experimental:ooxml-odf-interop:xmlns:form:1.0" xmlns:dom="http://www.w3.org/2001/xml-events" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xhtml="http://www.w3.org/1999/xhtml" xmlns:grddl="http://www.w3.org/2003/g/data-view#" xmlns :css3t="http://www.w3.org/TR/css3-text/" xmlns:presentation="urn:oasis:names:tc:opendocument:xmlns:presentation:1.0" office:version="1.4" office:mimetype="application/vnd.oasis.opendocument.spreadsheet"> - <office:meta><meta:creation-date>2024-01-16T18:30:06.278000000</meta:creation-date><meta:editing-duration>PT3H3M8S</meta:editing-duration><meta:editing-cycles>58</meta:editing-cycles><meta:generator>LibreOfficeDev/25.2.0.0.alpha0$Windows_X86_64 LibreOffice_project/a379e033425053885724b163147892f21830bca0</meta:generator><dc:date>2024-11-03T18:27:19.548583300</dc:date><meta:document-statistic meta:table-count="2" meta:cell-count="305" meta:object-count="0"/></office:meta> + <office:meta><meta:creation-date>2024-01-16T18:30:06.278000000</meta:creation-date><meta:editing-duration>PT3H22M31S</meta:editing-duration><meta:editing-cycles>63</meta:editing-cycles><meta:generator>LibreOfficeDev/26.2.0.0.alpha0$Windows_X86_64 LibreOffice_project/f6b6eff1b754de1a9f5f6a79b7aad53604c87cf5</meta:generator><dc:date>2025-07-17T17:30:05.339473200</dc:date><meta:document-statistic meta:table-count="2" meta:cell-count="337" meta:object-count="0"/></office:meta> <office:settings> <config:config-item-set config:name="ooo:view-settings"> <config:config-item config:name="VisibleAreaTop" config:type="int">0</config:config-item> <config:config-item config:name="VisibleAreaLeft" config:type="int">0</config:config-item> - <config:config-item config:name="VisibleAreaWidth" config:type="int">15882</config:config-item> - <config:config-item config:name="VisibleAreaHeight" config:type="int">5013</config:config-item> + <config:config-item config:name="VisibleAreaWidth" config:type="int">54095</config:config-item> + <config:config-item config:name="VisibleAreaHeight" config:type="int">19417</config:config-item> <config:config-item-map-indexed config:name="Views"> <config:config-item-map-entry> <config:config-item config:name="ViewId" config:type="string">view1</config:config-item> @@ -31,7 +31,7 @@ </config:config-item-map-entry> <config:config-item-map-entry config:name="Sheet2"> <config:config-item config:name="CursorPositionX" config:type="int">3</config:config-item> - <config:config-item config:name="CursorPositionY" config:type="int">37</config:config-item> + <config:config-item config:name="CursorPositionY" config:type="int">43</config:config-item> <config:config-item config:name="ActiveSplitRange" config:type="short">2</config:config-item> <config:config-item config:name="PositionLeft" config:type="int">0</config:config-item> <config:config-item config:name="PositionRight" config:type="int">0</config:config-item> @@ -59,7 +59,7 @@ <config:config-item config:name="ShowFormulasMarks" config:type="boolean">false</config:config-item> <config:config-item config:name="ShowGrid" config:type="boolean">true</config:config-item> <config:config-item config:name="GridColor" config:type="int">12632256</config:config-item> - <config:config-item config:name="FormulaBarHeight" config:type="short">1</config:config-item> + <config:config-item config:name="ShowPageBreaks" config:type="boolean">true</config:config-item> <config:config-item config:name="HasColumnRowHeaders" config:type="boolean">true</config:config-item> <config:config-item config:name="HasSheetTabs" config:type="boolean">true</config:config-item> <config:config-item config:name="IsOutlineSymbolsSet" config:type="boolean">true</config:config-item> @@ -71,6 +71,7 @@ <config:config-item config:name="RasterSubdivisionX" config:type="int">1</config:config-item> <config:config-item config:name="RasterSubdivisionY" config:type="int">1</config:config-item> <config:config-item config:name="IsRasterAxisSynchronized" config:type="boolean">true</config:config-item> + <config:config-item config:name="FormulaBarHeight" config:type="short">1</config:config-item> <config:config-item config:name="AnchoredTextOverflowLegacy" config:type="boolean">false</config:config-item> <config:config-item config:name="LegacySingleLineFontwork" config:type="boolean">false</config:config-item> <config:config-item config:name="ConnectorUseSnapRect" config:type="boolean">false</config:config-item> @@ -79,34 +80,15 @@ </config:config-item-map-indexed> </config:config-item-set> <config:config-item-set config:name="ooo:configuration-settings"> - <config:config-item config:name="ShowZeroValues" config:type="boolean">true</config:config-item> - <config:config-item config:name="ShowNotes" config:type="boolean">true</config:config-item> + <config:config-item config:name="AllowPrintJobCancel" config:type="boolean">true</config:config-item> + <config:config-item config:name="ApplyUserData" config:type="boolean">true</config:config-item> + <config:config-item config:name="AutoCalculate" config:type="boolean">true</config:config-item> + <config:config-item config:name="CharacterCompressionType" config:type="short">0</config:config-item> + <config:config-item config:name="EmbedAsianScriptFonts" config:type="boolean">true</config:config-item> <config:config-item config:name="EmbedComplexScriptFonts" config:type="boolean">true</config:config-item> - <config:config-item config:name="ShowNoteAuthor" config:type="boolean">true</config:config-item> - <config:config-item config:name="ShowFormulasMarks" config:type="boolean">false</config:config-item> - <config:config-item config:name="PrinterSetup" config:type="base64Binary">bBb+/01pY3Jvc29mdCBQcmludCB0byBQREYAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAATWljcm9zb2Z0IFByaW50IFRvIFBERgAAAAAAAAAAAAAWAAEAPhUAAAAAAAAEAAhSAAAEdAAAM1ROVwAAAAAKAE0AaQBjAHIAbwBzAG8AZgB0ACAAUAByAGkAbgB0ACAAdABvACAAUABEAEYAAAAAAAAAAAAAAAAAAAAAAAAAAAABBAMG3ABYFAMtAQABAAkAmgs0CGQAAQAPAFgCAgABAFgCAwABAEEANAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEAAAAAAAAAAQAAAAIAAAABAAAA/////0dJUzQAAAAAAAAAAAAAAABESU5VIgDQACwDLBHiXo1TAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAUAAAAAABkAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA0AAAAFNNVEoAAAAAEADAAHsAMAA4ADQARgAwADEARgBBAC0ARQA2ADMANAAtADQARAA3ADcALQA4ADMARQBFAC0AMAA3ADQAOAAxADcAQwAwADMANQA4ADEAfQAAAFJFU0RMTABVbmlyZXNETEwAUGFwZXJTaXplAEE0AE9yaWVudGF0aW9uAFBPUlRSQUlUAFJlc29sdXRpb24AUmVzT3B0aW9uMQBDb2xvck1vZGUAQ29sb3IAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACwRAABWNERNAQAAAAAAAACcCnAiHAAAAOwAAAADAAAA+gFPCDTmd02D7gdIF8A1gdAAAABMAAAAAwAAAAAIAAAAAAAAAAAAAAMAAAAACAAAKgAAAAAIAAADAAAAQAAAAFYAAAAAEAAARABvAGMAdQBtAGUAbgB0AFUAcwBlAHIAUABhAHMAcwB3AG8AcgBkAAAARABvAGMAdQBtAGUAbgB0AE8AdwBuAGUAcgBQAGEAcwBzAHcAbwByAGQAAABEAG8AYwB1AG0AZQBuAHQAQwByA HkAcAB0AFMAZQBjAHUAcgBpAHQAeQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAASAENPTVBBVF9EVVBMRVhfTU9ERRMARHVwbGV4TW9kZTo6VW5rbm93bgwAUFJJTlRFUl9OQU1FFgBNaWNyb3NvZnQgUHJpbnQgdG8gUERGCwBEUklWRVJfTkFNRRYATWljcm9zb2Z0IFByaW50IFRvIFBERg==</config:config-item> - <config:config-item config:name="ShowGrid" config:type="boolean">true</config:config-item> - <config:config-item config:name="GridColor" config:type="int">12632256</config:config-item> - <config:config-item config:name="ShowPageBreaks" config:type="boolean">true</config:config-item> - <config:config-item config:name="IsKernAsianPunctuation" config:type="boolean">false</config:config-item> - <config:config-item config:name="LinkUpdateMode" config:type="short">3</config:config-item> - <config:config-item config:name="HasColumnRowHeaders" config:type="boolean">true</config:config-item> + <config:config-item config:name="EmbedFonts" config:type="boolean">false</config:config-item> <config:config-item config:name="EmbedLatinScriptFonts" config:type="boolean">true</config:config-item> - <config:config-item config:name="HasSheetTabs" config:type="boolean">true</config:config-item> - <config:config-item config:name="IsOutlineSymbolsSet" config:type="boolean">true</config:config-item> - <config:config-item config:name="IsSnapToRaster" config:type="boolean">false</config:config-item> - <config:config-item config:name="RasterIsVisible" config:type="boolean">false</config:config-item> - <config:config-item config:name="RasterResolutionX" config:type="int">1270</config:config-item> - <config:config-item config:name="RasterResolutionY" config:type="int">1270</config:config-item> - <config:config-item config:name="RasterSubdivisionX" config:type="int">1</config:config-item> - <config:config-item config:name="RasterSubdivisionY" config:type="int">1</config:config-item> - <config:config-item config:name="IsRasterAxisSynchronized" config:type="boolean">true</config:config-item> - <config:config-item config:name="AutoCalculate" config:type="boolean">true</config:config-item> - <config:config-item config:name="ApplyUserData" config:type="boolean">true</config:config-item> - <config:config-item config:name="PrinterName" config:type="string">Microsoft Print to PDF</config:config-item> - <config:config-item config:name="ImagePreferredDPI" config:type="int">0</config:config-item> - <config:config-item config:name="PrinterPaperFromSetup" config:type="boolean">false</config:config-item> - <config:config-item config:name="SaveThumbnail" config:type="boolean">true</config:config-item> + <config:config-item config:name="EmbedOnlyUsedFonts" config:type="boolean">false</config:config-item> <config:config-item-map-indexed config:name="ForbiddenCharacters"> <config:config-item-map-entry> <config:config-item config:name="Language" config:type="string">de</config:config-item> @@ -123,16 +105,35 @@ <config:config-item config:name="EndLine" config:type="string"/> </config:config-item-map-entry> </config:config-item-map-indexed> - <config:config-item config:name="CharacterCompressionType" config:type="short">0</config:config-item> - <config:config-item config:name="SaveVersionOnClose" config:type="boolean">false</config:config-item> - <config:config-item config:name="UpdateFromTemplate" config:type="boolean">true</config:config-item> - <config:config-item config:name="AllowPrintJobCancel" config:type="boolean">true</config:config-item> - <config:config-item config:name="LoadReadonly" config:type="boolean">false</config:config-item> + <config:config-item config:name="GridColor" config:type="int">12632256</config:config-item> + <config:config-item config:name="HasColumnRowHeaders" config:type="boolean">true</config:config-item> + <config:config-item config:name="HasSheetTabs" config:type="boolean">true</config:config-item> + <config:config-item config:name="ImagePreferredDPI" config:type="int">0</config:config-item> <config:config-item config:name="IsDocumentShared" config:type="boolean">false</config:config-item> - <config:config-item config:name="EmbedFonts" config:type="boolean">false</config:config-item> - <config:config-item config:name="EmbedOnlyUsedFonts" config:type="boolean">false</config:config-item> - <config:config-item config:name="EmbedAsianScriptFonts" config:type="boolean">true</config:config-item> + <config:config-item config:name="IsKernAsianPunctuation" config:type="boolean">false</config:config-item> + <config:config-item config:name="IsOutlineSymbolsSet" config:type="boolean">true</config:config-item> + <config:config-item config:name="IsRasterAxisSynchronized" config:type="boolean">true</config:config-item> + <config:config-item config:name="IsSnapToRaster" config:type="boolean">false</config:config-item> + <config:config-item config:name="LinkUpdateMode" config:type="short">3</config:config-item> + <config:config-item config:name="LoadReadonly" config:type="boolean">false</config:config-item> + <config:config-item config:name="PrinterName" config:type="string">Microsoft Print to PDF</config:config-item> + <config:config-item config:name="PrinterPaperFromSetup" config:type="boolean">false</config:config-item> -e ... etc. - the rest is truncated