diff options
-rw-r--r-- | include/svx/strings.hrc | 1 | ||||
-rw-r--r-- | include/xmloff/shapeexport.hxx | 9 | ||||
-rw-r--r-- | svx/source/svdraw/svdpage.cxx | 20 | ||||
-rw-r--r-- | sw/qa/extras/odfexport/data/MadeByLO7.odt | bin | 0 -> 17354 bytes | |||
-rw-r--r-- | sw/qa/extras/odfexport/odfexport.cxx | 14 | ||||
-rw-r--r-- | sw/source/filter/xml/wrtxml.cxx | 18 | ||||
-rw-r--r-- | sw/source/filter/xml/xmlexp.cxx | 9 | ||||
-rw-r--r-- | xmloff/source/draw/shapeexport.cxx | 47 |
8 files changed, 112 insertions, 6 deletions
diff --git a/include/svx/strings.hrc b/include/svx/strings.hrc index 1b59e4d765e8..3a307cdc6a36 100644 --- a/include/svx/strings.hrc +++ b/include/svx/strings.hrc @@ -155,6 +155,7 @@ #define STR_EditPutToTop NC_("STR_EditPutToTop", "Move %1 to front") #define STR_EditPutToBtm NC_("STR_EditPutToBtm", "Move %1 to back") #define STR_EditRevOrder NC_("STR_EditRevOrder", "Reverse order of %1") +#define STR_SortShapes NC_("STR_SortShapes", "Sort shapes") #define STR_EditMove NC_("STR_EditMove", "Move %1") #define STR_EditResize NC_("STR_EditResize", "Resize %1") #define STR_EditRotate NC_("STR_EditRotate", "Rotate %1") diff --git a/include/xmloff/shapeexport.hxx b/include/xmloff/shapeexport.hxx index ff38aeaf4cab..e5012d84836d 100644 --- a/include/xmloff/shapeexport.hxx +++ b/include/xmloff/shapeexport.hxx @@ -28,6 +28,7 @@ #include <rtl/ustrbuf.hxx> #include <salhelper/simplereferenceobject.hxx> +#include <functional> #include <map> #include <xmloff/animexp.hxx> #include <xmloff/families.hxx> @@ -297,6 +298,14 @@ public: const rtl::Reference< XMLTableExport >& GetShapeTableExport(); }; +namespace xmloff { + +XMLOFF_DLLPUBLIC void FixZOrder( + css::uno::Reference<css::drawing::XShapes> const& xShapes, + std::function<bool(css::uno::Reference<css::beans::XPropertySet> const&)> const& rIsInBackground); + +} // namespace xmloff + #endif /* vim:set shiftwidth=4 softtabstop=4 expandtab: */ diff --git a/svx/source/svdraw/svdpage.cxx b/svx/source/svdraw/svdpage.cxx index 0c7c806ad4a8..d07f40e4f701 100644 --- a/svx/source/svdraw/svdpage.cxx +++ b/svx/source/svdraw/svdpage.cxx @@ -40,6 +40,9 @@ #include <svx/svdmodel.hxx> #include <svx/svdlayer.hxx> #include <svx/svdpagv.hxx> +#include <svx/svdundo.hxx> +#include <svx/strings.hrc> +#include <svx/dialmgr.hxx> #include <svx/xfillit0.hxx> #include <svx/fmdpage.hxx> @@ -667,12 +670,29 @@ void SdrObjList::sort( std::vector<sal_Int32>& sortOrder) } #endif + SdrModel & rModel(getSdrPageFromSdrObjList()->getSdrModelFromSdrPage()); + bool const isUndo(rModel.IsUndoEnabled()); + if (isUndo) + { + rModel.BegUndo(SvxResId(STR_SortShapes)); + } + for (size_t i = 0; i < aNewSortOrder.size(); ++i) { aNewList[i] = maList[ aNewSortOrder[i] ]; + if (isUndo && i != sal::static_int_cast<size_t>(aNewSortOrder[i])) + { + rModel.AddUndo(rModel.GetSdrUndoFactory().CreateUndoObjectOrdNum( + *aNewList[i], aNewSortOrder[i], i)); + } aNewList[i]->SetOrdNum(i); } + if (isUndo) + { + rModel.EndUndo(); + } + std::swap(aNewList, maList); } diff --git a/sw/qa/extras/odfexport/data/MadeByLO7.odt b/sw/qa/extras/odfexport/data/MadeByLO7.odt Binary files differnew file mode 100644 index 000000000000..9587fffe6470 --- /dev/null +++ b/sw/qa/extras/odfexport/data/MadeByLO7.odt diff --git a/sw/qa/extras/odfexport/odfexport.cxx b/sw/qa/extras/odfexport/odfexport.cxx index 7e49bbd1b048..285da20616e0 100644 --- a/sw/qa/extras/odfexport/odfexport.cxx +++ b/sw/qa/extras/odfexport/odfexport.cxx @@ -232,6 +232,20 @@ DECLARE_ODFEXPORT_TEST(testTdf130314, "tdf130314.docx") CPPUNIT_ASSERT_EQUAL(2, getPages()); } +DECLARE_ODFEXPORT_EXPORTONLY_TEST(testTdf133487, "MadeByLO7.odt") +{ + xmlDocUniquePtr pXmlDoc = parseExport("content.xml"); + // shape in background has lowest index + assertXPath(pXmlDoc, "/office:document-content/office:body/office:text/text:p[2]/draw:custom-shape", "z-index", "0"); + assertXPath(pXmlDoc, "/office:document-content/office:automatic-styles/style:style[@style:name = /office:document-content/office:body/office:text/text:p[2]/draw:custom-shape[@draw:z-index = '0']/attribute::draw:style-name]/style:graphic-properties", "run-through", "background"); + // shape in foreground, previously index 1 + assertXPath(pXmlDoc, "/office:document-content/office:body/office:text/text:p[1]/draw:custom-shape", "z-index", "2"); + assertXPath(pXmlDoc, "/office:document-content/office:automatic-styles/style:style[@style:name = /office:document-content/office:body/office:text/text:p[1]/draw:custom-shape[@draw:z-index = '2']/attribute::draw:style-name]/style:graphic-properties", "run-through", "foreground"); + // shape in foreground, previously index 0 + assertXPath(pXmlDoc, "/office:document-content/office:body/office:text/text:p[3]/draw:custom-shape", "z-index", "1"); + assertXPath(pXmlDoc, "/office:document-content/office:automatic-styles/style:style[@style:name = /office:document-content/office:body/office:text/text:p[3]/draw:custom-shape[@draw:z-index = '1']/attribute::draw:style-name]/style:graphic-properties", "run-through", "foreground"); +} + DECLARE_ODFEXPORT_TEST(testTdf139126, "tdf139126.odt") { CPPUNIT_ASSERT_EQUAL(1, getPages()); diff --git a/sw/source/filter/xml/wrtxml.cxx b/sw/source/filter/xml/wrtxml.cxx index 4ae5964a7d2e..288814017c25 100644 --- a/sw/source/filter/xml/wrtxml.cxx +++ b/sw/source/filter/xml/wrtxml.cxx @@ -23,6 +23,7 @@ #include <com/sun/star/beans/XPropertySet.hpp> #include <com/sun/star/task/XStatusIndicator.hpp> #include <com/sun/star/xml/sax/Writer.hpp> +#include <com/sun/star/drawing/XDrawPageSupplier.hpp> #include <com/sun/star/document/XExporter.hpp> #include <com/sun/star/document/XFilter.hpp> #include <com/sun/star/frame/XModule.hpp> @@ -34,6 +35,7 @@ #include <comphelper/propertysetinfo.hxx> #include <vcl/errinf.hxx> #include <sal/log.hxx> +#include <o3tl/any.hxx> #include <svx/xmlgrhlp.hxx> #include <svx/xmleohlp.hxx> #include <unotools/saveopt.hxx> @@ -52,6 +54,7 @@ #include <docstat.hxx> #include <docsh.hxx> +#include <xmloff/shapeexport.hxx> #include <unotools/ucbstreamhelper.hxx> #include <swerror.h> #include "wrtxml.hxx" @@ -180,6 +183,15 @@ ErrCode SwXMLWriter::Write_( const uno::Reference < task::XStatusIndicator >& xS SvtSaveOptions aSaveOpt; xInfoSet->setPropertyValue( "UsePrettyPrinting", makeAny(aSaveOpt.IsPrettyPrinting()) ); + uno::Reference<lang::XComponent> const xModelComp(m_pDoc->GetDocShell()->GetModel()); + uno::Reference<drawing::XDrawPageSupplier> const xDPS(xModelComp, uno::UNO_QUERY); + assert(xDPS.is()); + xmloff::FixZOrder(xDPS->getDrawPage(), + [](uno::Reference<beans::XPropertySet> const& xShape) + { + return !*o3tl::doAccess<bool>(xShape->getPropertyValue("Opaque")); + }); + // save show redline mode ... RedlineFlags const nOrigRedlineFlags = m_pDoc->getIDocumentRedlineAccess().GetRedlineFlags(); RedlineFlags nRedlineFlags(nOrigRedlineFlags); @@ -248,12 +260,6 @@ ErrCode SwXMLWriter::Write_( const uno::Reference < task::XStatusIndicator >& xS if( xStatusIndicator.is() ) *pArgs++ <<= xStatusIndicator; - //Get model - uno::Reference< lang::XComponent > xModelComp = m_pDoc->GetDocShell()->GetModel(); - OSL_ENSURE( xModelComp.is(), "XMLWriter::Write: got no model" ); - if( !xModelComp.is() ) - return ERR_SWG_WRITE_ERROR; - PutNumFormatFontsInAttrPool(); PutEditEngFontsInAttrPool(); diff --git a/sw/source/filter/xml/xmlexp.cxx b/sw/source/filter/xml/xmlexp.cxx index 2c646dc0268e..d8e4ba10df5a 100644 --- a/sw/source/filter/xml/xmlexp.cxx +++ b/sw/source/filter/xml/xmlexp.cxx @@ -269,6 +269,15 @@ ErrCode SwXMLExport::exportDoc( enum XMLTokenEnum eClass ) m_bSavedShowChanges = pLayout == nullptr || !pLayout->IsHideRedlines(); if( bSaveRedline ) { + // tdf#133487 call this once in flat-ODF case + uno::Reference<drawing::XDrawPageSupplier> const xDPS(GetModel(), uno::UNO_QUERY); + assert(xDPS.is()); + xmloff::FixZOrder(xDPS->getDrawPage(), + [](uno::Reference<beans::XPropertySet> const& xShape) + { + return !*o3tl::doAccess<bool>(xShape->getPropertyValue("Opaque")); + }); + // now save and switch redline mode nRedlineFlags = pDoc->getIDocumentRedlineAccess().GetRedlineFlags(); pDoc->getIDocumentRedlineAccess().SetRedlineFlags( diff --git a/xmloff/source/draw/shapeexport.cxx b/xmloff/source/draw/shapeexport.cxx index c8bbcbfa3ca2..27f280d7ed9b 100644 --- a/xmloff/source/draw/shapeexport.cxx +++ b/xmloff/source/draw/shapeexport.cxx @@ -61,6 +61,7 @@ #include <com/sun/star/drawing/XGluePointsSupplier.hpp> #include <com/sun/star/drawing/QRCode.hpp> #include <com/sun/star/drawing/QRCodeErrorCorrection.hpp> +#include <com/sun/star/drawing/XShapes3.hpp> #include <com/sun/star/embed/ElementModes.hpp> #include <com/sun/star/embed/XStorage.hpp> #include <com/sun/star/embed/XTransactedObject.hpp> @@ -981,6 +982,52 @@ void XMLShapeExport::exportShapes( const uno::Reference < drawing::XShapes >& xS maCurrentShapesIter = aOldCurrentShapesIter; } +namespace xmloff { + +void FixZOrder(uno::Reference<drawing::XShapes> const& xShapes, + std::function<bool(uno::Reference<beans::XPropertySet> const&)> const& rIsInBackground) +{ + uno::Reference<drawing::XShapes3> const xShapes3(xShapes, uno::UNO_QUERY); + assert(xShapes3.is()); + if (!xShapes3.is()) + { + return; // only SvxDrawPage implements this + } + std::vector<sal_Int32> background; + std::vector<sal_Int32> foreground; + // shapes are sorted by ZOrder + sal_Int32 const nCount(xShapes->getCount()); + for (sal_Int32 i = 0; i < nCount; ++i) + { + uno::Reference<beans::XPropertySet> const xShape(xShapes->getByIndex(i), uno::UNO_QUERY); + if (rIsInBackground(xShape)) + { + background.emplace_back(i); + } + else + { + foreground.emplace_back(i); + } + } + if (background.empty() || foreground.empty()) + { + return; // nothing to do + } + uno::Sequence<sal_Int32> aNewOrder(nCount); + std::copy(background.begin(), background.end(), aNewOrder.begin()); + std::copy(foreground.begin(), foreground.end(), aNewOrder.begin() + background.size()); + try + { + xShapes3->sort(aNewOrder); + } + catch (uno::Exception const&) + { + SAL_WARN("xmloff", "FixZOrder: exception"); + } +} + +} // namespace xmloff + void XMLShapeExport::seekShapes( const uno::Reference< drawing::XShapes >& xShapes ) throw() { if( xShapes.is() ) |