android/source/res/values-ab/strings.xml | 3 android/source/res/values-af/strings.xml | 10 android/source/res/values-ast/strings.xml | 6 android/source/res/values-ca/strings.xml | 6 android/source/res/values-cs/strings.xml | 2 android/source/res/values-cy/strings.xml | 6 android/source/res/values-de/strings.xml | 2 android/source/res/values-dsb/strings.xml | 6 android/source/res/values-el/strings.xml | 2 android/source/res/values-eo/strings.xml | 3 android/source/res/values-es/strings.xml | 6 android/source/res/values-eu/strings.xml | 6 android/source/res/values-fa/strings.xml | 2 android/source/res/values-fi/strings.xml | 3 android/source/res/values-fr/strings.xml | 8 android/source/res/values-gl/strings.xml | 6 android/source/res/values-hsb/strings.xml | 6 android/source/res/values-hu/strings.xml | 6 android/source/res/values-hy/strings.xml | 2 android/source/res/values-in/strings.xml | 2 android/source/res/values-is/strings.xml | 6 android/source/res/values-it/strings.xml | 6 android/source/res/values-iw/strings.xml | 4 android/source/res/values-ja/strings.xml | 2 android/source/res/values-ka/strings.xml | 2 android/source/res/values-kk/strings.xml | 3 android/source/res/values-ne/strings.xml | 3 android/source/res/values-nl/strings.xml | 8 android/source/res/values-pa/strings.xml | 6 android/source/res/values-pl/strings.xml | 10 android/source/res/values-pt-rBR/strings.xml | 6 android/source/res/values-pt/strings.xml | 6 android/source/res/values-ro/strings.xml | 3 android/source/res/values-sk/strings.xml | 2 android/source/res/values-sl/strings.xml | 6 android/source/res/values-tl/strings.xml | 2 android/source/res/values-tr/strings.xml | 4 android/source/res/values-uk/strings.xml | 6 android/source/res/values-zh-rTW/strings.xml | 2 bin/update/create_partial_update.py | 1 chart2/source/controller/itemsetwrapper/ItemConverter.cxx | 23 configure.ac | 4 connectivity/source/parse/sqlbison.y | 21 cui/source/dialogs/SpellDialog.cxx | 9 cui/source/inc/SpellDialog.hxx | 2 cui/source/options/appearance.cxx | 7 cui/source/options/treeopt.cxx | 4 cui/uiconfig/ui/optchartcolorspage.ui | 3 desktop/source/app/app.cxx | 54 drawinglayer/source/processor2d/processor2dtools.cxx | 56 drawinglayer/source/processor2d/vclmetafileprocessor2d.cxx | 4 editeng/source/editeng/impedit3.cxx | 2 external/liblangtag/ExternalProject_liblangtag.mk | 2 formula/source/core/api/token.cxx | 81 include/editeng/flditem.hxx | 14 include/formula/token.hxx | 17 include/formula/tokenarray.hxx | 7 include/svtools/colorcfg.hxx | 4 include/svx/svdpage.hxx | 2 include/vcl/task.hxx | 1 oox/source/drawingml/shape.cxx | 7 oox/source/export/chartexport.cxx | 39 oox/source/export/drawingml.cxx | 78 oox/source/export/shapes.cxx | 5 readlicense_oo/license/CREDITS.fodt | 6276 +++++----- sc/inc/patattr.hxx | 1 sc/inc/stlpool.hxx | 3 sc/qa/unit/data/functions/spreadsheet/fods/let.fods | 143 sc/qa/unit/data/functions/spreadsheet/fods/sort.fods | 313 sc/qa/unit/data/functions/spreadsheet/fods/sortby.fods | 512 sc/qa/unit/data/xlsx/tdf165503.xlsx |binary sc/qa/unit/subsequent_export_test4.cxx | 32 sc/source/core/data/patattr.cxx | 27 sc/source/core/data/stlpool.cxx | 11 sc/source/core/inc/interpre.hxx | 5 sc/source/core/tool/compiler.cxx | 9 sc/source/core/tool/interpr1.cxx | 158 sc/source/core/tool/interpr4.cxx | 3 sc/source/filter/ftools/ftools.cxx | 2 sc/source/filter/oox/defnamesbuffer.cxx | 7 sc/source/ui/view/output2.cxx | 2 sd/inc/sdpage.hxx | 2 sd/qa/unit/data/ppt/tdf165262.ppt |binary sd/qa/unit/data/pptx/tdf165341.pptx |binary sd/qa/unit/export-tests-ooxml3.cxx | 23 sd/qa/unit/import-tests2.cxx | 17 sd/source/core/drawdoc3.cxx | 7 sd/source/core/stlfamily.cxx | 11 sd/source/ui/app/optsitem.cxx | 29 sd/source/ui/dlg/tpoption.cxx | 2 sd/source/ui/func/fuinsert.cxx | 2 sd/source/ui/inc/DrawViewShell.hxx | 2 sd/source/ui/unoidl/unopage.cxx | 7 sd/source/ui/view/drviews2.cxx | 4 sd/source/ui/view/drviews4.cxx | 2 sd/source/ui/view/drviewsb.cxx | 3 sd/source/ui/view/drviewse.cxx | 12 sd/source/ui/view/drviewsf.cxx | 1 sd/source/ui/view/outlnvsh.cxx | 2 sd/source/ui/view/sdview2.cxx | 2 sdext/source/pdfimport/xpdfwrapper/wrapper_gpl.cxx | 4 sfx2/source/dialog/backingwindow.cxx | 2 sfx2/source/dialog/styledlg.cxx | 2 sfx2/source/doc/objstor.cxx | 3 svtools/source/config/colorcfg.cxx | 18 svx/source/svdraw/svdedxv.cxx | 4 svx/source/svdraw/svdotextdecomposition.cxx | 1 svx/source/svdraw/svdpage.cxx | 5 svx/uiconfig/ui/sidebarparagraph.ui | 4 sw/qa/core/uwriter.cxx | 14 sw/qa/extras/htmlexport/data/img_with_border.fodt | 24 sw/qa/extras/htmlexport/htmlexport2.cxx | 14 sw/qa/extras/layout/data/section-break-hidden-paragraphs.rtf | 68 sw/qa/extras/layout/data/table-in-section-truncated.fodt | 161 sw/qa/extras/layout/data/tdf164905.docx |binary sw/qa/extras/layout/data/tdf164907_rowHeightAtLeast.docx |binary sw/qa/extras/layout/layout.cxx | 38 sw/qa/extras/layout/layout2.cxx | 44 sw/qa/extras/layout/layout3.cxx | 16 sw/qa/extras/layout/layout4.cxx | 7 sw/qa/extras/rtfimport/data/165483.rtf | 12 sw/qa/extras/rtfimport/rtfimport.cxx | 12 sw/qa/extras/uiwriter/data/tdf164140.fodt | 117 sw/qa/extras/uiwriter/data/tdf165351.fodt | 158 sw/qa/extras/uiwriter/uiwriter9.cxx | 42 sw/source/core/access/AccessibilityCheck.cxx | 35 sw/source/core/access/AccessibilityIssue.cxx | 41 sw/source/core/inc/AccessibilityCheck.hxx | 2 sw/source/core/inc/AccessibilityIssue.hxx | 1 sw/source/core/inc/scriptinfo.hxx | 94 sw/source/core/layout/fly.cxx | 10 sw/source/core/layout/frmtool.cxx | 5 sw/source/core/layout/tabfrm.cxx | 34 sw/source/core/text/EnhancedPDFExportHelper.cxx | 21 sw/source/core/text/itradj.cxx | 279 sw/source/core/text/porlay.cxx | 355 sw/source/core/text/porlay.hxx | 4 sw/source/core/text/portxt.cxx | 15 sw/source/core/text/txtfrm.cxx | 13 sw/source/core/txtnode/OnlineAccessibilityCheck.cxx | 4 sw/source/core/txtnode/fntcache.cxx | 24 sw/source/core/txtnode/justify.cxx | 40 sw/source/core/txtnode/justify.hxx | 12 sw/source/filter/html/htmlflywriter.cxx | 3 sw/source/writerfilter/dmapper/DomainMapper.cxx | 11 sw/source/writerfilter/rtftok/rtfdocumentimpl.cxx | 51 sw/source/writerfilter/rtftok/rtfsprm.cxx | 9 unodevtools/source/skeletonmaker/javacompskeleton.cxx | 7 unodevtools/source/skeletonmaker/skeletoncommon.hxx | 4 unodevtools/source/skeletonmaker/skeletonmaker.cxx | 11 vcl/inc/osx/salframeview.h | 4 vcl/osx/salframe.cxx | 12 vcl/osx/salframeview.mm | 25 vcl/osx/salinst.cxx | 5 vcl/osx/vclnsapp.mm | 8 vcl/qa/cppunit/pdfexport/data/LinkPages.fodt | 4 vcl/qa/cppunit/pdfexport/data/LinkWithFly.fodt | 4 vcl/qa/cppunit/pdfexport/data/PDF_export_with_formcontrol.fodt | 4 vcl/qa/cppunit/pdfexport/pdfexport.cxx | 34 vcl/qa/cppunit/pdfexport/pdfexport2.cxx | 14 vcl/skia/gdiimpl.cxx | 19 vcl/source/app/scheduler.cxx | 30 vcl/source/app/settings.cxx | 64 vcl/source/gdi/pdfwriter_impl.cxx | 7 vcl/unx/gtk3/gtkinst.cxx | 9 vcl/unx/gtk3/salnativewidgets-gtk.cxx | 3 vcl/win/window/salframe.cxx | 1 167 files changed, 5969 insertions(+), 4392 deletions(-)
New commits: commit 65e5f4d939aabc1535c74acd62f4372e754e9bcf Author: Michael Stahl <michael.st...@allotropia.de> AuthorDate: Fri Mar 7 19:05:15 2025 +0100 Commit: Andras Timar <andras.ti...@collabora.com> CommitDate: Wed Mar 12 16:23:32 2025 +0100 sw: layout: hide text frame before table like Word There are several empty paragraphs before a table, all have the paragraph end marker hidden, and the first one is preceded by a section break, which is represented as a break item on the first text node in Writer. Word hides the paragraphs, so that the following table starts at the top of the page. Writer merges the paragraphs into one text frame, but it is not considered hidden because it doesn't contain any hidden characters; if you insert a character into a paragraph, the merged text frame will disappear! The first idea was to adapt SwTextFrame::IsHiddenNowImpl() to check if there isn't any text in the text frame and the paragraph end marker is hidden. But it turns out that the problem is more general: it's a problem of the sw_redlinehide merging, because an un-merged paragraph is hidden via a check of RES_CHRATR_HIDDEN in SwScriptInfo::selectHiddenTextProperty(). It's a bit nonobvious why this didn't work, and how it would interact with delete redlines, but 2 problems are that the case of the empty text frame needs a special case handling to get to this check in selectHiddenTextProperty(), and then GetBoundsOfHiddenRange() doesn't assign its outparameters in the special case of the empty paragraph; it looks like the values in m_HiddenChg should be 0, 0 then. Change-Id: I2ba85e98c02fb69159ee7ba77a7e4694fdf6fd52 Reviewed-on: https://gerrit.libreoffice.org/c/core/+/182642 Tested-by: Jenkins Reviewed-by: Michael Stahl <michael.st...@allotropia.de> (cherry picked from commit 7a9a1e8ef5ad9dd3e9b7d286a8f85d2f18088d29) Reviewed-on: https://gerrit.libreoffice.org/c/core/+/182773 Reviewed-by: Thorsten Behrens <thorsten.behr...@allotropia.de> diff --git a/sw/qa/extras/layout/data/section-break-hidden-paragraphs.rtf b/sw/qa/extras/layout/data/section-break-hidden-paragraphs.rtf new file mode 100644 index 000000000000..f8526dafe5ea --- /dev/null +++ b/sw/qa/extras/layout/data/section-break-hidden-paragraphs.rtf @@ -0,0 +1,68 @@ +{ tf1deflang1025nsinsicpg1252\uc1deff31507\deff0\stshfdbch31505\stshfloch31506\stshfhich31506\stshfbi31507\deflang2057\deflangfe1028 hemelang2057 hemelangfe1028 hemelangcs1025 +{onttbl{1bidi swisscharset0prq2{\*\panose 020b0604020202020204}Arial;} +{14bidi nilcharset136prq2{\*\panose 02010601000101010101}PMingLiU{\*alt Arial Unicode MS};}{34bidi romancharset0prq2{\*\panose 02040503050406030204}Cambria Math;} +{37bidi swisscharset0prq2{\*\panose 020f0502020204030204}Calibri;}{294 bidi nilcharset136prq2{\*\panose 00000000000000000000}@PMingLiU;} +{lomajor31500bidi romancharset0prq2{\*\panose 02020603050405020304}Times New Roman{\*alt Arial};}{dbmajor31501bidi nilcharset136prq2{\*\panose 02010601000101010101}PMingLiU{\*alt Arial Unicode MS};} +{himajor31502bidi swisscharset0prq2{\*\panose 020f0302020204030204}Calibri Light;}{bimajor31503bidi romancharset0 prq2{\*\panose 02020603050405020304}Times New Roman{\*alt Arial};} +{lominor31504bidi romancharset0prq2{\*\panose 02020603050405020304}Times New Roman{\*alt Arial};}{dbminor31505bidi nilcharset136prq2{\*\panose 02010601000101010101}PMingLiU{\*alt Arial Unicode MS};} +{himinor31506bidi swisscharset0prq2{\*\panose 020f0502020204030204}Calibri;}{biminor31507bidi swisscharset0 prq2{\*\panose 020b0604020202020204}Arial;}{305bidi swisscharset238prq2 Arial CE;} +{306bidi swisscharset204prq2 Arial Cyr;}{308bidi swisscharset161prq2 Arial Greek;}{309bidi swisscharset162prq2 Arial Tur;}{310bidi swiss charset177prq2 Arial (Hebrew);} +{311bidi swisscharset178prq2 Arial (Arabic);}{312bidi swisscharset186 prq2 Arial Baltic;}{313bidi swisscharset163prq2 Arial (Vietnamese);}{635 bidi romancharset238prq2 Cambria Math CE;} +{636bidi romancharset204prq2 Cambria Math Cyr;}{638bidi roman charset161prq2 Cambria Math Greek;}{639bidi romancharset162prq2 Cambria Math Tur;}{642bidi romancharset186prq2 Cambria Math Baltic;} +{643bidi romancharset163prq2 Cambria Math (Vietnamese);}{665bidi swiss charset238prq2 Calibri CE;}{666bidi swisscharset204prq2 Calibri Cyr;}{ 668bidi swisscharset161prq2 Calibri Greek;} +{669bidi swisscharset162prq2 Calibri Tur;}{670bidi swisscharset177 prq2 Calibri (Hebrew);}{671bidi swisscharset178prq2 Calibri (Arabic);}{ 672bidi swisscharset186prq2 Calibri Baltic;} +{673bidi swisscharset163prq2 Calibri (Vietnamese);}{lomajor31508bidi romancharset238prq2 Times New Roman CE{\*alt Arial};}{lomajor31509bidi romancharset204prq2 Times New Roman Cyr{\*alt Arial};} +{lomajor31511bidi romancharset161prq2 Times New Roman Greek{\*alt Arial};}{lomajor31512bidi romancharset162prq2 Times New Roman Tur{\*alt Arial};} +{lomajor31513bidi romancharset177prq2 Times New Roman (Hebrew){\*alt Arial};}{lomajor31514bidi romancharset178prq2 Times New Roman (Arabic){\* alt Arial};} +{lomajor31515bidi romancharset186prq2 Times New Roman Baltic{\*alt Arial};}{lomajor31516bidi romancharset163prq2 Times New Roman (Vietnamese){\*alt Arial};}{himajor31528bidi swisscharset238prq2 Calibri Light CE;} +{himajor31529bidi swisscharset204prq2 Calibri Light Cyr;}{himajor31531 bidi swisscharset161prq2 Calibri Light Greek;}{himajor31532bidi swiss charset162prq2 Calibri Light Tur;} +{himajor31533bidi swisscharset177prq2 Calibri Light (Hebrew);}{himajor 31534bidi swisscharset178prq2 Calibri Light (Arabic);}{himajor31535bidi swisscharset186prq2 Calibri Light Baltic;} +{himajor31536bidi swisscharset163prq2 Calibri Light (Vietnamese);}{ bimajor31538bidi romancharset238prq2 Times New Roman CE{\*alt Arial};}{ bimajor31539bidi romancharset204prq2 Times New Roman Cyr{\*alt Arial};} +{bimajor31541bidi romancharset161prq2 Times New Roman Greek{\*alt Arial};}{bimajor31542bidi romancharset162prq2 Times New Roman Tur{\*alt Arial};} +{bimajor31543bidi romancharset177prq2 Times New Roman (Hebrew){\*alt Arial};}{bimajor31544bidi romancharset178prq2 Times New Roman (Arabic){\* alt Arial};} +{bimajor31545bidi romancharset186prq2 Times New Roman Baltic{\*alt Arial};}{bimajor31546bidi romancharset163prq2 Times New Roman (Vietnamese){\*alt Arial};} +{lominor31548bidi romancharset238prq2 Times New Roman CE{\*alt Arial};}{lominor31549bidi romancharset204prq2 Times New Roman Cyr{\*alt Arial};} +{lominor31551bidi romancharset161prq2 Times New Roman Greek{\*alt Arial};}{lominor31552bidi romancharset162prq2 Times New Roman Tur{\*alt Arial};} +{lominor31553bidi romancharset177prq2 Times New Roman (Hebrew){\*alt Arial};}{lominor31554bidi romancharset178prq2 Times New Roman (Arabic){\* alt Arial};} +{lominor31555bidi romancharset186prq2 Times New Roman Baltic{\*alt Arial};}{lominor31556bidi romancharset163prq2 Times New Roman (Vietnamese){\*alt Arial};}{himinor31568bidi swisscharset238prq2 Calibri CE;} +{himinor31569bidi swisscharset204prq2 Calibri Cyr;}{himinor31571bidi swisscharset161prq2 Calibri Greek;}{himinor31572bidi swisscharset162 prq2 Calibri Tur;} +{himinor31573bidi swisscharset177prq2 Calibri (Hebrew);}{himinor31574 bidi swisscharset178prq2 Calibri (Arabic);}{himinor31575bidi swiss charset186prq2 Calibri Baltic;} +{himinor31576bidi swisscharset163prq2 Calibri (Vietnamese);}{biminor 31578bidi swisscharset238prq2 Arial CE;}{biminor31579bidi swiss charset204prq2 Arial Cyr;} +{biminor31581bidi swisscharset161prq2 Arial Greek;}{biminor31582bidi swisscharset162prq2 Arial Tur;}{biminor31583bidi swisscharset177prq2 Arial (Hebrew);} +{biminor31584bidi swisscharset178prq2 Arial (Arabic);}{biminor31585 bidi swisscharset186prq2 Arial Baltic;}{biminor31586bidi swiss charset163prq2 Arial (Vietnamese);} +{295bidi romancharset238prq2 Times New Roman CE{\*alt Arial};}{296bidi romancharset204prq2 Times New Roman Cyr{\*alt Arial};}{298bidi roman charset161prq2 Times New Roman Greek{\*alt Arial};} +{299bidi romancharset162prq2 Times New Roman Tur{\*alt Arial};}{300 bidi romancharset177prq2 Times New Roman (Hebrew){\*alt Arial};}{301bidi romancharset178prq2 Times New Roman (Arabic){\*alt Arial};} +{302bidi romancharset186prq2 Times New Roman Baltic{\*alt Arial};}{303 bidi romancharset163prq2 Times New Roman (Vietnamese){\*alt Arial};}} +{\*\defchp s22\lochf31506\hichf31506\dbchf31505 }{\*\defpap \ql \li0 i0\sa160\sl259\slmult1\widctlpar\wrapdefaultspalphaspnumaautodjustright in0\lin0\itap0 } oqfpromote +{\stylesheet{ +\ql \li0 i0\sa160\sl259\slmult1\widctlpar\wrapdefaultspalphaspnum aautodjustright in0\lin0\itap0 tlchcs1 f31507fs22lang1025 \ltrchcs0 s22\lang2057\langfe1028\loch31506\hichf31506\dbchf31505+\snext0 \sqformat \spriority0 Normal;}{\*+ s11 srowd rftsWidthB3 rpaddl108 rpaddr108 rpaddfl3 rpaddft3 rpaddfb3 rpaddfr3 blind0 blindtype3 svertalt sbrdrt sbrdrl sbrdrb sbrdrr sbrdrdgl sbrdrdgr sbrdrh sbrdrv \ql \li0 i0\sa160\sl259\slmult1 +\widctlpar\wrapdefaultspalphaspnumaautodjustright in0\lin0\itap0 tlchcs1 f31507fs22lang1025 \ltrchcs0 s22\lang2057\langfe1028\loch 31506\hichf31506\dbchf31505+Normal Table;}{\* s15 srowd rbrdrtrdrsrdrw10 rbrdrlrdrsrdrw10 rbrdrbrdrsrdrw10 rbrdrrrdrsrdrw10 rbrdrhrdrsrdrw10 rbrdrvrdrsrdrw10 + rftsWidthB3 rpaddl108 rpaddr108 rpaddfl3 rpaddft3 rpaddfb3 rpaddfr3 blind0 blindtype3 svertalt sbrdrt sbrdrl sbrdrb sbrdrr sbrdrdgl sbrdrdgr sbrdrh sbrdrv +\ql \li0 i0\widctlpar\wrapdefaultspalphaspnumaautodjustright in0\lin0\itap0 tlchcs1 f31507fs22lang1025 \ltrchcs0 s22\lang2057\langfe1028\loch31506\hichf31506\dbchf31505+\sbasedon11 \snext15 \spriority39 Table Grid;}} + +\paperw11906\paperh16838\margl1440\margr1440\margt1440\margb1440\gutter0\ltrsect +\widowctrltnbjenddoc rackmoves0 rackformatting1\donotembedsysfont1 elyonvml0\donotembedlingdata0\grfdocevents0 alidatexml1\showplaceholdtext0\ignoremixedcontent0\saveinvalidxml0\showxmlerrors1 oxlattoyen +xpshrtn oultrlspc\dntblnsbdb ospaceforul ormshade\horzdoc\dgmargin\dghspace180\dgvspace180\dghorigin1440\dgvorigin1440\dghshow1\dgvshow1 +\jexpandiewkind1iewscale100\pgbrdrhead\pgbrdrfoot\splytwnine tnlytwnine\htmautsp olnhtadjtbl\useltbalnlntblind\lytcalctblwd\lyttblrtgr\lnbrkrule obrkwrptbl\snaptogridincellllowfieldendsel\wrppunct +sianbrkrule ewtblstyruls ogrowautofit\usenormstyforlist oindnmbrtselnbrelev ocxsptable\indrlsweleven oafcnsttblfelev\utinl\hwelev\spltpgpar otcvasp otbrkcnstfrctbl otvatxbx\krnprsnet+{\*\wgrffmtfilter 2450} ofeaturethrottle1\ilfomacatclnup0\ltrpar \sectd \ltrsect\linex0\headery708 ootery708+\pard\plain \ltrpar\ql \li0 i0\sa160\sl259\slmult1\widctlpar\wrapdefaultspalphaspnumaautodjustright in0\lin0\itap0 tlchcs1 f31507fs22lang1025 \ltrchcs0 + s22\lang2057\langfe1028\lochf31506\hichf31506\dbchf31505+\linex0\headery708 ootery708+\ltrchcs0 s22\lang2057\langfe1028\lochf31506\hichf31506\dbchf31505+\par \par }{ tlch cs1 f31507 \ltrchcs0 \lang1031\langfe1028\langnp1031 +\par \ltrrow} rowd \irow0\irowband0\lastrow \ltrrow s15 rgaph108 rleft5 rbrdrtrdrsrdrw10 rbrdrlrdrsrdrw10 rbrdrbrdrsrdrw10 rbrdrrrdrsrdrw10 rbrdrhrdrsrdrw10 rbrdrvrdrsrdrw10 + rftsWidth1 rftsWidthB3 rautofit1 rpaddl108 rpaddr108 rpaddfl3 rpaddft3 rpaddfb3 rpaddfr3 bllkhdrrows bllkhdrcols bllknocolband blind0 blindtype3 ++ s22\lang2057\langfe1028\lochf31506\hichf31506\dbchf31505+\ql \li0 i0\sa160\sl259\slmult1\widctlpar\intbl\wrapdefaultspalphaspnum aautodjustright in0\lin0 tlchcs1 f31507fs22lang1025 \ltrchcs0 s22\lang2057\langfe1028\lochf31506\hichf31506\dbchf31505+ tlchcs1 f31507 \ltrchcs0 \lang1031\langfe1028\langnp1031 rowd \irow0\irowband0\lastrow \ltrrow s15 rgaph108 rleft5 rbrdrtrdrsrdrw10 rbrdrlrdrsrdrw10 rbrdrbrdrsrdrw10 rbrdrrrdrsrdrw10 rbrdrh +rdrsrdrw10 rbrdrvrdrsrdrw10 rftsWidth1 rftsWidthB3 rautofit1 rpaddl108 rpaddr108 rpaddfl3 rpaddft3 rpaddfb3 rpaddfr3 bllkhdrrows bllkhdrcols bllknocolband blind0 blindtype3 +rdrsrdrw10 + tlchcs1 f31507 \ltrchcs0 \lang1031\langfe1028\langnp1031\hichf31506\dbchf31505\loch31506 End}{ tlch cs1 f31507 \ltrchcs0 \lang1031\langfe1028\langnp1031 +\par } +} diff --git a/sw/qa/extras/layout/layout2.cxx b/sw/qa/extras/layout/layout2.cxx index a9cd34f17432..9b0401f42aa9 100644 --- a/sw/qa/extras/layout/layout2.cxx +++ b/sw/qa/extras/layout/layout2.cxx @@ -18,6 +18,7 @@ #include <editeng/unolingu.hxx> #include <i18nlangtag/languagetag.hxx> #include <o3tl/string_view.hxx> +#include <vcl/scheduler.hxx> #include <rootfrm.hxx> #include <pagefrm.hxx> @@ -758,6 +759,49 @@ CPPUNIT_TEST_FIXTURE(SwLayoutWriter2, testTdf152872) assertXPath(pXmlDoc, "/root/page/body/txt[2]/infos/bounds", "height", u"0"); } +CPPUNIT_TEST_FIXTURE(SwLayoutWriter2, testHiddenParaBreaks) +{ + createSwDoc("section-break-hidden-paragraphs.rtf"); + + SwWrtShell* pWrtShell = getSwDocShell()->GetWrtShell(); + SwViewOption aViewOptions(*pWrtShell->GetViewOptions()); + aViewOptions.SetShowHiddenChar(true); + aViewOptions.SetViewMetaChars(true); + pWrtShell->ApplyViewOptions(aViewOptions); + Scheduler::ProcessEventsToIdle(); + + xmlDocUniquePtr pXmlDoc = parseLayoutDump(); + + assertXPath(pXmlDoc, "/root/page[1]/body/txt", 1); + assertXPath(pXmlDoc, "/root/page[1]/body/txt[1]/SwParaPortion/SwLineLayout", "portion", + u"First"); + // actually Word shows an additional paragraph before the table + assertXPath(pXmlDoc, "/root/page[2]/body/txt", 3); + assertXPath(pXmlDoc, "/root/page[2]/body/txt[1]/SwParaPortion/SwLineLayout", "portion", u""); + assertXPath(pXmlDoc, "/root/page[2]/body/txt[1]/infos/bounds", "top", u"18846"); + assertXPath(pXmlDoc, "/root/page[2]/body/txt[1]/infos/bounds", "height", u"269"); + assertXPath(pXmlDoc, "/root/page[2]/body/txt[2]/infos/bounds", "top", u"19115"); + assertXPath(pXmlDoc, "/root/page[2]/body/txt[2]/infos/bounds", "height", u"450"); + assertXPath(pXmlDoc, "/root/page[2]/body/tab[1]/infos/bounds", "top", u"19565"); + assertXPath(pXmlDoc, "/root/page[2]/body/txt[3]/SwParaPortion/SwLineLayout", "portion", u"End"); + + aViewOptions.SetViewMetaChars(false); + pWrtShell->ApplyViewOptions(aViewOptions); + Scheduler::ProcessEventsToIdle(); + + pXmlDoc = parseLayoutDump(); + + assertXPath(pXmlDoc, "/root/page[1]/body/txt", 1); + assertXPath(pXmlDoc, "/root/page[1]/body/txt[1]/SwParaPortion/SwLineLayout", "portion", + u"First"); + assertXPath(pXmlDoc, "/root/page[2]/body/txt", 2); + // this one is merged; if it were 2 0-height frames that would work too + assertXPath(pXmlDoc, "/root/page[2]/body/txt[1]/infos/bounds", "top", u"18846"); + assertXPath(pXmlDoc, "/root/page[2]/body/txt[1]/infos/bounds", "height", u"0"); + assertXPath(pXmlDoc, "/root/page[2]/body/tab[1]/infos/bounds", "top", u"18846"); + assertXPath(pXmlDoc, "/root/page[2]/body/txt[2]/SwParaPortion/SwLineLayout", "portion", u"End"); +} + CPPUNIT_TEST_FIXTURE(SwLayoutWriter2, testHiddenParaProps) { createSwDoc("merge_hidden_redline.docx"); diff --git a/sw/source/core/text/porlay.cxx b/sw/source/core/text/porlay.cxx index 25081d086629..0bc12786468b 100644 --- a/sw/source/core/text/porlay.cxx +++ b/sw/source/core/text/porlay.cxx @@ -1151,8 +1151,19 @@ void SwScriptInfo::InitScriptInfoHidden(const SwTextNode& rNode, SwTextNode const* pNode(nullptr); TextFrameIndex nOffset(0); std::optional<std::vector<sw::Extent>::const_iterator> oPrevIter; - for (auto iter = pMerged->extents.begin(); iter != pMerged->extents.end(); - oPrevIter = iter) + if (pMerged->extents.empty()) + { + Range aRange(0, pMerged->pLastNode->Len() > 0 ? pMerged->pLastNode->Len() - 1 : 0); + MultiSelection aHiddenMulti(aRange); + CalcHiddenRanges(*pMerged->pLastNode, aHiddenMulti, nullptr); + if (aHiddenMulti.GetRangeCount() != 0) + { + m_HiddenChg.push_back(TextFrameIndex(0)); + m_HiddenChg.push_back(TextFrameIndex(0)); + } + } + else for (auto iter = pMerged->extents.begin(); + iter != pMerged->extents.end(); oPrevIter = iter) { if (iter->pNode == pNode) { diff --git a/sw/source/core/text/txtfrm.cxx b/sw/source/core/text/txtfrm.cxx index 30469ddd0746..c58055f19232 100644 --- a/sw/source/core/text/txtfrm.cxx +++ b/sw/source/core/text/txtfrm.cxx @@ -1520,20 +1520,25 @@ bool SwTextFrame::IsHiddenNowImpl() const { TextFrameIndex nHiddenStart(COMPLETE_STRING); TextFrameIndex nHiddenEnd(0); + bool hasHidden{false}; if (auto const pScriptInfo = GetScriptInfo()) { - pScriptInfo->GetBoundsOfHiddenRange(TextFrameIndex(0), + hasHidden = pScriptInfo->GetBoundsOfHiddenRange(TextFrameIndex(0), nHiddenStart, nHiddenEnd); } else // ParaPortion is created in Format, but this is called earlier { SwScriptInfo aInfo; aInfo.InitScriptInfoHidden(*m_pMergedPara->pFirstNode, m_pMergedPara.get()); - aInfo.GetBoundsOfHiddenRange(TextFrameIndex(0), + hasHidden = aInfo.GetBoundsOfHiddenRange(TextFrameIndex(0), nHiddenStart, nHiddenEnd); } - if (TextFrameIndex(0) == nHiddenStart && - TextFrameIndex(GetText().getLength()) <= nHiddenEnd) + if ((TextFrameIndex(0) == nHiddenStart + && TextFrameIndex(GetText().getLength()) <= nHiddenEnd) + // special case: GetBoundsOfHiddenRange doesn't assign! + // but it does return that there *is* something hidden, in case + // the frame is empty then the whole thing must be hidden + || (hasHidden && m_pMergedPara->mergedText.isEmpty())) { bHiddenCharsHidePara = true; } commit be1f4968516ce5cd9cd6c31ac26b42350f867009 Author: Patrick Luby <guibmac...@gmail.com> AuthorDate: Tue Mar 4 08:47:00 2025 -0500 Commit: Andras Timar <andras.ti...@collabora.com> CommitDate: Wed Mar 12 16:23:32 2025 +0100 Partial: tdf#156855 update native and LibreOffice dark mode states Updating the dark mode state of everything all at once does not solve all failures to update colors when the light/dark mode changes, but it eliminates enough failures that the UI is now generally readble without restarting LibreOffice. Also, update the application's color mode when the macOS light/dark mode changes while LibreOffice is running. Change-Id: Iffe3ca3789373135f06f7fbe22429cc59438d4f6 Reviewed-on: https://gerrit.libreoffice.org/c/core/+/182785 Reviewed-by: Patrick Luby <guibomac...@gmail.com> Reviewed-by: Sahil <sahil.gautam.ext...@allotropia.de> Tested-by: Jenkins diff --git a/include/svtools/colorcfg.hxx b/include/svtools/colorcfg.hxx index c757eeb20abd..0275cfda26b8 100644 --- a/include/svtools/colorcfg.hxx +++ b/include/svtools/colorcfg.hxx @@ -25,6 +25,8 @@ #include <unotools/options.hxx> #include <memory> +#include <tools/link.hxx> +#include <vcl/vclevent.hxx> namespace svtools{ enum ColorConfigEntry : int @@ -300,6 +302,8 @@ public: void LoadThemeColorsFromRegistry(); void SetupTheme(); + + DECL_LINK(DataChangedHdl, VclSimpleEvent&, void); }; class SVT_DLLPUBLIC EditableColorConfig diff --git a/svtools/source/config/colorcfg.cxx b/svtools/source/config/colorcfg.cxx index 154862518676..4934200d97ee 100644 --- a/svtools/source/config/colorcfg.cxx +++ b/svtools/source/config/colorcfg.cxx @@ -507,10 +507,14 @@ ColorConfig::ColorConfig() ++nColorRefCount_Impl; m_pImpl->AddListener(this); SetupTheme(); + + ::Application::AddEventListener( LINK(this, ColorConfig, DataChangedHdl) ); } ColorConfig::~ColorConfig() { + ::Application::RemoveEventListener( LINK(this, ColorConfig, DataChangedHdl) ); + if (comphelper::IsFuzzing()) return; std::unique_lock aGuard( ColorMutex_Impl() ); @@ -752,6 +756,20 @@ const OUString& ColorConfig::GetCurrentSchemeName() return m_pImpl->GetLoadedScheme(); } +IMPL_LINK( ColorConfig, DataChangedHdl, VclSimpleEvent&, rEvent, void ) +{ + if (rEvent.GetId() == VclEventId::ApplicationDataChanged) + { + DataChangedEvent* pData = static_cast<DataChangedEvent*>(static_cast<VclWindowEvent&>(rEvent).GetData()); + if (pData->GetType() == DataChangedEventType::SETTINGS && + pData->GetFlags() & AllSettingsFlags::STYLE) + { + ThemeColors::SetThemeLoaded(false); + SetupTheme(); + } + } +} + EditableColorConfig::EditableColorConfig() : m_pImpl(new ColorConfig_Impl), m_bModified(false) diff --git a/vcl/inc/osx/salframeview.h b/vcl/inc/osx/salframeview.h index 287ccaedbc06..8b141f7aafe5 100644 --- a/vcl/inc/osx/salframeview.h +++ b/vcl/inc/osx/salframeview.h @@ -112,6 +112,8 @@ enum class SalEvent; NSAttributedString* mpLastMarkedText; BOOL mbTextInputWantsNonRepeatKeyDown; NSTrackingArea* mpLastTrackingArea; + + BOOL mbInViewDidChangeEffectiveAppearance; } +(void)unsetMouseFrame: (AquaSalFrame*)pFrame; -(id)initWithSalFrame: (AquaSalFrame*)pFrame; @@ -270,6 +272,8 @@ enum class SalEvent; -(NSArray *)accessibilityChildren; -(NSArray <id<NSAccessibilityElement>> *)accessibilityChildrenInNavigationOrder; +-(void)viewDidChangeEffectiveAppearance; + @end @interface SalFrameViewA11yWrapper : AquaA11yWrapper diff --git a/vcl/osx/salframeview.mm b/vcl/osx/salframeview.mm index a5cb9270600b..7590acf31ebb 100644 --- a/vcl/osx/salframeview.mm +++ b/vcl/osx/salframeview.mm @@ -936,6 +936,8 @@ static void updateMenuBarVisibility( const AquaSalFrame *pFrame ) mpLastMarkedText = nil; mbTextInputWantsNonRepeatKeyDown = NO; mpLastTrackingArea = nil; + + mbInViewDidChangeEffectiveAppearance = NO; } return self; @@ -2836,6 +2838,29 @@ static void updateMenuBarVisibility( const AquaSalFrame *pFrame ) return [self accessibilityChildren]; } +-(void)viewDidChangeEffectiveAppearance +{ + if (mbInViewDidChangeEffectiveAppearance) + return; + + mbInViewDidChangeEffectiveAppearance = YES; + + // Related: tdf#156855 force the current theme to reload its colors + // This call is called when the macOS light/dark mode changes while + // LibreOffice is running. Send a SalEvent::SettingsChanged event + // but do it in an idle timer. Otherwise, an infinite recursion + // can occur. + NSWindow *pWindow = [self window]; + if (pWindow && ([pWindow isVisible] || [pWindow isMiniaturized])) + { + SolarMutexGuard aGuard; + + GetSalData()->mpInstance->delayedSettingsChanged(true); + } + + mbInViewDidChangeEffectiveAppearance = NO; +} + @end @implementation SalFrameViewA11yWrapper diff --git a/vcl/osx/salinst.cxx b/vcl/osx/salinst.cxx index 3983d32241a3..6d6cb6d49989 100644 --- a/vcl/osx/salinst.cxx +++ b/vcl/osx/salinst.cxx @@ -107,6 +107,11 @@ public: virtual void Invoke() override { + // Related: tdf#156855 force reload of both native and theme colors + int nMode = MiscSettings::GetAppColorMode(); + if (!nMode) + MiscSettings::SetAppColorMode(nMode); + AquaSalInstance *pInst = GetSalData()->mpInstance; SalFrame *pAnyFrame = pInst->anyFrame(); if( pAnyFrame ) diff --git a/vcl/osx/vclnsapp.mm b/vcl/osx/vclnsapp.mm index 19c90cbb323e..731a93e4805f 100644 --- a/vcl/osx/vclnsapp.mm +++ b/vcl/osx/vclnsapp.mm @@ -353,10 +353,10 @@ (void)pNotification; SolarMutexGuard aGuard; - AquaSalInstance *pInst = GetSalData()->mpInstance; - SalFrame *pAnyFrame = pInst->anyFrame(); - if( pAnyFrame ) - pAnyFrame->CallCallback( SalEvent::SettingsChanged, nullptr ); + // Related: tdf#156855 delay SalEvent::SettingsChanged event + // -[SalFrameView viewDidChangeEffectiveAppearance] needs to delay + // so be safe and do the same here. + GetSalData()->mpInstance->delayedSettingsChanged( true ); } -(void)screenParametersChanged: (NSNotification*) pNotification diff --git a/vcl/source/app/settings.cxx b/vcl/source/app/settings.cxx index 6c69bda88a37..d1d48c0f3efc 100644 --- a/vcl/source/app/settings.cxx +++ b/vcl/source/app/settings.cxx @@ -2314,21 +2314,14 @@ bool MiscSettings::GetEnableLocalizedDecimalSep() const int MiscSettings::GetDarkMode() { - return officecfg::Office::Common::Appearance::ApplicationAppearance::get(); + // MiscSettings::GetAppColorMode() replaces MiscSettings::GetDarkMode() + return MiscSettings::GetAppColorMode(); } void MiscSettings::SetDarkMode(int nMode) { - std::shared_ptr<comphelper::ConfigurationChanges> batch(comphelper::ConfigurationChanges::create()); - officecfg::Office::Common::Appearance::ApplicationAppearance::set(nMode, batch); - batch->commit(); - - vcl::Window *pWin = Application::GetFirstTopLevelWindow(); - while (pWin) - { - pWin->ImplGetFrame()->UpdateDarkMode(); - pWin = Application::GetNextTopLevelWindow(pWin); - } + // MiscSettings::SetAppColorMode() replaces MiscSettings::SetDarkMode() + MiscSettings::SetAppColorMode(nMode); } bool MiscSettings::GetUseDarkMode() @@ -2348,9 +2341,58 @@ int MiscSettings::GetAppColorMode() void MiscSettings::SetAppColorMode(int nMode) { + // Partial: tdf#156855 update native and LibreOffice dark mode states + // Updating the dark mode state of everything all at once does not + // solve all failures to update colors when the light/dark mode + // changes, but it eliminates enough failures that the UI is now + // generally readble without restarting LibreOffice. + // Important: all of the following steps must be done. Otherwise, + // changing the macOS light/dark mode preference while LibreOffice + // is running will cause the color mode state change to fail. + + // 1. Save the new mode. std::shared_ptr<comphelper::ConfigurationChanges> batch(comphelper::ConfigurationChanges::create()); officecfg::Office::Common::Appearance::ApplicationAppearance::set(nMode, batch); batch->commit(); + + // 2. Force the native windows to update their dark mode state so + // that we can fetch the correct native colors. + vcl::Window *pWin = Application::GetFirstTopLevelWindow(); + while (pWin) + { + pWin->ImplGetFrame()->UpdateDarkMode(); + pWin = Application::GetNextTopLevelWindow(pWin); + } + +#ifdef MACOSX + // 3. Reset the native colors in AllSettings. Note: the current theme + // is disabled during this step to stop SalFrame::UpdateSettings() + // from adding the current theme's colors which are still set to + // the previous light/dark mode's colors. + if (ThemeColors::IsThemeLoaded()) + ThemeColors::SetThemeLoaded(false); + AllSettings aSettings = Application::GetSettings(); + Application::MergeSystemSettings(aSettings); + Application *pApp = GetpApp(); + if (pApp) + pApp->OverrideSystemSettings(aSettings); + Application::SetSettings(aSettings); + + // 4. Force the current theme's ColorConfig to reload itself + // with the correct light/dark mode colors. It will also + // merge the native colors updated in the previous step. + DataChangedEvent aDCEvt(DataChangedEventType::SETTINGS); + Application::ImplCallEventListenersApplicationDataChanged(&aDCEvt); + Application::NotifyAllWindows(aDCEvt); +#else + // Note for Windows and Linux: the above macOS code doesn't appear + // to work as expected on Windows and Linux. One thing that might + // make the above code work on those platforms is by delaying the + // firing of the SalEvent::SettingsChanged event. macos uses the + // AquaSalInstance::delayedSettingsChanged() method to delay firing + // and also invalidate all the open windows so that may need to be + // moved to the SalInstance base class. +#endif } bool MiscSettings::GetUseReducedAnimation() commit b2dd3d36bd89d523ee9cf0c47e9fa859e95078aa Author: Oliver Specht <oliver.spe...@cib.de> AuthorDate: Tue Mar 4 15:53:01 2025 +0100 Commit: Andras Timar <andras.ti...@collabora.com> CommitDate: Wed Mar 12 16:23:32 2025 +0100 tdf#165064 fix regression from tdf#161233 Change-Id: I07953d4569542774c8012b879f3894e7da61e0ac Reviewed-on: https://gerrit.libreoffice.org/c/core/+/182487 Tested-by: Gabor Kelemen <gabor.kelemen.ext...@allotropia.de> Reviewed-by: Thorsten Behrens <thorsten.behr...@allotropia.de> Tested-by: Jenkins (cherry picked from commit bf557f6c181578e1e89f63e502aae3eed1880af1) Reviewed-on: https://gerrit.libreoffice.org/c/core/+/182722 Reviewed-by: Michael Stahl <michael.st...@allotropia.de> diff --git a/sw/source/core/layout/fly.cxx b/sw/source/core/layout/fly.cxx index e3811b134c4c..f174143288e7 100644 --- a/sw/source/core/layout/fly.cxx +++ b/sw/source/core/layout/fly.cxx @@ -443,16 +443,6 @@ void SwFlyFrame::InitDrawObj(SwFrame& rAnchorFrame) if (!rAnchorFrame.FindFooterOrHeader()) nHellId = rIDDMA.GetHeaderFooterHellId(); } - bool bNoClippingWithWrapPolygon = rIDSA.get(DocumentSettingId::NO_CLIPPING_WITH_WRAP_POLYGON); - if (bNoClippingWithWrapPolygon && isOpaque) - { - if (GetFrameFormat()->GetSurround().IsContour()) - { - GetVirtDrawObj()->SetLayer(nHellId); - return; - } - - } GetVirtDrawObj()->SetLayer( isOpaque ? nHeavenId :nHellId ); } commit 167e380fbd26a75c5d008df731648a95bdc5420d Author: Armin Le Grand (Collabora) <armin.le.gr...@me.com> AuthorDate: Mon Mar 10 15:20:17 2025 +0100 Commit: Andras Timar <andras.ti...@collabora.com> CommitDate: Wed Mar 12 16:23:32 2025 +0100 tdf#165491 ITEM regression: Chart needs order of events The Item with WhichID SCHATTR_STAT_KIND_ERROR *has* to be handled 1st since it sets additional information about the ErrorBarStyle at beans::XPropertySet xErrorBarProp that the processing of the *other* Items already need access to, see 'case SCHATTR_STAT_KIND_ERROR' in StatisticsItemConverter::ApplySpecialItem. This worked before the change of SfxItemSet to use a std::unordered_set since the order of Items was fix and - since SCHATTR_STAT_KIND_ERROR had the lowest WhichID - was handled 1st. Not sure if that was by purpose and it was known that this was necessary - there are no comments hinting to that, so it might have worked by coincidence before. In general it is bad style to rely on the 'order' of Items in an ItemSet - there is no order defined in general. Change-Id: I93e2c8e30f762e1bb83adb2b43459bbfb263a151 Reviewed-on: https://gerrit.libreoffice.org/c/core/+/182742 Reviewed-by: Armin Le Grand <armin.le.gr...@me.com> Tested-by: Jenkins (cherry picked from commit ec65a00298ffbb30869dec222887f42f3ca4533e) Reviewed-on: https://gerrit.libreoffice.org/c/core/+/182746 Reviewed-by: Michael Stahl <michael.st...@allotropia.de> diff --git a/chart2/source/controller/itemsetwrapper/ItemConverter.cxx b/chart2/source/controller/itemsetwrapper/ItemConverter.cxx index 3d4cf2abc309..1a4eebf91127 100644 --- a/chart2/source/controller/itemsetwrapper/ItemConverter.cxx +++ b/chart2/source/controller/itemsetwrapper/ItemConverter.cxx @@ -28,6 +28,7 @@ #include <comphelper/diagnose_ex.hxx> #include <sal/log.hxx> #include <utility> +#include <chartview/ChartSfxItemIds.hxx> using namespace ::com::sun::star; @@ -156,8 +157,30 @@ bool ItemConverter::ApplyItemSet( const SfxItemSet & rItemSet ) tPropertyNameWithMemberId aProperty; uno::Any aValue; + // tdf#165491 the Item with WhichID SCHATTR_STAT_KIND_ERROR *has* to + // be handled 1st since it sets additional information about the + // ErrorBarStyle at uno::Reference< beans::XPropertySet > xErrorBarProp + // that the processing of the *other* Items already need access to, + // see 'case SCHATTR_STAT_KIND_ERROR' in + // StatisticsItemConverter::ApplySpecialItem. This worked before the + // change of SfxItemSet to use a std::unordered_set since the order + // of Items was fix and - since SCHATTR_STAT_KIND_ERROR had the + // lowest WhichID - was handled 1st. Not sure if that was by purpose + // and it was known that this was necessary - there are no comments + // hinting to that. In general it is bad style to rely on the 'order' + // of Items being processed - there is no order defined in general. + { + const SfxPoolItem* pItem(nullptr); + if (SfxItemState::SET == rItemSet.GetItemState(SCHATTR_STAT_KIND_ERROR, false, &pItem)) + if(!GetItemProperty(pItem->Which(), aProperty)) + bItemsChanged = ApplySpecialItem(pItem->Which(), rItemSet); + } + for (const SfxPoolItem* pItem = aIter.GetCurItem(); pItem; pItem = aIter.NextItem()) { + if (SCHATTR_STAT_KIND_ERROR == pItem->Which()) + continue; + if( aIter.GetItemState( false ) == SfxItemState::SET ) { if( GetItemProperty( pItem->Which(), aProperty )) commit 8a52e3690147b8223afba72bdf9289e97d2c6fba Author: Caolán McNamara <caolan.mcnam...@collabora.com> AuthorDate: Mon Mar 10 14:45:22 2025 +0000 Commit: Andras Timar <andras.ti...@collabora.com> CommitDate: Wed Mar 12 16:23:32 2025 +0100 crashtesting: crash on reimport of xlsx output of forum-pl-2758.ods also seen as a leak as nothing is erased by: maRegisteredCellAttributes.erase(&rCandidate); once the style names are changed and the std::set isn't ordered according to its predicate anymore. Easiest thing to do here seems to run the rename of a cell style through CellAttributeHelper so it can reinsert the affected ScPatternAttrs Change-Id: I13486701f378228792baa2b378709b7d530c3770 Reviewed-on: https://gerrit.libreoffice.org/c/core/+/182744 Reviewed-by: Caolán McNamara <caolan.mcnam...@collabora.com> Tested-by: Jenkins Reviewed-by: Noel Grandin <noel.gran...@collabora.co.uk> diff --git a/sc/inc/patattr.hxx b/sc/inc/patattr.hxx index 67d2b9f2d9b3..8218bca676cb 100644 --- a/sc/inc/patattr.hxx +++ b/sc/inc/patattr.hxx @@ -92,6 +92,7 @@ public: void CellStyleDeleted(const ScStyleSheet& rStyle); void CellStyleCreated(ScDocument& rDoc, const OUString& rName); + void RenameCellStyle(ScStyleSheet& rStyle, const OUString& rNewName); void UpdateAllStyleSheets(ScDocument& rDoc); void AllStylesToNames(); void ReIndexRegistered(); diff --git a/sc/inc/stlpool.hxx b/sc/inc/stlpool.hxx index 206ec79dc507..6d62affe7b71 100644 --- a/sc/inc/stlpool.hxx +++ b/sc/inc/stlpool.hxx @@ -56,6 +56,9 @@ public: // Finds Para style with given name case-insensitively, or STR_STYLENAME_STANDARD ScStyleSheet* FindAutoStyle(const OUString& rName); + // Rename rStyle to rNewName, and update CellAttribute holder + SC_DLLPUBLIC void Rename(SfxStyleSheetBase& rStyle, const OUString& rNewName, SfxStyleFamily eFam); + SC_DLLPUBLIC virtual SfxStyleSheetBase& Make( const OUString&, SfxStyleFamily eFam, SfxStyleSearchBits nMask = SfxStyleSearchBits::All, const OUString& rParentStyleSheetName = u""_ustr) override; diff --git a/sc/source/core/data/patattr.cxx b/sc/source/core/data/patattr.cxx index 6f69739ed491..ae482de0becd 100644 --- a/sc/source/core/data/patattr.cxx +++ b/sc/source/core/data/patattr.cxx @@ -196,6 +196,33 @@ void CellAttributeHelper::CellStyleDeleted(const ScStyleSheet& rStyle) } } +void CellAttributeHelper::RenameCellStyle(ScStyleSheet& rStyle, const OUString& rNewName) +{ + std::vector<const ScPatternAttr*> aChanged; + + const OUString& rCandidateStyleName = rStyle.GetName(); + auto it = maRegisteredCellAttributes.lower_bound(&rCandidateStyleName); + while(it != maRegisteredCellAttributes.end()) + { + const ScPatternAttr* pCheck = *it; + if (CompareStringPtr(pCheck->GetStyleName(), &rCandidateStyleName) != 0) + break; + if (&rStyle == pCheck->GetStyleSheet()) + { + aChanged.push_back(pCheck); + // The name will change, we have to re-insert it + it = maRegisteredCellAttributes.erase(it); + } + else + ++it; + } + + rStyle.SetName(rNewName); + + for (const ScPatternAttr* p : aChanged) + maRegisteredCellAttributes.insert(p); +} + void CellAttributeHelper::CellStyleCreated(ScDocument& rDoc, const OUString& rName) { // If a style was created, don't keep any pattern with its name string in the pool, diff --git a/sc/source/core/data/stlpool.cxx b/sc/source/core/data/stlpool.cxx index aa4ae40dae1d..78a2a1339a63 100644 --- a/sc/source/core/data/stlpool.cxx +++ b/sc/source/core/data/stlpool.cxx @@ -114,6 +114,17 @@ rtl::Reference<SfxStyleSheetBase> ScStyleSheetPool::Create( const SfxStyleSheetB return new ScStyleSheet( static_cast<const ScStyleSheet&>(rStyle) ); } +void ScStyleSheetPool::Rename(SfxStyleSheetBase& rStyle, const OUString& rNewName, SfxStyleFamily eFamily) +{ + if (eFamily == SfxStyleFamily::Para) + { + assert(nullptr != pDoc); + pDoc->getCellAttributeHelper().RenameCellStyle(static_cast<ScStyleSheet&>(rStyle), rNewName); + return; + } + rStyle.SetName(rNewName); +} + void ScStyleSheetPool::Remove( SfxStyleSheetBase* pStyle ) { if ( pStyle ) diff --git a/sc/source/filter/ftools/ftools.cxx b/sc/source/filter/ftools/ftools.cxx index d3145e537429..3e8259339103 100644 --- a/sc/source/filter/ftools/ftools.cxx +++ b/sc/source/filter/ftools/ftools.cxx @@ -231,7 +231,7 @@ ScStyleSheet& lclMakeStyleSheet( ScStyleSheetPool& rPool, const OUString& rStyle // rename existing style if( pOldStyleSheet && bForceName ) { - pOldStyleSheet->SetName( aNewName ); + rPool.Rename(*pOldStyleSheet, aNewName, eFamily); aNewName = rStyleName; } commit 6dc1ac6bafbbce2430f315bc4ce23a54da0128b3 Author: Balazs Varga <balazs.varga.ext...@allotropia.de> AuthorDate: Fri Mar 7 10:44:35 2025 +0100 Commit: Andras Timar <andras.ti...@collabora.com> CommitDate: Wed Mar 12 16:23:32 2025 +0100 tdf#165341 - FILEOPEN PPTX: fix paragraph alignment for text wrapped shapes In case of word wrapped text objects no need to set TextHorizontalAdjust based on text alignment. regression from: 1d9ce0a67a71e51569cd33c26270eeece587a354 (tdf#162571 - sd: Text box expands or shrinks on left or right or) Change-Id: I9455e30a58cc3853bc2a1c2030ab7cc62314106c Reviewed-on: https://gerrit.libreoffice.org/c/core/+/182616 Tested-by: Jenkins Tested-by: Gabor Kelemen <gabor.kelemen.ext...@allotropia.de> Reviewed-by: Gabor Kelemen <gabor.kelemen.ext...@allotropia.de> (cherry picked from commit 37a99eb4d3489206d9385b9c065c5bb541c17b32) Reviewed-on: https://gerrit.libreoffice.org/c/core/+/182659 Reviewed-by: Xisco Fauli <xiscofa...@libreoffice.org> diff --git a/oox/source/drawingml/shape.cxx b/oox/source/drawingml/shape.cxx index 71f402572e2f..20776ea0b4e1 100644 --- a/oox/source/drawingml/shape.cxx +++ b/oox/source/drawingml/shape.cxx @@ -1550,7 +1550,12 @@ Reference< XShape > const & Shape::createAndInsert( .maPropertyMap.getProperty(PROP_TextAutoGrowHeight) .get<bool>(); - if (bAutoGrowHeight && nShapeRotateInclCamera == 0) + bool bWrap = getTextBody() + ->getTextProperties() + .maPropertyMap.getProperty(PROP_TextWordWrap) + .get<bool>(); + + if (bAutoGrowHeight && !bWrap && nShapeRotateInclCamera == 0) { mpTextBody->getTextProperties().maPropertyMap.setProperty( PROP_TextHorizontalAdjust, lcl_convertTextAdjust( diff --git a/sd/qa/unit/data/pptx/tdf165341.pptx b/sd/qa/unit/data/pptx/tdf165341.pptx new file mode 100644 index 000000000000..6aed8787a6fc Binary files /dev/null and b/sd/qa/unit/data/pptx/tdf165341.pptx differ diff --git a/sd/qa/unit/import-tests2.cxx b/sd/qa/unit/import-tests2.cxx index 13a86cf25d77..9c16eebf1c39 100644 --- a/sd/qa/unit/import-tests2.cxx +++ b/sd/qa/unit/import-tests2.cxx @@ -37,6 +37,8 @@ #include <com/sun/star/drawing/XMasterPagesSupplier.hpp> #include <com/sun/star/drawing/XGluePointsSupplier.hpp> #include <com/sun/star/drawing/GluePoint2.hpp> +#include <com/sun/star/drawing/TextHorizontalAdjust.hpp> +#include <com/sun/star/drawing/TextVerticalAdjust.hpp> #include <com/sun/star/container/XIdentifierAccess.hpp> #include <com/sun/star/animations/XAnimationNodeSupplier.hpp> #include <com/sun/star/animations/XAnimate.hpp> @@ -125,6 +127,21 @@ CPPUNIT_TEST_FIXTURE(SdImportTest2, testTdf160490) CPPUNIT_ASSERT_EQUAL(sal_Int32(3367), nHeight2); } +CPPUNIT_TEST_FIXTURE(SdImportTest2, testTdf165341) +{ + createSdImpressDoc("pptx/tdf165341.pptx"); + + uno::Reference<drawing::XShape> xShape(getShapeFromPage(0, 0), uno::UNO_QUERY); + CPPUNIT_ASSERT(xShape.is()); + uno::Reference<beans::XPropertySet> xProp(xShape, uno::UNO_QUERY); + drawing::TextHorizontalAdjust eHori; + CPPUNIT_ASSERT(xProp->getPropertyValue(u"TextHorizontalAdjust"_ustr) >>= eHori); + drawing::TextVerticalAdjust eVert; + CPPUNIT_ASSERT(xProp->getPropertyValue(u"TextVerticalAdjust"_ustr) >>= eVert); + CPPUNIT_ASSERT_EQUAL(drawing::TextHorizontalAdjust::TextHorizontalAdjust_CENTER, eHori); + CPPUNIT_ASSERT_EQUAL(drawing::TextVerticalAdjust::TextVerticalAdjust_TOP, eVert); +} + CPPUNIT_TEST_FIXTURE(SdImportTest2, testTdf157285) { createSdImpressDoc("pptx/tdf157285.pptx"); commit 3f24a0ec3453854a12151b6dc59ad5f7747bea76 Author: Aron Budea <aron.bu...@collabora.com> AuthorDate: Thu Mar 6 16:28:18 2025 +1030 Commit: Andras Timar <andras.ti...@collabora.com> CommitDate: Wed Mar 12 16:23:32 2025 +0100 tdf#165503: sc_subsequent_export_test4: Use precise XPath The previous one was working fine, too, but it was missing the last, single element in the path. Change-Id: I8d8d359436f52fd8d5397b29905747e40d5f8793 Reviewed-on: https://gerrit.libreoffice.org/c/core/+/182550 Tested-by: Jenkins Reviewed-by: Aron Budea <aron.bu...@collabora.com> (cherry picked from commit a3d767248392dd1acffd7b16b45b2841e410d528) Reviewed-on: https://gerrit.libreoffice.org/c/core/+/182708 Reviewed-by: Xisco Fauli <xiscofa...@libreoffice.org> diff --git a/sc/qa/unit/subsequent_export_test4.cxx b/sc/qa/unit/subsequent_export_test4.cxx index 7cda356f6a14..4d14b4a7a5a4 100644 --- a/sc/qa/unit/subsequent_export_test4.cxx +++ b/sc/qa/unit/subsequent_export_test4.cxx @@ -2145,12 +2145,12 @@ CPPUNIT_TEST_FIXTURE(ScExportTest4, testTdf165503) // The textual date output can depend on locale, but it'll differ from expected value either way assertXPathContent(pChart1, "/c:chartSpace/c:chart/c:plotArea/c:lineChart/c:ser/c:cat/c:numRef/" - "c:numCache/c:pt[@idx=\"0\"]", + "c:numCache/c:pt[@idx=\"0\"]/c:v", u"44199"); // And similarly assertXPathContent(pChart1, "/c:chartSpace/c:chart/c:plotArea/c:lineChart/c:ser/c:cat/c:numRef/" - "c:numCache/c:pt[@idx=\"4\"]", + "c:numCache/c:pt[@idx=\"4\"]/c:v", u"44844"); // There should be no node with idx 5 (cell is empty) commit 4210c530fa2746a04795c127f057b8141d83076b Author: Patrick Luby <guibmac...@gmail.com> AuthorDate: Sun Mar 9 16:54:11 2025 -0400 Commit: Andras Timar <andras.ti...@collabora.com> CommitDate: Wed Mar 12 16:23:31 2025 +0100 Related: tdf#41775 show Start Center when loading a document at launch This is the second attempt to implement a fix for tdf#41775 after reverting commit 9e3d8d0176bb1e95414e4a578065c2e1035a8dd6. On macOS, the Start Center's menubar is the "no windows open" menubar. This is done by making a native copy of the Start Center's menubar each time it is opened (note: on macOS the Start Center window can be closed and reopened repeatedly) so pre-populate the "no windows open" menubar by opening the Start Center even if a document is going to be loaded. But if LibreOffice is launched by opening a document from the Finder, dragging it onto the application's Dock icon, or from the command line with a module or document path parameter, the the Start Center doesn't get created when all of the document windows are closed. This causes the old "File only" menubar to be displayed instead of the "no windows open" menubar. Change-Id: Ide079014b4a7db390ae4d084b45af922f0422525 Reviewed-on: https://gerrit.libreoffice.org/c/core/+/182702 Reviewed-by: Patrick Luby <guibomac...@gmail.com> Tested-by: Jenkins (cherry picked from commit 331ea32ec181aff739eaebee328281b190cad003) Reviewed-on: https://gerrit.libreoffice.org/c/core/+/182705 Reviewed-by: Adolfo Jayme Barrientos <fit...@ubuntu.com> diff --git a/desktop/source/app/app.cxx b/desktop/source/app/app.cxx index 91a34ed8b56b..83cab561336c 100644 --- a/desktop/source/app/app.cxx +++ b/desktop/source/app/app.cxx @@ -2200,6 +2200,20 @@ void Desktop::OpenClients() xBox->run(); } +#ifdef MACOSX + // Related: tdf#41775 show Start Center before loading documents + // If LibreOffice is launched from the command line with a + // document path parameter, the Start Center doesn't get + // created when all of the document windows are closed. This + // causes the the old "File only" menubar to be displayed + // instead of the Start Center's menubar. + if (!rArgs.IsQuickstart() && !rArgs.IsInvisible()) + { + SvtModuleOptions aOpt; + if (aOpt.IsModuleInstalled(SvtModuleOptions::EModule::STARTMODULE)) + ShowBackingComponent(nullptr); + } +#endif // Process request if ( RequestHandler::ExecuteCmdLineRequests(aRequest, false) ) { @@ -2215,8 +2229,25 @@ void Desktop::OpenClients() return; if ( rArgs.IsQuickstart() || rArgs.IsInvisible() || Application::AnyInput( VclInputFlags::APPEVENT ) ) + { +#ifdef MACOSX + // Related: tdf#41775 show Start Center before loading documents + // If LibreOffice is launched from by opening a document from the + // Finder or dragging it onto the application's Dock icon, the + // the Start Center doesn't get created when all of the document + // windows are closed. This causes the the old "File only" menubar + // to be displayed instead of the Start Center's menubar. + if (!rArgs.IsQuickstart() && !rArgs.IsInvisible()) + { + SvtModuleOptions aOpt; + if (aOpt.IsModuleInstalled(SvtModuleOptions::EModule::STARTMODULE)) + ShowBackingComponent(nullptr); + } +#endif + // soffice was started as tray icon ... return; + } OpenDefault(); } @@ -2272,6 +2303,16 @@ void Desktop::OpenDefault() return; } +#ifdef MACOSX + // Related: tdf#41775 show Start Center before loading documents + // If LibreOffice is launched from the command line with a module + // argument, the Start Center doesn't get created when all of the + // document windows are closed. This causes the the old "File only" + // menubar to be displayed instead of the Start Center's menubar. + if (aOpt.IsModuleInstalled(SvtModuleOptions::EModule::STARTMODULE)) + ShowBackingComponent(nullptr); +#endif + ProcessDocumentsRequest aRequest(rArgs.getCwdUrl()); aRequest.aOpenList.push_back(aName); RequestHandler::ExecuteCmdLineRequests(aRequest, false); @@ -2623,6 +2664,19 @@ void Desktop::ShowBackingComponent(Desktop * progress) { progress->CloseSplashScreen(); } +#ifdef MACOSX + else + { + // Related: tdf#41775 don't display the Start Center when loading + // modules or documents by unsetting the backing frame's component. + // This makes the Start Center's window empty so that loading large + // documents don't have the Start Center content displayed while the + // the document loads. + xBackingFrame->setComponent(css::uno::Reference<css::awt::XWindow>(), css::uno::Reference<css::frame::XController>()); + return; + } +#endif + xContainerWindow->setVisible(true); } commit aabb2f1e9ad382288576840480e624e5cc27e080 Author: Caolán McNamara <caolan.mcnam...@collabora.com> AuthorDate: Fri Mar 7 21:37:27 2025 +0000 Commit: Andras Timar <andras.ti...@collabora.com> CommitDate: Wed Mar 12 16:23:31 2025 +0100 Resolves: tdf#165455 fix hover in RTL custom widgets under GTK Change-Id: If8f4e219766a7a17a85fea60e4d7855684e57d92 Reviewed-on: https://gerrit.libreoffice.org/c/core/+/182653 Tested-by: Jenkins Reviewed-by: Adolfo Jayme Barrientos <fit...@ubuntu.com> diff --git a/vcl/unx/gtk3/gtkinst.cxx b/vcl/unx/gtk3/gtkinst.cxx index 3d7567384fd2..98b1c64d62b9 100644 --- a/vcl/unx/gtk3/gtkinst.cxx +++ b/vcl/unx/gtk3/gtkinst.cxx @@ -18926,7 +18926,12 @@ public: #if !GTK_CHECK_VERSION(4, 0, 0) tools::Rectangle aRect(Point(x, y), Size(width, height)); aRect = m_xDevice->LogicToPixel(aRect); - gtk_widget_queue_draw_area(GTK_WIDGET(m_pDrawingArea), aRect.Left(), aRect.Top(), aRect.GetWidth(), aRect.GetHeight()); + + x = aRect.Left(); + if (SwapForRTL()) + x = gtk_widget_get_allocated_width(m_pWidget) - aRect.GetWidth() - 1 - x; + + gtk_widget_queue_draw_area(GTK_WIDGET(m_pDrawingArea), x, aRect.Top(), aRect.GetWidth(), aRect.GetHeight()); #else (void)x; (void)y; (void)width; (void)height; queue_draw(); commit 8af0fd432ffde241e01b436c349b6cf3226f2f9a Author: Caolán McNamara <caolan.mcnam...@collabora.com> AuthorDate: Fri Mar 7 20:51:35 2025 +0000 Commit: Andras Timar <andras.ti...@collabora.com> CommitDate: Wed Mar 12 16:23:31 2025 +0100 Related: tdf#165455 get tooltips working for RTL custom widgets under GTK Change-Id: I0e011b4d8d72c5133297127381ffe5c86e81ec51 Reviewed-on: https://gerrit.libreoffice.org/c/core/+/182652 Tested-by: Jenkins Reviewed-by: Adolfo Jayme Barrientos <fit...@ubuntu.com> diff --git a/vcl/unx/gtk3/gtkinst.cxx b/vcl/unx/gtk3/gtkinst.cxx index 81f80062b8e2..3d7567384fd2 100644 --- a/vcl/unx/gtk3/gtkinst.cxx +++ b/vcl/unx/gtk3/gtkinst.cxx @@ -18674,6 +18674,8 @@ private: gpointer widget) { GtkInstanceDrawingArea* pThis = static_cast<GtkInstanceDrawingArea*>(widget); + if (pThis->SwapForRTL()) + x = gtk_widget_get_allocated_width(pGtkWidget) - 1 - x; tools::Rectangle aHelpArea(x, y); OUString aTooltip = pThis->signal_query_tooltip(aHelpArea); if (aTooltip.isEmpty()) commit 5ddf6bfc709b4e3f2c3b8b50814858440072c731 Author: Patrick Luby <guibmac...@gmail.com> AuthorDate: Fri Mar 7 17:08:59 2025 -0500 Commit: Andras Timar <andras.ti...@collabora.com> CommitDate: Wed Mar 12 16:23:31 2025 +0100 tdf#165266 fix conditionals that limit -[NSApp setAppearance:] calls Calling -[NSApp setAppearance:] fires an NSNotification even if it is called with the curent appearance as parameter. To reduce the number of NSNotifications, commit 48125efbd7bf370981d48e4a8d0ce7fbaf1857e1 attempted to limit the number of -[NSApp setAppearance:] calls but the conditionals were flipped and that commit ended up blocking -[NSApp setAppearance:] calls once it has already been set to a non-nil value. Also, sync NSView's appearance to NSApp's appearance. Invoking -[NSApp setAppearance:] does immediately update the appearance of each NSWindow's titlebar, but it does not appear to update any NSView's appearance so explicitly sync appearances. Change-Id: I996daa868807cd5e4c8194f80d1f783b9e6e4e63 Reviewed-on: https://gerrit.libreoffice.org/c/core/+/182655 Reviewed-by: Adolfo Jayme Barrientos <fit...@ubuntu.com> Tested-by: Jenkins Reviewed-by: Patrick Luby <guibomac...@gmail.com> diff --git a/vcl/osx/salframe.cxx b/vcl/osx/salframe.cxx index b69fb17b1dcf..f5823da6ab5f 100644 --- a/vcl/osx/salframe.cxx +++ b/vcl/osx/salframe.cxx @@ -1447,14 +1447,22 @@ void AquaSalFrame::UpdateDarkMode() [NSApp setAppearance: nil]; break; case 1: // light - if (!pCurrentAppearance || [NSAppearanceNameAqua isEqualToString: [pCurrentAppearance name]]) + if (!pCurrentAppearance || ![NSAppearanceNameAqua isEqualToString: [pCurrentAppearance name]]) [NSApp setAppearance: [NSAppearance appearanceNamed: NSAppearanceNameAqua]]; break; case 2: // dark - if (!pCurrentAppearance || [NSAppearanceNameDarkAqua isEqualToString: [pCurrentAppearance name]]) + if (!pCurrentAppearance || ![NSAppearanceNameDarkAqua isEqualToString: [pCurrentAppearance name]]) [NSApp setAppearance: [NSAppearance appearanceNamed: NSAppearanceNameDarkAqua]]; break; } + + // Related: tdf#165266 sync NSView's appearance to NSApp's appearance + // Invoking -[NSApp setAppearance:] does immediately update the + // appearance of each NSWindow's titlebar, but it does not appear + // to update any NSView's appearance so explicitly sync appearances. + NSAppearance *pNewAppearance = [NSApp appearance]; + if (mpNSView.appearance != pNewAppearance) + mpNSView.appearance = pNewAppearance; } bool AquaSalFrame::GetUseDarkMode() const commit 7083b3c167649a3e90aeb7e775a65785fd43afed Author: Patrick Luby <guibomac...@gmail.com> AuthorDate: Sun Mar 9 16:38:05 2025 +0100 Commit: Andras Timar <andras.ti...@collabora.com> CommitDate: Wed Mar 12 16:23:31 2025 +0100 Revert "Related: tdf#41775 show Start Center even if loading a document" This reverts commit 9e3d8d0176bb1e95414e4a578065c2e1035a8dd6. Reason for revert: after testing, I found that only command line arguments go through this patch's path. It is extremely difficult trying to find where opening from the Finder or Dock is occurring since I cannot launch LibreOffice from the command line to test in my local build. Change-Id: Ica339cb4b76c1943ad04c8f3dd7f987c97dfe164 Reviewed-on: https://gerrit.libreoffice.org/c/core/+/182696 Reviewed-by: Adolfo Jayme Barrientos <fit...@ubuntu.com> Reviewed-by: Patrick Luby <guibomac...@gmail.com> Tested-by: Jenkins diff --git a/desktop/source/app/app.cxx b/desktop/source/app/app.cxx index dd33c593a3c7..91a34ed8b56b 100644 --- a/desktop/source/app/app.cxx +++ b/desktop/source/app/app.cxx @@ -1595,24 +1595,7 @@ int Desktop::Main() pExecGlobals->bRestartRequested = xRestartManager->isRestartRequested(true); if ( !pExecGlobals->bRestartRequested ) { -#ifdef MACOSX - // Related: tdf#41775 show Start Center even if loading a document - // If LibreOffice is launched by opening a document from the - // Finder, dragging it to the Dock, or including it in the - // command line arguments, the Start Center doesn't get created - // when all of the document windows are closed. So, the old - // "File only" menubar is displayed. - // On macOS, the Start Center's menubar is the "no windows open" - // menubar. This is done by making a native copy of the Start - // Center's menubar each time it is opened (note: on macOS the - // Start Center window can be closed and reopened repeatedly) - // so pre-populate the "no windows open" menubar by opening the - // Start Center even if a document is going to be loaded. - if ((/* !rCmdLineArgs.WantsToLoadDocument() && */ -#else - if ((!rCmdLineArgs.WantsToLoadDocument() && -#endif - !rCmdLineArgs.IsInvisible() && !rCmdLineArgs.IsHeadless() && !rCmdLineArgs.IsQuickstart()) && + if ((!rCmdLineArgs.WantsToLoadDocument() && !rCmdLineArgs.IsInvisible() && !rCmdLineArgs.IsHeadless() && !rCmdLineArgs.IsQuickstart()) && (SvtModuleOptions().IsModuleInstalled(SvtModuleOptions::EModule::STARTMODULE)) && (!bExistsRecoveryData ) && (!bExistsSessionData ) && commit 1e78e8d4ebbc94021fe4b51b91529a9716346f8d Author: Caolán McNamara <caolan.mcnam...@collabora.com> AuthorDate: Sat Mar 8 21:18:03 2025 +0000 Commit: Andras Timar <andras.ti...@collabora.com> CommitDate: Wed Mar 12 16:23:31 2025 +0100 Resolves: tdf#160391 test if dark/light mode changed at WM_THEMECHANGED what docs there are generally mentions WM_SETTINGCHANGE with lParam of ImmersiveColorSet but this seems to be too early for UseDarkMode() that uses ShouldAppsUseDarkMode to always return the right thing. While at WM_THEMECHANGED UseDarkMode() ShouldAppsUseDarkMode seems to be more robust. Change-Id: I0d582b441d0beeadc61d41e6518012fccdcce6e1 Reviewed-on: https://gerrit.libreoffice.org/c/core/+/182673 Tested-by: Caolán McNamara <caolan.mcnam...@collabora.com> Reviewed-by: Caolán McNamara <caolan.mcnam...@collabora.com> (cherry picked from commit f668fab0441500da85b76ee042309dcfb67d2253) Reviewed-on: https://gerrit.libreoffice.org/c/core/+/182676 Tested-by: Jenkins Reviewed-by: Adolfo Jayme Barrientos <fit...@ubuntu.com> diff --git a/vcl/win/window/salframe.cxx b/vcl/win/window/salframe.cxx index f768f4340b2c..2cc6e2998d1b 100644 --- a/vcl/win/window/salframe.cxx +++ b/vcl/win/window/salframe.cxx @@ -6308,6 +6308,7 @@ static LRESULT CALLBACK SalFrameWndProc( HWND hWnd, UINT nMsg, WPARAM wParam, LP break; case WM_THEMECHANGED: + UpdateDarkMode(hWnd); GetSalData()->mbThemeChanged = true; break; commit e5381168c36280a30dcdcd2898983d3173c1e05a Author: Patrick Luby <guibmac...@gmail.com> AuthorDate: Sat Mar 8 19:57:08 2025 -0500 Commit: Andras Timar <andras.ti...@collabora.com> CommitDate: Wed Mar 12 16:23:31 2025 +0100 Related: tdf#41775 show Start Center even if loading a document If LibreOffice is launched by opening a document from the Finder, dragging it to the Dock, or including it in the command line arguments, the Start Center doesn't get created when all of the document windows are closed. So, the old "File only" menubar is displayed. On macOS, the Start Center's menubar is the "no windows open" menubar. This is done by making a native copy of the Start Center's menubar each time it is opened (note: on macOS the Start Center window can be closed and reopened repeatedly) so pre-populate the "no windows open" menubar by opening the Start Center even if a document is going to be loaded. Change-Id: Ia3353748ca0517bb5f090f0b09641c93cf22c260 Reviewed-on: https://gerrit.libreoffice.org/c/core/+/182682 Tested-by: Jenkins Reviewed-by: Patrick Luby <guibomac...@gmail.com> (cherry picked from commit 9e3d8d0176bb1e95414e4a578065c2e1035a8dd6) Reviewed-on: https://gerrit.libreoffice.org/c/core/+/182684 Reviewed-by: Adolfo Jayme Barrientos <fit...@ubuntu.com> diff --git a/desktop/source/app/app.cxx b/desktop/source/app/app.cxx index 91a34ed8b56b..dd33c593a3c7 100644 --- a/desktop/source/app/app.cxx +++ b/desktop/source/app/app.cxx @@ -1595,7 +1595,24 @@ int Desktop::Main() pExecGlobals->bRestartRequested = xRestartManager->isRestartRequested(true); if ( !pExecGlobals->bRestartRequested ) { - if ((!rCmdLineArgs.WantsToLoadDocument() && !rCmdLineArgs.IsInvisible() && !rCmdLineArgs.IsHeadless() && !rCmdLineArgs.IsQuickstart()) && +#ifdef MACOSX + // Related: tdf#41775 show Start Center even if loading a document + // If LibreOffice is launched by opening a document from the + // Finder, dragging it to the Dock, or including it in the + // command line arguments, the Start Center doesn't get created + // when all of the document windows are closed. So, the old + // "File only" menubar is displayed. + // On macOS, the Start Center's menubar is the "no windows open" + // menubar. This is done by making a native copy of the Start + // Center's menubar each time it is opened (note: on macOS the + // Start Center window can be closed and reopened repeatedly) + // so pre-populate the "no windows open" menubar by opening the + // Start Center even if a document is going to be loaded. + if ((/* !rCmdLineArgs.WantsToLoadDocument() && */ +#else + if ((!rCmdLineArgs.WantsToLoadDocument() && +#endif + !rCmdLineArgs.IsInvisible() && !rCmdLineArgs.IsHeadless() && !rCmdLineArgs.IsQuickstart()) && (SvtModuleOptions().IsModuleInstalled(SvtModuleOptions::EModule::STARTMODULE)) && (!bExistsRecoveryData ) && (!bExistsSessionData ) && commit f4352637a143820711f04b3ba9ede449710979b9 Author: Oliver Specht <oliver.spe...@cib.de> AuthorDate: Thu Feb 27 11:18:23 2025 +0100 Commit: Andras Timar <andras.ti...@collabora.com> CommitDate: Wed Mar 12 16:23:31 2025 +0100 tdf#165483 style inherits only repated properties Each attribute a style inherits from a parent style needs to be repeated at that style. Otherwise it is overwritten by a default attribute. Change-Id: I9cef60b0d1eaa16d212f091434e9896bfd4a44c8 Reviewed-on: https://gerrit.libreoffice.org/c/core/+/182284 Tested-by: Gabor Kelemen <gabor.kelemen.ext...@allotropia.de> Tested-by: Jenkins Reviewed-by: Gabor Kelemen <gabor.kelemen.ext...@allotropia.de> (cherry picked from commit 38464825c8c80eed0d9b328a89cd96eb27175a0e) Reviewed-on: https://gerrit.libreoffice.org/c/core/+/182630 Reviewed-by: Christian Lohmaier <lohmaier+libreoff...@googlemail.com> diff --git a/sw/qa/extras/rtfimport/data/165483.rtf b/sw/qa/extras/rtfimport/data/165483.rtf new file mode 100755 index 000000000000..1c6eec96cdc9 --- /dev/null +++ b/sw/qa/extras/rtfimport/data/165483.rtf @@ -0,0 +1,12 @@ +{ tf1nsi +{\stylesheet{s36 Normal;} +{\* s11\sl400\slmult1\sa100 \snext11 \ssemihidden \sunhideused Normal Table;} +{ s12\sl400\slmult1\sa100 \snext11 \ssemihidden \sunhideused Normal Table Copy;} +{ s96 \sbasedon12\snext196 Based On Table Normal Copy;} +} +{\s96 This text should have single line spacing and no spacing below paragraph. This text should have single line spacing and no spacing below paragraph. This text should have single line spacing and no spacing below paragraph. This text should have single line spacing and no spacing below paragraph. \par } +{\s96 This text should have single line spacing and no spacing below paragraph. This text should have single line spacing and no spacing below paragraph. This text should have single line spacing and no spacing below paragraph. This text should have single line spacing and no spacing below paragraph. \par } +{\s96 This text should have single line spacing and no spacing below paragraph. This text should have single line spacing and no spacing below paragraph. This text should have single line spacing and no spacing below paragraph. This text should have single line spacing and no spacing below paragraph. \par } +{\s96 This text should have single line spacing and no spacing below paragraph. This text should have single line spacing and no spacing below paragraph. This text should have single line spacing and no spacing below paragraph. This text should have single line spacing and no spacing below paragraph. \par } + +} diff --git a/sw/qa/extras/rtfimport/rtfimport.cxx b/sw/qa/extras/rtfimport/rtfimport.cxx index 6b854306dbe3..6a79ac33d5a2 100644 --- a/sw/qa/extras/rtfimport/rtfimport.cxx +++ b/sw/qa/extras/rtfimport/rtfimport.cxx @@ -1995,6 +1995,18 @@ CPPUNIT_TEST_FIXTURE(Test, test165333Tdf) CPPUNIT_ASSERT_EQUAL(false, getProperty<bool>(xRun2, u"CharHidden"_ustr)); } +CPPUNIT_TEST_FIXTURE(Test, test165483Tdf) +{ + createSwDoc("165483.rtf"); + uno::Reference<text::XTextRange> const xRun1( + getRun(uno::Reference<text::XTextRange>(getParagraphOrTable(1), uno::UNO_QUERY), 1)); + uno::Reference<beans::XPropertySet> xStyle( + getStyles(u"ParagraphStyles"_ustr)->getByName(u"Based On Table Normal Copy"_ustr), + uno::UNO_QUERY); + CPPUNIT_ASSERT_EQUAL(sal_Int32(0), getProperty<sal_Int32>(xRun1, u"ParaBottomMargin"_ustr)); + CPPUNIT_ASSERT_EQUAL(sal_Int32(0), getProperty<sal_Int32>(xStyle, u"ParaBottomMargin"_ustr)); +} + // tests should only be added to rtfIMPORT *if* they fail round-tripping in rtfEXPORT } // end of anonymous namespace CPPUNIT_PLUGIN_IMPLEMENT(); diff --git a/sw/source/writerfilter/dmapper/DomainMapper.cxx b/sw/source/writerfilter/dmapper/DomainMapper.cxx index c8ee000c01e2..dffb1d38a971 100644 --- a/sw/source/writerfilter/dmapper/DomainMapper.cxx +++ b/sw/source/writerfilter/dmapper/DomainMapper.cxx @@ -4252,8 +4252,9 @@ void DomainMapper::ResetStyleProperties() pContext->Insert(ePropertyId, uno::Any(0l)); } break; + case PROP_PARA_BOTTOM_MARGIN: case PROP_PARA_RIGHT_MARGIN: - pContext->Insert(ePropertyId, uno::Any(0l)); + pContext->Insert(ePropertyId, uno::Any(sal_Int32(0))); break; case PROP_PARA_LAST_LINE_ADJUST: case PROP_PARA_ADJUST: @@ -4268,6 +4269,14 @@ void DomainMapper::ResetStyleProperties() case PROP_FILL_COLOR: pContext->Insert(ePropertyId, uno::Any(sal_Int32(COL_TRANSPARENT))); break; + case PROP_PARA_LINE_SPACING: + { + style::LineSpacing aLineSpacing; + aLineSpacing.Mode = style::LineSpacingMode::PROP; + aLineSpacing.Height = sal_Int32(100); + pContext->Insert(ePropertyId, uno::Any(aLineSpacing)); + } + break; case INVALID: default: break; diff --git a/sw/source/writerfilter/rtftok/rtfdocumentimpl.cxx b/sw/source/writerfilter/rtftok/rtfdocumentimpl.cxx index ce391551c719..2eebb3a87eeb 100644 --- a/sw/source/writerfilter/rtftok/rtfdocumentimpl.cxx +++ b/sw/source/writerfilter/rtftok/rtfdocumentimpl.cxx @@ -266,6 +266,32 @@ static void lcl_DestinationToMath(OUStringBuffer* pDestinationText, rMathBuffer.appendClosingTag(M_TOKEN(r)); } +static writerfilter::Reference<Properties>::Pointer_t +lcl_findParentStyle(std::shared_ptr<RTFReferenceTable::Entries_t> pStyleTableEntries, + RTFValue::Pointer_t const pStyle, const OUString& rBase) +{ + writerfilter::Reference<Properties>::Pointer_t ret; + if (!pStyle) + return ret; + auto itParent = pStyleTableEntries->begin(); + while (itParent != pStyleTableEntries->end()) + { + RTFValue::Pointer_t const pParentName + = static_cast<RTFReferenceProperties&>(*itParent->second) + .getSprms() + .find(NS_ooxml::LN_CT_Style_name); + if (pParentName && pParentName->getString().equals(rBase) + && !pParentName->getString().equals(pStyle->getString())) + break; + ++itParent; + } + if (itParent != pStyleTableEntries->end()) + { + ret = itParent->second; + } + return ret; +} + RTFDocumentImpl::RTFDocumentImpl(uno::Reference<uno::XComponentContext> const& xContext, uno::Reference<io::XInputStream> const& xInputStream, rtl::Reference<SwXTextDocument> const& xDstDoc, @@ -518,6 +544,7 @@ RTFDocumentImpl::getProperties(const RTFSprms& rAttributes, RTFSprms const& rSpr if (!m_aStates.empty()) nStyle = m_aStates.top().getCurrentStyleIndex(); auto it = m_pStyleTableEntries->find(nStyle); + if (it != m_pStyleTableEntries->end()) { // cloneAndDeduplicate() wants to know about only a single "style", so @@ -2176,12 +2203,9 @@ RTFError RTFDocumentImpl::pushState() writerfilter::Reference<Properties>::Pointer_t RTFDocumentImpl::createStyleProperties() { - int nBasedOn = 0; RTFValue::Pointer_t pBasedOn = m_aStates.top().getTableSprms().find(NS_ooxml::LN_CT_Style_basedOn); - if (pBasedOn) - nBasedOn = pBasedOn->getInt(); - if (nBasedOn == 0) + if (!pBasedOn) { // No parent style, then mimic what Word does: ignore attributes which // would set a margin as formatting, but with a default value. @@ -2234,13 +2258,13 @@ RTFReferenceTable::Entries_t RTFDocumentImpl::deduplicateStyleTable() NS_ooxml::LN_CT_Style_basedOn)); if (pBasedOn) { - int const nBasedOn(pBasedOn->getInt()); - // don't deduplicate yourself - especially a potential problem for the default style. - if (it.first == nBasedOn) - continue; + RTFValue::Pointer_t const pStyleName( + static_cast<RTFReferenceProperties&>(*pStyle).getSprms().find( + NS_ooxml::LN_CT_Style_name)); + writerfilter::Reference<Properties>::Pointer_t parentStyle + = lcl_findParentStyle(m_pStyleTableEntries, pStyleName, pBasedOn->getString()); - auto const itParent(m_pStyleTableEntries->find(nBasedOn)); // definition as read! - if (itParent != m_pStyleTableEntries->end()) + if (parentStyle.is()) { auto const pStyleType( static_cast<RTFReferenceProperties&>(*pStyle).getAttributes().find( @@ -2249,20 +2273,19 @@ RTFReferenceTable::Entries_t RTFDocumentImpl::deduplicateStyleTable() int const nStyleType(pStyleType->getInt()); RTFSprms sprms( static_cast<RTFReferenceProperties&>(*pStyle).getSprms().cloneAndDeduplicate( - static_cast<RTFReferenceProperties&>(*itParent->second).getSprms(), - nStyleType)); + static_cast<RTFReferenceProperties&>(*parentStyle).getSprms(), nStyleType)); RTFSprms attributes( static_cast<RTFReferenceProperties&>(*pStyle) .getAttributes() .cloneAndDeduplicate( - static_cast<RTFReferenceProperties&>(*itParent->second).getAttributes(), + static_cast<RTFReferenceProperties&>(*parentStyle).getAttributes(), nStyleType)); ret[it.first] = new RTFReferenceProperties(std::move(attributes), std::move(sprms)); } else { - SAL_WARN("writerfilter.rtf", "parent style not found: " << nBasedOn); + SAL_WARN("writerfilter.rtf", "parent style not found: " << pBasedOn->getString()); } } } diff --git a/sw/source/writerfilter/rtftok/rtfsprm.cxx b/sw/source/writerfilter/rtftok/rtfsprm.cxx index 8de1626f252f..f61ffb957240 100644 --- a/sw/source/writerfilter/rtftok/rtfsprm.cxx +++ b/sw/source/writerfilter/rtftok/rtfsprm.cxx @@ -180,6 +180,14 @@ static RTFValue::Pointer_t getDefaultSPRM(Id const id, Id nStyleType) { switch (id) { + case NS_ooxml::LN_CT_PPrBase_spacing: + { + RTFSprms aAttributes; + RTFSprms aSprms; + aAttributes.set(NS_ooxml::LN_CT_Spacing_after, new RTFValue(0l)); + return new RTFValue(aAttributes, aSprms); + } + break; case NS_ooxml::LN_CT_Spacing_before: case NS_ooxml::LN_CT_Spacing_after: case NS_ooxml::LN_CT_Ind_left: @@ -222,6 +230,7 @@ static bool isSPRMDeduplicateDenylist(Id nId, RTFSprms* pDirect) { switch (nId) { + case NS_ooxml::LN_CT_Style_type: //never remove the style type // See the NS_ooxml::LN_CT_PPrBase_tabs handler in DomainMapper, // deduplication is explicitly not wanted for these tokens. case NS_ooxml::LN_CT_TabStop_val: commit 607a8c1bc217b6b4fbc098402500f8d470e7683f Author: Mike Kaganski <mike.kagan...@collabora.com> AuthorDate: Fri Mar 7 16:55:18 2025 +0500 Commit: Andras Timar <andras.ti...@collabora.com> CommitDate: Wed Mar 12 16:23:31 2025 +0100 ReqIF export: avoid writing border properties Change-Id: I05e7ba3fda54300f99fd2121aaa5d167dd27851c Reviewed-on: https://gerrit.libreoffice.org/c/core/+/182617 Reviewed-by: Mike Kaganski <mike.kagan...@collabora.com> Tested-by: Jenkins (cherry picked from commit 75135c6c7d43b9d4f979a026cdd2529209cb9dea) Reviewed-on: https://gerrit.libreoffice.org/c/core/+/182634 Reviewed-by: Xisco Fauli <xiscofa...@libreoffice.org> diff --git a/sw/qa/extras/htmlexport/data/img_with_border.fodt b/sw/qa/extras/htmlexport/data/img_with_border.fodt new file mode 100644 index 000000000000..fd3fbfe36dcd --- /dev/null +++ b/sw/qa/extras/htmlexport/data/img_with_border.fodt @@ -0,0 +1,24 @@ +<?xml version="1.0" encoding="UTF-8"?> + +<office:document xmlns:office="urn:oasis:names:tc:opendocument:xmlns:office:1.0" xmlns:fo="urn:oasis:names:tc:opendocument:xmlns:xsl-fo-compatible: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:draw="urn:oasis:names:tc:opendocument:xmlns:drawing:1.0" xmlns:svg="urn:oasis:names:tc:opendocument:xmlns:svg-compatible:1.0" office:version="1.4" office:mimetype="application/vnd.oasis.opendocument.text"> + <office:styles> + <style:style style:name="Graphics" style:family="graphic"> + <style:graphic-properties svg:x="0" svg:y="0" style:vertical-pos="top" style:vertical-rel="paragraph" style:horizontal-pos="center" style:horizontal-rel="paragraph" fo:padding="0.5mm" fo:border="0.06pt solid #000000"/> + </style:style> + </office:styles> + <office:body> + <office:text> + <text:p><draw:frame draw:style-name="Graphics" draw:name="1px" text:anchor-type="char" svg:width="1cm" svg:height="1cm"><draw:image draw:mime-type="image/png"> + <office:binary-data>iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAIAAACQd1PeAAAAAXNSR0IArs4c6QAAAARnQU1B + AACxjwv8YQUAAAAJcEhZcwAADsMAAA7DAcdvqGQAAAAYdEVYdFNvZnR3YXJlAFBhaW50Lk5F + VCA1LjEuNBLfpoMAAAC2ZVhJZklJKgAIAAAABQAaAQUAAQAAAEoAAAAbAQUAAQAAAFIAAAAo + AQMAAQAAAAIAAAAxAQIAEAAAAFoAAABphwQAAQAAAGoAAAAAAAAAYAAAAAEAAABgAAAAAQAA + AFBhaW50Lk5FVCA1LjEuNAADAACQBwAEAAAAMDIzMAGgAwABAAAAAQAAAAWgBAABAAAAlAAA + AAAAAAACAAEAAgAEAAAAUjk4AAIABwAEAAAAMDEwMAAAAADX5rshveZftAAAAAxJREFUGFdj + +P//PwAF/gL+pzWBhAAAAABJRU5ErkJg + </office:binary-data> + </draw:image> + </draw:frame></text:p> + </office:text> + </office:body> +</office:document> \ No newline at end of file diff --git a/sw/qa/extras/htmlexport/htmlexport2.cxx b/sw/qa/extras/htmlexport/htmlexport2.cxx index 550c9644af97..75ee544f5875 100644 --- a/sw/qa/extras/htmlexport/htmlexport2.cxx +++ b/sw/qa/extras/htmlexport/htmlexport2.cxx @@ -1622,6 +1622,20 @@ CPPUNIT_TEST_FIXTURE(SwHtmlDomExportTest, testReqifNoTargetInA) assertXPathNoAttribute(pXmlDoc, "//reqif-xhtml:a", "target"); } +CPPUNIT_TEST_FIXTURE(SwHtmlDomExportTest, testReqifNoObjectBorderExport) +{ + // Given a document with an image with black border + createSwDoc("img_with_border.fodt"); + + // When exporting to XHTML: + ExportToReqif(); + + // Check that there's no 'font' element that used to be exported, containing the border color: + xmlDocUniquePtr pXmlDoc = WrapReqifFromTempFile(); + // Without the accompanying fix in place, this test would have failed + assertXPath(pXmlDoc, "//reqif-xhtml:font", 0); +} + } // end of anonymous namespace CPPUNIT_PLUGIN_IMPLEMENT(); diff --git a/sw/source/filter/html/htmlflywriter.cxx b/sw/source/filter/html/htmlflywriter.cxx index 0ff0183248e9..a67f71ee584a 100644 --- a/sw/source/filter/html/htmlflywriter.cxx +++ b/sw/source/filter/html/htmlflywriter.cxx @@ -1353,6 +1353,9 @@ SwHTMLWriter& OutHTML_ImageStart( HtmlWriter& rHtml, SwHTMLWriter& rWrt, const S } } + if (rWrt.mbReqIF) + nFrameOpts &= ~HtmlFrmOpts::Border; + // <font color = ...>...<img ... >...</font> sal_uInt16 nBorderWidth = 0; const SvxBoxItem* pBoxItem; commit 6dee712f7f552bda33ca474aaaf8cf98bda00e61 Author: Michael Stahl <michael.st...@allotropia.de> AuthorDate: Thu Mar 6 18:53:35 2025 +0100 Commit: Andras Timar <andras.ti...@collabora.com> CommitDate: Wed Mar 12 16:23:31 2025 +0100 tdf#161583 vcl,sc,sw: PDF/UA export: fix Contents of Link annotations In ISO 14289-2:2024 the requirement was changed from "shall" to "should": Link annotations should include a Contents entry to enrich information available to assistive technology. There is also now a Well-Tagged PDF (WTPDF) Version 1.0.0, which says: 8.9.2.4.2 Link Link annotations should include a Contents entry to enrich information available to assistive technology. NOTE 1 Link annotations are often accessed out of context; the Contents entry provides optional additional information. The Contents entry is also particularly valuable in the context of link targets that are not intended to be human-readable. EXAMPLE — A link over the text “click here” is improved by a Contents entry to advise the user regarding the link’s target. So adapt PDFWriterImpl::emitLinkAnnotations() to produce "Contents" only if there is some alt text. The sw a11y check will already warn if the alt text/"name" is missing on a hyperlink in a SwTextNode, and a previous commit added a warning if it is missing on a hyperlink in a SwFlyFrameFormat. Contents should in any case not contain the textual representation of the hyperlinks, that was a misunderstanding, but describe the target of the link. This requires adapting numerous unit tests. (regression from commit fa3f04bdd4f73a1b3be70dfb709c44638ef7e3d9) Change-Id: I88a7ae83d17d781115c93152d267ddb57208c200 Reviewed-on: https://gerrit.libreoffice.org/c/core/+/182600 Reviewed-by: Michael Stahl <michael.st...@allotropia.de> Tested-by: Jenkins (cherry picked from commit 9cef7e5ba50b483cd84682528c7ef503965b6104) Reviewed-on: https://gerrit.libreoffice.org/c/core/+/182614 Reviewed-by: Christian Lohmaier <lohmaier+libreoff...@googlemail.com> diff --git a/sc/source/ui/view/output2.cxx b/sc/source/ui/view/output2.cxx index 9720ccbec914..6f08e3f2de8d 100644 --- a/sc/source/ui/view/output2.cxx +++ b/sc/source/ui/view/output2.cxx @@ -888,7 +888,7 @@ static void lcl_DoHyperlinkResult( const OutputDevice* pDev, const tools::Rectan if ( !aURL.isEmpty() && pPDFData ) { vcl::PDFExtOutDevBookmarkEntry aBookmark; - aBookmark.nLinkId = pPDFData->CreateLink(rRect, aCellText); + aBookmark.nLinkId = pPDFData->CreateLink(rRect, u""_ustr); aBookmark.aBookmark = aURL; std::vector< vcl::PDFExtOutDevBookmarkEntry >& rBookmarks = pPDFData->GetBookmarks(); rBookmarks.push_back( aBookmark ); diff --git a/sw/source/core/text/EnhancedPDFExportHelper.cxx b/sw/source/core/text/EnhancedPDFExportHelper.cxx index 4c7e4e43e36b..61bcfb6dac55 100644 --- a/sw/source/core/text/EnhancedPDFExportHelper.cxx +++ b/sw/source/core/text/EnhancedPDFExportHelper.cxx @@ -2333,8 +2333,6 @@ void SwEnhancedPDFExportHelper::EnhancedPDFExport(LanguageType const eLanguageDe SwRects const aTmp(GetCursorRectsContainingText(mrSh)); OSL_ENSURE( !aTmp.empty(), "Enhanced pdf export - rectangles are missing" ); OUString altText(p->rINetAttr.GetINetFormat().GetName()); - if (altText.isEmpty()) - altText = mrSh.GetSelText(); const SwPageFrame* pSelectionPage = static_cast<const SwPageFrame*>( mrSh.GetLayout()->Lower() ); @@ -2458,7 +2456,7 @@ void SwEnhancedPDFExportHelper::EnhancedPDFExport(LanguageType const eLanguageDe { Point aNullPt; const SwRect aLinkRect = pFrameFormat->FindLayoutRect( false, &aNullPt ); - OUString const formatName(pFrameFormat->GetName()); + OUString const linkName(pItem->GetName()); // Link PageNums std::vector<sal_Int32> aLinkPageNums = CalcOutputPageNums( aLinkRect ); @@ -2467,7 +2465,7 @@ void SwEnhancedPDFExportHelper::EnhancedPDFExport(LanguageType const eLanguageDe { tools::Rectangle aRect(SwRectToPDFRect(pCurrPage, aLinkRect.SVRect())); const sal_Int32 nLinkId = - pPDFExtOutDevData->CreateLink(aRect, formatName, aLinkPageNum); + pPDFExtOutDevData->CreateLink(aRect, linkName, aLinkPageNum); // Store link info for tagged pdf output: const IdMapEntry aLinkEntry(aLinkRect, nLinkId); @@ -2488,7 +2486,7 @@ void SwEnhancedPDFExportHelper::EnhancedPDFExport(LanguageType const eLanguageDe { const SwTextNode* pTNd = pAnchorNode->GetTextNode(); if ( pTNd ) - MakeHeaderFooterLinks(*pPDFExtOutDevData, *pTNd, aLinkRect, nDestId, aURL, bInternal, formatName); + MakeHeaderFooterLinks(*pPDFExtOutDevData, *pTNd, aLinkRect, nDestId, aURL, bInternal, linkName); } } } @@ -2587,7 +2585,6 @@ void SwEnhancedPDFExportHelper::EnhancedPDFExport(LanguageType const eLanguageDe // #i44368# Links in Header/Footer const bool bHeaderFooter = pDoc->IsInHeaderFooter( *pTNd ); - OUString const content(pField->ExpandField(true, mrSh.GetLayout())); // Create links for all selected rectangles: const size_t nNumOfRects = aTmp.size(); @@ -2604,7 +2601,7 @@ void SwEnhancedPDFExportHelper::EnhancedPDFExport(LanguageType const eLanguageDe // Link Export aRect = SwRectToPDFRect(pCurrPage, rLinkRect.SVRect()); const sal_Int32 nLinkId = - pPDFExtOutDevData->CreateLink(aRect, content, aLinkPageNum); + pPDFExtOutDevData->CreateLink(aRect, rRefName, aLinkPageNum); // Store link info for tagged pdf output: const IdMapEntry aLinkEntry( rLinkRect, nLinkId ); @@ -2616,7 +2613,7 @@ void SwEnhancedPDFExportHelper::EnhancedPDFExport(LanguageType const eLanguageDe // #i44368# Links in Header/Footer if ( bHeaderFooter ) { - MakeHeaderFooterLinks(*pPDFExtOutDevData, *pTNd, rLinkRect, nDestId, u""_ustr, true, content); + MakeHeaderFooterLinks(*pPDFExtOutDevData, *pTNd, rLinkRect, nDestId, u""_ustr, true, rRefName); } } } @@ -2701,7 +2698,7 @@ void SwEnhancedPDFExportHelper::EnhancedPDFExport(LanguageType const eLanguageDe OUString const numStrRef(pTextFootnote->GetFootnote().GetViewNumStr(*pDoc, mrSh.GetLayout(), false)); // Export back link - const sal_Int32 nBackLinkId = pPDFExtOutDevData->CreateLink(aFootnoteSymbolRect, numStrSymbol, nDestPageNum); + const sal_Int32 nBackLinkId = pPDFExtOutDevData->CreateLink(aFootnoteSymbolRect, numStrRef, nDestPageNum); // Destination Export const sal_Int32 nDestId = pPDFExtOutDevData->CreateDest(aRect, nDestPageNum); mrSh.GotoFootnoteAnchor(); @@ -2710,7 +2707,7 @@ void SwEnhancedPDFExportHelper::EnhancedPDFExport(LanguageType const eLanguageDe pCurrPage = static_cast<const SwPageFrame*>( mrSh.GetLayout()->Lower() ); // Link Export aRect = SwRectToPDFRect(pCurrPage, aLinkRect.SVRect()); - const sal_Int32 nLinkId = pPDFExtOutDevData->CreateLink(aRect, numStrRef, aLinkPageNum); + const sal_Int32 nLinkId = pPDFExtOutDevData->CreateLink(aRect, numStrSymbol, aLinkPageNum); // Back link destination Export const sal_Int32 nBackDestId = pPDFExtOutDevData->CreateDest(aRect, aLinkPageNum); // Store link info for tagged pdf output: @@ -3052,7 +3049,7 @@ void SwEnhancedPDFExportHelper::ExportAuthorityEntryLinks() continue; } - OUString const content(rAuthorityField.ExpandField(true, mrSh.GetLayout())); + OUString const content(rAuthorityField.GetAuthority(mrSh.GetLayout())); // Select the field. mrSh.SwCursorShell::SetMark(); @@ -3103,7 +3100,7 @@ void SwEnhancedPDFExportHelper::ExportAuthorityEntryLinks() continue; } - OUString const content(rAuthorityField.ExpandField(true, mrSh.GetLayout())); + OUString const content(rAuthorityField.GetAuthority(mrSh.GetLayout())); // Select the field. mrSh.SwCursorShell::SetMark(); diff --git a/vcl/qa/cppunit/pdfexport/data/LinkPages.fodt b/vcl/qa/cppunit/pdfexport/data/LinkPages.fodt index 50fff8bea4fc..50958d3b193c 100644 --- a/vcl/qa/cppunit/pdfexport/data/LinkPages.fodt +++ b/vcl/qa/cppunit/pdfexport/data/LinkPages.fodt @@ -131,8 +131,8 @@ <text:sequence-decl text:display-outline-level="0" text:name="Drawing"/> <text:sequence-decl text:display-outline-level="0" text:name="Figure"/> </text:sequence-decls> - <text:h text:style-name="P3" text:outline-level="1"><text:a xlink:type="simple" xlink:href="http://example.com/" text:style-name="Internet_20_link" text:visited-style-name="Visited_20_Internet_20_Link"><text:bookmark-start text:name="__RefHeading___Toc17_3815242785"/><text:span text:style-name="T6">foo foo </text:span><text:soft-page-break/><text:span text:style-name="T6">foo foo</text:span></text:a><text:bookmark-end text:name="__RefHeading___Toc17_3815242785"/></text:h> + <text:h text:style-name="P3" text:outline-level="1"><text:a xlink:type="simple" xlink:href="http://example.com/" office:name="quadfoo" text:style-name="Internet_20_link" text:visited-style-name="Visited_20_Internet_20_Link"><text:bookmark-start text:name="__RefHeading___Toc17_3815242785"/><text:span text:style-name="T6">foo foo </text:span><text:soft-page-break/><text:span text:style-name="T6">foo foo</text:span></text:a><text:bookmark-end text:name="__RefHeading___Toc17_3815242785"/></text:h> <text:p text:style-name="Text_20_body"><text:soft-page-break/><text:span text:style-name="T4"><text:bookmark-ref text:reference-format="text" text:ref-name="__RefHeading___Toc17_3815242785">foo foo foo foo</text:bookmark-ref></text:span><text:soft-page-break/></text:p> </office:text> </office:body> -</office:document> \ No newline at end of file +</office:document> diff --git a/vcl/qa/cppunit/pdfexport/data/LinkWithFly.fodt b/vcl/qa/cppunit/pdfexport/data/LinkWithFly.fodt index 5c14cee1f28c..881ef60da399 100644 --- a/vcl/qa/cppunit/pdfexport/data/LinkWithFly.fodt +++ b/vcl/qa/cppunit/pdfexport/data/LinkWithFly.fodt @@ -117,7 +117,7 @@ <text:sequence-decl text:display-outline-level="0" text:name="Drawing"/> <text:sequence-decl text:display-outline-level="0" text:name="Figure"/> </text:sequence-decls> - <text:p text:style-name="Standard"><text:a xlink:type="simple" xlink:href="https://www.mozilla.org/en-US/firefox/119.0/releasenotes/" text:style-name="Internet_20_link" text:visited-style-name="Visited_20_Internet_20_Link">https://www.mozilla.org/en-US<draw:frame draw:style-name="fr1" draw:name="Image1" text:anchor-type="char" svg:x="5.318cm" svg:y="0.056cm" svg:width="6.364cm" svg:height="6.364cm" draw:z-index="0"><draw:image draw:mime-type="image/png"> + <text:p text:style-name="Standard"><text:a xlink:type="simple" xlink:href="https://www.mozilla.org/en-US/firefox/119.0/releasenotes/" office:name="Firefox119" text:style-name="Internet_20_link" text:visited-style-name="Visited_20_Internet_20_Link">https://www.mozilla.org/en-US<draw:frame draw:style-name="fr1" draw:name="Image1" text:anchor-type="char" svg:x="5.318cm" svg:y="0.056cm" svg:width="6.364cm" svg:height="6.364cm" draw:z-index="0"><draw:image draw:mime-type="image/png"> <office:binary-data>iVBORw0KGgoAAAANSUhEUgAAABMAAAATCAYAAAByUDbMAAAABGdBTUEAANbY1E9YMgAAABl0 RVh0U29mdHdhcmUAQWRvYmUgSW1hZ2VSZWFkeXHJZTwAAAFpSURBVHjaYvz//z8DtQBAADER o+jjZGuibAQIICZiDOK/cgzFwEnrV/4HYXS1AAHERIxBR58yMiAb2DtzM1b1AAHERIxBIIBu @@ -131,7 +131,7 @@ </draw:image> <svg:title>house</svg:title> </draw:frame>/firefox/119.0/releasenotes/</text:a></text:p> - <text:p text:style-name="P1"><text:a xlink:type="simple" xlink:href="https://www.mozilla.org/en-US/firefox/118.0/releasenotes/" text:style-name="Internet_20_link" text:visited-style-name="Visited_20_Internet_20_Link">https://www.mozilla.org/en-US/firefox/118.0/releasenotes/</text:a></text:p> + <text:p text:style-name="P1"><text:a xlink:type="simple" xlink:href="https://www.mozilla.org/en-US/firefox/118.0/releasenotes/" office:name="Firefox118" text:style-name="Internet_20_link" text:visited-style-name="Visited_20_Internet_20_Link">https://www.mozilla.org/en-US/firefox/118.0/releasenotes/</text:a></text:p> </office:text> </office:body> </office:document> diff --git a/vcl/qa/cppunit/pdfexport/data/PDF_export_with_formcontrol.fodt b/vcl/qa/cppunit/pdfexport/data/PDF_export_with_formcontrol.fodt index eda699e27f02..6498ed2e0b47 100644 --- a/vcl/qa/cppunit/pdfexport/data/PDF_export_with_formcontrol.fodt +++ b/vcl/qa/cppunit/pdfexport/data/PDF_export_with_formcontrol.fodt @@ -162,9 +162,9 @@ </text:sequence-decls> <text:p text:style-name="P15">This <text:span text:style-name="T1">t</text:span>ext document contains some links and a text control.</text:p> <text:p text:style-name="P13"><text:span text:style-name="T1">When exporting the document to PDF in LO 7.5.</text:span><text:span text:style-name="T6">3.2</text:span><text:span text:style-name="T1"> or newer the links won't have the right target any more. First link to "Kläranlage" will open last link to "#pano=24", </text:span><text:span text:style-name="T5">second link won't open anything and third link will open "Mechanische Vorreinigung"</text:span></text:p> - <text:p text:style-name="Text_20_body"><text:a xlink:type="simple" xlink:href="https://klexikon.zum.de/wiki/Kläranlage" text:style-name="Internet_20_link" text:visited-style-name="Visited_20_Internet_20_Link">https://klexikon.zum.de/wiki/Kläranlage</text:a></text:p> + <text:p text:style-name="Text_20_body"><text:a xlink:type="simple" xlink:href="https://klexikon.zum.de/wiki/Kläranlage" office:name="wiki-seite" text:style-name="Internet_20_link" text:visited-style-name="Visited_20_Internet_20_Link">https://klexikon.zum.de/wiki/Kläranlage</text:a></text:p> <text:p text:style-name="Text_20_body"><text:a xlink:type="simple" xlink:href="https://de.wikipedia.org/wiki/Kläranlage#Mechanische_Vorreinigung" text:style-name="Internet_20_link" text:visited-style-name="Visited_20_Internet_20_Link">https://de.wikipedia.org/wiki/Kläranlage#Mechanische_Vorreinigung</text:a></text:p> - <text:p text:style-name="Text_20_body"><text:a xlink:type="simple" xlink:href="https://vr-easy.com/tour/usr/220113-virtuellerschulausflug/#pano=24" text:style-name="Internet_20_link" text:visited-style-name="Visited_20_Internet_20_Link">https://vr-easy.com/tour/usr/220113-virtuellerschulausflug/#pano=24</text:a></text:p> + <text:p text:style-name="Text_20_body"><text:a xlink:type="simple" xlink:href="https://vr-easy.com/tour/usr/220113-virtuellerschulausflug/#pano=24" office:name="tour" text:style-name="Internet_20_link" text:visited-style-name="Visited_20_Internet_20_Link">https://vr-easy.com/tour/usr/220113-virtuellerschulausflug/#pano=24</text:a></text:p> <text:p text:style-name="Text_20_body">Here a form control for getting possibility to input content.</text:p> <text:p text:style-name="Text_20_body"><draw:control text:anchor-type="as-char" svg:y="-0.3146in" draw:z-index="0" draw:name="Form1" draw:style-name="gr1" draw:text-style-name="P28" svg:width="6.3776in" svg:height="1.7717in" draw:control="control1"/></text:p> <text:p text:style-name="Text_20_body">When deleting the form control links will work as expected.</text:p> diff --git a/vcl/qa/cppunit/pdfexport/pdfexport.cxx b/vcl/qa/cppunit/pdfexport/pdfexport.cxx index c49c01aa7133..58232d8fbc65 100644 --- a/vcl/qa/cppunit/pdfexport/pdfexport.cxx +++ b/vcl/qa/cppunit/pdfexport/pdfexport.cxx @@ -2303,7 +2303,7 @@ CPPUNIT_TEST_FIXTURE(PdfExportTest, testTdf157816) auto pAContents = dynamic_cast<vcl::filter::PDFHexStringElement*>( pAnnot->Lookup("Contents"_ostr)); CPPUNIT_ASSERT_EQUAL( - u"Error: Reference source not found"_ustr, + u"__RefHeading___Toc1501_2152971747"_ustr, ::vcl::filter::PDFDocument::DecodeHexStringUTF16BE(*pAContents)); auto pStructParent = dynamic_cast<vcl::filter::PDFNumberElement*>( pAnnot->Lookup("StructParent"_ostr)); @@ -2370,7 +2370,7 @@ CPPUNIT_TEST_FIXTURE(PdfExportTest, testTdf157816) auto pAContents = dynamic_cast<vcl::filter::PDFHexStringElement*>( pAnnot->Lookup("Contents"_ostr)); CPPUNIT_ASSERT_EQUAL( - u"Error: Reference source not found"_ustr, + u"__RefHeading___Toc1501_2152971747"_ustr, ::vcl::filter::PDFDocument::DecodeHexStringUTF16BE(*pAContents)); auto pStructParent = dynamic_cast<vcl::filter::PDFNumberElement*>( pAnnot->Lookup("StructParent"_ostr)); @@ -2436,7 +2436,7 @@ CPPUNIT_TEST_FIXTURE(PdfExportTest, testTdf157816) auto pAContents = dynamic_cast<vcl::filter::PDFHexStringElement*>( pAnnot->Lookup("Contents"_ostr)); CPPUNIT_ASSERT_EQUAL( - u"Error: Reference source not found"_ustr, + u"__RefHeading___Toc1501_2152971747"_ustr, ::vcl::filter::PDFDocument::DecodeHexStringUTF16BE(*pAContents)); auto pStructParent = dynamic_cast<vcl::filter::PDFNumberElement*>( pAnnot->Lookup("StructParent"_ostr)); @@ -2502,7 +2502,7 @@ CPPUNIT_TEST_FIXTURE(PdfExportTest, testTdf157816) auto pAContents = dynamic_cast<vcl::filter::PDFHexStringElement*>( pAnnot->Lookup("Contents"_ostr)); CPPUNIT_ASSERT_EQUAL( -e ... etc. - the rest is truncated