configure.ac | 2 distro-configs/CODAWindows.conf | 71 ++++++++++------ distro-configs/CPLinuxQtFlatpak.conf | 11 +- distro-configs/CPMacOS-LOKit.conf | 85 ++++++++++++-------- include/oox/export/chartexport.hxx | 7 - oox/source/drawingml/shape.cxx | 3 oox/source/export/chartexport.cxx | 24 ++--- oox/source/export/drawingml.cxx | 26 ++++-- oox/source/export/shapes.cxx | 21 +++++ sc/source/filter/excel/xestyle.cxx | 2 sc/source/filter/excel/xistyle.cxx | 4 sd/source/filter/eppt/pptx-animations-nodectx.cxx | 37 +++++--- sd/source/filter/eppt/pptx-animations-nodectx.hxx | 8 + sd/source/filter/eppt/pptx-animations.cxx | 29 +++++- sw/CppunitTest_sw_core_doc.mk | 1 sw/qa/core/doc/data/bad-heading-indent.docx |binary sw/qa/core/doc/number.cxx | 51 ++++++++++++ sw/qa/uitest/data/reject-all-overlap.docx |binary sw/qa/uitest/writer_tests/trackedChanges.py | 17 ++++ sw/source/core/doc/number.cxx | 3 sw/source/filter/ww8/docxattributeoutput.cxx | 92 +++++++++++----------- sw/source/ui/fldui/fldedt.cxx | 4 sw/source/ui/misc/outline.cxx | 8 + sw/source/uibase/misc/redlndlg.cxx | 22 ----- 24 files changed, 347 insertions(+), 181 deletions(-)
New commits: commit 2f57ca9a4ca0f521ca49019ef838b044677b8544 Author: Aron Budea <[email protected]> AuthorDate: Sat Dec 20 03:15:22 2025 +1100 Commit: Andras Timar <[email protected]> CommitDate: Sat Dec 20 11:01:22 2025 +0100 Table styles: Typo in exported XML makes file invalid Affected eg. forum-mso-de-130905.xlsx Since fc38794991dc85de1821c527b3e4cdfc71026a75. Change-Id: I267644a6eb6567416ed26592ce4d164352820d26 Reviewed-on: https://gerrit.libreoffice.org/c/core/+/195926 Tested-by: Jenkins CollaboraOffice <[email protected]> Reviewed-by: Aron Budea <[email protected]> diff --git a/sc/source/filter/excel/xestyle.cxx b/sc/source/filter/excel/xestyle.cxx index ce5ffc32f97b..9a0706d6f7bf 100644 --- a/sc/source/filter/excel/xestyle.cxx +++ b/sc/source/filter/excel/xestyle.cxx @@ -3361,7 +3361,7 @@ XclExpXmlTableStyle::XclExpXmlTableStyle(const XclExpRoot& rRoot, const ScTableS } } -const std::map<ScTableStyleElement, const char*> aTableStyleElementToOOXML = { {ScTableStyleElement::WholeTable, "wholeTable"}, {ScTableStyleElement::FirstColumnStripe, "firstColumnStripe"}, {ScTableStyleElement::SecondColumnStripe, "secondColumnStripe"}, {ScTableStyleElement::FirstRowStripe, "firstRowStripe"}, {ScTableStyleElement::SecondRowStripe, "secondRowStripe"}, {ScTableStyleElement::LastColumn, "lastColumn"}, {ScTableStyleElement::FirstColumn, "firstColumn"}, {ScTableStyleElement::HeaderRow, "headerRow"}, {ScTableStyleElement::TotalRow, "totalRow"}, {ScTableStyleElement::FirstHeaderCell, "firstHeaderCell"}, {ScTableStyleElement::LastHeaderCell, "LastHeaderCell"} }; +const std::map<ScTableStyleElement, const char*> aTableStyleElementToOOXML = { {ScTableStyleElement::WholeTable, "wholeTable"}, {ScTableStyleElement::FirstColumnStripe, "firstColumnStripe"}, {ScTableStyleElement::SecondColumnStripe, "secondColumnStripe"}, {ScTableStyleElement::FirstRowStripe, "firstRowStripe"}, {ScTableStyleElement::SecondRowStripe, "secondRowStripe"}, {ScTableStyleElement::LastColumn, "lastColumn"}, {ScTableStyleElement::FirstColumn, "firstColumn"}, {ScTableStyleElement::HeaderRow, "headerRow"}, {ScTableStyleElement::TotalRow, "totalRow"}, {ScTableStyleElement::FirstHeaderCell, "firstHeaderCell"}, {ScTableStyleElement::LastHeaderCell, "lastHeaderCell"} }; void XclExpXmlTableStyle::SaveXml( XclExpXmlStream& rStrm ) { commit 3dc8e43c4cdbe191f19593778ff0e4313cf57f49 Author: Karthik Godha <[email protected]> AuthorDate: Thu Dec 18 14:36:03 2025 +0530 Commit: Andras Timar <[email protected]> CommitDate: Sat Dec 20 11:01:22 2025 +0100 Sanitize font size read from XLS This is related to commit 28273e586b398e2ce181c4ce9e740949fad11876 Change-Id: I182c27b6a9f796bf949246a2038c318dec755c33 Reviewed-on: https://gerrit.libreoffice.org/c/core/+/195831 Reviewed-by: Michael Stahl <[email protected]> Tested-by: Jenkins CollaboraOffice <[email protected]> diff --git a/sc/source/filter/excel/xistyle.cxx b/sc/source/filter/excel/xistyle.cxx index c079c7ac9562..b42bfeed12a3 100644 --- a/sc/source/filter/excel/xistyle.cxx +++ b/sc/source/filter/excel/xistyle.cxx @@ -272,6 +272,10 @@ void XclImpFont::ReadFont( XclImpStream& rStrm ) DBG_ERROR_BIFF(); return; } + + constexpr sal_uInt16 MIN_FONT_HEIGHT_1_20th_PT = 20; + maData.mnHeight = std::max(maData.mnHeight, MIN_FONT_HEIGHT_1_20th_PT); + GuessScriptType(); SetAllUsedFlags( true ); } commit 484eb0ce09ffecea0d39a2b094ec15c9d41d7d93 Author: Karthik Godha <[email protected]> AuthorDate: Thu Dec 18 16:45:21 2025 +0530 Commit: Andras Timar <[email protected]> CommitDate: Sat Dec 20 11:01:22 2025 +0100 tdf#170035:PPTX->PPTX invalid values in guide-list During PPTX export internal equation names are exported as guide values in guide-list. Change-Id: I179b47b57057fabf76e85b1c1d4aa62e0e3154d2 Reviewed-on: https://gerrit.libreoffice.org/c/core/+/195837 Tested-by: Jenkins CollaboraOffice <[email protected]> Reviewed-by: Michael Stahl <[email protected]> diff --git a/oox/source/export/drawingml.cxx b/oox/source/export/drawingml.cxx index a3fd38496787..77e7f25a4944 100644 --- a/oox/source/export/drawingml.cxx +++ b/oox/source/export/drawingml.cxx @@ -4914,6 +4914,10 @@ void prepareTextArea(const EnhancedCustomShape2d& rEnhancedCustomShape2d, OUString GetFormula(const OUString& sEquation, const OUString& sReplace, const OUString& sNewStr) { + // 'logheight' and `logwidth` are only used for calculating shape's rectangle + if (sEquation == "logheight" || sEquation == "logwidth") + return OUString(); + OUString sFormula = sEquation; size_t nPos = sFormula.indexOf(sReplace); if (nPos != std::string::npos) @@ -4944,18 +4948,24 @@ void prepareGluePoints(std::vector<Guide>& rGuideList, { Guide aGuideX; aGuideX.sName = "GluePoint"_ostr + OString::number(nIndex) + "X"; - aGuideX.sFormula - = (bIsOOXML && nIdx1 >= 0 && nIdx1 < aEquations.getLength()) - ? GetFormula(aEquations[nIdx1], "*logwidth/", " w ").toUtf8() - : "*/ " + OString::number(nIdx1) + " w " + OString::number(nWidth); + + if (bIsOOXML && nIdx1 >= 0 && nIdx1 < aEquations.getLength()) + aGuideX.sFormula = GetFormula(aEquations[nIdx1], "*logwidth/", " w ").toUtf8(); + if (aGuideX.sFormula.isEmpty()) + aGuideX.sFormula + = "*/ " + OString::number(nIdx1) + " w " + OString::number(nWidth); + rGuideList.push_back(aGuideX); Guide aGuideY; aGuideY.sName = "GluePoint"_ostr + OString::number(nIndex) + "Y"; - aGuideY.sFormula - = (bIsOOXML && nIdx2 >= 0 && nIdx2 < aEquations.getLength()) - ? GetFormula(aEquations[nIdx2], "*logheight/", " h ").toUtf8() - : "*/ " + OString::number(nIdx2) + " h " + OString::number(nHeight); + + if (bIsOOXML && nIdx2 >= 0 && nIdx2 < aEquations.getLength()) + aGuideY.sFormula = GetFormula(aEquations[nIdx2], "*logheight/", " h ").toUtf8(); + if (aGuideY.sFormula.isEmpty()) + aGuideY.sFormula + = "*/ " + OString::number(nIdx2) + " h " + OString::number(nHeight); + rGuideList.push_back(aGuideY); } commit bcd1aae10b473fdfed869bd83a08f91fb95d28d5 Author: Karthik Godha <[email protected]> AuthorDate: Wed Dec 17 10:33:56 2025 +0530 Commit: Andras Timar <[email protected]> CommitDate: Sat Dec 20 11:01:22 2025 +0100 ODP -> PPTX export empty attrName element In OOXML export attrNameLst must contain at least one attrName element. Export of attrName is skipped if it's empty, this results in invalid schema. (ISO-IEC-29500 19.5.8) bug-file: ooo72169-1.odp Change-Id: I8ebf2b9752fc9e90c21339d7d9dd3507e2518fc9 Reviewed-on: https://gerrit.libreoffice.org/c/core/+/195758 Tested-by: Jenkins CollaboraOffice <[email protected]> Reviewed-by: Michael Stahl <[email protected]> diff --git a/sd/source/filter/eppt/pptx-animations.cxx b/sd/source/filter/eppt/pptx-animations.cxx index edb068dbc942..ad623fd15f40 100644 --- a/sd/source/filter/eppt/pptx-animations.cxx +++ b/sd/source/filter/eppt/pptx-animations.cxx @@ -299,16 +299,12 @@ void WriteAnimationAttributeName(const FSHelperPtr& pFS, const OUString& rAttrib attrConv++; } + pFS->startElementNS(XML_p, XML_attrName); if (pAttribute) - { - pFS->startElementNS(XML_p, XML_attrName); pFS->writeEscaped(pAttribute); - pFS->endElementNS(XML_p, XML_attrName); - } else - { SAL_WARN("sd.eppt", "unhandled animation attribute name: " << rAttributeName); - } + pFS->endElementNS(XML_p, XML_attrName); } pFS->endElementNS(XML_p, XML_attrNameLst); commit 0f0acc1b960b204253adc20a194a52fcba68bedc Author: Karthik Godha <[email protected]> AuthorDate: Mon Dec 15 16:56:58 2025 +0530 Commit: Andras Timar <[email protected]> CommitDate: Sat Dec 20 11:01:22 2025 +0100 tdf#169980: Fix ODP->PPTX export of stock chart In OOXML chart export in `c:stockChart` there are multiple `c:ser` elements with the same `c:idx` value. Change-Id: Id5c5983118214013a3610ae937b9893c479a0ea0 Reviewed-on: https://gerrit.libreoffice.org/c/core/+/195657 Tested-by: Jenkins CollaboraOffice <[email protected]> Reviewed-by: Michael Stahl <[email protected]> diff --git a/include/oox/export/chartexport.hxx b/include/oox/export/chartexport.hxx index b4be727e5365..a4821b467434 100644 --- a/include/oox/export/chartexport.hxx +++ b/include/oox/export/chartexport.hxx @@ -227,10 +227,9 @@ private: void exportVaryColors(const css::uno::Reference<css::chart2::XChartType>& xChartType); void exportCandleStickSeries( - const css::uno::Sequence< - css::uno::Reference< - css::chart2::XDataSeries > > & aSeriesSeq, - bool& rPrimaryAxes ); + const css::uno::Sequence<css::uno::Reference<css::chart2::XDataSeries>>& aSeriesSeq, + bool& rPrimaryAxes, sal_uInt32& nIdx); + void exportSeriesText( const css::uno::Reference< css::chart2::data::XDataSequence >& xValueSeq, bool bIsChartex ); void exportSeriesCategory( diff --git a/oox/source/export/chartexport.cxx b/oox/source/export/chartexport.cxx index 7111b6d3f0fd..4f72421f14e1 100644 --- a/oox/source/export/chartexport.cxx +++ b/oox/source/export/chartexport.cxx @@ -3240,13 +3240,15 @@ void ChartExport::exportStockChart( const Reference< chart2::XChartType >& xChar // Use a dummy data series to output needed basic chart-related XML even in case of empty charts aSplitDataSeries.push_back({}); } + + sal_uInt32 nIdx = 0; for (const auto& splitDataSeries : aSplitDataSeries) { pFS->startElement(FSNS(XML_c, XML_stockChart)); bool bPrimaryAxes = true; if (splitDataSeries.hasElements()) - exportCandleStickSeries(splitDataSeries, bPrimaryAxes); + exportCandleStickSeries(splitDataSeries, bPrimaryAxes, nIdx); // export stock properties Reference< css::chart::XStatisticDisplay > xStockPropProvider(mxDiagram, uno::UNO_QUERY); @@ -3648,8 +3650,7 @@ void ChartExport::exportSeries_chartex( const Reference<chart2::XChartType>& xCh } void ChartExport::exportCandleStickSeries( - const Sequence< Reference< chart2::XDataSeries > > & aSeriesSeq, - bool& rPrimaryAxes) + const Sequence<Reference<chart2::XDataSeries>>& aSeriesSeq, bool& rPrimaryAxes, sal_uInt32& nIdx) { for( const Reference< chart2::XDataSeries >& xSeries : aSeriesSeq ) { @@ -3664,12 +3665,13 @@ void ChartExport::exportCandleStickSeries( Sequence< Reference< chart2::data::XLabeledDataSequence > > aSeqCnt( xSource->getDataSequences()); - const char* sSeries[] = {"values-first","values-max","values-min","values-last",nullptr}; + const char* sSeries[] = {"values-first","values-max","values-min","values-last"}; - for( sal_Int32 idx = 0; sSeries[idx] != nullptr ; idx++ ) + for (const char* series : sSeries) { - Reference< chart2::data::XLabeledDataSequence > xLabeledSeq( lcl_getDataSequenceByRole( aSeqCnt, OUString::createFromAscii(sSeries[idx]) ) ); - if( xLabeledSeq.is()) + Reference<chart2::data::XLabeledDataSequence> xLabeledSeq( + lcl_getDataSequenceByRole(aSeqCnt, OUString::createFromAscii(series))); + if (xLabeledSeq.is()) { Reference< chart2::data::XDataSequence > xLabelSeq( xLabeledSeq->getLabel()); Reference< chart2::data::XDataSequence > xValueSeq( xLabeledSeq->getValues()); @@ -3677,12 +3679,8 @@ void ChartExport::exportCandleStickSeries( FSHelperPtr pFS = GetFS(); pFS->startElement(FSNS(XML_c, XML_ser)); - // TODO: idx and order - // idx attribute should start from 1 and not from 0. - pFS->singleElement( FSNS( XML_c, XML_idx ), - XML_val, OString::number(idx+1) ); - pFS->singleElement( FSNS( XML_c, XML_order ), - XML_val, OString::number(idx+1) ); + pFS->singleElement(FSNS(XML_c, XML_idx), XML_val, OString::number(++nIdx)); + pFS->singleElement(FSNS(XML_c, XML_order), XML_val, OString::number(nIdx)); // export label if( xLabelSeq.is() ) commit b8a4b06b2e3fabfd9997401885a29115a6000612 Author: Karthik Godha <[email protected]> AuthorDate: Mon Dec 15 09:35:58 2025 +0530 Commit: Andras Timar <[email protected]> CommitDate: Sat Dec 20 11:01:21 2025 +0100 tdf#169979: ODP->PPTX export missing p:pic element OLE objects when exported to PPTX should contain p:pic element in the XML. OLEs without graphic content don't export p:pic element, though this is a valid schema, PowerPoint doesn't accept this. Now empty p:pic element is exported for empty graphics Change-Id: Iac6fb988aa20e1bc9ae938d2a02dfc7b8dfae0c1 Reviewed-on: https://gerrit.libreoffice.org/c/core/+/195623 Reviewed-by: Michael Stahl <[email protected]> Tested-by: Jenkins CollaboraOffice <[email protected]> diff --git a/oox/source/export/shapes.cxx b/oox/source/export/shapes.cxx index 7f3b5493f146..f5c244b2dcb0 100644 --- a/oox/source/export/shapes.cxx +++ b/oox/source/export/shapes.cxx @@ -2799,6 +2799,25 @@ void ShapeExport::WriteMathShape(Reference<XShape> const& xShape) mpFS->endElementNS(XML_mc, XML_AlternateContent); } +static void WriteEmptyGraphic(FSHelperPtr const& pFS, sal_Int32 nGraphicId) +{ + pFS->startElementNS(XML_p, XML_pic); + pFS->startElementNS(XML_p, XML_nvPicPr); + pFS->startElementNS(XML_p, XML_cNvPr, XML_id, OUString::number(nGraphicId), XML_name, "", + XML_descr, ""); + pFS->endElementNS(XML_p, XML_cNvPr); + pFS->startElementNS(XML_p, XML_cNvPicPr); + pFS->endElementNS(XML_p, XML_cNvPicPr); + pFS->startElementNS(XML_p, XML_nvPr); + pFS->endElementNS(XML_p, XML_nvPr); + pFS->endElementNS(XML_p, XML_nvPicPr); + pFS->startElementNS(XML_p, XML_blipFill); + pFS->endElementNS(XML_p, XML_blipFill); + pFS->startElementNS(XML_p, XML_spPr); + pFS->endElementNS(XML_p, XML_spPr); + pFS->endElementNS(XML_p, XML_pic); +} + ShapeExport& ShapeExport::WriteOLE2Shape( const Reference< XShape >& xShape ) { Reference< XPropertySet > xPropSet( xShape, UNO_QUERY ); @@ -3016,6 +3035,8 @@ ShapeExport& ShapeExport::WriteOLE2Shape( const Reference< XShape >& xShape ) const Graphic* pGraphic = pOle2Obj->GetGraphic(); if (pGraphic) WriteGraphicObjectShapePart(xShape, pGraphic); + else // Required for MSO + WriteEmptyGraphic(mpFS, GetNewShapeID(xShape)); } mpFS->endElementNS( mnXmlNamespace, XML_oleObj ); commit 97e3b5699935eba677fb1367ee54bb112adaa522 Author: Noel Grandin <[email protected]> AuthorDate: Wed Dec 10 18:16:30 2025 +0200 Commit: Andras Timar <[email protected]> CommitDate: Sat Dec 20 11:01:11 2025 +0100 officeotron: elements under w:pPr element in wrong order re-use existing logic to make this output in spec-compliant order Change-Id: I5de88629295ee3eac1852fe67eedea4f1be7c087 Reviewed-on: https://gerrit.libreoffice.org/c/core/+/195394 Tested-by: Jenkins Reviewed-by: Michael Stahl <[email protected]> (cherry picked from commit 2b6e7bf5c0e9166fb10082267136ed6b899c7582) Reviewed-on: https://gerrit.libreoffice.org/c/core/+/195759 Tested-by: Jenkins CollaboraOffice <[email protected]> diff --git a/sw/source/filter/ww8/docxattributeoutput.cxx b/sw/source/filter/ww8/docxattributeoutput.cxx index b1ea0ffc1dd1..801d7bd09048 100644 --- a/sw/source/filter/ww8/docxattributeoutput.cxx +++ b/sw/source/filter/ww8/docxattributeoutput.cxx @@ -1476,56 +1476,56 @@ void DocxAttributeOutput::StartParagraphProperties() } } +// Write the elements in the spec order +const sal_Int32 aParagraphPropertiesOrder[] = +{ + FSNS( XML_w, XML_pStyle ), + FSNS( XML_w, XML_keepNext ), + FSNS( XML_w, XML_keepLines ), + FSNS( XML_w, XML_pageBreakBefore ), + FSNS( XML_w, XML_framePr ), + FSNS( XML_w, XML_widowControl ), + FSNS( XML_w, XML_numPr ), + FSNS( XML_w, XML_suppressLineNumbers ), + FSNS( XML_w, XML_pBdr ), + FSNS( XML_w, XML_shd ), + FSNS( XML_w, XML_tabs ), + FSNS( XML_w, XML_suppressAutoHyphens ), + FSNS( XML_w, XML_kinsoku ), + FSNS( XML_w, XML_wordWrap ), + FSNS( XML_w, XML_overflowPunct ), + FSNS( XML_w, XML_topLinePunct ), + FSNS( XML_w, XML_autoSpaceDE ), + FSNS( XML_w, XML_autoSpaceDN ), + FSNS( XML_w, XML_bidi ), + FSNS( XML_w, XML_adjustRightInd ), + FSNS( XML_w, XML_snapToGrid ), + FSNS( XML_w, XML_spacing ), + FSNS( XML_w, XML_ind ), + FSNS( XML_w, XML_contextualSpacing ), + FSNS( XML_w, XML_mirrorIndents ), + FSNS( XML_w, XML_suppressOverlap ), + FSNS( XML_w, XML_jc ), + FSNS( XML_w, XML_textDirection ), + FSNS( XML_w, XML_textAlignment ), + FSNS( XML_w, XML_textboxTightWrap ), + FSNS( XML_w, XML_outlineLvl ), + FSNS( XML_w, XML_divId ), + FSNS( XML_w, XML_cnfStyle ), + FSNS( XML_w, XML_rPr ), + FSNS( XML_w, XML_sectPr ), + FSNS( XML_w, XML_pPrChange ) +}; + void DocxAttributeOutput::InitCollectedParagraphProperties() { m_pLRSpaceAttrList.clear(); m_pParagraphSpacingAttrList.clear(); - // Write the elements in the spec order - static const sal_Int32 aOrder[] = - { - FSNS( XML_w, XML_pStyle ), - FSNS( XML_w, XML_keepNext ), - FSNS( XML_w, XML_keepLines ), - FSNS( XML_w, XML_pageBreakBefore ), - FSNS( XML_w, XML_framePr ), - FSNS( XML_w, XML_widowControl ), - FSNS( XML_w, XML_numPr ), - FSNS( XML_w, XML_suppressLineNumbers ), - FSNS( XML_w, XML_pBdr ), - FSNS( XML_w, XML_shd ), - FSNS( XML_w, XML_tabs ), - FSNS( XML_w, XML_suppressAutoHyphens ), - FSNS( XML_w, XML_kinsoku ), - FSNS( XML_w, XML_wordWrap ), - FSNS( XML_w, XML_overflowPunct ), - FSNS( XML_w, XML_topLinePunct ), - FSNS( XML_w, XML_autoSpaceDE ), - FSNS( XML_w, XML_autoSpaceDN ), - FSNS( XML_w, XML_bidi ), - FSNS( XML_w, XML_adjustRightInd ), - FSNS( XML_w, XML_snapToGrid ), - FSNS( XML_w, XML_spacing ), - FSNS( XML_w, XML_ind ), - FSNS( XML_w, XML_contextualSpacing ), - FSNS( XML_w, XML_mirrorIndents ), - FSNS( XML_w, XML_suppressOverlap ), - FSNS( XML_w, XML_jc ), - FSNS( XML_w, XML_textDirection ), - FSNS( XML_w, XML_textAlignment ), - FSNS( XML_w, XML_textboxTightWrap ), - FSNS( XML_w, XML_outlineLvl ), - FSNS( XML_w, XML_divId ), - FSNS( XML_w, XML_cnfStyle ), - FSNS( XML_w, XML_rPr ), - FSNS( XML_w, XML_sectPr ), - FSNS( XML_w, XML_pPrChange ) - }; - // postpone the output so that we can later [in EndParagraphProperties()] // prepend the properties before the run // coverity[overrun-buffer-arg : FALSE] - coverity has difficulty with css::uno::Sequence - m_pSerializer->mark(Tag_InitCollectedParagraphProperties, comphelper::containerToSequence(aOrder)); + m_pSerializer->mark(Tag_InitCollectedParagraphProperties, comphelper::containerToSequence(aParagraphPropertiesOrder)); } void DocxAttributeOutput::WriteCollectedParagraphProperties() @@ -4306,10 +4306,10 @@ void DocxAttributeOutput::Redline( const SwRedlineData* pRedlineData) const OUString & sParaStyleName = pFormattingChanges->GetFormatName(); if (pChangesSet || !sParaStyleName.isEmpty()) { - m_pSerializer->mark(Tag_Redline_2); - m_pSerializer->startElementNS(XML_w, XML_pPr); + m_pSerializer->mark(Tag_Redline_2, comphelper::containerToSequence(aParagraphPropertiesOrder)); + if (!sParaStyleName.isEmpty()) { OString sStyleName; @@ -4346,9 +4346,9 @@ void DocxAttributeOutput::Redline( const SwRedlineData* pRedlineData) m_pLRSpaceAttrList = std::move(pLRSpaceAttrList_Original); m_pParagraphSpacingAttrList = std::move(pParagraphSpacingAttrList_Original); - m_pSerializer->endElementNS( XML_w, XML_pPr ); + m_pSerializer->mergeTopMarks(Tag_Redline_2); - m_pSerializer->mergeTopMarks(Tag_Redline_2, sax_fastparser::MergeMarks::PREPEND); + m_pSerializer->endElementNS( XML_w, XML_pPr ); } } } commit ccf643f892a481b986a56b3f1c57789e6068885c Author: Miklos Vajna <[email protected]> AuthorDate: Tue Dec 16 14:39:18 2025 +0100 Commit: Andras Timar <[email protected]> CommitDate: Sat Dec 20 11:01:11 2025 +0100 sw: fix crash in SwFieldEditDlg's AddressHdl gdb in the core dump gives: #0 0x000073b5e9fd6bb9 in SwFieldType::Which (this=<optimized out>) at sw/inc/fldbas.hxx:276 #1 SwField::GetTypeId (this=0x0) at sw/source/core/fields/fldbas.cxx:267 #2 0x000073b5e911faa4 in SwFieldEditDlg::AddressHdl (this=0x4a057e70) at sw/source/ui/fldui/fldedt.cxx:296 #3 0x000073b5f85de37c in std::function<void ()>::operator()() const (this=0x7fffed028930) at /opt/rh/devtoolset-12/root/usr/include/c++/12/bits/std_function.h:587 #4 Control::ImplCallEventListenersAndHandler(VclEventId, std::function<void ()> const&) (this=<optimized out>, nEvent=nEvent@entry=VclEventId::ButtonClick, callHandler=...) at vcl/source/control/ctrl.cxx:311 #5 0x000073b5f85c16c8 in Button::Click (this=<optimized out>) at vcl/source/control/button.cxx:130 and #2 0x000073b5e911faa4 in SwFieldEditDlg::AddressHdl (this=0x4a057e70) at sw/source/ui/fldui/fldedt.cxx:296 warning: Source file is more recent than executable. 296 if (pCurField->GetTypeId() == SwFieldTypesEnum::DocumentInfo) (gdb) print pCurField $2 = (SwField *) 0x0 return early in case we don't have a valid pointer for the current field anymore. Change-Id: Ibc614cc825a0b14cd4f79060d35f6635eb0cdd55 Reviewed-on: https://gerrit.libreoffice.org/c/core/+/195716 Tested-by: Caolán McNamara <[email protected]> Reviewed-by: Caolán McNamara <[email protected]> Tested-by: Jenkins CollaboraOffice <[email protected]> diff --git a/sw/source/ui/fldui/fldedt.cxx b/sw/source/ui/fldui/fldedt.cxx index 7de2e44135e7..60dcf41b43a6 100644 --- a/sw/source/ui/fldui/fldedt.cxx +++ b/sw/source/ui/fldui/fldedt.cxx @@ -292,6 +292,10 @@ IMPL_LINK_NOARG(SwFieldEditDlg, AddressHdl, weld::Button&, void) SwFieldPage* pTabPage = static_cast<SwFieldPage*>(GetTabPage()); SwFieldMgr& rMgr = pTabPage->GetFieldMgr(); SwField *pCurField = rMgr.GetCurField(); + if (!pCurField) + { + return; + } if (pCurField->GetTypeId() == SwFieldTypesEnum::DocumentInfo) comphelper::dispatchCommand(u".uno:SetDocumentProperties"_ustr, {}); commit b22c9309f00dd9955a355411094c9b2265b92a5b Author: Miklos Vajna <[email protected]> AuthorDate: Tue Dec 16 08:34:26 2025 +0100 Commit: Andras Timar <[email protected]> CommitDate: Sat Dec 20 11:01:11 2025 +0100 tdf#168737 sw interdependent redlines, reject all: fix ignored format redlines The bugdoc has two redlines: a format and a delete redline. Pressing "reject all" in the manage changes dialog doesn't reject the format redline. Seems this happens because of code added in commit 9c4eef7d809ad7d283860c7b47b0f561aa240906 (tdf#52391 reject/clear formatting of format-only changes, 2019-01-29), which argued that rejection of format redlines isn't really implemented, so better if a "mass reject all" doesn't reject them, unless only format redlines are found in the document. But in the meantime I worked on improving support for rejecting format redlines, most recently commit 47cb60bc534104852a219426e3beb4c714b6cf07 (tdf#167761 sw format redline, char props: implement ODF import, 2025-08-18) added ODF import/export of these old direct character properties, so it now makes less sense to filter out format redlines while rejecting all of them. Also, the matching toolbar button didn't ignore such format redlines. Fix the problem by simplifying SwRedlineAcceptDlg::CallAcceptReject(): unless the redline data for the iterator says this item is disabled, always add it to the list of redlines, similar to what the "reject the selected redline(s)" case did already. Note that the original 2019 commit was less confusing, as it did change the label of the reject all button, but that was removed in commit 2e1a38ceb6866248ec30f6fe58cd3adc1b910eec (tdf#146893 Rework Manage Changes dialog, 2022-01-24). Change-Id: I69e7247d068cea2a25cd46ad2d5b41fccfa54919 Reviewed-on: https://gerrit.libreoffice.org/c/core/+/195693 Tested-by: Jenkins CollaboraOffice <[email protected]> Tested-by: Caolán McNamara <[email protected]> Reviewed-by: Caolán McNamara <[email protected]> diff --git a/sw/qa/uitest/data/reject-all-overlap.docx b/sw/qa/uitest/data/reject-all-overlap.docx new file mode 100644 index 000000000000..6263df4e0f6f Binary files /dev/null and b/sw/qa/uitest/data/reject-all-overlap.docx differ diff --git a/sw/qa/uitest/writer_tests/trackedChanges.py b/sw/qa/uitest/writer_tests/trackedChanges.py index 32ba68964ac6..7c1e0431d1ae 100644 --- a/sw/qa/uitest/writer_tests/trackedChanges.py +++ b/sw/qa/uitest/writer_tests/trackedChanges.py @@ -625,6 +625,23 @@ class trackedchanges(UITestCase): # i.e. a change was not accepted. self.assertEqual(document.Redlines.Count, 0) + def test_reject_all_deletes_all_redlines(self): + # Given a document with overlapping changes: + with self.ui_test.load_file(get_url_for_data_file("reject-all-overlap.docx")) as document: + xWriterDoc = self.xUITest.getTopFocusWindow() + xWriterEdit = xWriterDoc.getChild("writer_edit") + + # When rejecting all changes using the manage changes dialog: + with self.ui_test.execute_modeless_dialog_through_command(".uno:AcceptTrackedChanges", close_button="close") as xTrackDlg: + xAccBtn = xTrackDlg.getChild("rejectall") + xAccBtn.executeAction("CLICK", tuple()) + + # Then make sure all changes are rejected: + # Without the accompanying fix in place, this failed with: + # AssertionError: 1 != 0 + # i.e. a change was not rejected. + self.assertEqual(document.Redlines.Count, 0) + def test_tdf155847_multiple_tracked_columns_crash(self): with self.ui_test.load_file(get_url_for_data_file("TC-table-del-add.docx")) as document: diff --git a/sw/source/uibase/misc/redlndlg.cxx b/sw/source/uibase/misc/redlndlg.cxx index 5050d4f1e8c0..15c74d445d04 100644 --- a/sw/source/uibase/misc/redlndlg.cxx +++ b/sw/source/uibase/misc/redlndlg.cxx @@ -1108,7 +1108,7 @@ void SwRedlineAcceptDlg::CallAcceptReject( bool bSelect, bool bAccept ) weld::TreeView& rTreeView = m_pTable->GetWidget(); - auto lambda = [this, pSh, bSelect, bAccept, &rTreeView, &nPos, &aRedlines](weld::TreeIter& rEntry) { + auto lambda = [bSelect, &rTreeView, &nPos, &aRedlines](weld::TreeIter& rEntry) { if (!rTreeView.get_iter_depth(rEntry)) { if (bSelect && nPos == -1) @@ -1116,25 +1116,7 @@ void SwRedlineAcceptDlg::CallAcceptReject( bool bSelect, bool bAccept ) RedlinData *pData = weld::fromId<RedlinData*>(rTreeView.get_id(rEntry)); - bool bIsNotFormatted = true; - - // first remove only changes with insertion/deletion, if they exist - // (format-only changes haven't had real rejection yet, only an - // approximation: clear direct formatting, so try to warn - // with the extended button label "Reject All/Clear formatting") - if ( !bSelect && !bAccept && !m_bOnlyFormatedRedlines ) - { - SwRedlineTable::size_type nPosition = GetRedlinePos(rEntry); - if (nPosition != SwRedlineTable::npos) - { - const SwRangeRedline& rRedln = pSh->GetRedline(nPosition); - - if (RedlineType::Format == rRedln.GetType()) - bIsNotFormatted = false; - } - } - - if (!pData->bDisabled && bIsNotFormatted) + if (!pData->bDisabled) aRedlines.emplace_back(rTreeView.make_iterator(&rEntry)); } return false; commit bb75d7677bfd7a5bdcfa568f5b4e6ad9c6f7d966 Author: Miklos Vajna <[email protected]> AuthorDate: Mon Dec 15 08:44:05 2025 +0100 Commit: Andras Timar <[email protected]> CommitDate: Sat Dec 20 11:01:11 2025 +0100 tdf#169949 sw num rule defaults: let numbering type none imply follow by none Load the document, press Ctrl-1 to set a heading 1 paragraph style, an unexpected leading tab shows up before the paragraph text. This went wrong with commit a7d9837a8aa6d1233f4c21e4db5d32428a3ffc58 (tdf#148360: sw: do not ignore list label followed by, 2022-08-02), previously "followed by" was ignored by the layout if the numbering portion before the separator was empty. This is needed to correctly lay out DOCX files. Fix the problem by changing the default Outline numbering rule in Writer: the numbering type is set to "none", so also set the "label followed by" property to "nothing". Note that this doesn't affect DOCX files which already have heading styles configured, nor documents where the DocumentSettingId::NO_NUMBERING_SHOW_FOLLOWBY compatibility option is off. There was one handy side-effect of having "followed by" as "tab": once the UI was used to change the numbering type from "none" to e.g. Arabic, the user didn't have to explicitly ask for the tab separator, which is usually wanted. Continue supporting this scenario by checking for the "number type none + followed by nothing" scenario: if the number type changes to something else, then also change "followed by" to the old "tab" default. Change-Id: I60905623e6c4b6ded56a1a089ae0fb3af3b2bd3a Reviewed-on: https://gerrit.libreoffice.org/c/core/+/195627 Tested-by: Jenkins CollaboraOffice <[email protected]> Reviewed-by: Caolán McNamara <[email protected]> diff --git a/sw/CppunitTest_sw_core_doc.mk b/sw/CppunitTest_sw_core_doc.mk index 9e12126c1c7a..6c0aec27e9aa 100644 --- a/sw/CppunitTest_sw_core_doc.mk +++ b/sw/CppunitTest_sw_core_doc.mk @@ -15,6 +15,7 @@ $(eval $(call gb_CppunitTest_use_common_precompiled_header,sw_core_doc)) $(eval $(call gb_CppunitTest_add_exception_objects,sw_core_doc, \ sw/qa/core/doc/doc \ + sw/qa/core/doc/number \ sw/qa/core/doc/DocumentRedlineManager \ )) diff --git a/sw/qa/core/doc/data/bad-heading-indent.docx b/sw/qa/core/doc/data/bad-heading-indent.docx new file mode 100644 index 000000000000..65ec57ab12c4 Binary files /dev/null and b/sw/qa/core/doc/data/bad-heading-indent.docx differ diff --git a/sw/qa/core/doc/number.cxx b/sw/qa/core/doc/number.cxx new file mode 100644 index 000000000000..7396b1c262a0 --- /dev/null +++ b/sw/qa/core/doc/number.cxx @@ -0,0 +1,51 @@ +/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */ +/* + * This file is part of the LibreOffice project. + * + * This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. + */ + +#include <swmodeltestbase.hxx> + +#include <comphelper/propertyvalue.hxx> + +namespace +{ +/// Covers sw/source/core/doc/number.cxx fixes. +class Test : public SwModelTestBase +{ +public: + Test() + : SwModelTestBase(u"/sw/qa/core/doc/data/"_ustr) + { + } +}; + +CPPUNIT_TEST_FIXTURE(Test, testBadHeadingIndent) +{ + // Given a DOCX file with a single paragraph, no heading styles present: + createSwDoc("bad-heading-indent.docx"); + + // When marking that paragraph heading 1: + uno::Sequence<beans::PropertyValue> aPropertyValues = { + comphelper::makePropertyValue(u"Style"_ustr, uno::Any(u"Heading 1"_ustr)), + comphelper::makePropertyValue(u"FamilyName"_ustr, uno::Any(u"ParagraphStyles"_ustr)), + }; + dispatchCommand(mxComponent, u".uno:StyleApply"_ustr, aPropertyValues); + + // Then make sure that doesn't result in unexpected indent: + xmlDocUniquePtr pXmlDoc = parseLayoutDump(); + int nTabCount + = getXPathContent(pXmlDoc, "count(//SwLineLayout/child::*[@type='PortionType::TabLeft'])") + .toInt32(); + // Without the accompanying fix in place, this test would have failed with: + // - Expected: 0 + // - Actual : 1 + // i.e. an unexpected tab portion was inserted before the paragraph text. + CPPUNIT_ASSERT_EQUAL(0, nTabCount); +} +} + +/* vim:set shiftwidth=4 softtabstop=4 expandtab: */ diff --git a/sw/source/core/doc/number.cxx b/sw/source/core/doc/number.cxx index d76214d050c3..bdb0d60924e4 100644 --- a/sw/source/core/doc/number.cxx +++ b/sw/source/core/doc/number.cxx @@ -479,6 +479,9 @@ SwNumRule::SwNumRule( OUString aNm, { pFormat = new SwNumFormat; pFormat->SetNumberingType(SVX_NUM_NUMBER_NONE); + // SVX_NUM_NUMBER_NONE with the default SvxNumberFormat::LISTTAB would lead to an + // unexpected leading tab for the DocumentSettingId::NO_NUMBERING_SHOW_FOLLOWBY case. + pFormat->SetLabelFollowedBy(SvxNumberFormat::NOTHING); pFormat->SetIncludeUpperLevels( MAXLEVEL ); pFormat->SetStart( 1 ); pFormat->SetPositionAndSpaceMode( SvxNumberFormat::LABEL_ALIGNMENT ); diff --git a/sw/source/ui/misc/outline.cxx b/sw/source/ui/misc/outline.cxx index c3a92f33131d..c141b1796f3a 100644 --- a/sw/source/ui/misc/outline.cxx +++ b/sw/source/ui/misc/outline.cxx @@ -622,7 +622,15 @@ IMPL_LINK_NOARG(SwOutlineSettingsTabPage, NumberSelect, weld::ComboBox&, void) if(m_nActLevel & nMask) { SwNumFormat aNumFormat(m_pNumRule->Get(i)); + SvxNumType nOldNumberType = aNumFormat.GetNumberingType(); aNumFormat.SetNumberingType(nNumberType); + if (nOldNumberType == SVX_NUM_NUMBER_NONE && nNumberType != SVX_NUM_NUMBER_NONE + && aNumFormat.GetLabelFollowedBy() == SvxNumberFormat::NOTHING) + { + // Transitioning from "no" numbering, also set the followed by setting to the + // default from "empty". + aNumFormat.SetLabelFollowedBy(SvxNumberFormat::LISTTAB); + } // ensure that HasListFormat aNumFormat.SetListFormat(aNumFormat.GetPrefix(), aNumFormat.GetSuffix(), i); m_pNumRule->Set(i, aNumFormat); commit 18cba6d062a7a5da53ca10954542f3aab60b41da Author: Andras Timar <[email protected]> AuthorDate: Mon Dec 15 16:29:15 2025 +0100 Commit: Andras Timar <[email protected]> CommitDate: Sat Dec 20 11:01:11 2025 +0100 [cp] unification of Collabora Office app configs Change-Id: I9576a5d64588d983598e99bf276400bcacb175b2 Reviewed-on: https://gerrit.libreoffice.org/c/core/+/195676 Reviewed-by: Miklos Vajna <[email protected]> Tested-by: Jenkins CollaboraOffice <[email protected]> diff --git a/distro-configs/CODAWindows.conf b/distro-configs/CODAWindows.conf index 83ccaf9524f0..82f864365b6e 100644 --- a/distro-configs/CODAWindows.conf +++ b/distro-configs/CODAWindows.conf @@ -1,48 +1,64 @@ -# Collabora Online Desktop app for Windows +# Config for Collabora Office app for Windows # Build environment ---with-visual-studio=2022 --enable-python=fully-internal ---without-lxml ---without-export-validation --disable-ccache --disable-pch ---without-doxygen ---without-java +--enable-mergelibs +--enable-release-build --enable-symbols +--with-visual-studio=2022 +--with-buildconfig-recorded +--without-lxml -# Branding (unused, but...) +# Branding --disable-community-flavor --with-branding=icon-themes/galaxy/brand_cp +--with-vendor=Collabora -# Features ---disable-breakpad ---disable-firebird-sdbc ---disable-online-update ---without-helppack-integration +# MPLv2 subset +--disable-gpgmepp +--disable-lotuswordpro +--disable-lpsolve +--disable-mariadb-sdbc +--disable-poppler +--disable-postgresql-sdbc +--with-theme=colibre colibre_svg + +# No Java +--without-java +--without-junit +--disable-ext-nlpsolver +--disable-ext-wiki-publisher +--disable-report-builder +--disable-scripting-beanshell +--disable-scripting-javascript + +# LOKit – tiled rendering --disable-avmedia ---disable-odk +--disable-opengl --disable-skia ---disable-cli ---with-myspell-dicts +--enable-cairo-rgba --enable-headless ---enable-mergelibs + +# Misc features +--disable-breakpad +--disable-cli +--disable-firebird-sdbc +--disable-librelogo +--disable-odk +--disable-online-update --disable-opencl ---disable-opengl +--disable-sal-log +--disable-sdremote +--disable-sdremote-bluetooth +--with-lang=ar ca cs cy da de el en-US en-GB es eu fi fr ga gl he hr hu hy id is it ja kk ko nl pl pt pt-BR ro ru sk sl sq sv tr uk zh-CN zh-TW +--with-myspell-dicts --without-galleries ---disable-librelogo +--without-help --without-templates # Sensible font bundling settings for desktop --with-fonts --with-docrepair-fonts --disable-noto-font - -# MPLv2 subset ---with-theme=colibre ---disable-mariadb-sdbc ---disable-postgresql-sdbc ---disable-lotuswordpro ---disable-lpsolve ---disable-poppler ---disable-gpgmepp diff --git a/distro-configs/CPLinuxQtFlatpak.conf b/distro-configs/CPLinuxQtFlatpak.conf index 44edd889e5f2..1bc1d11ee3c7 100644 --- a/distro-configs/CPLinuxQtFlatpak.conf +++ b/distro-configs/CPLinuxQtFlatpak.conf @@ -6,7 +6,7 @@ --enable-release-build --enable-symbols --with-linker-hash-style=both ---without-buildconfig-recorded +--with-buildconfig-recorded --without-lxml # Branding @@ -34,6 +34,7 @@ --disable-scripting-javascript # LOKit – tiled rendering +--disable-avmedia --disable-dbus --disable-dconf --disable-gio @@ -41,10 +42,14 @@ --disable-gtk3 --disable-gui --disable-kf5 +--disable-opengl --disable-qt5 --disable-randr +--disable-skia +--enable-cairo-rgba # Misc features +--disable-breakpad --disable-epm --disable-evolution2 --disable-firebird-sdbc @@ -55,8 +60,8 @@ --disable-sdremote --disable-sdremote-bluetooth --enable-extension-integration ---with-galleries=no --with-lang=ar ca cs cy da de el en-US en-GB es eu fi fr ga gl he hr hu hy id is it ja kk ko nl pl pt pt-BR ro ru sk sl sq sv tr uk zh-CN zh-TW +--without-galleries --without-help --without-templates @@ -88,7 +93,6 @@ --with-system-zlib # org.kde.Platform has cairo, but we use a patched one ---enable-cairo-rgba --without-system-cairo # 3rd party libs that org.kde.Platform does not have diff --git a/distro-configs/CPMacOS-LOKit.conf b/distro-configs/CPMacOS-LOKit.conf index 36845ebf565d..66e3c709abc0 100644 --- a/distro-configs/CPMacOS-LOKit.conf +++ b/distro-configs/CPMacOS-LOKit.conf @@ -1,44 +1,64 @@ -INCLUDE:CPLinux-LOKit +# Config for Collabora Office app for macOS -# LOKit needs to be able to run in the sandbox ---enable-macosx-sandbox - -# disable Linux stuff that we don't need ---disable-epm +# Build environment --disable-python ---without-package-format ---enable-gui ---without-system-dicts +--enable-macosx-sandbox +--enable-mergelibs +--enable-release-build +--with-buildconfig-recorded +--without-lxml -# Sensible font bundling settings for desktop ---with-fonts ---with-docrepair-fonts ---disable-noto-font +# Branding +--disable-community-flavor +--with-branding=icon-themes/galaxy/brand_cp +--with-vendor=Collabora -# from LibreOfficeiOS (copied only, to avoid the --host setting) ---disable-breakpad ---disable-firebird-sdbc ---disable-online-update +# MPLv2 subset +--enable-mpl-subset +--disable-gpgmepp +--disable-lotuswordpro +--disable-lpsolve +--disable-mariadb-sdbc +--disable-poppler +--disable-postgresql-sdbc +--with-theme=colibre colibre_svg ---without-export-validation ---without-helppack-integration +# No Java --without-java --without-junit +--disable-ext-nlpsolver +--disable-ext-wiki-publisher +--disable-report-builder +--disable-scripting-beanshell +--disable-scripting-javascript ---with-theme=colibre - ---with-build-platform-configure-options=--with-system-jpeg=no - ---disable-avahi +# LOKit – tiled rendering --disable-avmedia ---disable-compiler-plugins ---disable-cups ---disable-dconf ---disable-kf5 +--disable-opengl +--disable-skia +--enable-cairo-rgba +--enable-headless +--without-system-fontconfig +--without-system-freetype + +# Misc features +--disable-breakpad +--disable-cli +--disable-firebird-sdbc +--disable-librelogo --disable-odk +--disable-online-update --disable-openssl ---disable-poppler ---disable-python ---disable-skia +--disable-sal-log +--disable-sdremote +--disable-sdremote-bluetooth +--with-lang=ar ca cs cy da de el en-US en-GB es eu fi fr ga gl he hr hu hy id is it ja kk ko nl pl pt pt-BR ro ru sk sl sq sv tr uk zh-CN zh-TW +--with-myspell-dicts +--without-galleries +--without-help +--without-templates ---enable-headless +# Sensible font bundling settings for desktop +--with-fonts +--with-docrepair-fonts +--disable-noto-font commit 5431d8953a179a16a7aece03aae8ec807f15c320 Author: Andras Timar <[email protected]> AuthorDate: Mon Dec 15 14:47:38 2025 +0100 Commit: Andras Timar <[email protected]> CommitDate: Sat Dec 20 11:01:11 2025 +0100 [cp] Build Collabora Office apps without templates These templates are not used, therefore it is unnecessary to ship them. Change-Id: Ic0fc3007d5b214978eba4e575209f90af7b5bd9b Reviewed-on: https://gerrit.libreoffice.org/c/core/+/195668 Tested-by: Jenkins CollaboraOffice <[email protected]> Reviewed-by: Miklos Vajna <[email protected]> diff --git a/distro-configs/CODAWindows.conf b/distro-configs/CODAWindows.conf index 1dfe3d4337fa..83ccaf9524f0 100644 --- a/distro-configs/CODAWindows.conf +++ b/distro-configs/CODAWindows.conf @@ -31,6 +31,7 @@ --disable-opengl --without-galleries --disable-librelogo +--without-templates # Sensible font bundling settings for desktop --with-fonts diff --git a/distro-configs/CPLinuxQtFlatpak.conf b/distro-configs/CPLinuxQtFlatpak.conf index 427c606830cd..44edd889e5f2 100644 --- a/distro-configs/CPLinuxQtFlatpak.conf +++ b/distro-configs/CPLinuxQtFlatpak.conf @@ -58,6 +58,7 @@ --with-galleries=no --with-lang=ar ca cs cy da de el en-US en-GB es eu fi fr ga gl he hr hu hy id is it ja kk ko nl pl pt pt-BR ro ru sk sl sq sv tr uk zh-CN zh-TW --without-help +--without-templates # Sensible font bundling settings for desktop --with-fonts diff --git a/distro-configs/CPMacOS-LOKit.conf b/distro-configs/CPMacOS-LOKit.conf index bea3292fab29..36845ebf565d 100644 --- a/distro-configs/CPMacOS-LOKit.conf +++ b/distro-configs/CPMacOS-LOKit.conf @@ -9,7 +9,6 @@ INCLUDE:CPLinux-LOKit --without-package-format --enable-gui --without-system-dicts ---with-templates # Sensible font bundling settings for desktop --with-fonts commit 47f7ea333c47467e74f5228002be48200bc64441 Author: Andras Timar <[email protected]> AuthorDate: Mon Dec 15 18:53:11 2025 +0100 Commit: Andras Timar <[email protected]> CommitDate: Sat Dec 20 11:01:11 2025 +0100 typo 'ENBALE', but we don't use them anyway Change-Id: Icec2cafd8fc55817cc131c3f963bcb8cda81c872 Reviewed-on: https://gerrit.libreoffice.org/c/core/+/195681 Tested-by: Jenkins CollaboraOffice <[email protected]> Reviewed-by: Michael Stahl <[email protected]> diff --git a/configure.ac b/configure.ac index d88f4af0d4fc..17fb7895cc48 100644 --- a/configure.ac +++ b/configure.ac @@ -1271,8 +1271,6 @@ if test "$using_freetype_fontconfig" = yes; then # We build them, don't do any pkg-config checks test_fontconfig=no test_freetype=no - ENBALE_FONTCONFIG=TRUE - ENBALE_FREETYPE=TRUE BUILD_TYPE="$BUILD_TYPE FONTCONFIG FREETYPE" fi else commit ade08b1e91b8ab6cb55defaf05678c100abd91d9 Author: Karthik Godha <[email protected]> AuthorDate: Wed Dec 10 21:39:49 2025 +0530 Commit: Andras Timar <[email protected]> CommitDate: Sat Dec 20 11:01:11 2025 +0100 tdf#169924: ODP -> PPTX export invalid animations When exporting animations in a slide, animations attached to shapes which are not in the slide are also being exported. Change-Id: I2dbc5cd5755ce6656a9fc2efa453c5837ffeaa6a Reviewed-on: https://gerrit.libreoffice.org/c/core/+/195391 Reviewed-by: Michael Stahl <[email protected]> Tested-by: Jenkins CollaboraOffice <[email protected]> diff --git a/sd/source/filter/eppt/pptx-animations-nodectx.cxx b/sd/source/filter/eppt/pptx-animations-nodectx.cxx index af843d661b69..1fc049b6e42f 100644 --- a/sd/source/filter/eppt/pptx-animations-nodectx.cxx +++ b/sd/source/filter/eppt/pptx-animations-nodectx.cxx @@ -83,10 +83,12 @@ bool initCondList(const Any& rAny, std::vector<Cond>& rList, bool bIsMainSeqChil } } -NodeContext::NodeContext(const Reference<XAnimationNode>& xNode, PowerPointExport& rExport, - bool bMainSeqChild, bool bIsIterateChild) +NodeContext::NodeContext(const Reference<XAnimationNode>& xNode, + const std::unordered_set<sal_Int32>& rSlideShapeIDs, + PowerPointExport& rExport, bool bMainSeqChild, bool bIsIterateChild) : mxNode(xNode) , mbValid(true) + , mrSlideShapeIDs(rSlideShapeIDs) , mrPowerPointExport(rExport) , mbOnSubTnLst(false) , mnEffectNodeType(-1) @@ -111,7 +113,7 @@ bool NodeContext::isValidTarget(const Any& rTarget) Reference<XShape> xShape; if ((rTarget >>= xShape) && drawingml::ShapeExport::IsShapeTypeKnown(xShape) - && (mrPowerPointExport.GetShapeID(xShape) != -1)) + && (mrSlideShapeIDs.find(mrPowerPointExport.GetShapeID(xShape)) != mrSlideShapeIDs.end())) return true; ParagraphTarget aParagraphTarget; @@ -211,8 +213,9 @@ bool NodeContext::initChildNodes() Reference<XAnimationNode> xChildNode(xEnumeration->nextElement(), UNO_QUERY); if (xChildNode.is()) { - auto pChildContext = std::make_unique<NodeContext>( - xChildNode, mrPowerPointExport, bIsMainSeq, bIsIterateChild); + auto pChildContext = std::make_unique<NodeContext>(xChildNode, mrSlideShapeIDs, + mrPowerPointExport, + bIsMainSeq, bIsIterateChild); if (pChildContext->isValid()) bValid = true; maChildNodes.push_back(std::move(pChildContext)); diff --git a/sd/source/filter/eppt/pptx-animations-nodectx.hxx b/sd/source/filter/eppt/pptx-animations-nodectx.hxx index 1830845ea5da..865c23715b60 100644 --- a/sd/source/filter/eppt/pptx-animations-nodectx.hxx +++ b/sd/source/filter/eppt/pptx-animations-nodectx.hxx @@ -10,6 +10,7 @@ #include <com/sun/star/uno/Reference.hxx> #include <com/sun/star/animations/XAnimationNode.hpp> +#include <unordered_set> #include <vector> #include "epptooxml.hxx" #include "pptx-animations-cond.hxx" @@ -30,6 +31,7 @@ class NodeContext // if the node has valid target or contains at least one valid target. bool mbValid; // Required to check if the associated shape is present in export or not + const std::unordered_set<sal_Int32>& mrSlideShapeIDs; PowerPointExport& mrPowerPointExport; // if the node should be on SubTnLst or ChildTnLst @@ -55,7 +57,8 @@ class NodeContext public: NodeContext(const css::uno::Reference<css::animations::XAnimationNode>& xNode, - PowerPointExport& rExport, bool bMainSeqChild, bool bIsIterateChild); + const std::unordered_set<sal_Int32>& rSlideShapeIDs, PowerPointExport& rExport, + bool bMainSeqChild, bool bIsIterateChild); const css::uno::Reference<css::animations::XAnimationNode>& getNode() const { return mxNode; } sal_Int16 getEffectNodeType() const { return mnEffectNodeType; } sal_Int16 getEffectPresetClass() const { return mnEffectPresetClass; } diff --git a/sd/source/filter/eppt/pptx-animations.cxx b/sd/source/filter/eppt/pptx-animations.cxx index bbae2b29682c..edb068dbc942 100644 --- a/sd/source/filter/eppt/pptx-animations.cxx +++ b/sd/source/filter/eppt/pptx-animations.cxx @@ -25,6 +25,7 @@ #include <sal/log.hxx> #include <rtl/math.hxx> #include <comphelper/sequenceashashmap.hxx> +#include <unordered_set> #include <com/sun/star/animations/AnimationAdditiveMode.hpp> #include <com/sun/star/animations/AnimationCalcMode.hpp> @@ -53,6 +54,7 @@ #include <com/sun/star/presentation/TextAnimationType.hpp> #include <com/sun/star/text/XSimpleText.hpp> #include <com/sun/star/drawing/XShape.hpp> +#include <com/sun/star/drawing/XShapes.hpp> #include <com/sun/star/beans/XPropertySet.hpp> #include <oox/export/utils.hxx> #include <oox/ppt/pptfilterhelpers.hxx> @@ -76,6 +78,7 @@ using namespace oox; using ::com::sun::star::beans::NamedValue; using ::com::sun::star::drawing::XDrawPage; using ::com::sun::star::drawing::XShape; +using ::com::sun::star::drawing::XShapes; using ::com::sun::star::text::XSimpleText; using ::sax_fastparser::FSHelperPtr; @@ -1244,7 +1247,23 @@ void PPTXAnimationExport::WriteAnimations(const Reference<XDrawPage>& rXDrawPage if (!(xEnumeration.is() && xEnumeration->hasMoreElements())) return; - auto pNodeContext = std::make_unique<NodeContext>(xNode, mrPowerPointExport, false, false); + Reference<XShapes> xShapes = rXDrawPage; + sal_uInt32 nShapes = xShapes->getCount(); + std::unordered_set<sal_Int32> aSlideShapeIDs; + if (xShapes.is()) + { + for (sal_uInt32 i = 0; i < nShapes; i++) + { + Reference<XShape> xShape; + xShapes->getByIndex(i) >>= xShape; + sal_Int32 nId = mrPowerPointExport.GetShapeID(xShape); + if (nId != -1) + aSlideShapeIDs.insert(nId); + } + } + + auto pNodeContext + = std::make_unique<NodeContext>(xNode, aSlideShapeIDs, mrPowerPointExport, false, false); if (pNodeContext->isValid()) { mpFS->startElementNS(XML_p, XML_timing); commit e8eadb250be26c263ca466f689f13e9a39fce58f Author: Karthik Godha <[email protected]> AuthorDate: Tue Dec 9 20:05:53 2025 +0530 Commit: Andras Timar <[email protected]> CommitDate: Sat Dec 20 11:01:11 2025 +0100 tdf#169911: ODP -> PPTX export invalid animations Empty/invalid OLE objects are skipped PPTX export, but animations attached to these OLE objects are exported. Add the slide itself as target for these animations Change-Id: I1e594d607cc37f58c0e56357f8f8d42d9139bec8 Reviewed-on: https://gerrit.libreoffice.org/c/core/+/195306 Tested-by: Jenkins CollaboraOffice <[email protected]> Reviewed-by: Michael Stahl <[email protected]> diff --git a/sd/source/filter/eppt/pptx-animations-nodectx.cxx b/sd/source/filter/eppt/pptx-animations-nodectx.cxx index 07c8bd618f78..af843d661b69 100644 --- a/sd/source/filter/eppt/pptx-animations-nodectx.cxx +++ b/sd/source/filter/eppt/pptx-animations-nodectx.cxx @@ -40,18 +40,6 @@ namespace oox::core { namespace { -bool isValidTarget(const Any& rTarget) -{ - Reference<XShape> xShape; - - if ((rTarget >>= xShape) && drawingml::ShapeExport::IsShapeTypeKnown(xShape)) - return true; - - ParagraphTarget aParagraphTarget; - - return (rTarget >>= aParagraphTarget) && aParagraphTarget.Shape.is(); -} - bool IsAudioURL(std::u16string_view rURL) { return o3tl::endsWithIgnoreAsciiCase(rURL, ".wav") @@ -95,10 +83,11 @@ bool initCondList(const Any& rAny, std::vector<Cond>& rList, bool bIsMainSeqChil } } -NodeContext::NodeContext(const Reference<XAnimationNode>& xNode, bool bMainSeqChild, - bool bIsIterateChild) +NodeContext::NodeContext(const Reference<XAnimationNode>& xNode, PowerPointExport& rExport, + bool bMainSeqChild, bool bIsIterateChild) : mxNode(xNode) , mbValid(true) + , mrPowerPointExport(rExport) , mbOnSubTnLst(false) , mnEffectNodeType(-1) , mnEffectPresetClass(css::presentation::EffectPresetClass::CUSTOM) @@ -117,6 +106,19 @@ NodeContext::NodeContext(const Reference<XAnimationNode>& xNode, bool bMainSeqCh initCondList(getNodeForCondition()->getEnd(), maEndCondList, bMainSeqChild); } +bool NodeContext::isValidTarget(const Any& rTarget) +{ + Reference<XShape> xShape; + + if ((rTarget >>= xShape) && drawingml::ShapeExport::IsShapeTypeKnown(xShape) + && (mrPowerPointExport.GetShapeID(xShape) != -1)) + return true; + + ParagraphTarget aParagraphTarget; + + return (rTarget >>= aParagraphTarget) && aParagraphTarget.Shape.is(); +} + void NodeContext::initUserData() { assert(mxNode.is()); @@ -209,8 +211,8 @@ bool NodeContext::initChildNodes() Reference<XAnimationNode> xChildNode(xEnumeration->nextElement(), UNO_QUERY); if (xChildNode.is()) { - auto pChildContext - = std::make_unique<NodeContext>(xChildNode, bIsMainSeq, bIsIterateChild); + auto pChildContext = std::make_unique<NodeContext>( + xChildNode, mrPowerPointExport, bIsMainSeq, bIsIterateChild); if (pChildContext->isValid()) bValid = true; maChildNodes.push_back(std::move(pChildContext)); diff --git a/sd/source/filter/eppt/pptx-animations-nodectx.hxx b/sd/source/filter/eppt/pptx-animations-nodectx.hxx index c25991a85a23..1830845ea5da 100644 --- a/sd/source/filter/eppt/pptx-animations-nodectx.hxx +++ b/sd/source/filter/eppt/pptx-animations-nodectx.hxx @@ -11,6 +11,7 @@ #include <com/sun/star/uno/Reference.hxx> #include <com/sun/star/animations/XAnimationNode.hpp> #include <vector> +#include "epptooxml.hxx" #include "pptx-animations-cond.hxx" namespace oox::core @@ -28,6 +29,8 @@ class NodeContext std::vector<Cond> maEndCondList; // if the node has valid target or contains at least one valid target. bool mbValid; + // Required to check if the associated shape is present in export or not + PowerPointExport& mrPowerPointExport; // if the node should be on SubTnLst or ChildTnLst bool mbOnSubTnLst; @@ -38,6 +41,8 @@ class NodeContext OUString msEffectPresetId; OUString msEffectPresetSubType; + bool isValidTarget(const css::uno::Any& rTarget); + /// constructor helper for initializing user data. void initUserData(); @@ -50,7 +55,7 @@ class NodeContext public: NodeContext(const css::uno::Reference<css::animations::XAnimationNode>& xNode, - bool bMainSeqChild, bool bIsIterateChild); + PowerPointExport& rExport, bool bMainSeqChild, bool bIsIterateChild); const css::uno::Reference<css::animations::XAnimationNode>& getNode() const { return mxNode; } sal_Int16 getEffectNodeType() const { return mnEffectNodeType; } sal_Int16 getEffectPresetClass() const { return mnEffectPresetClass; } diff --git a/sd/source/filter/eppt/pptx-animations.cxx b/sd/source/filter/eppt/pptx-animations.cxx index 43f28433465b..bbae2b29682c 100644 --- a/sd/source/filter/eppt/pptx-animations.cxx +++ b/sd/source/filter/eppt/pptx-animations.cxx @@ -1244,7 +1244,7 @@ void PPTXAnimationExport::WriteAnimations(const Reference<XDrawPage>& rXDrawPage if (!(xEnumeration.is() && xEnumeration->hasMoreElements())) return; - auto pNodeContext = std::make_unique<NodeContext>(xNode, false, false); + auto pNodeContext = std::make_unique<NodeContext>(xNode, mrPowerPointExport, false, false); if (pNodeContext->isValid()) { mpFS->startElementNS(XML_p, XML_timing); commit a814af6e7d5caef59612a8ac230eb90c0ed410c1 Author: Gülşah Köse <[email protected]> AuthorDate: Fri Dec 12 16:32:33 2025 +0300 Commit: Andras Timar <[email protected]> CommitDate: Sat Dec 20 11:01:11 2025 +0100 tdf#169456 Fix the placeholder of master slide style issue In some cases we see the object in the slide has no fill syle directly but parent object in master slide can has fill style. We should apply the style to object in this case. Signed-off-by: Gülşah Köse <[email protected]> Change-Id: I0b061cfde4ac2067c84383764770f155564531a3 Reviewed-on: https://gerrit.libreoffice.org/c/core/+/195368 Reviewed-by: Caolán McNamara <[email protected]> Tested-by: Jenkins CollaboraOffice <[email protected]> Tested-by: Caolán McNamara <[email protected]> diff --git a/oox/source/drawingml/shape.cxx b/oox/source/drawingml/shape.cxx index afc9f603dfe6..59f86ec73732 100644 --- a/oox/source/drawingml/shape.cxx +++ b/oox/source/drawingml/shape.cxx @@ -1642,7 +1642,8 @@ Reference< XShape > const & Shape::createAndInsert( } FillProperties aFillProperties = getActualFillProperties(pTheme, &rShapeOrParentShapeFillProps); - if (getFillProperties().moFillType.has_value() && getFillProperties().moFillType.value() == XML_grpFill) + if ((getFillProperties().moFillType.has_value() && getFillProperties().moFillType.value() == XML_grpFill) || + aFillProperties.maFillColor.isPlaceHolder() ) getFillProperties().assignUsed(aFillProperties); if(!bIsCroppedGraphic && !bIs3DGraphic) aFillProperties.pushToPropMap(aShapeProps, rGraphicHelper, mnRotation, nFillPhClr,
