basic/source/uno/namecont.cxx | 27 ++++++++- compilerplugins/clang/cow_wrapper.cxx | 2 cppuhelper/inc/interfacecontainer4.hxx | 4 - cui/source/dialogs/cuicharmap.cxx | 1 include/comphelper/interfacecontainer3.hxx | 8 ++ include/comphelper/interfacecontainer4.hxx | 6 +- include/vcl/print.hxx | 1 sc/inc/typedstrdata.hxx | 10 +++ sc/qa/uitest/autofilter/autofilterBugs.py | 24 ++++++++ sc/qa/unit/data/xlsx/tdf159581_optimalRowHeight.xlsx |binary sc/qa/unit/subsequent_filters_test2.cxx | 11 +++ sc/source/core/data/dociter.cxx | 2 sc/source/core/data/documen3.cxx | 2 sc/source/core/data/validat.cxx | 3 + sc/source/core/tool/typedstrdata.cxx | 54 +++++++++++++++++-- sc/source/ui/app/inputhdl.cxx | 3 - svgio/qa/cppunit/SvgImportTest.cxx | 21 ++++++- svgio/qa/cppunit/data/tdf159594.svg | 7 ++ svgio/source/svgreader/svgsymbolnode.cxx | 8 +- svtools/source/dialogs/PlaceEditDialog.cxx | 2 sw/CppunitTest_sw_a11y.mk | 1 sw/inc/IDocumentMarkAccess.hxx | 7 ++ sw/inc/unoprnms.hxx | 1 sw/qa/extras/accessibility/dialogs.cxx | 2 sw/source/core/doc/docbm.cxx | 10 +++ sw/source/core/frmedt/fetab.cxx | 4 - sw/source/core/inc/MarkManager.hxx | 1 sw/source/core/table/swnewtable.cxx | 9 ++- sw/source/core/text/porrst.cxx | 12 ++++ sw/source/core/undo/undel.cxx | 27 ++++++--- sw/source/core/unocore/unomap1.cxx | 1 sw/source/core/unocore/unostyle.cxx | 28 ++++++--- sw/source/filter/writer/writer.cxx | 6 +- test/CppunitTest_test_a11y.mk | 1 vcl/inc/osx/salprn.h | 2 vcl/inc/salprn.hxx | 3 + vcl/inc/unx/genprn.h | 2 vcl/inc/win/salprn.h | 3 + vcl/osx/salprn.cxx | 5 + vcl/source/gdi/print.cxx | 8 ++ vcl/source/treelist/svimpbox.cxx | 2 vcl/unx/generic/print/genprnpsp.cxx | 5 + vcl/win/gdi/salprn.cxx | 19 ++++++ writerfilter/source/dmapper/DomainMapper.cxx | 17 +++++ writerfilter/source/dmapper/DomainMapper_Impl.cxx | 8 ++ writerfilter/source/dmapper/DomainMapper_Impl.hxx | 22 +++++++ writerfilter/source/dmapper/PropertyIds.cxx | 1 writerfilter/source/dmapper/PropertyIds.hxx | 1 writerfilter/source/dmapper/PropertyMap.cxx | 24 ++++++++ writerfilter/source/dmapper/PropertyMap.hxx | 7 ++ writerfilter/source/ooxml/model.xml | 4 + writerfilter/source/rtftok/rtfdispatchvalue.cxx | 12 ++++ writerfilter/source/rtftok/rtfdocumentimpl.cxx | 10 ++- 53 files changed, 408 insertions(+), 53 deletions(-)
New commits: commit 88055e657afb960d2b30476b134b3ff1dc502b96 Author: Noel Grandin <noel.gran...@collabora.co.uk> AuthorDate: Fri Feb 9 10:55:18 2024 +0200 Commit: Andras Timar <andras.ti...@collabora.com> CommitDate: Fri Feb 9 20:09:42 2024 +0100 tdf#159641 TreeView repaint problem with PgUp in kf5/gen regression from commit be53f32655973c7a18824d5145eed992be788d2f Author: Noel Grandin <noel.gran...@collabora.co.uk> Date: Thu Mar 12 13:55:55 2020 +0200 rename vcl::Window::Update to PaintImmediately Change-Id: I74fc87e984e1f085d2351cbae033e51920608e3d Reviewed-on: https://gerrit.libreoffice.org/c/core/+/163154 Reviewed-by: Michael Weghorn <m.wegh...@posteo.de> Tested-by: Jenkins (cherry picked from commit 30fb8cde7579fb5da15c1d8da9611198f2f5ce78) Reviewed-on: https://gerrit.libreoffice.org/c/core/+/163149 Reviewed-by: Christian Lohmaier <lohmaier+libreoff...@googlemail.com> diff --git a/vcl/source/treelist/svimpbox.cxx b/vcl/source/treelist/svimpbox.cxx index 0deea8f69820..66c697e8afd8 100644 --- a/vcl/source/treelist/svimpbox.cxx +++ b/vcl/source/treelist/svimpbox.cxx @@ -387,6 +387,7 @@ void SvImpLBox::PageDown( sal_uInt16 nDelta ) ShowCursor( false ); m_nFlags &= ~LBoxFlags::Filling; + m_pView->PaintImmediately(); m_pStartEntry = pNext; if( nRealDelta >= m_nVisibleCount ) @@ -424,6 +425,7 @@ void SvImpLBox::PageUp( sal_uInt16 nDelta ) m_nFlags &= ~LBoxFlags::Filling; ShowCursor( false ); + m_pView->PaintImmediately(); m_pStartEntry = pPrev; if( nRealDelta >= m_nVisibleCount ) { commit 8ab61d432cd3232de9e1b4312ef09f4730892987 Author: Michael Stahl <michael.st...@allotropia.de> AuthorDate: Wed Feb 7 13:04:14 2024 +0100 Commit: Andras Timar <andras.ti...@collabora.com> CommitDate: Fri Feb 9 20:09:41 2024 +0100 tdf#158586 writerfilter: RTF import: fix assert on ooo113308-1.rtf warn:legacy.osl:::writerfilter/source/dmapper/DomainMapper_Impl.cxx:1278: section stack already empty DomainMapper_Impl.cxx:9817: void writerfilter::dmapper::DomainMapper_Impl::substream(): Assertion `m_aContextStack.size() == contextSize' failed. Before substream(), there is one CONTEXT_SECTION, after there is an additional CONTEXT_PARAGRPAH. The first OSL_ENSURE is because RTFDocumentImpl::tableBreak() calls endParagraphGroup() but in the substream, startParagraphGroup() hadn't been called; fixing this also makes the assert failure go away. This worked previously because sectBreak() called endParagraphGroup() after reading the header substreams, but it seems dubious that a paragraph group started in the body should be used in the substream. (regression from commit 57abad5cf990111fd7de011809d4421dc0550193) Change-Id: I98864bca03b59099c17080c0a7582de2b77d41e1 Reviewed-on: https://gerrit.libreoffice.org/c/core/+/163096 Tested-by: Jenkins Reviewed-by: Michael Stahl <michael.st...@allotropia.de> (cherry picked from commit 6446d3e12440be39e6b55f8749038061a1b240da) Reviewed-on: https://gerrit.libreoffice.org/c/core/+/163137 Reviewed-by: Christian Lohmaier <lohmaier+libreoff...@googlemail.com> diff --git a/writerfilter/source/rtftok/rtfdocumentimpl.cxx b/writerfilter/source/rtftok/rtfdocumentimpl.cxx index 48124554481d..e82674930b45 100644 --- a/writerfilter/source/rtftok/rtfdocumentimpl.cxx +++ b/writerfilter/source/rtftok/rtfdocumentimpl.cxx @@ -653,6 +653,7 @@ void RTFDocumentImpl::runBreak() void RTFDocumentImpl::tableBreak() { + checkFirstRun(); // ooo113308-1.rtf has a header at offset 151084 that doesn't startParagraphGroup() without this runBreak(); Mapper().endParagraphGroup(); Mapper().startParagraphGroup(); commit 460b950968bf6a3f6e7c79997eadb3344be13ac1 Author: Caolán McNamara <caolan.mcnam...@collabora.com> AuthorDate: Mon Jan 15 20:02:01 2024 +0000 Commit: Andras Timar <andras.ti...@collabora.com> CommitDate: Fri Feb 9 20:09:41 2024 +0100 crashtesting: still seeing occasional impl_notifyEvent_nothrow failures e.g.: #0 0x00007f5a3a5d45fc in comphelper::OInterfaceContainerHelper3<com::sun::star::document::XDocumentEventListener>::NotifySingleListener<com::sun::star::document::DocumentEvent>::operator()(com::sun::star::uno::Reference<com::sun::star::document::XDocumentEventListener> const&) const (this=this@entry=0x7f5a38ffd680, listener=empty uno::Reference) at include/comphelper/interfacecontainer3.hxx:253 #1 0x00007f5a3a5d9427 in comphelper::OInterfaceContainerHelper3<com::sun::star::document::XDocumentEventListener>::forEach<comphelper::OInterfaceContainerHelper3<com::sun::star::document::XDocumentEventListener>::NotifySingleListener<com::sun::star::document::DocumentEvent> >(comphelper::OInterfaceContainerHelper3<com::sun::star::document::XDocumentEventListener>::NotifySingleListener<com::sun::star::document::DocumentEvent> const&) (this=this@entry=0x7f5a3035ea08, func=...) at include/comphelper/interfacecontainer3.hxx:275 xListener = empty uno::Reference iter = {rCont = @0x7f5a3035ea08, maData = {m_pimpl = 0x7f5a30132260}, nRemain = 1} #2 0x00007f5a3a5d950e in comphelper::OInterfaceContainerHelper3<com::sun::star::document::XDocumentEventListener>::notifyEach<com::sun::star::document::DocumentEvent>(void (com::sun::star::document::XDocumentEventListener::*)(com::sun::star::document::DocumentEvent const&), com::sun::star::document::DocumentEvent const&) (this=this@entry=0x7f5a3035ea08, NotificationMethod=<optimized out>, Event=...) at include/comphelper/interfacecontainer3.hxx:290 #3 0x00007f5a3a5d39f9 in dbaccess::DocumentEventNotifier_Impl::impl_notifyEvent_nothrow(com::sun::star::document::DocumentEvent const&) (this=this@entry=0x7f5a3035e9c0, _rEvent=...) at dbaccess/source/core/dataaccess/documenteventnotifier.cxx:200 __func__ = "impl_notifyEvent_nothrow" #4 0x00007f5a3a5d3b83 in dbaccess::DocumentEventNotifier_Impl::processEvent(comphelper::AnyEvent const&) (this=this@entry=0x7f5a3035e9c0, _rEvent=...) at dbaccess/source/core/dataaccess/documenteventnotifier.cxx:233 rEventHolder = <optimized out> #5 0x00007f5a57cd95ba in comphelper::AsyncEventNotifierBase::execute() (this=this@entry=0x7f5a3010f670) at comphelper/source/misc/asyncnotification.cxx:139 so lets guard the OInterfaceIteratorHelper3 ctor. might as well use empty() to return early then, and align the OInterfaceIteratorHelper4 case with that. Change-Id: I138841840e032e6524792fb75168ccabc666b34c Reviewed-on: https://gerrit.libreoffice.org/c/core/+/162127 Tested-by: Jenkins Reviewed-by: Caolán McNamara <caolan.mcnam...@collabora.com> (cherry picked from commit dd8dad09097225726cbcd878d95d5bd0aacdf042) Reviewed-on: https://gerrit.libreoffice.org/c/core/+/163101 Reviewed-by: Xisco Fauli <xiscofa...@libreoffice.org> diff --git a/include/comphelper/interfacecontainer3.hxx b/include/comphelper/interfacecontainer3.hxx index 05a82212c064..be140d32289f 100644 --- a/include/comphelper/interfacecontainer3.hxx +++ b/include/comphelper/interfacecontainer3.hxx @@ -266,7 +266,11 @@ template <class T> template <typename FuncT> inline void OInterfaceContainerHelper3<T>::forEach(FuncT const& func) { + osl::ClearableMutexGuard aGuard(mrMutex); + if (std::as_const(maData)->empty()) + return; OInterfaceIteratorHelper3<T> iter(*this); + aGuard.clear(); while (iter.hasMoreElements()) { auto xListener = iter.next(); diff --git a/include/comphelper/interfacecontainer4.hxx b/include/comphelper/interfacecontainer4.hxx index a8b2bdc85505..e4a41e30675d 100644 --- a/include/comphelper/interfacecontainer4.hxx +++ b/include/comphelper/interfacecontainer4.hxx @@ -288,7 +288,7 @@ inline void OInterfaceContainerHelper4<T>::forEach(std::unique_lock<std::mutex>& FuncT const& func) const { assert(rGuard.owns_lock()); - if (std::as_const(maData)->size() == 0) + if (std::as_const(maData)->empty()) { return; } commit 627fece9522c8463c268582363cf147027009ff9 Author: Noel Grandin <noel.gran...@collabora.co.uk> AuthorDate: Wed Feb 7 14:52:05 2024 +0200 Commit: Andras Timar <andras.ti...@collabora.com> CommitDate: Fri Feb 9 20:09:41 2024 +0100 tdf#158279 TOC links lost when converting .doc to HTML regression from commit 8ce36e943f0e50970925b2dd77729ef6036b4a49 Author: Noel Grandin <noel.gran...@collabora.co.uk> Date: Sun May 26 15:15:41 2019 +0200 move some searching inside IDocumentMarkAccess where I called the wrong method from inside Writer::FindPos_Bkmk The code was then removed in commit 7bad1516c5f2a85b5bae3f49261ac2494cbb7162 Author: Noel Grandin <noel.gran...@collabora.co.uk> Date: Wed Jul 17 05:41:08 2019 +0200 loplugin:unusedmethods Change-Id: I3f1e14a1e3ae2dd134738363e6b2679d2a2f418a Reviewed-on: https://gerrit.libreoffice.org/c/core/+/163095 Tested-by: Jenkins Reviewed-by: Noel Grandin <noel.gran...@collabora.co.uk> (cherry picked from commit 0a32def8b519461b35b1e249d71ae9961b04400a) Reviewed-on: https://gerrit.libreoffice.org/c/core/+/163029 Reviewed-by: Xisco Fauli <xiscofa...@libreoffice.org> diff --git a/sw/inc/IDocumentMarkAccess.hxx b/sw/inc/IDocumentMarkAccess.hxx index d63b58f606c4..bc8f2e1c03d6 100644 --- a/sw/inc/IDocumentMarkAccess.hxx +++ b/sw/inc/IDocumentMarkAccess.hxx @@ -279,6 +279,13 @@ class IDocumentMarkAccess */ virtual const_iterator_t findMark(const OUString& rMark) const =0; + /** Find the first Mark that does not start before. + + @returns + an iterator pointing to the mark, or pointing to getAllMarksEnd() if nothing was found. + */ + virtual const_iterator_t findFirstMarkNotStartsBefore(const SwPosition& rPos) const =0; + // interface IBookmarks (BOOKMARK, CROSSREF_NUMITEM_BOOKMARK, CROSSREF_HEADING_BOOKMARK ) /** check if the selection would delete a BOOKMARK */ diff --git a/sw/source/core/doc/docbm.cxx b/sw/source/core/doc/docbm.cxx index 00681135b468..730da32625d4 100644 --- a/sw/source/core/doc/docbm.cxx +++ b/sw/source/core/doc/docbm.cxx @@ -1410,6 +1410,16 @@ namespace sw::mark return IDocumentMarkAccess::iterator(ret); } + // find the first Mark that does not start before + IDocumentMarkAccess::const_iterator_t MarkManager::findFirstMarkNotStartsBefore(const SwPosition& rPos) const + { + return std::lower_bound( + m_vAllMarks.begin(), + m_vAllMarks.end(), + rPos, + CompareIMarkStartsBefore()); + } + IDocumentMarkAccess::const_iterator_t MarkManager::getAllMarksBegin() const { return m_vAllMarks.begin(); } diff --git a/sw/source/core/inc/MarkManager.hxx b/sw/source/core/inc/MarkManager.hxx index ef0e79d74c11..dd7eb9f6f18b 100644 --- a/sw/source/core/inc/MarkManager.hxx +++ b/sw/source/core/inc/MarkManager.hxx @@ -81,6 +81,7 @@ namespace sw::mark { virtual const_iterator_t getAllMarksEnd() const override; virtual sal_Int32 getAllMarksCount() const override; virtual const_iterator_t findMark(const OUString& rName) const override; + virtual const_iterator_t findFirstMarkNotStartsBefore(const SwPosition& rPos) const override; // bookmarks virtual bool isBookmarkDeleted(SwPaM const& rPaM, bool isReplace) const override; diff --git a/sw/source/filter/writer/writer.cxx b/sw/source/filter/writer/writer.cxx index 1671f27e0b4a..f59531764e2d 100644 --- a/sw/source/filter/writer/writer.cxx +++ b/sw/source/filter/writer/writer.cxx @@ -160,9 +160,9 @@ bool Writer::CopyNextPam( SwPaM ** ppPam ) sal_Int32 Writer::FindPos_Bkmk(const SwPosition& rPos) const { const IDocumentMarkAccess* const pMarkAccess = m_pDoc->getIDocumentMarkAccess(); - const IDocumentMarkAccess::const_iterator_t ppBkmk = pMarkAccess->findFirstBookmarkStartsAfter(rPos); - if(ppBkmk != pMarkAccess->getBookmarksEnd()) - return ppBkmk - pMarkAccess->getBookmarksBegin(); + const IDocumentMarkAccess::const_iterator_t ppBkmk = pMarkAccess->findFirstMarkNotStartsBefore(rPos); + if(ppBkmk != pMarkAccess->getAllMarksEnd()) + return ppBkmk - pMarkAccess->getAllMarksBegin(); return -1; } commit 8e10eabd8f71df9bf81791b0968c043573bfd767 Author: Oliver Specht <oliver.spe...@cib.de> AuthorDate: Wed Jan 31 16:41:34 2024 +0100 Commit: Andras Timar <andras.ti...@collabora.com> CommitDate: Fri Feb 9 20:09:41 2024 +0100 tdf#159478 read field comment in default encoding If a symbol font is applied inside a field the command string was wrongly converted as symbol text. This is fixed by using a default RTL_TEXTENCODING_MS_1252 encoding. Change-Id: I11326ef3c79d6d74c720a2b4ac4987ee6716d912 Reviewed-on: https://gerrit.libreoffice.org/c/core/+/162844 Tested-by: Jenkins Tested-by: Gabor Kelemen <gabor.kelemen.ext...@allotropia.de> Reviewed-by: Thorsten Behrens <thorsten.behr...@allotropia.de> Reviewed-on: https://gerrit.libreoffice.org/c/core/+/163120 diff --git a/writerfilter/source/rtftok/rtfdocumentimpl.cxx b/writerfilter/source/rtftok/rtfdocumentimpl.cxx index 2c851b95a2fb..48124554481d 100644 --- a/writerfilter/source/rtftok/rtfdocumentimpl.cxx +++ b/writerfilter/source/rtftok/rtfdocumentimpl.cxx @@ -3805,9 +3805,11 @@ void RTFDocumentImpl::checkUnicode(bool bUnicode, bool bHex) if (bHex && !m_aHexBuffer.isEmpty()) { rtl_TextEncoding nEncoding = m_aStates.top().getCurrentEncoding(); - if ((m_aStates.top().getDestination() == Destination::FONTENTRY - || m_aStates.top().getDestination() == Destination::FIELDINSTRUCTION) - && m_aStates.top().getCurrentEncoding() == RTL_TEXTENCODING_SYMBOL) + if (nEncoding == RTL_TEXTENCODING_SYMBOL + && (m_aStates.top().getDestination() == Destination::FONTENTRY + || (m_aStates.size() > 1 + && m_aStates[m_aStates.size() - 2].getDestination() + == Destination::FIELDINSTRUCTION))) nEncoding = RTL_TEXTENCODING_MS_1252; OUString aString = OStringToOUString(m_aHexBuffer, nEncoding); m_aHexBuffer.setLength(0); commit 8d2f5359f5beed983e940f4f134dd837b416c6f2 Author: Oliver Specht <oliver.spe...@cib.de> AuthorDate: Mon Feb 5 14:26:48 2024 +0100 Commit: Andras Timar <andras.ti...@collabora.com> CommitDate: Fri Feb 9 20:09:41 2024 +0100 tdf#159572 select font according to recent settings selection of a recently inserted special character applies the stored font to make sure the character is not inserted wit a font that doesn't contain the symbol Change-Id: Id61bfac3a2ff22dbdae8a5b83f000d3f0c3e992b Reviewed-on: https://gerrit.libreoffice.org/c/core/+/163004 Tested-by: Jenkins Tested-by: Gabor Kelemen <gabor.kelemen.ext...@allotropia.de> Reviewed-by: Gabor Kelemen <gabor.kelemen.ext...@allotropia.de> Reviewed-on: https://gerrit.libreoffice.org/c/core/+/163128 Reviewed-by: Thorsten Behrens <thorsten.behr...@allotropia.de> diff --git a/cui/source/dialogs/cuicharmap.cxx b/cui/source/dialogs/cuicharmap.cxx index 03d1e8c90b53..0d0b809b0e7f 100644 --- a/cui/source/dialogs/cuicharmap.cxx +++ b/cui/source/dialogs/cuicharmap.cxx @@ -523,6 +523,7 @@ IMPL_LINK(SvxCharacterMap, CharClickHdl, SvxCharView*, rView, void) { rView->GrabFocus(); + SetCharFont(rView->GetFont()); m_aShowChar.SetText( rView->GetText() ); m_aShowChar.SetFont(rView->GetFont()); m_aShowChar.Invalidate(); commit 461142ba2f4dd5527ca97b5a3b89c62e8f6a72fd Author: Oliver Specht <oliver.spe...@cib.de> AuthorDate: Mon Feb 5 09:41:05 2024 +0100 Commit: Andras Timar <andras.ti...@collabora.com> CommitDate: Fri Feb 9 20:09:41 2024 +0100 tdf#159560 paragraph break should be shown as pilcrow sign When non-printing characters are switched on at the end of the paragraph a pilcrow sign is shown. This is displayed using the font at the end of the character. If a symbol font is used that would result in a random symbol instead of the pilcrow sign (0x00b6). This is fixed here. Change-Id: I0d4ae9f439d2e34ca774d4e2cb188e94290808a8 Reviewed-on: https://gerrit.libreoffice.org/c/core/+/162983 Tested-by: Jenkins Reviewed-by: Gabor Kelemen <gabor.kelemen.ext...@allotropia.de> Tested-by: Gabor Kelemen <gabor.kelemen.ext...@allotropia.de> (cherry picked from commit 297b47a7e0c191be22f90ab799b4b8bb8bdbaf59) Reviewed-on: https://gerrit.libreoffice.org/c/core/+/163142 Reviewed-by: Thorsten Behrens <thorsten.behr...@allotropia.de> diff --git a/sw/source/core/text/porrst.cxx b/sw/source/core/text/porrst.cxx index 029adca75336..a4a0d3c713d3 100644 --- a/sw/source/core/text/porrst.cxx +++ b/sw/source/core/text/porrst.cxx @@ -22,6 +22,7 @@ #include <editeng/escapementitem.hxx> #include <editeng/lrspitem.hxx> #include <editeng/pgrditem.hxx> +#include <editeng/fontitem.hxx> #include <vcl/svapp.hxx> #include <comphelper/scopeguard.hxx> @@ -47,6 +48,7 @@ #include <IDocumentRedlineAccess.hxx> #include <IDocumentSettingAccess.hxx> #include <IDocumentDeviceAccess.hxx> +#include <IDocumentLayoutAccess.hxx> #include <crsrsh.hxx> #include <swtypes.hxx> @@ -74,6 +76,16 @@ void SwTmpEndPortion::Paint( const SwTextPaintInfo &rInf ) const SwFont aFont(*pOldFnt); + const SwDoc& rDoc = rInf.GetTextFrame()->GetDoc(); + if (aFont.IsSymbol(rDoc.getIDocumentLayoutAccess().GetCurrentViewShell())) + { + const SvxFontItem& rFontItem = rDoc.GetDefault(RES_CHRATR_FONT); + aFont.SetName( rFontItem.GetFamilyName(), SwFontScript::Latin ); + aFont.SetStyleName( rFontItem.GetStyleName(), SwFontScript::Latin ); + aFont.SetFamily( rFontItem.GetFamily(), SwFontScript::Latin ); + aFont.SetPitch( rFontItem.GetPitch(), SwFontScript::Latin ); + aFont.SetCharSet( rFontItem.GetCharSet(), SwFontScript::Latin ); + } // Paint strikeout/underline based on redline color and settings // (with an extra pilcrow in the background, because there is // no SetStrikeoutColor(), also SetUnderColor() doesn't work()). commit d6ff51a16600af97522a9afae4fe463118653c71 Author: Oliver Specht <oliver.spe...@cib.de> AuthorDate: Wed Jan 24 14:14:20 2024 +0100 Commit: Andras Timar <andras.ti...@collabora.com> CommitDate: Fri Feb 9 20:09:40 2024 +0100 tdf#43848 fix selection in table with split/merged cells extends the selection of table cells to reach a more rectangular selection area Additionally tdf#155670 is taken care of by not showing the row selection cursor if row selection is not supported Change-Id: If31aa1030c91d81bc889d8aaa668e96c5328f03f Reviewed-on: https://gerrit.libreoffice.org/c/core/+/162508 Tested-by: Jenkins Reviewed-by: Thorsten Behrens <thorsten.behr...@allotropia.de> (cherry picked from commit aacf6f0e6059a3b24451da2782e0a0a420e89679) Reviewed-on: https://gerrit.libreoffice.org/c/core/+/163143 diff --git a/sw/source/core/frmedt/fetab.cxx b/sw/source/core/frmedt/fetab.cxx index 79f5eb6b5e58..33b9c9327b6d 100644 --- a/sw/source/core/frmedt/fetab.cxx +++ b/sw/source/core/frmedt/fetab.cxx @@ -2116,8 +2116,8 @@ SwTab SwFEShell::WhichMouseTabCol( const Point &rPt ) const { while( pFrame && pFrame->Lower() && pFrame->Lower()->IsRowFrame() ) pFrame = static_cast<const SwCellFrame*>(static_cast<const SwLayoutFrame*>(pFrame->Lower())->Lower()); - if( pFrame && pFrame->GetTabBox()->GetSttNd() && - pFrame->GetTabBox()->GetSttNd()->IsInProtectSect() ) + if( pFrame && ((pFrame->GetTabBox()->GetSttNd() && + pFrame->GetTabBox()->GetSttNd()->IsInProtectSect()) || (pFrame->GetTabBox()->getRowSpan() < 0))) pFrame = nullptr; } diff --git a/sw/source/core/table/swnewtable.cxx b/sw/source/core/table/swnewtable.cxx index 3cc2e3670711..785ef79d3b4d 100644 --- a/sw/source/core/table/swnewtable.cxx +++ b/sw/source/core/table/swnewtable.cxx @@ -1739,7 +1739,11 @@ void SwTable::CreateSelection( const SwNode* pStartNd, const SwNode* pEndNd, rBoxes.insert( pBox ); if( nFound ) { - nBottom = nRow; + //if box is hiding cells bottom needs to be moved + if (pBox->getRowSpan() > 1) + nBottom = std::max(nBottom, size_t(nRow + pBox->getRowSpan() - 1)); + else + nBottom = std::max(nRow, nBottom); lcl_CheckMinMax( nLowerMin, nLowerMax, *pLine, nCol, true ); ++nFound; break; @@ -1747,6 +1751,9 @@ void SwTable::CreateSelection( const SwNode* pStartNd, const SwNode* pEndNd, else { nTop = nRow; + //if box is hiding cells bottom needs to be moved + if (pBox->getRowSpan() > 1) + nBottom = nRow + pBox->getRowSpan() - 1; lcl_CheckMinMax( nUpperMin, nUpperMax, *pLine, nCol, true ); ++nFound; // If start and end node are identical, we're nearly done... commit 51c748f36a0598ebc5d64323af5693e80815e483 Author: Julien Nabet <serval2...@yahoo.fr> AuthorDate: Tue Feb 6 21:42:06 2024 +0100 Commit: Andras Timar <andras.ti...@collabora.com> CommitDate: Fri Feb 9 20:09:40 2024 +0100 tdf#159595: Data validation without error check allows to enter wrong data Change-Id: If5660f462a07ca571e05a44abcb0e378b6de613e Reviewed-on: https://gerrit.libreoffice.org/c/core/+/163064 Tested-by: Jenkins Reviewed-by: Julien Nabet <serval2...@yahoo.fr> (cherry picked from commit 9925937bb6b9be70befb8886ccc5665eff4ef227) Reviewed-on: https://gerrit.libreoffice.org/c/core/+/163020 Reviewed-by: Xisco Fauli <xiscofa...@libreoffice.org> diff --git a/sc/source/core/data/validat.cxx b/sc/source/core/data/validat.cxx index a46b09986b3d..5a569ef94487 100644 --- a/sc/source/core/data/validat.cxx +++ b/sc/source/core/data/validat.cxx @@ -381,6 +381,9 @@ bool ScValidationData::DoError(weld::Window* pParent, const OUString& rInput, if ( eErrorStyle == SC_VALERR_MACRO ) return DoMacro(rPos, rInput, nullptr, pParent); + if (!bShowError) + return true; + // Output error message OUString aTitle = aErrorTitle; diff --git a/sc/source/ui/app/inputhdl.cxx b/sc/source/ui/app/inputhdl.cxx index c85d57774e00..9b45a88b1d31 100644 --- a/sc/source/ui/app/inputhdl.cxx +++ b/sc/source/ui/app/inputhdl.cxx @@ -3159,7 +3159,7 @@ void ScInputHandler::EnterHandler( ScEnterMode nBlockMode, bool bBeforeSavingInL { ScDocument& rDoc = pActiveViewSh->GetViewData().GetDocument(); const ScValidationData* pData = rDoc.GetValidationEntry( nValidation ); - if (pData && pData->HasErrMsg()) + if (pData) { // #i67990# don't use pLastPattern in EnterHandler const ScPatternAttr* pPattern = rDoc.GetPattern( aCursorPos.Col(), aCursorPos.Row(), aCursorPos.Tab() ); @@ -3200,6 +3200,7 @@ void ScInputHandler::EnterHandler( ScEnterMode nBlockMode, bool bBeforeSavingInL if (pData->DoError(pActiveViewSh->GetFrameWeld(), aString, aCursorPos)) bForget = true; // Do not take over input + } } } commit 96af55c34c0ce90c05886d5a546adfff80e3725e Author: Oliver Specht <oliver.spe...@cib.de> AuthorDate: Thu Jan 18 08:48:10 2024 +0100 Commit: Andras Timar <andras.ti...@collabora.com> CommitDate: Fri Feb 9 20:09:40 2024 +0100 tdf#159254 import paper bin/paper source from rtf/docx files Imports infsxn and insxn from RTF and w:paperSrc from docx files and applies paper tray to the page style if the printer supports the imported tray value. Works only on Windows. Change-Id: Ie1170c58f7114f0dbf6bdd2721d4e077886cbe16 Reviewed-on: https://gerrit.libreoffice.org/c/core/+/162236 Tested-by: Jenkins Tested-by: Gabor Kelemen <gabor.kelemen.ext...@allotropia.de> Reviewed-by: Thorsten Behrens <thorsten.behr...@allotropia.de> Reviewed-on: https://gerrit.libreoffice.org/c/core/+/163119 diff --git a/include/vcl/print.hxx b/include/vcl/print.hxx index d6ce7728f9a6..e23cf8d0af1b 100644 --- a/include/vcl/print.hxx +++ b/include/vcl/print.hxx @@ -227,6 +227,7 @@ public: bool SetPaperBin( sal_uInt16 nPaperBin ); sal_uInt16 GetPaperBin() const; + sal_uInt16 GetPaperBinBySourceIndex(sal_uInt16 nPaperSource) const; void SetPaper( Paper ePaper ); bool SetPaperSizeUser( const Size& rSize ); /** @return The paper format of the printer's current "jobsetup". Note that if PAPER_USER the actual size can be anything. */ diff --git a/sw/inc/unoprnms.hxx b/sw/inc/unoprnms.hxx index 2c98a87dba5a..fdbc3c8f36eb 100644 --- a/sw/inc/unoprnms.hxx +++ b/sw/inc/unoprnms.hxx @@ -205,6 +205,7 @@ inline constexpr OUString UNO_NAME_POSITION_PROTECTED = u"PositionProtected"_ust inline constexpr OUString UNO_NAME_ALTERNATIVE_TEXT = u"AlternativeText"_ustr; inline constexpr OUString UNO_NAME_PRIMARY_KEY = u"PrimaryKey"_ustr; inline constexpr OUString UNO_NAME_PRINTER_PAPER_TRAY = u"PrinterPaperTray"_ustr; +inline constexpr OUString UNO_NAME_PRINTER_PAPER_TRAY_INDEX = u"PrinterPaperTrayIndex"_ustr; inline constexpr OUString UNO_NAME_RELATIVE_WIDTH = u"RelativeWidth"_ustr; inline constexpr OUString UNO_NAME_RELATIVE_WIDTH_RELATION = u"RelativeWidthRelation"_ustr; inline constexpr OUString UNO_NAME_RELATIVE_HEIGHT = u"RelativeHeight"_ustr; diff --git a/sw/source/core/unocore/unomap1.cxx b/sw/source/core/unocore/unomap1.cxx index ee4422a22e9d..12db464a874b 100644 --- a/sw/source/core/unocore/unomap1.cxx +++ b/sw/source/core/unocore/unomap1.cxx @@ -537,6 +537,7 @@ std::span<const SfxItemPropertyMapEntry> SwUnoPropertyMapProvider::GetPageStyleP { UNO_NAME_NUMBERING_TYPE, SID_ATTR_PAGE, cppu::UnoType<sal_Int16>::get(), PROPERTY_NONE , MID_PAGE_NUMTYPE }, { UNO_NAME_PAGE_STYLE_LAYOUT, SID_ATTR_PAGE, cppu::UnoType<css::style::PageStyleLayout>::get(), PROPERTY_NONE ,MID_PAGE_LAYOUT }, { UNO_NAME_PRINTER_PAPER_TRAY, RES_PAPER_BIN, cppu::UnoType<OUString>::get(), PROPERTY_NONE , 0 }, + { UNO_NAME_PRINTER_PAPER_TRAY_INDEX, RES_PAPER_BIN, cppu::UnoType<sal_Int32>::get(), PROPERTY_NONE , 0 }, // { UNO_NAME_REGISTER_MODE_ACTIVE, SID_SWREGISTER_MODE, cppu::UnoType<bool>::get(), PROPERTY_NONE , 0 }, { UNO_NAME_REGISTER_PARAGRAPH_STYLE, SID_SWREGISTER_COLLECTION, cppu::UnoType<OUString>::get(), PROPERTY_NONE , 0 }, { UNO_NAME_SIZE, SID_ATTR_PAGE_SIZE, cppu::UnoType<css::awt::Size>::get(), PROPERTY_NONE, MID_SIZE_SIZE|CONVERT_TWIPS}, diff --git a/sw/source/core/unocore/unostyle.cxx b/sw/source/core/unocore/unostyle.cxx index 94219281b562..665c1d2c6ac5 100644 --- a/sw/source/core/unocore/unostyle.cxx +++ b/sw/source/core/unocore/unostyle.cxx @@ -1669,27 +1669,37 @@ void SwXStyle::SetPropertyValue<OWN_ATTR_FILLBMP_MODE>(const SfxItemPropertyMapE template<> void SwXStyle::SetPropertyValue<sal_uInt16(RES_PAPER_BIN)>(const SfxItemPropertyMapEntry& rEntry, const SfxItemPropertySet& rPropSet, const uno::Any& rValue, SwStyleBase_Impl& o_rStyleBase) { - if(!rValue.has<OUString>()) + if (!rValue.has<OUString>() && !rValue.has<sal_Int32>()) throw lang::IllegalArgumentException(); SfxPrinter* pPrinter = m_pDoc->getIDocumentDeviceAccess().getPrinter(true); - OUString sValue(rValue.get<OUString>()); using printeridx_t = decltype(pPrinter->GetPaperBinCount()); printeridx_t nBin = std::numeric_limits<printeridx_t>::max(); - if(sValue == "[From printer settings]") - nBin = std::numeric_limits<printeridx_t>::max()-1; - else if(pPrinter) + if(rValue.has<OUString>()) { - for(sal_uInt16 i=0, nEnd = pPrinter->GetPaperBinCount(); i < nEnd; ++i) + OUString sValue(rValue.get<OUString>()); + if(sValue == "[From printer settings]") + nBin = std::numeric_limits<printeridx_t>::max()-1; + else if(pPrinter) { - if (sValue == pPrinter->GetPaperBinName(i)) + for(printeridx_t i=0, nEnd = pPrinter->GetPaperBinCount(); i < nEnd; ++i) { - nBin = i; - break; + if (sValue == pPrinter->GetPaperBinName(i)) + { + nBin = i; + break; + } } } } + else if (rValue.has<sal_Int32>() && pPrinter) + { + sal_Int32 nValue (rValue.get<sal_Int32>()); + nBin = pPrinter->GetPaperBinBySourceIndex(nValue); + } + if(nBin == std::numeric_limits<printeridx_t>::max()) throw lang::IllegalArgumentException(); + SfxItemSet& rStyleSet = o_rStyleBase.GetItemSet(); SfxItemSet aSet(*rStyleSet.GetPool(), rEntry.nWID, rEntry.nWID); aSet.SetParent(&rStyleSet); diff --git a/vcl/inc/osx/salprn.h b/vcl/inc/osx/salprn.h index 7bfd41787e99..9c26e171db23 100644 --- a/vcl/inc/osx/salprn.h +++ b/vcl/inc/osx/salprn.h @@ -82,6 +82,8 @@ class AquaSalInfoPrinter : public SalInfoPrinter virtual sal_uInt32 GetCapabilities( const ImplJobSetup* i_pSetupData, PrinterCapType i_nType ) override; virtual sal_uInt16 GetPaperBinCount( const ImplJobSetup* i_pSetupData ) override; virtual OUString GetPaperBinName( const ImplJobSetup* i_pSetupData, sal_uInt16 i_nPaperBin ) override; + virtual sal_uInt16 GetPaperBinBySourceIndex(const ImplJobSetup* pSetupData, + sal_uInt16 nPaperSource) override; virtual void InitPaperFormats( const ImplJobSetup* i_pSetupData ) override; virtual int GetLandscapeAngle( const ImplJobSetup* i_pSetupData ) override; diff --git a/vcl/inc/salprn.hxx b/vcl/inc/salprn.hxx index 97a0fe13aab2..ae0b313dab05 100644 --- a/vcl/inc/salprn.hxx +++ b/vcl/inc/salprn.hxx @@ -82,6 +82,9 @@ public: virtual sal_uInt32 GetCapabilities( const ImplJobSetup* pSetupData, PrinterCapType nType ) = 0; virtual sal_uInt16 GetPaperBinCount( const ImplJobSetup* pSetupData ) = 0; virtual OUString GetPaperBinName( const ImplJobSetup* pSetupData, sal_uInt16 nPaperBin ) = 0; + virtual sal_uInt16 GetPaperBinBySourceIndex(const ImplJobSetup* pSetupData, + sal_uInt16 nPaperSource) = 0; + // fills m_aPaperFormats and sets m_bPapersInit to true virtual void InitPaperFormats( const ImplJobSetup* pSetupData ) = 0; // returns angle that a landscape page will be turned counterclockwise wrt to portrait diff --git a/vcl/inc/unx/genprn.h b/vcl/inc/unx/genprn.h index d030c461439a..abe84b71ca21 100644 --- a/vcl/inc/unx/genprn.h +++ b/vcl/inc/unx/genprn.h @@ -45,6 +45,8 @@ public: virtual sal_uInt32 GetCapabilities( const ImplJobSetup* pSetupData, PrinterCapType nType ) override; virtual sal_uInt16 GetPaperBinCount( const ImplJobSetup* pSetupData ) override; virtual OUString GetPaperBinName( const ImplJobSetup* pSetupData, sal_uInt16 nPaperBin ) override; + virtual sal_uInt16 GetPaperBinBySourceIndex(const ImplJobSetup* pSetupData, + sal_uInt16 nPaperSource) override; virtual void InitPaperFormats( const ImplJobSetup* pSetupData ) override; virtual int GetLandscapeAngle( const ImplJobSetup* pSetupData ) override; }; diff --git a/vcl/inc/win/salprn.h b/vcl/inc/win/salprn.h index e1bbb665e29d..b0ec1697c3a5 100644 --- a/vcl/inc/win/salprn.h +++ b/vcl/inc/win/salprn.h @@ -69,6 +69,9 @@ public: virtual sal_uInt32 GetCapabilities( const ImplJobSetup* pSetupData, PrinterCapType nType ) override; virtual sal_uInt16 GetPaperBinCount( const ImplJobSetup* pSetupData ) override; virtual OUString GetPaperBinName( const ImplJobSetup* pSetupData, sal_uInt16 nPaperBin ) override; + virtual sal_uInt16 GetPaperBinBySourceIndex(const ImplJobSetup* pSetupData, + sal_uInt16 nPaperSource) override; + virtual void InitPaperFormats( const ImplJobSetup* pSetupData ) override; virtual int GetLandscapeAngle( const ImplJobSetup* pSetupData ) override; }; diff --git a/vcl/osx/salprn.cxx b/vcl/osx/salprn.cxx index 9f9c8c08f3db..3de45d9e8005 100644 --- a/vcl/osx/salprn.cxx +++ b/vcl/osx/salprn.cxx @@ -265,6 +265,11 @@ OUString AquaSalInfoPrinter::GetPaperBinName( const ImplJobSetup*, sal_uInt16 ) return OUString(); } +sal_uInt16 AquaSalInfoPrinter::GetPaperBinBySourceIndex( const ImplJobSetup*, sal_uInt16 ) +{ + return 0xffff; +} + sal_uInt32 AquaSalInfoPrinter::GetCapabilities( const ImplJobSetup*, PrinterCapType i_nType ) { switch( i_nType ) diff --git a/vcl/source/gdi/print.cxx b/vcl/source/gdi/print.cxx index eff94a9211ea..401d38118c38 100644 --- a/vcl/source/gdi/print.cxx +++ b/vcl/source/gdi/print.cxx @@ -1479,6 +1479,14 @@ OUString Printer::GetPaperBinName( sal_uInt16 nPaperBin ) const return OUString(); } +sal_uInt16 Printer::GetPaperBinBySourceIndex(sal_uInt16 nPaperSource) const +{ + if ( IsDisplayPrinter() ) + return 0; + + return mpInfoPrinter->GetPaperBinBySourceIndex( &maJobSetup.ImplGetConstData(), nPaperSource ); +} + void Printer::SetCopyCount( sal_uInt16 nCopy, bool bCollate ) { mnCopyCount = nCopy; diff --git a/vcl/unx/generic/print/genprnpsp.cxx b/vcl/unx/generic/print/genprnpsp.cxx index 33990decad1c..ce5a45624dfc 100644 --- a/vcl/unx/generic/print/genprnpsp.cxx +++ b/vcl/unx/generic/print/genprnpsp.cxx @@ -638,6 +638,11 @@ OUString PspSalInfoPrinter::GetPaperBinName( const ImplJobSetup* pJobSetup, sal_ return OUString(); } +sal_uInt16 PspSalInfoPrinter::GetPaperBinBySourceIndex( const ImplJobSetup*, sal_uInt16 ) +{ + return 0xffff; +} + sal_uInt32 PspSalInfoPrinter::GetCapabilities( const ImplJobSetup* pJobSetup, PrinterCapType nType ) { switch( nType ) diff --git a/vcl/win/gdi/salprn.cxx b/vcl/win/gdi/salprn.cxx index 3302efa2d986..065b06019635 100644 --- a/vcl/win/gdi/salprn.cxx +++ b/vcl/win/gdi/salprn.cxx @@ -1196,6 +1196,25 @@ OUString WinSalInfoPrinter::GetPaperBinName( const ImplJobSetup* pSetupData, sal return aPaperBinName; } +sal_uInt16 WinSalInfoPrinter::GetPaperBinBySourceIndex( const ImplJobSetup* pSetupData, sal_uInt16 nPaperSource ) +{ + DWORD nBins = ImplDeviceCaps( this, DC_BINNAMES, nullptr, pSetupData ); + if (nBins != GDI_ERROR) + { + auto pBuffer = std::make_unique<sal_uInt16[]>(nBins); + DWORD nBins = ImplDeviceCaps( this, DC_BINS, reinterpret_cast<BYTE*>(pBuffer.get()), pSetupData ); + if (nBins != GDI_ERROR) + { + for (DWORD nBin = 0; nBin < nBins; ++nBin) + { + if (nPaperSource == *(pBuffer.get() + nBin)) + return nBin; + } + } + } + return 0xffff; +} + sal_uInt32 WinSalInfoPrinter::GetCapabilities( const ImplJobSetup* pSetupData, PrinterCapType nType ) { DWORD nRet; diff --git a/writerfilter/source/dmapper/DomainMapper.cxx b/writerfilter/source/dmapper/DomainMapper.cxx index b9093998a4d1..7e4eeda7d3d9 100644 --- a/writerfilter/source/dmapper/DomainMapper.cxx +++ b/writerfilter/source/dmapper/DomainMapper.cxx @@ -705,6 +705,12 @@ void DomainMapper::lcl_attribute(Id nName, Value & val) case NS_ooxml::LN_CT_PageMar_gutter: m_pImpl->SetPageMarginTwip( PAGE_MAR_GUTTER, nIntValue ); break; + case NS_ooxml::LN_CT_PaperSource_first: + m_pImpl->SetPaperSource(PAPER_SOURCE_FIRST, nIntValue); + break; + case NS_ooxml::LN_CT_PaperSource_other: + m_pImpl->SetPaperSource(PAPER_SOURCE_OTHER, nIntValue); + break; case NS_ooxml::LN_CT_Language_val: //90314 case NS_ooxml::LN_CT_Language_eastAsia: //90315 case NS_ooxml::LN_CT_Language_bidi: //90316 @@ -2495,7 +2501,16 @@ void DomainMapper::sprmWithProps( Sprm& rSprm, const PropertyMapPtr& rContext ) pSectionContext->SetGutterMargin(rPageMar.gutter); } break; - + case NS_ooxml::LN_EG_SectPrContents_paperSrc: + m_pImpl->InitPaperSource(); + resolveSprmProps(*this, rSprm); + OSL_ENSURE(pSectionContext, "SectionContext unavailable!"); + if(pSectionContext) + { + const PaperSource& rPaperSource = m_pImpl->GetPaperSource(); + pSectionContext->SetPaperSource( rPaperSource.first, rPaperSource.other ); + } + break; case NS_ooxml::LN_EG_SectPrContents_cols: { writerfilter::Reference<Properties>::Pointer_t pProperties = rSprm.getProps(); diff --git a/writerfilter/source/dmapper/DomainMapper_Impl.cxx b/writerfilter/source/dmapper/DomainMapper_Impl.cxx index 4780df543d2c..4ee9f58f3e4c 100644 --- a/writerfilter/source/dmapper/DomainMapper_Impl.cxx +++ b/writerfilter/source/dmapper/DomainMapper_Impl.cxx @@ -9314,6 +9314,14 @@ void DomainMapper_Impl::SetPageMarginTwip( PageMarElement eElement, sal_Int32 nV } } +void DomainMapper_Impl::SetPaperSource(PaperSourceElement eElement, sal_Int32 nValue) +{ + if(eElement == PAPER_SOURCE_FIRST) + m_aPaperSource.first = nValue; + else + m_aPaperSource.other = nValue; +} + PageMar::PageMar() : top(ConversionHelper::convertTwipToMM100( sal_Int32(1440))) diff --git a/writerfilter/source/dmapper/DomainMapper_Impl.hxx b/writerfilter/source/dmapper/DomainMapper_Impl.hxx index 708855e41fb6..082eda8fc5c9 100644 --- a/writerfilter/source/dmapper/DomainMapper_Impl.hxx +++ b/writerfilter/source/dmapper/DomainMapper_Impl.hxx @@ -103,6 +103,23 @@ enum PageMarElement PAGE_MAR_GUTTER }; +struct PaperSource +{ + sal_Int32 first; + sal_Int32 other; + public: + PaperSource() : + first(0), + other(0) + {} +}; + +enum PaperSourceElement +{ + PAPER_SOURCE_FIRST, + PAPER_SOURCE_OTHER, +}; + /// property stack element enum ContextType { @@ -537,6 +554,7 @@ private: OUString m_sCurrentPermEdGrp; PageMar m_aPageMargins; + PaperSource m_aPaperSource; SymbolData m_aSymbolData; // TableManagers are stacked: one for each stream to avoid any confusion @@ -1029,6 +1047,10 @@ public: void SetPageMarginTwip( PageMarElement eElement, sal_Int32 nValue ); const PageMar& GetPageMargins() const {return m_aPageMargins;} + void InitPaperSource() { m_aPaperSource = PaperSource(); } + void SetPaperSource( PaperSourceElement eElement, sal_Int32 nValue ); + const PaperSource& GetPaperSource() {return m_aPaperSource;} + const LineNumberSettings& GetLineNumberSettings() const { return m_aLineNumberSettings;} void SetLineNumberSettings(const LineNumberSettings& rSet) { m_aLineNumberSettings = rSet;} diff --git a/writerfilter/source/dmapper/PropertyIds.cxx b/writerfilter/source/dmapper/PropertyIds.cxx index 01cf1203d3cb..b8b4efc06222 100644 --- a/writerfilter/source/dmapper/PropertyIds.cxx +++ b/writerfilter/source/dmapper/PropertyIds.cxx @@ -383,6 +383,7 @@ namespace { PROP_CURSOR_NOT_IGNORE_TABLES_IN_HF, u"CursorNotIgnoreTables"}, { PROP_PARA_CONNECT_BORDERS, u"ParaIsConnectBorder"}, { PROP_DECORATIVE, u"Decorative"}, + { PROP_PAPER_TRAY, u"PrinterPaperTray"}, }); } // end anonymous ns diff --git a/writerfilter/source/dmapper/PropertyIds.hxx b/writerfilter/source/dmapper/PropertyIds.hxx index 83d05d81c815..b39fcd24fa49 100644 --- a/writerfilter/source/dmapper/PropertyIds.hxx +++ b/writerfilter/source/dmapper/PropertyIds.hxx @@ -262,6 +262,7 @@ enum PropertyIds ,PROP_PARA_TOP_MARGIN ,PROP_PARA_VERT_ALIGNMENT ,PROP_PARA_WIDOWS + ,PROP_PAPER_TRAY ,PROP_PARENT_NUMBERING ,PROP_POSITION_AND_SPACE_MODE ,PROP_POSITION_PROTECTED diff --git a/writerfilter/source/dmapper/PropertyMap.cxx b/writerfilter/source/dmapper/PropertyMap.cxx index ec055c532c4d..9c3e031e40b0 100644 --- a/writerfilter/source/dmapper/PropertyMap.cxx +++ b/writerfilter/source/dmapper/PropertyMap.cxx @@ -429,6 +429,8 @@ SectionPropertyMap::SectionPropertyMap( bool bIsFirstSection ) , m_nLnc(NS_ooxml::LN_Value_ST_LineNumberRestart_newPage) , m_ndxaLnn( 0 ) , m_nLnnMin( 0 ) + , m_nPaperSourceFirst( 0 ) + , m_nPaperSourceOther( 0 ) , m_bDynamicHeightTop( true ) , m_bDynamicHeightBottom( true ) { @@ -581,6 +583,27 @@ void SectionPropertyMap::SetBorder( BorderPosition ePos, sal_Int32 nLineDistance m_bBorderShadows[ePos] = bShadow; } +void SectionPropertyMap::ApplyPaperSource(DomainMapper_Impl& rDM_Impl) +{ + uno::Reference<beans::XPropertySet> xFirst; + // todo: negative spacing (from ww8par6.cxx) + if (!m_sPageStyleName.isEmpty()) + { + xFirst = GetPageStyle(rDM_Impl); + if ( xFirst.is() ) + try + { + //TODO: which of the two tray values needs to be set? first/other - the interfaces requires the name of the tray! + xFirst->setPropertyValue(getPropertyName(PROP_PAPER_TRAY), + uno::Any(m_nPaperSourceFirst)); + } + catch (const uno::Exception&) + { + TOOLS_WARN_EXCEPTION("writerfilter", "Paper source not found"); + } + } +} + void SectionPropertyMap::ApplyBorderToPageStyles( DomainMapper_Impl& rDM_Impl, BorderApply /*eBorderApply*/, BorderOffsetFrom eOffsetFrom ) { @@ -1757,6 +1780,7 @@ void SectionPropertyMap::CloseSectionGroup( DomainMapper_Impl& rDM_Impl ) ApplyProperties_(xPageStyle); ApplyBorderToPageStyles( rDM_Impl, m_eBorderApply, m_eBorderOffsetFrom ); + ApplyPaperSource(rDM_Impl); try { diff --git a/writerfilter/source/dmapper/PropertyMap.hxx b/writerfilter/source/dmapper/PropertyMap.hxx index 192a4ac64a78..711ef47195a0 100644 --- a/writerfilter/source/dmapper/PropertyMap.hxx +++ b/writerfilter/source/dmapper/PropertyMap.hxx @@ -295,6 +295,9 @@ private: sal_Int32 m_ndxaLnn; sal_Int32 m_nLnnMin; + sal_Int32 m_nPaperSourceFirst; + sal_Int32 m_nPaperSourceOther; + bool m_bDynamicHeightTop; bool m_bDynamicHeightBottom; @@ -409,12 +412,14 @@ public: void SetdxaLnn( sal_Int32 nValue ) { m_ndxaLnn = nValue; } void SetLnnMin( sal_Int32 nValue ) { m_nLnnMin = nValue; } + void SetPaperSource(sal_Int32 first, sal_Int32 other) { m_nPaperSourceFirst = first; m_nPaperSourceOther = other;} + void addRelativeWidthShape( css::uno::Reference<css::drawing::XShape> xShape ) { m_xRelativeWidthShapes.push_back( xShape ); } // determine which style gets the borders void ApplyBorderToPageStyles( DomainMapper_Impl &rDM_Impl, BorderApply eBorderApply, BorderOffsetFrom eOffsetFrom ); - + void ApplyPaperSource(DomainMapper_Impl& rDM_Impl); void CloseSectionGroup( DomainMapper_Impl& rDM_Impl ); // Handling of margins, header and footer for any kind of sections breaks. void HandleMarginsHeaderFooter(DomainMapper_Impl& rDM_Impl); diff --git a/writerfilter/source/ooxml/model.xml b/writerfilter/source/ooxml/model.xml index fd99a745e623..2c174743f990 100644 --- a/writerfilter/source/ooxml/model.xml +++ b/writerfilter/source/ooxml/model.xml @@ -17964,6 +17964,10 @@ <attribute name="footer" tokenid="ooxml:CT_PageMar_footer"/> <attribute name="gutter" tokenid="ooxml:CT_PageMar_gutter"/> </resource> + <resource name="CT_PaperSource" resource="Properties"> + <attribute name="first" tokenid="ooxml:CT_PaperSource_first"/> + <attribute name="other" tokenid="ooxml:CT_PaperSource_other"/> + </resource> <resource name="ST_PageBorderZOrder" resource="List"> <value tokenid="ooxml:Value_doc_ST_PageBorderZOrder_front">front</value> <value tokenid="ooxml:Value_doc_ST_PageBorderZOrder_back">back</value> diff --git a/writerfilter/source/rtftok/rtfdispatchvalue.cxx b/writerfilter/source/rtftok/rtfdispatchvalue.cxx index 69157a97829f..f699b0ed39d1 100644 --- a/writerfilter/source/rtftok/rtfdispatchvalue.cxx +++ b/writerfilter/source/rtftok/rtfdispatchvalue.cxx @@ -1342,6 +1342,18 @@ RTFError RTFDocumentImpl::dispatchValue(RTFKeyword nKeyword, int nParam) NS_ooxml::LN_EG_SectPrContents_pgSz, NS_ooxml::LN_CT_PageSz_w, pIntValue); break; + case RTFKeyword::BINFSXN: + putNestedAttribute(m_aStates.top().getSectionSprms(), + NS_ooxml::LN_EG_SectPrContents_paperSrc, + NS_ooxml::LN_CT_PaperSource_first, pIntValue); + break; + case RTFKeyword::BINSXN: + { + putNestedAttribute(m_aStates.top().getSectionSprms(), + NS_ooxml::LN_EG_SectPrContents_paperSrc, + NS_ooxml::LN_CT_PaperSource_other, pIntValue); + } + break; case RTFKeyword::MARGL: putNestedAttribute(m_aDefaultState.getSectionSprms(), NS_ooxml::LN_EG_SectPrContents_pgMar, NS_ooxml::LN_CT_PageMar_left, diff --git a/writerfilter/source/rtftok/rtfdocumentimpl.cxx b/writerfilter/source/rtftok/rtfdocumentimpl.cxx index 7b6254ee0d0c..2c851b95a2fb 100644 --- a/writerfilter/source/rtftok/rtfdocumentimpl.cxx +++ b/writerfilter/source/rtftok/rtfdocumentimpl.cxx @@ -2133,6 +2133,8 @@ RTFError RTFDocumentImpl::pushState() case Destination::FIELDRESULT: case Destination::SHAPETEXT: case Destination::FORMFIELD: + //TODO: if this is pushed then the font encoding is used which results in a broken command string + // if it is not pushed to NORMAL then it is not restored in time. case Destination::FIELDINSTRUCTION: case Destination::PICT: m_aStates.top().setDestination(Destination::NORMAL); @@ -3803,7 +3805,8 @@ void RTFDocumentImpl::checkUnicode(bool bUnicode, bool bHex) if (bHex && !m_aHexBuffer.isEmpty()) { rtl_TextEncoding nEncoding = m_aStates.top().getCurrentEncoding(); - if (m_aStates.top().getDestination() == Destination::FONTENTRY + if ((m_aStates.top().getDestination() == Destination::FONTENTRY + || m_aStates.top().getDestination() == Destination::FIELDINSTRUCTION) && m_aStates.top().getCurrentEncoding() == RTL_TEXTENCODING_SYMBOL) nEncoding = RTL_TEXTENCODING_MS_1252; OUString aString = OStringToOUString(m_aHexBuffer, nEncoding); commit 7fc0e5b7f6d28aa9a4e6e7b6f836440b33a0ba89 Author: Xisco Fauli <xiscofa...@libreoffice.org> AuthorDate: Tue Feb 6 12:50:59 2024 +0100 Commit: Andras Timar <andras.ti...@collabora.com> CommitDate: Fri Feb 9 20:09:40 2024 +0100 tdf#159601, tdf#159594: reuse target for symbols' children Regression from e7186b49a9a0b24ddc3b1c5384b5d9facb03518c "tdf#158445: support viewBox in symbol elements" Change-Id: Ie2198c47149def17fa3cb612046b61bf32e873bf Reviewed-on: https://gerrit.libreoffice.org/c/core/+/163046 Tested-by: Jenkins Reviewed-by: Xisco Fauli <xiscofa...@libreoffice.org> (cherry picked from commit 8b7dbf40a06bc900562887889c17606ae5ef0587) Reviewed-on: https://gerrit.libreoffice.org/c/core/+/163015 Tested-by: Xisco Fauli <xiscofa...@libreoffice.org> diff --git a/svgio/qa/cppunit/SvgImportTest.cxx b/svgio/qa/cppunit/SvgImportTest.cxx index 51c66e52452a..9eb8b37d70ca 100644 --- a/svgio/qa/cppunit/SvgImportTest.cxx +++ b/svgio/qa/cppunit/SvgImportTest.cxx @@ -1621,9 +1621,24 @@ CPPUNIT_TEST_FIXTURE(Test, testTdf158445) CPPUNIT_ASSERT (pDocument); - assertXPath(pDocument, "/primitive2D/transform/transform/transform/transform/polypolygoncolor"_ostr, "color"_ostr, "#000000"); - assertXPath(pDocument, "/primitive2D/transform/transform/transform/transform/polypolygoncolor/polypolygon"_ostr, "height"_ostr, "8.052"); - assertXPath(pDocument, "/primitive2D/transform/transform/transform/transform/polypolygoncolor/polypolygon"_ostr, "width"_ostr, "5.328"); + assertXPath(pDocument, "/primitive2D/transform/mask/transform/transform/transform/polypolygoncolor"_ostr, "color"_ostr, "#000000"); + assertXPath(pDocument, "/primitive2D/transform/mask/transform/transform/transform/polypolygoncolor/polypolygon"_ostr, "height"_ostr, "8.052"); + assertXPath(pDocument, "/primitive2D/transform/mask/transform/transform/transform/polypolygoncolor/polypolygon"_ostr, "width"_ostr, "5.328"); +} + +CPPUNIT_TEST_FIXTURE(Test, testTdf159594) +{ + Primitive2DSequence aSequence = parseSvg(u"/svgio/qa/cppunit/data/tdf159594.svg"); + CPPUNIT_ASSERT_EQUAL(1, static_cast<int>(aSequence.getLength())); + + drawinglayer::Primitive2dXmlDump dumper; + xmlDocUniquePtr pDocument = dumper.dumpAndParse(Primitive2DContainer(aSequence)); + + CPPUNIT_ASSERT (pDocument); + + assertXPath(pDocument, "/primitive2D/transform/transform/polypolygoncolor"_ostr, "color"_ostr, "#000000"); + assertXPath(pDocument, "/primitive2D/transform/transform/polypolygoncolor/polypolygon"_ostr, "height"_ostr, "11.671875"); + assertXPath(pDocument, "/primitive2D/transform/transform/polypolygoncolor/polypolygon"_ostr, "width"_ostr, "7.5"); } CPPUNIT_TEST_FIXTURE(Test, testTdf97663) diff --git a/svgio/qa/cppunit/data/tdf159594.svg b/svgio/qa/cppunit/data/tdf159594.svg new file mode 100644 index 000000000000..c2b470ec0fdc --- /dev/null +++ b/svgio/qa/cppunit/data/tdf159594.svg @@ -0,0 +1,7 @@ +<?xml version="1.0" encoding="UTF-8"?> +<svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" viewBox="0 0 100 100" version="1.1"> +<symbol overflow="visible" id="glyph"> +<path style="stroke:none;" d="M 1.3125 -11.671875 L 8.8125 -11.671875 L 8.8125 -11 L 4.578125 0 L 2.9375 0 L 6.921875 -10.34375 L 1.3125 -10.34375 Z M 1.3125 -11.671875 "/> +</symbol> +<use xlink:href="#glyph" x="40" y="30"/> +</svg> diff --git a/svgio/source/svgreader/svgsymbolnode.cxx b/svgio/source/svgreader/svgsymbolnode.cxx index f86dd27bb3a0..2f226b841e82 100644 --- a/svgio/source/svgreader/svgsymbolnode.cxx +++ b/svgio/source/svgreader/svgsymbolnode.cxx @@ -126,12 +126,10 @@ namespace svgio::svgreader void SvgSymbolNode::decomposeSvgNode(drawinglayer::primitive2d::Primitive2DContainer& rTarget, bool bReferenced) const { - drawinglayer::primitive2d::Primitive2DContainer aNewTarget; - // decompose children - SvgNode::decomposeSvgNode(aNewTarget, bReferenced); + SvgNode::decomposeSvgNode(rTarget, bReferenced); - if(aNewTarget.empty()) + if (rTarget.empty()) return; if(getViewBox()) @@ -157,7 +155,7 @@ namespace svgio::svgreader const drawinglayer::primitive2d::Primitive2DReference xRef( new drawinglayer::primitive2d::TransformPrimitive2D( aEmbeddingTransform, - std::move(aNewTarget))); + drawinglayer::primitive2d::Primitive2DContainer(rTarget))); rTarget.push_back(xRef); } commit 177e7968711c330a5b66826e6338bc9a605eeac9 Author: Noel Grandin <noel.gran...@collabora.co.uk> AuthorDate: Tue Jan 16 11:02:46 2024 +0200 Commit: Andras Timar <andras.ti...@collabora.com> CommitDate: Fri Feb 9 20:09:40 2024 +0100 improve loplugin:cow_wrapper some stuff was hiding inside templates Change-Id: I89fd1a926dd6bf96e35a74e5028165acae51c60c Reviewed-on: https://gerrit.libreoffice.org/c/core/+/162159 Tested-by: Jenkins Reviewed-by: Noel Grandin <noel.gran...@collabora.co.uk> Reviewed-on: https://gerrit.libreoffice.org/c/core/+/163100 Reviewed-by: Caolán McNamara <caolan.mcnam...@collabora.com> diff --git a/compilerplugins/clang/cow_wrapper.cxx b/compilerplugins/clang/cow_wrapper.cxx index c98f70cbeb87..073a4fa9fb89 100644 --- a/compilerplugins/clang/cow_wrapper.cxx +++ b/compilerplugins/clang/cow_wrapper.cxx @@ -34,6 +34,8 @@ public: { } + bool shouldVisitTemplateInstantiations() const { return true; } + virtual bool preRun() override { return true; } virtual void run() override diff --git a/cppuhelper/inc/interfacecontainer4.hxx b/cppuhelper/inc/interfacecontainer4.hxx index 5111ae7e5170..bbc082cfd76e 100644 --- a/cppuhelper/inc/interfacecontainer4.hxx +++ b/cppuhelper/inc/interfacecontainer4.hxx @@ -358,7 +358,7 @@ OInterfaceContainerHelper4<ListenerT>::addInterface(std::unique_lock<std::mutex> (void)rGuard; assert(rListener.is()); maData->push_back(rListener); - return maData->size(); + return std::as_const(maData)->size(); } template <class ListenerT> @@ -382,7 +382,7 @@ sal_Int32 OInterfaceContainerHelper4<ListenerT>::removeInterface( if (it != maData->end()) maData->erase(it); - return maData->size(); + return std::as_const(maData)->size(); } template <class ListenerT> diff --git a/include/comphelper/interfacecontainer3.hxx b/include/comphelper/interfacecontainer3.hxx index 02f96658dcd2..05a82212c064 100644 --- a/include/comphelper/interfacecontainer3.hxx +++ b/include/comphelper/interfacecontainer3.hxx @@ -314,7 +314,7 @@ OInterfaceContainerHelper3<ListenerT>::addInterface(const css::uno::Reference<Li osl::MutexGuard aGuard(mrMutex); maData->push_back(rListener); - return maData->size(); + return std::as_const(maData)->size(); } template <class ListenerT> @@ -337,7 +337,7 @@ sal_Int32 OInterfaceContainerHelper3<ListenerT>::removeInterface( if (it != maData->end()) maData->erase(it); - return maData->size(); + return std::as_const(maData)->size(); } template <class ListenerT> diff --git a/include/comphelper/interfacecontainer4.hxx b/include/comphelper/interfacecontainer4.hxx index 1362ee1df741..a8b2bdc85505 100644 --- a/include/comphelper/interfacecontainer4.hxx +++ b/include/comphelper/interfacecontainer4.hxx @@ -353,7 +353,7 @@ OInterfaceContainerHelper4<ListenerT>::addInterface(std::unique_lock<std::mutex> (void)rGuard; assert(rListener.is()); maData->push_back(rListener); - return maData->size(); + return std::as_const(maData)->size(); } template <class ListenerT> @@ -377,7 +377,7 @@ sal_Int32 OInterfaceContainerHelper4<ListenerT>::removeInterface( if (it != maData->end()) maData->erase(it); - return maData->size(); + return std::as_const(maData)->size(); } template <class ListenerT> commit 30df4b8e48fa757cc0d90112743b58d6202a066b Author: Xisco Fauli <xiscofa...@libreoffice.org> AuthorDate: Thu Feb 8 14:33:28 2024 +0100 Commit: Andras Timar <andras.ti...@collabora.com> CommitDate: Fri Feb 9 20:09:40 2024 +0100 CppunitTest_sw_a11y: disable test on Win ( 24.2 only ) This test fails in tb88-win when compiling libreoffice-24-2 branch but not with master branch, so disabling it just in the affected branch. Why it fails in one branch and not in the other is a mistery Change-Id: Iec37ffe5f90689012f4fc3041075cbe0b6dbd002 Reviewed-on: https://gerrit.libreoffice.org/c/core/+/163118 Tested-by: Jenkins Reviewed-by: Xisco Fauli <xiscofa...@libreoffice.org> diff --git a/sw/qa/extras/accessibility/dialogs.cxx b/sw/qa/extras/accessibility/dialogs.cxx index a14eed6bdba3..091e6729c9f8 100644 --- a/sw/qa/extras/accessibility/dialogs.cxx +++ b/sw/qa/extras/accessibility/dialogs.cxx @@ -176,6 +176,7 @@ CPPUNIT_TEST_FIXTURE(test::SwAccessibleTestBase, BasicTestFontworkDialog) collectText()); } +#if !defined(_WIN32) CPPUNIT_TEST_FIXTURE(test::SwAccessibleTestBase, BasicTestFrameDialog) { load(u"private:factory/swriter"_ustr); @@ -193,6 +194,7 @@ CPPUNIT_TEST_FIXTURE(test::SwAccessibleTestBase, BasicTestFrameDialog) rtl::OUString("<PARAGRAPH/><TEXT_FRAME name=\"Frame1\"><PARAGRAPH/></TEXT_FRAME>"), collectText()); } +#endif //defined(_WIN32) #endif //defined(MACOSX) commit 03dc4d4450e3113c56978c87dbd2726bc8ff7c69 Author: Xisco Fauli <xiscofa...@libreoffice.org> AuthorDate: Thu Feb 8 11:54:52 2024 +0100 Commit: Andras Timar <andras.ti...@collabora.com> CommitDate: Fri Feb 9 20:09:39 2024 +0100 tdf#159637: fix position of 'Windows Share' entry Started to happen after commit b91daea3c1a38883c06cdd63c6eababe1df9e61d Author: Michael Stahl <michael.st...@allotropia.de> Date: Tue Nov 7 13:20:21 2023 +0100 tdf#146386 fpicker,svtools: remove FTP from Remote Files dialog Change-Id: I6ae78f96c1a1271de8cb2f0f114b92c3c213a068 Reviewed-on: https://gerrit.libreoffice.org/c/core/+/163115 Tested-by: Caolán McNamara <caolan.mcnam...@collabora.com> Reviewed-by: Caolán McNamara <caolan.mcnam...@collabora.com> (cherry picked from commit a381e87d16496d9fee98d9ff49fa2a38cc5c8fb2) Reviewed-on: https://gerrit.libreoffice.org/c/core/+/163140 Tested-by: Jenkins Tested-by: Xisco Fauli <xiscofa...@libreoffice.org> Reviewed-by: Xisco Fauli <xiscofa...@libreoffice.org> diff --git a/svtools/source/dialogs/PlaceEditDialog.cxx b/svtools/source/dialogs/PlaceEditDialog.cxx index 7d0c7717e2f1..a51486e408a8 100644 --- a/svtools/source/dialogs/PlaceEditDialog.cxx +++ b/svtools/source/dialogs/PlaceEditDialog.cxx @@ -222,7 +222,7 @@ void PlaceEditDialog::InitDetails( ) #if defined(_WIN32) // nPos is the position of first item that is pre-defined in svtools/uiconfig/ui/placeedit.ui, // after other CMIS types were inserted - m_xLBServerType->remove(nPos + 3); + m_xLBServerType->remove(nPos + 2); #else // Create Windows Share control std::shared_ptr<DetailsContainer> xSmbDetails(std::make_shared<SmbDetailsContainer>(this)); commit 78279d7fff2c2080a87d4da04ab2e948fc26d950 Author: Mike Kaganski <mike.kagan...@collabora.com> AuthorDate: Wed Jan 31 00:44:19 2024 +0600 Commit: Andras Timar <andras.ti...@collabora.com> CommitDate: Fri Feb 9 20:09:39 2024 +0100 tdf#159458: make sure to update unexpanded URL when renaming library 1. If passed new source URL is expanded (i.e., trying to expand it in SfxLibraryContainer::checkStorageURL didn't change it), previously aUnexpandedStorageURL was unchanged. It should be cleared - then it will be set automatically to the URL to lib info file. 2. Try to create the "variable" path (starting with "$(USER)/basic/") because this avoids absolute paths to the libraries, which make it harder to move the profile. Change-Id: Ie83ea9a32cfddf37727d238547663aeb72487ee3 Reviewed-on: https://gerrit.libreoffice.org/c/core/+/162777 Tested-by: Jenkins Reviewed-by: Mike Kaganski <mike.kagan...@collabora.com> (cherry picked from commit 907d4107896234b2e7ebfd42f40cee3bd5b1d01e) Reviewed-on: https://gerrit.libreoffice.org/c/core/+/162728 Reviewed-by: Christian Lohmaier <lohmaier+libreoff...@googlemail.com> diff --git a/basic/source/uno/namecont.cxx b/basic/source/uno/namecont.cxx index beeee133b064..eb04dd2ee767 100644 --- a/basic/source/uno/namecont.cxx +++ b/basic/source/uno/namecont.cxx @@ -537,7 +537,9 @@ void SAL_CALL SfxLibraryContainer::storeLibraries( ) } } -static void checkAndCopyFileImpl( const INetURLObject& rSourceFolderInetObj, +namespace +{ +void checkAndCopyFileImpl( const INetURLObject& rSourceFolderInetObj, const INetURLObject& rTargetFolderInetObj, std::u16string_view rCheckFileName, std::u16string_view rCheckExtension, @@ -559,12 +561,14 @@ static void checkAndCopyFileImpl( const INetURLObject& rSourceFolderInetObj, } } -static void createVariableURL( OUString& rStr, std::u16string_view rLibName, +constexpr OUString sUserBasicVariablePrefix = u"$(USER)/basic/"_ustr; + +void createVariableURL( OUString& rStr, std::u16string_view rLibName, std::u16string_view rInfoFileName, bool bUser ) { if( bUser ) { - rStr = "$(USER)/basic/"; + rStr = sUserBasicVariablePrefix; } else { @@ -572,6 +576,7 @@ static void createVariableURL( OUString& rStr, std::u16string_view rLibName, } rStr += OUString::Concat(rLibName) + "/" + rInfoFileName + ".xlb/"; } +} void SfxLibraryContainer::init( const OUString& rInitialDocumentURL, const uno::Reference< embed::XStorage >& rxInitialStorage ) { @@ -1261,6 +1266,11 @@ void SfxLibraryContainer::checkStorageURL( const OUString& aSourceURL, { aUnexpandedStorageURL = aSourceURL; } + else + { + aUnexpandedStorageURL.clear(); + } + INetURLObject aInetObj( aExpandedSourceURL ); OUString aExtension = aInetObj.getExtension(); if( aExtension == "xlb" ) @@ -2515,9 +2525,18 @@ void SAL_CALL SfxLibraryContainer::renameLibrary( const OUString& Name, const OU INetURLObject::EncodeMechanism::All ); OUString aDestDirPath = aDestInetObj.GetMainURL( INetURLObject::DecodeMechanism::NONE ); + OUString aDestDirUnexpandedPath = aDestDirPath; + if (pImplLib->maUnexpandedStorageURL.startsWith(sUserBasicVariablePrefix)) + { + // try to re-create the variable URL: helps moving the profile + OUString aUserBasicURL = expand_url(sUserBasicVariablePrefix); + if (OUString aRest; aDestDirPath.startsWith(aUserBasicURL, &aRest)) + aDestDirUnexpandedPath = sUserBasicVariablePrefix + aRest; + } + // Store new URL OUString aLibInfoFileURL = pImplLib->maLibInfoFileURL; - checkStorageURL( aDestDirPath, pImplLib->maLibInfoFileURL, pImplLib->maStorageURL, + checkStorageURL(aDestDirUnexpandedPath, pImplLib->maLibInfoFileURL, pImplLib->maStorageURL, pImplLib->maUnexpandedStorageURL ); try commit a124ea36a73f35f1ff145332b2dec2b99149cee0 Author: Andreas Heinisch <andreas.heini...@yahoo.de> AuthorDate: Tue Nov 28 18:24:52 2023 +0100 Commit: Andras Timar <andras.ti...@collabora.com> CommitDate: Fri Feb 9 20:09:39 2024 +0100 tdf#158326 - Auto Filter: separate sorting and removing of duplicates Change-Id: Ide74895508af280f4b0c129689d852635e62dbff Reviewed-on: https://gerrit.libreoffice.org/c/core/+/160052 Tested-by: Jenkins Reviewed-by: Andreas Heinisch <andreas.heini...@yahoo.de> (cherry picked from commit 6d0fddb697fd619d11da3469f4dd72782334f3bb) Reviewed-on: https://gerrit.libreoffice.org/c/core/+/162891 Reviewed-by: Xisco Fauli <xiscofa...@libreoffice.org> diff --git a/sc/inc/typedstrdata.hxx b/sc/inc/typedstrdata.hxx index b4a9bc5d37c6..b6bed2dfc249 100644 --- a/sc/inc/typedstrdata.hxx +++ b/sc/inc/typedstrdata.hxx @@ -54,11 +54,21 @@ public: bool operator() (const ScTypedStrData& left, const ScTypedStrData& right) const; }; + struct LessSortCaseSensitive + { + bool operator() (const ScTypedStrData& left, const ScTypedStrData& right) const; + }; + struct LessCaseInsensitive { bool operator() (const ScTypedStrData& left, const ScTypedStrData& right) const; }; + struct LessSortCaseInsensitive + { + bool operator() (const ScTypedStrData& left, const ScTypedStrData& right) const; + }; + struct EqualCaseSensitive { bool operator() (const ScTypedStrData& left, const ScTypedStrData& right) const; diff --git a/sc/qa/uitest/autofilter/autofilterBugs.py b/sc/qa/uitest/autofilter/autofilterBugs.py index 6fa029985fcc..849351861d7f 100644 --- a/sc/qa/uitest/autofilter/autofilterBugs.py +++ b/sc/qa/uitest/autofilter/autofilterBugs.py @@ -73,6 +73,30 @@ class autofilter(UITestCase): self.assertEqual(get_state_as_dict(xTreeList.getChild("4"))["Text"], "vröude") self.assertEqual(get_state_as_dict(xTreeList.getChild("5"))["Text"], "vröudᵉ") + def test_tdf158326(self): + with self.ui_test.create_doc_in_start_center("calc"): + calcDoc = self.xUITest.getTopFocusWindow() + xGridWindow = calcDoc.getChild("grid_window") + enter_text_to_cell(xGridWindow, "A1", "vröude") + enter_text_to_cell(xGridWindow, "A2", "vröudᵉ") + enter_text_to_cell(xGridWindow, "A3", "vröude") + enter_text_to_cell(xGridWindow, "A4", "vröudᵉ") + enter_text_to_cell(xGridWindow, "A5", "vröude") + enter_text_to_cell(xGridWindow, "A6", "vröudᵉ") + xGridWindow.executeAction("SELECT", mkPropertyValues({"RANGE": "A1:A6"})) + + with self.ui_test.execute_dialog_through_command(".uno:DataFilterAutoFilter", close_button="no"): + pass + + xGridWindow.executeAction("LAUNCH", mkPropertyValues({"AUTOFILTER": "", "COL": "0", "ROW": "0"})) + xFloatWindow = self.xUITest.getFloatWindow() + xTreeList = xFloatWindow.getChild("check_list_box") + + # Without the fix in place, there would be 5 items since they will not be removed + self.assertEqual(2, len(xTreeList.getChildren())) + self.assertEqual(get_state_as_dict(xTreeList.getChild("0"))["Text"], "vröude") + self.assertEqual(get_state_as_dict(xTreeList.getChild("1"))["Text"], "vröudᵉ") + def test_tdf94055(self): with self.ui_test.create_doc_in_start_center("calc") as document: calcDoc = self.xUITest.getTopFocusWindow() diff --git a/sc/source/core/data/documen3.cxx b/sc/source/core/data/documen3.cxx index b42a8d36b582..8ae4ff6c4e87 100644 --- a/sc/source/core/data/documen3.cxx +++ b/sc/source/core/data/documen3.cxx @@ -89,6 +89,7 @@ void sortAndRemoveDuplicates(std::vector<ScTypedStrData>& rStrings, bool bCaseSe std::vector<ScTypedStrData>::iterator it = std::unique(rStrings.begin(), rStrings.end(), ScTypedStrData::EqualCaseSensitive()); rStrings.erase(it, rStrings.end()); + std::stable_sort(rStrings.begin(), rStrings.end(), ScTypedStrData::LessSortCaseSensitive()); } else { @@ -96,6 +97,7 @@ void sortAndRemoveDuplicates(std::vector<ScTypedStrData>& rStrings, bool bCaseSe std::vector<ScTypedStrData>::iterator it = std::unique(rStrings.begin(), rStrings.end(), ScTypedStrData::EqualCaseInsensitive()); rStrings.erase(it, rStrings.end()); + std::stable_sort(rStrings.begin(), rStrings.end(), ScTypedStrData::LessSortCaseInsensitive()); } if (std::any_of(rStrings.begin(), rStrings.end(), [](ScTypedStrData& rString) { return rString.IsHiddenByFilter(); })) { diff --git a/sc/source/core/tool/typedstrdata.cxx b/sc/source/core/tool/typedstrdata.cxx index e00c1bc18d91..4e3f862ae3a4 100644 --- a/sc/source/core/tool/typedstrdata.cxx +++ b/sc/source/core/tool/typedstrdata.cxx @@ -34,8 +34,31 @@ bool ScTypedStrData::LessCaseSensitive::operator() (const ScTypedStrData& left, if (left.mbIsDate != right.mbIsDate) return left.mbIsDate < right.mbIsDate; - sal_Int32 nEqual = ScGlobal::GetCaseCollator().compareString( - left.maStrValue, right.maStrValue); + sal_Int32 nEqual + = ScGlobal::GetCaseTransliteration().compareString(left.maStrValue, right.maStrValue); + + if (!nEqual) + return left.mbIsHiddenByFilter < right.mbIsHiddenByFilter; + + return nEqual < 0; +} + +bool ScTypedStrData::LessSortCaseSensitive::operator() (const ScTypedStrData& left, const ScTypedStrData& right) const +{ + if (left.meStrType != right.meStrType) + return left.meStrType < right.meStrType; + + if (left.meStrType == Value) + { + if (left.mfValue == right.mfValue) + return left.mbIsHiddenByFilter < right.mbIsHiddenByFilter; + return left.mfValue < right.mfValue; + } + + if (left.mbIsDate != right.mbIsDate) + return left.mbIsDate < right.mbIsDate; + + sal_Int32 nEqual = ScGlobal::GetCaseCollator().compareString(left.maStrValue, right.maStrValue); if (!nEqual) return left.mbIsHiddenByFilter < right.mbIsHiddenByFilter; @@ -58,8 +81,31 @@ bool ScTypedStrData::LessCaseInsensitive::operator() (const ScTypedStrData& left if (left.mbIsDate != right.mbIsDate) return left.mbIsDate < right.mbIsDate; - sal_Int32 nEqual = ScGlobal::GetCollator().compareString( - left.maStrValue, right.maStrValue); + sal_Int32 nEqual + = ScGlobal::GetTransliteration().compareString(left.maStrValue, right.maStrValue); + + if (!nEqual) + return left.mbIsHiddenByFilter < right.mbIsHiddenByFilter; + + return nEqual < 0; +} + +bool ScTypedStrData::LessSortCaseInsensitive::operator() (const ScTypedStrData& left, const ScTypedStrData& right) const +{ + if (left.meStrType != right.meStrType) + return left.meStrType < right.meStrType; + + if (left.meStrType == Value) + { + if (left.mfValue == right.mfValue) + return left.mbIsHiddenByFilter < right.mbIsHiddenByFilter; + return left.mfValue < right.mfValue; + } + + if (left.mbIsDate != right.mbIsDate) + return left.mbIsDate < right.mbIsDate; + + sal_Int32 nEqual = ScGlobal::GetCaseCollator().compareString(left.maStrValue, right.maStrValue); if (!nEqual) return left.mbIsHiddenByFilter < right.mbIsHiddenByFilter; commit 1596153d44bfe688ba3c92d91ed84288156045ff Author: Patrick Luby <plub...@libreoffice.org> AuthorDate: Sat Jan 13 19:40:37 2024 -0500 Commit: Andras Timar <andras.ti...@collabora.com> CommitDate: Fri Feb 9 20:09:39 2024 +0100 tdf#158740 fix crash by checking the end node's index I don't know why m_nEndNode is larger than the size of the node array, but adjusting m_nEndNode to the last element in the node array stops the crashing. Change-Id: I425589457c6729b6689a7046f063154a2496e811 Reviewed-on: https://gerrit.libreoffice.org/c/core/+/162035 Tested-by: Jenkins Reviewed-by: Noel Grandin <noel.gran...@collabora.co.uk> (cherry picked from commit 9bfd8e69385930d8f558c767f7b29149324d1b70) Reviewed-on: https://gerrit.libreoffice.org/c/core/+/162211 Reviewed-by: Patrick Luby <guibomac...@gmail.com> Reviewed-by: Christian Lohmaier <lohmaier+libreoff...@googlemail.com> diff --git a/sw/source/core/undo/undel.cxx b/sw/source/core/undo/undel.cxx index 4c199c8ac321..7661b5951740 100644 --- a/sw/source/core/undo/undel.cxx +++ b/sw/source/core/undo/undel.cxx @@ -1152,14 +1152,25 @@ void SwUndoDelete::UndoImpl(::sw::UndoRedoContext & rContext) SwNode& start(*rDoc.GetNodes()[m_nSttNode + ((m_bDelFullPara || !rDoc.GetNodes()[m_nSttNode]->IsTextNode() || pInsNd) ? 0 : 1)]); - // don't include end node in the range: it may have been merged already - // by the start node, or it may be merged by one of the moved nodes, - // but if it isn't merged, its current frame(s) should be good... - SwNode& end(*rDoc.GetNodes()[ m_bDelFullPara - ? delFullParaEndNode - // tdf#147310 SwDoc::DeleteRowCol() may delete whole table - end must be node following table! - : (m_nEndNode + (rDoc.GetNodes()[m_nSttNode]->IsTableNode() && rDoc.GetNodes()[m_nEndNode]->IsEndNode() ? 1 : 0))]); - ::MakeFrames(&rDoc, start, end); + // tdf#158740 fix crash by checking the end node's index + // I don't know why m_nEndNode is larger than the size of the node + // array, but adjusting m_nEndNode to the last element in the node + // array stops the crashing. + SwNodeOffset nCount(rDoc.GetNodes().Count()); + if (nCount > SwNodeOffset(0)) + { + if (m_nEndNode > nCount - 1) + m_nEndNode = nCount - 1; + + // don't include end node in the range: it may have been merged already + // by the start node, or it may be merged by one of the moved nodes, + // but if it isn't merged, its current frame(s) should be good... + SwNode& end(*rDoc.GetNodes()[ m_bDelFullPara + ? delFullParaEndNode + // tdf#147310 SwDoc::DeleteRowCol() may delete whole table - end must be node following table! + : (m_nEndNode + (rDoc.GetNodes()[m_nSttNode]->IsTableNode() && rDoc.GetNodes()[m_nEndNode]->IsEndNode() ? 1 : 0))]); + ::MakeFrames(&rDoc, start, end); + } } if (pMovedNode) commit bfb66aba44f7420d7a21fa674dca8fbaf0a1fa44 Author: Xisco Fauli <xiscofa...@libreoffice.org> AuthorDate: Thu Feb 8 10:00:47 2024 +0100 Commit: Andras Timar <andras.ti...@collabora.com> CommitDate: Fri Feb 9 20:09:39 2024 +0100 missing dependency in CppunitTest_sw_a11y Similar to 41c9b2a81e9eb795aaecc8c52a8e7bce0a5a3c07 "missing dependency in CppunitTest_test_a11y" Change-Id: I4dc9d0a5c59dc95e68fd489b3e672ef6ed14355a Reviewed-on: https://gerrit.libreoffice.org/c/core/+/163112 Tested-by: Jenkins Reviewed-by: Xisco Fauli <xiscofa...@libreoffice.org> diff --git a/sw/CppunitTest_sw_a11y.mk b/sw/CppunitTest_sw_a11y.mk index a0d76a20d53a..f67f4cf89e01 100644 --- a/sw/CppunitTest_sw_a11y.mk +++ b/sw/CppunitTest_sw_a11y.mk @@ -17,6 +17,7 @@ $(eval $(call gb_CppunitTest_add_exception_objects,sw_a11y, \ )) $(eval $(call gb_CppunitTest_use_libraries,sw_a11y, \ + acc \ sal \ cppu \ subsequenttest \ commit b33e6e41b108af1f1ddfe0529cfc56e51a1ffe31 Author: Justin Luth <justin.l...@collabora.com> AuthorDate: Tue Feb 6 21:08:36 2024 -0500 Commit: Andras Timar <andras.ti...@collabora.com> CommitDate: Fri Feb 9 20:09:38 2024 +0100 tdf#159581 sc: fix multi-sheet ScDocRowHeightUpdater Apparently it was caching the first sheet's row height, and applying it to every other sheet. AFAICS, the only time this ever ran against multiple sheets was during import time, so that is why it wasn't easily noticed before 24.2 when XLSX started using it on import. make CppunitTest_sc_subsequent_filters_test2 \ CPPUNIT_TEST_NAME=testTdf159581_optimalRowHeight Change-Id: Ic4e4dd335fa48d02acbc85cfad35feb8eca7597b Reviewed-on: https://gerrit.libreoffice.org/c/core/+/163066 Tested-by: Jenkins Reviewed-by: Justin Luth <jl...@mail.com> (cherry picked from commit 9778d499df3d081314295ae099463870146b7a9c) Reviewed-on: https://gerrit.libreoffice.org/c/core/+/163027 diff --git a/sc/qa/unit/data/xlsx/tdf159581_optimalRowHeight.xlsx b/sc/qa/unit/data/xlsx/tdf159581_optimalRowHeight.xlsx new file mode 100644 index 000000000000..8df77208045f Binary files /dev/null and b/sc/qa/unit/data/xlsx/tdf159581_optimalRowHeight.xlsx differ diff --git a/sc/qa/unit/subsequent_filters_test2.cxx b/sc/qa/unit/subsequent_filters_test2.cxx index dd63f0b8a973..2b8ff43962bb 100644 --- a/sc/qa/unit/subsequent_filters_test2.cxx +++ b/sc/qa/unit/subsequent_filters_test2.cxx @@ -159,6 +159,17 @@ CPPUNIT_TEST_FIXTURE(ScFiltersTest2, testTdf123026_optimalRowHeight) CPPUNIT_ASSERT_GREATER(2000, nHeight); } +CPPUNIT_TEST_FIXTURE(ScFiltersTest2, testTdf159581_optimalRowHeight) +{ + createScDoc("xlsx/tdf159581_optimalRowHeight.xlsx"); + SCTAB nTab = 1; + SCROW nRow = 0; // row 1 + int nHeight = convertTwipToMm100(getScDoc()->GetRowHeight(nRow, nTab, false)); + + // Without the fix, this was 2027. It should be 450. + CPPUNIT_ASSERT_LESS(500, nHeight); +} + CPPUNIT_TEST_FIXTURE(ScFiltersTest2, testCustomNumFormatHybridCellODS) { createScDoc("ods/custom-numfmt-hybrid-cell.ods"); diff --git a/sc/source/core/data/dociter.cxx b/sc/source/core/data/dociter.cxx index b1fca78c86be..1fe1f5344d0a 100644 --- a/sc/source/core/data/dociter.cxx +++ b/sc/source/core/data/dociter.cxx @@ -1683,13 +1683,13 @@ void ScDocRowHeightUpdater::updateAll(const bool bOnlyUsedRows) ScProgress aProgress(mrDoc.GetDocumentShell(), ScResId(STR_PROGRESS_HEIGHTING), nCellCount, true); Fraction aZoom(1, 1); - sc::RowHeightContext aCxt(mrDoc.MaxRow(), mfPPTX, mfPPTY, aZoom, aZoom, mpOutDev); sal_uInt64 nProgressStart = 0; for (SCTAB nTab = 0; nTab < mrDoc.GetTableCount(); ++nTab) { if (!ValidTab(nTab) || !mrDoc.maTabs[nTab]) continue; + sc::RowHeightContext aCxt(mrDoc.MaxRow(), mfPPTX, mfPPTY, aZoom, aZoom, mpOutDev); SCCOL nEndCol = 0; SCROW nEndRow = mrDoc.MaxRow(); if (!bOnlyUsedRows || mrDoc.GetPrintArea(nTab, nEndCol, nEndRow)) commit 6a54587839a5635a60e4ed34036936e5810d923c Author: Noel Grandin <noel.gran...@collabora.co.uk> AuthorDate: Wed Feb 7 13:00:38 2024 +0200 Commit: Andras Timar <andras.ti...@collabora.com> CommitDate: Fri Feb 9 20:09:38 2024 +0100 missing dependency in CppunitTest_test_a11y found while doing other builds - if the build ordering is very unlucky, acc is not built when this runs, the dynamic load fails in the accessibility factory fails, and we fall back to using the DummyAccessibilityFactory instead of the real one and the test will crash. Change-Id: Ic16fdbe17d50c6be26b5627a4f515c91e1f7f609 Reviewed-on: https://gerrit.libreoffice.org/c/core/+/163091 Tested-by: Jenkins Reviewed-by: Noel Grandin <noel.gran...@collabora.co.uk> (cherry picked from commit 41c9b2a81e9eb795aaecc8c52a8e7bce0a5a3c07) Reviewed-on: https://gerrit.libreoffice.org/c/core/+/163026 diff --git a/test/CppunitTest_test_a11y.mk b/test/CppunitTest_test_a11y.mk index 22d1c8bc5576..212e9059785b 100644 --- a/test/CppunitTest_test_a11y.mk +++ b/test/CppunitTest_test_a11y.mk @@ -14,6 +14,7 @@ $(eval $(call gb_CppunitTest_add_exception_objects,test_a11y, \ )) $(eval $(call gb_CppunitTest_use_libraries,test_a11y, \ + acc \ sal \ cppu \ subsequenttest \