.gitreview | 2 configure.ac | 2 dev/null |binary dictionaries | 2 download.lst | 4 editeng/source/editeng/editattr.cxx | 2 editeng/source/editeng/editdoc.cxx | 7 editeng/source/uno/unotext.cxx | 5 helpcontent2 | 2 include/oox/drawingml/shape.hxx | 3 include/oox/ppt/presentationfragmenthandler.hxx | 8 include/test/unoapi_test.hxx | 3 oox/source/drawingml/shape.cxx | 2 oox/source/drawingml/shapecontext.cxx | 2 oox/source/ppt/pptshape.cxx | 4 oox/source/ppt/presentationfragmenthandler.cxx | 48 ++- sc/qa/unit/subsequent_export_test.cxx | 31 ++ sc/qa/unit/subsequent_export_test2.cxx | 10 sc/qa/unit/uicalc/data/tdf157897_linked.ods |binary sc/qa/unit/uicalc/data/tdf157897_main.ods |binary sc/qa/unit/uicalc/uicalc.cxx | 19 + sc/source/core/data/documen2.cxx | 2 sc/source/filter/excel/xecontent.cxx | 17 + sc/source/filter/inc/orcusinterface.hxx | 3 sc/source/filter/orcus/interface.cxx | 15 + sc/source/ui/view/tabview.cxx | 3 sd/qa/unit/data/pptx/master-slides.pptx |binary sd/qa/unit/export-tests-ooxml2.cxx | 6 sd/qa/unit/export-tests-ooxml3.cxx | 4 sd/qa/unit/import-tests2.cxx | 21 - sd/source/filter/eppt/epptooxml.hxx | 4 sd/source/filter/eppt/pptx-epptooxml.cxx | 128 +++++++++- sd/source/ui/inc/unopage.hxx | 1 sd/source/ui/unoidl/unopage.cxx | 13 - sdext/source/pdfimport/pdfparse/pdfparse.cxx | 95 ------- solenv/bin/macosx-codesign-app-bundle | 6 starmath/source/view.cxx | 2 svtools/source/control/tabbar.cxx | 4 svx/source/svdraw/svdhdl.cxx | 2 sw/qa/extras/uiwriter/data/tdf130088.docx |binary sw/qa/extras/uiwriter/uiwriter6.cxx | 96 +++++++ sw/source/core/doc/DocumentContentOperationsManager.cxx | 38 ++ sw/source/core/objectpositioning/tocntntanchoredobjectposition.cxx | 7 sw/source/core/text/EnhancedPDFExportHelper.cxx | 3 sw/source/core/text/frmpaint.cxx | 4 sw/source/core/text/itrpaint.cxx | 30 +- sw/source/core/txtnode/txtedt.cxx | 9 sysui/desktop/macosx/sandbox_inherit.entitlements | 10 test/source/unoapi_test.cxx | 18 + tools/qa/cppunit/test_urlobj.cxx | 20 + tools/source/fsys/urlobj.cxx | 94 ++++++- translations | 2 vcl/qa/cppunit/pdfexport/data/LO_Lbl_Lbody_bug_report.fodt | 125 +++++++++ vcl/qa/cppunit/pdfexport/data/tdf157679.pptx |binary vcl/qa/cppunit/pdfexport/pdfexport.cxx | 106 ++++++++ 55 files changed, 851 insertions(+), 193 deletions(-)
New commits: commit 7f61102f02cd53276d15d7f3d80a291fd9ce48e4 Author: Christian Lohmaier <lohmaier+libreoff...@googlemail.com> AuthorDate: Thu Nov 2 22:37:40 2023 +0100 Commit: Christian Lohmaier <lohmaier+libreoff...@googlemail.com> CommitDate: Thu Nov 2 22:37:40 2023 +0100 bump product version to 7.6.3.1.0+ Change-Id: I920b03d7a7548d1e232055eb0ddb4346336e1a9e diff --git a/configure.ac b/configure.ac index 594282928535..6d59be2d2683 100644 --- a/configure.ac +++ b/configure.ac @@ -9,7 +9,7 @@ dnl in order to create a configure script. # several non-alphanumeric characters, those are split off and used only for the # ABOUTBOXPRODUCTVERSIONSUFFIX in openoffice.lst. Why that is necessary, no idea. -AC_INIT([LibreOffice],[7.6.3.0.0+],[],[],[http://documentfoundation.org/]) +AC_INIT([LibreOffice],[7.6.3.1.0+],[],[],[http://documentfoundation.org/]) dnl libnumbertext needs autoconf 2.68, but that can pick up autoconf268 just fine if it is installed dnl whereas aclocal (as run by autogen.sh) insists on using autoconf and fails hard commit 1fd37070c8f33facd48ba1d50c519d619da94701 Author: Christian Lohmaier <lohmaier+libreoff...@googlemail.com> AuthorDate: Thu Nov 2 22:35:15 2023 +0100 Commit: Christian Lohmaier <lohmaier+libreoff...@googlemail.com> CommitDate: Thu Nov 2 22:35:15 2023 +0100 Branch libreoffice-7-6-3 This is 'libreoffice-7-6-3' - the stable branch for the 7.6.3 release. Only very safe changes, reviewed by three people are allowed. If you want to commit more complicated fix for the next 7.6.x release, please use the 'libreoffice-7-6' branch. If you want to build something cool, unstable, and risky, use master. diff --git a/.gitreview b/.gitreview index 4abdc9f5827b..79f2270aa337 100644 --- a/.gitreview +++ b/.gitreview @@ -3,5 +3,5 @@ host=gerrit.libreoffice.org port=29418 project=core defaultremote=logerrit -defaultbranch=libreoffice-7-6 +defaultbranch=libreoffice-7-6-3 diff --git a/dictionaries b/dictionaries index d23d4741599e..7b19444059e3 160000 --- a/dictionaries +++ b/dictionaries @@ -1 +1 @@ -Subproject commit d23d4741599e60dec191ec7f5e6bfa54ac91a4c5 +Subproject commit 7b19444059e3bc18cd373054b6fc79c41f901b97 diff --git a/helpcontent2 b/helpcontent2 index 4f4db70a6755..007977e192a7 160000 --- a/helpcontent2 +++ b/helpcontent2 @@ -1 +1 @@ -Subproject commit 4f4db70a67558885482ba33892910f8123f00c03 +Subproject commit 007977e192a797baf207f429785b9dda21b0d17b diff --git a/translations b/translations index 79b4d68722bb..e1f230bfd229 160000 --- a/translations +++ b/translations @@ -1 +1 @@ -Subproject commit 79b4d68722bbc96577c3c283a7596b0a16fae7e8 +Subproject commit e1f230bfd22970ab42c5ab3745c1a461194e608a commit 10250f7b38a60aceeea125239f5cec4d98beb0b8 Author: Caolán McNamara <caolan.mcnam...@collabora.com> AuthorDate: Thu Nov 2 12:18:05 2023 +0000 Commit: Xisco Fauli <xiscofa...@libreoffice.org> CommitDate: Thu Nov 2 20:52:04 2023 +0100 crash seen in EditView::GetTransferable in calc if (pColor->getComplexColor().getType() == model::ColorType::Unused) (gdb) print pColor $10 = <optimized out> but: (gdb) print *pSet $12 = {_vptr.SfxItemSet = 0x7f7cd56f3198 <vtable for SfxItemSet+16>, m_pPool = 0x31e7d880, m_pParent = 0x0, m_ppItems = 0x33ecece0, m_pWhichRanges = { m_pairs = 0x7f7cd47b2480 <svl::Items_t<(unsigned short)4008, (unsigned short)4064>::value>, m_size = 1, m_bOwnRanges = false}, m_nCount = 1, m_bItemsFixed = false} (gdb) print *(pSet->m_ppItems) $11 = (const SfxPoolItem *) 0x0 so, apparent null deref of pColor #0 SvxUnoTextRangeBase::_getOnePropertyStates (pSet=0x7ffe47b3ded0, pMap=0x7f7cd5a50600 <ImplGetSvxTextPortionPropertyMap()::aSvxTextPortionPropertyMap+384>, rState=@0x38ae2d4c: com::sun::star::beans::PropertyState::PropertyState_DIRECT_VALUE) at editeng/source/uno/unotext.cxx:1179 #1 0x00007f7cd1e6f5be in SvxUnoTextRangeBase::_getPropertyStates (this=0x3543bc00, PropertyName=..., nPara=nPara@entry=-1) at editeng/source/uno/unotext.cxx:1057 #2 0x00007f7cd1e6fa12 in SvxUnoTextRangeBase::getPropertyStates (this=<optimized out>, aPropertyName=...) at editeng/source/uno/unotext.cxx:1031 #3 0x00007f7cd41e723b in (anonymous namespace)::FilterPropertiesInfo_Impl::FillPropertyStateArray (this=this@entry=0x32e94820, rPropStates=std::vector of length 0, capacity 0, rPropSet=..., rPropMapper=..., bDefault=bDefault@entry=false, pOnlyTheseProps=pOnlyTheseProps@entry=0x0) at xmloff/source/style/xmlexppr.cxx:327 #4 0x00007f7cd41e9230 in SvXMLExportPropertyMapper::Filter_ (this=this@entry=0x34dc72a0, rExport=..., xPropSet=..., bDefault=bDefault@entry=false, bEnableFoFontFamily=bEnableFoFontFamily@entry=false, pOnlyTheseProps=0x0) at xmloff/source/style/xmlexppr.cxx:651 #5 0x00007f7cd41ea026 in SvXMLExportPropertyMapper::Filter (this=this@entry=0x34dc72a0, rExport=..., rPropSet=..., bEnableFoFontFamily=bEnableFoFontFamily@entry=false, pOnlyTheseProps=pOnlyTheseProps@entry=0x0) at xmloff/source/style/xmlexppr.cxx:526 #6 0x00007f7cd42dbbcd in XMLTextParagraphExport::Add (this=this@entry=0x37110830, nFamily=nFamily@entry=XmlStyleFamily::TEXT_TEXT, rPropSet=..., aAddStates=..., bDontSeek=bDontSeek@entry=false) at xmloff/source/text/txtparae.cxx:685 #7 0x00007f7cd42dd09f in XMLTextParagraphExport::exportTextRange (this=this@entry=0x37110830, rTextRange=..., bAutoStyles=bAutoStyles@entry=true, rPrevCharIsSpace=@0x7ffe47b3eef0: true, openFieldMark=@0x7ffe47b3ec34: XMLTextParagraphExport::NONE) at xmloff/source/text/txtparae.cxx:3731 #8 0x00007f7cd42e57df in XMLTextParagraphExport::exportTextRangeEnumeration (this=this@entry=0x37110830, rTextEnum=..., bAutoStyles=bAutoStyles@entry=true, bIsProgress=bIsProgress@entry=false, rPrevCharIsSpace=@0x7ffe47b3eef0: true) at xmloff/source/text/txtparae.cxx:2438 #9 0x00007f7cd42ea746 in XMLTextParagraphExport::exportParagraph (this=this@entry=0x37110830, rTextContent=..., bAutoStyles=bAutoStyles@entry=true, bIsProgress=bIsProgress@entry=false, bExportParagraph=bExportParagraph@entry=true, rPropSetHelper=..., eExtensionNS=<optimized out>) at xmloff/source/text/txtparae.cxx:2378 #10 0x00007f7cd42e0634 in XMLTextParagraphExport::exportTextContentEnumeration (this=this@entry=0x37110830, rContEnum=..., bAutoStyles=bAutoStyles@entry=true, rBaseSection=..., bIsProgress=bIsProgress@entry=false, bExportParagraph=bExportParagraph@entry=true, pRangePropSet=<optimized out>, eExtensionNS=<optimized out>) at xmloff/source/text/txtparae.cxx:2008 #11 0x00007f7cd42e113a in XMLTextParagraphExport::exportText (this=this@entry=0x37110830, rText=..., bAutoStyles=bAutoStyles@entry=true, bIsProgress=bIsProgress@entry=false, bExportParagraph=bExportParagraph@entry=true, eExtensionNS=eExtensionNS@entry=TextPNS::ODF) at xmloff/source/text/txtparae.cxx:1762 #12 0x00007f7cd1e78669 in XMLTextParagraphExport::collectTextAutoStyles (bExportParagraph=true, bIsProgress=false, rText=..., this=<optimized out>) at include/xmloff/txtparae.hxx:459 #13 (anonymous namespace)::SvxXMLTextExportComponent::ExportAutoStyles_ (this=0x7f7cb4522930) at editeng/source/xml/xmltxtexp.cxx:341 #14 0x00007f7cd406121c in SvXMLExport::ImplExportAutoStyles (this=this@entry=0x7f7cb4522930) at xmloff/source/core/xmlexp.cxx:1127 #15 0x00007f7cd40645f5 in SvXMLExport::exportDoc (this=0x7f7cb4522930, eClass=<optimized out>) at xmloff/source/core/xmlexp.cxx:1380 #16 0x00007f7cd1e78d64 in SvxWriteXML (rEditEngine=..., rStream=..., rSel=...) at editeng/source/xml/xmltxtexp.cxx:321 #17 0x00007f7cd1da1d0c in ImpEditEngine::WriteXML (this=this@entry=0x34f87990, rOutput=..., rSel=...) at editeng/source/editeng/impedit4.cxx:270 #18 0x00007f7cd1d88881 in ImpEditEngine::CreateTransferable (this=0x34f87990, rSelection=...) at editeng/source/editeng/impedit2.cxx:3843 #19 0x00007f7cd1d4c091 in EditEngine::CreateTransferable (this=<optimized out>, rSelection=...) at editeng/source/editeng/editeng.cxx:816 #20 0x00007f7cd1d5c91a in EditView::GetTransferable (this=0x33eb8190) at editeng/source/editeng/editview.cxx:662 #21 0x00007f7cc2c03eac in ScModelObj::getSelection (this=<optimized out>) at sc/source/ui/unoobj/docuno.cxx:904 Change-Id: Idb8cbbebe02188678f9c1b17e80cf89feffa9de8 Reviewed-on: https://gerrit.libreoffice.org/c/core/+/158803 Tested-by: Caolán McNamara <caolan.mcnam...@collabora.com> Reviewed-by: Caolán McNamara <caolan.mcnam...@collabora.com> (cherry picked from commit b50681f8da6fbc57db07d488c6e76e33fcd59147) Reviewed-on: https://gerrit.libreoffice.org/c/core/+/158818 Tested-by: Jenkins Reviewed-by: Xisco Fauli <xiscofa...@libreoffice.org> diff --git a/editeng/source/uno/unotext.cxx b/editeng/source/uno/unotext.cxx index 1eb84a177f44..c63573d6082f 100644 --- a/editeng/source/uno/unotext.cxx +++ b/editeng/source/uno/unotext.cxx @@ -1140,6 +1140,11 @@ bool SvxUnoTextRangeBase::_getOnePropertyStates(const SfxItemSet* pSet, const Sf // Theme & effects can be DEFAULT_VALUE, even if the same pool item has a color // which is a DIRECT_VALUE. const SvxColorItem* pColor = pSet->GetItem<SvxColorItem>(EE_CHAR_COLOR); + if (!pColor) + { + SAL_WARN("editeng", "Missing EE_CHAR_COLOR SvxColorItem"); + return false; + } switch (pMap->nMemberId) { case MID_COLOR_THEME_INDEX: commit 20d372fd9adfcbb9753704f86d8f19d5bc754480 Author: Christian Lohmaier <lohmaier+libreoff...@googlemail.com> AuthorDate: Thu Nov 2 18:43:38 2023 +0100 Commit: Gerrit Code Review <ger...@gerrit.libreoffice.org> CommitDate: Thu Nov 2 18:43:38 2023 +0100 Update git submodules * Update translations from branch 'libreoffice-7-6' to 79b4d68722bbc96577c3c283a7596b0a16fae7e8 - update translations for 7.6.3 rc1 and force-fix errors using pocheck Change-Id: If06745b1a92f507188f406e4274849e9b4838ef1 diff --git a/translations b/translations index 65b5e61a925a..79b4d68722bb 160000 --- a/translations +++ b/translations @@ -1 +1 @@ -Subproject commit 65b5e61a925a093ecf2e553c09677ce3fca03e13 +Subproject commit 79b4d68722bbc96577c3c283a7596b0a16fae7e8 commit ef26985c45aa1ce9d205fbe5afba6717450b3961 Author: Christian Lohmaier <lohmaier+libreoff...@googlemail.com> AuthorDate: Thu Nov 2 10:30:34 2023 +0100 Commit: Michael Weghorn <m.wegh...@posteo.de> CommitDate: Thu Nov 2 16:31:30 2023 +0100 tdf#158038 fix opening pdf files in appstore ver (sandbox issue w/ helper tool) https://developer.apple.com/documentation/xcode/embedding-a-helper-tool-in-a-sandboxed-app "Adding other entitlements to the tool can cause problems. If the tool immediately crashes with a code signing error when your app runs the tool, check that the tool is signed with just these two entitlements: com.apple.security.app-sandbox and com.apple.security.inherit." This is indeed what happened.. Change-Id: Id03948c03b7d453aae4ca58719f582576e30a16f Reviewed-on: https://gerrit.libreoffice.org/c/core/+/158790 Tested-by: Christian Lohmaier <lohmaier+libreoff...@googlemail.com> Reviewed-by: Christian Lohmaier <lohmaier+libreoff...@googlemail.com> (cherry picked from commit 2c3fe12e0ffc59be7c28d9b9908db881adb0f1ea) Reviewed-on: https://gerrit.libreoffice.org/c/core/+/158708 Reviewed-by: Michael Stahl <michael.st...@allotropia.de> Tested-by: Jenkins diff --git a/solenv/bin/macosx-codesign-app-bundle b/solenv/bin/macosx-codesign-app-bundle index cdbf7ce964ae..695b3ae97922 100755 --- a/solenv/bin/macosx-codesign-app-bundle +++ b/solenv/bin/macosx-codesign-app-bundle @@ -24,10 +24,13 @@ done APP_BUNDLE="$1" entitlements= +entitlements_helper= application_identifier= if test -n "$ENABLE_MACOSX_SANDBOX"; then # In a sandboxed build executables need the entitlements entitlements="--entitlements $BUILDDIR/lo.xcent" + # helper utilities must be signed with only the sandbox and inherit entitlements + entitlements_helper="--entitlements $SRCDIR/sysui/desktop/macosx/sandbox_inherit.entitlements" application_identifier=`/usr/libexec/PlistBuddy -c "print com.apple.application-identifier" $BUILDDIR/lo.xcent` # remove the key from the entitlement - only use it when signing the whole bundle in the final step /usr/libexec/PlistBuddy -c "delete com.apple.application-identifier" $BUILDDIR/lo.xcent @@ -39,6 +42,7 @@ if test -n "$ENABLE_MACOSX_SANDBOX"; then else # We then want to sign data files, too, hmm. entitlements="--entitlements $BUILDDIR/hardened_runtime.xcent" + entitlements_helper=$entitlements other_files="\ -or -name '*.fodt' -or -name 'schema.strings' -or -name 'schema.xml' \ -or -name '*.jar' -or -name 'LICENSE' -or -name 'LICENSE.html' \ @@ -127,7 +131,7 @@ while read file; do ;; *) id=`echo ${file#${APP_BUNDLE}/Contents/} | sed -e 's,/,.,g'` - codesign --force --timestamp --options=runtime --identifier=$MACOSX_BUNDLE_IDENTIFIER.$id --sign "$MACOSX_CODESIGNING_IDENTITY" $entitlements "$file" || exit 1 + codesign --force --timestamp --options=runtime --identifier=$MACOSX_BUNDLE_IDENTIFIER.$id --sign "$MACOSX_CODESIGNING_IDENTITY" $entitlements_helper "$file" || exit 1 ;; esac done diff --git a/sysui/desktop/macosx/sandbox_inherit.entitlements b/sysui/desktop/macosx/sandbox_inherit.entitlements new file mode 100644 index 000000000000..794eada1cad3 --- /dev/null +++ b/sysui/desktop/macosx/sandbox_inherit.entitlements @@ -0,0 +1,10 @@ +<?xml version="1.0" encoding="UTF-8"?> +<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd"> +<plist version="1.0"> +<dict> + <key>com.apple.security.app-sandbox</key> + <true/> + <key>com.apple.security.inherit</key> + <true/> +</dict> +</plist> commit 46bbc6ff0f99f664ec4957cd29943b0627cbf2ba Author: Michael Weghorn <m.wegh...@posteo.de> AuthorDate: Thu Oct 12 18:57:57 2023 +0200 Commit: Xisco Fauli <xiscofa...@libreoffice.org> CommitDate: Thu Nov 2 11:12:28 2023 +0100 tdf#141828 svx: Use pointing hand for custom shape handles Use the *pointing* hand cursor (`PointerStyle::RefHand`) instead of the hand symbol cursor (`PointerStyle::Hand`) for handles for custom shape interaction. (S. how `SdrHdlKind::CustomShape1` is only specified in `SdrObjCustomShape::AddToHdlList`, except for read-only switch/cases elsewhere). As mentioned in tdf#141828, this has the advantage that the user can see where the handle is being moved. For gtk3, this doesn't make any difference in practice, because it's using the same cursor type for both, `PointerStyle::RefHand` and `PointerStyle::Hand` (s. `GtkSalDisplay::getCursor`, but the Qt-based VCL plugins (`QtData::getCursor`) and macOS (s. `AquaSalFrame::getCurrentCursor`) make a distinction between them. Change-Id: I5d35481e5c5edc1895a7c4a973315ee6b187b983 Reviewed-on: https://gerrit.libreoffice.org/c/core/+/157891 Tested-by: Jenkins Reviewed-by: Michael Weghorn <m.wegh...@posteo.de> (cherry picked from commit 3d1cd490ac0366245c4b55d711611c21149a76e9) Reviewed-on: https://gerrit.libreoffice.org/c/core/+/158032 Reviewed-by: Xisco Fauli <xiscofa...@libreoffice.org> diff --git a/svx/source/svdraw/svdhdl.cxx b/svx/source/svdraw/svdhdl.cxx index 379b3ed3f73e..64f29976f5ca 100644 --- a/svx/source/svdraw/svdhdl.cxx +++ b/svx/source/svdraw/svdhdl.cxx @@ -1011,7 +1011,7 @@ PointerStyle SdrHdl::GetPointer() const case SdrHdlKind::Ref2 : ePtr=PointerStyle::RefHand; break; case SdrHdlKind::BezierWeight : ePtr=PointerStyle::MoveBezierWeight; break; case SdrHdlKind::Glue : ePtr=PointerStyle::MovePoint; break; - case SdrHdlKind::CustomShape1 : ePtr=PointerStyle::Hand; break; + case SdrHdlKind::CustomShape1 : ePtr=PointerStyle::RefHand; break; default: break; } commit 8c0519dd7f0eb5c94ab90e8e342cd86e58b48834 Author: Michael Stahl <michael.st...@allotropia.de> AuthorDate: Wed Oct 18 19:15:22 2023 +0200 Commit: Xisco Fauli <xiscofa...@libreoffice.org> CommitDate: Thu Nov 2 11:12:05 2023 +0100 tdf#157703 sw: PDF/UA export: fix headings with labels The problem is that the new Lbl/LBody elements are produced even for outline nodes, but those aren't represented as lists at all, but as headings H1..H10. Plausible representation of the heading label could be in a Lbl element inside H1, or simply as plain text; i can't find any recommendation either way. Let's try Lbl inside H1, neither veraPDF nor PAC3 complain about it. (regression from commit 9b38beadf9eaf027b201cdf0ecb2bce5611014dd) Reviewed-on: https://gerrit.libreoffice.org/c/core/+/158127 Tested-by: Jenkins Reviewed-by: Michael Stahl <michael.st...@allotropia.de> (cherry picked from commit 7cb283cf0e92cba4bd53b1cd69816ac7037937e4) tdf#157703 sw: PDF/UA export: export heading labels as text Been advised that a Lbl element is not much use in practice. Reviewed-on: https://gerrit.libreoffice.org/c/core/+/158421 Tested-by: Jenkins Reviewed-by: Michael Stahl <michael.st...@allotropia.de> (cherry picked from commit 5dfae9e00f245da78613224ed8e0dbd8b6633192) Change-Id: I691957d0c4a80d1339cb2b87c72c9aa652abfb9a Reviewed-on: https://gerrit.libreoffice.org/c/core/+/158423 Tested-by: Jenkins Reviewed-by: Gabor Kelemen <kelem...@ubuntu.com> diff --git a/sw/source/core/text/EnhancedPDFExportHelper.cxx b/sw/source/core/text/EnhancedPDFExportHelper.cxx index 1abd288b787d..201ff3c604a1 100644 --- a/sw/source/core/text/EnhancedPDFExportHelper.cxx +++ b/sw/source/core/text/EnhancedPDFExportHelper.cxx @@ -1318,7 +1318,8 @@ void SwTaggedPDFHelper::BeginBlockStructureElements() const SwTextNode *const pTextNd(rTextFrame.GetTextNodeForParaProps()); // lazy open LBody after Lbl - if (rTextFrame.GetPara()->HasNumberingPortion(SwParaPortion::OnlyNumbering)) + if (!pTextNd->IsOutline() + && rTextFrame.GetPara()->HasNumberingPortion(SwParaPortion::OnlyNumbering)) { sal_Int32 const nId = BeginTagImpl(nullptr, vcl::PDFWriter::LIBody, aListBodyString); SwNodeNum const*const pNodeNum(pTextNd->GetNum(rTextFrame.getRootFrame())); diff --git a/sw/source/core/text/frmpaint.cxx b/sw/source/core/text/frmpaint.cxx index e7e779eb0ea4..906b18616ddd 100644 --- a/sw/source/core/text/frmpaint.cxx +++ b/sw/source/core/text/frmpaint.cxx @@ -692,7 +692,9 @@ void SwTextFrame::PaintSwFrame(vcl::RenderContext& rRenderContext, SwRect const& // Paragraph tag - if there is a list label, opening should be delayed. ::std::optional<SwTaggedPDFHelper> oTaggedParagraph; - if (isPDFTaggingEnabled && !GetPara()->HasNumberingPortion(SwParaPortion::FootnoteToo)) + if (isPDFTaggingEnabled + && (GetTextNodeForParaProps()->IsOutline() + || !GetPara()->HasNumberingPortion(SwParaPortion::FootnoteToo))) { // no Lbl needed => open paragraph tag now Frame_Info aFrameInfo(*this, false); oTaggedParagraph.emplace(nullptr, &aFrameInfo, nullptr, rRenderContext); diff --git a/sw/source/core/text/itrpaint.cxx b/sw/source/core/text/itrpaint.cxx index 620838d10171..06c9c56b5d07 100644 --- a/sw/source/core/text/itrpaint.cxx +++ b/sw/source/core/text/itrpaint.cxx @@ -153,7 +153,8 @@ void SwTextPainter::DrawTextLine( const SwRect &rPaint, SwSaveClip &rClip, bool bSkippedNumPortions(false); SwLinePortion *pPor = bEndPor ? m_pCurr->GetFirstPortion() : CalcPaintOfst(rPaint, bSkippedNumPortions); - if (bSkippedNumPortions) // ugly but hard to check earlier in PaintSwFrame: + if (bSkippedNumPortions // ugly but hard to check earlier in PaintSwFrame: + && !GetInfo().GetTextFrame()->GetTextNodeForParaProps()->IsOutline()) { // there is a num portion but it is outside of the frame area and not painted assert(!roTaggedLabel); assert(!roTaggedParagraph); @@ -411,6 +412,7 @@ void SwTextPainter::DrawTextLine( const SwRect &rPaint, SwSaveClip &rClip, if ((pPor->InNumberGrp() // also footnote label // weird special case, bullet with soft hyphen || (pPor->InHyphGrp() && pNext && pNext->InNumberGrp())) + && !GetInfo().GetTextFrame()->GetTextNodeForParaProps()->IsOutline() && !roTaggedLabel) // note: CalcPaintOfst may skip some portions { assert(isPDFTaggingEnabled); @@ -434,11 +436,18 @@ void SwTextPainter::DrawTextLine( const SwRect &rPaint, SwSaveClip &rClip, // note: numbering portion may be split if it has multiple scripts && !static_cast<SwNumberPortion const*>(pPor)->HasFollow()) // so wait for the last one { - assert(roTaggedLabel); - roTaggedLabel.reset(); // close Lbl - assert(!roTaggedParagraph); - Frame_Info aFrameInfo(*m_pFrame, false); // open LBody - roTaggedParagraph.emplace(nullptr, &aFrameInfo, nullptr, *pOut); + if (!GetInfo().GetTextFrame()->GetTextNodeForParaProps()->IsOutline()) + { + assert(roTaggedLabel); + roTaggedLabel.reset(); // close Lbl + assert(!roTaggedParagraph); + Frame_Info aFrameInfo(*m_pFrame, false); // open LBody + roTaggedParagraph.emplace(nullptr, &aFrameInfo, nullptr, *pOut); + } + else + { + assert(!roTaggedLabel); + } } // reset underline font @@ -461,7 +470,7 @@ void SwTextPainter::DrawTextLine( const SwRect &rPaint, SwSaveClip &rClip, pNext && pNext->IsHolePortion() ) ? pNext : nullptr; - if (!pPor && isPDFTaggingEnabled && !roTaggedParagraph) + if (!pPor && isPDFTaggingEnabled && (roTaggedLabel || !roTaggedParagraph)) { // check if the end of the list label is off-screen auto FindEndOfNumbering = [&](SwLinePortion const* pP) { while (pP) @@ -473,8 +482,11 @@ void SwTextPainter::DrawTextLine( const SwRect &rPaint, SwSaveClip &rClip, { roTaggedLabel.reset(); } // else, if the numbering isn't visible at all, no Lbl - Frame_Info aFrameInfo(*m_pFrame, false); // open LBody - roTaggedParagraph.emplace(nullptr, &aFrameInfo, nullptr, *GetInfo().GetOut()); + if (!GetInfo().GetTextFrame()->GetTextNodeForParaProps()->IsOutline()) + { + Frame_Info aFrameInfo(*m_pFrame, false); // open LBody + roTaggedParagraph.emplace(nullptr, &aFrameInfo, nullptr, *GetInfo().GetOut()); + } return true; } pP = pP->GetNextPortion(); diff --git a/vcl/qa/cppunit/pdfexport/data/LO_Lbl_Lbody_bug_report.fodt b/vcl/qa/cppunit/pdfexport/data/LO_Lbl_Lbody_bug_report.fodt new file mode 100644 index 000000000000..ed4cf8958425 --- /dev/null +++ b/vcl/qa/cppunit/pdfexport/data/LO_Lbl_Lbody_bug_report.fodt @@ -0,0 +1,125 @@ +<?xml version='1.0' encoding='UTF-8'?> +<office:document xmlns:css3t="http://www.w3.org/TR/css3-text/" xmlns:grddl="http://www.w3.org/2003/g/data-view#" xmlns:xhtml="http://www.w3.org/1999/xhtml" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:xforms="http://www.w3.org/2002/xforms" xmlns:dom="http://www.w3.org/2001/xml-events" xmlns:script="urn:oasis:names:tc:opendocument:xmlns:script:1.0" xmlns:form="urn:oasis:names:tc:opendocument:xmlns:form:1.0" xmlns:math="http://www.w3.org/1998/Math/MathML" xmlns:office="urn:oasis:names:tc:opendocument:xmlns:office:1.0" xmlns:ooo="http://openoffice.org/2004/office" xmlns:fo="urn:oasis:names:tc:opendocument:xmlns:xsl-fo-compatible:1.0" xmlns:config="urn:oasis:names:tc:opendocument:xmlns:config:1.0" xmlns:ooow="http://openoffice.org/2004/writer" xmlns:xlink="http://www.w3.org/1999/xlink" xmlns:drawooo="http://openoffice.org/2010/draw" xmlns:oooc="http://openoffice.org/2004/calc" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:c alcext="urn:org:documentfoundation:names:experimental:calc:xmlns:calcext:1.0" xmlns:style="urn:oasis:names:tc:opendocument:xmlns:style:1.0" xmlns:text="urn:oasis:names:tc:opendocument:xmlns:text:1.0" xmlns:of="urn:oasis:names:tc:opendocument:xmlns:of:1.2" xmlns:tableooo="http://openoffice.org/2009/table" xmlns:draw="urn:oasis:names:tc:opendocument:xmlns:drawing:1.0" xmlns:dr3d="urn:oasis:names:tc:opendocument:xmlns:dr3d:1.0" xmlns:rpt="http://openoffice.org/2005/report" xmlns:formx="urn:openoffice:names:experimental:ooxml-odf-interop:xmlns:form:1.0" xmlns:svg="urn:oasis:names:tc:opendocument:xmlns:svg-compatible:1.0" xmlns:chart="urn:oasis:names:tc:opendocument:xmlns:chart:1.0" xmlns:officeooo="http://openoffice.org/2009/office" xmlns:table="urn:oasis:names:tc:opendocument:xmlns:table:1.0" xmlns:field="urn:openoffice:names:experimental:ooo-ms-interop:xmlns:field:1.0" xmlns:number="urn:oasis:names:tc:opendocument:xmlns:datastyle:1.0" xmlns:meta="urn:oasis:names:tc:opendocument:xmlns: meta:1.0" xmlns:loext="urn:org:documentfoundation:names:experimental:office:xmlns:loext:1.0" office:version="1.3" office:mimetype="application/vnd.oasis.opendocument.text"> + <office:meta><meta:initial-creator>Saku Seppälä</meta:initial-creator><meta:creation-date>2023-10-11T16:51:28.618000000</meta:creation-date><dc:date>2023-10-19T12:10:56.924262307</dc:date><meta:editing-duration>PT7M5S</meta:editing-duration><meta:editing-cycles>5</meta:editing-cycles><meta:generator>LibreOfficeDev/24.2.0.0.alpha0$Linux_X86_64 LibreOffice_project/0080580e754a3a080ae0b914945368307d5c29fe</meta:generator><meta:print-date>2023-10-11T17:00:34.425000000</meta:print-date><meta:printed-by>PDF files: Saku Seppälä</meta:printed-by><meta:document-statistic meta:table-count="0" meta:image-count="0" meta:object-count="0" meta:page-count="1" meta:paragraph-count="2" meta:word-count="9" meta:character-count="48" meta:non-whitespace-character-count="42"/></office:meta> + <office:font-face-decls> + <style:font-face style:name="Arial Unicode MS1" svg:font-family="'Arial Unicode MS'" style:font-family-generic="system" style:font-pitch="variable"/> + <style:font-face style:name="Liberation Sans" svg:font-family="'Liberation Sans'" style:font-family-generic="swiss" style:font-pitch="variable"/> + <style:font-face style:name="Liberation Serif" svg:font-family="'Liberation Serif'" style:font-family-generic="roman" style:font-pitch="variable"/> + <style:font-face style:name="Microsoft YaHei" svg:font-family="'Microsoft YaHei'" style:font-family-generic="system" style:font-pitch="variable"/> + <style:font-face style:name="NSimSun" svg:font-family="NSimSun" style:font-family-generic="system" style:font-pitch="variable"/> + </office:font-face-decls> + <office:styles> + <style:default-style style:family="graphic"> + <style:graphic-properties svg:stroke-color="#3465a4" draw:fill-color="#729fcf" fo:wrap-option="no-wrap" draw:shadow-offset-x="0.3cm" draw:shadow-offset-y="0.3cm" draw:start-line-spacing-horizontal="0.283cm" draw:start-line-spacing-vertical="0.283cm" draw:end-line-spacing-horizontal="0.283cm" draw:end-line-spacing-vertical="0.283cm" style:writing-mode="lr-tb" style:flow-with-text="false"/> + <style:paragraph-properties style:text-autospace="ideograph-alpha" style:line-break="strict" loext:tab-stop-distance="0cm" style:writing-mode="lr-tb" style:font-independent-line-spacing="false"> + <style:tab-stops/> + </style:paragraph-properties> + <style:text-properties style:use-window-font-color="true" loext:opacity="0%" style:font-name="Liberation Serif" fo:font-size="12pt" fo:language="fi" fo:country="FI" style:letter-kerning="true" style:font-name-asian="NSimSun" style:font-size-asian="10.5pt" style:language-asian="zh" style:country-asian="CN" style:font-name-complex="Arial Unicode MS1" style:font-size-complex="12pt" style:language-complex="hi" style:country-complex="IN"/> + </style:default-style> + <style:default-style style:family="paragraph"> + <style:paragraph-properties fo:orphans="2" fo:widows="2" fo:hyphenation-ladder-count="no-limit" style:text-autospace="ideograph-alpha" style:punctuation-wrap="hanging" style:line-break="strict" style:tab-stop-distance="1.251cm" style:writing-mode="page"/> + <style:text-properties style:use-window-font-color="true" loext:opacity="0%" style:font-name="Liberation Serif" fo:font-size="12pt" fo:language="fi" fo:country="FI" style:letter-kerning="true" style:font-name-asian="NSimSun" style:font-size-asian="10.5pt" style:language-asian="zh" style:country-asian="CN" style:font-name-complex="Arial Unicode MS1" style:font-size-complex="12pt" style:language-complex="hi" style:country-complex="IN" fo:hyphenate="false" fo:hyphenation-remain-char-count="2" fo:hyphenation-push-char-count="2" loext:hyphenation-no-caps="false" loext:hyphenation-no-last-word="false" loext:hyphenation-word-char-count="5" loext:hyphenation-zone="no-limit"/> + </style:default-style> + <style:default-style style:family="table"> + <style:table-properties table:border-model="collapsing"/> + </style:default-style> + <style:default-style style:family="table-row"> + <style:table-row-properties fo:keep-together="auto"/> + </style:default-style> + <style:style style:name="Standard" style:family="paragraph" style:class="text"/> + <style:style style:name="Heading" style:family="paragraph" style:parent-style-name="Standard" style:next-style-name="Text_20_body" style:class="text"> + <style:paragraph-properties fo:margin-top="0.423cm" fo:margin-bottom="0.212cm" style:contextual-spacing="false" fo:keep-with-next="always"/> + <style:text-properties style:font-name="Liberation Sans" fo:font-family="'Liberation Sans'" style:font-family-generic="swiss" style:font-pitch="variable" fo:font-size="14pt" style:font-name-asian="Microsoft YaHei" style:font-family-asian="'Microsoft YaHei'" style:font-family-generic-asian="system" style:font-pitch-asian="variable" style:font-size-asian="14pt" style:font-name-complex="Arial Unicode MS1" style:font-family-complex="'Arial Unicode MS'" style:font-family-generic-complex="system" style:font-pitch-complex="variable" style:font-size-complex="14pt"/> + </style:style> + <style:style style:name="Text_20_body" style:display-name="Text body" style:family="paragraph" style:parent-style-name="Standard" style:class="text"> + <style:paragraph-properties fo:margin-top="0cm" fo:margin-bottom="0.247cm" style:contextual-spacing="false" fo:line-height="115%"/> + </style:style> + <style:style style:name="Heading_20_1" style:display-name="Heading 1" style:family="paragraph" style:parent-style-name="Heading" style:next-style-name="Text_20_body" style:default-outline-level="1" style:class="text"> + <style:paragraph-properties fo:margin-top="0.423cm" fo:margin-bottom="0.212cm" style:contextual-spacing="false"/> + <style:text-properties fo:font-size="18pt" fo:font-weight="bold" style:font-size-asian="18pt" style:font-weight-asian="bold" style:font-size-complex="18pt" style:font-weight-complex="bold"/> + </style:style> + <style:style style:name="Heading_20_2" style:display-name="Heading 2" style:family="paragraph" style:parent-style-name="Heading" style:next-style-name="Text_20_body" style:default-outline-level="2" style:class="text"> + <style:paragraph-properties fo:margin-top="0.353cm" fo:margin-bottom="0.212cm" style:contextual-spacing="false"/> + <style:text-properties fo:font-size="16pt" fo:font-weight="bold" style:font-size-asian="16pt" style:font-weight-asian="bold" style:font-size-complex="16pt" style:font-weight-complex="bold"/> + </style:style> + <text:outline-style style:name="Outline"> + <text:outline-level-style text:level="1" loext:num-list-format="%1%" style:num-format="1"> + <style:list-level-properties text:list-level-position-and-space-mode="label-alignment"> + <style:list-level-label-alignment text:label-followed-by="listtab"/> + </style:list-level-properties> + </text:outline-level-style> + <text:outline-level-style text:level="2" loext:num-list-format="%2%" style:num-format=""> + <style:list-level-properties text:list-level-position-and-space-mode="label-alignment"> + <style:list-level-label-alignment text:label-followed-by="listtab"/> + </style:list-level-properties> + </text:outline-level-style> + <text:outline-level-style text:level="3" loext:num-list-format="%3%" style:num-format=""> + <style:list-level-properties text:list-level-position-and-space-mode="label-alignment"> + <style:list-level-label-alignment text:label-followed-by="listtab"/> + </style:list-level-properties> + </text:outline-level-style> + <text:outline-level-style text:level="4" loext:num-list-format="%4%" style:num-format=""> + <style:list-level-properties text:list-level-position-and-space-mode="label-alignment"> + <style:list-level-label-alignment text:label-followed-by="listtab"/> + </style:list-level-properties> + </text:outline-level-style> + <text:outline-level-style text:level="5" loext:num-list-format="%5%" style:num-format=""> + <style:list-level-properties text:list-level-position-and-space-mode="label-alignment"> + <style:list-level-label-alignment text:label-followed-by="listtab"/> + </style:list-level-properties> + </text:outline-level-style> + <text:outline-level-style text:level="6" loext:num-list-format="%6%" style:num-format=""> + <style:list-level-properties text:list-level-position-and-space-mode="label-alignment"> + <style:list-level-label-alignment text:label-followed-by="listtab"/> + </style:list-level-properties> + </text:outline-level-style> + <text:outline-level-style text:level="7" loext:num-list-format="%7%" style:num-format=""> + <style:list-level-properties text:list-level-position-and-space-mode="label-alignment"> + <style:list-level-label-alignment text:label-followed-by="listtab"/> + </style:list-level-properties> + </text:outline-level-style> + <text:outline-level-style text:level="8" loext:num-list-format="%8%" style:num-format=""> + <style:list-level-properties text:list-level-position-and-space-mode="label-alignment"> + <style:list-level-label-alignment text:label-followed-by="listtab"/> + </style:list-level-properties> + </text:outline-level-style> + <text:outline-level-style text:level="9" loext:num-list-format="%9%" style:num-format=""> + <style:list-level-properties text:list-level-position-and-space-mode="label-alignment"> + <style:list-level-label-alignment text:label-followed-by="listtab"/> + </style:list-level-properties> + </text:outline-level-style> + <text:outline-level-style text:level="10" loext:num-list-format="%10%" style:num-format=""> + <style:list-level-properties text:list-level-position-and-space-mode="label-alignment"> + <style:list-level-label-alignment text:label-followed-by="listtab"/> + </style:list-level-properties> + </text:outline-level-style> + </text:outline-style> + <text:notes-configuration text:note-class="footnote" style:num-format="1" text:start-value="0" text:footnotes-position="page" text:start-numbering-at="document"/> + <text:notes-configuration text:note-class="endnote" style:num-format="i" text:start-value="0"/> + <text:linenumbering-configuration text:number-lines="false" text:offset="0.499cm" style:num-format="1" text:number-position="left" text:increment="5"/> + </office:styles> + <office:automatic-styles> + <style:style style:name="P1" style:family="paragraph" style:parent-style-name="Heading_20_1"> + <style:text-properties/> + </style:style> + <style:page-layout style:name="pm1"> + <style:page-layout-properties fo:page-width="21.001cm" fo:page-height="29.7cm" style:num-format="1" style:print-orientation="portrait" fo:margin-top="2cm" fo:margin-bottom="2cm" fo:margin-left="2cm" fo:margin-right="2cm" style:writing-mode="lr-tb" style:layout-grid-color="#c0c0c0" style:layout-grid-lines="20" style:layout-grid-base-height="0.706cm" style:layout-grid-ruby-height="0.353cm" style:layout-grid-mode="none" style:layout-grid-ruby-below="false" style:layout-grid-print="false" style:layout-grid-display="false" style:footnote-max-height="0cm" loext:margin-gutter="0cm"> + <style:footnote-sep style:width="0.018cm" style:distance-before-sep="0.101cm" style:distance-after-sep="0.101cm" style:line-style="solid" style:adjustment="left" style:rel-width="25%" style:color="#000000"/> + </style:page-layout-properties> + <style:header-style/> + <style:footer-style/> + </style:page-layout> + <style:style style:name="dp1" style:family="drawing-page"> + <style:drawing-page-properties draw:background-size="full"/> + </style:style> + </office:automatic-styles> + <office:master-styles> + <style:master-page style:name="Standard" style:page-layout-name="pm1" draw:style-name="dp1"/> + </office:master-styles> + <office:body> + <office:text> + <text:h text:style-name="P1" text:outline-level="1"><text:bookmark-start text:name="__RefHeading___Toc449_2941960903"/>This Is First Heading<text:bookmark-end text:name="__RefHeading___Toc449_2941960903"/></text:h> + <text:h text:style-name="Heading_20_2" text:outline-level="2">Second level without label</text:h> + </office:text> + </office:body> +</office:document> diff --git a/vcl/qa/cppunit/pdfexport/pdfexport.cxx b/vcl/qa/cppunit/pdfexport/pdfexport.cxx index 10c36a3f5906..4f4ff341a131 100644 --- a/vcl/qa/cppunit/pdfexport/pdfexport.cxx +++ b/vcl/qa/cppunit/pdfexport/pdfexport.cxx @@ -3893,6 +3893,84 @@ CPPUNIT_TEST_FIXTURE(PdfExportTest, testTdf135638) CPPUNIT_ASSERT_EQUAL(int(2), nFigure); } +CPPUNIT_TEST_FIXTURE(PdfExportTest, testTdf157703) +{ + aMediaDescriptor["FilterName"] <<= OUString("writer_pdf_Export"); + + // Enable PDF/UA + uno::Sequence<beans::PropertyValue> aFilterData( + comphelper::InitPropertySequence({ { "PDFUACompliance", uno::Any(true) } })); + aMediaDescriptor["FilterData"] <<= aFilterData; + saveAsPDF(u"LO_Lbl_Lbody_bug_report.fodt"); + + vcl::filter::PDFDocument aDocument; + SvFileStream aStream(maTempFile.GetURL(), StreamMode::READ); + CPPUNIT_ASSERT(aDocument.Read(aStream)); + + // The document has one page. + std::vector<vcl::filter::PDFObjectElement*> aPages = aDocument.GetPages(); + CPPUNIT_ASSERT_EQUAL(static_cast<size_t>(1), aPages.size()); + + vcl::filter::PDFObjectElement* pDocument(nullptr); + for (const auto& rDocElement : aDocument.GetElements()) + { + auto pObject1 = dynamic_cast<vcl::filter::PDFObjectElement*>(rDocElement.get()); + if (!pObject1) + continue; + auto pType1 = dynamic_cast<vcl::filter::PDFNameElement*>(pObject1->Lookup("Type")); + if (pType1 && pType1->GetValue() == "StructElem") + { + auto pS1 = dynamic_cast<vcl::filter::PDFNameElement*>(pObject1->Lookup("S")); + if (pS1 && pS1->GetValue() == "Document") + { + pDocument = pObject1; + } + } + } + CPPUNIT_ASSERT(pDocument); + + auto pKidsD = dynamic_cast<vcl::filter::PDFArrayElement*>(pDocument->Lookup("K")); + CPPUNIT_ASSERT(pKidsD); + // assume there are no MCID ref at this level + auto pKidsDv = pKidsD->GetElements(); + auto pRefKidD0 = dynamic_cast<vcl::filter::PDFReferenceElement*>(pKidsDv[0]); + CPPUNIT_ASSERT(pRefKidD0); + auto pObjectD0 = pRefKidD0->LookupObject(); + CPPUNIT_ASSERT(pObjectD0); + auto pTypeD0 = dynamic_cast<vcl::filter::PDFNameElement*>(pObjectD0->Lookup("Type")); + CPPUNIT_ASSERT_EQUAL(OString("StructElem"), pTypeD0->GetValue()); + auto pSD0 = dynamic_cast<vcl::filter::PDFNameElement*>(pObjectD0->Lookup("S")); + CPPUNIT_ASSERT_EQUAL(OString("H1"), pSD0->GetValue()); + + auto pKidsD0 = dynamic_cast<vcl::filter::PDFArrayElement*>(pObjectD0->Lookup("K")); + CPPUNIT_ASSERT(pKidsD0); + auto pKidsD0v = pKidsD0->GetElements(); + auto pRefKidD00 = dynamic_cast<vcl::filter::PDFReferenceElement*>(pKidsD0v[0]); + // MCID for label + CPPUNIT_ASSERT(!pRefKidD00); + + // MCID for text + auto pRefKidD01 = dynamic_cast<vcl::filter::PDFReferenceElement*>(pKidsD0v[1]); + CPPUNIT_ASSERT(!pRefKidD01); + + auto pRefKidD1 = dynamic_cast<vcl::filter::PDFReferenceElement*>(pKidsDv[1]); + CPPUNIT_ASSERT(pRefKidD1); + auto pObjectD1 = pRefKidD1->LookupObject(); + CPPUNIT_ASSERT(pObjectD1); + auto pTypeD1 = dynamic_cast<vcl::filter::PDFNameElement*>(pObjectD1->Lookup("Type")); + CPPUNIT_ASSERT_EQUAL(OString("StructElem"), pTypeD1->GetValue()); + auto pSD1 = dynamic_cast<vcl::filter::PDFNameElement*>(pObjectD1->Lookup("S")); + CPPUNIT_ASSERT_EQUAL(OString("H2"), pSD1->GetValue()); + + auto pKidsD1 = dynamic_cast<vcl::filter::PDFArrayElement*>(pObjectD1->Lookup("K")); + CPPUNIT_ASSERT(pKidsD1); + auto pKidsD1v = pKidsD1->GetElements(); + + // MCID for text + auto pRefKidD11 = dynamic_cast<vcl::filter::PDFReferenceElement*>(pKidsD1v[0]); + CPPUNIT_ASSERT(!pRefKidD11); +} + CPPUNIT_TEST_FIXTURE(PdfExportTest, testSpans) { aMediaDescriptor["FilterName"] <<= OUString("writer_pdf_Export"); commit 6bf92349cab2a558a8160ad6ace409cd4b6f260e Author: László Németh <nem...@numbertext.org> AuthorDate: Mon Oct 30 14:42:34 2023 +0100 Commit: Xisco Fauli <xiscofa...@libreoffice.org> CommitDate: Thu Nov 2 09:29:56 2023 +0100 tdf#157988 sw track changes: fix cycle case on a selected word Cycle case didn't work on a selected word, only on the word under the cursor without selection. Add unit test also for tdf#141198. Follow up to commit dc748d7dbd114fbf663752258dbaf003af2926c3 "tdf#141198 sw: fix cycle case with change tracking". Change-Id: I0c1361c78d09e9b8743192a47dcdfa6f6da52e38 Reviewed-on: https://gerrit.libreoffice.org/c/core/+/158666 Tested-by: Jenkins Reviewed-by: László Németh <nem...@numbertext.org> Signed-off-by: Xisco Fauli <xiscofa...@libreoffice.org> Reviewed-on: https://gerrit.libreoffice.org/c/core/+/158686 diff --git a/sw/qa/extras/uiwriter/uiwriter6.cxx b/sw/qa/extras/uiwriter/uiwriter6.cxx index edfc5c153afc..316181c37cff 100644 --- a/sw/qa/extras/uiwriter/uiwriter6.cxx +++ b/sw/qa/extras/uiwriter/uiwriter6.cxx @@ -689,6 +689,75 @@ CPPUNIT_TEST_FIXTURE(SwUiWriterTest6, testTdf157937) dispatchCommand(mxComponent, ".uno:ChangeCaseRotateCase", {}); } +CPPUNIT_TEST_FIXTURE(SwUiWriterTest6, testTdf157988) +{ + createSwDoc("tdf130088.docx"); + SwDoc* pDoc = getSwDoc(); + + // select the second word + dispatchCommand(mxComponent, ".uno:GoToNextWord", {}); + dispatchCommand(mxComponent, ".uno:SelectWord", {}); + + // enable redlining + dispatchCommand(mxComponent, ".uno:TrackChanges", {}); + CPPUNIT_ASSERT_MESSAGE("redlining should be on", + pDoc->getIDocumentRedlineAccess().IsRedlineOn()); + + // show changes + CPPUNIT_ASSERT_MESSAGE( + "redlines should be visible", + IDocumentRedlineAccess::IsShowChanges(pDoc->getIDocumentRedlineAccess().GetRedlineFlags())); + + // cycle case with change tracking + + dispatchCommand(mxComponent, ".uno:ChangeCaseRotateCase", {}); + + CPPUNIT_ASSERT(getParagraph(1)->getString().startsWith("Integer sodalesSodales")); + + dispatchCommand(mxComponent, ".uno:ChangeCaseRotateCase", {}); + + // This was false (missing revert of the tracked change) + CPPUNIT_ASSERT(getParagraph(1)->getString().startsWith("Integer sodales tincidunt")); + + dispatchCommand(mxComponent, ".uno:ChangeCaseRotateCase", {}); + + CPPUNIT_ASSERT(getParagraph(1)->getString().startsWith("Integer sodalesSODALES")); + + dispatchCommand(mxComponent, ".uno:ChangeCaseRotateCase", {}); + + CPPUNIT_ASSERT(getParagraph(1)->getString().startsWith("Integer sodales tincidunt")); + + dispatchCommand(mxComponent, ".uno:ChangeCaseRotateCase", {}); + + CPPUNIT_ASSERT(getParagraph(1)->getString().startsWith("Integer sodalesSodales")); + + dispatchCommand(mxComponent, ".uno:ChangeCaseRotateCase", {}); + + CPPUNIT_ASSERT(getParagraph(1)->getString().startsWith("Integer sodales tincidunt")); + + // tdf#141198 cycle case without selection: the word under the cursor + + dispatchCommand(mxComponent, ".uno:Escape", {}); + + dispatchCommand(mxComponent, ".uno:GoRight", {}); + + dispatchCommand(mxComponent, ".uno:ChangeCaseRotateCase", {}); + + CPPUNIT_ASSERT(getParagraph(1)->getString().startsWith("Integer sodalesSODALES")); + + dispatchCommand(mxComponent, ".uno:ChangeCaseRotateCase", {}); + + CPPUNIT_ASSERT(getParagraph(1)->getString().startsWith("Integer sodales tincidunt")); + + dispatchCommand(mxComponent, ".uno:ChangeCaseRotateCase", {}); + + CPPUNIT_ASSERT(getParagraph(1)->getString().startsWith("Integer sodalesSodales")); + + dispatchCommand(mxComponent, ".uno:ChangeCaseRotateCase", {}); + + CPPUNIT_ASSERT(getParagraph(1)->getString().startsWith("Integer sodales tincidunt")); +} + CPPUNIT_TEST_FIXTURE(SwUiWriterTest6, testTdf108048) { createSwDoc(); diff --git a/sw/source/core/doc/DocumentContentOperationsManager.cxx b/sw/source/core/doc/DocumentContentOperationsManager.cxx index 47e5b818b2fb..bac73a325a5f 100644 --- a/sw/source/core/doc/DocumentContentOperationsManager.cxx +++ b/sw/source/core/doc/DocumentContentOperationsManager.cxx @@ -3036,6 +3036,44 @@ void DocumentContentOperationsManager::TransliterateText( return; } } + else + { + bool bHasTrackedChange = false; + IDocumentRedlineAccess& rIDRA = m_rDoc.getIDocumentRedlineAccess(); + if ( IDocumentRedlineAccess::IsShowChanges( rIDRA.GetRedlineFlags() ) && + pEnd->GetContentIndex() > 0 ) + { + SwPosition aPos(*pEnd->GetContentNode(), pEnd->GetContentIndex() - 1); + SwRedlineTable::size_type n = 0; + + const SwRangeRedline* pFnd = + rIDRA.GetRedlineTable().FindAtPosition( aPos, n ); + if ( pFnd && RedlineType::Insert == pFnd->GetType() && n > 0 ) + { + const SwRangeRedline* pFnd2 = rIDRA.GetRedlineTable()[n-1]; + if ( RedlineType::Delete == pFnd2->GetType() && + m_rDoc.getIDocumentLayoutAccess().GetCurrentViewShell() && + *pFnd2->End() == *pFnd->Start() && + pFnd->GetAuthor() == pFnd2->GetAuthor() ) + { + bHasTrackedChange = true; + SwPosition aPos2(*pFnd2->Start()); + rIDRA.RejectRedline(*pFnd, true); + + rIDRA.RejectRedline(*pFnd2, true); + // positionate the text cursor before the changed word to select it + if ( SwWrtShell *pWrtShell = dynamic_cast<SwWrtShell*>( + m_rDoc.getIDocumentLayoutAccess().GetCurrentViewShell()) ) + { + pWrtShell->GetCursor()->GetPoint()-> + Assign(*aPos2.GetContentNode(), aPos2.GetContentIndex()); + } + } + } + } + if ( bHasTrackedChange ) + return; + } bool bUseRedlining = m_rDoc.getIDocumentRedlineAccess().IsRedlineOn(); // as a workaround for a known performance problem, switch off redlining commit 0f3d1f346b5c4dfb4073e772df1ccd91e538cf3f Author: Xisco Fauli <xiscofa...@libreoffice.org> AuthorDate: Tue Oct 31 13:43:32 2023 +0100 Commit: Xisco Fauli <xiscofa...@libreoffice.org> CommitDate: Thu Nov 2 09:29:42 2023 +0100 tdf#157679: vcl_pdfexport: Add unittest Change-Id: I31aa7f683e8d9f9a227ba88c58e7fdba94c83bb5 Reviewed-on: https://gerrit.libreoffice.org/c/core/+/158725 Tested-by: Jenkins Reviewed-by: Xisco Fauli <xiscofa...@libreoffice.org> (cherry picked from commit d0f521132c43fea1ca18e18d3e31c6d868e4ebd6) Reviewed-on: https://gerrit.libreoffice.org/c/core/+/158706 diff --git a/vcl/qa/cppunit/pdfexport/data/tdf157679.pptx b/vcl/qa/cppunit/pdfexport/data/tdf157679.pptx new file mode 100644 index 000000000000..ca82491c21f3 Binary files /dev/null and b/vcl/qa/cppunit/pdfexport/data/tdf157679.pptx differ diff --git a/vcl/qa/cppunit/pdfexport/pdfexport.cxx b/vcl/qa/cppunit/pdfexport/pdfexport.cxx index 8b06e41be74d..10c36a3f5906 100644 --- a/vcl/qa/cppunit/pdfexport/pdfexport.cxx +++ b/vcl/qa/cppunit/pdfexport/pdfexport.cxx @@ -1676,6 +1676,34 @@ CPPUNIT_TEST_FIXTURE(PdfExportTest, testTdf105954) CPPUNIT_ASSERT_LESS(static_cast<tools::Long>(250), aMeta.getWidth()); } +CPPUNIT_TEST_FIXTURE(PdfExportTest, testTdf157679) +{ + // Import the bugdoc and export as PDF. + aMediaDescriptor["FilterName"] <<= OUString("impress_pdf_Export"); + saveAsPDF(u"tdf157679.pptx"); + std::unique_ptr<vcl::pdf::PDFiumDocument> pPdfDocument = parsePDFExport(); + + // The document has one page. + CPPUNIT_ASSERT_EQUAL(1, pPdfDocument->getPageCount()); + + std::unique_ptr<vcl::pdf::PDFiumPage> pPdfPage = pPdfDocument->openPage(/*nIndex=*/0); + CPPUNIT_ASSERT(pPdfPage); + + // Without the fix in place, this test would have failed with + // - Expected: 3 + // - Actual : 5 + CPPUNIT_ASSERT_EQUAL(3, pPdfPage->getObjectCount()); + + std::unique_ptr<vcl::pdf::PDFiumTextPage> pTextPage = pPdfPage->getTextPage(); + int nPageObjectCount = pPdfPage->getObjectCount(); + for (int i = 0; i < nPageObjectCount; ++i) + { + // Check there are not Text objects + std::unique_ptr<vcl::pdf::PDFiumPageObject> pPageObject = pPdfPage->getObject(i); + CPPUNIT_ASSERT(pPageObject->getType() != vcl::pdf::PDFPageObjectType::Text); + } +} + CPPUNIT_TEST_FIXTURE(PdfExportTest, testTdf128445) { // Import the bugdoc and export as PDF. commit 41097d6168de85c183be1c8a014c7e85de624060 Author: Henry Castro <hcas...@collabora.com> AuthorDate: Mon Oct 9 10:29:40 2023 -0400 Commit: Xisco Fauli <xiscofa...@libreoffice.org> CommitDate: Thu Nov 2 09:29:25 2023 +0100 tdf#155512: sd: qa: unit: add unit test "testMasterSlides" . Signed-off-by: Henry Castro <hcas...@collabora.com> Change-Id: I6117b384fdad215e6c04b6e74df22fe9daa6a526 Reviewed-on: https://gerrit.libreoffice.org/c/core/+/157705 Tested-by: Jenkins CollaboraOffice <jenkinscollaboraoff...@gmail.com> Reviewed-by: Caolán McNamara <caolan.mcnam...@collabora.com> Reviewed-on: https://gerrit.libreoffice.org/c/core/+/158739 Tested-by: Jenkins (cherry picked from commit 32e6ef3834a0f96d7830719950de52c99aae0263) Reviewed-on: https://gerrit.libreoffice.org/c/core/+/158701 Reviewed-by: Xisco Fauli <xiscofa...@libreoffice.org> Tested-by: Xisco Fauli <xiscofa...@libreoffice.org> diff --git a/sd/qa/unit/data/pptx/master-slides.pptx b/sd/qa/unit/data/pptx/master-slides.pptx new file mode 100644 index 000000000000..3494d33254ab Binary files /dev/null and b/sd/qa/unit/data/pptx/master-slides.pptx differ diff --git a/sd/qa/unit/import-tests2.cxx b/sd/qa/unit/import-tests2.cxx index 44eacbf1da05..da6572b8af5a 100644 --- a/sd/qa/unit/import-tests2.cxx +++ b/sd/qa/unit/import-tests2.cxx @@ -1972,6 +1972,16 @@ CPPUNIT_TEST_FIXTURE(SdImportTest2, testTdf153012) CPPUNIT_ASSERT_EQUAL(Color(0xd9d9d9), aFillColor); } +CPPUNIT_TEST_FIXTURE(SdImportTest2, testMasterSlides) +{ + createSdImpressDoc("pptx/master-slides.pptx"); + uno::Reference<drawing::XMasterPagesSupplier> xMasterPagesSupplier(mxComponent, + uno::UNO_QUERY_THROW); + uno::Reference<drawing::XDrawPages> xMasterPages(xMasterPagesSupplier->getMasterPages()); + CPPUNIT_ASSERT(xMasterPages.is()); + CPPUNIT_ASSERT_EQUAL(sal_Int32(7), xMasterPages->getCount()); +} + CPPUNIT_PLUGIN_IMPLEMENT(); /* vim:set shiftwidth=4 softtabstop=4 expandtab: */ commit 83aa3504e7690f096e840c74ca4c09035e343f09 Author: Mike Kaganski <mike.kagan...@collabora.com> AuthorDate: Wed Nov 1 00:37:19 2023 +0300 Commit: Stephan Bergmann <sberg...@redhat.com> CommitDate: Thu Nov 2 08:05:51 2023 +0100 tdf#157820: handle \\?\ prefixes in INetURLObject They are already handled in osl file URL functions. Change-Id: Id0c224bdb79963e7ce52abde57bf05b0a6a81ff5 Reviewed-on: https://gerrit.libreoffice.org/c/core/+/158741 Reviewed-by: Stephan Bergmann <sberg...@redhat.com> Tested-by: Jenkins Reviewed-by: Mike Kaganski <mike.kagan...@collabora.com> (cherry picked from commit 9f1289f1e3c9b4a5f2be7a7187877db6b5015973) Reviewed-on: https://gerrit.libreoffice.org/c/core/+/158705 diff --git a/tools/qa/cppunit/test_urlobj.cxx b/tools/qa/cppunit/test_urlobj.cxx index 2c8ae1a36a25..273b5feff954 100644 --- a/tools/qa/cppunit/test_urlobj.cxx +++ b/tools/qa/cppunit/test_urlobj.cxx @@ -332,6 +332,26 @@ namespace tools_urlobj CPPUNIT_ASSERT_EQUAL(OUString(""), obj.GetHost()); CPPUNIT_ASSERT_EQUAL(OUString("80a0/foo"), obj.GetURLPath()); } + { + // Test Windows \\?\C:... long path scheme + INetURLObject base(u"file:///C:/foo"); // set up base path + bool bWasAbsolute = false; + INetURLObject obj + = base.smartRel2Abs(u"\\\\?\\D:\\bar\\baz.ext", bWasAbsolute); + CPPUNIT_ASSERT(bWasAbsolute); + CPPUNIT_ASSERT_EQUAL(OUString("file:///D:/bar/baz.ext"), + obj.GetMainURL(INetURLObject::DecodeMechanism::NONE)); + } + { + // Test Windows \\?\UNC\Server... long path scheme + INetURLObject base(u"file://ServerFoo/fooShare"); // set up base path + bool bWasAbsolute = false; + INetURLObject obj = base.smartRel2Abs( + u"\\\\?\\UNC\\ServerBar\\barShare\\baz.ext", bWasAbsolute); + CPPUNIT_ASSERT(bWasAbsolute); + CPPUNIT_ASSERT_EQUAL(OUString("file://ServerBar/barShare/baz.ext"), + obj.GetMainURL(INetURLObject::DecodeMechanism::NONE)); + } } // Change the following lines only, if you add, remove or rename diff --git a/tools/source/fsys/urlobj.cxx b/tools/source/fsys/urlobj.cxx index ca5a014ecc56..ae5e07797bc0 100644 --- a/tools/source/fsys/urlobj.cxx +++ b/tools/source/fsys/urlobj.cxx @@ -809,6 +809,17 @@ bool INetURLObject::setAbsURIRef(std::u16string_view rTheAbsURIRef, eMechanism = EncodeMechanism::All; nFragmentDelimiter = 0x80000000; } + else if (eStyle & FSysStyle::Dos + && pEnd - p1 >= 6 + && p1[0] == '\\' && p1[1] == '\\' && p1[2] == '?' && p1[3] == '\\' + && rtl::isAsciiAlpha(p1[4]) + && p1[5] == ':' + && (pEnd - p1 == 6 || p1[6] == '/' || p1[6] == '\\')) + { + m_eScheme = INetProtocol::File; // 8th, 9th + eMechanism = EncodeMechanism::All; + nFragmentDelimiter = 0x80000000; + } else if (pEnd - p1 >= 2 && p1[0] == '/' && p1[1] == '/') { p1 += 2; @@ -828,6 +839,14 @@ bool INetURLObject::setAbsURIRef(std::u16string_view rTheAbsURIRef, && p1[1] == '\\') { p1 += 2; + if (pEnd - p1 >= 6 && p1[0] == '?' && p1[1] == '\\' && p1[5] == '\\' + && rtl::toAsciiLowerCase(p1[2]) == 'u' + && rtl::toAsciiLowerCase(p1[3]) == 'n' + && rtl::toAsciiLowerCase(p1[4]) == 'c') + { + p1 += 6; // "\\?\UNC\Servername\..." + } + sal_Int32 n = rtl_ustr_indexOfChar_WithLength( p1, pEnd - p1, '\\'); sal_Unicode const * pe = n == -1 ? pEnd : p1 + n; @@ -1161,6 +1180,16 @@ bool INetURLObject::setAbsURIRef(std::u16string_view rTheAbsURIRef, && pPos[1] == '\\') { sal_Unicode const * p1 = pPos + 2; + sal_Unicode const * pHostPortTentativeBegin = p1; + if (pEnd - p1 >= 6 && p1[0] == '?' && p1[1] == '\\' && p1[5] == '\\' + && rtl::toAsciiLowerCase(p1[2]) == 'u' + && rtl::toAsciiLowerCase(p1[3]) == 'n' + && rtl::toAsciiLowerCase(p1[4]) == 'c') + { + p1 += 6; // "\\?\UNC\Servername\..." + pHostPortTentativeBegin = p1; + } + sal_Unicode const * pe = p1; while (pe < pEnd && *pe != '\\' && *pe != nFragmentDelimiter) @@ -1175,7 +1204,7 @@ bool INetURLObject::setAbsURIRef(std::u16string_view rTheAbsURIRef, ) { m_aAbsURIRef.append("//"); - pHostPortBegin = pPos + 2; + pHostPortBegin = pHostPortTentativeBegin; pHostPortEnd = pe; pPos = pe; nSegmentDelimiter = '\\'; @@ -1193,18 +1222,26 @@ bool INetURLObject::setAbsURIRef(std::u16string_view rTheAbsURIRef, // becomes // "file:///" ALPHA ":" ["/" *path] ["#" *UCS4] // replacing "\" by "/" within <*path> - if (eStyle & FSysStyle::Dos - && pEnd - pPos >= 2 - && rtl::isAsciiAlpha(pPos[0]) - && pPos[1] == ':' - && (pEnd - pPos == 2 - || pPos[2] == '/' - || pPos[2] == '\\')) + if (eStyle & FSysStyle::Dos) { - m_aAbsURIRef.append("//"); - nAltSegmentDelimiter = '\\'; - bSkippedInitialSlash = true; - break; + sal_Unicode const* p1 = pPos; + if (pEnd - p1 >= 4 && p1[0] == '\\' && p1[1] == '\\' && p1[2] == '?' + && p1[3] == '\\') + p1 += 4; // "\\?\c:\..." + + if (pEnd - p1 >= 2 + && rtl::isAsciiAlpha(p1[0]) + && p1[1] == ':' + && (pEnd - p1 == 2 + || p1[2] == '/' + || p1[2] == '\\')) + { + pPos = p1; + m_aAbsURIRef.append("//"); + nAltSegmentDelimiter = '\\'; + bSkippedInitialSlash = true; + break; + } } // 9th Production (any): @@ -1581,12 +1618,35 @@ bool INetURLObject::convertRelToAbs(OUString const & rTheRelURIRef, q += 2; sal_Int32 n = rtl_ustr_indexOfChar_WithLength( q, pEnd - q, '\\'); - sal_Unicode const * qe = n == -1 ? pEnd : q + n; - if (parseHostOrNetBiosName( - q, qe, EncodeMechanism::All, RTL_TEXTENCODING_DONTKNOW, - true, nullptr)) + if (n == 1 && q[0] == '?') { - bFSys = true; // 1st + // "\\?\c:\..." or "\\?\UNC\servername\..." + q += 2; + if (pEnd - q >= 2 + && rtl::isAsciiAlpha(q[0]) + && q[1] == ':' + && (pEnd - q == 2 || q[2] == '/' || q[2] == '\\')) + { + bFSys = true; // 2nd, 3rd + } + else if (pEnd - q >= 4 + && q[3] == '\\' + && rtl::toAsciiLowerCase(q[0]) == 'u' + && rtl::toAsciiLowerCase(q[1]) == 'n' + && rtl::toAsciiLowerCase(q[2]) == 'c') + { + q += 4; // Check if it's 1st below + } + } + if (!bFSys) + { + sal_Unicode const * qe = n == -1 ? pEnd : q + n; + if (parseHostOrNetBiosName( + q, qe, EncodeMechanism::All, RTL_TEXTENCODING_DONTKNOW, + true, nullptr)) + { + bFSys = true; // 1st + } } } if (bFSys) commit 1f6eb154d859f28f9523961e7b3901603d69d445 Author: Mike Kaganski <mike.kagan...@collabora.com> AuthorDate: Tue Oct 31 20:43:52 2023 +0300 Commit: Xisco Fauli <xiscofa...@libreoffice.org> CommitDate: Thu Nov 2 00:53:37 2023 +0100 tdf#106057: Don't fail PDFReader::read, when several entries in stack It may happen in case of several trailers, which is OK. The calling code will check the type of the returned object anyway. Change-Id: I17b2f4b7cf0e0640f949565291ee5a905ef2411e Reviewed-on: https://gerrit.libreoffice.org/c/core/+/158737 Tested-by: Jenkins Reviewed-by: Mike Kaganski <mike.kagan...@collabora.com> Signed-off-by: Xisco Fauli <xiscofa...@libreoffice.org> Reviewed-on: https://gerrit.libreoffice.org/c/core/+/158698 diff --git a/sdext/source/pdfimport/pdfparse/pdfparse.cxx b/sdext/source/pdfimport/pdfparse/pdfparse.cxx index baa322c1aa3c..cdd3ac13ff35 100644 --- a/sdext/source/pdfimport/pdfparse/pdfparse.cxx +++ b/sdext/source/pdfimport/pdfparse/pdfparse.cxx @@ -601,21 +601,26 @@ std::unique_ptr<PDFEntry> PDFReader::read( const char* pFileName ) pRet.reset(aGrammar.m_aObjectStack.back()); aGrammar.m_aObjectStack.pop_back(); } -#if OSL_DEBUG_LEVEL > 0 else if( nEntries > 1 ) { + // It is possible that there are multiple trailers, which is OK. + // But still keep the warnings, just in case. SAL_WARN("sdext.pdfimport.pdfparse", "error got " << nEntries << " stack objects in parse"); - for( unsigned int i = 0; i < nEntries; i++ ) + for (;;) { - SAL_WARN("sdext.pdfimport.pdfparse", typeid(*aGrammar.m_aObjectStack[i]).name()); - PDFObject* pObj = dynamic_cast<PDFObject*>(aGrammar.m_aObjectStack[i]); + PDFEntry* pEntry = aGrammar.m_aObjectStack.back(); + aGrammar.m_aObjectStack.pop_back(); + SAL_WARN("sdext.pdfimport.pdfparse", typeid(*pEntry).name()); + PDFObject* pObj = dynamic_cast<PDFObject*>(pEntry); if( pObj ) SAL_WARN("sdext.pdfimport.pdfparse", " -> object " << pObj->m_nNumber << " generation " << pObj->m_nGeneration); - else - SAL_WARN("sdext.pdfimport.pdfparse", "(type " << typeid(*aGrammar.m_aObjectStack[i]).name() << ")"); + if (aGrammar.m_aObjectStack.empty()) + { + pRet.reset(pEntry); // The first entry references all others - see PDFGrammar dtor + break; + } } } -#endif return pRet; } commit c32e4b58906bf2bedc7b99dd1ac8ab252d67ba3a Author: Mike Kaganski <mike.kagan...@collabora.com> AuthorDate: Tue Oct 31 20:09:35 2023 +0300 Commit: Xisco Fauli <xiscofa...@libreoffice.org> CommitDate: Thu Nov 2 00:53:28 2023 +0100 Try to revert to use of file_iterator from boost on Windows It was disabled in commit ef8d59c5b909d5a9b956934ab1120f90b90a4e10 (vcl108: #i106853# work around broken file_iterator on Windows, 2009-12-01), referencing boost 1.39. It seems to work fine now, so let's revert it, and hope it doesn't break something. Change-Id: I208aa87eca146a29ffc2f36a48810ecda5df0f00 Reviewed-on: https://gerrit.libreoffice.org/c/core/+/158736 Tested-by: Jenkins Reviewed-by: Mike Kaganski <mike.kagan...@collabora.com> Signed-off-by: Xisco Fauli <xiscofa...@libreoffice.org> Reviewed-on: https://gerrit.libreoffice.org/c/core/+/158742 diff --git a/sdext/source/pdfimport/pdfparse/pdfparse.cxx b/sdext/source/pdfimport/pdfparse/pdfparse.cxx index 7cef299e8eaa..baa322c1aa3c 100644 --- a/sdext/source/pdfimport/pdfparse/pdfparse.cxx +++ b/sdext/source/pdfimport/pdfparse/pdfparse.cxx @@ -558,83 +558,8 @@ public: } -#ifdef _WIN32 -std::unique_ptr<PDFEntry> PDFReader::read( const char* pBuffer, unsigned int nLen ) -{ - PDFGrammar<const char*> aGrammar( pBuffer ); - - try - { -#if OSL_DEBUG_LEVEL > 0 - boost::spirit::classic::parse_info<const char*> aInfo = -#endif - boost::spirit::classic::parse( pBuffer, - pBuffer+nLen, - aGrammar, - boost::spirit::classic::space_p ); -#if OSL_DEBUG_LEVEL > 0 - SAL_INFO("sdext.pdfimport.pdfparse", "parseinfo: stop = " << aInfo.stop << " (buff=" << pBuffer << ", offset = " << aInfo.stop - pBuffer << "), hit = " << (aInfo.hit ? OUString("true") : OUString("false")) << ", full = " << (aInfo.full ? OUString("true") : OUString("false")) << ", length = " << static_cast<int>(aInfo.length) ); -#endif - } - catch( const parser_error<const char*, const char*>& rError ) - { -#if OSL_DEBUG_LEVEL > 0 - OString aTmp; - unsigned int nElem = aGrammar.m_aObjectStack.size(); - for( unsigned int i = 0; i < nElem; i++ ) - aTmp += OString::Concat(" ") + typeid( *(aGrammar.m_aObjectStack[i]) ).name(); - - SAL_WARN("sdext.pdfimport.pdfparse", "parse error: " << rError.descriptor << " at buffer pos " << rError.where - pBuffer << ", object stack: " << aTmp); -#else - (void)rError; -#endif - } - - std::unique_ptr<PDFEntry> pRet; - unsigned int nEntries = aGrammar.m_aObjectStack.size(); - if( nEntries == 1 ) - { - pRet.reset(aGrammar.m_aObjectStack.back()); - aGrammar.m_aObjectStack.pop_back(); - } -#if OSL_DEBUG_LEVEL > 0 - else if( nEntries > 1 ) - SAL_WARN("sdext.pdfimport.pdfparse", "error got " << nEntries << " stack objects in parse" ); -#endif - - return pRet; -} -#endif - std::unique_ptr<PDFEntry> PDFReader::read( const char* pFileName ) { -#ifdef _WIN32 - /* #i106583# - since converting to boost 1.39 file_iterator does not work anymore on all Windows systems - C++ stdlib istream_iterator does not allow "-" apparently - using spirit 2.0 doesn't work in our environment with the MSC - - So for the time being bite the bullet and read the whole file. - FIXME: give Spirit 2.x another try when we upgrade boost again. - */ - std::unique_ptr<PDFEntry> pRet; - FILE* fp = fopen( pFileName, "rb" ); - if( fp ) - { - fseek( fp, 0, SEEK_END ); - unsigned int nLen = static_cast<unsigned int>(ftell( fp )); - fseek( fp, 0, SEEK_SET ); - char* pBuf = static_cast<char*>(std::malloc( nLen )); - if( pBuf ) - { - fread( pBuf, 1, nLen, fp ); - pRet = read( pBuf, nLen ); - std::free( pBuf ); - } - fclose( fp ); - } - return pRet; -#else file_iterator<> file_start( pFileName ); if( ! file_start ) return nullptr; @@ -692,7 +617,6 @@ std::unique_ptr<PDFEntry> PDFReader::read( const char* pFileName ) } #endif return pRet; -#endif // WIN32 } #if defined(_MSC_VER) commit f0a9b44059f76f79ffddfdc012026ff2c592b5c1 Author: László Németh <nem...@numbertext.org> AuthorDate: Fri Oct 27 09:43:44 2023 +0200 Commit: Xisco Fauli <xiscofa...@libreoffice.org> CommitDate: Thu Nov 2 00:52:52 2023 +0100 tdf#157937 sw: fix freezing of cycle case on tracked changes Add loop control to avoid never-ending iteration on selected text with tracked changes, where transliteration can result empty strings. Regression since commit 2d3c77e9b10f20091ef338e262ba7756eb280ce9 "tdf#109266 sw change tracking: track transliteration". Change-Id: Ia5f92adfdda33562b4d1abe72c51134be8304639 Reviewed-on: https://gerrit.libreoffice.org/c/core/+/158525 Tested-by: Jenkins Reviewed-by: László Németh <nem...@numbertext.org> Signed-off-by: Xisco Fauli <xiscofa...@libreoffice.org> Reviewed-on: https://gerrit.libreoffice.org/c/core/+/158535 diff --git a/sw/qa/extras/uiwriter/data/tdf130088.docx b/sw/qa/extras/uiwriter/data/tdf130088.docx new file mode 100644 index 000000000000..8d5a7a604b5e Binary files /dev/null and b/sw/qa/extras/uiwriter/data/tdf130088.docx differ diff --git a/sw/qa/extras/uiwriter/uiwriter6.cxx b/sw/qa/extras/uiwriter/uiwriter6.cxx index 73178363b8fb..edfc5c153afc 100644 --- a/sw/qa/extras/uiwriter/uiwriter6.cxx +++ b/sw/qa/extras/uiwriter/uiwriter6.cxx @@ -662,6 +662,33 @@ CPPUNIT_TEST_FIXTURE(SwUiWriterTest6, testTdf113790) CPPUNIT_ASSERT(dynamic_cast<SwXTextDocument*>(mxComponent.get())); } +CPPUNIT_TEST_FIXTURE(SwUiWriterTest6, testTdf157937) +{ + createSwDoc("tdf130088.docx"); + SwDoc* pDoc = getSwDoc(); + SwWrtShell* pWrtShell = pDoc->GetDocShell()->GetWrtShell(); + + // select paragraph + pWrtShell->SelPara(nullptr); + + // enable redlining + dispatchCommand(mxComponent, ".uno:TrackChanges", {}); + CPPUNIT_ASSERT_MESSAGE("redlining should be on", + pDoc->getIDocumentRedlineAccess().IsRedlineOn()); + + // show changes + CPPUNIT_ASSERT_MESSAGE( + "redlines should be visible", + IDocumentRedlineAccess::IsShowChanges(pDoc->getIDocumentRedlineAccess().GetRedlineFlags())); + + // cycle case with change tracking + dispatchCommand(mxComponent, ".uno:ChangeCaseRotateCase", {}); + dispatchCommand(mxComponent, ".uno:ChangeCaseRotateCase", {}); + + // This resulted freezing + dispatchCommand(mxComponent, ".uno:ChangeCaseRotateCase", {}); +} + CPPUNIT_TEST_FIXTURE(SwUiWriterTest6, testTdf108048) { createSwDoc(); diff --git a/sw/source/core/txtnode/txtedt.cxx b/sw/source/core/txtnode/txtedt.cxx index 71ee1fd93a24..2f3e7aa6db86 100644 --- a/sw/source/core/txtnode/txtedt.cxx +++ b/sw/source/core/txtnode/txtedt.cxx @@ -1973,6 +1973,7 @@ void SwTextNode::TransliterateText( sal_Int32 nEndPos = 0; LanguageType nLang = LANGUAGE_NONE; + sal_Int32 nLoopControlRuns = 0; do { if( pIter ) { @@ -2005,7 +2006,13 @@ void SwTextNode::TransliterateText( } nStt = nEndPos; - } while( nEndPos < nEnd && pIter && pIter->Next() ); + + // tdf#157937 selection containing tracked changes needs loop control: + // stop looping, if there are too much empty transliterations + if ( sChgd.isEmpty() ) + ++nLoopControlRuns; + + } while( nEndPos < nEnd && pIter && pIter->Next() && nLoopControlRuns < 100 ); } if (aChanges.empty()) commit 5879d4d242fb9b4227de068aa1adc3621e190754 Author: Xisco Fauli <xiscofa...@libreoffice.org> AuthorDate: Mon Oct 23 15:34:58 2023 +0200 Commit: Xisco Fauli <xiscofa...@libreoffice.org> CommitDate: Thu Nov 2 00:52:44 2023 +0100 tdf#157679: Revert "pptx: import shape text from master page" This reverts commit ae3b97a69688553e6c40ef4b64655db09d5a0f5e. Change-Id: I39fd84b5efbff0a2cafe090f4f866c801cef19b4 Reviewed-on: https://gerrit.libreoffice.org/c/core/+/158357 Tested-by: Jenkins Reviewed-by: Xisco Fauli <xiscofa...@libreoffice.org> (cherry picked from commit 3b37c5fa7dce7718b566ad4f4fe80191b64cd533) Reviewed-on: https://gerrit.libreoffice.org/c/core/+/158544 diff --git a/include/oox/drawingml/shape.hxx b/include/oox/drawingml/shape.hxx index 4c8be792e7f6..ccf477bef805 100644 --- a/include/oox/drawingml/shape.hxx +++ b/include/oox/drawingml/shape.hxx @@ -237,8 +237,6 @@ public: void setTxbxHasLinkedTxtBox( const bool rhs){ mbHasLinkedTxbx = rhs; }; const LinkedTxbxAttr& getLinkedTxbxAttributes() const { return maLinkedTxbxAttr; }; bool isLinkedTxbx() const { return mbHasLinkedTxbx; }; - void setHasCustomPrompt(bool bValue) { mbHasCustomPrompt = bValue; } - bool hasCustomPrompt() { return mbHasCustomPrompt; } void setZOrder(sal_Int32 nZOrder) { mnZOrder = nZOrder; } @@ -395,7 +393,6 @@ private: bool mbTextBox; ///< This shape has a textbox. LinkedTxbxAttr maLinkedTxbxAttr; bool mbHasLinkedTxbx; // this text box has linked text box ? - bool mbHasCustomPrompt; // indicates that it's not a generic placeholder css::uno::Sequence<css::beans::PropertyValue> maDiagramDoms; diff --git a/oox/source/drawingml/shape.cxx b/oox/source/drawingml/shape.cxx index 78b50294d356..cbfc2dae2dca 100644 --- a/oox/source/drawingml/shape.cxx +++ b/oox/source/drawingml/shape.cxx @@ -150,7 +150,6 @@ Shape::Shape( const char* pServiceName, bool bDefaultHeight ) , mbWps( false ) , mbTextBox( false ) , mbHasLinkedTxbx( false ) -, mbHasCustomPrompt( false ) , maDiagramDoms( 0 ) , mpDiagramHelper( nullptr ) { @@ -195,7 +194,6 @@ Shape::Shape( const ShapePtr& pSourceShape ) , mbWps( pSourceShape->mbWps ) , mbTextBox( pSourceShape->mbTextBox ) , mbHasLinkedTxbx(false) -, mbHasCustomPrompt( pSourceShape->mbHasCustomPrompt ) , maDiagramDoms( pSourceShape->maDiagramDoms ) , mnZOrder(pSourceShape->mnZOrder) , mnZOrderOff(pSourceShape->mnZOrderOff) diff --git a/oox/source/drawingml/shapecontext.cxx b/oox/source/drawingml/shapecontext.cxx index 3375f6f6dddd..289cda8dfd66 100644 --- a/oox/source/drawingml/shapecontext.cxx +++ b/oox/source/drawingml/shapecontext.cxx @@ -89,8 +89,6 @@ ContextHandlerRef ShapeContext::onCreateContext( sal_Int32 aElementToken, const mpShapePtr->setSubType( rAttribs.getToken( XML_type, XML_obj ) ); if( rAttribs.hasAttribute( XML_idx ) ) mpShapePtr->setSubTypeIndex( rAttribs.getInteger( XML_idx, 0 ) ); - if( rAttribs.hasAttribute( XML_hasCustomPrompt ) ) - mpShapePtr->setHasCustomPrompt( rAttribs.getBool( XML_hasCustomPrompt, false ) ); break; // nvSpPr CT_ShapeNonVisual end diff --git a/oox/source/ppt/pptshape.cxx b/oox/source/ppt/pptshape.cxx index 9634d44e83fe..4ed668367a1e 100644 --- a/oox/source/ppt/pptshape.cxx +++ b/oox/source/ppt/pptshape.cxx @@ -457,10 +457,6 @@ void PPTShape::addShape( Reference < XText > xText(mxShape, UNO_QUERY); if (xText.is()) { - if (mpPlaceholder && mpPlaceholder->getTextBody() && !mpPlaceholder->getTextBody()->isEmpty() - && mpPlaceholder->hasCustomPrompt()) - xText->setString(mpPlaceholder->getTextBody()->toString()); - TextCharacterProperties aCharStyleProperties; getTextBody()->ApplyStyleEmpty(rFilterBase, xText, aCharStyleProperties, mpMasterTextListStyle); } diff --git a/sd/qa/unit/data/pptx/shape-master-text.pptx b/sd/qa/unit/data/pptx/shape-master-text.pptx deleted file mode 100644 index ca056b852d3a..000000000000 Binary files a/sd/qa/unit/data/pptx/shape-master-text.pptx and /dev/null differ diff --git a/sd/qa/unit/import-tests2.cxx b/sd/qa/unit/import-tests2.cxx index 0ca3513ae00c..44eacbf1da05 100644 --- a/sd/qa/unit/import-tests2.cxx +++ b/sd/qa/unit/import-tests2.cxx @@ -1904,17 +1904,6 @@ CPPUNIT_TEST_FIXTURE(SdImportTest2, testOverflowBehaviorClip) } } -CPPUNIT_TEST_FIXTURE(SdImportTest2, testShapeMasterText) -{ - createSdImpressDoc("pptx/shape-master-text.pptx"); - uno::Reference<beans::XPropertySet> xShape(getShapeFromPage(0, 0)); - - uno::Reference<text::XTextRange> const xParagraph(getParagraphFromShape(0, xShape)); - - uno::Reference<text::XTextRange> xRun(getRunFromParagraph(0, xParagraph)); - CPPUNIT_ASSERT_EQUAL(OUString("Custom"), xRun->getString()); -} - CPPUNIT_TEST_FIXTURE(SdImportTest2, testIndentDuplication) { createSdImpressDoc("pptx/formatting-bullet-indent.pptx"); commit e61f8a36220d6e8800dd0decf2a680db97c371c9 Author: Andreas Heinisch <andreas.heini...@yahoo.de> AuthorDate: Mon Oct 23 23:13:51 2023 +0200 Commit: Xisco Fauli <xiscofa...@libreoffice.org> CommitDate: Thu Nov 2 00:51:24 2023 +0100 tdf#157897 - Clear print ranges before adding additional ones Otherwise, additional print ranges will be added for linked files after the external link will be updated. Change-Id: I0556fda6609d3e18f1ca992dc6a0399be01bc841 Reviewed-on: https://gerrit.libreoffice.org/c/core/+/158365 Tested-by: Jenkins Reviewed-by: Andreas Heinisch <andreas.heini...@yahoo.de> (cherry picked from commit 96b91357fb93028d35d70bdb52b4bac3ecbfbf57) Reviewed-on: https://gerrit.libreoffice.org/c/core/+/158534 Reviewed-by: Xisco Fauli <xiscofa...@libreoffice.org> diff --git a/sc/qa/unit/uicalc/data/tdf157897_linked.ods b/sc/qa/unit/uicalc/data/tdf157897_linked.ods new file mode 100755 index 000000000000..bb75c31d82ae Binary files /dev/null and b/sc/qa/unit/uicalc/data/tdf157897_linked.ods differ diff --git a/sc/qa/unit/uicalc/data/tdf157897_main.ods b/sc/qa/unit/uicalc/data/tdf157897_main.ods new file mode 100755 index 000000000000..1e1af575145f Binary files /dev/null and b/sc/qa/unit/uicalc/data/tdf157897_main.ods differ diff --git a/sc/qa/unit/uicalc/uicalc.cxx b/sc/qa/unit/uicalc/uicalc.cxx index d96b78b87136..a2b96bfda52c 100644 --- a/sc/qa/unit/uicalc/uicalc.cxx +++ b/sc/qa/unit/uicalc/uicalc.cxx @@ -1380,6 +1380,25 @@ CPPUNIT_TEST_FIXTURE(ScUiCalcTest, testTdf146994) CPPUNIT_ASSERT_EQUAL(OUString("Sheet1.D3:Sheet1.D4"), aMarkedAreaString); } +CPPUNIT_TEST_FIXTURE(ScUiCalcTest, testTdf157897_duplicated_print_ranges) +{ + createScDoc("tdf157897_main.ods"); + ScDocument* pDoc = getScDoc(); + + const sal_uInt16 nPos = 0; + const SCTAB nFirstTab = 0; + // Ensure that there exists a print range in the first documents tab + CPPUNIT_ASSERT_EQUAL(static_cast<sal_uInt16>(1), pDoc->GetPrintRangeCount(nFirstTab)); + + // Reload all links and check if the print range was not duplicated + const auto initialPrintRange = pDoc->GetPrintRange(nFirstTab, nPos); + ScDocShell* pDocSh = getScDocShell(); + pDocSh->ReloadAllLinks(); + + // Without the fix in place, the print range in the linked tab will be duplicated + CPPUNIT_ASSERT_EQUAL(initialPrintRange, pDoc->GetPrintRange(nFirstTab, nPos)); +} + CPPUNIT_TEST_FIXTURE(ScUiCalcTest, testTdf154991) { createScDoc("tdf154991.ods"); diff --git a/sc/source/core/data/documen2.cxx b/sc/source/core/data/documen2.cxx index e5d5df5a94cb..7766d54aba99 100644 --- a/sc/source/core/data/documen2.cxx +++ b/sc/source/core/data/documen2.cxx @@ -1042,6 +1042,8 @@ sal_uLong ScDocument::TransferTab( ScDocument& rSrcDoc, SCTAB nSrcPos, maTabs[nDestPos]->SetPrintEntireSheet(); else { + // tdf#157897 - clear print ranges before adding additional ones + maTabs[nDestPos]->ClearPrintRanges(); const auto nPrintRangeCount = rSrcDoc.maTabs[nSrcPos]->GetPrintRangeCount(); for (auto nPos = 0; nPos < nPrintRangeCount; nPos++) { commit 533e84c07b249334fb32495bb923264fb89dbdaf Author: Taichi Haradaguchi <20001...@ymail.ne.jp> AuthorDate: Sun Oct 1 00:30:13 2023 +0900 Commit: Xisco Fauli <xiscofa...@libreoffice.org> CommitDate: Thu Nov 2 00:51:09 2023 +0100 Upgrade Harfbuzz to 8.2.2 Fix regression from 8.2.0 in parsing CSS-style feature strings. (https://lists.freedesktop.org/archives/libreoffice/2023-September/091026.html) (https://github.com/harfbuzz/harfbuzz/issues/4414) Change-Id: Ifdaeb7b2a9a5da2866810e4d5298f57a0fd9bd9f Reviewed-on: https://gerrit.libreoffice.org/c/core/+/157434 Reviewed-by: Caolán McNamara <caolan.mcnam...@collabora.com> Tested-by: Caolán McNamara <caolan.mcnam...@collabora.com> (cherry picked from commit d8326f1f54b2f4644b52fbfa7106eeeae6e5bb7b) Reviewed-on: https://gerrit.libreoffice.org/c/core/+/158704 Tested-by: Jenkins Reviewed-by: Xisco Fauli <xiscofa...@libreoffice.org> diff --git a/download.lst b/download.lst index 04ed71b1ae90..b5516ffb6749 100644 --- a/download.lst +++ b/download.lst @@ -222,8 +222,8 @@ GRAPHITE_TARBALL := graphite2-minimal-1.3.14.tgz # three static lines # so that git cherry-pick # will not run into conflicts -HARFBUZZ_SHA256SUM := 1f98b5e3d06a344fe667d7e8210094ced458791499839bddde98c167ce6a7c79 -HARFBUZZ_TARBALL := harfbuzz-8.0.0.tar.xz +HARFBUZZ_SHA256SUM := e433ad85fbdf57f680be29479b3f964577379aaf319f557eb76569f0ecbc90f3 +HARFBUZZ_TARBALL := harfbuzz-8.2.2.tar.xz # three static lines # so that git cherry-pick # will not run into conflicts commit aa8d68f9764eb7714871de7c56b5a0ca7c2ead8b Author: Maxim Monastirsky <momonas...@gmail.com> AuthorDate: Wed May 31 21:59:06 2023 +0300 Commit: Xisco Fauli <xiscofa...@libreoffice.org> CommitDate: Wed Nov 1 21:56:33 2023 +0100 tdf#103064 editeng: fix handling of char highlighting Transparency should be set to false if a color is present, but not with COL_TRANSPARENT. Compare with what is done for shape text in VclProcessor2D::RenderTextSimpleOrDecoratedPortionPrimitive2D. Change-Id: I5e4c8e53b53a363813ced50358c5ee795cdb61dd Reviewed-on: https://gerrit.libreoffice.org/c/core/+/153107 Tested-by: Jenkins Reviewed-by: Maxim Monastirsky <momonas...@gmail.com> (cherry picked from commit 9474ff4cc0abbd16f91ea582050c2332bdad88a3) Reviewed-on: https://gerrit.libreoffice.org/c/core/+/158699 Reviewed-by: Xisco Fauli <xiscofa...@libreoffice.org> diff --git a/editeng/source/editeng/editattr.cxx b/editeng/source/editeng/editattr.cxx index 3277ed0916ba..42e5f20206ba 100644 --- a/editeng/source/editeng/editattr.cxx +++ b/editeng/source/editeng/editattr.cxx @@ -230,7 +230,7 @@ EditCharAttribBackgroundColor::EditCharAttribBackgroundColor( void EditCharAttribBackgroundColor::SetFont( SvxFont& rFont, OutputDevice* ) { Color aColor = static_cast<const SvxColorItem*>(GetItem())->GetValue(); - rFont.SetTransparent(false); + rFont.SetTransparent(aColor == COL_TRANSPARENT); rFont.SetFillColor(aColor); } diff --git a/editeng/source/editeng/editdoc.cxx b/editeng/source/editeng/editdoc.cxx index 9fff222d9368..08750a94fcd2 100644 --- a/editeng/source/editeng/editdoc.cxx +++ b/editeng/source/editeng/editdoc.cxx @@ -1976,7 +1976,6 @@ void CreateFont( SvxFont& rFont, const SfxItemSet& rSet, bool bSearchInParent, S { vcl::Font aPrevFont( rFont ); rFont.SetAlignment( ALIGN_BASELINE ); - rFont.SetTransparent( true ); sal_uInt16 nWhich_FontInfo = GetScriptItemId( EE_CHAR_FONTINFO, nScriptType ); sal_uInt16 nWhich_Language = GetScriptItemId( EE_CHAR_LANGUAGE, nScriptType ); @@ -1997,7 +1996,11 @@ void CreateFont( SvxFont& rFont, const SfxItemSet& rSet, bool bSearchInParent, S if ( bSearchInParent || ( rSet.GetItemState( EE_CHAR_COLOR ) == SfxItemState::SET ) ) rFont.SetColor( rSet.Get( EE_CHAR_COLOR ).GetValue() ); if ( bSearchInParent || ( rSet.GetItemState( EE_CHAR_BKGCOLOR ) == SfxItemState::SET ) ) - rFont.SetFillColor( rSet.Get( EE_CHAR_BKGCOLOR ).GetValue() ); + { + auto& aColor = rSet.Get( EE_CHAR_BKGCOLOR ).GetValue(); + rFont.SetTransparent(aColor == COL_TRANSPARENT); + rFont.SetFillColor(aColor); + } if ( bSearchInParent || ( rSet.GetItemState( nWhich_FontHeight ) == SfxItemState::SET ) ) rFont.SetFontSize( Size( rFont.GetFontSize().Width(), static_cast<const SvxFontHeightItem&>(rSet.Get( nWhich_FontHeight ) ).GetHeight() ) ); if ( bSearchInParent || ( rSet.GetItemState( nWhich_Weight ) == SfxItemState::SET ) ) commit 9925d34afafc714d9c9c26f295fb7f88493c071d Author: Henry Castro <hcas...@collabora.com> AuthorDate: Mon Oct 9 07:34:02 2023 -0400 Commit: Henry Castro <hcas...@collabora.com> CommitDate: Wed Nov 1 14:08:22 2023 +0100 tdf#155512: oox: ppt: fix import master slides, follow up Import all master slides. Signed-off-by: Henry Castro <hcas...@collabora.com> Change-Id: Ieac68bacf15c75e4c23ec692aadcb16033cdd092 Reviewed-on: https://gerrit.libreoffice.org/c/core/+/157701 Tested-by: Jenkins CollaboraOffice <jenkinscollaboraoff...@gmail.com> Reviewed-by: Caolán McNamara <caolan.mcnam...@collabora.com> Reviewed-on: https://gerrit.libreoffice.org/c/core/+/158716 Tested-by: Jenkins (cherry picked from commit b835bcfad2290c37c60d2fab0f276ab57aef56c1) Reviewed-on: https://gerrit.libreoffice.org/c/core/+/158697 diff --git a/include/oox/ppt/presentationfragmenthandler.hxx b/include/oox/ppt/presentationfragmenthandler.hxx index 29204b282bdb..20fc521ae8c5 100644 --- a/include/oox/ppt/presentationfragmenthandler.hxx +++ b/include/oox/ppt/presentationfragmenthandler.hxx @@ -52,10 +52,10 @@ private: void importSlide( const ::oox::core::FragmentHandlerRef& rSlideFragmentHandler, const oox::ppt::SlidePersistPtr& rPersist ); void importSlide(sal_uInt32 nSlide, bool bFirstSlide, bool bImportNotes); - oox::ppt::SlidePersistPtr importMasterSlide(const ::com::sun::star::uno::Reference<::com::sun::star::frame::XModel>& xModel, - ::oox::ppt::PowerPointImport& rFilter, - std::u16string_view rLayoutFragmentPath, - std::u16string_view rMasterFragmentPath); + void importMasterSlides(); + void importMasterSlide(const ::com::sun::star::uno::Reference<::com::sun::star::frame::XModel>& xModel, + ::oox::ppt::PowerPointImport& rFilter, + const OUString& rMasterFragmentPath); void saveThemeToGrabBag(const oox::drawingml::ThemePtr& pThemePtr, sal_Int32 nThemeIdx); void importCustomSlideShow(std::vector<CustomShow>& rCustomShowList); static void importSlideNames(::oox::core::XmlFilterBase& rFilter, const std::vector<SlidePersistPtr>& rSlidePersist); diff --git a/oox/source/ppt/presentationfragmenthandler.cxx b/oox/source/ppt/presentationfragmenthandler.cxx index dab9648cb025..b7730ef32faf 100644 --- a/oox/source/ppt/presentationfragmenthandler.cxx +++ b/oox/source/ppt/presentationfragmenthandler.cxx @@ -215,18 +215,16 @@ void PresentationFragmentHandler::importCustomSlideShow(std::vector<CustomShow>& } } -SlidePersistPtr PresentationFragmentHandler::importMasterSlide(const Reference<frame::XModel>& xModel, - PowerPointImport& rFilter, - std::u16string_view rLayoutFragmentPath, - std::u16string_view rMasterFragmentPath) +void PresentationFragmentHandler::importMasterSlide(const Reference<frame::XModel>& xModel, + PowerPointImport& rFilter, + const OUString& rMasterFragmentPath) { OUString aLayoutFragmentPath; - OUString aMasterFragmentPath(rMasterFragmentPath); - SlidePersistPtr pMasterPersistPtr, pMasterPtr; + SlidePersistPtr pMasterPersistPtr; Reference< drawing::XDrawPage > xMasterPage; Reference< drawing::XMasterPagesSupplier > xMPS( xModel, uno::UNO_QUERY_THROW ); Reference< drawing::XDrawPages > xMasterPages( xMPS->getMasterPages(), uno::UNO_SET_THROW ); - RelationsRef xMasterRelations = rFilter.importRelations( aMasterFragmentPath ); + RelationsRef xMasterRelations = rFilter.importRelations( rMasterFragmentPath ); for (const auto& rEntry : *xMasterRelations) { @@ -252,7 +250,7 @@ SlidePersistPtr PresentationFragmentHandler::importMasterSlide(const Reference<f pMasterPersistPtr->setLayoutPath( aLayoutFragmentPath ); rFilter.getMasterPages().push_back( pMasterPersistPtr ); rFilter.setActualSlidePersist( pMasterPersistPtr ); - FragmentHandlerRef xMasterFragmentHandler( new SlideFragmentHandler( rFilter, aMasterFragmentPath, pMasterPersistPtr, Master ) ); + FragmentHandlerRef xMasterFragmentHandler( new SlideFragmentHandler( rFilter, rMasterFragmentPath, pMasterPersistPtr, Master ) ); // set the correct theme OUString aThemeFragmentPath = xMasterFragmentHandler->getFragmentPathFromFirstTypeFromOfficeDoc( u"theme" ); @@ -297,14 +295,7 @@ SlidePersistPtr PresentationFragmentHandler::importMasterSlide(const Reference<f { pTheme->addTheme(pMasterPersistPtr->getPage()); } - - if (pMasterPersistPtr->getLayoutPath() == rLayoutFragmentPath) - { - pMasterPtr = pMasterPersistPtr; - } } - - return pMasterPtr; } void PresentationFragmentHandler::saveThemeToGrabBag(const oox::drawingml::ThemePtr& pThemePtr, @@ -374,6 +365,19 @@ void PresentationFragmentHandler::saveThemeToGrabBag(const oox::drawingml::Theme } } +void PresentationFragmentHandler::importMasterSlides() +{ + OUString aMasterFragmentPath; + PowerPointImport& rFilter = dynamic_cast<PowerPointImport&>(getFilter()); + Reference<frame::XModel> xModel(rFilter.getModel()); + + for (size_t nMaster = 0; nMaster < maSlideMasterVector.size(); ++nMaster) + { + aMasterFragmentPath = getFragmentPathFromRelId(maSlideMasterVector[nMaster]); + importMasterSlide(xModel, rFilter, aMasterFragmentPath); + } +} + void PresentationFragmentHandler::importSlide(sal_uInt32 nSlide, bool bFirstPage, bool bImportNotesPage) { PowerPointImport& rFilter = dynamic_cast< PowerPointImport& >( getFilter() ); @@ -388,7 +392,10 @@ void PresentationFragmentHandler::importSlide(sal_uInt32 nSlide, bool bFirstPage try { if( bFirstPage ) + { xDrawPages->getByIndex( 0 ) >>= xSlide; + importMasterSlides(); + } else xSlide = xDrawPages->insertNewByIndex( xDrawPages->getCount() ); @@ -421,11 +428,6 @@ void PresentationFragmentHandler::importSlide(sal_uInt32 nSlide, bool bFirstPage break; } } - - if ( !pMasterPersistPtr ) - { // masterpersist not found, we have to load it - pMasterPersistPtr = importMasterSlide(xModel, rFilter, aLayoutFragmentPath, aMasterFragmentPath); - } } } commit 7a062cdd9b91c577b2296bfe1f81ea78e0b75168 Author: Andreas Heinisch <andreas.heini...@yahoo.de> AuthorDate: Tue Oct 31 15:48:44 2023 +0100 Commit: Adolfo Jayme Barrientos <fit...@ubuntu.com> CommitDate: Wed Nov 1 05:58:04 2023 +0100 tdf#100584, tdf#157784 - Arrange sheets depending on the RTL settings The tab bar's position should be determined globally based on the RTL settings, rather than being individually set for each sheet. Change-Id: I0690b01c842d2da6d49b57d1adad0a8e0844087f Reviewed-on: https://gerrit.libreoffice.org/c/core/+/158730 Tested-by: Andreas Heinisch <andreas.heini...@yahoo.de> Reviewed-by: Andreas Heinisch <andreas.heini...@yahoo.de> (cherry picked from commit 4f1b3c16f5530a2a190cab07c07c7bf63acf42c7) Reviewed-on: https://gerrit.libreoffice.org/c/core/+/158696 Tested-by: Jenkins Reviewed-by: Adolfo Jayme Barrientos <fit...@ubuntu.com> diff --git a/sc/source/ui/view/tabview.cxx b/sc/source/ui/view/tabview.cxx index b6c7a2bd8e66..56776d2d9b49 100644 --- a/sc/source/ui/view/tabview.cxx +++ b/sc/source/ui/view/tabview.cxx @@ -280,7 +280,8 @@ void ScTabView::DoResize( const Point& rOffset, const Size& rSize, bool bInner ) if (bHasHint) RemoveHintWindow(); - bool bLayoutRTL = aViewData.GetDocument().IsLayoutRTL( aViewData.GetTabNo() ); + // tdf#100584 - arrange sheets depending on the RTL settings + bool bLayoutRTL = AllSettings::GetLayoutRTL(); tools::Long nTotalWidth = rSize.Width(); if ( bLayoutRTL ) nTotalWidth += 2*rOffset.X(); diff --git a/svtools/source/control/tabbar.cxx b/svtools/source/control/tabbar.cxx index 1690269ba234..02a23b8aea33 100644 --- a/svtools/source/control/tabbar.cxx +++ b/svtools/source/control/tabbar.cxx @@ -715,9 +715,7 @@ void TabBar::ImplFormat() const size_t nItemListSize = mpImpl->maItemList.size(); for (size_t nItemIndex = 0; nItemIndex < nItemListSize; nItemIndex++) { - // tdf#100584 - arrange sheets depending on the RTL settings - auto& rItem = mbMirrored ? mpImpl->maItemList[nItemListSize - nItemIndex - 1] - : mpImpl->maItemList[nItemIndex]; + auto& rItem = mpImpl->maItemList[nItemIndex]; // At all non-visible tabs an empty rectangle is set if ((nItemIndex + 1 < mnFirstPos) || (x > mnLastOffX)) commit a1b3d8d6e90923f2cd03a556afd09edc2d084475 Author: Henry Castro <hcas...@collabora.com> AuthorDate: Tue Oct 17 07:42:52 2023 -0400 Commit: Henry Castro <hcas...@collabora.com> CommitDate: Tue Oct 31 15:56:19 2023 +0100 tdf#155512: sd: filter: eppt: add "SlideLayout" property to Slide Master If it is importing all Slide Master from pptx file, unfortunately it breaks the exporting to pptx due to save and reload unit test failures According to the documentation http://officeopenxml.com/prSlideLayout.php, so the file pptx has a relationship Slide -> Slide Layout -> Slide Master The Slide Layout is a template an unique to be reused with Slide Master, so exporting requires to compare the templates due to LibreOffice relation Slide -> Slide Master Adjust unit test values: SdOOXMLExportTest2::testTdf106867 revert adcde78935fb8ca2b93322aa3a558d0b3ccdbfad SdOOXMLExportTest2::testTdf112280 revert adcde78935fb8ca2b93322aa3a558d0b3ccdbfad SdOOXMLExportTest2::testThemeColors and SdOOXMLExportTest3::testTdf114848 The file tdf84205.pptx does not contain theme2.xml, and save and reload it does not caintain theme2.xml too fix "An uncaught exception of type com.sun.star.container.NoSuchElementException" Signed-off-by: Henry Castro <hcas...@collabora.com> Change-Id: I622e9d5d68c406ff520387f3903808613d1cd3d9 Reviewed-on: https://gerrit.libreoffice.org/c/core/+/158084 Tested-by: Jenkins CollaboraOffice <jenkinscollaboraoff...@gmail.com> Reviewed-by: Caolán McNamara <caolan.mcnam...@collabora.com> Reviewed-on: https://gerrit.libreoffice.org/c/core/+/158676 Tested-by: Jenkins Reviewed-on: https://gerrit.libreoffice.org/c/core/+/158717 diff --git a/oox/source/ppt/presentationfragmenthandler.cxx b/oox/source/ppt/presentationfragmenthandler.cxx index 09c39902a66a..dab9648cb025 100644 --- a/oox/source/ppt/presentationfragmenthandler.cxx +++ b/oox/source/ppt/presentationfragmenthandler.cxx @@ -230,6 +230,9 @@ SlidePersistPtr PresentationFragmentHandler::importMasterSlide(const Reference<f for (const auto& rEntry : *xMasterRelations) { + if (!rEntry.second.maType.endsWith("relationships/slideLayout")) + continue; + aLayoutFragmentPath = xMasterRelations->getFragmentPathFromRelation(rEntry.second); sal_Int32 nIndex; @@ -286,6 +289,9 @@ SlidePersistPtr PresentationFragmentHandler::importMasterSlide(const Reference<f pMasterPersistPtr->createBackground( rFilter ); pMasterPersistPtr->createXShapes( rFilter ); + uno::Reference< beans::XPropertySet > xSet(pMasterPersistPtr->getPage(), uno::UNO_QUERY_THROW); + xSet->setPropertyValue("SlideLayout", Any(pMasterPersistPtr->getLayoutFromValueToken())); + oox::drawingml::ThemePtr pTheme = pMasterPersistPtr->getTheme(); if (pTheme) { diff --git a/sd/qa/unit/export-tests-ooxml2.cxx b/sd/qa/unit/export-tests-ooxml2.cxx index 754ee0d3035e..ed6568d0bc1f 100644 --- a/sd/qa/unit/export-tests-ooxml2.cxx +++ b/sd/qa/unit/export-tests-ooxml2.cxx @@ -1313,7 +1313,7 @@ CPPUNIT_TEST_FIXTURE(SdOOXMLExportTest2, testTdf106867) "/p:sld/p:timing/p:tnLst/p:par/p:cTn/p:childTnLst/p:seq/p:cTn/p:childTnLst/p:par/" "p:cTn/p:childTnLst/p:par/p:cTn/p:childTnLst/p:par/p:cTn/p:childTnLst/p:cmd/" "p:cBhvr/p:tgtEl/p:spTgt", - "spid", "491"); + "spid", "42"); } CPPUNIT_TEST_FIXTURE(SdOOXMLExportTest2, testTdf112280) @@ -1694,7 +1694,7 @@ CPPUNIT_TEST_FIXTURE(SdOOXMLExportTest2, testAccentColor) "70ad47"); xmlDocUniquePtr pXmlDocTheme2 = parseExport("ppt/theme/theme2.xml"); assertXPath(pXmlDocTheme2, "/a:theme/a:themeElements/a:clrScheme/a:accent6/a:srgbClr", "val", - "70ad47"); + "deb340"); // Without the accompanying fix in place, this test would have failed with: // - Expected: Motyw pakietu Office @@ -1709,7 +1709,7 @@ CPPUNIT_TEST_FIXTURE(SdOOXMLExportTest2, testThemeColors) createSdImpressDoc("pptx/tdf84205.pptx"); save("Impress Office Open XML"); - xmlDocUniquePtr pXmlDocTheme2 = parseExport("ppt/theme/theme2.xml"); + xmlDocUniquePtr pXmlDocTheme2 = parseExport("ppt/theme/theme1.xml"); assertXPath(pXmlDocTheme2, "/a:theme/a:themeElements/a:clrScheme/a:dk2/a:srgbClr", "val", "44546a"); assertXPath(pXmlDocTheme2, "/a:theme/a:themeElements/a:clrScheme/a:accent3/a:srgbClr", "val", diff --git a/sd/qa/unit/export-tests-ooxml3.cxx b/sd/qa/unit/export-tests-ooxml3.cxx index 5b33feacea63..3d630db22aa3 100644 --- a/sd/qa/unit/export-tests-ooxml3.cxx +++ b/sd/qa/unit/export-tests-ooxml3.cxx @@ -92,10 +92,6 @@ CPPUNIT_TEST_FIXTURE(SdOOXMLExportTest3, testTdf114848) xmlDocUniquePtr pXmlDocTheme1 = parseExport("ppt/theme/theme1.xml"); assertXPath(pXmlDocTheme1, "/a:theme/a:themeElements/a:clrScheme/a:dk2/a:srgbClr", "val", "1f497d"); - xmlDocUniquePtr pXmlDocTheme2 = parseExport("ppt/theme/theme2.xml"); - ... etc. - the rest is truncated