diff options
-rw-r--r-- | include/oox/ppt/pptimport.hxx | 2 | ||||
-rw-r--r-- | include/oox/ppt/pptshape.hxx | 3 | ||||
-rw-r--r-- | oox/inc/drawingml/table/tableproperties.hxx | 3 | ||||
-rw-r--r-- | oox/inc/drawingml/textbodyproperties.hxx | 2 | ||||
-rw-r--r-- | oox/source/drawingml/table/tableproperties.cxx | 61 | ||||
-rw-r--r-- | oox/source/drawingml/textbodypropertiescontext.cxx | 16 | ||||
-rw-r--r-- | oox/source/export/drawingml.cxx | 19 | ||||
-rw-r--r-- | oox/source/ppt/pptimport.cxx | 1 | ||||
-rw-r--r-- | oox/source/ppt/pptshape.cxx | 33 | ||||
-rw-r--r-- | oox/source/ppt/slidepersist.cxx | 33 | ||||
-rw-r--r-- | oox/source/token/properties.txt | 1 | ||||
-rw-r--r-- | sd/qa/unit/data/pptx/3columns.pptx | bin | 0 -> 39915 bytes | |||
-rw-r--r-- | sd/qa/unit/data/pptx/tdf120028b.pptx | bin | 29838 -> 0 bytes | |||
-rw-r--r-- | sd/qa/unit/data/pptx/tdf140852.pptx | bin | 0 -> 49776 bytes | |||
-rw-r--r-- | sd/qa/unit/export-tests-ooxml2.cxx | 120 | ||||
-rw-r--r-- | sd/qa/unit/import-tests.cxx | 96 |
16 files changed, 183 insertions, 207 deletions
diff --git a/include/oox/ppt/pptimport.hxx b/include/oox/ppt/pptimport.hxx index eafb114b47fd..29ef3c5732a6 100644 --- a/include/oox/ppt/pptimport.hxx +++ b/include/oox/ppt/pptimport.hxx @@ -77,8 +77,6 @@ public: ::Color getSchemeColor( sal_Int32 nToken ) const; - static std::vector< PPTShape* > maPPTShapes; - #if OSL_DEBUG_LEVEL > 0 static XmlFilterBase* mpDebugFilterBase; #endif diff --git a/include/oox/ppt/pptshape.hxx b/include/oox/ppt/pptshape.hxx index e67a77635111..f452e585abcf 100644 --- a/include/oox/ppt/pptshape.hxx +++ b/include/oox/ppt/pptshape.hxx @@ -66,8 +66,7 @@ public: const oox::drawingml::Theme* pTheme, const css::uno::Reference< css::drawing::XShapes >& rxShapes, basegfx::B2DHomMatrix& aTransformation, - ::oox::drawingml::ShapeIdMap* pShapeMap, - bool bhasSameSubTypeIndex = false ); + ::oox::drawingml::ShapeIdMap* pShapeMap ); ShapeLocation getShapeLocation() const { return meShapeLocation; }; void setReferenced( bool bReferenced ){ mbReferenced = bReferenced; }; diff --git a/oox/inc/drawingml/table/tableproperties.hxx b/oox/inc/drawingml/table/tableproperties.hxx index ec8b3c4c5b60..34e361b18add 100644 --- a/oox/inc/drawingml/table/tableproperties.hxx +++ b/oox/inc/drawingml/table/tableproperties.hxx @@ -58,9 +58,6 @@ public: const css::uno::Reference < css::beans::XPropertySet > & xPropSet, const ::oox::drawingml::TextListStylePtr& pMasterTextListStyle ); - /// Distributes text body with multiple columns in table cells. - void pullFromTextBody(oox::drawingml::TextBodyPtr pTextBody, sal_Int32 nShapeWidth, bool bhasSameSubTypeIndex, bool bMaster); - private: const TableStyle& getUsedTableStyle(const ::oox::core::XmlFilterBase& rFilterBase, std::unique_ptr<TableStyle>& rTableStyleToDelete); diff --git a/oox/inc/drawingml/textbodyproperties.hxx b/oox/inc/drawingml/textbodyproperties.hxx index 8a51c2bb906e..41fbb832a5d8 100644 --- a/oox/inc/drawingml/textbodyproperties.hxx +++ b/oox/inc/drawingml/textbodyproperties.hxx @@ -42,8 +42,6 @@ struct TextBodyProperties std::optional< sal_Int32 > moTextOffRight; css::drawing::TextVerticalAdjust meVA; OUString msPrst; - /// Number of requested columns. - sal_Int32 mnNumCol = 1; /// Normal autofit: font scale (default: 100%). sal_Int32 mnFontScale = 100000; OUString msHorzOverflow; diff --git a/oox/source/drawingml/table/tableproperties.cxx b/oox/source/drawingml/table/tableproperties.cxx index 1c12c10eda47..69117123dca8 100644 --- a/oox/source/drawingml/table/tableproperties.cxx +++ b/oox/source/drawingml/table/tableproperties.cxx @@ -145,7 +145,7 @@ void TableProperties::pushToPropSet(const ::oox::core::XmlFilterBase& rFilterBas for (auto& tableRow : mvTableRows) { sal_Int32 nColumn = 0; - sal_Int32 nColumnSize = mvTableGrid.size(); + sal_Int32 nColumnSize = tableRow.getTableCells().size(); sal_Int32 nRemovedColumn = 0; // for (sal_Int32 nColIndex = 0; nColIndex < nColumnSize; nColIndex++) @@ -206,65 +206,6 @@ void TableProperties::pushToPropSet(const ::oox::core::XmlFilterBase& rFilterBas xTableStyleToDelete.reset(); } - -void TableProperties::pullFromTextBody(oox::drawingml::TextBodyPtr pTextBody, sal_Int32 nShapeWidth, bool bhasSameSubTypeIndex, bool bMaster) -{ - // Create table grid and a single row. - sal_Int32 nNumCol = pTextBody->getTextProperties().mnNumCol; - std::vector<sal_Int32>& rTableGrid(getTableGrid()); - std::vector<drawingml::table::TableRow>& rTableRows(getTableRows()); - sal_Int32 nColWidth = nShapeWidth / nNumCol; - - if(!bhasSameSubTypeIndex) - { - for (sal_Int32 nCol = 0; nCol < nNumCol; ++nCol) - rTableGrid.push_back(nColWidth); - - rTableRows.emplace_back(); - } - - if(rTableRows.empty()) - rTableRows.emplace_back(); - - oox::drawingml::table::TableRow& rTableRow = rTableRows.back(); - std::vector<oox::drawingml::table::TableCell>& rTableCells = rTableRow.getTableCells(); - - // Create the cells and distribute the paragraphs from pTextBody. - sal_Int32 nNumPara = pTextBody->getParagraphs().size(); - sal_Int32 nParaPerCol = std::ceil(double(nNumPara) / nNumCol); - // Font scale of text body will be applied at a text run level. - sal_Int32 nFontScale = pTextBody->getTextProperties().mnFontScale; - size_t nPara = 0; - for (sal_Int32 nCol = 0; nCol < nNumCol; ++nCol) - { - rTableCells.emplace_back(); - oox::drawingml::table::TableCell& rTableCell = rTableCells.at(nCol); - TextBodyPtr pCellTextBody = std::make_shared<TextBody>(); - rTableCell.setTextBody(pCellTextBody); - - // Copy properties provided by <a:lstStyle>. - pCellTextBody->getTextListStyle() = pTextBody->getTextListStyle(); - - if (bMaster) - continue; - - for (sal_Int32 nParaInCol = 0; nParaInCol < nParaPerCol; ++nParaInCol) - { - if (nPara < pTextBody->getParagraphs().size()) - { - std::shared_ptr<oox::drawingml::TextParagraph> pParagraph - = pTextBody->getParagraphs()[nPara]; - if (nFontScale != 100000) - { - for (auto& pRun : pParagraph->getRuns()) - pRun->getTextCharacterProperties().moFontScale = nFontScale; - } - pCellTextBody->appendParagraph(pParagraph); - } - ++nPara; - } - } -} } /* vim:set shiftwidth=4 softtabstop=4 expandtab: */ diff --git a/oox/source/drawingml/textbodypropertiescontext.cxx b/oox/source/drawingml/textbodypropertiescontext.cxx index 4d94191dcfc7..f7d4abd4e685 100644 --- a/oox/source/drawingml/textbodypropertiescontext.cxx +++ b/oox/source/drawingml/textbodypropertiescontext.cxx @@ -22,16 +22,19 @@ #include <com/sun/star/text/WritingMode.hpp> #include <com/sun/star/drawing/TextFitToSizeType.hpp> #include <com/sun/star/drawing/TextHorizontalAdjust.hpp> +#include <com/sun/star/text/XTextColumns.hpp> #include <drawingml/textbodyproperties.hxx> #include <drawingml/textbody.hxx> #include <drawingml/customshapegeometry.hxx> #include <drawingml/scene3dcontext.hxx> +#include <o3tl/unit_conversion.hxx> #include <oox/drawingml/drawingmltypes.hxx> #include <oox/helper/attributelist.hxx> #include <oox/helper/propertymap.hxx> #include <oox/token/namespaces.hxx> #include <oox/token/properties.hxx> #include <oox/token/tokens.hxx> +#include <svx/SvxXTextColumns.hxx> using namespace ::oox::core; using namespace ::com::sun::star; @@ -85,7 +88,18 @@ TextBodyPropertiesContext::TextBodyPropertiesContext( ContextHandler2Helper cons mrTextBodyProp.msVertOverflow = rAttribs.getString(XML_vertOverflow, ""); // ST_TextColumnCount - mrTextBodyProp.mnNumCol = rAttribs.getInteger( XML_numCol, 1 ); + if (const sal_Int32 nColumns = rAttribs.getInteger(XML_numCol, 0); nColumns > 0) + { + css::uno::Reference<css::text::XTextColumns> xCols(SvxXTextColumns_createInstance(), + css::uno::UNO_QUERY_THROW); + xCols->setColumnCount(nColumns); + css::uno::Reference<css::beans::XPropertySet> xProps(xCols, css::uno::UNO_QUERY_THROW); + // ST_PositiveCoordinate32 + const sal_Int32 nSpacing = o3tl::convert(rAttribs.getInteger(XML_spcCol, 0), + o3tl::Length::emu, o3tl::Length::mm100); + xProps->setPropertyValue("AutomaticDistance", css::uno::Any(nSpacing)); + mrTextBodyProp.maPropertyMap.setAnyProperty(PROP_TextColumns, css::uno::Any(xCols)); + } // ST_Angle mrTextBodyProp.moRotation = rAttribs.getInteger( XML_rot ); diff --git a/oox/source/export/drawingml.cxx b/oox/source/export/drawingml.cxx index 684623a41813..4d2212b2d50f 100644 --- a/oox/source/export/drawingml.cxx +++ b/oox/source/export/drawingml.cxx @@ -85,6 +85,7 @@ #include <com/sun/star/text/WritingMode2.hpp> #include <com/sun/star/text/GraphicCrop.hpp> #include <com/sun/star/text/XText.hpp> +#include <com/sun/star/text/XTextColumns.hpp> #include <com/sun/star/text/XTextContent.hpp> #include <com/sun/star/text/XTextField.hpp> #include <com/sun/star/text/XTextRange.hpp> @@ -3133,6 +3134,22 @@ void DrawingML::WriteText(const Reference<XInterface>& rXIface, bool bBodyPr, bo sal_Int32 nShapeTextRotateAngle = 0; if (GetProperty(xTextSet, "RotateAngle")) nShapeTextRotateAngle = rXPropSet->getPropertyValue("RotateAngle").get<sal_Int32>() / 300; + sal_Int16 nCols = 0; + sal_Int32 nColSpacing = -1; + if (GetProperty(rXPropSet, "TextColumns")) + { + if (css::uno::Reference<css::text::XTextColumns> xCols{ mAny, css::uno::UNO_QUERY }) + { + nCols = xCols->getColumnCount(); + if (css::uno::Reference<css::beans::XPropertySet> xProps{ mAny, + css::uno::UNO_QUERY }) + { + if (GetProperty(xProps, "AutomaticDistance")) + mAny >>= nColSpacing; + } + } + } + std::optional<OString> isUpright; if (GetProperty(rXPropSet, "InteropGrabBag")) { @@ -3187,6 +3204,8 @@ void DrawingML::WriteText(const Reference<XInterface>& rXIface, bool bBodyPr, bo } mpFS->startElementNS( (nXmlNamespace ? nXmlNamespace : XML_a), XML_bodyPr, + XML_numCol, sax_fastparser::UseIf(OString::number(nCols), nCols > 0), + XML_spcCol, sax_fastparser::UseIf(OString::number(oox::drawingml::convertHmmToEmu(nColSpacing)), nCols > 0 && nColSpacing >= 0), XML_wrap, pWrap, XML_horzOverflow, sHorzOverflow, XML_vertOverflow, sVertOverflow, diff --git a/oox/source/ppt/pptimport.cxx b/oox/source/ppt/pptimport.cxx index 573dbd0c4234..1f569d099876 100644 --- a/oox/source/ppt/pptimport.cxx +++ b/oox/source/ppt/pptimport.cxx @@ -70,7 +70,6 @@ PowerPointImport::PowerPointImport( const Reference< XComponentContext >& rxCont PowerPointImport::~PowerPointImport() { - maPPTShapes.clear(); } bool PowerPointImport::importDocument() diff --git a/oox/source/ppt/pptshape.cxx b/oox/source/ppt/pptshape.cxx index 2f346cca2192..1756ad9e32ab 100644 --- a/oox/source/ppt/pptshape.cxx +++ b/oox/source/ppt/pptshape.cxx @@ -116,8 +116,7 @@ void PPTShape::addShape( const oox::drawingml::Theme* pTheme, const Reference< XShapes >& rxShapes, basegfx::B2DHomMatrix& aTransformation, - ::oox::drawingml::ShapeIdMap* pShapeMap, - bool bhasSameSubTypeIndex ) + ::oox::drawingml::ShapeIdMap* pShapeMap ) { SAL_INFO("oox.ppt","add shape id: " << msId << " location: " << ((meShapeLocation == Master) ? "master" : ((meShapeLocation == Slide) ? "slide" : ((meShapeLocation == Layout) ? "layout" : "other"))) << " subtype: " << mnSubType << " service: " << msServiceName); // only placeholder from layout are being inserted @@ -227,36 +226,6 @@ void PPTShape::addShape( } } - if (sServiceName != "com.sun.star.drawing.TableShape") - { - if (TextBodyPtr pTextBody = getTextBody()) - { - // If slide shape has not numCol but placeholder has we should inherit from placeholder. - if (pTextBody->getTextProperties().mnNumCol == 1 && - mnSubType && - getSubTypeIndex().has() && - rSlidePersist.getMasterPersist()) - { - oox::drawingml::ShapePtr pPlaceholder = PPTShape::findPlaceholderByIndex( - getSubTypeIndex().get(), - rSlidePersist.getMasterPersist()->getShapes()->getChildren()); - if (pPlaceholder && pPlaceholder->getTableProperties()) - pTextBody->getTextProperties().mnNumCol = pPlaceholder->getTableProperties()->getTableGrid().size(); - } - - sal_Int32 nNumCol = pTextBody->getTextProperties().mnNumCol; - if (nNumCol > 1) - { - // This shape is not a table, but has multiple columns, - // represent that as a table. - sServiceName = "com.sun.star.drawing.TableShape"; - oox::drawingml::table::TablePropertiesPtr pTableProperties = getTableProperties(); - pTableProperties->pullFromTextBody(pTextBody, maSize.Width, bhasSameSubTypeIndex, meShapeLocation == Layout); - setTextBody(nullptr); - } - } - } - SAL_INFO("oox.ppt","shape service: " << sServiceName); if (mnSubType && getSubTypeIndex().has() && meShapeLocation == Layout) diff --git a/oox/source/ppt/slidepersist.cxx b/oox/source/ppt/slidepersist.cxx index fae4e5541d96..ae9f0f567a7c 100644 --- a/oox/source/ppt/slidepersist.cxx +++ b/oox/source/ppt/slidepersist.cxx @@ -23,7 +23,6 @@ #include <com/sun/star/frame/XModel.hpp> #include <oox/ppt/timenode.hxx> #include <oox/ppt/pptshape.hxx> -#include <oox/ppt/pptimport.hxx> #include <oox/ppt/slidepersist.hxx> #include <drawingml/fillproperties.hxx> #include <oox/drawingml/shapepropertymap.hxx> @@ -35,7 +34,6 @@ #include <oox/core/xmlfilterbase.hxx> #include <drawingml/textliststyle.hxx> #include <drawingml/textparagraphproperties.hxx> -#include <drawingml/textbody.hxx> #include <osl/diagnose.h> @@ -54,8 +52,6 @@ using namespace ::com::sun::star::animations; namespace oox::ppt { -std::vector< PPTShape* > PowerPointImport::maPPTShapes; - SlidePersist::SlidePersist( XmlFilterBase& rFilter, bool bMaster, bool bNotes, const css::uno::Reference< css::drawing::XDrawPage >& rxPage, oox::drawingml::ShapePtr const & pShapesPtr, const drawingml::TextListStylePtr & pDefaultTextStyle ) @@ -132,29 +128,12 @@ sal_Int16 SlidePersist::getLayoutFromValueToken() const return nLayout; } -static bool hasSameSubTypeIndex(sal_Int32 checkSubTypeIndex) -{ - sal_Int32 nSubTypeIndex = -1; - for(PPTShape* pPPTShape : PowerPointImport::maPPTShapes) - { - if(!pPPTShape->getSubTypeIndex().has()) - continue; - - nSubTypeIndex = pPPTShape->getSubTypeIndex().get(); - - if( nSubTypeIndex == checkSubTypeIndex ) - return true; - } - return false; -} void SlidePersist::createXShapes( XmlFilterBase& rFilterBase ) { applyTextStyles( rFilterBase ); Reference< XShapes > xShapes( getPage() ); std::vector< oox::drawingml::ShapePtr >& rShapes( maShapesPtr->getChildren() ); - bool bhasSameSubTypeIndex = false; - sal_Int32 nNumCol = 1; for (auto const& shape : rShapes) { @@ -164,17 +143,7 @@ void SlidePersist::createXShapes( XmlFilterBase& rFilterBase ) PPTShape* pPPTShape = dynamic_cast< PPTShape* >( child.get() ); basegfx::B2DHomMatrix aTransformation; if ( pPPTShape ) - { - bhasSameSubTypeIndex = hasSameSubTypeIndex( pPPTShape->getSubTypeIndex().get()); - - if(pPPTShape->getTextBody()) - nNumCol = pPPTShape->getTextBody()->getTextProperties().mnNumCol; - - if(pPPTShape->getSubTypeIndex().has() && nNumCol > 1 ) - PowerPointImport::maPPTShapes.push_back(pPPTShape); - - pPPTShape->addShape( rFilterBase, *this, getTheme().get(), xShapes, aTransformation, &getShapeMap(), bhasSameSubTypeIndex ); - } + pPPTShape->addShape( rFilterBase, *this, getTheme().get(), xShapes, aTransformation, &getShapeMap() ); else child->addShape( rFilterBase, getTheme().get(), xShapes, aTransformation, maShapesPtr->getFillProperties(), &getShapeMap() ); } diff --git a/oox/source/token/properties.txt b/oox/source/token/properties.txt index d50cd4bb124d..980c1bb8c0f2 100644 --- a/oox/source/token/properties.txt +++ b/oox/source/token/properties.txt @@ -528,6 +528,7 @@ TextBox TextBreak TextCameraZRotateAngle TextColor +TextColumns TextFitToSize TextFrames TextHorizontalAdjust diff --git a/sd/qa/unit/data/pptx/3columns.pptx b/sd/qa/unit/data/pptx/3columns.pptx Binary files differnew file mode 100644 index 000000000000..596db14a0d21 --- /dev/null +++ b/sd/qa/unit/data/pptx/3columns.pptx diff --git a/sd/qa/unit/data/pptx/tdf120028b.pptx b/sd/qa/unit/data/pptx/tdf120028b.pptx Binary files differdeleted file mode 100644 index 7d50da36c120..000000000000 --- a/sd/qa/unit/data/pptx/tdf120028b.pptx +++ /dev/null diff --git a/sd/qa/unit/data/pptx/tdf140852.pptx b/sd/qa/unit/data/pptx/tdf140852.pptx Binary files differnew file mode 100644 index 000000000000..1332b5a68c8c --- /dev/null +++ b/sd/qa/unit/data/pptx/tdf140852.pptx diff --git a/sd/qa/unit/export-tests-ooxml2.cxx b/sd/qa/unit/export-tests-ooxml2.cxx index e901b62c70a7..17664e632b35 100644 --- a/sd/qa/unit/export-tests-ooxml2.cxx +++ b/sd/qa/unit/export-tests-ooxml2.cxx @@ -36,6 +36,7 @@ #include <com/sun/star/style/LineSpacing.hpp> #include <com/sun/star/style/LineSpacingMode.hpp> #include <com/sun/star/frame/XLoadable.hpp> +#include <com/sun/star/text/XTextColumns.hpp> #include <com/sun/star/document/XDocumentPropertiesSupplier.hpp> @@ -213,6 +214,8 @@ public: void testTdf125560_textDeflate(); void testTdf125560_textInflateTop(); void testTdf96061_textHighlight(); + void testTextColumns_tdf140852(); + void testTextColumns_3columns(); CPPUNIT_TEST_SUITE(SdOOXMLExportTest2); @@ -340,6 +343,8 @@ public: CPPUNIT_TEST(testTdf125560_textDeflate); CPPUNIT_TEST(testTdf125560_textInflateTop); CPPUNIT_TEST(testTdf96061_textHighlight); + CPPUNIT_TEST(testTextColumns_tdf140852); + CPPUNIT_TEST(testTextColumns_3columns); CPPUNIT_TEST_SUITE_END(); @@ -3198,6 +3203,121 @@ void SdOOXMLExportTest2::testTdf96061_textHighlight() CPPUNIT_ASSERT_EQUAL(sal_Int32(-1), aColor); } +void SdOOXMLExportTest2::testTextColumns_tdf140852() +{ + // The document defines two columns in slideLayout12.xml, but explicitly redefines + // in slide1.xml. Here we check that the redefinition in the slide takes precedence. + + auto xDocShRef = loadURL( + m_directories.getURLFromSrc(u"sd/qa/unit/data/pptx/tdf140852.pptx"), PPTX); + + { + uno::Reference<drawing::XDrawPagesSupplier> xDrawPagesSupplier = getDoc(xDocShRef); + uno::Reference<drawing::XDrawPages> xPages = xDrawPagesSupplier->getDrawPages(); + uno::Reference<drawing::XDrawPage> xPage(xPages->getByIndex(0), uno::UNO_QUERY_THROW); + uno::Reference<container::XIndexAccess> xIndexAccess(xPage, uno::UNO_QUERY_THROW); + uno::Reference<drawing::XShape> xShape(xIndexAccess->getByIndex(0), uno::UNO_QUERY_THROW); + uno::Reference<beans::XPropertySet> xProps(xShape, uno::UNO_QUERY_THROW); + uno::Reference<text::XTextRange> const xParagraph(getParagraphFromShape(0, xProps)); + CPPUNIT_ASSERT_EQUAL(OUString("Training will be treated as part of sharing the sweet when " + "it comes to serving ice cream"), + xParagraph->getString()); + uno::Reference<text::XTextColumns> xCols(xProps->getPropertyValue("TextColumns"), + uno::UNO_QUERY_THROW); + CPPUNIT_ASSERT_EQUAL(sal_Int16(1), xCols->getColumnCount()); + uno::Reference<beans::XPropertySet> xColProps(xCols, uno::UNO_QUERY_THROW); + CPPUNIT_ASSERT_EQUAL(uno::Any(sal_Int32(1000)), + xColProps->getPropertyValue("AutomaticDistance")); + } + + utl::TempFile tempFile; + xDocShRef = saveAndReload(xDocShRef.get(), PPTX, &tempFile); + + { + uno::Reference<drawing::XDrawPagesSupplier> xDrawPagesSupplier = getDoc(xDocShRef); + uno::Reference<drawing::XDrawPages> xPages = xDrawPagesSupplier->getDrawPages(); + uno::Reference<drawing::XDrawPage> xPage(xPages->getByIndex(0), uno::UNO_QUERY_THROW); + uno::Reference<container::XIndexAccess> xIndexAccess(xPage, uno::UNO_QUERY_THROW); + uno::Reference<drawing::XShape> xShape(xIndexAccess->getByIndex(0), uno::UNO_QUERY_THROW); + uno::Reference<beans::XPropertySet> xProps(xShape, uno::UNO_QUERY_THROW); + uno::Reference<text::XTextRange> const xParagraph(getParagraphFromShape(0, xProps)); + CPPUNIT_ASSERT_EQUAL(OUString("Training will be treated as part of sharing the sweet when " + "it comes to serving ice cream"), + xParagraph->getString()); + uno::Reference<text::XTextColumns> xCols(xProps->getPropertyValue("TextColumns"), + uno::UNO_QUERY_THROW); + CPPUNIT_ASSERT_EQUAL(sal_Int16(1), xCols->getColumnCount()); + uno::Reference<beans::XPropertySet> xColProps(xCols, uno::UNO_QUERY_THROW); + CPPUNIT_ASSERT_EQUAL(uno::Any(sal_Int32(1000)), + xColProps->getPropertyValue("AutomaticDistance")); + } + + xDocShRef->DoClose(); + + xmlDocUniquePtr pXmlDocRels = parseExport(tempFile, "ppt/slides/slide1.xml"); + assertXPath(pXmlDocRels, "/p:sld/p:cSld/p:spTree/p:sp[1]/p:txBody/a:bodyPr", "numCol", "1"); + assertXPath(pXmlDocRels, "/p:sld/p:cSld/p:spTree/p:sp[1]/p:txBody/a:bodyPr", "spcCol", "360000"); + + tempFile.EnableKillingFile(); +} + +void SdOOXMLExportTest2::testTextColumns_3columns() +{ + auto xDocShRef = loadURL( + m_directories.getURLFromSrc(u"sd/qa/unit/data/pptx/3columns.pptx"), PPTX); + + { + uno::Reference<drawing::XDrawPagesSupplier> xDrawPagesSupplier = getDoc(xDocShRef); + uno::Reference<drawing::XDrawPages> xPages = xDrawPagesSupplier->getDrawPages(); + uno::Reference<drawing::XDrawPage> xPage(xPages->getByIndex(0), uno::UNO_QUERY_THROW); + uno::Reference<container::XIndexAccess> xIndexAccess(xPage, uno::UNO_QUERY_THROW); + uno::Reference<drawing::XShape> xShape(xIndexAccess->getByIndex(0), uno::UNO_QUERY_THROW); + uno::Reference<beans::XPropertySet> xProps(xShape, uno::UNO_QUERY_THROW); + uno::Reference<text::XTextColumns> xCols(xProps->getPropertyValue("TextColumns"), + uno::UNO_QUERY_THROW); + CPPUNIT_ASSERT_EQUAL(sal_Int16(3), xCols->getColumnCount()); + uno::Reference<beans::XPropertySet> xColProps(xCols, uno::UNO_QUERY_THROW); + CPPUNIT_ASSERT_EQUAL(uno::Any(sal_Int32(300)), + xColProps->getPropertyValue("AutomaticDistance")); + // Scale value may be unstable; just test that the text is actually scaled + sal_Int16 nScale; + CPPUNIT_ASSERT(xProps->getPropertyValue("TextFitToSizeScale") >>= nScale); + CPPUNIT_ASSERT_GREATER(sal_Int16(0), nScale); + CPPUNIT_ASSERT_LESS(sal_Int16(100), nScale); + } + + utl::TempFile tempFile; + xDocShRef = saveAndReload(xDocShRef.get(), PPTX, &tempFile); + + { + uno::Reference<drawing::XDrawPagesSupplier> xDrawPagesSupplier = getDoc(xDocShRef); + uno::Reference<drawing::XDrawPages> xPages = xDrawPagesSupplier->getDrawPages(); + uno::Reference<drawing::XDrawPage> xPage(xPages->getByIndex(0), uno::UNO_QUERY_THROW); + uno::Reference<container::XIndexAccess> xIndexAccess(xPage, uno::UNO_QUERY_THROW); + uno::Reference<drawing::XShape> xShape(xIndexAccess->getByIndex(0), uno::UNO_QUERY_THROW); + uno::Reference<beans::XPropertySet> xProps(xShape, uno::UNO_QUERY_THROW); + uno::Reference<text::XTextColumns> xCols(xProps->getPropertyValue("TextColumns"), + uno::UNO_QUERY_THROW); + CPPUNIT_ASSERT_EQUAL(sal_Int16(3), xCols->getColumnCount()); + uno::Reference<beans::XPropertySet> xColProps(xCols, uno::UNO_QUERY_THROW); + CPPUNIT_ASSERT_EQUAL(uno::Any(sal_Int32(300)), + xColProps->getPropertyValue("AutomaticDistance")); + // Scale value may be unstable; just test that the text is actually scaled + sal_Int16 nScale; + CPPUNIT_ASSERT(xProps->getPropertyValue("TextFitToSizeScale") >>= nScale); + CPPUNIT_ASSERT_GREATER(sal_Int16(0), nScale); + CPPUNIT_ASSERT_LESS(sal_Int16(100), nScale); + } + + xDocShRef->DoClose(); + + xmlDocUniquePtr pXmlDocRels = parseExport(tempFile, "ppt/slides/slide1.xml"); + assertXPath(pXmlDocRels, "/p:sld/p:cSld/p:spTree/p:sp[1]/p:txBody/a:bodyPr", "numCol", "3"); + assertXPath(pXmlDocRels, "/p:sld/p:cSld/p:spTree/p:sp[1]/p:txBody/a:bodyPr", "spcCol", "108000"); + + tempFile.EnableKillingFile(); +} + CPPUNIT_TEST_SUITE_REGISTRATION(SdOOXMLExportTest2); CPPUNIT_PLUGIN_IMPLEMENT(); diff --git a/sd/qa/unit/import-tests.cxx b/sd/qa/unit/import-tests.cxx index 866542c717db..fec4db5b6586 100644 --- a/sd/qa/unit/import-tests.cxx +++ b/sd/qa/unit/import-tests.cxx @@ -84,6 +84,7 @@ #include <com/sun/star/frame/Desktop.hpp> #include <com/sun/star/text/GraphicCrop.hpp> #include <com/sun/star/text/XTextCursor.hpp> +#include <com/sun/star/text/XTextColumns.hpp> #include <com/sun/star/xml/dom/XDocument.hpp> #include <com/sun/star/container/XNamed.hpp> #include <com/sun/star/presentation/XCustomPresentationSupplier.hpp> @@ -225,7 +226,6 @@ public: void testPatternImport(); void testPptCrop(); void testTdf120028(); - void testTdf120028b(); void testDescriptionImport(); void testTdf83247(); void testTdf47365(); @@ -337,7 +337,6 @@ public: CPPUNIT_TEST(testTdf116266); CPPUNIT_TEST(testPptCrop); CPPUNIT_TEST(testTdf120028); - CPPUNIT_TEST(testTdf120028b); CPPUNIT_TEST(testDescriptionImport); CPPUNIT_TEST(testTdf83247); CPPUNIT_TEST(testTdf47365); @@ -1050,26 +1049,20 @@ void SdImportTest::testMultiColTexts() sd::DrawDocShellRef xDocShRef = loadURL( m_directories.getURLFromSrc(u"/sd/qa/unit/data/pptx/multicol.pptx"), PPTX ); const SdrPage *pPage = GetPage( 1, xDocShRef ); - sdr::table::SdrTableObj *pTableObj = dynamic_cast<sdr::table::SdrTableObj*>(pPage->GetObj(0)); - CPPUNIT_ASSERT( pTableObj ); + auto pTextObj = dynamic_cast<SdrTextObj*>(pPage->GetObj(0)); + CPPUNIT_ASSERT(pTextObj); - CPPUNIT_ASSERT_EQUAL(sal_Int32(1), pTableObj->getRowCount()); - CPPUNIT_ASSERT_EQUAL(sal_Int32(2), pTableObj->getColumnCount()); + CPPUNIT_ASSERT_EQUAL(sal_Int16(2), pTextObj->GetTextColumnsNumber()); + CPPUNIT_ASSERT_EQUAL(sal_Int32(1000), pTextObj->GetTextColumnsSpacing()); - sdr::table::SdrTableObj *pMasterTableObj = dynamic_cast<sdr::table::SdrTableObj*>(pPage->TRG_GetMasterPage().GetObj(0)); - CPPUNIT_ASSERT( pMasterTableObj ); + auto pMasterTextObj = dynamic_cast<SdrTextObj*>(pPage->TRG_GetMasterPage().GetObj(0)); + CPPUNIT_ASSERT(pMasterTextObj); - CPPUNIT_ASSERT_EQUAL(sal_Int32(1), pMasterTableObj->getRowCount()); - CPPUNIT_ASSERT_EQUAL(sal_Int32(2), pMasterTableObj->getColumnCount()); + CPPUNIT_ASSERT_EQUAL(sal_Int16(2), pMasterTextObj->GetTextColumnsNumber()); + CPPUNIT_ASSERT_EQUAL(sal_Int32(1000), pMasterTextObj->GetTextColumnsSpacing()); - uno::Reference< table::XCellRange > xTable(pMasterTableObj->getTable(), uno::UNO_QUERY_THROW); - uno::Reference< beans::XPropertySet > xCell; - xCell.set(xTable->getCellByPosition(0, 0), uno::UNO_QUERY_THROW); - uno::Reference<text::XTextRange> xParagraph(getParagraphFromShape(0, xCell)); - uno::Reference<text::XTextRange> xRun( getRunFromParagraph (0, xParagraph ) ); - OUString sText = xRun->getString(); - - CPPUNIT_ASSERT_EQUAL(OUString(""), sText); //We don't import master table text for multicolumn case. + uno::Reference<text::XTextRange> xText(pMasterTextObj->getUnoShape(), uno::UNO_QUERY_THROW); + CPPUNIT_ASSERT_EQUAL(OUString("mastershape1\nmastershape2"), xText->getString()); } void SdImportTest::testPredefinedTableStyle() @@ -3089,7 +3082,7 @@ void SdImportTest::testTdf116266() void SdImportTest::testTdf120028() { - // Check that the table shape has 4 columns. + // Check that the text shape has 4 columns. ::sd::DrawDocShellRef xDocShRef = loadURL(m_directories.getURLFromSrc(u"/sd/qa/unit/data/pptx/tdf120028.pptx"), PPTX); uno::Reference<drawing::XDrawPagesSupplier> xDoc(xDocShRef->GetDoc()->getUnoModel(), @@ -3099,63 +3092,22 @@ void SdImportTest::testTdf120028() uno::Reference<drawing::XDrawPage> xPage(xDoc->getDrawPages()->getByIndex(0), uno::UNO_QUERY); CPPUNIT_ASSERT(xPage.is()); - // This failed, shape was not a table, all text was rendered in a single - // column. uno::Reference<beans::XPropertySet> xShape(getShape(0, xPage)); - uno::Reference<table::XColumnRowRange> xModel(xShape->getPropertyValue("Model"), - uno::UNO_QUERY); - CPPUNIT_ASSERT(xModel.is()); - - uno::Reference<table::XTableColumns> xColumns = xModel->getColumns(); - CPPUNIT_ASSERT_EQUAL(static_cast<sal_Int32>(4), xColumns->getCount()); - - // Check font size in the A1 cell. - uno::Reference<table::XCellRange> xCells(xModel, uno::UNO_QUERY); - uno::Reference<beans::XPropertySet> xCell(xCells->getCellByPosition(0, 0), uno::UNO_QUERY); - uno::Reference<text::XTextRange> xParagraph(getParagraphFromShape(0, xCell)); + uno::Reference<text::XTextColumns> xCols(xShape->getPropertyValue("TextColumns"), + uno::UNO_QUERY_THROW); + CPPUNIT_ASSERT_EQUAL(static_cast<sal_Int16>(4), xCols->getColumnCount()); + uno::Reference<beans::XPropertySet> xColProps(xCols, uno::UNO_QUERY_THROW); + CPPUNIT_ASSERT_EQUAL(uno::Any(sal_Int32(0)), xColProps->getPropertyValue("AutomaticDistance")); + + // Check font size in the shape. + uno::Reference<text::XTextRange> xParagraph(getParagraphFromShape(0, xShape)); uno::Reference<text::XTextRange> xRun(getRunFromParagraph(0, xParagraph)); - uno::Reference<beans::XPropertySet> xPropSet(xRun, uno::UNO_QUERY); + uno::Reference<beans::XPropertySet> xPropSet(xRun, uno::UNO_QUERY_THROW); double fCharHeight = 0; xPropSet->getPropertyValue("CharHeight") >>= fCharHeight; - // This failed, non-scaled height was 13.5. - CPPUNIT_ASSERT_DOUBLES_EQUAL(11.5, fCharHeight, 1E-12); - - xDocShRef->DoClose(); -} - -void SdImportTest::testTdf120028b() -{ - // Check that the table shape has 4 columns. - ::sd::DrawDocShellRef xDocShRef - = loadURL(m_directories.getURLFromSrc(u"/sd/qa/unit/data/pptx/tdf120028b.pptx"), PPTX); - uno::Reference<drawing::XDrawPagesSupplier> xDoc(xDocShRef->GetDoc()->getUnoModel(), - uno::UNO_QUERY); - CPPUNIT_ASSERT(xDoc.is()); - - uno::Reference<drawing::XDrawPage> xPage(xDoc->getDrawPages()->getByIndex(0), uno::UNO_QUERY); - CPPUNIT_ASSERT(xPage.is()); - - uno::Reference<beans::XPropertySet> xShape(getShape(0, xPage)); - CPPUNIT_ASSERT(xShape.is()); - - uno::Reference<table::XColumnRowRange> xModel(xShape->getPropertyValue("Model"), - uno::UNO_QUERY); - CPPUNIT_ASSERT(xModel.is()); - - uno::Reference<table::XTableColumns> xColumns = xModel->getColumns(); - CPPUNIT_ASSERT_EQUAL(static_cast<sal_Int32>(4), xColumns->getCount()); - - // Check font color in the A1 cell. - uno::Reference<table::XCellRange> xCells(xModel, uno::UNO_QUERY); - uno::Reference<beans::XPropertySet> xCell(xCells->getCellByPosition(0, 0), uno::UNO_QUERY); - uno::Reference<text::XTextRange> xParagraph(getParagraphFromShape(0, xCell)); - uno::Reference<text::XTextRange> xRun(getRunFromParagraph(0, xParagraph)); - uno::Reference<beans::XPropertySet> xPropSet(xRun, uno::UNO_QUERY); - Color nCharColor; - xPropSet->getPropertyValue("CharColor") >>= nCharColor; - // This was 0x1f497d, not white: text list style from placeholder shape - // from slide layout was ignored. - CPPUNIT_ASSERT_EQUAL(COL_WHITE, nCharColor); + CPPUNIT_ASSERT_DOUBLES_EQUAL(13.5, fCharHeight, 1E-12); + // 13.5 * 86% is approx. 11.6 (the correct scaled font size) + CPPUNIT_ASSERT_EQUAL(uno::Any(sal_Int16(86)), xShape->getPropertyValue("TextFitToSizeScale")); xDocShRef->DoClose(); } |