Rebased ref, commits from common ancestor:
commit d666825734e19ea6413e404fc511288d847ffdf3
Author: Noel Grandin <[email protected]>
AuthorDate: Wed Jan 14 13:23:43 2026 +0200
Commit: Andras Timar <[email protected]>
CommitDate: Sat Jan 17 15:31:07 2026 +0100
officeotron: duplicate w:framePr under w:pPr
we have duplicate data here
<w:pPr>
<w:pStyle w:val="Normal"/>
<w:framePr w:hRule="exact" w:h="23" ...
<w:framePr w:w="9923" w:h="910" w:y="568" ...
Seems like the w:framePr has more useful info, so suppress the first
framePr in this case.
Change-Id: I7dfd7ced352b773c63a31e04f9ab0cdc82743942
Reviewed-on: https://gerrit.libreoffice.org/c/core/+/197287
Tested-by: Jenkins
Reviewed-by: Michael Stahl <[email protected]>
(cherry picked from commit fca86a116dcc5c6e309a66dd47809b05ec0d2c89)
Reviewed-on: https://gerrit.libreoffice.org/c/core/+/197419
Tested-by: Jenkins CollaboraOffice <[email protected]>
diff --git a/sw/source/filter/ww8/docxattributeoutput.cxx
b/sw/source/filter/ww8/docxattributeoutput.cxx
index e0c2256744e4..91f75cc6ff49 100644
--- a/sw/source/filter/ww8/docxattributeoutput.cxx
+++ b/sw/source/filter/ww8/docxattributeoutput.cxx
@@ -1630,17 +1630,23 @@ void DocxAttributeOutput::EndParagraphProperties(const
SfxItemSet& rParagraphMar
WriteCollectedParagraphProperties();
Redline( pRedlineData );
- WriteCollectedParagraphProperties();
-
- // Write w:framePr
if (!m_bWritingHeaderFooter && m_aFramePr.Frame())
{
+ // write the collected paragraph properties __without__ the <framePr>
element
+ m_rExport.SdrExporter().getFlyAttrList().clear();
+ WriteCollectedParagraphProperties();
+
+ // Write w:framePr
const SwFrameFormat& rFrameFormat =
m_aFramePr.Frame()->GetFrameFormat();
assert(SwTextBoxHelper::TextBoxIsFramePr(rFrameFormat) && "by
definition, because Frame()");
const Size aSize = m_aFramePr.Frame()->GetSize();
PopulateFrameProperties(&rFrameFormat, aSize);
}
+ else
+ {
+ WriteCollectedParagraphProperties();
+ }
// Write 'Paragraph Mark' properties
m_pSerializer->startElementNS(XML_w, XML_rPr);
commit 949b49377ef6caee7ce099268c0c6ca9e7f4c718
Author: [email protected] <[email protected]>
AuthorDate: Sat Jan 10 18:14:30 2026 -0500
Commit: Andras Timar <[email protected]>
CommitDate: Sat Jan 17 15:31:07 2026 +0100
tdf#166335 oox export: don't export invalid gluepoint fmla
We started exporting gluepoints with 25.2.2
commit/86d36ee56521438069504fbacff8dc2aff3a1afc
"tdf165262 PPTX export: fix shape export regression"
and some of them were not in valid OOXML format.
In this case, we were exporting an empty
fmla=""
which is seen as a corrupt document by MS Office.
make CppunitTest_sd_export_tests-ooxml3 \
CPPUNIT_TEST_NAME=testTdf135843
make CppunitTest_sw_ooxmlexport13 CPPUNIT_TEST_NAME=testTdf123435
Change-Id: I4297d24b8e884199b8da0253ab855417b828aa75
Reviewed-on: https://gerrit.libreoffice.org/c/core/+/197003
Reviewed-by: Justin Luth <[email protected]>
Tested-by: Jenkins
Reviewed-on: https://gerrit.libreoffice.org/c/core/+/197365
Reviewed-by: Miklos Vajna <[email protected]>
Tested-by: Jenkins CollaboraOffice <[email protected]>
diff --git a/oox/source/export/drawingml.cxx b/oox/source/export/drawingml.cxx
index 6dfb8357c6aa..46d3036a19e1 100644
--- a/oox/source/export/drawingml.cxx
+++ b/oox/source/export/drawingml.cxx
@@ -4929,23 +4929,49 @@ bool IsValidOOXMLFormula(std::u16string_view sFormula)
return false;
}
-OUString GetFormula(const OUString& sEquation, const OUString& sReplace, const
OUString& sNewStr)
+OUString GetFormula(const OUString& sEquation)
{
+ assert(!sEquation.isEmpty() && "surely an equation would never be
empty...");
+ // TODO: This needs to be completely re-written. It is extremely
simplistic/minimal.
+ // What is needed here is the reverse of convertToOOEquation.
+
// If the equation is numerical
sal_Int64 nValue = sEquation.toInt64();
- if (!sEquation.isEmpty() && OUString::number(nValue) == sEquation)
+ if (OUString::number(nValue) == sEquation)
return "val " + sEquation;
OUString sFormula = sEquation;
- size_t nPos = sFormula.indexOf(sReplace);
- if (nPos != std::string::npos)
+
+ /* replace LO native placeholders with OOXML placeholders
+ * #1: e.g. 'logwidth'
+ * #2: e.g. 'logwidth/2'
+ * #3: e.g. '1234*logwidth/5678'
+ */
+
+ if (sEquation == "logwidth") // #1
+ return "val w";
+ if (sEquation == "logheight")
+ return "val h";
+ if (sEquation.startsWith("logwidth/")) // #2
+ sFormula = u"*/ 1 w "_ustr + sEquation.subView(9);
+ else if (sEquation.startsWith("logheight/"))
+ sFormula = u"*/ 1 h "_ustr + sEquation.subView(10);
+ else
{
- OUString sModifiedEquation = sFormula.replaceAt(nPos,
sReplace.getLength(), sNewStr);
- sFormula = "*/ " + sModifiedEquation;
+ size_t nPos = sFormula.indexOf("*logwidth/"); //#3
+ if (nPos != std::string::npos)
+ sFormula = "*/ " + sFormula.replaceAt(nPos, 10, " w ");
+ else
+ {
+ nPos = sFormula.indexOf("*logheight/");
+ if (nPos != std::string::npos)
+ sFormula = "*/ " + sFormula.replaceAt(nPos, 11, " h ");
+ }
}
if (IsValidOOXMLFormula(sFormula))
return sFormula;
+ else SAL_WARN("oox.shape","invalid OOXML formula["<<sFormula<<"]");
return OUString();
}
@@ -4953,44 +4979,60 @@ OUString GetFormula(const OUString& sEquation, const
OUString& sReplace, const O
void prepareGluePoints(std::vector<Guide>& rGuideList,
const css::uno::Sequence<OUString>& aEquations,
const
uno::Sequence<drawing::EnhancedCustomShapeParameterPair>& rGluePoints,
- const bool bIsOOXML, const sal_Int32 nWidth, const
sal_Int32 nHeight)
+ const bool /*bIsOOXML*/, const sal_Int32 nWidth, const
sal_Int32 nHeight)
{
if (rGluePoints.hasElements())
{
- sal_Int32 nIndex = 1;
+ sal_Int32 nIndex = 0;
for (auto const& rGluePoint : rGluePoints)
{
+ ++nIndex;
sal_Int32 nIdx1 = -1;
sal_Int32 nIdx2 = -1;
- rGluePoint.First.Value >>= nIdx1;
- rGluePoint.Second.Value >>= nIdx2;
-
- if (nIdx1 != -1 && nIdx2 != -1)
+ bool bValidIdx1 = false;
+ bool bValidIdx2 = false;
+ if (rGluePoint.First.Value >>= nIdx1)
{
- Guide aGuideX;
- aGuideX.sName = "GluePoint"_ostr + OString::number(nIndex) +
"X";
-
- 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";
+ bValidIdx1 = rGluePoint.First.Type ==
EnhancedCustomShapeParameterType::EQUATION;
+ // I would assume that any EQUATION must define a valid index
value.
+ assert(!bValidIdx1 || (nIdx1 >= 0 && nIdx1 <
aEquations.getLength()));
+ }
+ else
+ continue;
- 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);
+ if (rGluePoint.Second.Value >>= nIdx2)
+ {
+ bValidIdx2 = rGluePoint.Second.Type ==
EnhancedCustomShapeParameterType::EQUATION;
+ assert(!bValidIdx2 || (nIdx2 >= 0 && nIdx2 <
aEquations.getLength()));
+ }
+ else
+ continue;
- rGuideList.push_back(aGuideY);
+ Guide aGuideX;
+ Guide aGuideY;
+ if (bValidIdx1)
+ {
+ aGuideX.sFormula = GetFormula(aEquations[nIdx1]).toUtf8();
+ if (aGuideX.sFormula.isEmpty()) // !IsValidOOXMLFormula
+ continue;
}
+ else
+ aGuideX.sFormula = "*/ " + OString::number(nIdx1) + " w " +
OString::number(nWidth);
+ if (bValidIdx2)
+ {
+ aGuideY.sFormula = GetFormula(aEquations[nIdx2]).toUtf8();
+ if (aGuideY.sFormula.isEmpty()) // !IsValidOOXMLFormula
+ continue;
+ }
+ else
+ aGuideY.sFormula
+ = "*/ " + OString::number(nIdx2) + " h " +
OString::number(nHeight);
+
+ aGuideX.sName = "GluePoint"_ostr + OString::number(nIndex) + "X";
+ rGuideList.push_back(aGuideX);
- nIndex++;
+ aGuideY.sName = "GluePoint"_ostr + OString::number(nIndex) + "Y";
+ rGuideList.push_back(aGuideY);
}
}
}
@@ -5184,6 +5226,7 @@ bool DrawingML::WriteCustomGeometry(
mpFS->startElementNS(XML_a, XML_gdLst);
for (auto const& elem : aGuideList)
{
+ assert(IsValidOOXMLFormula(OUString::fromUtf8(elem.sFormula)));
mpFS->singleElementNS(XML_a, XML_gd, XML_name, elem.sName,
XML_fmla, elem.sFormula);
}
mpFS->endElementNS(XML_a, XML_gdLst);
diff --git a/sd/qa/unit/export-tests-ooxml3.cxx
b/sd/qa/unit/export-tests-ooxml3.cxx
index 078170d80ae9..aa53f64cb97a 100644
--- a/sd/qa/unit/export-tests-ooxml3.cxx
+++ b/sd/qa/unit/export-tests-ooxml3.cxx
@@ -1071,6 +1071,13 @@ CPPUNIT_TEST_FIXTURE(SdOOXMLExportTest3, testTdf135843)
assertXPath(pXmlDoc, sPathStart +
"/a:tr[3]/a:tc[1]/a:tcPr/a:lnR/a:solidFill");
assertXPath(pXmlDoc, sPathStart +
"/a:tr[3]/a:tc[1]/a:tcPr/a:lnT/a:solidFill");
assertXPath(pXmlDoc, sPathStart +
"/a:tr[3]/a:tc[1]/a:tcPr/a:lnB/a:solidFill");
+
+ // tdf#166335: fmla must not be an empty string
+ static constexpr OString
sGlueStart("/p:sld/p:cSld/p:spTree/p:sp[3]/p:spPr/a:custGeom"_ostr);
+ assertXPath(pXmlDoc, sGlueStart + "/a:gdLst/a:gd[@name='GluePoint2X']",
"fmla", u"val w");
+ assertXPath(pXmlDoc, sGlueStart + "/a:gdLst/a:gd[@name='GluePoint2Y']",
"fmla", u"*/ 1 h 2");
+ assertXPath(pXmlDoc, sGlueStart + "/a:gdLst/a:gd[@name='GluePoint3X']",
"fmla", u"*/ 1 w 2");
+ assertXPath(pXmlDoc, sGlueStart + "/a:gdLst/a:gd[@name='GluePoint3Y']",
"fmla", u"val h");
}
CPPUNIT_TEST_FIXTURE(SdOOXMLExportTest3, testNegativeTimeAnimateValue)
diff --git a/sw/qa/extras/ooxmlexport/ooxmlexport13.cxx
b/sw/qa/extras/ooxmlexport/ooxmlexport13.cxx
index 43c16d0c912d..75e6ae776e66 100644
--- a/sw/qa/extras/ooxmlexport/ooxmlexport13.cxx
+++ b/sw/qa/extras/ooxmlexport/ooxmlexport13.cxx
@@ -671,6 +671,12 @@ DECLARE_OOXMLEXPORT_TEST(testTdf123435, "tdf123435.docx")
// - Expected: 2
// - Actual : 1
CPPUNIT_ASSERT_EQUAL(2, getShapes());
+
+ // tdf#166335: fmla must not be an empty string
+ save(TestFilter::DOCX);
+ xmlDocUniquePtr pXmlDoc = parseExport(u"word/document.xml"_ustr);
+ // without the fix, this was 8. Having an a:gd fmla="" causes MSOffice to
report a corrupt doc.
+ assertXPath(pXmlDoc, "//a:gdLst/a:gd[@fmla='']", 0);
}
CPPUNIT_TEST_FIXTURE(Test, testTdf116371)
commit 22679c42b0e89b7c11f21f7ded7e83ea8868133a
Author: Mike Kaganski <[email protected]>
AuthorDate: Wed Jan 14 09:31:30 2026 +0100
Commit: Andras Timar <[email protected]>
CommitDate: Sat Jan 17 15:31:07 2026 +0100
Improve assertion for the problematic case
... after commit 2b089278f3732ea35b14cd4c577b6f496bfc0998
(sw: fix crash in the ModelToViewHelper ctor, 2026-01-06).
Change-Id: I4946363569fc847d8697df9b74be4c646fb6bd99
Reviewed-on: https://gerrit.libreoffice.org/c/core/+/197332
Reviewed-by: Miklos Vajna <[email protected]>
Tested-by: Jenkins CollaboraOffice <[email protected]>
diff --git a/sw/source/core/txtnode/modeltoviewhelper.cxx
b/sw/source/core/txtnode/modeltoviewhelper.cxx
index 2573d273e460..e88d09040a04 100644
--- a/sw/source/core/txtnode/modeltoviewhelper.cxx
+++ b/sw/source/core/txtnode/modeltoviewhelper.cxx
@@ -203,7 +203,7 @@ ModelToViewHelper::ModelToViewHelper(const SwTextNode
&rNode,
}
case CH_TXT_ATR_FIELDEND:
{
- assert(startedFields.back().first ==
rIDMA.getFieldmarkAt(SwPosition(rNode, i)));
+ assert(!startedFields.empty() &&
startedFields.back().first == rIDMA.getFieldmarkAt(SwPosition(rNode, i)));
if (!startedFields.empty())
{
startedFields.pop_back();
commit 4ac7c40b085603455523fe3931de3728dc447120
Author: Caolán McNamara <[email protected]>
AuthorDate: Thu Jan 15 16:14:28 2026 +0000
Commit: Andras Timar <[email protected]>
CommitDate: Sat Jan 17 15:31:07 2026 +0100
remove unneeded test file
Change-Id: Idd319ebc74d7468b5d55600d4dce0e7f73629449
Reviewed-on: https://gerrit.libreoffice.org/c/core/+/197371
Tested-by: Jenkins CollaboraOffice <[email protected]>
Reviewed-by: Caolán McNamara <[email protected]>
diff --git a/sd/qa/unit/tiledrendering/data/Type-in-draw.odg
b/sd/qa/unit/tiledrendering/data/Type-in-draw.odg
deleted file mode 100644
index afac468f1926..000000000000
Binary files a/sd/qa/unit/tiledrendering/data/Type-in-draw.odg and /dev/null
differ
commit b4b6a599dc51a692b6df7ef60915b55b3afbc635
Author: Parth Raiyani <[email protected]>
AuthorDate: Thu Jan 15 18:53:15 2026 +0530
Commit: Andras Timar <[email protected]>
CommitDate: Sat Jan 17 15:31:06 2026 +0100
accessibility: add accessible names to various drawing areas in UI files
Signed-off-by: Parth Raiyani <[email protected]>
Change-Id: Ibef8171634fb406cea708bd8709906f002d2f235
Reviewed-on: https://gerrit.libreoffice.org/c/core/+/197353
Tested-by: Caolán McNamara <[email protected]>
Reviewed-by: Caolán McNamara <[email protected]>
diff --git a/cui/uiconfig/ui/pageformatpage.ui
b/cui/uiconfig/ui/pageformatpage.ui
index 586079e669e9..a680f0c3b25d 100644
--- a/cui/uiconfig/ui/pageformatpage.ui
+++ b/cui/uiconfig/ui/pageformatpage.ui
@@ -220,6 +220,11 @@
<property name="halign">center</property>
<property name="valign">center</property>
<property name="vexpand">True</property>
+ <child internal-child="accessible">
+ <object class="AtkObject"
id="drawingareaPageDirection-atkobject">
+ <property name="AtkObject::accessible-name"
translatable="yes"
context="pageformatpage|drawingareaPageDirection-atkobject">Page
Direction</property>
+ </object>
+ </child>
</object>
<packing>
<property name="left-attach">0</property>
diff --git a/cui/uiconfig/ui/paratabspage.ui b/cui/uiconfig/ui/paratabspage.ui
index 56f3299e5814..a6fd96643672 100644
--- a/cui/uiconfig/ui/paratabspage.ui
+++ b/cui/uiconfig/ui/paratabspage.ui
@@ -173,6 +173,11 @@
<object class="GtkDrawingArea" id="drawingareaWIN_TABLEFT">
<property name="visible">True</property>
<property name="can_focus">False</property>
+ <child internal-child="accessible">
+ <object class="AtkObject"
id="drawingareaWIN_TABLEFT-atkobject">
+ <property name="AtkObject::accessible-name"
translatable="yes" context="paratabspage|drawingareaWIN_TABLEFT-atkobject">Left
tab preview</property>
+ </object>
+ </child>
</object>
<packing>
<property name="left_attach">1</property>
@@ -183,6 +188,11 @@
<object class="GtkDrawingArea" id="drawingareaWIN_TABRIGHT">
<property name="visible">True</property>
<property name="can_focus">False</property>
+ <child internal-child="accessible">
+ <object class="AtkObject"
id="drawingareaWIN_TABRIGHT-atkobject">
+ <property name="AtkObject::accessible-name"
translatable="yes"
context="paratabspage|drawingareaWIN_TABRIGHT-atkobject">Right tab
preview</property>
+ </object>
+ </child>
</object>
<packing>
<property name="left_attach">1</property>
@@ -193,6 +203,11 @@
<object class="GtkDrawingArea" id="drawingareaWIN_TABCENTER">
<property name="visible">True</property>
<property name="can_focus">False</property>
+ <child internal-child="accessible">
+ <object class="AtkObject"
id="drawingareaWIN_TABCENTER-atkobject">
+ <property name="AtkObject::accessible-name"
translatable="yes"
context="paratabspage|drawingareaWIN_TABCENTER-atkobject">Center tab
preview</property>
+ </object>
+ </child>
</object>
<packing>
<property name="left_attach">1</property>
@@ -203,6 +218,11 @@
<object class="GtkDrawingArea" id="drawingareaWIN_TABDECIMAL">
<property name="visible">True</property>
<property name="can_focus">False</property>
+ <child internal-child="accessible">
+ <object class="AtkObject"
id="drawingareaWIN_TABDECIMAL-atkobject">
+ <property name="AtkObject::accessible-name"
translatable="yes"
context="paratabspage|drawingareaWIN_TABDECIMAL-atkobject">Decimal tab
preview</property>
+ </object>
+ </child>
</object>
<packing>
<property name="left_attach">1</property>
diff --git a/svx/uiconfig/ui/headfootformatpage.ui
b/svx/uiconfig/ui/headfootformatpage.ui
index ffb2774b3f8b..bdad1120afeb 100644
--- a/svx/uiconfig/ui/headfootformatpage.ui
+++ b/svx/uiconfig/ui/headfootformatpage.ui
@@ -372,6 +372,11 @@
<property name="valign">center</property>
<property name="hexpand">True</property>
<property name="vexpand">True</property>
+ <child internal-child="accessible">
+ <object class="AtkObject" id="drawingareaPageHF-atkobject">
+ <property name="AtkObject::accessible-name" translatable="yes"
context="headfootformatpage|drawingareaPageHF-atkobject">Header and Footer
Preview</property>
+ </object>
+ </child>
</object>
<packing>
<property name="expand">False</property>
diff --git a/sw/uiconfig/swriter/ui/dropcapspage.ui
b/sw/uiconfig/swriter/ui/dropcapspage.ui
index cf6d04c20347..6d3a52069c08 100644
--- a/sw/uiconfig/swriter/ui/dropcapspage.ui
+++ b/sw/uiconfig/swriter/ui/dropcapspage.ui
@@ -331,6 +331,11 @@
<property name="can-focus">False</property>
<property name="halign">center</property>
<property name="valign">start</property>
+ <child internal-child="accessible">
+ <object class="AtkObject"
id="drawingareaWN_EXAMPLE-atkobject">
+ <property name="AtkObject::accessible-name"
translatable="yes"
context="dropcapspage|drawingareaWN_EXAMPLE-atkobject">Example</property>
+ </object>
+ </child>
</object>
</child>
</object>
commit cd1a80157d921bf6abc629d6cb79c9dc6dd7a875
Author: Caolán McNamara <[email protected]>
AuthorDate: Thu Jan 15 09:39:14 2026 +0000
Commit: Andras Timar <[email protected]>
CommitDate: Sat Jan 17 15:31:06 2026 +0100
kit: Don't exit shape edit mode due to a view-switch
View1 - enters text edit mode in a shape on page A
View2 - enters text edit mode in a shape on page B
There is a view switch from B to A and back to B, in which case View2
should remain in shape edit mode and not auto-exit.
Change-Id: I55f492903c80a347cd7f8287d5a60d20628f69b0
Reviewed-on: https://gerrit.libreoffice.org/c/core/+/197340
Tested-by: Jenkins CollaboraOffice <[email protected]>
Reviewed-by: Caolán McNamara <[email protected]>
diff --git a/sd/qa/unit/tiledrendering/data/TextBoxAndRect.odg
b/sd/qa/unit/tiledrendering/data/TextBoxAndRect.odg
index aa1a37b83147..d715f8180052 100644
Binary files a/sd/qa/unit/tiledrendering/data/TextBoxAndRect.odg and
b/sd/qa/unit/tiledrendering/data/TextBoxAndRect.odg differ
diff --git a/sd/qa/unit/tiledrendering/data/Type-in-draw.odg
b/sd/qa/unit/tiledrendering/data/Type-in-draw.odg
new file mode 100644
index 000000000000..afac468f1926
Binary files /dev/null and b/sd/qa/unit/tiledrendering/data/Type-in-draw.odg
differ
diff --git a/sd/qa/unit/tiledrendering/tiledrendering.cxx
b/sd/qa/unit/tiledrendering/tiledrendering.cxx
index c0a68aeea3de..64a791b01c02 100644
--- a/sd/qa/unit/tiledrendering/tiledrendering.cxx
+++ b/sd/qa/unit/tiledrendering/tiledrendering.cxx
@@ -2647,6 +2647,44 @@ CPPUNIT_TEST_FIXTURE(SdTiledRenderingTest,
testShapeEditInMultipleViews)
CPPUNIT_ASSERT_EQUAL(false, pView1->IsTextEdit());
CPPUNIT_ASSERT_EQUAL(false, pView2->IsTextEdit());
}
+
+ // Scenario 4
+ // View1 - enters text edit mode in a shape on page A
+ // View2 - enters text edit mode in a shape on page B
+ // there is a view switch from B to A and back to B.
+ // View2 should remain in shape edit mode and not exit
+ // shape edit mode on switching back to view2
+ {
+ CPPUNIT_ASSERT_EQUAL(false, pView1->IsTextEdit());
+ CPPUNIT_ASSERT_EQUAL(false, pView2->IsTextEdit());
+
+ // Switch to view 1
+ SfxLokHelper::setView(nView1);
+ pView1->SdrBeginTextEdit(pTextBoxObject);
+
+ SfxLokHelper::setView(nView2);
+ pXImpressDocument->setPart(2);
+ SdPage* pPage3 = pViewShell2->GetActualPage();
+
+ CPPUNIT_ASSERT_MESSAGE("Page Change didn't work", pPage1 != pPage3);
+
+ SdrObject* pPage3TextBoxObject = pPage3->GetObj(0);
+ CPPUNIT_ASSERT_EQUAL(u"Text Box 1"_ustr,
pPage3TextBoxObject->GetName());
+
+ pView2->SdrBeginTextEdit(pPage3TextBoxObject);
+ CPPUNIT_ASSERT_EQUAL(true, pView2->IsTextEdit());
+
+ SfxLokHelper::setView(nView1);
+ pXImpressDocument->setPart(0);
+
+ CPPUNIT_ASSERT_EQUAL(true, pView2->IsTextEdit());
+
+ SfxLokHelper::setView(nView2);
+ pXImpressDocument->setPart(2);
+
+ // Fails before fix
+ CPPUNIT_ASSERT_EQUAL(true, pView2->IsTextEdit());
+ }
}
CPPUNIT_TEST_FIXTURE(SdTiledRenderingTest, testSidebarHide)
diff --git a/sd/source/ui/view/drviews1.cxx b/sd/source/ui/view/drviews1.cxx
index 7c5756bdb6ca..0f2102119901 100644
--- a/sd/source/ui/view/drviews1.cxx
+++ b/sd/source/ui/view/drviews1.cxx
@@ -946,7 +946,7 @@ bool DrawViewShell::SwitchPage(sal_uInt16 nSelectedPage,
bool bAllowChangeFocus,
}
}
- if (bAllowChangeFocus)
+ if (bAllowChangeFocus && !SfxLokHelper::isSettingView())
mpDrawView->SdrEndTextEdit();
mpActualPage = nullptr;
commit 432ee60a9bcc931952d660aa4de2f0fffd67cfd2
Author: Karthik Godha <[email protected]>
AuthorDate: Mon Jan 12 19:15:00 2026 +0530
Commit: Andras Timar <[email protected]>
CommitDate: Sat Jan 17 15:31:06 2026 +0100
XLSX - Skip unknown functions in definedName
Skip export of ocNoName token during XLSX export, which is associated
with unknown functions
bug document: forum-de2-3313.xls
Change-Id: I3db50028cd7a0f78d214d2af7e73b71e8e5f233a
Reviewed-on: https://gerrit.libreoffice.org/c/core/+/197113
Tested-by: Jenkins CollaboraOffice <[email protected]>
Reviewed-by: Michael Stahl <[email protected]>
diff --git a/formula/source/core/api/FormulaCompiler.cxx
b/formula/source/core/api/FormulaCompiler.cxx
index 9e9e90cd67c3..62900e0d3f46 100644
--- a/formula/source/core/api/FormulaCompiler.cxx
+++ b/formula/source/core/api/FormulaCompiler.cxx
@@ -2518,7 +2518,31 @@ void FormulaCompiler::CreateStringFromTokenArray(
OUStringBuffer& rBuffer )
rBuffer.append( '=');
const FormulaToken* t = maArrIterator.First();
while( t )
- t = CreateStringFromToken( rBuffer, t, true );
+ {
+ // Skip writing unknown functions without a name in OOXML ex: #NAME!()
+ if (t->GetOpCode() == ocNoName && t->GetType() == svByte
+ && FormulaGrammar::isOOXML(meGrammar))
+ {
+ t = maArrIterator.Next();
+ sal_uInt16 nParenthesis = 0;
+ // traverse the array to match parentheses
+ if (t && t->GetOpCode() == ocOpen)
+ {
+ do
+ {
+ if (t->GetOpCode() == ocOpen)
+ nParenthesis++;
+ else if (t->GetOpCode() == ocClose)
+ nParenthesis--;
+
+ t = maArrIterator.Next();
+
+ } while (nParenthesis > 0 && t);
+ }
+ continue;
+ }
+ t = CreateStringFromToken(rBuffer, t, true);
+ }
if (pSaveArr != pArr)
{
commit ce8d7cf5d9be1c5afcbab2ac1c491fe228997295
Author: Pranam Lashkari <[email protected]>
AuthorDate: Thu Jan 15 03:50:04 2026 +0530
Commit: Andras Timar <[email protected]>
CommitDate: Sat Jan 17 15:31:06 2026 +0100
LOK: send notification when autofilter is changed
Change-Id: I4b1e45461099404cffc0fe9cbbc5d45c09736bad
Reviewed-on: https://gerrit.libreoffice.org/c/core/+/197302
Tested-by: Jenkins CollaboraOffice <[email protected]>
Reviewed-by: Caolán McNamara <[email protected]>
diff --git a/sc/source/ui/inc/gridwin.hxx b/sc/source/ui/inc/gridwin.hxx
index c9ae75c3b12c..65f5eafc7e40 100644
--- a/sc/source/ui/inc/gridwin.hxx
+++ b/sc/source/ui/inc/gridwin.hxx
@@ -242,6 +242,7 @@ class SAL_DLLPUBLIC_RTTI ScGridWindow : public
vcl::DocWindow, public DropTarget
bool DoPageFieldSelection( SCCOL nCol, SCROW nRow );
bool DoAutoFilterButton( SCCOL nCol, SCROW nRow, const
MouseEvent& rMEvt );
void SendAutofilterPopupPosition(SCCOL nCol, SCROW nRow);
+ void SendAutofilterChange();
void DoPushPivotButton( SCCOL nCol, SCROW nRow, const MouseEvent& rMEvt,
bool bButton, bool bPopup, bool bMultiField );
void DoPushPivotToggle( SCCOL nCol, SCROW nRow, const MouseEvent& rMEvt );
diff --git a/sc/source/ui/view/gridwin.cxx b/sc/source/ui/view/gridwin.cxx
index fae88e84df97..0bab633e1d48 100644
--- a/sc/source/ui/view/gridwin.cxx
+++ b/sc/source/ui/view/gridwin.cxx
@@ -955,6 +955,18 @@ void ScGridWindow::SendAutofilterPopupPosition(SCCOL nCol,
SCROW nRow) {
}
}
+void ScGridWindow::SendAutofilterChange() {
+ ScTabViewShell* pViewShell = mrViewData.GetViewShell();
+ if (pViewShell)
+ {
+ tools::JsonWriter writer;
+ writer.put("commandName", "AutoFilterChange");
+ writer.put("state", true);
+ OString info = writer.finishAndGetAsOString();
+ pViewShell->libreOfficeKitViewCallback(LOK_CALLBACK_STATE_CHANGED,
info);
+ }
+}
+
void ScGridWindow::LaunchAutoFilterMenu(SCCOL nCol, SCROW nRow)
{
SCTAB nTab = mrViewData.CurrentTabForData();
@@ -1328,6 +1340,7 @@ void
ScGridWindow::UpdateAutoFilterFromMenu(AutoFilterMode eMode)
}
}
+ SendAutofilterChange();
mrViewData.GetView()->Query(aParam, nullptr, true);
pDBData->SetQueryParam(aParam);
}
commit 4c52d89a7636bc8134ee64c47c59abac8610eda3
Author: Karthik Godha <[email protected]>
AuthorDate: Wed Jan 14 19:56:54 2026 +0530
Commit: Andras Timar <[email protected]>
CommitDate: Sat Jan 17 15:31:06 2026 +0100
XLS -> XLSX: Discard overlapping merge ranges
bug document: forum-en-5338.xls
Change-Id: I5da6b650ae1c73606c6688210ba65f28920eeed4
Reviewed-on: https://gerrit.libreoffice.org/c/core/+/197273
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 b421ceed9311..002471d6867d 100644
--- a/sc/source/filter/excel/xistyle.cxx
+++ b/sc/source/filter/excel/xistyle.cxx
@@ -1996,8 +1996,14 @@ void XclImpXFRangeBuffer::SetHyperlink( const XclRange&
rXclRange, const OUStrin
void XclImpXFRangeBuffer::SetMerge( SCCOL nScCol1, SCROW nScRow1, SCCOL
nScCol2, SCROW nScRow2 )
{
- if( (nScCol1 < nScCol2) || (nScRow1 < nScRow2) )
- maMergeList.push_back( ScRange( nScCol1, nScRow1, 0, nScCol2, nScRow2,
0 ) );
+ if ((nScCol1 < nScCol2) || (nScRow1 < nScRow2))
+ {
+ ScRange aRange(nScCol1, nScRow1, 0, nScCol2, nScRow2, 0);
+ // If merge range intersects with existing merge ranges then discard
it.
+ if (maMergeList.Intersects(aRange))
+ return;
+ maMergeList.push_back(aRange);
+ }
}
void XclImpXFRangeBuffer::Finalize()
commit 80e6672bcba9f3b961ff8866a7f7b359ce697e6c
Author: Noel Grandin <[email protected]>
AuthorDate: Tue Jan 13 10:22:47 2026 +0200
Commit: Andras Timar <[email protected]>
CommitDate: Sat Jan 17 15:31:06 2026 +0100
we dont need this officeotron workaround anymore
ever since
commit e4978f9079cda7abb7bb424503d780566c728adf
Author: Karthik Godha <[email protected]>
Date: Mon Nov 24 19:16:51 2025 +0530
Update OOXML schema to follow ECMA-376 5th edition
which was part of officeotron 0.8.1
Change-Id: I0b9f8ff0d513ced06cda9f4257454ee756b28322
Reviewed-on: https://gerrit.libreoffice.org/c/core/+/197175
Reviewed-by: Michael Stahl <[email protected]>
Tested-by: Jenkins
(cherry picked from commit 4da8f78016adae7da01f3822b87a9422466f26a2)
Reviewed-on: https://gerrit.libreoffice.org/c/core/+/197234
Tested-by: Jenkins CollaboraOffice <[email protected]>
diff --git a/test/source/bootstrapfixture.cxx b/test/source/bootstrapfixture.cxx
index c0297d7d211e..a30b10057738 100644
--- a/test/source/bootstrapfixture.cxx
+++ b/test/source/bootstrapfixture.cxx
@@ -140,58 +140,6 @@ OString loadFile(const OUString& rURL)
constexpr std::u16string_view grand_total = u"Grand total of errors in
submitted package: ";
-OUString filterOut(const OUString& s, std::u16string_view excludedSubstr)
-{
- OUString result = s;
- for (;;)
- {
- sal_Int32 pos = result.indexOf(excludedSubstr);
- if (pos < 0)
- break;
- sal_Int32 start = result.lastIndexOf('
', pos);
- if (!result.match("ERROR", start + 1))
- return s; // unexpected string format
- sal_Int32 end = result.indexOf('
', pos);
- result = result.replaceAt(start, end - start, u""_ustr);
- pos = result.lastIndexOf(grand_total);
- if (pos < 0)
- return s; // unexpected string format
- start = end = pos + grand_total.size();
- while (end < result.getLength() && rtl::isAsciiDigit(result[end]))
- ++end;
- std::u16string_view aNumber = result.subView(start, end - start);
- sal_Int32 nErrors = o3tl::toInt32(aNumber) - 1;
- result = result.replaceAt(start, end - start,
OUString::number(nErrors));
- }
- return result;
-}
-
-OUString filterValidationResults(const OUString& s)
-{
- OUString result = s;
- // In ECMA-376-1 Second Edition, 2008, there is the following restriction
for oleObj:
- //
- // <xsd:choice minOccurs="1" maxOccurs="1">
- // <xsd:element name="embed" type="CT_OleObjectEmbed"/>
- // <xsd:element name="link" type="CT_OleObjectLink"/>
- // <xsd:element name="pic" type="CT_Picture"/>
- // </xsd:choice>
- //
- // This makes simultaneous use of embed (or link) and pic impossible. This
was obviously a
- // mistake; and the following editions of standard fixed it: e.g., in
ECMA-376-1:2016, that
- // rule is
- //
- // <xsd:choice minOccurs="1" maxOccurs="1">
- // <xsd:element name="embed" type="CT_OleObjectEmbed"/>
- // <xsd:element name="link" type="CT_OleObjectLink"/>
- // </xsd:choice>
- // <xsd:element name="pic" type="CT_Picture" minOccurs="1" maxOccurs="1"/>
- //
- // But officeotron only knows the old version...
- result = filterOut(result, u"Invalid content was found starting with
element 'p:pic'. No child element is expected at this point.");
-
- return result;
-}
}
#endif
@@ -296,7 +244,6 @@ void test::BootstrapFixture::validate(const OUString&
rPath, std::u16string_view
if( eFormat == test::OOXML && !aContentOUString.isEmpty() )
{
- aContentOUString = filterValidationResults(aContentOUString);
// check for validation errors here
sal_Int32 nIndex = aContentOUString.lastIndexOf(grand_total);
if(nIndex == -1)
commit a90f1db6b7df1b2a29be64d77c3e38610e03b540
Author: Noel Grandin <[email protected]>
AuthorDate: Tue Jan 13 10:19:57 2026 +0200
Commit: Andras Timar <[email protected]>
CommitDate: Sat Jan 17 15:31:06 2026 +0100
update to officeotron 0.8.8
which means we no longer need the workaround
Change-Id: Ibdc47750a7d5eacc9a1e2251e145379f0464b7f4
Reviewed-on: https://gerrit.libreoffice.org/c/core/+/197174
Tested-by: Jenkins
Reviewed-by: Noel Grandin <[email protected]>
(cherry picked from commit 49a1acfd91b9cb30807c42845560b93f87ecc547)
Reviewed-on: https://gerrit.libreoffice.org/c/core/+/197233
Tested-by: Jenkins CollaboraOffice <[email protected]>
Reviewed-by: Michael Stahl <[email protected]>
diff --git a/download.lst b/download.lst
index 54587bb52103..3e83735a24de 100644
--- a/download.lst
+++ b/download.lst
@@ -607,8 +607,8 @@ ODFVALIDATOR_JAR :=
odfvalidator-0.9.0-RC2-SNAPSHOT-jar-with-dependencies-2726ab
# three static lines
# so that git cherry-pick
# will not run into conflicts
-OFFICEOTRON_SHA256SUM :=
0c2a4227394ac78147387f1c1ff1063e87f2151ffc91f1eb97bb17c2650fa708
-OFFICEOTRON_JAR := officeotron-0.8.5.jar
+OFFICEOTRON_SHA256SUM :=
c72cdcb7fe7cfe917d1fb8766ddbc3f92b6124ecd5fb8c6dc0ddabb74a7e057c
+OFFICEOTRON_JAR := officeotron-0.8.8.jar
# three static lines
# so that git cherry-pick
# will not run into conflicts
diff --git a/test/source/bootstrapfixture.cxx b/test/source/bootstrapfixture.cxx
index 34e48bbb16b0..c0297d7d211e 100644
--- a/test/source/bootstrapfixture.cxx
+++ b/test/source/bootstrapfixture.cxx
@@ -190,17 +190,6 @@ OUString filterValidationResults(const OUString& s)
// But officeotron only knows the old version...
result = filterOut(result, u"Invalid content was found starting with
element 'p:pic'. No child element is expected at this point.");
- {
- /* While the spec says the core-properties relationship must be
- * officedocument/2006/relationships/metadata/core-properties
- * MS Office actually just writes the ECMA-376-1ST EDITION version
- * for both ECMA_Transitional and ISO_Transitional formats.
- *
- * officeotron doesn't care that clause 15.2.12.1 fails on all
MSWord-produced output.
- */
- result = filterOut(result, u"Entry with MIME type
\"application/vnd.openxmlformats-package.core-properties+xml\" has unrecognized
relationship type
\"http://schemas.openxmlformats.org/package/2006/relationships/metadata/core-properties\"
(see ISO/IEC 29500-1:2008, Clause 15.2.12.1)");
- }
-
return result;
}
}
commit 63852683040ab404c3a8861d0ddbcd8d61efd90b
Author: Mohit Marathe <[email protected]>
AuthorDate: Tue Jan 13 19:21:41 2026 +0530
Commit: Andras Timar <[email protected]>
CommitDate: Sat Jan 17 15:31:06 2026 +0100
sd: disable .uno:CopySlide when the selected page is canvas page
Signed-off-by: Mohit Marathe <[email protected]>
Change-Id: Id4f22e768cf43ae91b57b91d922061f7ce21d933
Reviewed-on: https://gerrit.libreoffice.org/c/core/+/197196
Tested-by: Jenkins CollaboraOffice <[email protected]>
Reviewed-by: Michael Stahl <[email protected]>
diff --git a/sd/source/ui/view/drviews7.cxx b/sd/source/ui/view/drviews7.cxx
index 44009a6ee9f3..0619ed62124c 100644
--- a/sd/source/ui/view/drviews7.cxx
+++ b/sd/source/ui/view/drviews7.cxx
@@ -861,6 +861,7 @@ void DrawViewShell::GetMenuState( SfxItemSet &rSet )
rSet.DisableItem(SID_PRESENTATION_LAYOUT);
rSet.DisableItem(SID_HIDE_SLIDE);
rSet.DisableItem(SID_SHOW_SLIDE);
+ rSet.DisableItem(SID_COPY_SLIDE);
}
}
else
commit 4cb6ffaf83abd02cacd5fedcf22ad6d1ba474100
Author: Caolán McNamara <[email protected]>
AuthorDate: Mon Jan 12 08:40:55 2026 +0000
Commit: Andras Timar <[email protected]>
CommitDate: Sat Jan 17 15:31:06 2026 +0100
cid#1680327 Uninitialized scalar field
Change-Id: Ia823d38011e45dedcf16a06869b6d9b0460ebcd2
Reviewed-on: https://gerrit.libreoffice.org/c/core/+/197073
Tested-by: Jenkins CollaboraOffice <[email protected]>
Reviewed-by: Miklos Vajna <[email protected]>
diff --git a/vcl/source/fontsubset/sft.cxx b/vcl/source/fontsubset/sft.cxx
index ee33a18e8178..f1c7408e7c93 100644
--- a/vcl/source/fontsubset/sft.cxx
+++ b/vcl/source/fontsubset/sft.cxx
@@ -982,6 +982,7 @@ AbstractTrueTypeFont::~AbstractTrueTypeFont()
TrueTypeFont::TrueTypeFont(const char* pFileName, const FontCharMapRef
xCharMap)
: AbstractTrueTypeFont(pFileName, xCharMap)
, fsize(-1)
+ , mmhandle(0)
, ptr(nullptr)
, ntables(0)
{
commit 9863a6a5fcb7e47cf77b1bd94c6a2d7ed439c832
Author: Michael Meeks <[email protected]>
AuthorDate: Thu Jan 15 12:46:53 2026 +0000
Commit: Andras Timar <[email protected]>
CommitDate: Sat Jan 17 15:31:06 2026 +0100
Avoid statting share/theme_definitions/online continually.
It is not clear that this FileDefinition drawing code is ever used,
but getting rid of this is perhaps helpful.
Signed-off-by: Michael Meeks <[email protected]>
Change-Id: I735c8cc9eb5280afa2e4cdd42597b6a0ea9a2718
Reviewed-on: https://gerrit.libreoffice.org/c/core/+/197368
Tested-by: Jenkins CollaboraOffice <[email protected]>
Reviewed-by: Andras Timar <[email protected]>
diff --git a/vcl/source/gdi/FileDefinitionWidgetDraw.cxx
b/vcl/source/gdi/FileDefinitionWidgetDraw.cxx
index 9613fae354c8..3cd3f636b261 100644
--- a/vcl/source/gdi/FileDefinitionWidgetDraw.cxx
+++ b/vcl/source/gdi/FileDefinitionWidgetDraw.cxx
@@ -80,8 +80,10 @@ std::shared_ptr<WidgetDefinition> const&
getWidgetDefinitionForTheme(std::u16string_view rThemenName)
{
static std::shared_ptr<WidgetDefinition> spDefinition;
- if (!spDefinition)
+ static bool bAlreadyChecked = false;
+ if (!bAlreadyChecked)
{
+ bAlreadyChecked = true;
OUString sSharedDefinitionBasePath = lcl_getThemeDefinitionPath();
OUString sThemeFolder = sSharedDefinitionBasePath + rThemenName + "/";
OUString sThemeDefinitionFile = sThemeFolder + "definition.xml";
commit dc42c32b80863e95880704e08472e0585f9b49f3
Author: Aron Budea <[email protected]>
AuthorDate: Thu Jan 15 16:01:53 2026 +1030
Commit: Andras Timar <[email protected]>
CommitDate: Sat Jan 17 15:31:06 2026 +0100
sw: fix order of attributes in wp:anchor on export
To match original DOCX in eg. tdf#169802 bugdoc.
Change-Id: Ife68c293508bfed4f2a2b1d130e310390513981e
Reviewed-on: https://gerrit.libreoffice.org/c/core/+/197312
Tested-by: Jenkins
Reviewed-by: Aron Budea <[email protected]>
(cherry picked from commit b2dd08c6af51996f9fd2988f060d5c0f08e247c6)
Reviewed-on: https://gerrit.libreoffice.org/c/core/+/197412
Reviewed-by: Xisco Fauli <[email protected]>
diff --git a/sw/source/filter/ww8/docxsdrexport.cxx
b/sw/source/filter/ww8/docxsdrexport.cxx
index 4c84b825cb26..a6af45eec32f 100644
--- a/sw/source/filter/ww8/docxsdrexport.cxx
+++ b/sw/source/filter/ww8/docxsdrexport.cxx
@@ -847,7 +847,6 @@ void DocxSdrExport::startDMLAnchorInline(const
SwFrameFormat* pFrameFormat, cons
&& pObj->GetLayer() !=
iDocumentDrawModelAccess.GetHeaderFooterHellId()
&& pObj->GetLayer() !=
iDocumentDrawModelAccess.GetInvisibleHellId();
}
- attrList->add(XML_behindDoc, bOpaque ? "0" : "1");
attrList->add(XML_distT, OString::number(TwipsToEMU(nDistT)));
attrList->add(XML_distB, OString::number(TwipsToEMU(nDistB)));
@@ -855,6 +854,11 @@ void DocxSdrExport::startDMLAnchorInline(const
SwFrameFormat* pFrameFormat, cons
attrList->add(XML_distR, OString::number(TwipsToEMU(nDistR)));
attrList->add(XML_simplePos, "0");
+
+ // It seems 0 and 1 have special meaning: just start counting from 2
to avoid issues with that.
+ // Mandatory attribute, write 0 if pObj is null.
+ attrList->add(XML_relativeHeight, pObj ?
OString::number(pObj->GetOrdNum() + 2) : "0"_ostr);
+ attrList->add(XML_behindDoc, bOpaque ? "0" : "1");
attrList->add(XML_locked, "0");
bool bLclInTabCell = true;
@@ -876,21 +880,11 @@ void DocxSdrExport::startDMLAnchorInline(const
SwFrameFormat* pFrameFormat, cons
bLclInTabCell = true;
}
- if (bLclInTabCell)
- attrList->add(XML_layoutInCell, "1");
- else
- attrList->add(XML_layoutInCell, "0");
+ attrList->add(XML_layoutInCell, bLclInTabCell ? "1" : "0");
bool bAllowOverlap =
pFrameFormat->GetWrapInfluenceOnObjPos().GetAllowOverlap();
attrList->add(XML_allowOverlap, bAllowOverlap ? "1" : "0");
- if (pObj)
- // It seems 0 and 1 have special meaning: just start counting from
2 to avoid issues with that.
- attrList->add(XML_relativeHeight,
OString::number(pObj->GetOrdNum() + 2));
- else
- // relativeHeight is mandatory attribute, if value is not present,
we must write default value
- attrList->add(XML_relativeHeight, "0");
-
if (pObj)
{
OUString sAnchorId = lclGetAnchorIdFromGrabBag(pObj);
commit 8bafec1d6693d611548e62bab54bd02b325957f5
Author: Jim Raykowski <[email protected]>
AuthorDate: Sat Jan 3 15:40:11 2026 -0900
Commit: Andras Timar <[email protected]>
CommitDate: Sat Jan 17 15:31:06 2026 +0100
tdf#169964 Fix folded OLE objects are not saved in docx
Examining DocxAttributeOutput::WriteFlyFrame case ww8::Frame::eOle,
it seems that OLE objects need to have their frames visible in
the document for them to be saved. This patch makes all folded
outline content visible during execution of the
DocxExportFilter:exportDocument function. SW_DLLPUBLIC's are added to
make linking succeed with clang.
Change-Id: I8fcaa98402ebd9a7a6135f65467a82bbca8731f9
Reviewed-on: https://gerrit.libreoffice.org/c/core/+/196516
Tested-by: Jenkins
Reviewed-by: Jim Raykowski <[email protected]>
(cherry picked from commit 9cdb58822849805ca939e1079b01262e75a96bf2)
Reviewed-on: https://gerrit.libreoffice.org/c/core/+/197316
Reviewed-by: Adolfo Jayme Barrientos <[email protected]>
diff --git a/sw/Library_msword.mk b/sw/Library_msword.mk
index 7d9d0c7f80f8..ba5ec835d642 100644
--- a/sw/Library_msword.mk
+++ b/sw/Library_msword.mk
@@ -32,6 +32,7 @@ $(eval $(call gb_Library_set_include,msword,\
-I$(SRCDIR)/sw/source/core/inc \
-I$(SRCDIR)/sw/source/filter/inc \
-I$(SRCDIR)/sw/inc \
+ -I$(SRCDIR)/sw/source/uibase/inc \
$$(INCLUDE) \
))
diff --git a/sw/inc/viewsh.hxx b/sw/inc/viewsh.hxx
index cece0d0dfdfc..8da56ee9b75b 100644
--- a/sw/inc/viewsh.hxx
+++ b/sw/inc/viewsh.hxx
@@ -523,9 +523,9 @@ public:
void LockView( bool b ) { mbViewLocked = b; }
inline void LockPaint(LockPaintReason eReason);
- void ImplLockPaint();
+ SW_DLLPUBLIC void ImplLockPaint();
inline void UnlockPaint(bool bVirDev = false );
- void ImplUnlockPaint( std::vector<LockPaintReason>& rReasons, bool
bVirDev );
+ SW_DLLPUBLIC void ImplUnlockPaint(std::vector<LockPaintReason>& rReasons,
bool bVirDev);
bool IsPaintLocked() const { return mnLockPaint != 0; }
// Get/set DrawView and PageView.
diff --git a/sw/source/filter/ww8/docxexportfilter.cxx
b/sw/source/filter/ww8/docxexportfilter.cxx
index 8ea56f2f3661..258461dd0565 100644
--- a/sw/source/filter/ww8/docxexportfilter.cxx
+++ b/sw/source/filter/ww8/docxexportfilter.cxx
@@ -30,6 +30,8 @@
#include <unotools/mediadescriptor.hxx>
+#include <wrtsh.hxx>
+
using namespace ::comphelper;
using namespace ::com::sun::star;
@@ -50,6 +52,8 @@ bool DocxExportFilter::exportDocument()
if ( !pDoc )
return false;
+ MakeAllOutlineContentTemporarilyVisible a(pDoc);
+
// update layout (if present), for SwWriteTable
SwViewShell* pViewShell =
pDoc->getIDocumentLayoutAccess().GetCurrentViewShell();
if (pViewShell != nullptr)
diff --git a/sw/source/uibase/inc/wrtsh.hxx b/sw/source/uibase/inc/wrtsh.hxx
index f623299e3ac6..24e9c2a62131 100644
--- a/sw/source/uibase/inc/wrtsh.hxx
+++ b/sw/source/uibase/inc/wrtsh.hxx
@@ -524,7 +524,7 @@ typedef bool (SwWrtShell::*FNSimpleMove)();
bool IsOutlineContentVisible(const size_t nPos);
void MakeOutlineContentVisible(const size_t nPos, bool bMakeVisible =
true, bool bSetAttrOutlineVisibility = true);
- void MakeAllFoldedOutlineContentVisible(bool bMakeVisible = true);
+ SW_DLLPUBLIC void MakeAllFoldedOutlineContentVisible(bool bMakeVisible =
true);
void InvalidateOutlineContentVisibility();
bool GetAttrOutlineContentVisible(const size_t nPos) const;
@@ -702,7 +702,7 @@ inline bool SwWrtShell::Is_FnDragEQBeginDrag() const
#endif
}
-class MakeAllOutlineContentTemporarilyVisible
+class SW_DLLPUBLIC MakeAllOutlineContentTemporarilyVisible
{
private:
SwWrtShell* m_pWrtSh = nullptr;
commit 21217325e9ecfe70b8b39215b44923286c1c1c8a
Author: Miklos Vajna <[email protected]>
AuthorDate: Thu Jan 15 09:27:37 2026 +0100
Commit: Andras Timar <[email protected]>
CommitDate: Sat Jan 17 15:31:05 2026 +0100
cool#13574 sw redline render mode: avoid coloring, set lightness
User A managed to format a piece of text as red, formatted with
underline and then user B is now confused why rejecting this tracked
change doesn't work.
This is working as intended for the normal redline render mode, but we
can try something different for the 'omit insert/delete' redline render
mode: when showing the old version, we can render deletes unchanged and
when showing the new version, we can render inserts unchanged. The rest
of the redlines can be semi-hidden.
That semi-hidden is a bit tricky to provide. Now that we don't add
layout-level colors in SwModule::GetInsertAuthorAttr(), we go with
automatic color, which gets resolved quite late. So first figure out if
we need to "omit" (semi-hide) the current redline portion in
SwTextPainter::DrawTextLine(), and then pass around a flag, so that once
SwFntObj::DrawText() is past ApplyAutoColor(), we can set lightness to a
medium value.
This is needed, because a typical auto color resolves to either white or
black, and changing saturation has no effect for those colors. And this
way we still get readable text in both light and dark mode.
Change-Id: I0ff57cd996fda80fadc315ad0c6c85e5af1ff3e7
Reviewed-on: https://gerrit.libreoffice.org/c/core/+/197350
Reviewed-by: Miklos Vajna <[email protected]>
Tested-by: Jenkins
(cherry picked from commit a24dd7b1d742ccd59768db8b6b6a522588952108)
Reviewed-on: https://gerrit.libreoffice.org/c/core/+/197390
Reviewed-by: Adolfo Jayme Barrientos <[email protected]>
diff --git a/sw/CppunitTest_sw_core_text.mk b/sw/CppunitTest_sw_core_text.mk
index bb6fba294df4..42be7e727b0c 100644
--- a/sw/CppunitTest_sw_core_text.mk
+++ b/sw/CppunitTest_sw_core_text.mk
@@ -34,6 +34,7 @@ $(eval $(call gb_CppunitTest_use_libraries,sw_core_text, \
sfx \
subsequenttest \
svl \
+ svt \
sw \
swqahelper \
test \
diff --git a/sw/qa/core/text/itrpaint.cxx b/sw/qa/core/text/itrpaint.cxx
index 7eaed14187c8..a59960616d68 100644
--- a/sw/qa/core/text/itrpaint.cxx
+++ b/sw/qa/core/text/itrpaint.cxx
@@ -12,10 +12,13 @@
#include <memory>
#include <o3tl/string_view.hxx>
+#include <svtools/colorcfg.hxx>
#include <docsh.hxx>
#include <wrtsh.hxx>
#include <ndtxt.hxx>
+#include <swmodule.hxx>
+#include <swdll.hxx>
namespace
{
@@ -29,8 +32,8 @@ public:
}
};
-/// #RRGGBB -> HSL saturation.
-sal_Int16 GetColorSaturation(std::u16string_view rRGB)
+/// #RRGGBB -> HSL lightness.
+sal_Int16 GetColorLightness(std::u16string_view rRGB)
{
Color aColor(o3tl::toInt32(rRGB.substr(1, 2), 16),
o3tl::toInt32(rRGB.substr(3, 2), 16),
o3tl::toInt32(rRGB.substr(5, 2), 16));
@@ -38,12 +41,16 @@ sal_Int16 GetColorSaturation(std::u16string_view rRGB)
sal_uInt16 nSaturation;
sal_uInt16 nBrightness;
aColor.RGBtoHSB(nHue, nSaturation, nBrightness);
- return nSaturation;
+ return nBrightness;
}
CPPUNIT_TEST_FIXTURE(Test, testRedlineRenderModeOmitInsertDelete)
{
- // Default rendering: default, normal saturation, normal saturation.
+ // Reset redline author IDs to a predictable default.
+ SwGlobals::ensure();
+ SwModule::get()->ClearRedlineAuthors();
+
+ // Default rendering: default, normal lightness, normal lightness.
createSwDoc("redline.docx");
SwDocShell* pDocShell = getSwDocShell();
@@ -64,15 +71,17 @@ CPPUNIT_TEST_FIXTURE(Test,
testRedlineRenderModeOmitInsertDelete)
CPPUNIT_ASSERT_EQUAL(u"oldcontent"_ustr, aContent.copy(nIndex2, nLength2));
OUString aColor2
= getXPath(pXmlDoc,
"(//textarray)[2]/preceding-sibling::textcolor[1]", "color");
- CPPUNIT_ASSERT_GREATER(static_cast<sal_Int16>(50),
GetColorSaturation(aColor2));
+ Color aRedlineColor =
SwModule::get()->GetColorConfig().GetColorValue(svtools::AUTHOR1).nColor;
+ OUString aRedlineColorString = u"#"_ustr + aRedlineColor.AsRGBHexString();
+ CPPUNIT_ASSERT_EQUAL(aRedlineColorString, aColor2);
sal_Int32 nIndex3 = getXPath(pXmlDoc, "(//textarray)[3]",
"index").toInt32();
sal_Int32 nLength3 = getXPath(pXmlDoc, "(//textarray)[3]",
"length").toInt32();
CPPUNIT_ASSERT_EQUAL(u"newcontent"_ustr, aContent.copy(nIndex3, nLength3));
OUString aColor3
= getXPath(pXmlDoc,
"(//textarray)[3]/preceding-sibling::textcolor[1]", "color");
- CPPUNIT_ASSERT_GREATER(static_cast<sal_Int16>(50),
GetColorSaturation(aColor3));
+ CPPUNIT_ASSERT_EQUAL(aRedlineColorString, aColor3);
- // Omit inserts: default, normal saturation, de-saturated.
+ // Omit inserts: default, normal lightness, increased lightness.
SwWrtShell* pWrtShell = pDocShell->GetWrtShell();
SwViewOption aOpt(*pWrtShell->GetViewOptions());
aOpt.SetRedlineRenderMode(SwRedlineRenderMode::OmitInserts);
@@ -91,16 +100,16 @@ CPPUNIT_TEST_FIXTURE(Test,
testRedlineRenderModeOmitInsertDelete)
nLength2 = getXPath(pXmlDoc, "(//textarray)[2]", "length").toInt32();
CPPUNIT_ASSERT_EQUAL(u"oldcontent"_ustr, aContent.copy(nIndex2, nLength2));
aColor2 = getXPath(pXmlDoc,
"(//textarray)[2]/preceding-sibling::textcolor[1]", "color");
- CPPUNIT_ASSERT_GREATER(static_cast<sal_Int16>(50),
GetColorSaturation(aColor2));
+ CPPUNIT_ASSERT_EQUAL(u"#000000"_ustr, aColor2);
nIndex3 = getXPath(pXmlDoc, "(//textarray)[3]", "index").toInt32();
nLength3 = getXPath(pXmlDoc, "(//textarray)[3]", "length").toInt32();
CPPUNIT_ASSERT_EQUAL(u"newcontent"_ustr, aContent.copy(nIndex3, nLength3));
aColor3 = getXPath(pXmlDoc,
"(//textarray)[3]/preceding-sibling::textcolor[1]", "color");
// Without the accompanying fix in place, this test would have failed with:
- // - Expected less or equal than: 50
- // - Actual : 100
- // i.e. the 3rd text portion was not de-saturated.
- CPPUNIT_ASSERT_LESSEQUAL(static_cast<sal_Int16>(50),
GetColorSaturation(aColor3));
+ // - Expected greater or equal than: 49
+ // - Actual : 0
+ // i.e. the 3rd text portion had no increased lightness from black.
+ CPPUNIT_ASSERT_GREATEREQUAL(static_cast<sal_Int16>(49),
GetColorLightness(aColor3));
// Omit deletes: default, de-saturated, normal saturation.
aOpt.SetRedlineRenderMode(SwRedlineRenderMode::OmitDeletes);
@@ -119,12 +128,12 @@ CPPUNIT_TEST_FIXTURE(Test,
testRedlineRenderModeOmitInsertDelete)
nLength2 = getXPath(pXmlDoc, "(//textarray)[2]", "length").toInt32();
CPPUNIT_ASSERT_EQUAL(u"oldcontent"_ustr, aContent.copy(nIndex2, nLength2));
aColor2 = getXPath(pXmlDoc,
"(//textarray)[2]/preceding-sibling::textcolor[1]", "color");
- CPPUNIT_ASSERT_LESSEQUAL(static_cast<sal_Int16>(50),
GetColorSaturation(aColor2));
+ CPPUNIT_ASSERT_GREATEREQUAL(static_cast<sal_Int16>(49),
GetColorLightness(aColor2));
nIndex3 = getXPath(pXmlDoc, "(//textarray)[3]", "index").toInt32();
nLength3 = getXPath(pXmlDoc, "(//textarray)[3]", "length").toInt32();
CPPUNIT_ASSERT_EQUAL(u"newcontent"_ustr, aContent.copy(nIndex3, nLength3));
aColor3 = getXPath(pXmlDoc,
"(//textarray)[3]/preceding-sibling::textcolor[1]", "color");
- CPPUNIT_ASSERT_GREATER(static_cast<sal_Int16>(50),
GetColorSaturation(aColor3));
+ CPPUNIT_ASSERT_EQUAL(u"#000000"_ustr, aColor3);
}
}
diff --git a/sw/source/core/inc/drawfont.hxx b/sw/source/core/inc/drawfont.hxx
index 443f47635353..18c7913abf00 100644
--- a/sw/source/core/inc/drawfont.hxx
+++ b/sw/source/core/inc/drawfont.hxx
@@ -91,6 +91,7 @@ class SW_DLLPUBLIC SwDrawTextInfo
// GetModelPositionForViewPoint should not return the next position if
screen position is
// inside second half of bound rect, used for Accessibility
bool m_bPosMatchesBounds : 1 = false;
+ bool m_bOmitPaint = false;
#ifdef DBG_UTIL
// These flags should control that the appropriate Set-function has been
@@ -658,6 +659,9 @@ public:
// as argument, the change if made to the font otherwise the font at the
// output device is changed returns if the font has been changed
bool ApplyAutoColor( vcl::Font* pFnt = nullptr );
+
+ void SetOmitPaint(bool bOmitPaint) { m_bOmitPaint = bOmitPaint; }
+ bool GetOmitPaint() const { return m_bOmitPaint; }
};
#endif
diff --git a/sw/source/core/text/inftxt.cxx b/sw/source/core/text/inftxt.cxx
index 8110a64b95e0..d63102bc4f07 100644
--- a/sw/source/core/text/inftxt.cxx
+++ b/sw/source/core/text/inftxt.cxx
@@ -725,6 +725,11 @@ void SwTextPaintInfo::DrawText_( const OUString &rText,
const SwLinePortion &rPo
rPor.GetNextPortion()->InFixMargGrp() ||
rPor.GetNextPortion()->IsHolePortion() );
+ if (m_bOmitPaint)
+ {
+ aDrawInf.SetOmitPaint(m_bOmitPaint);
+ }
+
// Draw text next to the left border
Point aFontPos(m_aPos);
if( m_pFnt->GetLeftBorder() && rPor.InTextGrp() && !static_cast<const
SwTextPortion&>(rPor).GetJoinBorderWithPrev() )
diff --git a/sw/source/core/text/inftxt.hxx b/sw/source/core/text/inftxt.hxx
index d99d93dc248a..1ff88448610d 100644
--- a/sw/source/core/text/inftxt.hxx
+++ b/sw/source/core/text/inftxt.hxx
@@ -370,6 +370,7 @@ class SwTextPaintInfo : public SwTextSizeInfo
sal_uInt16 m_nSpaceIdx;
SwLineInfo const* m_pLineInfo{nullptr}; // hack: need this to get line
props
+ bool m_bOmitPaint = false;
void DrawText_(const OUString &rText, const SwLinePortion &rPor,
const TextFrameIndex nIdx, const TextFrameIndex nLen,
@@ -494,6 +495,7 @@ public:
void SetSmartTags(sw::WrongListIterator *const pNew) { m_pSmartTags =
pNew; }
sw::WrongListIterator* GetSmartTags() const { return m_pSmartTags; }
void SetLineInfo(SwLineInfo const*const pLineInfo) { m_pLineInfo =
pLineInfo; }
+ void SetOmitPaint(bool bOmitPaint) { m_bOmitPaint = bOmitPaint; }
};
class SwTextFormatInfo : public SwTextPaintInfo
diff --git a/sw/source/core/text/itrpaint.cxx b/sw/source/core/text/itrpaint.cxx
index 14693858cda8..cfbbcd5b62b8 100644
--- a/sw/source/core/text/itrpaint.cxx
+++ b/sw/source/core/text/itrpaint.cxx
@@ -42,6 +42,8 @@
#include "pormulti.hxx"
#include <doc.hxx>
#include <fmturl.hxx>
+#include <IDocumentRedlineAccess.hxx>
+#include <redline.hxx>
// Returns, if we have an underline breaking situation
// Adding some more conditions here means you also have to change them
@@ -305,6 +307,9 @@ void SwTextPainter::DrawTextLine( const SwRect &rPaint,
SwSaveClip &rClip,
// Reference portion for the paragraph end portion
SwLinePortion* pEndTempl = m_pCurr->GetFirstPortion();
+ const SwDoc& rDoc = GetInfo().GetTextFrame()->GetDoc();
+ const IDocumentRedlineAccess& rIDRA = rDoc.getIDocumentRedlineAccess();
+ const SwRedlineTable& rRedlineTable = rIDRA.GetRedlineTable();
while( pPor )
{
bool bSeeked = true;
@@ -422,6 +427,36 @@ void SwTextPainter::DrawTextLine( const SwRect &rPaint,
SwSaveClip &rClip,
roTaggedLabel.emplace(nullptr, nullptr, &aPorInfo, *pOut);
}
+ // See if the redline render mode requires to omit the paint of the
text portion.
+ SwRedlineTable::size_type nRedline = SwRedlineTable::npos;
+ SwRedlineRenderMode eRedlineRenderMode = SwRedlineRenderMode::Standard;
+ if (GetRedln() && GetRedln()->IsOn())
+ {
+ nRedline = GetRedln()->GetAct();
+ eRedlineRenderMode = GetInfo().GetOpt().GetRedlineRenderMode();
+ }
+ bool bOmitPaint = false;
+ if (nRedline != SwRedlineTable::npos)
+ {
+ const SwRangeRedline* pRedline = rRedlineTable[nRedline];
+ RedlineType eType = pRedline->GetType();
+ if (eRedlineRenderMode == SwRedlineRenderMode::OmitInserts
+ && eType == RedlineType::Insert)
+ {
+ bOmitPaint = true;
+ }
+ else if (eRedlineRenderMode == SwRedlineRenderMode::OmitDeletes
+ && eType == RedlineType::Delete)
+ {
+ bOmitPaint = true;
+ }
+ }
+
+ if (bOmitPaint)
+ {
+ GetInfo().SetOmitPaint(true);
+ }
+
{
// #i16816# tagged pdf support
Por_Info aPorInfo(*pPor, *this, 0);
@@ -444,6 +479,11 @@ void SwTextPainter::DrawTextLine( const SwRect &rPaint,
SwSaveClip &rClip,
}
}
+ if (bOmitPaint)
+ {
+ GetInfo().SetOmitPaint(false);
+ }
+
// lazy open LBody and paragraph tag after num portions have been
painted to Lbl
if (pPor->InNumberGrp() // also footnote label
// note: numbering portion may be split if it has multiple scripts
diff --git a/sw/source/core/txtnode/fntcache.cxx
b/sw/source/core/txtnode/fntcache.cxx
index 30114327effa..bc270a72d139 100644
--- a/sw/source/core/txtnode/fntcache.cxx
+++ b/sw/source/core/txtnode/fntcache.cxx
@@ -1048,6 +1048,25 @@ void SwFntObj::DrawText( SwDrawTextInfo &rInf )
Color aOldColor( pTmpFont->GetColor() );
bool bChgColor = rInf.ApplyAutoColor( pTmpFont );
+
+ if (rInf.GetOmitPaint())
+ {
+ Color aColor = pTmpFont->GetColor();
+ sal_uInt16 nHue;
+ sal_uInt16 nSaturation;
+ sal_uInt16 nBrightness;
+ aColor.RGBtoHSB(nHue, nSaturation, nBrightness);
+ // 50% lightness: balance between completely omitting the paint and
hard-to-notice small
+ // difference.
+ nBrightness = 50;
+ aColor = Color::HSBtoRGB(nHue, nSaturation, nBrightness);
+ if (aColor != pTmpFont->GetColor())
+ {
+ bChgColor = true;
+ pTmpFont->SetColor(aColor);
+ }
+ }
+
if( !pTmpFont->IsSameInstance( rInf.GetOut().GetFont() ) )
rInf.GetOut().SetFont( *pTmpFont );
if ( bChgColor )
diff --git a/sw/source/uibase/app/swmodul1.cxx
b/sw/source/uibase/app/swmodul1.cxx
index 75d8909559b3..2b6391f8b142 100644
--- a/sw/source/uibase/app/swmodul1.cxx
+++ b/sw/source/uibase/app/swmodul1.cxx
@@ -484,23 +484,16 @@ std::size_t SwModule::InsertRedlineAuthor(const OUString&
rAuthor)
static void lcl_FillAuthorAttr( std::size_t nAuthor, SfxItemSet &rSet,
const AuthorCharAttr &rAttr, SwRedlineRenderMode
eRenderMode = SwRedlineRenderMode::Standard )
{
+ if (eRenderMode != SwRedlineRenderMode::Standard)
+ {
+ return;
+ }
+
Color aCol( rAttr.m_nColor );
if( rAttr.m_nColor == COL_TRANSPARENT )
{
aCol = lcl_GetAuthorColor(nAuthor);
-
- // See if the redline render mode requires to de-saturize the color of
the text portion.
- if (eRenderMode != SwRedlineRenderMode::Standard)
- {
- sal_uInt16 nHue;
- sal_uInt16 nSaturation;
- sal_uInt16 nBrightness;
- aCol.RGBtoHSB(nHue, nSaturation, nBrightness);
- // 25% saturation: balance between complete gray and
hard-to-notice small difference.
- nSaturation = nSaturation / 4;
- aCol = Color::HSBtoRGB(nHue, nSaturation, nBrightness);
- }
}
bool bBackGr = rAttr.m_nColor == COL_NONE_COLOR;
@@ -556,22 +549,12 @@ static void lcl_FillAuthorAttr( std::size_t nAuthor,
SfxItemSet &rSet,
void SwModule::GetInsertAuthorAttr(std::size_t nAuthor, SfxItemSet &rSet,
SwRedlineRenderMode eRenderMode)
{
- SwRedlineRenderMode eMode = SwRedlineRenderMode::Standard;
- if (eRenderMode == SwRedlineRenderMode::OmitInserts)
- {
- eMode = eRenderMode;
- }
- lcl_FillAuthorAttr(nAuthor, rSet, m_pModuleConfig->GetInsertAuthorAttr(),
eMode);
+ lcl_FillAuthorAttr(nAuthor, rSet, m_pModuleConfig->GetInsertAuthorAttr(),
eRenderMode);
}
void SwModule::GetDeletedAuthorAttr(std::size_t nAuthor, SfxItemSet &rSet,
SwRedlineRenderMode eRenderMode)
{
- SwRedlineRenderMode eMode = SwRedlineRenderMode::Standard;
- if (eRenderMode == SwRedlineRenderMode::OmitDeletes)
- {
- eMode = eRenderMode;
- }
- lcl_FillAuthorAttr(nAuthor, rSet, m_pModuleConfig->GetDeletedAuthorAttr(),
eMode);
+ lcl_FillAuthorAttr(nAuthor, rSet, m_pModuleConfig->GetDeletedAuthorAttr(),
eRenderMode);
}
// For future extension:
commit c5ac5c3e407ee9f18d49fa1a24eca66cf185f8ae
Author: Noel Grandin <[email protected]>
AuthorDate: Wed Jan 14 21:32:03 2026 +0200
Commit: Andras Timar <[email protected]>
CommitDate: Sat Jan 17 15:31:05 2026 +0100
tdf#169934 Transparency is lost when applying a duotone filter
regression from
commit df4873973ed6951ab63c59129226d18055f771fc
Author: Noel Grandin <[email protected]>
Date: Wed Aug 27 20:25:54 2025 +0200
simplify Graphic::applyDuotone
Change-Id: I69a3da35b53355488c2d6a1f1288048d4096bc6c
Reviewed-on: https://gerrit.libreoffice.org/c/core/+/197298
Tested-by: Jenkins
Reviewed-by: Noel Grandin <[email protected]>
(cherry picked from commit 0c1df806d965609b46a0c7cec08752c0234b2538)
Reviewed-on: https://gerrit.libreoffice.org/c/core/+/197313
Reviewed-by: Xisco Fauli <[email protected]>
diff --git a/vcl/source/bitmap/BitmapDuoToneFilter.cxx
b/vcl/source/bitmap/BitmapDuoToneFilter.cxx
index 2dd10459e242..66a4e9ba1037 100644
--- a/vcl/source/bitmap/BitmapDuoToneFilter.cxx
+++ b/vcl/source/bitmap/BitmapDuoToneFilter.cxx
@@ -41,10 +41,12 @@ Bitmap BitmapDuoToneFilter::execute(Bitmap const& rBitmap)
const
BitmapColor aColor = pReadAcc->GetColor(y, x);
sal_uInt8 nLuminance = aColor.GetLuminance();
BitmapColor aResultColor(
+ ColorAlpha,
lcl_getDuotoneColorComponent(nLuminance, aColorOne.GetRed(),
aColorTwo.GetRed()),
lcl_getDuotoneColorComponent(nLuminance, aColorOne.GetGreen(),
aColorTwo.GetGreen()),
- lcl_getDuotoneColorComponent(nLuminance, aColorOne.GetBlue(),
aColorTwo.GetBlue()));
+ lcl_getDuotoneColorComponent(nLuminance, aColorOne.GetBlue(),
aColorTwo.GetBlue()),
+ aColor.GetAlpha());
pWriteAcc->SetPixel(y, x, aResultColor);
}
}
commit 6910fa842f335293b2a27eca11eb69ab4e4c4387
Author: Andras Timar <[email protected]>
AuthorDate: Fri Jan 16 10:05:33 2026 +0100
Commit: Andras Timar <[email protected]>
CommitDate: Sat Jan 17 15:31:05 2026 +0100
[cp] alternative download location for extra Noto fonts
Change-Id: I0dc1cbed8b318c97ae0a991b4bcabecbcc8af27e
diff --git a/Makefile.fetch b/Makefile.fetch
index a2a73635d832..16296c6871bc 100644
--- a/Makefile.fetch
+++ b/Makefile.fetch
@@ -268,7 +268,7 @@ $(WORKDIR)/download: $(BUILDDIR)/config_$(gb_Side).mk
$(SRCDIR)/download.lst $(S
$(call fetch_Optional,NOTO_FONT,FONT_NOTO_SERIF_KR_TARBALL) \
$(call fetch_Optional,NOTO_FONT,FONT_NOTO_SERIF_SC_TARBALL) \
$(call fetch_Optional,NOTO_FONT,FONT_NOTO_SERIF_TC_TARBALL) \
- ,$(call
fetch_Download_item,https://noto-website-2.storage.googleapis.com/pkgs,$(item)))
+ ,$(call
fetch_Download_item,https://github.com/CollaboraOnline/online/releases/download/for-code-assets/,$(item)))
$(foreach item, \
$(call fetch_Optional,MORE_FONTS,FONT_OPENDYSLEXIC_TARBALL) \
,$(call
fetch_Download_item,https://github.com/antijingoist/opendyslexic/releases/download/v0.91.12,$(item)))
commit ca6ba893127ac2f0ce9c91ed89ba5af9f9d5005b
Author: Heiko Tietze <[email protected]>
AuthorDate: Fri Dec 12 14:33:49 2025 +0100
Commit: Andras Timar <[email protected]>
CommitDate: Sat Jan 17 15:31:05 2026 +0100
Resolves tdf#160096 [API CHANGE] - Improve data validity handling
* Introduces a new option ValidationAlertStyle_NONE/SC_VALERR_NONE to
silently reject invalid values
(This is the behavior before c869fb5ea2fa1dbbfa7c17754aeac48ed7f77cc4)
* Sets the disabled state depending on "[ ] Handle invalid values"
(previously "Show Error on loading")
The patch is motivated by bug 159595 respectively the inconsistent
solution. Excel either allows invalid data or shows a message that
allows to change/reject/accept the input. But there is not way to
silently reject invalid data.
The new option does not survive round trips and will be reset to Stop.
Change-Id: I33c965aa7ba999e5850b80d35964b5383928349d
Reviewed-on: https://gerrit.libreoffice.org/c/core/+/195563
Tested-by: Jenkins
Reviewed-by: Heiko Tietze <[email protected]>
Reviewed-on: https://gerrit.libreoffice.org/c/core/+/197362
Tested-by: Gabor Kelemen <[email protected]>
Reviewed-by: Gabor Kelemen <[email protected]>
diff --git a/include/xmloff/xmltoken.hxx b/include/xmloff/xmltoken.hxx
index cd1cb76a3cd7..1a1e23730e8f 100644
--- a/include/xmloff/xmltoken.hxx
+++ b/include/xmloff/xmltoken.hxx
@@ -2313,6 +2313,7 @@ namespace xmloff::token {
XML_NOTIFY_ON_UPDATE_OF_RANGES,
XML_BYTE,
XML_MACRO,
+ XML_REJECT,
XML_LOCATION,
XML_APPLICATION,
XML_SYMBOL_IMAGE,
diff --git a/offapi/com/sun/star/sheet/ValidationAlertStyle.idl
b/offapi/com/sun/star/sheet/ValidationAlertStyle.idl
index a53933d0fae8..5c38c381d79f 100644
--- a/offapi/com/sun/star/sheet/ValidationAlertStyle.idl
+++ b/offapi/com/sun/star/sheet/ValidationAlertStyle.idl
@@ -45,8 +45,13 @@ published enum ValidationAlertStyle
/** macro is executed.
*/
- MACRO
+ MACRO,
+ /** silently reject
+
+ @since LibreOffice 26.2
+ */
+ NONE
};
diff --git a/offapi/type_reference/offapi.idl b/offapi/type_reference/offapi.idl
index 369ca0550221..12302afc524d 100644
--- a/offapi/type_reference/offapi.idl
+++ b/offapi/type_reference/offapi.idl
@@ -13265,7 +13265,8 @@ module com {
STOP = 0,
WARNING = 1,
INFO = 2,
- MACRO = 3
+ MACRO = 3,
+ NONE = 4
};
published enum ValidationType {
ANY = 0,
diff --git a/sc/inc/validat.hxx b/sc/inc/validat.hxx
index b79b294643c9..a56e590a59a0 100644
--- a/sc/inc/validat.hxx
+++ b/sc/inc/validat.hxx
@@ -54,7 +54,8 @@ enum ScValidErrorStyle
SC_VALERR_STOP,
SC_VALERR_WARNING,
SC_VALERR_INFO,
- SC_VALERR_MACRO
+ SC_VALERR_MACRO,
+ SC_VALERR_NONE
};
// Entry for validation (only one condition exists)
@@ -114,6 +115,7 @@ public:
SC_DLLPUBLIC bool GetErrMsg( OUString& rTitle, OUString& rMsg,
ScValidErrorStyle& rStyle ) const;
ScValidationMode GetDataMode() const { return eDataMode; }
+ bool HasErrMsg() const { return bShowError; }
sal_Int16 GetListType() const { return mnListType; }
void SetListType( sal_Int16 nListType ) { mnListType = nListType; }
diff --git a/sc/source/core/data/validat.cxx b/sc/source/core/data/validat.cxx
index 7850c0e52304..1c39f0f5c988 100644
--- a/sc/source/core/data/validat.cxx
+++ b/sc/source/core/data/validat.cxx
@@ -382,7 +382,7 @@ void ScValidationData::DoError(weld::Window* pParent, const
OUString& rInput, co
return;
}
- if (!bShowError) {
+ if (eErrorStyle == SC_VALERR_NONE) {
callback(true);
return;
}
diff --git a/sc/source/filter/xml/XMLStylesExportHelper.cxx
b/sc/source/filter/xml/XMLStylesExportHelper.cxx
index 4daac20f73df..12fafe861c7a 100644
--- a/sc/source/filter/xml/XMLStylesExportHelper.cxx
+++ b/sc/source/filter/xml/XMLStylesExportHelper.cxx
@@ -402,6 +402,12 @@ void ScMyValidationsContainer::WriteValidations(const
ScDocument& rDoc, ScXMLExp
}
}
break;
+ case sheet::ValidationAlertStyle_NONE :
+ {
+ rExport.AddAttribute(XML_NAMESPACE_TABLE,
XML_MESSAGE_TYPE, XML_REJECT);
+ WriteMessage(rExport, "", "",
rValidation.bShowErrorMessage, false);
+ }
+ break;
default:
{
// added to avoid warnings
diff --git a/sc/source/filter/xml/xmlcelli.cxx
b/sc/source/filter/xml/xmlcelli.cxx
index de7a16928f62..5f68c14a2e39 100644
--- a/sc/source/filter/xml/xmlcelli.cxx
+++ b/sc/source/filter/xml/xmlcelli.cxx
@@ -760,6 +760,7 @@ ScValidErrorStyle validAlertToValidError( const
sheet::ValidationAlertStyle eVAl
case sheet::ValidationAlertStyle_STOP: eVErrStyle =
SC_VALERR_STOP; break;
case sheet::ValidationAlertStyle_WARNING: eVErrStyle =
SC_VALERR_WARNING; break;
case sheet::ValidationAlertStyle_MACRO: eVErrStyle =
SC_VALERR_MACRO; break;
+ case sheet::ValidationAlertStyle_NONE: eVErrStyle =
SC_VALERR_NONE; break;
default: eVErrStyle =
SC_VALERR_INFO; break;
//should INFO be the default? seems to be the most unobtrusive choice.
}
diff --git a/sc/source/filter/xml/xmlcvali.cxx
b/sc/source/filter/xml/xmlcvali.cxx
index ec7a1ea70b3d..3a364b4babca 100644
--- a/sc/source/filter/xml/xmlcvali.cxx
+++ b/sc/source/filter/xml/xmlcvali.cxx
@@ -247,6 +247,8 @@ uno::Reference< xml::sax::XFastContextHandler > SAL_CALL
ScXMLContentValidationC
sheet::ValidationAlertStyle ScXMLContentValidationContext::GetAlertStyle()
const
{
+ if (IsXMLToken(sErrorMessageType, XML_REJECT))
+ return sheet::ValidationAlertStyle_NONE;
if (IsXMLToken(sErrorMessageType, XML_MACRO))
return sheet::ValidationAlertStyle_MACRO;
if (IsXMLToken(sErrorMessageType, XML_STOP))
diff --git a/sc/source/ui/app/inputhdl.cxx b/sc/source/ui/app/inputhdl.cxx
index cf7b8d0c8d78..a9c3bb76f500 100644
--- a/sc/source/ui/app/inputhdl.cxx
+++ b/sc/source/ui/app/inputhdl.cxx
@@ -3190,7 +3190,7 @@ void ScInputHandler::EnterHandler( ScEnterMode
nBlockMode, bool bBeforeSavingInL
{
ScDocument& rDoc = pActiveViewSh->GetViewData().GetDocument();
const ScValidationData* pData = rDoc.GetValidationEntry( nValidation );
- if (pData)
+ if (pData && pData->HasErrMsg())
{
// #i67990# don't use pLastPattern in EnterHandler
const ScPatternAttr* pPattern = rDoc.GetPattern( aCursorPos.Col(),
aCursorPos.Row(), aCursorPos.Tab() );
diff --git a/sc/source/ui/dbgui/validate.cxx b/sc/source/ui/dbgui/validate.cxx
index 6632b1be1e39..515a595354a2 100644
--- a/sc/source/ui/dbgui/validate.cxx
+++ b/sc/source/ui/dbgui/validate.cxx
@@ -846,23 +846,24 @@ bool ScTPValidationError::FillItemSet( SfxItemSet*
rArgSet )
IMPL_LINK_NOARG(ScTPValidationError, ToggleErrorMessage, weld::Toggleable&,
void)
{
- bool const bEnable(m_xTsbShow->get_active());
- m_xLbAction->set_sensitive(bEnable);
- m_xEdtTitle->set_sensitive(bEnable);
- m_xEdError->set_sensitive(bEnable);
- m_xFtError->set_sensitive(bEnable);
- m_xFtTitle->set_sensitive(bEnable);
- m_xFtAction->set_sensitive(bEnable);
+ SelectActionHdl(*m_xLbAction);
}
IMPL_LINK_NOARG(ScTPValidationError, SelectActionHdl, weld::ComboBox&, void)
{
+ bool const bEnable(m_xTsbShow->get_active());
+
ScValidErrorStyle eStyle =
static_cast<ScValidErrorStyle>(m_xLbAction->get_active());
bool bMacro = ( eStyle == SC_VALERR_MACRO );
+ bool bNone = ( eStyle == SC_VALERR_NONE );
- m_xBtnSearch->set_sensitive( bMacro );
- m_xFtError->set_sensitive( !bMacro );
- m_xEdError->set_sensitive( !bMacro );
+ m_xFtTitle->set_sensitive( bEnable && !bNone );
+ m_xLbAction->set_sensitive(bEnable);
+ m_xFtAction->set_sensitive(bEnable);
+ m_xEdtTitle->set_sensitive( bEnable && !bNone );
+ m_xBtnSearch->set_sensitive( bEnable && bMacro);
+ m_xFtError->set_sensitive( bEnable && !bMacro && !bNone );
+ m_xEdError->set_sensitive( bEnable && !bMacro && !bNone );
}
IMPL_LINK_NOARG(ScTPValidationError, ClickSearchHdl, weld::Button&, void)
diff --git a/sc/source/ui/unoobj/fmtuno.cxx b/sc/source/ui/unoobj/fmtuno.cxx
index 44b2ad31efd9..e093f73d77df 100644
--- a/sc/source/ui/unoobj/fmtuno.cxx
+++ b/sc/source/ui/unoobj/fmtuno.cxx
@@ -820,6 +820,7 @@ void SAL_CALL ScTableValidationObj::setPropertyValue(
case sheet::ValidationAlertStyle_WARNING: nErrorStyle =
SC_VALERR_WARNING; break;
case sheet::ValidationAlertStyle_INFO: nErrorStyle =
SC_VALERR_INFO; break;
case sheet::ValidationAlertStyle_MACRO: nErrorStyle =
SC_VALERR_MACRO; break;
+ case sheet::ValidationAlertStyle_NONE: nErrorStyle =
SC_VALERR_NONE; break;
default:
{
// added to avoid warnings
@@ -907,6 +908,7 @@ uno::Any SAL_CALL ScTableValidationObj::getPropertyValue(
const OUString& aPrope
case SC_VALERR_WARNING: eStyle =
sheet::ValidationAlertStyle_WARNING; break;
case SC_VALERR_INFO: eStyle = sheet::ValidationAlertStyle_INFO;
break;
case SC_VALERR_MACRO: eStyle =
sheet::ValidationAlertStyle_MACRO; break;
+ case SC_VALERR_NONE: eStyle = sheet::ValidationAlertStyle_NONE;
break;
}
aRet <<= eStyle;
}
diff --git a/sc/uiconfig/scalc/ui/erroralerttabpage.ui
b/sc/uiconfig/scalc/ui/erroralerttabpage.ui
index 586181da461a..8915b71da84d 100644
--- a/sc/uiconfig/scalc/ui/erroralerttabpage.ui
+++ b/sc/uiconfig/scalc/ui/erroralerttabpage.ui
@@ -12,7 +12,7 @@
<property name="spacing">12</property>
<child>
<object class="GtkCheckButton" id="tsbshow">
- <property name="label" translatable="yes"
context="erroralerttabpage|tsbshow">Show error _message when invalid values are
entered</property>
+ <property name="label" translatable="yes"
context="erroralerttabpage|tsbshow">Handle invalid values</property>
<property name="visible">True</property>
<property name="can-focus">True</property>
<property name="receives-default">False</property>
@@ -153,6 +153,7 @@
<item translatable="yes"
context="erroralerttabpage|actionCB">Warning</item>
<item translatable="yes"
context="erroralerttabpage|actionCB">Information</item>
<item translatable="yes"
context="erroralerttabpage|actionCB">Macro</item>
+ <item translatable="yes"
context="erroralerttabpage|actionCB">Reject silently</item>
</items>
<child internal-child="accessible">
<object class="AtkObject" id="actionCB-atkobject">
diff --git a/xmloff/source/core/xmltoken.cxx b/xmloff/source/core/xmltoken.cxx
index f8cfdddf335a..4da955e16d30 100644
--- a/xmloff/source/core/xmltoken.cxx
+++ b/xmloff/source/core/xmltoken.cxx
@@ -2328,6 +2328,7 @@ namespace xmloff::token {
TOKEN( "byte", XML_BYTE ),
TOKEN( "macro", XML_MACRO ),
+ TOKEN( "reject", XML_REJECT ),
TOKEN( "location", XML_LOCATION ),
TOKEN( "application", XML_APPLICATION ),
diff --git a/xmloff/source/token/tokens.txt b/xmloff/source/token/tokens.txt
index 28317a175325..f8e41ff95794 100644
--- a/xmloff/source/token/tokens.txt
+++ b/xmloff/source/token/tokens.txt
@@ -2219,6 +2219,7 @@ horizontal-checkerboard
notify-on-update-of-ranges
byte
macro
+reject
location
application
symbol-image
commit 4c2474e0a8fdcf6e8ff8858f70de3243d26264f5
Author: Christian Lohmaier <[email protected]>
AuthorDate: Thu Jan 15 10:14:54 2026 +0100
Commit: Andras Timar <[email protected]>
CommitDate: Sat Jan 17 15:31:05 2026 +0100
Update git submodules
* Update translations from branch 'distro/collabora/co-26.04'
to c2096e63384deddc3041011624db43a93b58f149
- update translations for 26.2.0 rc2
and force-fix errors using pocheck
Change-Id: Ib53599c98419039a138585ecf5a8a06fa372b69c
(cherry picked from commit 74493d15466a955cf75f5d0766f30a3c9ee80f4e)
diff --git a/translations b/translations
index ddbb80e87b59..c2096e63384d 160000
--- a/translations
+++ b/translations
@@ -1 +1 @@
-Subproject commit ddbb80e87b597375fc0eda328e3666d34a583455
+Subproject commit c2096e63384deddc3041011624db43a93b58f149
commit 3aee74cb31b0ea2fec812a03cf9b92f9c3924bc0
Author: Mike Kaganski <[email protected]>
AuthorDate: Wed Jan 14 08:49:32 2026 +0100
Commit: Andras Timar <[email protected]>
CommitDate: Sat Jan 17 15:31:05 2026 +0100
tdf#170337: find the correct master containing the anchored objects
Was this way since commit f66ac0bacb9a57228dfd3b24b347b985376b63df
(INTEGRATION: CWS swqbugfixes09 (1.67.38); FILE MERGED, 2004-11-16).
Change-Id: I7feeeb2d77849ef626b6ed7ce6385c10cae02c6e
Reviewed-on: https://gerrit.libreoffice.org/c/core/+/197240
Tested-by: Jenkins
Reviewed-by: Mike Kaganski <[email protected]>
Signed-off-by: Xisco Fauli <[email protected]>
Reviewed-on: https://gerrit.libreoffice.org/c/core/+/197251
diff --git a/sw/qa/core/text/frmform.cxx b/sw/qa/core/text/frmform.cxx
index b73497f42b33..3ad8ab305ad1 100644
--- a/sw/qa/core/text/frmform.cxx
+++ b/sw/qa/core/text/frmform.cxx
@@ -148,6 +148,15 @@ CPPUNIT_TEST_FIXTURE(Test, testFloattableBadFlyPos)
CPPUNIT_ASSERT(pPage4);
CPPUNIT_ASSERT(pPage4->GetSortedObjs());
CPPUNIT_ASSERT_EQUAL(static_cast<size_t>(1),
pPage4->GetSortedObjs()->size());
+
+ // tdf#170337: Make sure that page 4's toplevel table has the correct
height (it was 517, not
+ // taking inner floating table height into account):
+ auto pBody = pPage4->FindBodyCont();
+ CPPUNIT_ASSERT(pBody);
+ auto pTable = pBody->GetLower();
+ CPPUNIT_ASSERT(pTable);
+ CPPUNIT_ASSERT(pTable->IsTabFrame());
+ CPPUNIT_ASSERT_EQUAL(tools::Long(3658), pTable->getFrameArea().Height());
}
CPPUNIT_TEST_FIXTURE(Test, testFullPageShapeWrap)
diff --git a/sw/source/core/layout/tabfrm.cxx b/sw/source/core/layout/tabfrm.cxx
index 68a6f688b8c5..eb7d49360c8f 100644
--- a/sw/source/core/layout/tabfrm.cxx
+++ b/sw/source/core/layout/tabfrm.cxx
@@ -4800,7 +4800,7 @@ static tools::Long CalcHeightWithFlys_Impl(const SwFrame*
pTmp, const SwFrame* p
bool bIsFollow( false );
if ( pTmp->IsTextFrame() && static_cast<const
SwTextFrame*>(pTmp)->IsFollow() )
{
- const SwFrame* pMaster;
+ const SwTextFrame* pMaster;
// #i46450# Master does not necessarily have
// to exist if this function is called from JoinFrame() ->
// Cut() -> Shrink()
@@ -4814,6 +4814,11 @@ static tools::Long CalcHeightWithFlys_Impl(const
SwFrame* pTmp, const SwFrame* p
if ( pMaster )
{
+ while (pMaster->IsFollow())
+ {
+ pMaster = pMaster->FindMaster();
+ assert(pMaster);
+ }
pObjs = pMaster->GetDrawObjs();
bIsFollow = true;
}
commit 8019c1556c43ea0957d8f31a81a5f28fba95760b
Author: Mike Kaganski <[email protected]>
AuthorDate: Wed Jan 14 07:09:06 2026 +0100
Commit: Andras Timar <[email protected]>
CommitDate: Sat Jan 17 15:31:05 2026 +0100
pMaster is already the object we need - avoid finding it again
Change-Id: I1d719631053a8335c49cc55e4c98e602732e1117
Reviewed-on: https://gerrit.libreoffice.org/c/core/+/197231
Tested-by: Jenkins
Reviewed-by: Mike Kaganski <[email protected]>
Signed-off-by: Xisco Fauli <[email protected]>
Reviewed-on: https://gerrit.libreoffice.org/c/core/+/197250
diff --git a/sw/source/core/layout/tabfrm.cxx b/sw/source/core/layout/tabfrm.cxx
index bf525e7c313c..68a6f688b8c5 100644
--- a/sw/source/core/layout/tabfrm.cxx
+++ b/sw/source/core/layout/tabfrm.cxx
@@ -4814,7 +4814,7 @@ static tools::Long CalcHeightWithFlys_Impl(const SwFrame*
pTmp, const SwFrame* p
if ( pMaster )
{
- pObjs = static_cast<const
SwTextFrame*>(pTmp)->FindMaster()->GetDrawObjs();
+ pObjs = pMaster->GetDrawObjs();
bIsFollow = true;
}
}
commit fdb011cc1c36bdca3579de08fb8b3a9610cb81a7
Author: Andreas Heinisch <[email protected]>
AuthorDate: Mon Dec 22 09:41:13 2025 +0100
Commit: Andras Timar <[email protected]>
CommitDate: Sat Jan 17 15:31:05 2026 +0100
tdf#112628 - Impress: disable header and footer in master view
Change-Id: Ic3eae2ad1ee204044ec36c83f0541f6ce83d950d
Reviewed-on: https://gerrit.libreoffice.org/c/core/+/196067
Tested-by: Jenkins
Reviewed-by: Andreas Heinisch <[email protected]>
(cherry picked from commit 7ccfa4ea6f8c7215fb065b62f08c7e6cbe553997)
Reviewed-on: https://gerrit.libreoffice.org/c/core/+/196191
Reviewed-by: Xisco Fauli <[email protected]>
diff --git a/sd/source/ui/view/drviews7.cxx b/sd/source/ui/view/drviews7.cxx
index 7c591d45ed67..44009a6ee9f3 100644
--- a/sd/source/ui/view/drviews7.cxx
+++ b/sd/source/ui/view/drviews7.cxx
@@ -868,6 +868,9 @@ void DrawViewShell::GetMenuState( SfxItemSet &rSet )
rSet.Put(SfxBoolItem(SID_PAGEMODE, false));
rSet.Put(SfxBoolItem(SID_MASTERPAGE, true));
+ // tdf#112628 - disable header and footer in master view
+ rSet.DisableItem(SID_HEADER_AND_FOOTER);
+
// tdf#139269 - disable menu entries to paste text into read only
areas of master views
const OutlinerView* pOlView = mpDrawView->GetTextEditOutlinerView();
if (pOlView && pOlView->IsReadOnly())
commit 2039e48eb06daba2dd51333886cbeba4910a3963
Author: Noel Grandin <[email protected]>
AuthorDate: Wed Jan 14 11:07:21 2026 +0200
Commit: Andras Timar <[email protected]>
CommitDate: Sat Jan 17 15:31:05 2026 +0100
officeotron: fillcolor is not valid for framePr
because of some generic code adding attributes to the flyAttrList, we end
with:
<w:pPr>
...
<w:framePr fillcolor="#FF00FF"/>
inside word/header1.xml, which is not valid.
Unfortunately, the code structure here does not allow an elegant solution,
we need a new virtual method to be able to get at the flyAttrList and clear
it,
to prevent attributes leaking into elements they are not meant for.
Change-Id: I2bfd6b1afd78e722a29d79cf853a4678b7d0dea4
Reviewed-on: https://gerrit.libreoffice.org/c/core/+/197248
Tested-by: Jenkins
Reviewed-by: Michael Stahl <[email protected]>
(cherry picked from commit f748949b6ffe6e8ef2a7fd27c70669efe8ac3818)
Reviewed-on: https://gerrit.libreoffice.org/c/core/+/197297
Reviewed-by: Xisco Fauli <[email protected]>
diff --git a/sw/qa/extras/ooxmlexport/ooxmlexport7.cxx
b/sw/qa/extras/ooxmlexport/ooxmlexport7.cxx
index 1e1057be6661..dd7e7b2e6ae8 100644
--- a/sw/qa/extras/ooxmlexport/ooxmlexport7.cxx
+++ b/sw/qa/extras/ooxmlexport/ooxmlexport7.cxx
@@ -667,9 +667,6 @@ DECLARE_OOXMLEXPORT_TEST(testTdf77219_backgroundShape,
"tdf77219_backgroundShape
DECLARE_OOXMLEXPORT_TEST(testTdf126533_axialAngle, "tdf126533_axialAngle.docx")
{
- //FIXME: validation error in OOXML export: Errors: 1
- skipValidation();
-
// axial gradient is purple foreground/lime background in the middle
(top-left to bottom-right)
uno::Reference<beans::XPropertySet>
xPageStyle(getStyles(u"PageStyles"_ustr)->getByName(u"Standard"_ustr),
uno::UNO_QUERY);
@@ -685,8 +682,6 @@ DECLARE_OOXMLEXPORT_TEST(testTdf126533_axialAngle,
"tdf126533_axialAngle.docx")
DECLARE_OOXMLEXPORT_TEST(testTdf126533_axialAngle2,
"tdf126533_axialAngle2.docx")
{
- //FIXME: validation error in OOXML export: Errors: 1
- skipValidation();
// axial gradient is purple foreground/lime background in the middle
(top-right to bottom-left)
uno::Reference<beans::XPropertySet>
xPageStyle(getStyles(u"PageStyles"_ustr)->getByName(u"Standard"_ustr),
uno::UNO_QUERY);
diff --git a/sw/source/filter/ww8/docxexport.cxx
b/sw/source/filter/ww8/docxexport.cxx
index 00d9a1005d8f..7a0b872ebcc1 100644
--- a/sw/source/filter/ww8/docxexport.cxx
+++ b/sw/source/filter/ww8/docxexport.cxx
@@ -740,6 +740,11 @@ void DocxExport::PrepareNewPageDesc( const SfxItemSet*
pSet,
}
+void DocxExport::ClearFlyAttrList()
+{
+ SdrExporter().getFlyAttrList().clear();
+}
+
void DocxExport::InitStyles()
{
m_pStyles.reset(new MSWordStyles( *this, /*bListStyles =*/ true ));
diff --git a/sw/source/filter/ww8/docxexport.hxx
b/sw/source/filter/ww8/docxexport.hxx
index ac5700d77867..a51285b6dab7 100644
--- a/sw/source/filter/ww8/docxexport.hxx
+++ b/sw/source/filter/ww8/docxexport.hxx
@@ -240,6 +240,8 @@ protected:
const SwPageDesc* pNewPgDesc,
bool bExtraPageBreak = false) override;
+ virtual void ClearFlyAttrList() override;
+
private:
/// Setup pStyles and write styles.xml
void InitStyles();
diff --git a/sw/source/filter/ww8/rtfexport.hxx
b/sw/source/filter/ww8/rtfexport.hxx
index 6b285dbab485..2187a789993a 100644
--- a/sw/source/filter/ww8/rtfexport.hxx
+++ b/sw/source/filter/ww8/rtfexport.hxx
@@ -147,6 +147,8 @@ protected:
void AppendSection(const SwPageDesc* pPageDesc, const SwSectionFormat*
pFormat,
sal_uLong nLnNum) override;
+ void ClearFlyAttrList() override {}
+
public:
/// Pass the pDocument, pCurrentPam and pOriginalPam to the base class.
RtfExport(RtfExportFilter* pFilter, SwDoc& rDocument,
std::shared_ptr<SwUnoCursor>& pCurrentPam,
diff --git a/sw/source/filter/ww8/wrtw8sty.cxx
b/sw/source/filter/ww8/wrtw8sty.cxx
index aa25d5945962..2986f84f432f 100644
--- a/sw/source/filter/ww8/wrtw8sty.cxx
+++ b/sw/source/filter/ww8/wrtw8sty.cxx
@@ -1867,6 +1867,7 @@ void MSWordExportBase::SectionProperties( const
WW8_SepInfo& rSepInfo, WW8_PdAtt
}
AttrOutput().OutputStyleItemSet( pPdFormat->GetAttrSet(), false );
+ ClearFlyAttrList(); // so they do not leak into other elements
if (titlePage)
{
diff --git a/sw/source/filter/ww8/wrtww8.hxx b/sw/source/filter/ww8/wrtww8.hxx
index 6aa9cacac1ea..5aa6c208235b 100644
--- a/sw/source/filter/ww8/wrtww8.hxx
+++ b/sw/source/filter/ww8/wrtww8.hxx
@@ -926,6 +926,8 @@ protected:
virtual bool IsDummyFloattableAnchor(SwNode& /*rNode*/) const { return
false; }
+ virtual void ClearFlyAttrList() = 0;
+
public:
MSWordExportBase(SwDoc& rDocument, std::shared_ptr<SwUnoCursor> &
pCurrentPam, SwPaM* pOriginalPam);
virtual ~MSWordExportBase();
@@ -1225,6 +1227,8 @@ protected:
virtual void AppendSection( const SwPageDesc *pPageDesc, const
SwSectionFormat* pFormat, sal_uLong nLnNum ) override;
+ virtual void ClearFlyAttrList() override {}
+
private:
WW8Export(const WW8Export&) = delete;
WW8Export& operator=(const WW8Export&) = delete;
commit b82385f8ab48a6841f6a76ed2ce76707d444ba20
Author: Caolán McNamara <[email protected]>
AuthorDate: Wed Jan 14 19:12:48 2026 +0000
Commit: Andras Timar <[email protected]>
CommitDate: Sat Jan 17 15:31:05 2026 +0100
add a11y name to preview widget
Change-Id: Ic04f7bac3e4eb62c7735d6e8e7bd611de915f240
Reviewed-on: https://gerrit.libreoffice.org/c/core/+/197295
Tested-by: Jenkins
Reviewed-by: Caolán McNamara <[email protected]>
(cherry picked from commit 62a3e245ff9f10b9824cf9dca644894c34c83adb)
Reviewed-on: https://gerrit.libreoffice.org/c/core/+/197301
Reviewed-by: Xisco Fauli <[email protected]>
diff --git a/sw/uiconfig/swriter/ui/outlinepositionpage.ui
b/sw/uiconfig/swriter/ui/outlinepositionpage.ui
index cfd8a8deb35e..15a534838ceb 100644
--- a/sw/uiconfig/swriter/ui/outlinepositionpage.ui
+++ b/sw/uiconfig/swriter/ui/outlinepositionpage.ui
@@ -516,6 +516,11 @@ numbering and text:</property>
<property name="height_request">130</property>
<property name="visible">True</property>
<property name="can_focus">False</property>
+ <child internal-child="accessible">
+ <object class="AtkObject" id="preview-atkobject">
+ <property name="AtkObject::accessible-name"
translatable="yes"
context="outlinepositionpage|preview-atkobject">Preview</property>
+ </object>
+ </child>
</object>
<packing>
<property name="left_attach">0</property>
commit c30962d30f8e61ecbd945b8c7f0273e81721c105
Author: Aron Budea <[email protected]>
AuthorDate: Mon Jan 12 15:04:20 2026 +1030
Commit: Andras Timar <[email protected]>
CommitDate: Sat Jan 17 15:31:05 2026 +0100
tdf#162527 tdf#169802 hidden image/shape in DOCX should be invisible
...and remain invisible after save.
After 0b9e4f6085d147c43a86d107303eea9b86e7f34c shapes did get
hidden, but in case of wrap-around shapes text still flowed
around their supposed placement.
Hidden images were simply shown before and after.
Add a new Visible property to SwXTextGraphicObject, and let
it set SwFlyDrawObj's Visible member as SdrObject.
Import and export wp:docPr's hidden attribute in OOXML based
on these properties.
To avoid showing their area, let
SwAnchoredObject::GetObjRectWithSpaces() return an empty
rectangle (during opening this is only called from
SwTextFly's IsAnyObj(...) and InitAnchoredObjList(), though).
Note that Writer lacks support of changing visibility of
images and shapes. This change adds minimal support for
hiding them and roundtripping the setting in DOCX, but
doesn't add ODF or UI support.
Change-Id: I6e9d062628006a7128e380d1af06508625aa3d06
Reviewed-on: https://gerrit.libreoffice.org/c/core/+/197056
Tested-by: Jenkins
Reviewed-by: Aron Budea <[email protected]>
(cherry picked from commit c1f7ea0db134d63c54b581f11e843ebd5bb83b54)
Reviewed-on: https://gerrit.libreoffice.org/c/core/+/197286
Reviewed-by: Mike Kaganski <[email protected]>
diff --git a/offapi/com/sun/star/text/TextGraphicObject.idl
b/offapi/com/sun/star/text/TextGraphicObject.idl
index 423a41778992..7a425f70ea27 100644
--- a/offapi/com/sun/star/text/TextGraphicObject.idl
+++ b/offapi/com/sun/star/text/TextGraphicObject.idl
@@ -123,6 +123,11 @@ published service TextGraphicObject
*/
[optional, property] com::sun::star::graphic::XGraphic Graphic;
+ /** if this is `FALSE`, the graphic is not visible.
+
+ @since LibreOffice 26.2
+ */
+ [ optional, property ] boolean Visible;
};
diff --git a/sw/inc/hintids.hxx b/sw/inc/hintids.hxx
index 39676270559c..423dafdcea08 100644
--- a/sw/inc/hintids.hxx
+++ b/sw/inc/hintids.hxx
@@ -411,8 +411,8 @@ inline constexpr TypedWhichId<SwGammaGrf>
RES_GRFATR_GAMMA(RES_GRFATR_BEGIN + 8)
inline constexpr TypedWhichId<SwInvertGrf> RES_GRFATR_INVERT(RES_GRFATR_BEGIN
+ 9);
inline constexpr TypedWhichId<SwTransparencyGrf>
RES_GRFATR_TRANSPARENCY(RES_GRFATR_BEGIN + 10);
inline constexpr TypedWhichId<SwDrawModeGrf>
RES_GRFATR_DRAWMODE(RES_GRFATR_BEGIN + 11);
+inline constexpr TypedWhichId<SfxBoolItem> RES_GRFATR_VISIBLE(RES_GRFATR_BEGIN
+ 12);
-inline constexpr TypedWhichId<SfxBoolItem> RES_GRFATR_DUMMY4(RES_GRFATR_BEGIN
+ 12);
inline constexpr TypedWhichId<SfxBoolItem> RES_GRFATR_DUMMY5(RES_GRFATR_BEGIN
+ 13);
inline constexpr sal_uInt16 RES_GRFATR_END(RES_GRFATR_BEGIN + 14);
diff --git a/sw/inc/unoprnms.hxx b/sw/inc/unoprnms.hxx
index 27981e05db01..e4b865b3f6de 100644
--- a/sw/inc/unoprnms.hxx
+++ b/sw/inc/unoprnms.hxx
@@ -601,6 +601,7 @@ inline constexpr OUString UNO_NAME_ADJUST_BLUE =
u"AdjustBlue"_ustr;
inline constexpr OUString UNO_NAME_GAMMA = u"Gamma"_ustr;
inline constexpr OUString UNO_NAME_GRAPHIC_IS_INVERTED =
u"GraphicIsInverted"_ustr;
inline constexpr OUString UNO_NAME_TRANSPARENCY = u"Transparency"_ustr;
+inline constexpr OUString UNO_NAME_VISIBLE = u"Visible"_ustr;
inline constexpr OUString UNO_NAME_REDLINE_AUTHOR = u"RedlineAuthor"_ustr;
inline constexpr OUString UNO_NAME_REDLINE_DATE_TIME = u"RedlineDateTime"_ustr;
inline constexpr OUString UNO_NAME_REDLINE_MOVED_ID = u"RedlineMovedID"_ustr;
diff --git a/sw/qa/extras/ooxmlexport/data/tdf162527_hidden_image.docx
b/sw/qa/extras/ooxmlexport/data/tdf162527_hidden_image.docx
new file mode 100644
index 000000000000..5196bd67d772
Binary files /dev/null and
b/sw/qa/extras/ooxmlexport/data/tdf162527_hidden_image.docx differ
diff --git a/sw/qa/extras/ooxmlexport/data/tdf169802_hidden_shape.docx
b/sw/qa/extras/ooxmlexport/data/tdf169802_hidden_shape.docx
new file mode 100644
index 000000000000..b72fab170a69
Binary files /dev/null and
b/sw/qa/extras/ooxmlexport/data/tdf169802_hidden_shape.docx differ
diff --git a/sw/qa/extras/ooxmlexport/ooxmlexport13.cxx
b/sw/qa/extras/ooxmlexport/ooxmlexport13.cxx
index bf8776fc6c41..43c16d0c912d 100644
--- a/sw/qa/extras/ooxmlexport/ooxmlexport13.cxx
+++ b/sw/qa/extras/ooxmlexport/ooxmlexport13.cxx
@@ -724,6 +724,34 @@ DECLARE_OOXMLEXPORT_TEST(testTdf156484, "tdf156484.docx")
CPPUNIT_ASSERT_MESSAGE("Third shape should not be printable.",
!getProperty<bool>(xShape, u"Printable"_ustr));
}
+CPPUNIT_TEST_FIXTURE(Test, testTdf162527_hidden_image)
+{
+ createSwDoc("tdf162527_hidden_image.docx");
+ save(TestFilter::DOCX);
+
+ xmlDocUniquePtr pXmlDoc = parseExport(u"word/document.xml"_ustr);
+ CPPUNIT_ASSERT(pXmlDoc);
+ // Without the fix this element would have no 'hidden' attribute
+ assertXPath(pXmlDoc,
"/w:document/w:body/w:p/w:r/w:drawing/wp:anchor/wp:docPr", "hidden",
+ u"1");
+
+ auto xShape(getShape(1));
+ CPPUNIT_ASSERT_MESSAGE("Shape should not be visible.",
+ !getProperty<bool>(xShape, u"Visible"_ustr));
+}
+
+CPPUNIT_TEST_FIXTURE(Test, testTdf169802_hidden_shape)
+{
+ createSwDoc("tdf169802_hidden_shape.docx");
+ xmlDocUniquePtr pDump = parseLayoutDump();
+ // Just to check that the layout has sane content
+ int nTextNodes = countXPathNodes(pDump, "//*[contains(@type,
'PortionType::Text')]");
+ CPPUNIT_ASSERT_MESSAGE("Layout must contain text nodes", 0 < nTextNodes);
+ // Layout mustn't contain fly portion, without the fix it would contain
several
+ int nFlyNodes = countXPathNodes(pDump, "//*[contains(@type,
'PortionType::Fly')]");
+ CPPUNIT_ASSERT_EQUAL_MESSAGE("No fly portion nodes must exist in the
layout", 0, nFlyNodes);
+}
+
DECLARE_OOXMLEXPORT_TEST(testTdf124594, "tdf124594.docx")
{
xmlDocUniquePtr pDump = parseLayoutDump();
diff --git a/sw/source/core/bastyp/init.cxx b/sw/source/core/bastyp/init.cxx
index bfc29059a774..cb2471ca3683 100644
--- a/sw/source/core/bastyp/init.cxx
+++ b/sw/source/core/bastyp/init.cxx
@@ -454,9 +454,9 @@ std::unique_ptr<ItemInfoPackage>
createItemInfoPackageSwAttributes()
{ RES_GRFATR_INVERT, new SwInvertGrf, 0, SFX_ITEMINFOFLAG_NONE },
{ RES_GRFATR_TRANSPARENCY, new SwTransparencyGrf, 0,
SFX_ITEMINFOFLAG_NONE },
{ RES_GRFATR_DRAWMODE, new SwDrawModeGrf, 0, SFX_ITEMINFOFLAG_NONE
},
+ { RES_GRFATR_VISIBLE, new SfxBoolItem(RES_GRFATR_VISIBLE, true),
0, SFX_ITEMINFOFLAG_NONE },
// GraphicAttr - Dummies
- { RES_GRFATR_DUMMY4, new SfxBoolItem( RES_GRFATR_DUMMY4 ), 0,
SFX_ITEMINFOFLAG_NONE },
{ RES_GRFATR_DUMMY5, new SfxBoolItem( RES_GRFATR_DUMMY5 ), 0,
SFX_ITEMINFOFLAG_NONE },
{ RES_BOXATR_FORMAT, new SwTableBoxNumFormat, 0,
SFX_ITEMINFOFLAG_NONE },
{ RES_BOXATR_FORMULA, new SwTableBoxFormula( OUString() ), 0,
SFX_ITEMINFOFLAG_NONE },
diff --git a/sw/source/core/layout/anchoredobject.cxx
b/sw/source/core/layout/anchoredobject.cxx
index c8c418fa310f..39429e8b209f 100644
--- a/sw/source/core/layout/anchoredobject.cxx
+++ b/sw/source/core/layout/anchoredobject.cxx
@@ -564,6 +564,11 @@ bool SwAnchoredObject::HasClearedEnvironment() const
*/
const SwRect& SwAnchoredObject::GetObjRectWithSpaces() const
{
+ static const SwRect aEmptyRect;
+ // invisible objects have no area
-e
... etc. - the rest is truncated