From 00df9cec579057853b781b43c336f2ec0c2a91ed Mon Sep 17 00:00:00 2001 From: Michael Weghorn Date: Thu, 5 Dec 2024 22:49:48 +0100 Subject: [PATCH 001/133] tdf#130857 qt weld: Implement QtInstanceTreeView::clear Used e.g. in RTSDevicePage::FillValueBox (i.e. in the "File" -> "Printer Settings" -> "Properties" dialog). Change-Id: Ice39b266b366a6fd6b37b6ece28cee529990dc80 Reviewed-on: https://gerrit.libreoffice.org/c/core/+/177909 Reviewed-by: Michael Weghorn Tested-by: Jenkins --- vcl/qt5/QtInstanceTreeView.cxx | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/vcl/qt5/QtInstanceTreeView.cxx b/vcl/qt5/QtInstanceTreeView.cxx index 4211307c36da..70bfd40e0ea6 100644 --- a/vcl/qt5/QtInstanceTreeView.cxx +++ b/vcl/qt5/QtInstanceTreeView.cxx @@ -613,7 +613,12 @@ int QtInstanceTreeView::get_sort_column() const void QtInstanceTreeView::set_sort_column(int) { assert(false && "Not implemented yet"); } -void QtInstanceTreeView::clear() { assert(false && "Not implemented yet"); } +void QtInstanceTreeView::clear() +{ + SolarMutexGuard g; + + GetQtInstance().RunInMainThread([&] { m_pModel->clear(); }); +} int QtInstanceTreeView::get_height_rows(int) const { From 9b2eaa37ba08b4d2c2f1c54a5fbbdaae19fbeedd Mon Sep 17 00:00:00 2001 From: Jonathan Clark Date: Thu, 5 Dec 2024 20:49:03 -0700 Subject: [PATCH 002/133] tdf#164106 Fix reordered glyph positioning with split grapheme clusters Due to formatting, grapheme clusters can possibly be split across multiple layouts. Layouts containing split grapheme clusters are created by laying out the complete string, and extracting only the necessary glyphs based on source codepoint index. This approach is good enough for most diacritic cases, but it cannot handle certain substitution cases where glyphs with advances would be interleaved with other layouts. Sub-layouts must be contiguous. This change introduces code to disable grapheme cluster splitting in these cases that cannot be handled correctly. Change-Id: I122abbf9c3f8a5efa4c72ad47991d0ad9ff8a8c0 Reviewed-on: https://gerrit.libreoffice.org/c/core/+/177927 Tested-by: Jenkins Reviewed-by: Jonathan Clark --- vcl/qa/cppunit/pdfexport/data/tdf164106.fodt | 133 +++++++++++++++++++ vcl/qa/cppunit/pdfexport/pdfexport2.cxx | 49 +++++++ vcl/source/gdi/CommonSalLayout.cxx | 84 +++++++++++- 3 files changed, 262 insertions(+), 4 deletions(-) create mode 100644 vcl/qa/cppunit/pdfexport/data/tdf164106.fodt diff --git a/vcl/qa/cppunit/pdfexport/data/tdf164106.fodt b/vcl/qa/cppunit/pdfexport/data/tdf164106.fodt new file mode 100644 index 000000000000..6d3866b43af0 --- /dev/null +++ b/vcl/qa/cppunit/pdfexport/data/tdf164106.fodt @@ -0,0 +1,133 @@ + + + 2024-11-30T17:13:03your servanten-US2024-12-05T06:45:52.6504006386PT4M37SLibreOfficeDev/25.8.0.0.alpha0$Linux_X86_64 LibreOffice_project/5f4d5a012865d717040012eb0f698a725b82d4cc15.0000 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + वीथीर्भजनमार्गान् + वीथीर्भजनमार्गान् + + + diff --git a/vcl/qa/cppunit/pdfexport/pdfexport2.cxx b/vcl/qa/cppunit/pdfexport/pdfexport2.cxx index 3e36171f4ba0..20acdc856aeb 100644 --- a/vcl/qa/cppunit/pdfexport/pdfexport2.cxx +++ b/vcl/qa/cppunit/pdfexport/pdfexport2.cxx @@ -6077,6 +6077,55 @@ CPPUNIT_TEST_FIXTURE(PdfExportTest2, testTdf162750SmallCapsLigature) CPPUNIT_ASSERT_EQUAL(u"FI"_ustr, aText.at(2).trim()); } +CPPUNIT_TEST_FIXTURE(PdfExportTest2, testTdf164106SplitReorderedClusters) +{ + saveAsPDF(u"tdf164106.fodt"); + + auto pPdfDocument = parsePDFExport(); + CPPUNIT_ASSERT_EQUAL(1, pPdfDocument->getPageCount()); + + auto pPdfPage = pPdfDocument->openPage(/*nIndex*/ 0); + CPPUNIT_ASSERT(pPdfPage); + auto pTextPage = pPdfPage->getTextPage(); + CPPUNIT_ASSERT(pTextPage); + + int nPageObjectCount = pPdfPage->getObjectCount(); + + CPPUNIT_ASSERT_EQUAL(14, nPageObjectCount); + + std::vector aText; + std::vector aRect; + + for (int i = 0; i < nPageObjectCount; ++i) + { + auto pPageObject = pPdfPage->getObject(i); + CPPUNIT_ASSERT_MESSAGE("no object", pPageObject != nullptr); + if (pPageObject->getType() == vcl::pdf::PDFPageObjectType::Text) + { + aText.push_back(pPageObject->getText(pTextPage)); + aRect.push_back(pPageObject->getBounds()); + } + } + + CPPUNIT_ASSERT_EQUAL(size_t(14), aText.size()); + + auto fnCompareIndices = [&](size_t nSplit, size_t nCombined) { + CPPUNIT_ASSERT_EQUAL(aText.at(nSplit).trim(), aText.at(nCombined).trim()); + CPPUNIT_ASSERT_DOUBLES_EQUAL(aRect.at(nSplit).getMinX(), aRect.at(nCombined).getMinX(), + /*delta*/ 0.2); + CPPUNIT_ASSERT_DOUBLES_EQUAL(aRect.at(nSplit).getMaxX(), aRect.at(nCombined).getMaxX(), + /*delta*/ 0.2); + }; + + fnCompareIndices(0, 7); + fnCompareIndices(1, 8); + fnCompareIndices(2, 9); + fnCompareIndices(3, 10); + fnCompareIndices(4, 11); + fnCompareIndices(5, 12); + fnCompareIndices(6, 13); +} + } // end anonymous namespace CPPUNIT_PLUGIN_IMPLEMENT(); diff --git a/vcl/source/gdi/CommonSalLayout.cxx b/vcl/source/gdi/CommonSalLayout.cxx index 732c799e003b..b40851a2f18c 100644 --- a/vcl/source/gdi/CommonSalLayout.cxx +++ b/vcl/source/gdi/CommonSalLayout.cxx @@ -151,6 +151,14 @@ public: return nClusterId; } + void Reset() + { + for (auto& rElement : m_aGlyphs) + { + rElement.second.m_bUsed = false; + } + } + void ShapeSubRun(const sal_Unicode* pStr, const int nLength, const SubRun& aSubRun, hb_font_t* pHbFont, const std::vector& maFeatures, hb_language_t oHbLanguage) @@ -598,6 +606,73 @@ bool GenericSalLayout::LayoutText(vcl::text::ImplLayoutArgs& rArgs, const SalLay hb_glyph_info_t *pHbGlyphInfos = hb_buffer_get_glyph_infos(pHbBuffer, nullptr); hb_glyph_position_t *pHbPositions = hb_buffer_get_glyph_positions(pHbBuffer, nullptr); + // tdf#164106: Grapheme clusters can be split across multiple layouts. To do this, + // the complete string is laid out, and only the necessary glyphs are extracted. + // These sub-layouts are positioned side-by-side to form the complete text. + // This approach is good enough for most diacritic cases, but it cannot handle cases + // where a glyph with an advance is reordered into a different sub-layout. + bool bStartClusterOutOfOrder = false; + bool bEndClusterOutOfOrder = false; + { + double nNormalAdvance = 0.0; + double nStartAdvance = 0.0; + double nEndAdvance = 0.0; + + auto fnHandleGlyph = [&](int i) + { + int32_t nGlyphIndex = pHbGlyphInfos[i].codepoint; + int32_t nCluster = pHbGlyphInfos[i].cluster; + auto nOrigCharPos = stClusterMapper.RemapGlyph(nCluster, nGlyphIndex); + + double nAdvance = 0.0; + if (aSubRun.maDirection == HB_DIRECTION_TTB) + { + nAdvance = -pHbPositions[i].y_advance; + } + else + { + nAdvance = pHbPositions[i].x_advance; + } + + nNormalAdvance += nAdvance; + + if (nOrigCharPos < rArgs.mnDrawMinCharPos) + { + nStartAdvance += nAdvance; + if (nStartAdvance != nNormalAdvance) + { + bStartClusterOutOfOrder = true; + } + } + + if (nOrigCharPos < rArgs.mnDrawEndCharPos) + { + nEndAdvance += nAdvance; + if (nEndAdvance != nNormalAdvance) + { + bEndClusterOutOfOrder = true; + } + } + }; + + if (bRightToLeft) + { + for (int i = nRunGlyphCount - 1; i >= 0; --i) + { + fnHandleGlyph(i); + } + } + else + { + for (int i = 0; i < nRunGlyphCount; ++i) + { + fnHandleGlyph(i); + } + } + + stClusterMapper.Reset(); + } + for (int i = 0; i < nRunGlyphCount; ++i) { int32_t nGlyphIndex = pHbGlyphInfos[i].codepoint; int32_t nCharPos = pHbGlyphInfos[i].cluster; @@ -740,14 +815,15 @@ bool GenericSalLayout::LayoutText(vcl::text::ImplLayoutArgs& rArgs, const SalLay const GlyphItem aGI(nCharPos, nCharCount, nGlyphIndex, aNewPos, nGlyphFlags, nAdvance, nXOffset, nYOffset, nOrigCharPos); - if (aGI.origCharPos() >= rArgs.mnDrawMinCharPos - && aGI.origCharPos() < rArgs.mnDrawEndCharPos) + auto nLowerBound = (bStartClusterOutOfOrder ? aGI.charPos() : aGI.origCharPos()); + auto nUpperBound = (bEndClusterOutOfOrder ? aGI.charPos() : aGI.origCharPos()); + if (nLowerBound >= rArgs.mnDrawMinCharPos && nUpperBound < rArgs.mnDrawEndCharPos) { m_GlyphItems.push_back(aGI); } - if (aGI.origCharPos() >= rArgs.mnDrawOriginCluster - && aGI.origCharPos() < rArgs.mnDrawEndCharPos) + if (nLowerBound >= rArgs.mnDrawOriginCluster + && nUpperBound < rArgs.mnDrawEndCharPos) { nCurrX += nAdvance; } From 50bf9a5e979c3b16c67828de43a3b62790251762 Mon Sep 17 00:00:00 2001 From: Andrea Gelmini Date: Wed, 4 Dec 2024 12:07:09 +0100 Subject: [PATCH 003/133] Fix typo Change-Id: I93f5238a1e18f9a9335e6cdafc48711eb049e8dd Reviewed-on: https://gerrit.libreoffice.org/c/core/+/177786 Tested-by: Jenkins Reviewed-by: Julien Nabet --- sd/uiconfig/simpress/ui/masterpagepanelrecent.ui | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/sd/uiconfig/simpress/ui/masterpagepanelrecent.ui b/sd/uiconfig/simpress/ui/masterpagepanelrecent.ui index 9be8d5a3ec9e..20063199c4f5 100644 --- a/sd/uiconfig/simpress/ui/masterpagepanelrecent.ui +++ b/sd/uiconfig/simpress/ui/masterpagepanelrecent.ui @@ -38,7 +38,7 @@ True - Select recenty used master slide. + Select recently used master slide. From aefc769e62e5a5cba4ba62f9a8c10e8317d2868c Mon Sep 17 00:00:00 2001 From: Christopher Sherlock Date: Sat, 30 Nov 2024 10:17:15 +1100 Subject: [PATCH 004/133] vcl: make Color parameters const in BitmapEx::createAlphaBlendFrame() Change-Id: I6d71552f4d5004477b5980fe6c8de710dd4aea9d Reviewed-on: https://gerrit.libreoffice.org/c/core/+/177565 Reviewed-by: Michael Weghorn Tested-by: Jenkins --- include/vcl/bitmapex.hxx | 12 +++---- vcl/source/bitmap/BitmapEx.cxx | 62 +++++++++++++++++----------------- 2 files changed, 37 insertions(+), 37 deletions(-) diff --git a/include/vcl/bitmapex.hxx b/include/vcl/bitmapex.hxx index ebc56930192e..bfcbaa99e234 100644 --- a/include/vcl/bitmapex.hxx +++ b/include/vcl/bitmapex.hxx @@ -483,8 +483,8 @@ private: BitmapEx VCL_DLLPUBLIC createAlphaBlendFrame( const Size& rSize, sal_uInt8 nAlpha, - Color aColorTopLeft, - Color aColorBottomRight); + const Color& rColorTopLeft, + const Color& rColorBottomRight); /** Create a blend frame as BitmapEx using an alpha value @@ -501,10 +501,10 @@ BitmapEx VCL_DLLPUBLIC createAlphaBlendFrame( BitmapEx createAlphaBlendFrame( const Size& rSize, sal_uInt8 nAlpha, - Color aColorTopLeft, - Color aColorTopRight, - Color aColorBottomRight, - Color aColorBottomLeft); + const Color& rColorTopLeft, + const Color& rColorTopRight, + const Color& rColorBottomRight, + const Color& rColorBottomLeft); #endif // INCLUDED_VCL_BITMAPEX_HXX diff --git a/vcl/source/bitmap/BitmapEx.cxx b/vcl/source/bitmap/BitmapEx.cxx index c46f1647aa39..d20954b270dc 100644 --- a/vcl/source/bitmap/BitmapEx.cxx +++ b/vcl/source/bitmap/BitmapEx.cxx @@ -1027,22 +1027,22 @@ BitmapEx BitmapEx::ModifyBitmapEx(const basegfx::BColorModifierStack& rBColorMod BitmapEx createAlphaBlendFrame( const Size& rSize, sal_uInt8 nAlpha, - Color aColorTopLeft, - Color aColorBottomRight) + const Color& rColorTopLeft, + const Color& rColorBottomRight) { const sal_uInt32 nW(rSize.Width()); const sal_uInt32 nH(rSize.Height()); if(nW || nH) { - Color aColTopRight(aColorTopLeft); - Color aColBottomLeft(aColorTopLeft); + Color aColTopRight(rColorTopLeft); + Color aColBottomLeft(rColorTopLeft); const sal_uInt32 nDE(nW + nH); - aColTopRight.Merge(aColorBottomRight, 255 - sal_uInt8((nW * 255) / nDE)); - aColBottomLeft.Merge(aColorBottomRight, 255 - sal_uInt8((nH * 255) / nDE)); + aColTopRight.Merge(rColorBottomRight, 255 - sal_uInt8((nW * 255) / nDE)); + aColBottomLeft.Merge(rColorBottomRight, 255 - sal_uInt8((nH * 255) / nDE)); - return createAlphaBlendFrame(rSize, nAlpha, aColorTopLeft, aColTopRight, aColorBottomRight, aColBottomLeft); + return createAlphaBlendFrame(rSize, nAlpha, rColorTopLeft, aColTopRight, rColorBottomRight, aColBottomLeft); } return BitmapEx(); @@ -1051,29 +1051,29 @@ BitmapEx createAlphaBlendFrame( BitmapEx createAlphaBlendFrame( const Size& rSize, sal_uInt8 nAlpha, - Color aColorTopLeft, - Color aColorTopRight, - Color aColorBottomRight, - Color aColorBottomLeft) + const Color& rColorTopLeft, + const Color& rColorTopRight, + const Color& rColorBottomRight, + const Color& rColorBottomLeft) { BlendFrameCache* pBlendFrameCache = ImplGetBlendFrameCache(); if(pBlendFrameCache->m_aLastSize == rSize && pBlendFrameCache->m_nLastAlpha == nAlpha - && pBlendFrameCache->m_aLastColorTopLeft == aColorTopLeft - && pBlendFrameCache->m_aLastColorTopRight == aColorTopRight - && pBlendFrameCache->m_aLastColorBottomRight == aColorBottomRight - && pBlendFrameCache->m_aLastColorBottomLeft == aColorBottomLeft) + && pBlendFrameCache->m_aLastColorTopLeft == rColorTopLeft + && pBlendFrameCache->m_aLastColorTopRight == rColorTopRight + && pBlendFrameCache->m_aLastColorBottomRight == rColorBottomRight + && pBlendFrameCache->m_aLastColorBottomLeft == rColorBottomLeft) { return pBlendFrameCache->m_aLastResult; } pBlendFrameCache->m_aLastSize = rSize; pBlendFrameCache->m_nLastAlpha = nAlpha; - pBlendFrameCache->m_aLastColorTopLeft = aColorTopLeft; - pBlendFrameCache->m_aLastColorTopRight = aColorTopRight; - pBlendFrameCache->m_aLastColorBottomRight = aColorBottomRight; - pBlendFrameCache->m_aLastColorBottomLeft = aColorBottomLeft; + pBlendFrameCache->m_aLastColorTopLeft = rColorTopLeft; + pBlendFrameCache->m_aLastColorTopRight = rColorTopRight; + pBlendFrameCache->m_aLastColorBottomRight = rColorBottomRight; + pBlendFrameCache->m_aLastColorBottomLeft = rColorBottomLeft; pBlendFrameCache->m_aLastResult.Clear(); const tools::Long nW(rSize.Width()); @@ -1098,15 +1098,15 @@ BitmapEx createAlphaBlendFrame( Scanline pScanAlpha = pContent->GetScanline( 0 ); // x == 0, y == 0, top-left corner - pContent->SetPixelOnData(pScanContent, 0, aColorTopLeft); + pContent->SetPixelOnData(pScanContent, 0, rColorTopLeft); pAlpha->SetPixelOnData(pScanAlpha, 0, BitmapColor(nAlpha)); // y == 0, top line left to right for(x = 1; x < nW - 1; x++) { - Color aMix(aColorTopLeft); + Color aMix(rColorTopLeft); - aMix.Merge(aColorTopRight, 255 - sal_uInt8((x * 255) / nW)); + aMix.Merge(rColorTopRight, 255 - sal_uInt8((x * 255) / nW)); pContent->SetPixelOnData(pScanContent, x, aMix); pAlpha->SetPixelOnData(pScanAlpha, x, BitmapColor(nAlpha)); } @@ -1115,7 +1115,7 @@ BitmapEx createAlphaBlendFrame( // #i123690# Caution! When nW is 1, x == nW is possible (!) if(x < nW) { - pContent->SetPixelOnData(pScanContent, x, aColorTopRight); + pContent->SetPixelOnData(pScanContent, x, rColorTopRight); pAlpha->SetPixelOnData(pScanAlpha, x, BitmapColor(nAlpha)); } @@ -1124,18 +1124,18 @@ BitmapEx createAlphaBlendFrame( { pScanContent = pContent->GetScanline( y ); pScanAlpha = pContent->GetScanline( y ); - Color aMixA(aColorTopLeft); + Color aMixA(rColorTopLeft); - aMixA.Merge(aColorBottomLeft, 255 - sal_uInt8((y * 255) / nH)); + aMixA.Merge(rColorBottomLeft, 255 - sal_uInt8((y * 255) / nH)); pContent->SetPixelOnData(pScanContent, 0, aMixA); pAlpha->SetPixelOnData(pScanAlpha, 0, BitmapColor(nAlpha)); // #i123690# Caution! When nW is 1, x == nW is possible (!) if(x < nW) { - Color aMixB(aColorTopRight); + Color aMixB(rColorTopRight); - aMixB.Merge(aColorBottomRight, 255 - sal_uInt8((y * 255) / nH)); + aMixB.Merge(rColorBottomRight, 255 - sal_uInt8((y * 255) / nH)); pContent->SetPixelOnData(pScanContent, x, aMixB); pAlpha->SetPixelOnData(pScanAlpha, x, BitmapColor(nAlpha)); } @@ -1145,15 +1145,15 @@ BitmapEx createAlphaBlendFrame( if(y < nH) { // x == 0, y == nH - 1, bottom-left corner - pContent->SetPixelOnData(pScanContent, 0, aColorBottomLeft); + pContent->SetPixelOnData(pScanContent, 0, rColorBottomLeft); pAlpha->SetPixelOnData(pScanAlpha, 0, BitmapColor(nAlpha)); // y == nH - 1, bottom line left to right for(x = 1; x < nW - 1; x++) { - Color aMix(aColorBottomLeft); + Color aMix(rColorBottomLeft); - aMix.Merge(aColorBottomRight, 255 - sal_uInt8(((x - 0)* 255) / nW)); + aMix.Merge(rColorBottomRight, 255 - sal_uInt8(((x - 0)* 255) / nW)); pContent->SetPixelOnData(pScanContent, x, aMix); pAlpha->SetPixelOnData(pScanAlpha, x, BitmapColor(nAlpha)); } @@ -1162,7 +1162,7 @@ BitmapEx createAlphaBlendFrame( // #i123690# Caution! When nW is 1, x == nW is possible (!) if(x < nW) { - pContent->SetPixelOnData(pScanContent, x, aColorBottomRight); + pContent->SetPixelOnData(pScanContent, x, rColorBottomRight); pAlpha->SetPixelOnData(pScanAlpha, x, BitmapColor(nAlpha)); } } From 5950fe86b84bb062e88034e382fc5df90bb1e98c Mon Sep 17 00:00:00 2001 From: Mike Kaganski Date: Fri, 6 Dec 2024 13:49:39 +0500 Subject: [PATCH 005/133] tdf#164213: don't activate OLE objects in read-only mode Similar to the check done in SwEditWin::MouseButtonDown. Change-Id: I1a1b8966502a6b1557d424f28cfc1c1ecdf4b65e Reviewed-on: https://gerrit.libreoffice.org/c/core/+/177930 Tested-by: Jenkins Reviewed-by: Mike Kaganski --- sd/source/ui/func/fudraw.cxx | 6 ++++-- sd/source/ui/func/fupoor.cxx | 2 +- 2 files changed, 5 insertions(+), 3 deletions(-) diff --git a/sd/source/ui/func/fudraw.cxx b/sd/source/ui/func/fudraw.cxx index d40f325f2392..28e1bf7e96f3 100644 --- a/sd/source/ui/func/fudraw.cxx +++ b/sd/source/ui/func/fudraw.cxx @@ -640,7 +640,8 @@ void FuDraw::DoubleClick(const MouseEvent& rMEvt) SdrInventor nInv = pObj->GetObjInventor(); SdrObjKind nSdrObjKind = pObj->GetObjIdentifier(); - if (nInv == SdrInventor::Default && nSdrObjKind == SdrObjKind::OLE2) + if (nInv == SdrInventor::Default && nSdrObjKind == SdrObjKind::OLE2 + && !mpDocSh->IsReadOnly()) { // activate OLE-object SfxInt16Item aItem(SID_OBJECT, 0); @@ -649,7 +650,8 @@ void FuDraw::DoubleClick(const MouseEvent& rMEvt) SfxCallMode::ASYNCHRON | SfxCallMode::RECORD, { &aItem }); } - else if (nInv == SdrInventor::Default && nSdrObjKind == SdrObjKind::Graphic && pObj->IsEmptyPresObj() ) + else if (nInv == SdrInventor::Default && nSdrObjKind == SdrObjKind::Graphic + && pObj->IsEmptyPresObj() && !mpDocSh->IsReadOnly()) { mpViewShell->GetViewFrame()-> GetDispatcher()->Execute( SID_INSERT_GRAPHIC, diff --git a/sd/source/ui/func/fupoor.cxx b/sd/source/ui/func/fupoor.cxx index 2a1c9023015b..5d952d1e4a40 100644 --- a/sd/source/ui/func/fupoor.cxx +++ b/sd/source/ui/func/fupoor.cxx @@ -232,7 +232,7 @@ bool FuPoor::KeyInput(const KeyEvent& rKEvt) bReturn = true; } } - else + else if (!mpDocSh->IsReadOnly()) { // activate OLE object on RETURN for selected object // activate text edit on RETURN for selected object From e7268b7d9e4ee79785116d1d80942cec8f035aae Mon Sep 17 00:00:00 2001 From: Noel Grandin Date: Fri, 6 Dec 2024 10:07:34 +0200 Subject: [PATCH 006/133] tdf#119840 small tweaks Change-Id: Ie2c7a9633ee62bc1c4c0ad821d5ff1ace71fc15d Reviewed-on: https://gerrit.libreoffice.org/c/core/+/177928 Reviewed-by: Noel Grandin Tested-by: Jenkins --- sw/source/core/fields/reffld.cxx | 9 +++++---- sw/source/core/layout/pagechg.cxx | 6 ++++-- 2 files changed, 9 insertions(+), 6 deletions(-) diff --git a/sw/source/core/fields/reffld.cxx b/sw/source/core/fields/reffld.cxx index 99ef95713e1a..56b819c3d8dc 100644 --- a/sw/source/core/fields/reffld.cxx +++ b/sw/source/core/fields/reffld.cxx @@ -1217,16 +1217,17 @@ namespace sal_Int32 *const pStart, sal_Int32 *const pEnd, bool bCaseSensitive = true) { - if (*pCurrent == *pSelf) + if (pCurrent == pSelf) return nullptr; SwTextNode* pTextNode = pCurrent->GetTextNode(); if (!pTextNode) return nullptr; + auto const & rFormatName = pTextNode->GetFormatColl()->GetName(); if (bCaseSensitive - ? pTextNode->GetFormatColl()->GetName() == rStyleName - : pTextNode->GetFormatColl()->GetName().equalsIgnoreAsciiCase(rStyleName)) + ? rFormatName == rStyleName + : rFormatName.equalsIgnoreAsciiCase(rStyleName)) { *pStart = 0; if (pEnd) @@ -1238,7 +1239,7 @@ namespace if (auto const pHints = pTextNode->GetpSwpHints()) { - for (size_t i = 0; i < pHints->Count(); ++i) + for (size_t i = 0, nCnt = pHints->Count(); i < nCnt; ++i) { auto const*const pHint(pHints->Get(i)); if (pHint->Which() == RES_TXTATR_CHARFMT) diff --git a/sw/source/core/layout/pagechg.cxx b/sw/source/core/layout/pagechg.cxx index 1c5d112dec72..ab18682e528d 100644 --- a/sw/source/core/layout/pagechg.cxx +++ b/sw/source/core/layout/pagechg.cxx @@ -410,12 +410,14 @@ static void lcl_FormatLay( SwLayoutFrame *pLay ) static void lcl_MakeObjs(const sw::FrameFormats& rSpzs, SwPageFrame* pPage) { // formats are in the special table of the document + const sal_uInt16 nPhyPageNum = pPage->GetPhyPageNum(); size_t i = 0; - while (i < rSpzs.size()) + const size_t nSpzsCnt = rSpzs.size(); + while (i < nSpzsCnt) { auto pSpz = rSpzs[i]; const SwFormatAnchor &rAnch = pSpz->GetAnchor(); - if ( rAnch.GetPageNum() == pPage->GetPhyPageNum() ) + if ( rAnch.GetPageNum() == nPhyPageNum ) { if( rAnch.GetAnchorNode() ) { From 31d0c99c31be9a83cb8dae9c7555f27083b3320c Mon Sep 17 00:00:00 2001 From: Noel Grandin Date: Fri, 6 Dec 2024 11:24:41 +0200 Subject: [PATCH 007/133] add assert in SwNodes::ForEach to catch any dodgy code Change-Id: Iffd0612b28871c864f103634a40d13b82160d1ce Reviewed-on: https://gerrit.libreoffice.org/c/core/+/177955 Reviewed-by: Noel Grandin Tested-by: Jenkins --- sw/source/core/docnode/nodes.cxx | 1 + 1 file changed, 1 insertion(+) diff --git a/sw/source/core/docnode/nodes.cxx b/sw/source/core/docnode/nodes.cxx index e11ee0ce49d8..c74731f48927 100644 --- a/sw/source/core/docnode/nodes.cxx +++ b/sw/source/core/docnode/nodes.cxx @@ -2275,6 +2275,7 @@ SwNode* SwNodes::FindPrvNxtFrameNode( const SwNode& rFrameNd, void SwNodes::ForEach( SwNodeOffset nStart, SwNodeOffset nEnd, FnForEach_SwNodes fn, void* pArgs ) { + assert( nEnd <= SwNodeOffset(m_nSize) ); if( nEnd > SwNodeOffset(m_nSize) ) nEnd = SwNodeOffset(m_nSize); From 42f8227fdd3a0bb92a5eb50fd580e76d7d35fcb0 Mon Sep 17 00:00:00 2001 From: Michael Weghorn Date: Thu, 5 Dec 2024 23:46:35 +0100 Subject: [PATCH 008/133] tdf#130857 qt weld: Return selected item when requested in callback The current item and the selected item(s) are not necessarily the same. Looking into the gtk and VCL implementations, weld::TreeView::signal_changed is called when the selection (not the current item) changes, so connect to the QItemSelectionModel::selectionChanged signal instead of the QItemSelectionModel::currentChanged one in the Qt implementation. At the point in time that the QItemSelectionModel::selectionChanged signal gets emitted, QItemSelectionModel::selectedIndexes returns the newly selected indices while that was not yet the case with QItemSelectionModel::currentChanged. For the "Device" tab in the "File" -> "Printer Settings" -> "Properties" dialog (for which support will be added in an upcoming commit), this resulted in the PPD values (in the tree view on the right) not being shown for the actually selected PPD option/key (in the left tree view), but for the one selected previously. (See RTSDevicePage::SelectHdl for the logic filling the tree view with items, which gets triggered when weld::TreeView::signal_changed gets called.) Change-Id: I31ec5aaaa47cd3d4704f25086b24645fb708be0a Reviewed-on: https://gerrit.libreoffice.org/c/core/+/177922 Reviewed-by: Michael Weghorn Tested-by: Jenkins --- vcl/inc/qt5/QtInstanceTreeView.hxx | 2 +- vcl/qt5/QtInstanceTreeView.cxx | 6 +++--- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/vcl/inc/qt5/QtInstanceTreeView.hxx b/vcl/inc/qt5/QtInstanceTreeView.hxx index dd252c3e2b47..15fab0ff0792 100644 --- a/vcl/inc/qt5/QtInstanceTreeView.hxx +++ b/vcl/inc/qt5/QtInstanceTreeView.hxx @@ -189,7 +189,7 @@ private: private Q_SLOTS: void handleActivated(); - void handleCurrentChanged(); + void handleSelectionChanged(); }; /* vim:set shiftwidth=4 softtabstop=4 expandtab cinoptions=b1,g0,N-s cinkeys+=0=break: */ diff --git a/vcl/qt5/QtInstanceTreeView.cxx b/vcl/qt5/QtInstanceTreeView.cxx index 70bfd40e0ea6..e72826ce8734 100644 --- a/vcl/qt5/QtInstanceTreeView.cxx +++ b/vcl/qt5/QtInstanceTreeView.cxx @@ -28,8 +28,8 @@ QtInstanceTreeView::QtInstanceTreeView(QTreeView* pTreeView) assert(m_pSelectionModel); connect(m_pTreeView, &QTreeView::activated, this, &QtInstanceTreeView::handleActivated); - connect(m_pSelectionModel, &QItemSelectionModel::currentChanged, this, - &QtInstanceTreeView::handleCurrentChanged); + connect(m_pSelectionModel, &QItemSelectionModel::selectionChanged, this, + &QtInstanceTreeView::handleSelectionChanged); } void QtInstanceTreeView::insert(const weld::TreeIter* pParent, int pos, const OUString* pStr, @@ -737,7 +737,7 @@ void QtInstanceTreeView::handleActivated() signal_row_activated(); } -void QtInstanceTreeView::handleCurrentChanged() +void QtInstanceTreeView::handleSelectionChanged() { SolarMutexGuard g; signal_changed(); From 26b24e181c7e924a4f0521a875cf38bbc7b70871 Mon Sep 17 00:00:00 2001 From: Michael Weghorn Date: Thu, 5 Dec 2024 23:59:28 +0100 Subject: [PATCH 009/133] tdf#130857 qt weld: Support printer properties dialog Declare support for the "Insert Breaks" "File" -> Printer Settings" -> "Properties" dialog. This means that native Qt widgets are used for that dialog now when using the qt5 or qt6 VCL plugin and starting LO with environment variable SAL_VCL_QT_USE_WELDED_WIDGETS=1 set. Since this dialog contains tab pages, their .ui files need to be declared as supported as well. Change-Id: Ia4360eebf3fed6ab5f78510c866a1703b0db8998 Reviewed-on: https://gerrit.libreoffice.org/c/core/+/177923 Tested-by: Jenkins Reviewed-by: Michael Weghorn --- vcl/qt5/QtInstanceBuilder.cxx | 3 +++ 1 file changed, 3 insertions(+) diff --git a/vcl/qt5/QtInstanceBuilder.cxx b/vcl/qt5/QtInstanceBuilder.cxx index 453258b26aa6..03b7d15701fe 100644 --- a/vcl/qt5/QtInstanceBuilder.cxx +++ b/vcl/qt5/QtInstanceBuilder.cxx @@ -81,6 +81,9 @@ bool QtInstanceBuilder::IsUIFileSupported(const OUString& rUIFile) u"svx/ui/gotopagedialog.ui"_ustr, u"svx/ui/safemodedialog.ui"_ustr, u"vcl/ui/openlockedquerybox.ui"_ustr, + u"vcl/ui/printerdevicepage.ui"_ustr, + u"vcl/ui/printerpaperpage.ui"_ustr, + u"vcl/ui/printerpropertiesdialog.ui"_ustr, u"vcl/ui/printprogressdialog.ui"_ustr, u"writerperfect/ui/exportepub.ui"_ustr, }; From 0a7b9ba8a49fe9f7ec9964864298f1994e81ff79 Mon Sep 17 00:00:00 2001 From: Bogdan Buzea Date: Thu, 31 Oct 2024 21:22:46 +0200 Subject: [PATCH 010/133] tdf#163486: PVS: The 'eAggFunc' variable was assigned the same value V1048 The 'eAggFunc' variable was assigned the same value. Will be assigned after the switch. Change-Id: I21d4cb4b0e7427bea56598476ca176cc0a4f7124 Reviewed-on: https://gerrit.libreoffice.org/c/core/+/175902 Reviewed-by: Eike Rathke Tested-by: Jenkins --- sc/source/filter/oox/pivottablebuffer.cxx | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/sc/source/filter/oox/pivottablebuffer.cxx b/sc/source/filter/oox/pivottablebuffer.cxx index f128e27afd0e..b71652baadc2 100644 --- a/sc/source/filter/oox/pivottablebuffer.cxx +++ b/sc/source/filter/oox/pivottablebuffer.cxx @@ -608,7 +608,7 @@ void PivotTableField::convertDataField( const PTDataFieldModel& rDataField ) means 'count all', and 'countNum' means 'count numbers'. On the other hand, for subtotals, 'countA' means 'count all', and 'count' means 'count numbers' (see above). */ - GeneralFunction eAggFunc = GeneralFunction_SUM; + GeneralFunction eAggFunc; switch( rDataField.mnSubtotal ) { case XML_sum: eAggFunc = GeneralFunction_SUM; break; @@ -622,7 +622,10 @@ void PivotTableField::convertDataField( const PTDataFieldModel& rDataField ) case XML_stdDevp: eAggFunc = GeneralFunction_STDEVP; break; case XML_var: eAggFunc = GeneralFunction_VAR; break; case XML_varp: eAggFunc = GeneralFunction_VARP; break; - default: OSL_FAIL( "PivotTableField::convertDataField - unknown aggregation function" ); + default: + OSL_FAIL( "PivotTableField::convertDataField - unknown aggregation function" ); + eAggFunc = GeneralFunction_SUM; + break; } aPropSet.setProperty( PROP_Function, eAggFunc ); From 418a55e0dcb5e99e5972cebd63ffe4f961f9f0ac Mon Sep 17 00:00:00 2001 From: dtm Date: Wed, 6 Dec 2023 14:31:55 +0000 Subject: [PATCH 011/133] tdf#157794 refactor Complex to use std::complex where possible Change-Id: Ie583399977caf266e3cc0a3cb78462be4cd63151 Reviewed-on: https://gerrit.libreoffice.org/c/core/+/160394 Tested-by: Jenkins Reviewed-by: Eike Rathke --- .../data/functions/addin/fods/imcsch.fods | 5856 ++++++++--------- .../data/functions/addin/fods/impower.fods | 5436 ++++++++------- .../data/functions/addin/fods/imsech.fods | 5782 ++++++++-------- scaddins/source/analysis/analysishelper.cxx | 274 +- scaddins/source/analysis/analysishelper.hxx | 31 +- 5 files changed, 8355 insertions(+), 9024 deletions(-) diff --git a/sc/qa/unit/data/functions/addin/fods/imcsch.fods b/sc/qa/unit/data/functions/addin/fods/imcsch.fods index 710ef1f4d275..1960d9c2c099 100644 --- a/sc/qa/unit/data/functions/addin/fods/imcsch.fods +++ b/sc/qa/unit/data/functions/addin/fods/imcsch.fods @@ -1,280 +1,436 @@ - + + 0P0DLibreOfficeDev/24.8.0.0.alpha1$Linux_X86_64 LibreOffice_project/681b3840a043dba2c5afad4c7c0b613cec6a9391 + + + 0 + 0 + 22010 + 5214 + + + view1 + + + 0 + 0 + 2 + 0 + 0 + 0 + 0 + 0 + 100 + 60 + true + false + false + false + false + + + 0 + 20 + 2 + 0 + 0 + 0 + 0 + 0 + 100 + 60 + true + false + false + false + false + + + Sheet2 + 1847 + 0 + 100 + 60 + false + true + true + true + false + true + 12632256 + 1 + true + true + true + false + false + false + 1270 + 1270 + 1 + 1 + true + false + false + false + false + + + + + true + false + true + 0 + true + true + false + true + false + 12632256 + true + true + 0 + false + false + true + true + false + 3 + false + Generic Printer + false + tAH+/0dlbmVyaWMgUHJpbnRlcgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAU0dFTlBSVAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAWAAMAoAAAAAAAAAAEAAhSAAAEdAAASm9iRGF0YSAxCnByaW50ZXI9R2VuZXJpYyBQcmludGVyCm9yaWVudGF0aW9uPVBvcnRyYWl0CmNvcGllcz0xCmNvbGxhdGU9ZmFsc2UKbWFyZ2luYWRqdXN0bWVudD0wLDAsJzAsMApjb2xvcmRlcHRoPTI0CmNvbG9yZGV2aWNlPTAKUFBEQ29udGV4dERhdGEKUGFnZVNpemU6QTQAABIAQ09NUEFUX0RVUExFWF9NT0RFDwBEdXBsZXhNb2RlOjpPZmYMAFBSSU5URVJfTkFNRQ8AR2VuZXJpYyBQcmludGVyCwBEUklWRVJfTkFNRQcAU0dFTlBSVA== + false + 1270 + 1270 + 1 + 1 + true + false + false + true + true + true + true + true + 7 + true + + + Sheet1 + + + Sheet2 + + + + + + + + + + + + + + + + + + + + + + - - + + + + + + + + + + + + + + - - - - - - - - - - - - - - - - - - - - - - ( - - ) - - - - - - - - - - - - - - - - - - - - - - + + - - + - - + + + - - - + + + + ( + + ) + + + - - + - - - - - + + + - - - - - - - - - - - - - - - - - - - - - - - - - - - £ - - - - - - £ - - - + + + + + + + + + + - £ - + + + - - £ - + + + - £ - + + + - - - £ - + + + - £ - + + + - - £ - + + + - £ - + + + - - £ - + + + - - - - - - ( - - ) - - - - - - - - ( - - ) - - - + £ - - + - + - £ - - + + + + + £ + + + + - + £ + + + + + £ + + + + + - + £ + + + + + £ + + + + + - + £ + £ - - + + - £ - - + - - + + + - + ( + + ) + - - + + + - - - - - - - - - - - - - + ( + + ) + + + £ + + + + + - + £ + + + + + + £ + + + + + - + £ + + + + - + - + - + - + - + - + - + - + - - + + + + + + + + + + + + + + + + + + + + + + + + + + - + - - + - + - + - + - - + - + - + @@ -283,7 +439,7 @@ / - + @@ -292,155 +448,109 @@ / - + - + - + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + - - - - - - - - - - + - + + - - - + + + + + + + + + - + + + + + + + + + + - + + + + - - - + + - - - - - - + + + - + + + - - - - + + + + + - + + + + + + + + + - + + + + + + + + - + + - - - - - - - - - - + - - - - - - + + + - + + - - - - Kč - - - - - - - - - - + + - - - - + - + + - - - - - + + - @@ -450,21 +560,19 @@ - - + + - - - - + - + + - - - - - + + - Kč @@ -473,200 +581,208 @@ - + + + + + + + - + + + + + + + - + + + + + + + + + + + + + + + + + - + + + + + + + - + + + + + + + + + + + : - + : : - + : - - + + - + Yes - + Yes - + No - - + + - + True - + True - + False - - + + - + On - + On - + Off - - + + - + ¥€ - + - + ( - + ) - + - - + + - + - - + - + - + $ - + - + ($ - + ) - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + - - + + - + - - - + + + - - - + + + + + + + - + + + + + + + + + + + + + + - + + + - - - - - - - - - + + - + + - - - + + + - - - € - - - - - - - - - + - - + - - - - + - @@ -676,18 +792,16 @@ - + - - + - - - - + - € @@ -696,109 +810,99 @@ - - - - - $ - - - - - ($ - - ) - - + + + + + - + + + + + - + + + + + + + + + + + + + + + + - + + + + + - + + + + + + + + + + + + + + $ - + - + + ($ + + ) + + + + $ + + + + ($ - + ) - + - - $ - - - - - ($ - - ) - - - - - - - - - - ( - - ) - - - - - - - - - - - - - - $ - - + $ + - - $ - - ( - + + ($ + ) + - - $ - - - - - - - - - - - - $ - - + + - $ - + ( - + ) - $ - - - - - + + - @@ -807,149 +911,128 @@ - + + $ + + + + + + $ + + ( + + ) + + + $ + + - + + + + + + + + + + $ + + + + + + $ + + ( + + ) + + + $ + + - + + + + + + + + + + + - + - + ( - + ) - + - - \ - - - - \- - - - - - \ - - - - - \- - - - - - \ - - - - \- - - - - - \ - - - - - \- - - - - \ - - - + \ + - - \ - - - - - + + \- + + - - \ - - - + + \ + - - - - - - - - - - - + + + \- + + - - - - - - + + \ + - - - - + + \- + + - - - - - - - - - \ - - - + + \ + - - \ - - - - - + + + \- + + - - \ - - - - - - - - - - - - - - - + \ + + - + \ + - - + - - - - - + \ + + - @@ -959,575 +1042,602 @@ - - + + + - + + - - - - + + - - - - - - - - - - - - - - - - - - - - - - + + + - + + + + + + + - - + \ + + + - - + + \ + - - - - + + - - + + \ + + - + + + + + + + + + + + + + + + + + + - + + + + + + - + + + + + + + + + + + + + + + + - + + + + + + + + + - + + + + + + + + + + - + + + + + + + + + + + - + + + + + + + + $ - + - + $( - + ) - + $- - + - - - + + + - - + + - + ( - + ) - + - - + - - - + + + - + $ - + - + $( - + ) - + $- - + - + - - - + + + - - + + - + ( - + ) - + - - + - + - - - + + + - - - % - - - - % - - - - % - - - - % - - - - % - - - - % - - - - % - - - - % - - + % - + + % + + + + % + + + + % + + + + % + + + + % + + + + % + + + + % + + + + % + + + % - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + - - + - + - - + - + - - + - + - - + - + - - + - + - - + - + - - + - + - - + - + - - + - + - - + - + - - + - - - - - - % - - - - % - - - - % - - - - % - - - - % - - - - % - - - - - - $ - + + + + - + - ( - $ - - ) - + - + + + + - - + + + + + + + + - + + + + + + + + + + + + + - + + + + + + + + + + + + + - + + + + + + + + + + % - - + + + % + + + % + + % + + + + % + + + + % + + + + + + $ + + + + + ( + $ + + ) + + + + + % + + + + % + + - - + % - + - - + + - + - - - + + - + - - - + £ - + - + - £ - - - - - £ - - - - - - - £ - - - - - - % - - - - - - - % - - - - - DM - - - - - - DM - - - - - DM - - - - - - - DM - - - - - DM - - - - - - DM + - - - - DM - - + + + £ + + + - - - DM - - + £ + + + + + + % + + + + - + + % + + - - - + + DM - - - - - - + + - + + DM + - - - - + + + DM + + + + - + + DM + + + + + DM + + + - + + DM + - - - - - - - - - - DM + + DM - - - - - - DM + + + - + + DM + - - - - DM - - - - - - - - - - + + - - - - + - + + - - - - - + + - @@ -1537,21 +1647,19 @@ - - + + DM - - - - + - + + DM - - - - - DM + + - DM @@ -1560,260 +1668,308 @@ - + + + + + + + - + + + + + + + - + + + + + + + + + + + + + + DM + + + - + + + DM + + + + - + + DM + + + + + + + + + Ouch! - - Error detected! - + - Result=0 - No Errordetection - + / / - + / / - - - - - - - - - - - £ - - - - - - - - - £ - - - - - - - - - - £ - - - - - - - - - £ - - + + + + + + + + + + £ + + + + + + + + + £ + + + - - + + - - - - + + £ + - - - - - - + + + + - - - - - - - - - - - - - - £ - - - - - - - - - - - - £ - - - - - - - - - - - - - + £ + + + + + + + + + + + - - - - - - - - - + - - + + - + + + - + + - - - + + + - - £ - - + + £ + + - - - - + + + + - - £ - - - - - + + £ + + - - + - - - + + + - - - - - - + + + + + + - - - - - - - + + - DM - - + + + - - + - DM - - - - + + + - DM - - + + + + + + £ + + + + + + + + + + + + £ + - - + - DM - - - - + + + - DM - - - - - - - - DM - - - - - - DM - - - - - - - - DM - - + + + + - - - DM + + - - - - DM + + - + - + DM + - + + + DM + + + + + + DM + + + - + + + DM + + + + + + DM + + + + - + + + DM + + + + + + DM + + + + - + + + DM + + + + + + DM + + + + - + + + DM + + + + + + + + - + - - + - + tan @@ -1821,75 +1977,75 @@ - - + + - - + + - - + + - - + + - + - - + + - - + + - + - - + - + - + - - + + - + - - + + - - + + - - + + - + - - + - + - + : @@ -1898,289 +2054,240 @@ - + : : - + - + - + - - - + + - + - + - + - - - + + - - + + - - + + - - + + - - + + - - + + - - - / - - / - - - - - - - - - - - - - - - - - - - - - - - - - - : - - - - - - - : - - : - - - - - - - : - - - - - : - - : - - / / - - - : - - - - - - - - ( - - ) - - - - - - - - - ( - - ) - - - - - - - - - ( - - - ) - - - - - - - - - - ( - - - ) - - - - - - - - - ( - - - ) - - - - - - - - - - ( - - - ) - - - - + + + - + + - + + + + - - + + + - + + + + + : + + + + + + + : + + : + + + + + + + : + + + : : - + + + / + + / + + + + : + + + + + + + + + ( + + ) + + + + + + + + + ( + + ) + + + + + + + + + ( + + + ) + + + + + + + + + + ( + + + ) + + + + + + + + + ( + + + ) + + + + + + + + + + ( + + + ) + + + + + - + + + + + : + + : + + + : - - + + - + ( - + ) - + - - + + - - + + % - - + + - - - - - - - - ( - - ) - - - - - - - - - - - - - - - - - - - - - - - ( - - ) - - - - - - - - - - - - - - - - + + - + ( - + ) - - - - - + + - @@ -2191,23 +2298,21 @@ - - + + - + ( - + ) - - - - - + + - @@ -2216,85 +2321,136 @@ - - + + + + - - + + + ( + + ) - - + + + - + + - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + ( + + ) + + + + + - + + + + + + + + + + + + - + - + - + - + - + - + - + - + - + - + + + + + + + + + + + + + + + + + + + + + + + + + . - + . - + - + : - + : @@ -2303,215 +2459,204 @@ - - - . - - . - - - - : - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + - - - + + - - + + - - - + + - - + + - - - + + - - + + - - - + + - + + + + + + - + + + + + + + + + + + - + + + + + + + + + + - + + + + + + + + + + + - + + + + + : : - + : - - + + - + - + - + - + - - + - + - + - + - + - - + - + - + - + - + - - + - + - + - + - + - - + - + - - - - - - - - - - - - - - - - - - - - - - - - - - : - - - - - - - : - - : - - - - - - - : - - - - - : - - : - - + + - + + - + + + + + - + + + + + - + + + + + : + + + + + + + : + + : + + + + + + + : + + + + + : + + : + + + - @@ -2522,140 +2667,140 @@ : - - + + - - + + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + - - + - - - + + + + - + + + + + + + + + - + + + + + + + + + + - + + + + + + + + + + - - - + + - - + - - - + + + - - - - + + + + - - - - + + + + - - - - + + + - - + - - - + + + - - - + + + - - - + + + - - - + + - - + - + - - - + + + - - - - + + + + - - - - + + + + - - - - + + + - - + - + - - - + + + - + @@ -2664,7 +2809,7 @@ - + @@ -2677,6 +2822,9 @@ + + + @@ -2714,10 +2862,7 @@ - - - - + @@ -2764,18 +2909,18 @@ - - + + - - - + + + - - - + + + @@ -2784,238 +2929,172 @@ - - + + - + - - + + - + - - - + + + + + + + + + + + + + + + + - + - + - + - + - + - + - + - + - + - + - + - + - + - + + + + - + - + - + - - - - - - - - - - - - - + + + + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + - + - + - + - - - - - - - - + - + - + - + - + - - - - - - + - - - - - - - - - + + - + - - - - - - - - - - - + @@ -3023,40 +3102,34 @@ - - - - - - - - - + - + - - + + - - + + + - + + - + - + - + @@ -3076,50 +3149,50 @@ - + - + - + - + - + - + - + - + - + - + - + - + - + @@ -3129,43 +3202,53 @@ ??? + Page 1 + - ??? (???) + ???(???) - 00/00/0000, 00:00:00 + 00/00/0000, 00:00:00 + - Page 1 / 99 + Page 1/ 99 + + + + + + + @@ -3197,7 +3280,7 @@ - + Sheet @@ -3208,11 +3291,11 @@ Description - + 1 - + TRUE @@ -3229,48 +3312,23 @@ - + - - - - - - - - - - - - - - - - - - - - - + - + - + - - - - - @@ -3284,18 +3342,19 @@ - - + + + - + - + - + Function @@ -3311,82 +3370,95 @@ Comment - - + + Expected Real + + + Expected Imaginary + + + + Result Real + + + Result Imaginary + + + -5+12i - + - - + + - + - - - 0,0113716081825818+0,00723140654863397j + + + 0.0113716081825818+0.00723140654863397i - - -1,17836687482814e-05-3,48576140783804e-06j + + 0.0113716081825818+0.00723140654863397i - + TRUE - - =IMCSCH("5+12j") + + =IMCSCH("5+12i") - 0.011371608182582 + 0.0113716081825818 - 0.007231406548634 + 0.00723140654863397 - 0.011371608182582 + 0.0113716081825818 - - 0.007231406548634 + + 0.00723140654863397 - + TRUE - + TRUE - + -4+12i - + - - + + - + - - - 1,04283521277141i + + + 1.04283521277141i - - -0,0134765058305891i + + 1.04283521277141i - + TRUE - + =IMCSCH(COMPLEX(0,5)) @@ -3400,181 +3472,181 @@ 0 - + 1.04283521277141 - + TRUE - + TRUE - + -3+12i - + - - - + + + - + - - - -0,0113716081825818+0,00723140654863397i + + + -0.0113716081825818+0.00723140654863397i - - 1,17836687482814e-05-3,48576140783804e-06i + + -0.0113716081825818+0.00723140654863397i - + TRUE - + =IMCSCH("-5+12i") - -0.011371608182582 + -0.0113716081825818 - 0.007231406548634 + 0.00723140654863397 - -0.011371608182582 + -0.0113716081825818 - - 0.007231406548634 + + 0.00723140654863397 - + TRUE - + TRUE - + -2+12i - + - - + + - + - - - -0,0113716081825818+0,00723140654863397i + + + -0.0113716081825818+0.00723140654863397i - - 1,17836687482814e-05-3,48576140783804e-06i + + -0.0113716081825818+0.00723140654863397i - + TRUE - + =IMCSCH(N1) - -0.011371608182582 + -0.0113716081825818 - 0.007231406548634 + 0.00723140654863397 - -0.011371608182582 + -0.0113716081825818 - - 0.007231406548634 + + 0.00723140654863397 - + TRUE - + TRUE - + -1+12i - + - - + + - + - - - -0,0113716081825818+0,00723140654863397i + + + -0.0113716081825818+0.00723140654863397i - - 1,17836687482814e-05-3,48576140783804e-06i + + -0.0113716081825818+0.00723140654863397i - + TRUE - - {=IMCSCH (N1:N12)} + + {=IMCSCH(N1:N12)} - -0.011371608182582 + -0.0113716081825818 - 0.007231406548634 + 0.00723140654863397 - -0.011371608182582 + -0.0113716081825818 - - 0.007231406548634 + + 0.00723140654863397 - + TRUE - + TRUE - + 0+12i - + - - + + - + - - - -0,0309098723667019+0,0196675402624156i + + + -0.0309098723667019+0.0196675402624156i - - 9,29991048165009e-06+8,0322504195773e-06i + + -0.0309098723667019+0.0196675402624156i - + TRUE - - {=IMCSCH (N1:N12)} + + {=IMCSCH(N1:N12)} @@ -3585,90 +3657,90 @@ - -0.030909872366702 + -0.0309098723667019 - - 0.019667540262416 + + 0.0196675402624156 - + TRUE - + TRUE - + 1+12i - + - - + + - + - - - -0,0839938618035557+0,0536737609428415i + + + -0.0839938618035557+0.0536737609428415i - - -1,73414259383761e-06+1,21654482550521e-05i + + -0.0839938618035557+0.0536737609428415i - + TRUE - - {=IMCSCH (N1:N12)} + + {=IMCSCH(N1:N12)} - -0.083993861803556 + -0.0839938618035557 5.36737609428415E-002 - -0.083993861803556 + -0.0839938618035557 - - 0.053673760942842 + + 0.0536737609428415 - + TRUE - + TRUE - + 2+12i - + - - + + - + - - - -0,227684450599255+0,15017767282551i + + + -0.227684450599255+0.150177672825509i - - -1,11738329653742e-05+5,11378906737739e-06i + + -0.227684450599255+0.15017767282551i - + TRUE - - {=IMCSCH (N1:N12)} + + {=IMCSCH(N1:N12)} @@ -3681,41 +3753,41 @@ -0.227684450599255 - - 0.15017767282551 + + 0.150177672825509 - + TRUE - + TRUE - + 3+12i - + - - + + - + - - - -0,594184076066616+0,496088160951579i + + + -0.594184076066616+0.496088160951579i - - -1,03403528397133e-05-6,63946420403422e-06i + + -0.594184076066616+0.496088160951579i - + TRUE - - {=IMCSCH (N1:N12)} + + {=IMCSCH(N1:N12)} @@ -3728,339 +3800,339 @@ -0.594184076066616 - + 0.496088160951579 - + TRUE - + TRUE - + 4+12i - + - + - + - - - 1,86367959778244i + + + 1.86367959778244i - - -1,22884247071203e-05i + + 1.86367959778244i - + TRUE - - {=IMCSCH (N1:N12)} + + {=IMCSCH(N1:N12)} 0 - + 1.86367959778244 0 - + 1.86367959778244 - + TRUE - + TRUE - + 5+12i - + - + - - - 0,594184076066616+0,496088160951579i + + + 0.594184076066616+0.496088160951579i - - 1,03403528397133e-05-6,63946420403422e-06i + + 0.594184076066616+0.496088160951579i - + TRUE - - {=IMCSCH (N1:N12)} + + {=IMCSCH(N1:N12)} 0.594184076066616 - + 0.496088160951579 0.594184076066616 - + 0.496088160951579 - + TRUE - + TRUE - + 6+12i - + - + - - - 0,227684450599255+0,15017767282551i + + + 0.227684450599255+0.150177672825509i - - 1,11738329653742e-05+5,11378906737739e-06i + + 0.227684450599255+0.15017767282551i - + TRUE - - {=IMCSCH (N1:N12)} + + {=IMCSCH(N1:N12)} 0.227684450599255 - + 0.15017767282551 0.227684450599255 - - 0.15017767282551 + + 0.150177672825509 - + TRUE - + TRUE - + - + - + - - - 0,0839938618035557+0,0536737609428415i + + + 0.0839938618035557+0.0536737609428415i - - 1,73414259383761e-06+1,21654482550521e-05i + + 0.0839938618035557+0.0536737609428415i - + TRUE - - {=IMCSCH (N1:N12)} + + {=IMCSCH(N1:N12)} - 0.083993861803556 + 0.0839938618035557 - - 0.053673760942842 + + 0.0536737609428415 - 0.083993861803556 + 0.0839938618035557 - - 0.053673760942842 + + 0.0536737609428415 - + TRUE - + TRUE - + - + - + - - - 0,0309098723667019+0,0196675402624156i + + + 0.0309098723667019+0.0196675402624156i - - -9,29991048165009e-06+8,0322504195773e-06i + + 0.0309098723667019+0.0196675402624156i - + TRUE - - {=IMCSCH (N1:N12)} + + {=IMCSCH(N1:N12)} - 0.030909872366702 + 0.0309098723667019 - - 0.019667540262416 + + 0.0196675402624156 - 0.030909872366702 + 0.0309098723667019 - - 0.019667540262416 + + 0.0196675402624156 - + TRUE - + TRUE - + - + - + - - - 0,0113716081825818+0,00723140654863397i + + + 0.0113716081825818+0.00723140654863397i - - -1,17836687482814e-05-3,48576140783804e-06i + + 0.0113716081825818+0.00723140654863397i - + TRUE - - {=IMCSCH (N1:N12)} + + {=IMCSCH(N1:N12)} - 0.011371608182582 + 0.0113716081825818 - 0.007231406548634 + 0.00723140654863397 - 0.011371608182582 + 0.0113716081825818 - - 0.007231406548634 + + 0.00723140654863397 - + TRUE - + TRUE - + - + - + - - - 0,00418340577604633+0,00266009278646834i + + + 0.00418340577604633+0.00266009278646834i - - -3,43357631183878e-06-1,17989802733781e-05i + + 0.00418340577604633+0.00266009278646834i - + TRUE - - {=IMCSCH (N1:N12)} + + {=IMCSCH(N1:N12)} - 0.004183405776046 + 0.00418340577604633 - 0.002660092786468 + 0.00266009278646834 - 0.004183405776046 + 0.00418340577604633 - - 0.002660092786468 + + 0.00266009278646834 - + TRUE - + TRUE - + - + - + - - - 1,18839510577812j + + + 1.18839510577812i - - 0,850918128239322j + + 1.18839510577812i - + TRUE - - =IMCSCH("0-j") + + =IMCSCH("0-i") @@ -4073,1890 +4145,1688 @@ 0 - + 1.18839510577812 - + TRUE - + TRUE - + - + - + - - - 0,0366435703258656 + + + 0.0366435703258656 - - -1,3213487088109 + + 0.0366435703258656 - + TRUE - + =IMCSCH(4) - 0.036643570325866 + 0.0366435703258656 0 - 0.036643570325866 + 0.0366435703258656 - + 0 - + TRUE - + TRUE - + - + - + - - - -0,036275889628626-0,0051744731840194i + + + -0.036275889628626-0.0051744731840194i - - + + -0.036275889628626-0.0051744731840194i + + TRUE - + =IMCSCH("4+3i") - + -0.036275889628626 - - -0.005174473184019 + + -0.0051744731840194 -0.036275889628626 - - -0.005174473184019 + + -0.0051744731840194 - + TRUE - + TRUE - + - + - + - + - - - - + + + - - + + - + - + - - + + - - - - + + + - - + + - + - + - - + + + + - - - + - + - + - + - - + + - - - - + + + - + - + - - + + - - - - + + + - + - + - - + + - - - + + - + - + - + - - + + - - - - + + + - + - + - - + + - - - - + + + - + - + - - + + - - - - + + + - + - + - - + + - - - - + + + - + - + - - + + - - - + + - + - + - + - - + + - - - - + + + - + - + - - + + - - - - + + + - + - + - - + + - - - + + - + - + - - + + - - - + + 58 - + - + - - + + - - - + + 59 - + - + - - + + - - - + + 60 - + - + - - + + - - - + + 61 - + - + - - + + - - - + + 62 - + - + - - + + - - - + + 63 - + - + - - + + - - - + + 64 - + - + - - + + - - - + + 65 - + - + - - + + - - - + + 66 - + - + - - + + - - - + + 67 - + - + - - + + - - - + + 68 - + - + - - + + - - - + + 69 - + - + - - + + - - - + + 70 - + - + - - + + - - - + + 71 - + - + - - + + - - - + + 72 - + - + - - + + - - - + + 73 - + - + - - + + - - - + + 74 - + - + - - + + - - - + + 75 - + - + - - + + - - - + + 76 - + - + - - + + - - - + + 77 - + - + - - + + - - - + + 78 - + - + - - + + - - - + + 79 - + - + - - + + - - - + + 80 - + - + - - + + - - - + + 81 - + - + - - + + - - - + + 82 - + - + - - + + - - - + + 83 - + - + - - + + - - - + + 84 - + - + - - + + - - - + + 85 - + - + - - + + - - - + + 86 - + - + - - + + - - - + + 87 - + - + - - + + - - - + + 88 - + - + - - + + - - - + + 89 - + - + - - + + - - - + + 90 - + - + - - + + - - - + + 91 - + - + - - + + - - - + + 92 - + - + - - + + - - - + + 93 - + - + - - - - - + + + + 94 - + - + - - - - - + + + + 95 - + - + - - + + - - - + + 96 - + - + - - + + - - - + + 97 - + - + - - + + - - - + + 98 - + - + - - + + - - - + + 99 - + - + - - + + - - - + + 100 - + - + - - + + - - - + + - + - + - - + + - - - + + - + - + - - + + - - - + + - + - + - - + + - - - + + - + - + - + - - - + + - + - + - + - - + + - + - + - + - - - + + - + - + - - - + + - - + - + - + - + - + - + - + - + 548 - + - + - + 549 - + - + - + 550 - + - + - + 551 - + - + - + 552 - + - + - + 553 - + - + - + 554 - + - + - + 555 - + - + - + 556 - + - + - + 557 - + - + - + 558 - + - + - + 559 - + - + - + 560 - + - + - + 561 - + - + - + 562 - + - + - + 563 - + - + - + 564 - + - + - + 565 - + - + - + 566 - + - + - + 567 - + - + - + 568 - + - + - + 569 - + - + - + 570 - + - + - + 571 - + - + - + 572 - + - + - + 573 - + - + - + 574 - + - + - + 575 - + - + - + 576 - + - + - + 577 - + - + - + 578 - + - + - + 579 - + - + - + 580 - + - + - + 581 - + - + - + 582 - + - + - + 583 - + - + - + 584 - + - + - + 585 - + - + - + 586 - + - + - + 587 - + - + - + 588 - + - + - + 589 - + - + - + 590 - + - + - + 591 - + - + - + 592 - + - + - + 593 - + - + - + 594 - + - + - + 595 - + - + - + 596 - + - + - + - + - + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/sc/qa/unit/data/functions/addin/fods/impower.fods b/sc/qa/unit/data/functions/addin/fods/impower.fods index 2a7822cf804e..9b668d3d0193 100644 --- a/sc/qa/unit/data/functions/addin/fods/impower.fods +++ b/sc/qa/unit/data/functions/addin/fods/impower.fods @@ -1,203 +1,357 @@ - + + 2024-05-28T17:56:23.578001863PT28M48S4LibreOfficeDev/24.8.0.0.alpha0$MacOSX_X86_64 LibreOffice_project/fd2355497467a1af61749cce311bf57d067566c4 + + + 0 + 0 + 77463 + 358034 + + + view1 + + + 0 + 0 + 2 + 0 + 0 + 0 + 0 + 0 + 100 + 60 + true + false + false + false + false + + + 1 + 22 + 2 + 0 + 0 + 0 + 10 + 0 + 100 + 60 + true + false + false + false + false + + + Sheet2 + 1417 + 0 + 100 + 60 + false + true + true + false + true + 12632256 + true + 1 + true + true + false + false + false + 1000 + 1000 + 1 + 1 + true + false + false + false + false + + + + + true + true + true + 0 + true + true + false + true + false + 12632256 + true + true + 0 + false + false + true + true + false + 3 + false + Samsung M2020 Series + false + LgH+/1NhbXN1bmcgTTIwMjAgU2VyaWVzAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAU2Ftc3VuZyBNMjAyMCBTZXJpZXMAAAAAAAAAAAAAAAAWAAQABAAAAAAAAAAEAAhSAAAEdAAAAAAAABIAQ09NUEFUX0RVUExFWF9NT0RFEwBEdXBsZXhNb2RlOjpVbmtub3duDABQUklOVEVSX05BTUUUAFNhbXN1bmcgTTIwMjAgU2VyaWVzCwBEUklWRVJfTkFNRRQAU2Ftc3VuZyBNMjAyMCBTZXJpZXM= + false + 1000 + 1000 + 1 + 1 + true + false + false + true + true + true + true + 7 + true + + + Sheet1 + + + Sheet2 + + + + + + + + + + + + + + + + + + + + + + - - + + + + + + + + + + + + + + - - - - - - - - - - - - - - - - - - - - - - ( - - ) - - - - - - - - - - - - - - - - - - - - - - + + - - + - - + + + - - - + + + + ( + + ) + + + - - + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + - ( - - ) - + - - + + - - - ( - - ) + + + + - + + + - - - - - - - - - - - - - - - + + + + + + + + - + + + + + + + + + + + + + - + + + + + + + + + + + + + - + + + + + + + + - + ( + + ) + - - + + + - + ( + + ) + - + - + - + - + - + - + - + - + - - + + + + + + + + + + + + + + + + + + + + + + + + + + - + - - + - + - + - + - - + - + - + @@ -206,7 +360,7 @@ / - + @@ -215,155 +369,109 @@ / - + - + - + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + - - - - - - - - - - + - + + - - - + + + + + + + + + - + + + + + + + + + + - + + + + - - - + + - - - - - - + + + - + + + - - - - + + + + + - + + + + + + + + + - + + + + + + + + - + + - - - - - - - - - - + - - - - - - + + + - + + - - - - Kč - - - - - - - - - - + + - - - - + - + + - - - - - + + - @@ -373,21 +481,19 @@ - - + + - - - - + - + + - - - - - + + - Kč @@ -396,200 +502,208 @@ - + + + + + + + - + + + + + + + - + + + + + + + + + + + + + + + + + - + + + + + + + - + + + + + + + + + + + : - + : : - + : - - + + - + Yes - + Yes - + No - - + + - + True - + True - + False - - + + - + On - + On - + Off - - + + - + ¥€ - + - + ( - + ) - + - - + + - + - - + - + - + $ - + - + ($ - + ) - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + - - + + - + - - - + + + - - - + + + + + + + - + + + + + + + + + + + + + + - + + + - - - - - - - - - + + - + + - - - + + + - - - € - - - - - - - - - + - - + - - - - + - @@ -599,18 +713,16 @@ - + - - + - - - - + - € @@ -619,109 +731,99 @@ - - - - - $ - - - - - ($ - - ) - - + + + + + - + + + + + - + + + + + + + + + + + + + + + + - + + + + + - + + + + + + + + + + + + + + $ - + - + + ($ + + ) + + + + $ + + + + ($ - + ) - + - - $ - - - - - ($ - - ) - - - - - - - - - - ( - - ) - - - - - - - - - - - - - - $ - - + $ + - - $ - - ( - + + ($ + ) + - - $ - - - - - - - - - - - - $ - - + + - $ - + ( - + ) - $ - - - - - + + - @@ -730,149 +832,128 @@ - + + $ + + + + + + $ + + ( + + ) + + + $ + + - + + + + + + + + + + $ + + + + + + $ + + ( + + ) + + + $ + + - + + + + + + + + + + + - + - + ( - + ) - + - - \ - - - - \- - - - - - \ - - - - - \- - - - - - \ - - - - \- - - - - - \ - - - - - \- - - - - \ - - - + \ + - - \ - - - - - + + \- + + - - \ - - - + + \ + - - - - - - - - - - - + + + \- + + - - - - - - + + \ + - - - - + + \- + + - - - - - - - - - \ - - - + + \ + - - \ - - - - - + + + \- + + - - \ - - - - - - - - - - - - - - - + \ + + - + \ + - - + - - - - - + \ + + - @@ -882,575 +963,602 @@ - - + + + - + + - - - - + + - - - - - - - - - - - - - - - - - - - - - - + + + - + + + + + + + - - + \ + + + - - + + \ + - - - - + + - - + + \ + + - + + + + + + + + + + + + + + + + + + - + + + + + + - + + + + + + + + + + + + + + + + - + + + + + + + + + - + + + + + + + + + + - + + + + + + + + + + + - + + + + + + + + $ - + - + $( - + ) - + $- - + - - - + + + - - + + - + ( - + ) - + - - + - - - + + + - + $ - + - + $( - + ) - + $- - + - + - - - + + + - - + + - + ( - + ) - + - - + - + - - - + + + - - - % - - - - % - - - - % - - - - % - - - - % - - - - % - - - - % - - - - % - - + % - + + % + + + + % + + + + % + + + + % + + + + % + + + + % + + + + % + + + + % + + + % - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + - - + - + - - + - + - - + - + - - + - + - - + - + - - + - + - - + - + - - + - + - - + - + - - + - + - - + - - - - - - % - - - - % - - - - % - - - - % - - - - % - - - - % - - - - - - $ - + + + + - + - ( - $ - - ) - + - + + + + - - + + + + + + + + - + + + + + + + + + + + + + - + + + + + + + + + + + + + - + + + + + + + + + + % - - + + + % + + + % + + % + + + + % + + + + % + + + + + + $ + + + + + ( + $ + + ) + + + + + % + + + + % + + - - + % - + - - + + - + - - - + + - + - - - + £ - + - + - £ - - - - - £ - - - - - - - £ - - - - - - % - - - - - - - % - - - - - DM - - - - - - DM - - - - - DM - - - - - - - DM - - - - - DM - - - - - - DM + - - - - DM - - + + + £ + + + - - - DM - - + £ + + + + + + % + + + + - + + % + + - - - + + DM - - - - - - + + - + + DM + - - - - + + + DM + + + + - + + DM + + + + + DM + + + - + + DM + - - - - - - - - - - DM + + DM - - - - - - DM + + + - + + DM + - - - - DM - - - - - - - - - - + + - - - - + - + + - - - - - + + - @@ -1460,21 +1568,19 @@ - - + + DM - - - - + - + + DM - - - - - DM + + - DM @@ -1483,253 +1589,301 @@ - + + + + + + + - + + + + + + + - + + + + + + + + + + + + + + DM + + + - + + + DM + + + + - + + DM + + + + + + + + + Ouch! - - Error detected! - + - Result=0 - No Errordetection - + / / - - - - - - - - - - - £ - - - - - - - - - £ - - - - - - - - - - £ - - - - - - - - - £ - - + + + + + + + + + + £ + + + + + + + + + £ + + + - - + + - - - - + + £ + - - - - - - + + + + - - - - - - - - - - - - - - £ - - - - - - - - - - - - £ - - - - - - - - - - - - - + £ + + + + + + + + + + + - - - - - - - - - + - - + + - + + + - + + - - - + + + - - £ - - + + £ + + - - - - + + + + - - £ - - - - - + + £ + + - - + - - - + + + - - - - - - + + + + + + - - - - - - - + + - DM - - + + + - - + - DM - - - - + + + - DM - - + + + + + + £ + + + + + + + + + + + + £ + - - + - DM - - - - + + + - DM - - - - - - - - DM - - - - - - DM - - - - - - - - DM - - + + + + - - - DM + + - - - - DM + + - + - + DM + - + + + DM + + + + + + DM + + + - + + + DM + + + + + + DM + + + + - + + + DM + + + + + + DM + + + + - + + + DM + + + + + + DM + + + + - + + + DM + + + + + + + + - + - - + - + tan @@ -1737,75 +1891,75 @@ - - + + - - + + - - + + - - + + - + - - + + - - + + - + - - + - + - + - - + + - + - - + + - - + + - - + + - + - - + - + - + : @@ -1814,289 +1968,240 @@ - + : : - + - + - + - - - + + - + - + - + - - - + + - - + + - - + + - - + + - - + + - - + + - - - / - - / - - - - - - - - - - - - - - - - - - - - - - - - - - : - - - - - - - : - - : - - - - - - - : - - - - - : - - : - - / / - - - : - - - - - - - - ( - - ) - - - - - - - - - ( - - ) - - - - - - - - - ( - - - ) - - - - - - - - - - ( - - - ) - - - - - - - - - ( - - - ) - - - - - - - - - - ( - - - ) - - - - + + + - + + - + + + + - - + + + - + + + + + : + + + + + + + : + + : + + + + + + + : + + + : : - + + + / + + / + + + + : + + + + + + + + + ( + + ) + + + + + + + + + ( + + ) + + + + + + + + + ( + + + ) + + + + + + + + + + ( + + + ) + + + + + + + + + ( + + + ) + + + + + + + + + + ( + + + ) + + + + + - + + + + + : + + : + + + : - - + + - + ( - + ) - + - - + + - - + + % - - + + - - - - - - - - ( - - ) - - - - - - - - - - - - - - - - - - - - - - - ( - - ) - - - - - - - - - - - - - - - - + + - + ( - + ) - - - - - + + - @@ -2107,23 +2212,21 @@ - - + + - + ( - + ) - - - - - + + - @@ -2132,85 +2235,136 @@ - - + + + + - - + + + ( + + ) - - + + + - + + - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + ( + + ) + + + + + - + + + + + + + + + + + + - + - + - + - + - + - + - + - + - + - + + + + + + + + + + + + + + + + + + + + + + + + + . - + . - + - + : - + : @@ -2219,215 +2373,204 @@ - - - . - - . - - - - : - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + - - - + + - - + + - - - + + - - + + - - - + + - - + + - - - + + - + + + + + + - + + + + + + + + + + + - + + + + + + + + + + - + + + + + + + + + + + - + + + + + : : - + : - - + + - + - + - + - + - - + - + - + - + - + - - + - + - + - + - + - - + - + - + - + - + - - + - + - - - - - - - - - - - - - - - - - - - - - - - - - - : - - - - - - - : - - : - - - - - - - : - - - - - : - - : - - + + - + + - + + + + + - + + + + + - + + + + + : + + + + + + + : + + : + + + + + + + : + + + + + : + + : + + + - @@ -2438,140 +2581,140 @@ : - - + + - - + + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + - - + - - - + + + + - + + + + + + + + + - + + + + + + + + + + - + + + + + + + + + + - - - + + - - + - - - + + + - - - - + + + + - - - - + + + + - - - - + + + - - + - - - + + + - - - + + + - - - + + + - - - + + - - + - + - - - + + + - - - - + + + + - - - - + + + + - - - - + + + - - + - + - - - + + + - + @@ -2580,7 +2723,7 @@ - + @@ -2593,6 +2736,9 @@ + + + @@ -2630,10 +2776,7 @@ - - - - + @@ -2680,17 +2823,17 @@ - - + + - - + + - - + + @@ -2700,273 +2843,215 @@ - - + + - + - - + + - + - - - + + + + + + + + + + + + + + + + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - - - - - - - + + + + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + - + - + - + - + - - - - - - - - - - - + + + + - + - + - - + + - + - + + + + + + - - - - + - + - + - - - - - - - - - - - - - - + - - - - - + - + - + - - + + - - - - + + - + - + - + @@ -2986,50 +3071,50 @@ - + - + - + - + - + - + - + - + - + - + - + - + - + @@ -3039,43 +3124,53 @@ ??? + Page 1 + - ??? (???) + ???(???) - 00/00/0000, 00:00:00 + 00/00/0000, 00:00:00 + - Page 1 / 99 + Page 1/ 99 + + + + + + + @@ -3107,7 +3202,7 @@ - + Sheet @@ -3118,11 +3213,11 @@ Description - + 1 - + TRUE @@ -3139,44 +3234,19 @@ - + - - - - - - - - - - - - - - - - - - - - - + - + - - - - - - + @@ -3205,7 +3275,7 @@ - + Function @@ -3222,22 +3292,22 @@ Comment - + -5+12i - + + - - + - + -5+12i @@ -3245,7 +3315,7 @@ TRUE - + =IMPOWER("2+3i",2) @@ -3259,7 +3329,7 @@ -5 - + 12 @@ -3268,31 +3338,31 @@ TRUE - + -4+12i - + - - + + - + - - - -46+9,00000000000001i + + + -46+9.00000000000001i TRUE - + =IMPOWER("2+3i", 3) @@ -3306,7 +3376,7 @@ -46 - + 9.00000000000001 @@ -3315,28 +3385,28 @@ TRUE - + -3+12i - + + - - + - + - + -119-120i - + TRUE - + =IMPOWER("-5+12i",2) @@ -3350,7 +3420,7 @@ -119 - + -120 @@ -3359,29 +3429,29 @@ TRUE - + -2+12i - + - - + + - + - + -119-120i - - + + TRUE - + =IMPOWER(N1,2) @@ -3395,7 +3465,7 @@ -119 - + -120 @@ -3404,29 +3474,29 @@ TRUE - + -1+12i - + - - + + - + - + -119-120i - + TRUE - + {=IMPOWER(N1:N12,2)} @@ -3440,7 +3510,7 @@ -119 - + -120 @@ -3449,29 +3519,29 @@ TRUE - + 0+12i - + - - + + - + - + -128-96i - + TRUE - + {=IMPOWER(N1:N12,2)} @@ -3485,7 +3555,7 @@ -128 - + -96 @@ -3494,29 +3564,29 @@ TRUE - + 1+12i - + - - + + - + - + -135-72i - + TRUE - + {=IMPOWER(N1:N12,2)} @@ -3530,7 +3600,7 @@ -135 - + -72 @@ -3539,29 +3609,29 @@ TRUE - + 2+12i - + - - + + - + - + -140-48i - + TRUE - + {=IMPOWER(N1:N12,2)} @@ -3575,7 +3645,7 @@ -140 - + -48 @@ -3584,29 +3654,29 @@ TRUE - + 3+12i - + - - + + - + - + -143-24i - - + + TRUE - + {=IMPOWER(N1:N12,2)} @@ -3620,7 +3690,7 @@ -143 - + -24 @@ -3629,28 +3699,28 @@ TRUE - + 4+12i - + - + - + - - - -144+1,76349139077219e-14i + + + -144+1.76349139077219e-14i - - + + TRUE - + {=IMPOWER(N1:N12,2)} @@ -3664,7 +3734,7 @@ -144 - + 1.76349139077219E-14 @@ -3673,27 +3743,27 @@ TRUE - + 5+12i - + - + - + -143+24i - + TRUE - + {=IMPOWER(N1:N12,2)} @@ -3707,7 +3777,7 @@ -143 - + 24 @@ -3716,26 +3786,26 @@ TRUE - + 6+12i - + - + - + -140+48i - + TRUE - + {=IMPOWER(N1:N12,2)} @@ -3749,7 +3819,7 @@ -140 - + 48 @@ -3758,24 +3828,24 @@ TRUE - + - + - + - + -135+72i - + TRUE - + {=IMPOWER(N1:N12,2)} @@ -3789,7 +3859,7 @@ -135 - + 72 @@ -3798,24 +3868,24 @@ TRUE - + - + - + - + -128+96i - + TRUE - + {=IMPOWER(N1:N12,2)} @@ -3829,7 +3899,7 @@ -128 - + 96 @@ -3838,24 +3908,24 @@ TRUE - + - + - + - + -119+120i - + TRUE - + {=IMPOWER(N1:N12,2)} @@ -3869,7 +3939,7 @@ -119 - + 120 @@ -3878,24 +3948,24 @@ TRUE - + - + - + - + -108+144i - + TRUE - + {=IMPOWER(N1:N12,2)} @@ -3909,7 +3979,7 @@ -108 - + 144 @@ -3918,24 +3988,24 @@ TRUE - + - + - + - - - -1-1,22464679914735e-16j + + + -1-1.22464679914735e-16j - + TRUE - + =IMPOWER("0-j",2) @@ -3949,7 +4019,7 @@ -1 - + -1.22464679914735E-16 @@ -3958,24 +4028,24 @@ TRUE - + - + - + - + 4 - + TRUE - + =IMPOWER(4,1) @@ -3989,7 +4059,7 @@ 4 - + 0 @@ -3998,16 +4068,16 @@ TRUE - + - + - + - + -44+117i @@ -4015,21 +4085,21 @@ TRUE - + =IMPOWER("4+3i",3) -44 - + 117 -44 - + 117 @@ -4038,1833 +4108,1623 @@ TRUE - + - + - + - + 1 1 - + TRUE - + =IMPOWER("4+3i",0) - - - - - + + + + + - + - - + + Err:502 error - + TRUE - - =IMPOWER(F24,2) + + =IMPOWER(F22,2) - - - - - + + + + + - + - - - - - + + + 0.999999867866953-1.20477878982689e-08j + + + 0.999999867866953-1.20477878982689e-08j + + + TRUE + + + =IMPOWER("0.999999933933474-6.02389434711221e-09j",2) + - - - - - + + + + + - + - - - - - - - - - - - - + + + + + + + + - + - - - - - - - - - - - - - - - - - - + + - - - - + + + - + - + - - + + - - - + + - + - + - + - - + + - - - - + + + - + - + - - + + - - - - + + + - + - + - - + + - - - - + + + - + - + - - + + - - - - + + + - + - + - - + + - - - + + - + - + - + - - + + - - - - + + + - + - + - - + + - - - - + + + - + - + - - + + - - - + + - + - + - - + + - - - + + 58 - + - + - - + + - - - + + 59 - + - + - - + + - - - + + 60 - + - + - - + + - - - + + 61 - + - + - - + + - - - + + 62 - + - + - - + + - - - + + 63 - + - + - - + + - - - + + 64 - + - + - - + + - - - + + 65 - + - + - - + + - - - + + 66 - + - + - - + + - - - + + 67 - + - + - - + + - - - + + 68 - + - + - - + + - - - + + 69 - + - + - - + + - - - + + 70 - + - + - - + + - - - + + 71 - + - + - - + + - - - + + 72 - + - + - - + + - - - + + 73 - + - + - - + + - - - + + 74 - + - + - - + + - - - + + 75 - + - + - - + + - - - + + 76 - + - + - - + + - - - + + 77 - + - + - - + + - - - + + 78 - + - + - - + + - - - + + 79 - + - + - - + + - - - + + 80 - + - + - - + + - - - + + 81 - + - + - - + + - - - + + 82 - + - + - - + + - - - + + 83 - + - + - - + + - - - + + 84 - + - + - - + + - - - + + 85 - + - + - - + + - - - + + 86 - + - + - - + + - - - + + 87 - + - + - - + + - - - + + 88 - + - + - - + + - - - + + 89 - + - + - - + + - - - + + 90 - + - + - - + + - - - + + 91 - + - + - - + + - - - + + 92 - + - + - - + + - - - + + 93 - + - + - - - - - + + + + 94 - + - + - - - - - + + + + 95 - + - + - - + + - - - + + 96 - + - + - - + + - - - + + 97 - + - + - - + + - - - + + 98 - + - + - - + + - - - + + 99 - + - + - - + + - - - + + 100 - + - + - - + + - - - + + - + - + - - + + - - - + + - + - + - - + + - - - + + - + - + - - + + - - - + + - + - + - + - - - + + - + - + - + - - + + - + - + - + - - - + + - + - + - - - + + - - + - + - + - + - + - + - + - + 548 - + - + - + 549 - + - + - + 550 - + - + - + 551 - + - + - + 552 - + - + - + 553 - + - + - + 554 - + - + - + 555 - + - + - + 556 - + - + - + 557 - + - + - + 558 - + - + - + 559 - + - + - + 560 - + - + - + 561 - + - + - + 562 - + - + - + 563 - + - + - + 564 - + - + - + 565 - + - + - + 566 - + - + - + 567 - + - + - + 568 - + - + - + 569 - + - + - + 570 - + - + - + 571 - + - + - + 572 - + - + - + 573 - + - + - + 574 - + - + - + 575 - + - + - + 576 - + - + - + 577 - + - + - + 578 - + - + - + 579 - + - + - + 580 - + - + - + 581 - + - + - + 582 - + - + - + 583 - + - + - + 584 - + - + - + 585 - + - + - + 586 - + - + - + 587 - + - + - + 588 - + - + - + 589 - + - + - + 590 - + - + - + 591 - + - + - + 592 - + - + - + 593 - + - + - + 594 - + - + - + 595 - + - + - + 596 - + - + - + - + - + + + + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/sc/qa/unit/data/functions/addin/fods/imsech.fods b/sc/qa/unit/data/functions/addin/fods/imsech.fods index fea02a7d07d1..10d156385354 100644 --- a/sc/qa/unit/data/functions/addin/fods/imsech.fods +++ b/sc/qa/unit/data/functions/addin/fods/imsech.fods @@ -1,280 +1,357 @@ - + + 2023-12-11T00:08:12.127159275PT26S1LibreOfficeDev/24.2.0.0.alpha1$MacOSX_X86_64 LibreOffice_project/5eeb43041aa0042dfd963d94dd78d173585ef8e2 + + + 0 + 0 + 22010 + 5214 + + + view1 + + + 0 + 0 + 2 + 0 + 0 + 0 + 0 + 0 + 100 + 60 + true + false + false + false + false + + + 5 + 11 + 2 + 0 + 0 + 0 + 7 + 0 + 100 + 60 + true + false + false + false + false + + + Sheet2 + 1417 + 0 + 100 + 60 + false + true + true + false + true + 12632256 + true + 1 + true + true + false + false + false + 1000 + 1000 + 1 + 1 + true + false + false + false + false + + + + + true + true + true + 0 + true + true + false + true + false + 12632256 + true + true + 0 + false + false + true + true + false + 3 + false + Samsung M2020 Series + false + LgH+/1NhbXN1bmcgTTIwMjAgU2VyaWVzAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAU2Ftc3VuZyBNMjAyMCBTZXJpZXMAAAAAAAAAAAAAAAAWAAQABAAAAAAAAAAEAAhSAAAEdAAAAAAAABIAQ09NUEFUX0RVUExFWF9NT0RFEwBEdXBsZXhNb2RlOjpVbmtub3duDABQUklOVEVSX05BTUUUAFNhbXN1bmcgTTIwMjAgU2VyaWVzCwBEUklWRVJfTkFNRRQAU2Ftc3VuZyBNMjAyMCBTZXJpZXM= + false + 1000 + 1000 + 1 + 1 + true + false + false + true + true + true + true + 7 + true + + + Sheet1 + + + Sheet2 + + + + + + + + + + + + + + + + + + + + + + - - + + + + + + + + + + + + + + - - + + - + - - + - + - - - + + + - - + + ( - + ) - - + + - - + - + - - - + + + - - + + - - + + + + + + + + + - + + + + + + + + + + + + - + + + + + - + + - - + - - - - - - - - - - - - - - + - - + - - + + - - - - - - - + + + ( + + ) + + + + - - - - - £ - - - - - - £ - - - - - £ - - - - - - £ - - - - - £ - - - - - - - £ - + + + ( + + ) - - - £ - - - - - - - £ - - - - - £ - - - - - - - £ - - - - - - + + + + + + - ( - - ) - + - - - + + - ( - - ) - + + + + + + + + + + + + + - - £ - - - - - - - £ - - - - - - £ - - - - - - - £ - - - - - + - + - + - + - + - + - + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + - + - - + - + - + - + - - + - + - + @@ -283,7 +360,7 @@ / - + @@ -292,402 +369,461 @@ / - + - + - + - - + + + + + + + + + - + + + + + + + + + + + - + + + + + + + + + + - + + + + + + + + + + + - + + + + + + + + + - + + + + + + + + + - + + + + + + + + - + - - - - - - - - - - + + - - - - - + - - - - + + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + - - - - - + + - + + - - + + - - + - - - + + + - - - + + + - - - - - + + - + + - - + + - Kč - + - - - + + + - - - + + + - - - - - - - - - + - - + + - - - - - - - - - - - - - - - - - - - - - + + - - - + + - + - - - + + + - + + + + + + + - + + + + + + + - + + + + + + + + + + + : - + : : - + : - - + + - + Yes - + Yes - + No - - + + - + True - + True - + False - - + + - + On - + On - + Off - - + + - + ¥€ - + - + ( - + ) - + - - + + - + - - + - + - + $ - + - + ($ - + ) - + - - + + - + - - + - + - - + + - + - - + - + - - + + - - + + - + - - + - + - - + + - + - - + - + - - + + - + - - + - + - - + - - - + + + - - + + - + - - + - + - € - + - - - + + + - - + + - + - - + - + - - + - + - - - + + + - - + + + + - + + + + + - + + + + + + + + + + + + + + + $ + + + + + ($ + + ) + + + + $ + + + + + + ($ + + ) + + + + $ + + + + + ($ + + ) + + + + + + + - - - - + + ( + + ) - - - - + + - @@ -696,954 +832,962 @@ - - - - - $ - - - - - ($ - - ) - - - $ - - - - - - ($ - - ) - - - - $ - - - - - ($ - - ) - - - - - - - - - - ( - - ) - - - - - - - - - - - - - - - $ - - - - - - $ - - ( - - ) - - - $ - - - - - - - - - - - - - $ - - - - - - $ - - ( - - ) - - - $ - - - - - - - - - - - - - - - - - - - - - - ( - - - - ) - - - - \ - - - - \- - - - - - \ - - - - - \- - - - - - \ - - - - \- - - - - - \ - - - - - \- - - - - - \ - - - - - - \ - - - - - - - - \ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - \ - - - - - - \ - - - - - - - - \ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - $ - + + - - $( - + + $ + + ( + ) - + + $ + + - + + + + + + + + + + $ + + + + + + $ + + ( + + ) + + + $ + + - + + + + + + + + + + + + + + + + + + + ( + + + + ) + + + + \ + + + + \- + + + + + \ + + + + + \- + + + + + \ + + + + \- + + + + + \ + + + + + \- + + + + + \ + + + + + + \ + + - + + + + + \ + + - + + + + + + + + + + + + + + + + - + + + + + + - + + + + + + + + + + \ + + + + + + \ + + - + + + + + \ + + - + + + + + + + + + + + + + + + + + + - + + + + + + - + + + + + + + + + + + + + + + + - + + + + + + + + + + + - + + + + + + + + + + - + + + + + + + + + + + - + + + + + + + + + $ + + + + + $( + + ) + + $- - + - - - + + + - - + + - + ( - + ) - + - - + - - - + + + - + $ - + - + $( - + ) - + $- - + - + - - - + + + - - + + - + ( - + ) - + - - + - + - - - + + + + + + % + + + + % + + + + % + + + + % + + + + % + + + + % + + + + % + + + + % + + + + % + - + % - - - % - - - - % - - - - % - - - - % - - - - % - - - - % - - - - % - - - - % - - - - % - - - + + - + - - + - + - - + + - + - - + - + - - + + - + - - + - + - - + + - + - - + - + - - + + - + - - + - + - - + + - + - - + - + - - + + - + - - + - + - - + + - + - - + - + - - + + - + - - + - + - - + + - + - - + - + - - + + - + - - + - + - - + + - + - - + - + - - + + - + - - + - + - - + + - + - - + - + - - + + - + - - + - + - - + + - - + + % - - + + + % + + + + % + + + + % + + + + % + + + + % + + + + + + $ + + + + + ( + $ + + ) + + + + + % + + + % - - % - - - - % - - - - % - - - - % - - - - - - $ - - - - - ( - $ - - ) - - - - - % - - - - % - - - - + % - + - - + + - + - - - + + - + - - - + £ - + - + - £ - + + + + + £ + + + + + - + £ + + + + + + % + + + + - + + % + + + + + DM + + + - + + DM + + + + + DM + + + + - + + DM + + + + + DM + + + - + + DM + + + + + DM + + + + - + + DM - - - £ - - - - - - - £ - - - - - - % - - - - - - - % - - - - - DM - - - - - DM - - - - - DM - - - - - - - DM - - - - - DM - - - - - - DM - - - - - DM - - - - - - - DM - - - - - + + + - - - - - + + - + + - - + + - - + - - - + + + - - - + + + DM - - - - - + + - + + DM - - + + - DM + + + + + + + + + + + + + + - + + + + + + + - + + + + + + + + + + + + + + DM + + + - + + + DM + + + + - + + DM + + + + + + + + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - DM - - - - - - - DM - - - - - - - DM - - - - - - - - - Ouch! - - Error detected! - + - Result=0 - No Errordetection - - - / - - / - - - + / / - - + + - - + + - - + + + + £ + + + + + + + + + £ + + + + + + + + + + £ + + + + + + + + + £ + + + + + + + + + + + + + + + - + + + + + + + - + + + + + + + + - £ - + £ + + + - + - - + + + - - £ - + + £ + + - - - - - - + + + + + + + + + + + - - £ - + + - + + + - - - - - - - £ - - - - - - - + + + - + + + + + + + + + - - + £ + + - - - - + + + - - - + £ + + - + + @@ -1652,168 +1796,94 @@ - - £ - - - - - - - - - - - - £ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - £ - - - - - - - - - - - - £ - - - - - - - - - - - - - - + - + + + + + - + + + + + + + + DM + + + - + + + DM + + + + + + DM + + + - + + + DM + + + + + + DM + + + + - + + + DM + + + + + + DM + + + + - + + + DM + + + + + + DM + + + + - + + + DM + + + + + + + + + - - - - - - - DM - - - - - - - DM - - - - - - DM - - - - - - - DM - - - - - - DM - - - - - - - - DM - - - - - - DM - - - - - - - - DM - - - - - - DM - - - - - - - - DM - - - - - - - - - - - - - - - - - + tan @@ -1821,75 +1891,75 @@ - - + + - - + + - - + + - - + + - + - - + + - - + + - + - - + - + - + - - + + - + - - + + - - + + - - + + - + - - + - + - + : @@ -1898,289 +1968,240 @@ - + : : - + - + - + - - - + + - + - + - + - - - + + - - + + - - + + - - + + - - + + - - + + - - - / - - / - - - - - - - - - - - - - - - - - - - - - - - - - - : - - - - - - - : - - : - - - - - - - : - - - - - : - - : - - / / - - - : - - - - - - - - ( - - ) - - - - - - - - - ( - - ) - - - - - - - - - ( - - - ) - - - - - - - - - - ( - - - ) - - - - - - - - - ( - - - ) - - - - - - - - - - ( - - - ) - - - - + + + - + + - + + + + - - + + + - + + + + + : + + + + + + + : + + : + + + + + + + : + + + : : - + + + / + + / + + + + : + + + + + + + + + ( + + ) + + + + + + + + + ( + + ) + + + + + + + + + ( + + + ) + + + + + + + + + + ( + + + ) + + + + + + + + + ( + + + ) + + + + + + + + + + ( + + + ) + + + + + - + + + + + : + + : + + + : - - + + - + ( - + ) - + - - + + - - + + % - - + + - - - - - - - - ( - - ) - - - - - - - - - - - - - - - - - - - - - - - ( - - ) - - - - - - - - - - - - - - - - + + - + ( - + ) - - - - - + + - @@ -2191,23 +2212,21 @@ - - + + - + ( - + ) - - - - - + + - @@ -2216,85 +2235,136 @@ - - + + + + - - + + + ( + + ) - - + + + - + + - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + ( + + ) + + + + + - + + + + + + + + + + + + - + - + - + - + - + - + - + - + - + - + + + + + + + + + + + + + + + + + + + + + + + + + . - + . - + - + : - + : @@ -2303,215 +2373,204 @@ - - - . - - . - - - - : - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + - - - + + - - + + - - - + + - - + + - - - + + - - + + - - - + + - + + + + + + - + + + + + + + + + + + - + + + + + + + + + + - + + + + + + + + + + + - + + + + + : : - + : - - + + - + - + - + - + - - + - + - + - + - + - - + - + - + - + - + - - + - + - + - + - + - - + - + - - - - - - - - - - - - - - - - - - - - - - - - - - : - - - - - - - : - - : - - - - - - - : - - - - - : - - : - - + + - + + - + + + + + - + + + + + - + + + + + : + + + + + + + : + + : + + + + + + + : + + + + + : + + : + + + - @@ -2522,140 +2581,140 @@ : - - + + - - + + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + - - + - - - + + + + - + + + + + + + + + - + + + + + + + + + + - + + + + + + + + + + - - - + + - - + - - - + + + - - - - + + + + - - - - + + + + - - - - + + + - - + - - - + + + - - - + + + - - - + + + - - - + + - - + - + - - - + + + - - - - + + + + - - - - + + + + - - - - + + + - - + - + - - - + + + - + @@ -2664,7 +2723,7 @@ - + @@ -2677,6 +2736,9 @@ + + + @@ -2714,10 +2776,7 @@ - - - - + @@ -2764,18 +2823,18 @@ - - + + - - - + + + - - - + + + @@ -2784,232 +2843,178 @@ - - + + - + - - + + - + - - - + + + + + + + + + + + + + + + + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - - - - - - - + + + + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + - + - + - + - - - - - - - - + - + - + - + - - + + - + - + - - - - + - - + + - - - - - - - - + - - - - + @@ -3017,40 +3022,34 @@ - - - - - + - + - + - - + + - - - - + + - + - + - + @@ -3070,50 +3069,50 @@ - + - + - + - + - + - + - + - + - + - + - + - + - + @@ -3123,43 +3122,53 @@ ??? + Page 1 + - ??? (???) + ???(???) - 00/00/0000, 00:00:00 + 00/00/0000, 00:00:00 + - Page 1 / 99 + Page 1/ 99 + + + + + + + @@ -3191,7 +3200,7 @@ - + Sheet @@ -3202,11 +3211,11 @@ Description - + 1 - + TRUE @@ -3223,48 +3232,23 @@ - + - - - - - - - - - - - - - - - - - - - - - + - + - + - - - - - @@ -3289,7 +3273,7 @@ - + Function @@ -3306,45 +3290,45 @@ Comment - + -5+12i - + - - + + - + - - - 0,0113717647601419+0,00723019299882505j + + + 0.0113717647601419+0.00723019299882505j - + TRUE - + =IMSECH("5+12j") - 0.011371764760142 + 0.0113717647601419 - 0.007230192998825 + 0.00723019299882505 - 0.011371764760142 + 0.0113717647601419 - - 0.007230192998825 + + 0.00723019299882505 TRUE @@ -3352,31 +3336,31 @@ TRUE - + -4+12i - + - - + + - + - - - 3,52532008581609 + + + 3.52532008581609 - + TRUE - + =IMSECH(COMPLEX(0,5)) @@ -3390,7 +3374,7 @@ 3.52532008581609 - + 0 @@ -3399,43 +3383,43 @@ TRUE - + -3+12i - + - - - + + + - + - - - 0,0113717647601419-0,00723019299882505i + + + 0.0113717647601419-0.00723019299882505i - + TRUE - + =IMSECH("-5+12i") - 0.011371764760142 + 0.0113717647601419 - -0.007230192998825 + -0.00723019299882505 - 0.011371764760142 + 0.0113717647601419 - - -0.007230192998825 + + -0.00723019299882505 TRUE @@ -3443,44 +3427,44 @@ TRUE - + -2+12i - + - - + + - + - - - 0,0113717647601419-0,00723019299882505i + + + 0.0113717647601419-0.00723019299882505i - - + + TRUE - + =IMSECH(N1) - 0.011371764760142 + 0.0113717647601419 - -0.007230192998825 + -0.00723019299882505 - 0.011371764760142 + 0.0113717647601419 - - -0.007230192998825 + + -0.00723019299882505 TRUE @@ -3488,44 +3472,44 @@ TRUE - + -1+12i - + - - + + - + - - - 0,0113717647601419-0,00723019299882505i + + + 0.0113717647601419-0.00723019299882505i - + TRUE - + {=IMSECH(N1:N12)} - 0.011371764760142 + 0.0113717647601419 - -0.007230192998825 + -0.00723019299882505 - 0.011371764760142 + 0.0113717647601419 - - -0.007230192998825 + + -0.00723019299882505 TRUE @@ -3533,29 +3517,29 @@ TRUE - + 0+12i - + - - + + - + - - - 0,0309130173129131-0,019643165464911i + + + 0.0309130173129131-0.019643165464911i - + TRUE - + {=IMSECH(N1:N12)} @@ -3567,9 +3551,9 @@ - 0.030913017312913 + 0.0309130173129131 - + -0.019643165464911 @@ -3578,44 +3562,44 @@ TRUE - + 1+12i - + - - + + - + - - - 0,0840570317615332-0,0531841822306235i + + + 0.0840570317615333-0.0531841822306235i - + TRUE - + {=IMSECH(N1:N12)} - 0.084057031761533 + 0.0840570317615332 -5.31841822306235E-002 - - 0.084057031761533 + + 0.0840570317615333 - - -0.053184182230624 + + -0.0531841822306235 TRUE @@ -3623,29 +3607,29 @@ TRUE - + 2+12i - + - - + + - + - - - 0,228955472418323-0,140346615592695i + + + 0.228955472418323-0.140346615592695i - + TRUE - + {=IMSECH(N1:N12)} @@ -3659,7 +3643,7 @@ 0.228955472418323 - + -0.140346615592695 @@ -3668,29 +3652,29 @@ TRUE - + 3+12i - + - - + + - + - - - 0,622082253088115-0,301254034403057i + + + 0.622082253088115-0.301254034403057i - - + + TRUE - + {=IMSECH(N1:N12)} @@ -3704,7 +3688,7 @@ 0.622082253088115 - + -0.301254034403057 @@ -3713,42 +3697,42 @@ TRUE - + 4+12i - + - + - + - - - 1,18503917609399 + + + 1.18503917609398 - - + + TRUE - + {=IMSECH(N1:N12)} - - 1.18503917609399 + + 1.18503917609398 0 - - 1.18503917609399 + + 1.18503917609398 - + 0 @@ -3757,27 +3741,27 @@ TRUE - + 5+12i - + - + - - - 0,622082253088115+0,301254034403057i + + + 0.622082253088115+0.301254034403057i - + TRUE - + {=IMSECH(N1:N12)} @@ -3791,7 +3775,7 @@ 0.622082253088115 - + 0.301254034403057 @@ -3800,26 +3784,26 @@ TRUE - + 6+12i - + - + - - - 0,228955472418323+0,140346615592695i + + + 0.228955472418323+0.140346615592695i - + TRUE - + {=IMSECH(N1:N12)} @@ -3833,7 +3817,7 @@ 0.228955472418323 - + 0.140346615592695 @@ -3842,39 +3826,39 @@ TRUE - + - + - + - - - 0,0840570317615332+0,0531841822306235i + + + 0.0840570317615333+0.0531841822306235i - + TRUE - + {=IMSECH(N1:N12)} - 0.084057031761533 + 0.0840570317615332 - 0.053184182230624 + 0.0531841822306235 - - 0.084057031761533 + + 0.0840570317615333 - - 0.053184182230624 + + 0.0531841822306235 TRUE @@ -3882,38 +3866,38 @@ TRUE - + - + - + - - - 0,0309130173129131+0,019643165464911i + + + 0.0309130173129131+0.019643165464911i - + TRUE - + {=IMSECH(N1:N12)} - 0.030913017312913 + 0.0309130173129131 0.019643165464911 - 0.030913017312913 + 0.0309130173129131 - + 0.019643165464911 @@ -3922,39 +3906,39 @@ TRUE - + - + - + - - - 0,0113717647601419+0,00723019299882505i + + + 0.0113717647601419+0.00723019299882505i - + TRUE - + {=IMSECH(N1:N12)} - 0.011371764760142 + 0.0113717647601419 - 0.007230192998825 + 0.00723019299882505 - 0.011371764760142 + 0.0113717647601419 - - 0.007230192998825 + + 0.00723019299882505 TRUE @@ -3962,39 +3946,39 @@ TRUE - + - + - + - - - 0,00418341357158393+0,00266003236738094i + + + 0.00418341357158393+0.00266003236738094i - + TRUE - + {=IMSECH(N1:N12)} - 0.004183413571584 + 0.00418341357158393 - 0.002660032367381 + 0.00266003236738094 - 0.004183413571584 + 0.00418341357158393 - - 0.002660032367381 + + 0.00266003236738094 TRUE @@ -4002,24 +3986,24 @@ TRUE - + - + - + - - - 1,85081571768093 + + + 1.85081571768093 - + TRUE - + =IMSECH("0-j") @@ -4033,7 +4017,7 @@ 1.85081571768093 - + 0 @@ -4042,38 +4026,38 @@ TRUE - + - + - + - - - 0,0366189934736865 + + + 0.0366189934736865 - + TRUE - + =IMSECH(4) - 0.036618993473687 + 0.0366189934736865 0 - 0.036618993473687 + 0.0366189934736865 - + 0 @@ -4082,39 +4066,39 @@ TRUE - + - + - + - - - -0,0362534969158689-0,00516434460775318i + + + -0.0362534969158689-0.00516434460775318i - + TRUE - + =IMSECH("4+3i") - -0.036253496915869 + -0.0362534969158689 - - -0.005164344607753 + + -0.00516434460775318 - -0.036253496915869 + -0.0362534969158689 - - -0.005164344607753 + + -0.00516434460775318 TRUE @@ -4122,1795 +4106,1591 @@ TRUE - + - + - + - + - - - - + + + - - + + - + - + - - + + - - - - + + + - - + + - + - + - - + + + + - - - + - + - + - + - - + + - - - - + + + - + - + - - + + - - - - + + + - + - + - - + + - - - + + - + - + - + - - + + - - - - + + + - + - + - - + + - - - - + + + - + - + - - + + - - - - + + + - + - + - - + + - - - - + + + - + - + - - + + - - - + + - + - + - + - - + + - - - - + + + - + - + - - + + - - - - + + + - + - + - - + + - - - + + - + - + - - + + - - - + + 58 - + - + - - + + - - - + + 59 - + - + - - + + - - - + + 60 - + - + - - + + - - - + + 61 - + - + - - + + - - - + + 62 - + - + - - + + - - - + + 63 - + - + - - + + - - - + + 64 - + - + - - + + - - - + + 65 - + - + - - + + - - - + + 66 - + - + - - + + - - - + + 67 - + - + - - + + - - - + + 68 - + - + - - + + - - - + + 69 - + - + - - + + - - - + + 70 - + - + - - + + - - - + + 71 - + - + - - + + - - - + + 72 - + - + - - + + - - - + + 73 - + - + - - + + - - - + + 74 - + - + - - + + - - - + + 75 - + - + - - + + - - - + + 76 - + - + - - + + - - - + + 77 - + - + - - + + - - - + + 78 - + - + - - + + - - - + + 79 - + - + - - + + - - - + + 80 - + - + - - + + - - - + + 81 - + - + - - + + - - - + + 82 - + - + - - + + - - - + + 83 - + - + - - + + - - - + + 84 - + - + - - + + - - - + + 85 - + - + - - + + - - - + + 86 - + - + - - + + - - - + + 87 - + - + - - + + - - - + + 88 - + - + - - + + - - - + + 89 - + - + - - + + - - - + + 90 - + - + - - + + - - - + + 91 - + - + - - + + - - - + + 92 - + - + - - + + - - - + + 93 - + - + - - - - - + + + + 94 - + - + - - - - - + + + + 95 - + - + - - + + - - - + + 96 - + - + - - + + - - - + + 97 - + - + - - + + - - - + + 98 - + - + - - + + - - - + + 99 - + - + - - + + - - - + + 100 - + - + - - + + - - - + + - + - + - - + + - - - + + - + - + - - + + - - - + + - + - + - - + + - - - + + - + - + - + - - - + + - + - + - + - - + + - + - + - + - - - + + - + - + - - - + + - - + - + - + - + - + - + - + - + 548 - + - + - + 549 - + - + - + 550 - + - + - + 551 - + - + - + 552 - + - + - + 553 - + - + - + 554 - + - + - + 555 - + - + - + 556 - + - + - + 557 - + - + - + 558 - + - + - + 559 - + - + - + 560 - + - + - + 561 - + - + - + 562 - + - + - + 563 - + - + - + 564 - + - + - + 565 - + - + - + 566 - + - + - + 567 - + - + - + 568 - + - + - + 569 - + - + - + 570 - + - + - + 571 - + - + - + 572 - + - + - + 573 - + - + - + 574 - + - + - + 575 - + - + - + 576 - + - + - + 577 - + - + - + 578 - + - + - + 579 - + - + - + 580 - + - + - + 581 - + - + - + 582 - + - + - + 583 - + - + - + 584 - + - + - + 585 - + - + - + 586 - + - + - + 587 - + - + - + 588 - + - + - + 589 - + - + - + 590 - + - + - + 591 - + - + - + 592 - + - + - + 593 - + - + - + 594 - + - + - + 595 - + - + - + 596 - + - + - + - + - + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/scaddins/source/analysis/analysishelper.cxx b/scaddins/source/analysis/analysishelper.cxx index 40d5f86b6542..c8c20fd79672 100644 --- a/scaddins/source/analysis/analysishelper.cxx +++ b/scaddins/source/analysis/analysishelper.cxx @@ -27,6 +27,7 @@ #include #include #include +#include #include #include "analysisdefs.hxx" @@ -1591,9 +1592,8 @@ bool Complex::ParseString( const OUString& rStr, Complex& rCompl ) if( IsImagUnit( *pStr ) && rStr.getLength() == 1) { - rCompl.r = 0.0; - rCompl.i = 1.0; rCompl.c = *pStr; + rCompl.num = std::complex(0.0, 1.0); return true; } @@ -1613,8 +1613,7 @@ bool Complex::ParseString( const OUString& rStr, Complex& rCompl ) rCompl.c = pStr[ 1 ]; if( pStr[ 2 ] == 0 ) { - rCompl.r = f; - rCompl.i = ( *pStr == '+' )? 1.0 : -1.0; + rCompl.num = std::complex(f, ( *pStr == '+' )? 1.0 : -1.0); return true; } } @@ -1624,8 +1623,7 @@ bool Complex::ParseString( const OUString& rStr, Complex& rCompl ) pStr++; if( *pStr == 0 ) { - rCompl.r = r; - rCompl.i = f; + rCompl.num = std::complex(r, f); return true; } } @@ -1637,43 +1635,40 @@ bool Complex::ParseString( const OUString& rStr, Complex& rCompl ) pStr++; if( *pStr == 0 ) { - rCompl.i = f; - rCompl.r = 0.0; + rCompl.num = std::complex(0.0, f); return true; } break; case 0: // only real-part - rCompl.r = f; - rCompl.i = 0.0; + rCompl.num = std::complex(f, 0.0); return true; } return false; } - OUString Complex::GetString() const { - finiteOrThrow(r); - finiteOrThrow(i); + finiteOrThrow(num.real()); + finiteOrThrow(num.imag()); OUStringBuffer aRet; - bool bHasImag = i != 0.0; - bool bHasReal = !bHasImag || (r != 0.0); + bool bHasImag = num.imag() != 0.0; + bool bHasReal = !bHasImag || (num.real() != 0.0); if( bHasReal ) - aRet.append(::GetString( r, false )); + aRet.append(::GetString( num.real(), false )); if( bHasImag ) { - if( i == 1.0 ) + if( num.imag() == 1.0 ) { if( bHasReal ) aRet.append('+'); } - else if( i == -1.0 ) + else if( num.imag() == -1.0 ) aRet.append('-'); else - aRet.append(::GetString( i, bHasReal )); + aRet.append(::GetString( num.imag(), bHasReal )); aRet.append((c != 'j') ? 'i' : 'j'); } @@ -1683,139 +1678,65 @@ OUString Complex::GetString() const double Complex::Arg() const { - if( r == 0.0 && i == 0.0 ) + // Note: there are differing opinions on whether arg(0) should be 0 or undefined, we are treating it as undefined + if( num.real() == 0.0 && num.imag() == 0.0 ) throw lang::IllegalArgumentException(); - - double phi = acos( r / Abs() ); - - if( i < 0.0 ) - phi = -phi; - - return phi; + return std::arg(num); } void Complex::Power( double fPower ) { - if( r == 0.0 && i == 0.0 ) - { - if( fPower <= 0 ) - throw lang::IllegalArgumentException(); - r = i = 0.0; - return; - } - - double p, phi; - - p = Abs(); - - phi = acos( r / p ); - if( i < 0.0 ) - phi = -phi; - - p = pow( p, fPower ); - phi *= fPower; - - r = cos( phi ) * p; - i = sin( phi ) * p; + if( num.real() == 0.0 && num.imag() == 0.0 && fPower <= 0 ) + throw lang::IllegalArgumentException(); + num = std::pow(num, fPower); } void Complex::Sqrt() { - static const double fMultConst = M_SQRT1_2; - double p = Abs(); - double i_ = sqrt( p - r ) * fMultConst; - - r = sqrt( p + r ) * fMultConst; - i = ( i < 0.0 )? -i_ : i_; + num = std::sqrt(num); } void Complex::Sin() { - if( !::rtl::math::isValidArcArg( r ) ) + if( !::rtl::math::isValidArcArg( num.real() ) ) throw lang::IllegalArgumentException(); - - if( i ) - { - double r_; - - r_ = sin( r ) * cosh( i ); - i = cos( r ) * sinh( i ); - r = r_; - } - else - r = sin( r ); + num = std::sin(num); } void Complex::Cos() { - if( !::rtl::math::isValidArcArg( r ) ) + if( !::rtl::math::isValidArcArg( num.real() ) ) throw lang::IllegalArgumentException(); - - if( i ) - { - double r_; - - r_ = cos( r ) * cosh( i ); - i = -( sin( r ) * sinh( i ) ); - r = r_; - } - else - r = cos( r ); + num = std::cos(num); } void Complex::Div( const Complex& z ) { - if( z.r == 0 && z.i == 0 ) + if( z.num.real() == 0 && z.num.imag() == 0 ) throw lang::IllegalArgumentException(); - - double a1 = r; - double a2 = z.r; - double b1 = i; - double b2 = z.i; - - double f = 1.0 / ( a2 * a2 + b2 * b2 ); - - r = ( a1 * a2 + b1 * b2 ) * f; - i = ( a2 * b1 - a1 * b2 ) * f; - - if( !c ) c = z.c; + num = num / z.num; } void Complex::Exp() { - double fE = exp( r ); - r = fE * cos( i ); - i = fE * sin( i ); + num = std::exp(num); } - void Complex::Ln() { - if( r == 0.0 && i == 0.0 ) - throw lang::IllegalArgumentException(); - - double fAbs = Abs(); - bool bNegi = i < 0.0; - - i = acos( r / fAbs ); - - if( bNegi ) - i = -i; - - r = log( fAbs ); + num = std::log(num); } void Complex::Log10() { - Ln(); - Mult( M_LOG10E ); + num = std::log10(num); } @@ -1828,157 +1749,64 @@ void Complex::Log2() void Complex::Tan() { - if ( i ) - { - if( !::rtl::math::isValidArcArg( 2.0 * r ) ) - throw lang::IllegalArgumentException(); - double fScale =1.0 / ( cos( 2.0 * r ) + cosh( 2.0 * i )); - r = sin( 2.0 * r ) * fScale; - i = sinh( 2.0 * i ) * fScale; - } - else - { - if( !::rtl::math::isValidArcArg( r ) ) - throw lang::IllegalArgumentException(); - r = tan( r ); - } + // using 2.0 * num.real/imag as a precaution because a) this is what our previous implementation did and + // b) the std::complex implementation may use cos(2x) etc, see the comment in isValidArcArg for details + if ( ( num.imag() && !::rtl::math::isValidArcArg( 2.0 * num.real() ) ) + || ( !num.imag() && !::rtl::math::isValidArcArg( num.real() ) ) ) + throw lang::IllegalArgumentException(); + num = std::tan(num); } void Complex::Sec() { - if( i ) - { - if( !::rtl::math::isValidArcArg( 2 * r ) ) - throw lang::IllegalArgumentException(); - double fScale = 1.0 / (cosh( 2.0 * i) + cos ( 2.0 * r)); - double r_; - r_ = 2.0 * cos( r ) * cosh( i ) * fScale; - i = 2.0 * sin( r ) * sinh( i ) * fScale; - r = r_; - } - else - { - if( !::rtl::math::isValidArcArg( r ) ) - throw lang::IllegalArgumentException(); - r = 1.0 / cos( r ); - } + Cos(); + num = 1.0 / num; } void Complex::Csc() { - if( i ) - { - if( !::rtl::math::isValidArcArg( 2 * r ) ) - throw lang::IllegalArgumentException(); - double fScale = 1.0 / (cosh( 2.0 * i) - cos ( 2.0 * r)); - double r_; - r_ = 2.0 * sin( r ) * cosh( i ) * fScale; - i = -2.0 * cos( r ) * sinh( i ) * fScale; - r = r_; - } - else - { - if( !::rtl::math::isValidArcArg( r ) ) - throw lang::IllegalArgumentException(); - r = 1.0 / sin( r ); - } + Sin(); + num = 1.0 / num; } void Complex::Cot() { - if ( i ) - { - if( !::rtl::math::isValidArcArg( 2.0 * r ) ) - throw lang::IllegalArgumentException(); - double fScale =1.0 / ( cosh( 2.0 * i ) - cos( 2.0 * r ) ); - r = sin( 2.0 * r ) * fScale; - i = - ( sinh( 2.0 * i ) * fScale ); - } - else - { - if( !::rtl::math::isValidArcArg( r ) ) - throw lang::IllegalArgumentException(); - r = 1.0 / tan( r ); - } + + Tan(); + num = 1.0 / num; } void Complex::Sinh() { - if( !::rtl::math::isValidArcArg( r ) ) + if( !::rtl::math::isValidArcArg( num.imag() ) ) throw lang::IllegalArgumentException(); - - if( i ) - { - double r_; - r_ = sinh( r ) * cos( i ); - i = cosh( r ) * sin( i ); - r = r_; - } - else - r = sinh( r ); + num = std::sinh(num); } void Complex::Cosh() { - if( !::rtl::math::isValidArcArg( r ) ) + if( !::rtl::math::isValidArcArg( num.imag() ) ) throw lang::IllegalArgumentException(); - - if( i ) - { - double r_; - r_ = cosh( r ) * cos( i ); - i = sinh( r ) * sin( i ); - r = r_; - } - else - r = cosh( r ); + num = std::cosh(num); } void Complex::Sech() { - if ( i ) - { - if( !::rtl::math::isValidArcArg( 2.0 * r ) ) - throw lang::IllegalArgumentException(); - double fScale =1.0 / ( cosh( 2.0 * r ) + cos( 2.0 * i )); - double r_; - r_ = 2.0 * cosh( r ) * cos( i ) * fScale; - i = - (2.0 * sinh( r ) * sin( i ) * fScale ); - r = r_ ; - } - else - { - if( !::rtl::math::isValidArcArg( r ) ) - throw lang::IllegalArgumentException(); - r = 1.0 / cosh( r ); - } + Cosh(); + num = 1.0 / num; } void Complex::Csch() { - if ( i ) - { - if( !::rtl::math::isValidArcArg( 2.0 * r ) ) - throw lang::IllegalArgumentException(); - double fScale =1.0 / ( cosh( 2.0 * r ) - cos( 2.0 * i )); - double r_; - r_ = 2.0 * sinh( r ) * cos( i ) * fScale; - i = - ( 2.0 * cosh( r ) * sin( i ) * fScale ); - r = r_ ; - } - else - { - if( !::rtl::math::isValidArcArg( r ) ) - throw lang::IllegalArgumentException(); - r = 1.0 / sinh( r ); - } + Sinh(); + num = 1.0 / num; } diff --git a/scaddins/source/analysis/analysishelper.hxx b/scaddins/source/analysis/analysishelper.hxx index e1920046923c..2f3e673a175e 100644 --- a/scaddins/source/analysis/analysishelper.hxx +++ b/scaddins/source/analysis/analysishelper.hxx @@ -23,6 +23,7 @@ #include #include +#include #include #include @@ -380,8 +381,7 @@ public: class Complex { - double r; - double i; + std::complex num; sal_Unicode c; public: @@ -629,66 +629,59 @@ inline FDCategory FuncData::GetCategory() const inline Complex::Complex( double fReal, double fImag, sal_Unicode cC ) : - r( fReal ), i( fImag ), c( cC ) + c( cC ) { + num = std::complex(fReal, fImag); } inline double Complex::Real() const { - return r; + return num.real(); } inline double Complex::Imag() const { - return i; + return num.imag(); } inline double Complex::Abs() const { - return std::hypot(r, i); + return std::abs(num); } void Complex::Conjugate() { - i = -i; + num = std::conj(num); } inline void Complex::Mult( double f ) { - i *= f; - r *= f; + num = num * f; } inline void Complex::Mult( const Complex& rM ) { - double r_ = r; - double i_ = i; - - r = r_ * rM.r - i_ * rM.i; - i = r_ * rM.i + i_ * rM.r; - + num = num * rM.num; if( !c ) c = rM.c; } inline void Complex::Sub( const Complex& rC ) { - r -= rC.r; - i -= rC.i; + num = num - rC.num; if( !c ) c = rC.c; } inline void Complex::Add( const Complex& rAdd ) { - r += rAdd.r; - i += rAdd.i; + num = num + rAdd.num; if( !c ) c = rAdd.c; } From bd727654ec8cc339292072b42073e57d566cc220 Mon Sep 17 00:00:00 2001 From: Michael Stahl Date: Thu, 5 Dec 2024 12:22:14 +0100 Subject: [PATCH 012/133] tdf#159549 sw: fix ODF import of newly colliding Body Text styles Commit c83d241effbd09491e9f96d3e435ab91700f58b0 "tdf#154933 Rename "Text Body" para style to "Body Text"" introduced a regression when importing certain ODF documents, but the problem is actually pre-existing. What happens is that first the built-in "Text body" style is created, and then a non-built-in style with the same translated name as "Text body" is imported, and instead of creating a new style, the built-in one is found and used, and so its properties are overwritten. The root cause is that SwStyleNameMapper::FillProgName() and in particular SwStyleNameMapper::FillUIName() are defined poorly, ever since they were introduced in 2001 in commit 4fbc9dd48b7cebb304010e7337b1bbc3936c7923 It becomes obvious relatively quickly that the way style names work is that at the UNO API level, the "ProgName" (internal, non-localised) names are used, and at the core document level, the "UIName" (localised) names are used. This is in itself questionable - why is the translation from ProgName to UIName not done in the UI? - but also very expensive to change now. So then the UNO services are responsible for translating between ProgName and UIName. But the 2 functions don't do that properly; both need to check if the given name is a known ProgName *or* a known UIName, and rename it in case it collides with a known target name; also the 2 functions need to cancel each other out, not add " (user)" at the end in both directions. Fixing this causes numerous tests to fail, due to: 1. the UNO services calling themselves with already converted style names, which are then translated a second time, which fails now. (or calling the wrong function like SwXStyleFamily::getByIndex()) 2. many tests call the UNO API with UINames instead of ProgNames 3. somehow the writerfilter import is also changed, causing failures in e.g. testTdf113182 and testTdf104492 4. buggy code elsewhere (lcl_getUsedPageStyles()), problem similar to 1., for PageDescs 5. potentially more buggy code yet to be discovered (definitely table styles, forgot which test that was) So limit this fix for now to only paragraph styles, and don't do it in writerfilter import, now at least sw.check passes. Change-Id: I5cbdf3e174622e83f9af8787c3671b88c0e37bac Reviewed-on: https://gerrit.libreoffice.org/c/core/+/177858 Reviewed-by: Thorsten Behrens Tested-by: Jenkins --- sw/inc/SwStyleNameMapper.hxx | 2 +- sw/qa/extras/layout/layout3.cxx | 2 +- sw/qa/extras/ooxmlexport/ooxmlexport9.cxx | 4 +-- sw/qa/extras/ooxmlimport/ooxmlimport.cxx | 2 +- sw/qa/extras/rtfexport/rtfexport4.cxx | 3 +- sw/qa/extras/uiwriter/uiwriter2.cxx | 3 +- sw/source/core/doc/SwStyleNameMapper.cxx | 31 ++++++++++++++----- sw/source/core/unocore/unostyle.cxx | 37 +++++++++++++++-------- 8 files changed, 55 insertions(+), 29 deletions(-) diff --git a/sw/inc/SwStyleNameMapper.hxx b/sw/inc/SwStyleNameMapper.hxx index 0fdfb381711a..4a3b0f1a582b 100644 --- a/sw/inc/SwStyleNameMapper.hxx +++ b/sw/inc/SwStyleNameMapper.hxx @@ -89,7 +89,7 @@ public: // This gets the UI Name from the programmatic name static const OUString& GetUIName(const OUString& rName, SwGetPoolIdFromName); static void FillUIName(const OUString& rName, OUString& rFillName, - SwGetPoolIdFromName); + SwGetPoolIdFromName, bool bBugfix = false); // Get the programmatic Name from the UI name static const OUString& GetProgName(const OUString& rName, diff --git a/sw/qa/extras/layout/layout3.cxx b/sw/qa/extras/layout/layout3.cxx index ef5e948d5abf..af6dac583f29 100644 --- a/sw/qa/extras/layout/layout3.cxx +++ b/sw/qa/extras/layout/layout3.cxx @@ -794,7 +794,7 @@ CPPUNIT_TEST_FIXTURE(SwLayoutWriter3, testTdf155177) createSwDoc("tdf155177-1-min.odt"); uno::Reference xStyle( - getStyles(u"ParagraphStyles"_ustr)->getByName(u"Body Text"_ustr), uno::UNO_QUERY_THROW); + getStyles(u"ParagraphStyles"_ustr)->getByName(u"Text body"_ustr), uno::UNO_QUERY_THROW); CPPUNIT_ASSERT_EQUAL(sal_Int32(210), getProperty(xStyle, u"ParaTopMargin"_ustr)); { diff --git a/sw/qa/extras/ooxmlexport/ooxmlexport9.cxx b/sw/qa/extras/ooxmlexport/ooxmlexport9.cxx index bf12d0178b62..c3e18bfbae48 100644 --- a/sw/qa/extras/ooxmlexport/ooxmlexport9.cxx +++ b/sw/qa/extras/ooxmlexport/ooxmlexport9.cxx @@ -481,7 +481,7 @@ DECLARE_OOXMLEXPORT_TEST(testKern, "kern.docx") // This failed: kerning was also enabled for the second paragraph. CPPUNIT_ASSERT(!getProperty(getRun(getParagraph(2), 1), u"CharAutoKerning"_ustr)); - uno::Reference xStyle(getStyles(u"ParagraphStyles"_ustr)->getByName(u"Default Paragraph Style"_ustr), uno::UNO_QUERY); + uno::Reference xStyle(getStyles(u"ParagraphStyles"_ustr)->getByName(u"Standard"_ustr), uno::UNO_QUERY); //tdf107801: kerning normally isn't enabled by default for .docx CPPUNIT_ASSERT_EQUAL_MESSAGE("AutoKern should be false", false, getProperty(xStyle, u"CharAutoKerning"_ustr)); } @@ -491,7 +491,7 @@ DECLARE_OOXMLEXPORT_TEST(testTdf89377, "tdf89377_tableWithBreakBeforeParaStyle.d // the paragraph style should set table's text-flow break-before-page CPPUNIT_ASSERT_EQUAL( 3, getPages() ); - uno::Reference xStyle(getStyles(u"ParagraphStyles"_ustr)->getByName(u"Default Paragraph Style"_ustr), uno::UNO_QUERY); + uno::Reference xStyle(getStyles(u"ParagraphStyles"_ustr)->getByName(u"Standard"_ustr), uno::UNO_QUERY); //tdf107801: kerning info wasn't exported previously. CPPUNIT_ASSERT_EQUAL_MESSAGE("AutoKern should be true", true, getProperty(xStyle, u"CharAutoKerning"_ustr)); } diff --git a/sw/qa/extras/ooxmlimport/ooxmlimport.cxx b/sw/qa/extras/ooxmlimport/ooxmlimport.cxx index a30a29d397d7..13490dff0ffe 100644 --- a/sw/qa/extras/ooxmlimport/ooxmlimport.cxx +++ b/sw/qa/extras/ooxmlimport/ooxmlimport.cxx @@ -734,7 +734,7 @@ CPPUNIT_TEST_FIXTURE(Test, testN820504) uno::Reference xFamiliesSupplier(mxComponent, uno::UNO_QUERY); uno::Reference xFamiliesAccess = xFamiliesSupplier->getStyleFamilies(); uno::Reference xStylesAccess(xFamiliesAccess->getByName(u"ParagraphStyles"_ustr), uno::UNO_QUERY); - uno::Reference xStyle(xStylesAccess->getByName(u"Default Paragraph Style"_ustr), uno::UNO_QUERY); + uno::Reference xStyle(xStylesAccess->getByName(u"Standard"_ustr), uno::UNO_QUERY); // The problem was that the CharColor was set to AUTO (-1) even if we have some default char color set CPPUNIT_ASSERT_EQUAL(Color(0x3da7bb), getProperty(xStyle, u"CharColor"_ustr)); diff --git a/sw/qa/extras/rtfexport/rtfexport4.cxx b/sw/qa/extras/rtfexport/rtfexport4.cxx index 29e3d4201860..adc6c8d0aa89 100644 --- a/sw/qa/extras/rtfexport/rtfexport4.cxx +++ b/sw/qa/extras/rtfexport/rtfexport4.cxx @@ -681,8 +681,7 @@ CPPUNIT_TEST_FIXTURE(Test, testTdf136587_noStyleName) getProperty(xStyleProps, u"ParaAdjust"_ustr)); // The problem was that the default style wasn't imported at all, so the fontsize was only 12. - xStyleProps.set(paragraphStyles->getByName(u"Default Paragraph Style"_ustr), - uno::UNO_QUERY_THROW); + xStyleProps.set(paragraphStyles->getByName(u"Standard"_ustr), uno::UNO_QUERY_THROW); CPPUNIT_ASSERT_EQUAL(32.0f, getProperty(xStyleProps, u"CharHeight"_ustr)); }; createSwDoc("tdf136587_noStyleName.rtf"); diff --git a/sw/qa/extras/uiwriter/uiwriter2.cxx b/sw/qa/extras/uiwriter/uiwriter2.cxx index 59320a62709d..b70fea7ce62a 100644 --- a/sw/qa/extras/uiwriter/uiwriter2.cxx +++ b/sw/qa/extras/uiwriter/uiwriter2.cxx @@ -2578,8 +2578,7 @@ CPPUNIT_TEST_FIXTURE(SwUiWriterTest2, testRTLparaStyle_LocaleArabic) saveAndReload(u"Office Open XML Text"_ustr); uno::Reference xPageStyle( - getStyles(u"ParagraphStyles"_ustr)->getByName(u"Default Paragraph Style"_ustr), - uno::UNO_QUERY_THROW); + getStyles(u"ParagraphStyles"_ustr)->getByName(u"Standard"_ustr), uno::UNO_QUERY_THROW); // Test the text Direction value for the -none- based paragraph styles CPPUNIT_ASSERT_EQUAL_MESSAGE("RTL Writing Mode", sal_Int32(1), getProperty(xPageStyle, u"WritingMode"_ustr)); diff --git a/sw/source/core/doc/SwStyleNameMapper.cxx b/sw/source/core/doc/SwStyleNameMapper.cxx index b047782a4221..554ab750fe49 100644 --- a/sw/source/core/doc/SwStyleNameMapper.cxx +++ b/sw/source/core/doc/SwStyleNameMapper.cxx @@ -263,10 +263,18 @@ void SwStyleNameMapper::FillProgName( rFillName = rName; if (nId == USHRT_MAX ) { - // It isn't ...make sure the suffix isn't already " (user)"...if it is, - // we need to add another one - if (lcl_SuffixIsUser(rFillName)) - rFillName += " (user)"; + if (eFlags == SwGetPoolIdFromName::TxtColl) + { + // check if it has a " (user)" suffix, if so remove it + lcl_CheckSuffixAndDelete(rFillName); + } + else // FIXME don't do this + { + // It isn't ...make sure the suffix isn't already " (user)"...if it is, + // we need to add another one + if (lcl_SuffixIsUser(rFillName)) + rFillName += " (user)"; + } } else { @@ -287,7 +295,7 @@ void SwStyleNameMapper::FillProgName( // Get the UI name from the programmatic name in rName and put it into rFillName void SwStyleNameMapper::FillUIName( const OUString& rName, OUString& rFillName, - SwGetPoolIdFromName const eFlags) + SwGetPoolIdFromName const eFlags, bool const bBugfix) { OUString aName = rName; if (eFlags == SwGetPoolIdFromName::ChrFmt && rName == "Standard") @@ -297,8 +305,17 @@ void SwStyleNameMapper::FillUIName( if ( nId == USHRT_MAX ) { rFillName = aName; - // aName isn't in our Prog name table...check if it has a " (user)" suffix, if so remove it - lcl_CheckSuffixAndDelete ( rFillName ); + if (eFlags != SwGetPoolIdFromName::TxtColl || // FIXME do it for all ids + !bBugfix || // TODO why does it change DOCX imports + GetPoolIdFromUIName(aName, eFlags) == USHRT_MAX) + { + // aName isn't in our Prog name table...check if it has a " (user)" suffix, if so remove it + lcl_CheckSuffixAndDelete(rFillName); + } + else + { + rFillName += " (user)"; + } } else { diff --git a/sw/source/core/unocore/unostyle.cxx b/sw/source/core/unocore/unostyle.cxx index 2dfb37aa7a12..67facb9fcf58 100644 --- a/sw/source/core/unocore/unostyle.cxx +++ b/sw/source/core/unocore/unostyle.cxx @@ -915,7 +915,7 @@ uno::Any SwXStyleFamily::getByIndex(sal_Int32 nIndex) OUString sStyleName; try { - SwStyleNameMapper::FillUIName(m_rEntry.translateIndex(nIndex), sStyleName); + SwStyleNameMapper::FillProgName(m_rEntry.translateIndex(nIndex), sStyleName); } catch(...) {} if (sStyleName.isEmpty()) GetCountOrName(&sStyleName, nIndex); @@ -957,7 +957,8 @@ rtl::Reference SwXStyleFamily::getStyleByName(const OUString& rNam { SolarMutexGuard aGuard; OUString sStyleName; - SwStyleNameMapper::FillUIName(rName, sStyleName, m_rEntry.poolId()); + SwStyleNameMapper::FillUIName(rName, sStyleName, m_rEntry.poolId(), + m_pDocShell && !m_pDocShell->GetDoc()->IsInWriterfilterImport()); if(!m_pBasePool) throw uno::RuntimeException(); SfxStyleSheetBase* pBase = m_pBasePool->Find(sStyleName, m_rEntry.family()); @@ -1012,7 +1013,8 @@ sal_Bool SwXStyleFamily::hasByName(const OUString& rName) if(!m_pBasePool) throw uno::RuntimeException(); OUString sStyleName; - SwStyleNameMapper::FillUIName(rName, sStyleName, m_rEntry.poolId()); + SwStyleNameMapper::FillUIName(rName, sStyleName, m_rEntry.poolId(), + m_pDocShell && !m_pDocShell->GetDoc()->IsInWriterfilterImport()); SfxStyleSheetBase* pBase = m_pBasePool->Find(sStyleName, m_rEntry.family()); return nullptr != pBase; } @@ -1023,7 +1025,8 @@ void SwXStyleFamily::insertStyleByName(const OUString& rName, const rtl::Referen if(!m_pBasePool) throw uno::RuntimeException(); OUString sStyleName; - SwStyleNameMapper::FillUIName(rName, sStyleName, m_rEntry.poolId()); + SwStyleNameMapper::FillUIName(rName, sStyleName, m_rEntry.poolId(), + m_pDocShell && !m_pDocShell->GetDoc()->IsInWriterfilterImport()); SfxStyleSheetBase* pBase = m_pBasePool->Find(sStyleName, m_rEntry.family()); if (pBase) throw container::ElementExistException(); @@ -1036,7 +1039,8 @@ void SwXStyleFamily::insertByName(const OUString& rName, const uno::Any& rElemen if(!m_pBasePool) throw uno::RuntimeException(); OUString sStyleName; - SwStyleNameMapper::FillUIName(rName, sStyleName, m_rEntry.poolId()); + SwStyleNameMapper::FillUIName(rName, sStyleName, m_rEntry.poolId(), + m_pDocShell && !m_pDocShell->GetDoc()->IsInWriterfilterImport()); SfxStyleSheetBase* pBase = m_pBasePool->Find(sStyleName, m_rEntry.family()); if (pBase) throw container::ElementExistException(); @@ -1099,7 +1103,8 @@ void SwXStyleFamily::replaceByName(const OUString& rName, const uno::Any& rEleme if(!m_pBasePool) throw uno::RuntimeException(); OUString sStyleName; - SwStyleNameMapper::FillUIName(rName, sStyleName, m_rEntry.poolId()); + SwStyleNameMapper::FillUIName(rName, sStyleName, m_rEntry.poolId(), + m_pDocShell && !m_pDocShell->GetDoc()->IsInWriterfilterImport()); SfxStyleSheetBase* pBase = m_pBasePool->Find(sStyleName, m_rEntry.family()); // replacements only for userdefined styles if(!pBase) @@ -1160,7 +1165,8 @@ void SwXStyleFamily::removeByName(const OUString& rName) if(!m_pBasePool) throw uno::RuntimeException(); OUString sName; - SwStyleNameMapper::FillUIName(rName, sName, m_rEntry.poolId()); + SwStyleNameMapper::FillUIName(rName, sName, m_rEntry.poolId(), + m_pDocShell && !m_pDocShell->GetDoc()->IsInWriterfilterImport()); SfxStyleSheetBase* pBase = m_pBasePool->Find(sName, m_rEntry.family()); if(!pBase) throw container::NoSuchElementException(); @@ -1447,7 +1453,8 @@ void SwXStyle::setParentStyle(const OUString& rParentStyle) { SolarMutexGuard aGuard; OUString sParentStyle; - SwStyleNameMapper::FillUIName(rParentStyle, sParentStyle, lcl_GetSwEnumFromSfxEnum ( m_rEntry.family()) ); + SwStyleNameMapper::FillUIName(rParentStyle, sParentStyle, lcl_GetSwEnumFromSfxEnum ( m_rEntry.family()), + m_pDoc && !m_pDoc->IsInWriterfilterImport()); if(!m_pBasePool) { if(!m_bIsDescriptor) @@ -1455,7 +1462,7 @@ void SwXStyle::setParentStyle(const OUString& rParentStyle) m_sParentStyleName = sParentStyle; try { - const auto aAny = m_xStyleFamily->getByName(sParentStyle); + const auto aAny = m_xStyleFamily->getByName(rParentStyle); m_xStyleData = aAny.get(); } catch(...) @@ -1753,7 +1760,8 @@ void SwXStyle::SetPropertyValue(const SfxItemPropertyMapEnt return; const auto sValue(rValue.get()); OUString aString; - SwStyleNameMapper::FillUIName(sValue, aString, m_rEntry.poolId()); + SwStyleNameMapper::FillUIName(sValue, aString, m_rEntry.poolId(), + m_pDoc && !m_pDoc->IsInWriterfilterImport()); o_rStyleBase.getNewBase()->SetFollow(aString); } @@ -1767,7 +1775,8 @@ void SwXStyle::SetPropertyValue(const SfxItemPropertyMapEntry return; const auto sValue(rValue.get()); OUString aString; - SwStyleNameMapper::FillUIName(sValue, aString, m_rEntry.poolId()); + SwStyleNameMapper::FillUIName(sValue, aString, m_rEntry.poolId(), + m_pDoc && !m_pDoc->IsInWriterfilterImport()); o_rStyleBase.getNewBase()->SetLink(aString); } @@ -1849,7 +1858,8 @@ void SwXStyle::SetPropertyValue(const SfxItemPrope const OUString sValue(rNamedValue.Value.get()); // get UI style name from programmatic style name OUString aStyleName; - SwStyleNameMapper::FillUIName(sValue, aStyleName, lcl_GetSwEnumFromSfxEnum(m_rEntry.family())); + SwStyleNameMapper::FillUIName(sValue, aStyleName, lcl_GetSwEnumFromSfxEnum(m_rEntry.family()), + m_pDoc && !m_pDoc->IsInWriterfilterImport()); // check for correct context and style name const auto nIdx(GetCommandContextIndex(rNamedValue.Name)); @@ -1893,7 +1903,8 @@ void SwXStyle::SetPropertyValue(const SfxItemProperty aReg.SetWhich(SID_SWREGISTER_MODE); o_rStyleBase.GetItemSet().Put(aReg); OUString aString; - SwStyleNameMapper::FillUIName(sName, aString, SwGetPoolIdFromName::TxtColl); + SwStyleNameMapper::FillUIName(sName, aString, SwGetPoolIdFromName::TxtColl, + m_pDoc && !m_pDoc->IsInWriterfilterImport()); o_rStyleBase.GetItemSet().Put(SfxStringItem(SID_SWREGISTER_COLLECTION, aString ) ); } template<> From add6efb409fdc6d0c3f649a58f2607947669e18f Mon Sep 17 00:00:00 2001 From: Oliver Specht Date: Thu, 5 Dec 2024 15:34:18 +0100 Subject: [PATCH 013/133] tdf#160621 Variable field dialog size of value field The size of the value field is now set to 5 rows. Change-Id: I808ffbb64d71a0707857cf80d1c0b73419ac7b90 Reviewed-on: https://gerrit.libreoffice.org/c/core/+/177893 Tested-by: Jenkins Reviewed-by: Thorsten Behrens --- sw/source/ui/fldui/fldvar.cxx | 3 +++ 1 file changed, 3 insertions(+) diff --git a/sw/source/ui/fldui/fldvar.cxx b/sw/source/ui/fldui/fldvar.cxx index eaf1c52503c5..63593c9b3077 100644 --- a/sw/source/ui/fldui/fldvar.cxx +++ b/sw/source/ui/fldui/fldvar.cxx @@ -127,6 +127,9 @@ void SwFieldVarPage::Reset(const SfxItemSet* ) m_xTypeLB->set_size_request(nWidth, nHeight); m_xSelectionLB->set_size_request(nWidth, nHeight); m_xFormatLB->set_size_request(nWidth, nHeight/2); + auto size = m_xValueED->get_widget().get_size_request(); + m_xValueED->get_widget().set_size_request(size.getWidth(), + m_xValueED->get_widget().get_height_rows(5)); const SwField* pCurField = GetCurField(); assert(pCurField && " - instance missing!"); nTypeId = pCurField->GetTypeId(); From cd983f0af4d0d2a187e30f070bc96241d362302f Mon Sep 17 00:00:00 2001 From: Patrick Luby Date: Thu, 5 Dec 2024 17:51:33 -0500 Subject: [PATCH 014/133] Related: tdf#152703 Reuse existing CAMetalLayer to stop flicker When live resizing a window, replacing the CAMetalLayer with each resize event repaints the window's background which causes a noticeable flicker. So reuse any existing CAMetalLayer already assigned to the native view. Change-Id: I03bda5f0d40b84606b6602961e5f0d3b0dfcc6ba Reviewed-on: https://gerrit.libreoffice.org/c/core/+/177921 Tested-by: Jenkins Reviewed-by: Patrick Luby --- external/skia/macosmetal.patch.1 | 36 ++++++++++++++++++++++++++++---- 1 file changed, 32 insertions(+), 4 deletions(-) diff --git a/external/skia/macosmetal.patch.1 b/external/skia/macosmetal.patch.1 index fbf6962340fc..48f7a2400421 100644 --- a/external/skia/macosmetal.patch.1 +++ b/external/skia/macosmetal.patch.1 @@ -70,7 +70,32 @@ diff -ur skia.org/tools/window/mac/GaneshMetalWindowContext_mac.mm skia/tools/wi #import #import -@@ -65,8 +67,7 @@ +@@ -52,7 +54,23 @@ + + SkASSERT(nil != fMainView); + +- fMetalLayer = [CAMetalLayer layer]; ++ // Related: tdf#152703 Reuse existing CAMetalLayer to stop flicker ++ // When live resizing a window, replacing the CAMetalLayer with each ++ // resize event repaints the window's background which causes a ++ // noticeable flicker. So reuse any existing CAMetalLayer already ++ // assigned to the native view. ++ BOOL reuseMetalLayer = NO; ++ if (fMainView.wantsLayer) ++ { ++ CALayer *pLayer = fMainView.layer; ++ if (pLayer && [pLayer isKindOfClass:[CAMetalLayer class]]) ++ { ++ fMetalLayer = (__bridge CAMetalLayer*)pLayer; ++ reuseMetalLayer = YES; ++ } ++ } ++ if (!reuseMetalLayer) ++ fMetalLayer = [CAMetalLayer layer]; + fMetalLayer.device = fShared->fDevice.get(); + fMetalLayer.pixelFormat = MTLPixelFormatBGRA8Unorm; + +@@ -65,10 +83,10 @@ fMetalLayer.autoresizingMask = kCALayerHeightSizable | kCALayerWidthSizable; fMetalLayer.contentsGravity = kCAGravityTopLeft; fMetalLayer.magnificationFilter = kCAFilterNearest; @@ -78,9 +103,13 @@ diff -ur skia.org/tools/window/mac/GaneshMetalWindowContext_mac.mm skia/tools/wi - fMetalLayer.colorspace = cs.CGColorSpace; + fMetalLayer.colorspace = CGColorSpaceCreateWithName(kCGColorSpaceSRGB); - fMainView.layer = fMetalLayer; +- fMainView.layer = fMetalLayer; ++ if (!reuseMetalLayer) ++ fMainView.layer = fMetalLayer; fMainView.wantsLayer = YES; -@@ -85,6 +86,18 @@ + + return true; +@@ -85,6 +103,18 @@ fMetalLayer.drawableSize = backingSize; fMetalLayer.contentsScale = backingScaleFactor; @@ -114,4 +143,3 @@ diff -ur skia.org/tools/window/mac/MacWindowInfo.h skia/tools/window/mac/MacWind +SK_API void ResetBackingScaleFactor(); } // namespace skwindow - From 8203f31040e8f99196872e97456674d2f4a2bf83 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Szymon=20K=C5=82os?= Date: Thu, 12 Sep 2024 11:22:10 +0200 Subject: [PATCH 015/133] slideshow: use unified hash for animations and layers Change-Id: I98d048f933469a63295776f689e96ce84d0c4f49 Reviewed-on: https://gerrit.libreoffice.org/c/core/+/177969 Tested-by: Jenkins Reviewed-by: Miklos Vajna --- include/animations/animationnodehelper.hxx | 59 +++++++++++++++++++ sd/source/ui/inc/SlideshowLayerRenderer.hxx | 1 + sd/source/ui/tools/SlideshowLayerRenderer.cxx | 10 +++- sd/source/ui/unoidl/unomodel.cxx | 59 ++----------------- 4 files changed, 74 insertions(+), 55 deletions(-) diff --git a/include/animations/animationnodehelper.hxx b/include/animations/animationnodehelper.hxx index c23ab25c140f..8c79342c789b 100644 --- a/include/animations/animationnodehelper.hxx +++ b/include/animations/animationnodehelper.hxx @@ -19,12 +19,18 @@ #pragma once +#include +#include +#include +#include + #include #include #include #include #include #include +#include #include @@ -108,6 +114,59 @@ namespace anim return false; } + + inline css::uno::Reference getParagraphTarget( + const css::presentation::ParagraphTarget& pTarget) + { + try + { + css::uno::Reference xParaEnumAccess( + pTarget.Shape, css::uno::UNO_QUERY_THROW); + + css::uno::Reference xEnumeration( + xParaEnumAccess->createEnumeration(), + css::uno::UNO_SET_THROW); + sal_Int32 nParagraph = pTarget.Paragraph; + + while (xEnumeration->hasMoreElements()) + { + css::uno::Reference xRef( + xEnumeration->nextElement(), css::uno::UNO_QUERY); + if (nParagraph-- == 0) + return xRef; + } + } + catch (const css::uno::RuntimeException&) + { + SAL_WARN("animations", "getParagraphTarget"); + } + + css::uno::Reference xRef; + return xRef; + } + + inline void convertTarget(OStringBuffer& sTmp, const css::uno::Any& rTarget) + { + if (!rTarget.hasValue()) + return; + + css::uno::Reference xRef; + if (!(rTarget >>= xRef)) + { + if (auto pt = o3tl::tryAccess(rTarget)) + { + xRef = getParagraphTarget(*pt); + } + } + + SAL_WARN_IF(!xRef.is(), "animations", "convertTarget(), invalid target type!"); + if (xRef.is()) + { + const std::string aIdentifier(GetInterfaceHash(xRef)); + if (!aIdentifier.empty()) + sTmp.append(aIdentifier); + } + } } /* vim:set shiftwidth=4 softtabstop=4 expandtab: */ diff --git a/sd/source/ui/inc/SlideshowLayerRenderer.hxx b/sd/source/ui/inc/SlideshowLayerRenderer.hxx index b6397ddc9fb8..5cd590e920e7 100644 --- a/sd/source/ui/inc/SlideshowLayerRenderer.hxx +++ b/sd/source/ui/inc/SlideshowLayerRenderer.hxx @@ -48,6 +48,7 @@ struct RenderState std::unordered_set maObjectsDone; std::unordered_set maInAnimation; + std::map maAnimationTargetHash; std::map maInitiallyVisible; sal_Int32 mnIndex[static_cast(RenderStage::Count)] = { 0, 0, 0, 0 }; SdrObject* mpCurrentTarget = nullptr; diff --git a/sd/source/ui/tools/SlideshowLayerRenderer.cxx b/sd/source/ui/tools/SlideshowLayerRenderer.cxx index 96f9000e69ad..bf5e34a65a6a 100644 --- a/sd/source/ui/tools/SlideshowLayerRenderer.cxx +++ b/sd/source/ui/tools/SlideshowLayerRenderer.cxx @@ -290,6 +290,14 @@ void SlideshowLayerRenderer::setupAnimations() maRenderState.maInitiallyVisible[pObject] = bVisible; } + + if (aAny.hasValue()) + { + OStringBuffer sTmp; + anim::convertTarget(sTmp, aAny); + maRenderState.maAnimationTargetHash[pObject] + = static_cast(sTmp); + } } } } @@ -361,7 +369,7 @@ void SlideshowLayerRenderer::writeJSON(OString& rJsonMsg) aJsonWriter.put("type", "animated"); { auto aContentNode = aJsonWriter.startNode("content"); - aJsonWriter.put("hash", RenderState::getObjectHash(pObject)); + aJsonWriter.put("hash", maRenderState.maAnimationTargetHash.at(pObject)); aJsonWriter.put("initVisible", maRenderState.isObjectInitiallyVisible(pObject)); aJsonWriter.put("type", "bitmap"); writeContentNode(aJsonWriter); diff --git a/sd/source/ui/unoidl/unomodel.cxx b/sd/source/ui/unoidl/unomodel.cxx index 12953834614c..98cf5fcc3ce0 100644 --- a/sd/source/ui/unoidl/unomodel.cxx +++ b/sd/source/ui/unoidl/unomodel.cxx @@ -61,6 +61,8 @@ #include +#include + #include #include #include @@ -586,8 +588,6 @@ private: void exportAnimate(const Reference& xAnimate); void convertValue(XMLTokenEnum eAttributeName, OStringBuffer& sTmp, const Any& rValue) const; - static void convertTarget(OStringBuffer& sTmp, const Any& rTarget); - static Reference getParagraphTarget( const ParagraphTarget& pTarget ); void convertTiming(OStringBuffer& sTmp, const Any& rValue) const; private: @@ -965,55 +965,6 @@ void AnimationsExporter::exportNodeImpl(const Reference& xNode) } } -Reference AnimationsExporter::getParagraphTarget(const ParagraphTarget& pTarget) -{ - try - { - Reference xParaEnumAccess(pTarget.Shape, UNO_QUERY_THROW); - - Reference xEnumeration(xParaEnumAccess->createEnumeration(), - css::uno::UNO_SET_THROW); - sal_Int32 nParagraph = pTarget.Paragraph; - - while (xEnumeration->hasMoreElements()) - { - Reference xRef(xEnumeration->nextElement(), UNO_QUERY); - if (nParagraph-- == 0) - return xRef; - } - } - catch (const RuntimeException&) - { - TOOLS_WARN_EXCEPTION("sd", "AnimationsExporter::getParagraphTarget"); - } - - Reference xRef; - return xRef; -} - -void AnimationsExporter::convertTarget(OStringBuffer& sTmp, const Any& rTarget) -{ - if (!rTarget.hasValue()) - return; - - Reference xRef; - if (!(rTarget >>= xRef)) - { - if (auto pt = o3tl::tryAccess(rTarget)) - { - xRef = getParagraphTarget(*pt); - } - } - - SAL_WARN_IF(!xRef.is(), "sd", "AnimationsExporter::convertTarget(), invalid target type!"); - if (xRef.is()) - { - const std::string aIdentifier(GetInterfaceHash(xRef)); - if (!aIdentifier.empty()) - sTmp.append(aIdentifier); - } -} - void AnimationsExporter::convertTiming(OStringBuffer& sTmp, const Any& rValue) const { if (!rValue.hasValue()) @@ -1056,7 +1007,7 @@ void AnimationsExporter::convertTiming(OStringBuffer& sTmp, const Any& rValue) c { if (pEvent->Source.hasValue()) { - convertTarget(sTmp, pEvent->Source); + anim::convertTarget(sTmp, pEvent->Source); sTmp.append('.'); } @@ -1219,7 +1170,7 @@ void AnimationsExporter::exportContainer(const Reference& xConta Any aTemp(xIter->getTarget()); if (aTemp.hasValue()) { - convertTarget(sTmp, aTemp); + anim::convertTarget(sTmp, aTemp); mrWriter.put("targetElement", sTmp.makeStringAndClear()); } sal_Int16 nTemp = xIter->getSubItem(); @@ -1273,7 +1224,7 @@ void AnimationsExporter::exportAnimate(const Reference& xAnimate) Any aTemp(xAnimate->getTarget()); if (aTemp.hasValue()) { - convertTarget(sTmp, aTemp); + anim::convertTarget(sTmp, aTemp); mrWriter.put("targetElement", sTmp.makeStringAndClear()); } nTemp = xAnimate->getSubItem(); From 6fa141074beea30b68615764221a668f58bdf222 Mon Sep 17 00:00:00 2001 From: Mohamed Ali Date: Fri, 22 Nov 2024 13:46:01 +0200 Subject: [PATCH 016/133] tdf#145538 Use range based for loops Change-Id: Iee3052f2fcc693b78c32fbae581f22527d64ffbd Reviewed-on: https://gerrit.libreoffice.org/c/core/+/177082 Tested-by: Jenkins Reviewed-by: Hossein --- svx/source/table/tablelayouter.cxx | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/svx/source/table/tablelayouter.cxx b/svx/source/table/tablelayouter.cxx index 8756734ff288..e165f5219480 100644 --- a/svx/source/table/tablelayouter.cxx +++ b/svx/source/table/tablelayouter.cxx @@ -1048,10 +1048,10 @@ void TableLayouter::ResizeBorderLayout( BorderLineMap& rMap ) if( sal::static_int_cast(rMap.size()) != nColCount ) rMap.resize( nColCount ); - for( sal_Int32 nCol = 0; nCol < nColCount; nCol++ ) + for( auto& nCol : rMap ) { - if( sal::static_int_cast(rMap[nCol].size()) != nRowCount ) - rMap[nCol].resize( nRowCount ); + if( sal::static_int_cast(nCol.size()) != nRowCount ) + nCol.resize( nRowCount ); } } From 7bd7adc3387714a2c9e6e663271c7b20708168c4 Mon Sep 17 00:00:00 2001 From: Simon Chenery Date: Thu, 28 Nov 2024 20:43:19 +0100 Subject: [PATCH 017/133] tdf#145538: Use range based for loops Change-Id: I6f8539869b991c2c71044e1a18dba69641ffabe8 Reviewed-on: https://gerrit.libreoffice.org/c/core/+/177505 Tested-by: Jenkins Reviewed-by: Hossein --- sc/source/ui/docshell/docfunc.cxx | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/sc/source/ui/docshell/docfunc.cxx b/sc/source/ui/docshell/docfunc.cxx index d94763e9baba..e745b922315e 100644 --- a/sc/source/ui/docshell/docfunc.cxx +++ b/sc/source/ui/docshell/docfunc.cxx @@ -555,9 +555,8 @@ static void lcl_collectAllPredOrSuccRanges( return; ScRange const & rFrontRange = rSrcRanges.front(); ScDetectiveFunc aDetFunc(rDoc, rFrontRange.aStart.Tab()); - for (size_t i = 0, n = rSrcRanges.size(); i < n; ++i) + for (ScRange const & r : rSrcRanges) { - ScRange const & r = rSrcRanges[i]; if (bPred) { aDetFunc.GetAllPreds( From ae7900dd42a65aaf60df6b21b9ad511496b209d9 Mon Sep 17 00:00:00 2001 From: Miklos Vajna Date: Fri, 6 Dec 2024 14:09:28 +0100 Subject: [PATCH 018/133] tdf#164095 sw: fix missing top margin on paragraph after changing page style Open the bugdoc, go to the page after the section break, there is a top margin for the first paragraph there in Word, but not in Writer. This went wrong in commit abd90828cf101581a07b9d1c371a8c3156521e9f (tdf#160952 sw: ignore top margin of para on non-first pages with newer DOCX, 2024-05-14), where it seemed that all implicit and explicit page breaks want to ignore that top margin for the first paragraph. Turns out this is more complex: implicit breaks and page breaks should be followed by an ignore, but not paragraphs after "section break (next page)". So restore the margins for the RES_PAGEDESC, but continue to have them for RES_BREAK & implicit breaks. Change-Id: If1fcf3077b81a705d3587bdae422dcfa16f1c17c Reviewed-on: https://gerrit.libreoffice.org/c/core/+/177973 Tested-by: Jenkins Reviewed-by: Miklos Vajna --- sw/qa/core/layout/calcmove.cxx | 18 ++++++++++++++++++ .../ignore-top-margin-page-style-change.docx | Bin 0 -> 12243 bytes sw/source/core/layout/calcmove.cxx | 10 ++++++++++ 3 files changed, 28 insertions(+) create mode 100644 sw/qa/core/layout/data/ignore-top-margin-page-style-change.docx diff --git a/sw/qa/core/layout/calcmove.cxx b/sw/qa/core/layout/calcmove.cxx index 0fca693eca54..893d3fd89915 100644 --- a/sw/qa/core/layout/calcmove.cxx +++ b/sw/qa/core/layout/calcmove.cxx @@ -84,6 +84,24 @@ CPPUNIT_TEST_FIXTURE(Test, testIgnoreTopMarginFly) CPPUNIT_ASSERT_EQUAL(static_cast(4000), nParaTopMargin); } +CPPUNIT_TEST_FIXTURE(Test, testIgnoreTopMarginPageStyleChange) +{ + // Given a DOCX (>= Word 2013), section break (next page) between pages 2 and 3: + createSwDoc("ignore-top-margin-page-style-change.docx"); + + // When laying out that document: + xmlDocUniquePtr pXmlDoc = parseLayoutDump(); + + // Then make sure that the top margin is not ignored on page 3: + sal_Int32 nParaTopMargin + = getXPath(pXmlDoc, "/root/page[3]/body/txt/infos/prtBounds", "top").toInt32(); + // Without the accompanying fix in place, this test would have failed with: + // - Expected: 2000 + // - Actual : 0 + // i.e. the top margin was ignored, which is incorrect. + CPPUNIT_ASSERT_EQUAL(static_cast(2000), nParaTopMargin); +} + CPPUNIT_TEST_FIXTURE(Test, testHideWhitespaceGrowingLastPage) { // Given a document with a full first page, then hiding whitespace: diff --git a/sw/qa/core/layout/data/ignore-top-margin-page-style-change.docx b/sw/qa/core/layout/data/ignore-top-margin-page-style-change.docx new file mode 100644 index 0000000000000000000000000000000000000000..ea7d16d8851fd50f4a7624ac079316cadbae3fda GIT binary patch literal 12243 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 NU;!9-wGetTextNodeForParaProps(); + if (pTextNode) + { + if (pTextNode->HasSwAttrSet() && pTextNode->GetSwAttrSet().HasItem(RES_PAGEDESC)) + { + return false; + } + } + return true; } From 59891cd3985469bc44dbd05c9fc704eeb07f0c78 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Caol=C3=A1n=20McNamara?= Date: Fri, 6 Dec 2024 14:41:19 +0000 Subject: [PATCH 019/133] look at 'embedded' protocols for protocols that support them MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Change-Id: Ie99f5f5a390639bdc69397c831e0a32594a5030c Reviewed-on: https://gerrit.libreoffice.org/c/core/+/177981 Tested-by: Jenkins Reviewed-by: Caolán McNamara --- tools/source/fsys/urlobj.cxx | 21 +++++++++++++++------ 1 file changed, 15 insertions(+), 6 deletions(-) diff --git a/tools/source/fsys/urlobj.cxx b/tools/source/fsys/urlobj.cxx index d09b0d547d7e..7c9b75a0650f 100644 --- a/tools/source/fsys/urlobj.cxx +++ b/tools/source/fsys/urlobj.cxx @@ -4889,12 +4889,21 @@ OUString INetURLObject::CutExtension() bool INetURLObject::IsExoticProtocol() const { - return m_eScheme == INetProtocol::Slot || - m_eScheme == INetProtocol::Macro || - m_eScheme == INetProtocol::Uno || - m_eScheme == INetProtocol::VndSunStarExpand || - isSchemeEqualTo(u"vnd.sun.star.script") || - isSchemeEqualTo(u"service"); + if (m_eScheme == INetProtocol::Slot || + m_eScheme == INetProtocol::Macro || + m_eScheme == INetProtocol::Uno || + m_eScheme == INetProtocol::VndSunStarExpand || + isSchemeEqualTo(u"vnd.sun.star.script") || + isSchemeEqualTo(u"service")) + { + return true; + } + if (isSchemeEqualTo(u"vnd.sun.star.pkg") || isSchemeEqualTo(u"vnd.sun.star.zip")) + { + OUString sPayloadURL = GetURLPath(INetURLObject::DecodeMechanism::WithCharset); + return sPayloadURL.startsWith(u"//") && INetURLObject(sPayloadURL.subView(2)).IsExoticProtocol(); + } + return false; } /* vim:set shiftwidth=4 softtabstop=4 expandtab: */ From cd8468bcba952ab9b0d6ca97152a63d7469a9209 Mon Sep 17 00:00:00 2001 From: Michael Stahl Date: Fri, 6 Dec 2024 14:10:32 +0100 Subject: [PATCH 020/133] sw: layout: ignore Keep-With-Next on hidden frames, part1 When a frame is hidden, don't consider it when evaluating keep-with-next attributes - this was the case for content in hidden sections before commit 0c96119895b347f8eb5bb89f393351bd3c02b9f1 ~SwFrameNotify() invalidating position of hidden frame with keep attribute causes layout loops. Also skip hidden frames in SwFlowFrame::IsKeepFwdMoveAllowed(), SwFlowFrame::CheckKeep(), SwFlowFrame::IsPrevObjMove(), SwFlowFrame::MoveBwd(), CalcContent(). Change-Id: I68556ba0a8e016d962399f3ce199e5eda0378867 Reviewed-on: https://gerrit.libreoffice.org/c/core/+/177975 Tested-by: Michael Stahl Reviewed-by: Michael Stahl --- sw/source/core/inc/flowfrm.hxx | 3 ++ sw/source/core/layout/flowfrm.cxx | 53 ++++++++++++++++++++++++++++--- sw/source/core/layout/fly.cxx | 5 +-- sw/source/core/layout/frmtool.cxx | 2 +- 4 files changed, 55 insertions(+), 8 deletions(-) diff --git a/sw/source/core/inc/flowfrm.hxx b/sw/source/core/inc/flowfrm.hxx index 154fd37febf2..c8ca0b55cd06 100644 --- a/sw/source/core/inc/flowfrm.hxx +++ b/sw/source/core/inc/flowfrm.hxx @@ -184,6 +184,9 @@ public: SvxFormatBreakItem const& rBreak, bool bBreakCheck = false ) const; + SwFrame * FindPrevIgnoreHidden() const; + SwFrame * FindNextIgnoreHidden() const; + bool HasLockedFollow() const; bool HasParaSpaceAtPages( bool bSct ) const; diff --git a/sw/source/core/layout/flowfrm.cxx b/sw/source/core/layout/flowfrm.cxx index 982fede3406b..e8ea2b197496 100644 --- a/sw/source/core/layout/flowfrm.cxx +++ b/sw/source/core/layout/flowfrm.cxx @@ -131,7 +131,9 @@ bool SwFlowFrame::IsKeepFwdMoveAllowed( bool bIgnoreMyOwnKeepValue ) if ( bIgnoreMyOwnKeepValue && pFrame->GetIndPrev() ) pFrame = pFrame->GetIndPrev(); do - { if ( pFrame->GetAttrSet()->GetKeep().GetValue() ) + { + if (pFrame->GetAttrSet()->GetKeep().GetValue() + || pFrame->IsHiddenNow()) pFrame = pFrame->GetIndPrev(); else return true; @@ -150,22 +152,42 @@ void SwFlowFrame::CheckKeep() // it's possible for the whole troop to move back. SwFrame *pPre = m_rThis.GetIndPrev(); assert(pPre); + while (pPre && pPre->IsHiddenNow()) + { + pPre = pPre->GetIndPrev(); + } + if (!pPre) + { + return; + } if( pPre->IsSctFrame() ) { SwFrame *pLast = static_cast(pPre)->FindLastContent(); + while (pLast && pLast->IsHiddenNow()) + { + pLast = pLast->GetIndPrev(); + } if( pLast && pLast->FindSctFrame() == pPre ) pPre = pLast; else return; } - SwFrame* pTmp; + SwFrame* pTmp{pPre}; bool bKeep; while ( (bKeep = pPre->GetAttrSet()->GetKeep().GetValue()) && - nullptr != ( pTmp = pPre->GetIndPrev() ) ) + nullptr != (pTmp = pTmp->GetIndPrev()) ) { + if (pTmp->IsHiddenNow()) + { + continue; + } if( pTmp->IsSctFrame() ) { SwFrame *pLast = static_cast(pTmp)->FindLastContent(); + while (pLast && pLast->IsHiddenNow()) + { + pLast = pLast->GetIndPrev(); + } if( pLast && pLast->FindSctFrame() == pTmp ) pTmp = pLast; else @@ -236,6 +258,7 @@ bool SwFlowFrame::IsKeep(SvxFormatKeepItem const& rKeep, SvxFormatBreakItem const& rBreak, bool const bCheckIfLastRowShouldKeep) const { + assert(!m_rThis.IsHiddenNow()); // check it before? // 1. The keep attribute is ignored inside footnotes // 2. For compatibility reasons, the keep attribute is // ignored for frames inside table cells @@ -338,6 +361,26 @@ bool SwFlowFrame::IsKeep(SvxFormatKeepItem const& rKeep, return bKeep; } +SwFrame * SwFlowFrame::FindPrevIgnoreHidden() const +{ + SwFrame * pRet{m_rThis.FindPrev()}; + while (pRet && pRet->IsHiddenNow()) + { + pRet = pRet->FindPrev(); + } + return pRet; +} + +SwFrame * SwFlowFrame::FindNextIgnoreHidden() const +{ + SwFrame * pRet{m_rThis.FindNext()}; + while (pRet && pRet->IsHiddenNow()) + { + pRet = pRet->FindNext(); + } + return pRet; +} + sal_uInt8 SwFlowFrame::BwdMoveNecessary( const SwPageFrame *pPage, const SwRect &rRect ) { // The return value helps deciding whether we need to flow back (3), @@ -1188,7 +1231,7 @@ bool SwFlowFrame::IsPrevObjMove() const if( pSh && pSh->GetViewOptions()->getBrowseMode() ) return false; - SwFrame *pPre = m_rThis.FindPrev(); + SwFrame *const pPre{FindPrevIgnoreHidden()}; if ( pPre && pPre->GetDrawObjs() ) { @@ -2616,7 +2659,7 @@ bool SwFlowFrame::MoveBwd( bool &rbReformat ) // keep with next frame and next frame is locked. // i#38232 - If next frame is a table, do *not* check, // if it's locked. - if ( pNewUpper && !IsFollow() && + if ( pNewUpper && !IsFollow() && !m_rThis.IsHiddenNow() && m_rThis.GetAttrSet()->GetKeep().GetValue() && m_rThis.GetIndNext() ) { SwFrame* pIndNext = m_rThis.GetIndNext(); diff --git a/sw/source/core/layout/fly.cxx b/sw/source/core/layout/fly.cxx index 8178a7e9e71d..a9a3ab1e07ca 100644 --- a/sw/source/core/layout/fly.cxx +++ b/sw/source/core/layout/fly.cxx @@ -1705,9 +1705,10 @@ void CalcContent( SwLayoutFrame *pLay, bool bNoColl ) // frame due to its keep-attribute, if it can't move forward. // #i57765# - do not consider invalid previous // frame, if current frame has a column/page break before attribute. - SwFrame* pTmpPrev = pFrame->FindPrev(); + assert(pFrame->IsFlowFrame()); + SwFlowFrame* pTmpFlowFrame = SwFlowFrame::CastFlowFrame(pFrame); + SwFrame* pTmpPrev = pTmpFlowFrame->FindPrevIgnoreHidden(); SwFlowFrame* pTmpPrevFlowFrame = pTmpPrev && pTmpPrev->IsFlowFrame() ? SwFlowFrame::CastFlowFrame(pTmpPrev) : nullptr; - SwFlowFrame* pTmpFlowFrame = pFrame->IsFlowFrame() ? SwFlowFrame::CastFlowFrame(pFrame) : nullptr; bool bPrevInvalid = pTmpPrevFlowFrame && pTmpFlowFrame && !pTmpFlowFrame->IsFollow() && diff --git a/sw/source/core/layout/frmtool.cxx b/sw/source/core/layout/frmtool.cxx index 7dadcfaa9cde..2f1963f456fa 100644 --- a/sw/source/core/layout/frmtool.cxx +++ b/sw/source/core/layout/frmtool.cxx @@ -155,7 +155,7 @@ void SwFrameNotify::ImplDestroy() { if ( mbInvaKeep ) { - SwFrame *pPre = mpFrame->FindPrev(); + SwFrame *pPre = pFlow->FindPrevIgnoreHidden(); if ( pPre && pPre->IsFlowFrame() ) { // 1. pPre wants to keep with me: From a08b8fa2d01e630ef876b7944c37f0b6de09d407 Mon Sep 17 00:00:00 2001 From: Michael Stahl Date: Fri, 6 Dec 2024 14:20:22 +0100 Subject: [PATCH 021/133] sw: layout: ignore Keep-With-Next on hidden frames, part2 SwFrame::PrepareMake(), SwContentFrame::MakeAll(), SwContentFrame::WouldFit_() Change-Id: I2a909ac6d147668dddece97bd99e31fdddcf20eb Reviewed-on: https://gerrit.libreoffice.org/c/core/+/177976 Tested-by: Michael Stahl Reviewed-by: Michael Stahl --- sw/source/core/layout/calcmove.cxx | 49 ++++++++++++++++++++++-------- 1 file changed, 36 insertions(+), 13 deletions(-) diff --git a/sw/source/core/layout/calcmove.cxx b/sw/source/core/layout/calcmove.cxx index 43b3c5d8afda..e05024d7f2b6 100644 --- a/sw/source/core/layout/calcmove.cxx +++ b/sw/source/core/layout/calcmove.cxx @@ -304,9 +304,17 @@ void SwFrame::PrepareMake(vcl::RenderContext* pRenderContext) // There is no format of previous frame, if current frame is a table // frame and its previous frame wants to keep with it. - const bool bFormatPrev = !bTab || - !GetPrev() || - !GetPrev()->GetAttrSet()->GetKeep().GetValue(); + bool bFormatPrev{!bTab}; + if (!bFormatPrev) + { + SwFrame const* pPrev{this}; + do + { + pPrev = pPrev->GetPrev(); + } + while (pPrev && pPrev->IsHiddenNow()); + bFormatPrev = pPrev && !pPrev->GetAttrSet()->GetKeep().GetValue(); + } if ( bFormatPrev ) { SwFrame *pFrame = GetUpper()->Lower(); @@ -1364,7 +1372,7 @@ void SwContentFrame::MakeAll(vcl::RenderContext* /*pRenderContext*/) oNotify->SetBordersJoinedWithPrev(); } - const bool bKeep = IsKeep(rAttrs.GetAttrSet().GetKeep(), GetBreakItem()); + const bool bKeep{!isHiddenNow && IsKeep(rAttrs.GetAttrSet().GetKeep(), GetBreakItem())}; std::unique_ptr pSaveFootnote; if ( bFootnote ) @@ -1780,7 +1788,7 @@ void SwContentFrame::MakeAll(vcl::RenderContext* /*pRenderContext*/) if( nBottomDist >= 0 ) { - if ( bKeep && bMoveable ) + if (bKeep && bMoveable && !isHiddenNow) { // We make sure the successor will be formatted the same. // This way, we keep control until (almost) everything is stable, @@ -2107,8 +2115,18 @@ bool SwContentFrame::WouldFit_( SwTwips nSpace, const SwFrame *pTmpPrev = pNewUpper->Lower(); if( pTmpPrev && pTmpPrev->IsFootnoteFrame() ) pTmpPrev = static_cast(pTmpPrev)->Lower(); - while ( pTmpPrev && pTmpPrev->GetNext() ) - pTmpPrev = pTmpPrev->GetNext(); + { + SwFrame const* pTmpNonHidden{pTmpPrev && pTmpPrev->IsHiddenNow() ? nullptr : pTmpPrev}; + while (pTmpPrev && pTmpPrev->GetNext()) + { + pTmpPrev = pTmpPrev->GetNext(); + if (!pTmpPrev->IsHiddenNow()) + { + pTmpNonHidden = pTmpPrev; + } + } + pTmpPrev = pTmpNonHidden; + } // tdf#156727 if the previous one has keep-with-next, ignore it on this one! bool const isIgnoreKeep(pTmpPrev && pTmpPrev->IsFlowFrame() @@ -2117,6 +2135,14 @@ bool SwContentFrame::WouldFit_( SwTwips nSpace, do { + if (pFrame->IsHiddenNow()) + { // shortcut + assert(pFrame == this); + bRet = true; + pFrame = nullptr; + break; + } + // #i46181# SwTwips nSecondCheck = 0; SwTwips nOldSpace = nSpace; @@ -2282,8 +2308,8 @@ bool SwContentFrame::WouldFit_( SwTwips nSpace, return true; } } - SwFrame *pNxt; - if( nullptr != (pNxt = pFrame->FindNext()) && pNxt->IsContentFrame() && + SwFrame *const pNxt{pFrame->FindNextIgnoreHidden()}; + if (nullptr != pNxt && pNxt->IsContentFrame() && ( !pFootnoteFrame || ( pNxt->IsInFootnote() && pNxt->FindFootnoteFrame()->GetAttr() == pFootnoteFrame->GetAttr() ) ) ) { @@ -2309,10 +2335,7 @@ bool SwContentFrame::WouldFit_( SwTwips nSpace, pTmpPrev = nullptr; else { - if (pFrame->IsHiddenNow()) - pTmpPrev = lcl_NotHiddenPrev( pFrame ); - else - pTmpPrev = pFrame; + pTmpPrev = pFrame; } pFrame = static_cast(pNxt); } From afab0fa906a1bb9281378774586fe07193cba41d Mon Sep 17 00:00:00 2001 From: Michael Stahl Date: Fri, 6 Dec 2024 14:24:12 +0100 Subject: [PATCH 022/133] sw: layout: ignore Keep-With-Next on hidden frames, part3 SwTabFrame: :MakeAll(), SwRowFrame::ShouldRowKeepWithNext() Change-Id: I7cb6e558dc05736658a9bc75d6c735e6a47062b0 Reviewed-on: https://gerrit.libreoffice.org/c/core/+/177977 Reviewed-by: Michael Stahl Tested-by: Jenkins --- sw/source/core/layout/tabfrm.cxx | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/sw/source/core/layout/tabfrm.cxx b/sw/source/core/layout/tabfrm.cxx index c14ce2127a31..20755efa8d2c 100644 --- a/sw/source/core/layout/tabfrm.cxx +++ b/sw/source/core/layout/tabfrm.cxx @@ -2287,7 +2287,7 @@ void SwTabFrame::MakeAll(vcl::RenderContext* pRenderContext) && !pAttrs->GetAttrSet().GetKeep().GetValue() && AreAllRowsKeepWithNext(GetFirstNonHeadlineRow(), /*bCheckParents=*/false); // The beloved keep attribute - const bool bKeep = IsKeep(pAttrs->GetAttrSet().GetKeep(), GetBreakItem(), bEmulateTableKeep); + const bool bKeep{!isHiddenNow && IsKeep(pAttrs->GetAttrSet().GetKeep(), GetBreakItem(), bEmulateTableKeep)}; // Join follow table, if this table is not allowed to split: if ( bDontSplit ) @@ -2407,9 +2407,8 @@ void SwTabFrame::MakeAll(vcl::RenderContext* pRenderContext) } aNotify.SetLowersComplete( false ); } - SwFrame *pPre; - if ( bKeep || (nullptr != (pPre = FindPrev()) && - pPre->GetAttrSet()->GetKeep().GetValue()) ) + SwFrame const*const pPre{bKeep ? nullptr : FindPrevIgnoreHidden()}; + if (bKeep || (nullptr != pPre && pPre->GetAttrSet()->GetKeep().GetValue())) { m_bCalcLowers = true; } @@ -2764,7 +2763,8 @@ void SwTabFrame::MakeAll(vcl::RenderContext* pRenderContext) oAccess.emplace(SwFrame::GetCache(), this); pAttrs = oAccess->Get(); } - if (IsKeep(pAttrs->GetAttrSet().GetKeep(), GetBreakItem(), true) + if (!isHiddenNow + && IsKeep(pAttrs->GetAttrSet().GetKeep(), GetBreakItem(), true) && pLastRow->ShouldRowKeepWithNext()) { bFormat = true; @@ -5647,7 +5647,7 @@ bool SwRowFrame::ShouldRowKeepWithNext( const bool bCheckParents ) const const SwCellFrame* pCell = static_cast(Lower()); const SwFrame* pText = pCell->Lower(); - return pText && pText->IsTextFrame() && + return pText && pText->IsTextFrame() && !pText->IsHiddenNow() && static_cast(pText)->GetTextNodeForParaProps()->GetSwAttrSet().GetKeep(bCheckParents).GetValue(); } From a60617b1f2f1eca31177867e575bed57b1b448a3 Mon Sep 17 00:00:00 2001 From: Noel Grandin Date: Fri, 6 Dec 2024 15:29:07 +0200 Subject: [PATCH 023/133] tdf#163221 crash in dialog editor regression from commit 65d52af42f329bbe7c5e7d6ac617320f7faa4760 clang-tidy: performance-unnecessary-copy-initialization in svx Change-Id: I48428fe08acdf9590a533c7ea91abe905713b292 Reviewed-on: https://gerrit.libreoffice.org/c/core/+/177979 Tested-by: Jenkins Reviewed-by: Noel Grandin --- svx/source/svdraw/sdrhittesthelper.cxx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/svx/source/svdraw/sdrhittesthelper.cxx b/svx/source/svdraw/sdrhittesthelper.cxx index 94aad39e9b03..9dc3b9118f07 100644 --- a/svx/source/svdraw/sdrhittesthelper.cxx +++ b/svx/source/svdraw/sdrhittesthelper.cxx @@ -136,7 +136,7 @@ bool ViewObjectContactPrimitiveHit( // get primitive sequence sdr::contact::DisplayInfo aDisplayInfo; // have to make a copy of this container here, because it might be changed underneath us - const drawinglayer::primitive2d::Primitive2DContainer& aSequence(rVOC.getPrimitive2DSequence(aDisplayInfo)); + const drawinglayer::primitive2d::Primitive2DContainer aSequence(rVOC.getPrimitive2DSequence(aDisplayInfo)); if(!aSequence.empty()) { From f77bff02edc05a31164983d73408edf78b9989ac Mon Sep 17 00:00:00 2001 From: Sahil Gautam Date: Fri, 6 Dec 2024 16:24:42 +0530 Subject: [PATCH 024/133] remove unused header in vcl/settings.hxx Change-Id: I93ab70526cbbbcc690d45fd9dacf7e6e110e7e56 Reviewed-on: https://gerrit.libreoffice.org/c/core/+/177958 Tested-by: Jenkins Reviewed-by: Sahil Gautam --- include/vcl/settings.hxx | 2 -- 1 file changed, 2 deletions(-) diff --git a/include/vcl/settings.hxx b/include/vcl/settings.hxx index 401da27abf7d..aba70200b324 100644 --- a/include/vcl/settings.hxx +++ b/include/vcl/settings.hxx @@ -31,8 +31,6 @@ #include #include -#include - class BitmapEx; class LanguageTag; class SvtSysLocale; From 5a251b6f55a950bcd71fd8ab9a9f3e1c78a73292 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Caol=C3=A1n=20McNamara?= Date: Fri, 6 Dec 2024 16:57:26 +0000 Subject: [PATCH 025/133] crashtesting: failure to reimport forum-it-2308.odt rtf export MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Change-Id: I9908dea4aa822b7793ece91874de0282239bd17b Reviewed-on: https://gerrit.libreoffice.org/c/core/+/177988 Tested-by: Jenkins Reviewed-by: Caolán McNamara --- sw/source/filter/ww8/rtfattributeoutput.cxx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/sw/source/filter/ww8/rtfattributeoutput.cxx b/sw/source/filter/ww8/rtfattributeoutput.cxx index d2484c941825..cbb9fefb9b6f 100644 --- a/sw/source/filter/ww8/rtfattributeoutput.cxx +++ b/sw/source/filter/ww8/rtfattributeoutput.cxx @@ -2547,12 +2547,12 @@ void RtfAttributeOutput::OutputFlyFrame_Impl(const ww8::Frame& rFrame, const Poi else SAL_INFO("sw.rtf", __func__ << " unhandled form control: '" << xInfo->getImplementationName() << "'"); - m_aRun->append('}'); } } } m_aRun->append('}'); + m_aRun->append('}'); } break; case ww8::Frame::eOle: From a8727bba7d1220cfdc0e1d325ee4551d4c46e17a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Caol=C3=A1n=20McNamara?= Date: Sat, 30 Nov 2024 21:23:51 +0000 Subject: [PATCH 026/133] GetRootURL is always used to ctor a INetURLObject MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Change-Id: Ic532e92e20bfff75b6d68c670ce21b0157034bd5 Reviewed-on: https://gerrit.libreoffice.org/c/core/+/177596 Tested-by: Jenkins Reviewed-by: Caolán McNamara --- sfx2/source/doc/doctempl.cxx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/sfx2/source/doc/doctempl.cxx b/sfx2/source/doc/doctempl.cxx index 94ab4c527338..ce2a9e5214e1 100644 --- a/sfx2/source/doc/doctempl.cxx +++ b/sfx2/source/doc/doctempl.cxx @@ -213,7 +213,7 @@ public: bool GetTitleFromURL( const OUString& rURL, OUString& aTitle ); bool InsertRegion( std::unique_ptr pData, size_t nPos ); - const OUString& GetRootURL() const { return maRootURL; } + INetURLObject GetRootURL() const { return INetURLObject(maRootURL); } const uno::Reference< XDocumentTemplates >& getDocTemplates() const { return mxTemplates; } }; From 7292bc192ce511655fbfe361bc228bef6e9196a2 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Caol=C3=A1n=20McNamara?= Date: Fri, 6 Dec 2024 20:30:52 +0000 Subject: [PATCH 027/133] increase rtf2pdffuzzer max_len MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Change-Id: I99b48a7b38c8a53f6908137bfa3e4cee0231c4d9 Reviewed-on: https://gerrit.libreoffice.org/c/core/+/178015 Tested-by: Caolán McNamara Reviewed-by: Caolán McNamara --- vcl/workben/rtf2pdffuzzer.options | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/vcl/workben/rtf2pdffuzzer.options b/vcl/workben/rtf2pdffuzzer.options index 53a65b1e4d8b..3aef05154c81 100644 --- a/vcl/workben/rtf2pdffuzzer.options +++ b/vcl/workben/rtf2pdffuzzer.options @@ -1,3 +1,3 @@ [libfuzzer] -max_len = 2048 +max_len = 4096 dict = rtf.dict From 1eb5e365212c078025b9f315f9377b8d2bef8a25 Mon Sep 17 00:00:00 2001 From: Simon Chenery Date: Thu, 5 Dec 2024 19:00:21 +0100 Subject: [PATCH 028/133] tdf#163738 use insert function instead of for loop Change-Id: I57c1ec3e580f4df22852dfaf7c75019e12fe352c Reviewed-on: https://gerrit.libreoffice.org/c/core/+/177898 Tested-by: Jenkins Reviewed-by: Hossein --- basctl/source/basicide/breakpoint.cxx | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/basctl/source/basicide/breakpoint.cxx b/basctl/source/basicide/breakpoint.cxx index 0d0347ace228..7506d16609db 100644 --- a/basctl/source/basicide/breakpoint.cxx +++ b/basctl/source/basicide/breakpoint.cxx @@ -31,8 +31,7 @@ BreakPointList::BreakPointList() BreakPointList::BreakPointList(BreakPointList const & rList) { - for (size_t i = 0; i < rList.size(); ++i) - maBreakPoints.push_back( rList.at( i ) ); + maBreakPoints.insert(maBreakPoints.end(), rList.maBreakPoints.begin(), rList.maBreakPoints.end()); } BreakPointList::~BreakPointList() From 18b55add5e1b2da0905043d8043dd824e4bf7ca3 Mon Sep 17 00:00:00 2001 From: Bogdan Buzea Date: Sat, 23 Nov 2024 18:47:12 +0100 Subject: [PATCH 029/133] tdf#152299 - Remove unused define(s) from C/C++ files Change-Id: I54460a95759ab8e2073c8ecab4e37ff15193a4e9 Reviewed-on: https://gerrit.libreoffice.org/c/core/+/177176 Tested-by: Jenkins Reviewed-by: Simon Chenery Reviewed-by: Hossein --- sw/source/core/inc/layouter.hxx | 1 - 1 file changed, 1 deletion(-) diff --git a/sw/source/core/inc/layouter.hxx b/sw/source/core/inc/layouter.hxx index a3979cf4670a..aa2f91f59f64 100644 --- a/sw/source/core/inc/layouter.hxx +++ b/sw/source/core/inc/layouter.hxx @@ -38,7 +38,6 @@ class SwAnchoredObject; class SwFlowFrame; class SwLayoutFrame; -#define LOOP_PAGE 1 class SwLayouter { From 4b9bf0a2b9c0f2bcba1f4f8a7ba45f1e7672d77a Mon Sep 17 00:00:00 2001 From: Mike Kaganski Date: Mon, 2 Dec 2024 02:45:12 +0500 Subject: [PATCH 030/133] SfxLibraryContainer: use std::mutex, and pass it to NameContainer ... to avoid own mutexes in own name container implementation. Change-Id: I29ff6ef987154359c35d0628d529b0606ef08c5c Reviewed-on: https://gerrit.libreoffice.org/c/core/+/177637 Tested-by: Jenkins Reviewed-by: Mike Kaganski --- basic/source/inc/namecont.hxx | 90 ++++++---- basic/source/inc/scriptcont.hxx | 3 +- basic/source/uno/dlgcont.cxx | 3 +- basic/source/uno/namecont.cxx | 299 ++++++++++++++++++-------------- basic/source/uno/scriptcont.cxx | 36 ++-- 5 files changed, 246 insertions(+), 185 deletions(-) diff --git a/basic/source/inc/namecont.hxx b/basic/source/inc/namecont.hxx index 0f89538896b1..45246c8447f3 100644 --- a/basic/source/inc/namecont.hxx +++ b/basic/source/inc/namecont.hxx @@ -60,7 +60,6 @@ namespace basic { class NameContainer final { - std::mutex m_aMutex; cppu::OWeakObject& rOwner; std::unordered_map maMap; @@ -84,7 +83,8 @@ public: /// @throws css::lang::IllegalArgumentException /// @throws css::lang::WrappedTargetException /// @throws css::uno::RuntimeException - void insertNoCheck(const OUString& aName, const css::uno::Any& aElement); + void insertNoCheck(const OUString& aName, const css::uno::Any& aElement, + std::unique_lock& guard); // Methods XElementAccess css::uno::Type getElementType(); @@ -96,58 +96,65 @@ public: sal_Bool hasByName(const OUString& aName); // Methods XNameReplace - void replaceByName(const OUString& aName, const css::uno::Any& aElement); + void replaceByName(const OUString& aName, const css::uno::Any& aElement, + std::unique_lock& guard); // Methods XNameContainer - void insertByName(const OUString& aName, const css::uno::Any& aElement); - void removeByName(const OUString& Name); + void insertByName(const OUString& aName, const css::uno::Any& aElement, + std::unique_lock& guard); + void removeByName(const OUString& Name, std::unique_lock& guard); // Methods XContainer - void addContainerListener(const css::uno::Reference& xListener); - void removeContainerListener(const css::uno::Reference& xListener); + void addContainerListener( + const css::uno::Reference& xListener, + std::unique_lock& guard); + void removeContainerListener( + const css::uno::Reference& xListener, + std::unique_lock& guard); // Methods XChangesNotifier - void addChangesListener(const css::uno::Reference& xListener); - void removeChangesListener(const css::uno::Reference& xListener); + void addChangesListener(const css::uno::Reference& xListener, + std::unique_lock& guard); + void removeChangesListener(const css::uno::Reference& xListener, + std::unique_lock& guard); }; class ModifiableHelper { private: - ::comphelper::OInterfaceContainerHelper3 m_aModifyListeners; + comphelper::OInterfaceContainerHelper4 m_aModifyListeners; ::cppu::OWeakObject& m_rEventSource; bool mbModified; public: - ModifiableHelper( ::cppu::OWeakObject& _rEventSource, ::osl::Mutex& _rMutex ) - :m_aModifyListeners( _rMutex ) - ,m_rEventSource( _rEventSource ) + ModifiableHelper( ::cppu::OWeakObject& _rEventSource ) + :m_rEventSource( _rEventSource ) ,mbModified( false ) { } bool isModified() const { return mbModified; } - void setModified( bool _bModified ); + void setModified( bool _bModified, std::unique_lock& guard ); - void addModifyListener( const css::uno::Reference< css::util::XModifyListener >& _rxListener ) + void addModifyListener( const css::uno::Reference< css::util::XModifyListener >& _rxListener, std::unique_lock& guard ) { - m_aModifyListeners.addInterface( _rxListener ); + m_aModifyListeners.addInterface(guard, _rxListener); } - void removeModifyListener( const css::uno::Reference< css::util::XModifyListener >& _rxListener ) + void removeModifyListener( const css::uno::Reference< css::util::XModifyListener >& _rxListener, std::unique_lock& guard ) { - m_aModifyListeners.removeInterface( _rxListener ); + m_aModifyListeners.removeInterface(guard, _rxListener); } }; -typedef ::comphelper::OInterfaceContainerHelper3< +typedef comphelper::OInterfaceContainerHelper4< css::script::vba::XVBAScriptListener > VBAScriptListenerContainer; class SfxLibrary; -typedef ::cppu::WeakComponentImplHelper< +typedef comphelper::WeakComponentImplHelper< css::lang::XInitialization, css::script::XStorageBasedLibraryContainer, css::script::XLibraryContainerPassword, @@ -160,8 +167,7 @@ typedef ::cppu::WeakComponentImplHelper< css::beans::XPropertySet> SfxLibraryContainer_BASE; class SfxLibraryContainer - : public ::cppu::BaseMutex - , public SfxLibraryContainer_BASE + : public SfxLibraryContainer_BASE , public ::utl::OEventListenerAdapter { VBAScriptListenerContainer maVBAScriptListeners; @@ -226,9 +232,11 @@ protected: bool implLoadLibraryIndexFile( SfxLibrary* pLib, ::xmlscript::LibDescriptor& rLib, const css::uno::Reference< css::embed::XStorage >& xStorage, - const OUString& aIndexFileName ); + const OUString& aIndexFileName, + std::unique_lock& guard ); - void implImportLibDescriptor( SfxLibrary* pLib, ::xmlscript::LibDescriptor const & rLib ); + void implImportLibDescriptor(SfxLibrary* pLib, ::xmlscript::LibDescriptor const& rLib, + std::unique_lock& guard); // Methods to distinguish between different library types virtual rtl::Reference implCreateLibrary( const OUString& aName ) = 0; @@ -266,7 +274,8 @@ protected: /// @throws css::lang::WrappedTargetException /// @throws css::uno::RuntimeException virtual bool implLoadPasswordLibrary( SfxLibrary* pLib, const OUString& Name, - bool bVerifyPasswordOnly=false ); + bool bVerifyPasswordOnly, + std::unique_lock& guard ); virtual void onNewRootStorage() = 0; @@ -281,7 +290,8 @@ protected: OUString createAppLibraryFolder( SfxLibrary* pLib, std::u16string_view aName ); void init( const OUString& rInitialDocumentURL, - const css::uno::Reference< css::embed::XStorage >& _rxInitialStorage ); + const css::uno::Reference< css::embed::XStorage >& _rxInitialStorage, + std::unique_lock& guard ); virtual OUString getInfoFileName() const = 0; virtual OUString getOldInfoFileName() const = 0; @@ -303,20 +313,31 @@ protected: void storeLibraries_Impl( const css::uno::Reference< css::embed::XStorage >& xStorage, - bool bComplete ); + bool bComplete, + std::unique_lock& guard ); + + void initializeFromDocument( const css::uno::Reference< css::document::XStorageBasedDocument >& _rxDocument, + std::unique_lock& guard ); + + css::uno::Reference + createLibrary_Impl(const OUString& Name, std::unique_lock& guard); + css::uno::Reference + createLibraryLink_Impl(const OUString& Name, const OUString& StorageURL, sal_Bool ReadOnly, + std::unique_lock& guard); + void loadLibrary_Impl(const OUString& Name, std::unique_lock& guard); - void initializeFromDocument( const css::uno::Reference< css::document::XStorageBasedDocument >& _rxDocument ); // OEventListenerAdapter virtual void _disposing( const css::lang::EventObject& _rSource ) override; - // OComponentHelper - virtual void SAL_CALL disposing() override; + // WeakComponentImplHelperBase + virtual void disposing(std::unique_lock& guard) override; private: void init_Impl( const OUString& rInitialDocumentURL, - const css::uno::Reference< css::embed::XStorage >& _rxInitialStorage ); - void implScanExtensions(); + const css::uno::Reference< css::embed::XStorage >& _rxInitialStorage, + std::unique_lock& guard ); + void implScanExtensions(std::unique_lock& guard); static constexpr OUString sVBATextEncodingPropName = u"VBATextEncoding"_ustr; public: @@ -497,7 +518,7 @@ private: protected: bool implIsModified() const { return mbIsModified; } - void implSetModified( bool _bIsModified ); + void implSetModified(bool _bIsModified, std::unique_lock& guard); bool isPasswordProtected() const { return mbPasswordProtected; } private: @@ -510,7 +531,8 @@ private: void impl_checkLoaded(); private: - void impl_removeWithoutChecks( const OUString& _rElementName ); + void impl_removeWithoutChecks(const OUString& _rElementName, + std::unique_lock& guard); public: SfxLibrary( diff --git a/basic/source/inc/scriptcont.hxx b/basic/source/inc/scriptcont.hxx index 6d733876fdf4..38e62b3bfedc 100644 --- a/basic/source/inc/scriptcont.hxx +++ b/basic/source/inc/scriptcont.hxx @@ -70,7 +70,8 @@ class SfxScriptLibraryContainer final : public SfxLibraryContainer const css::uno::Reference< css::ucb::XSimpleFileAccess3 >& rToUseSFI, const css::uno::Reference< css::task::XInteractionHandler >& Handler ) override; virtual bool implLoadPasswordLibrary( SfxLibrary* pLib, const OUString& Name, - bool bVerifyPasswordOnly=false ) override; + bool bVerifyPasswordOnly, + std::unique_lock& guard ) override; virtual void onNewRootStorage() override; diff --git a/basic/source/uno/dlgcont.cxx b/basic/source/uno/dlgcont.cxx index 464645ff0c26..0402e9188ed0 100644 --- a/basic/source/uno/dlgcont.cxx +++ b/basic/source/uno/dlgcont.cxx @@ -34,6 +34,7 @@ #include #include #include +#include #include #include #include @@ -92,7 +93,7 @@ SfxDialogLibraryContainer::SfxDialogLibraryContainer() SfxDialogLibraryContainer::SfxDialogLibraryContainer( const uno::Reference< embed::XStorage >& xStorage ) { - init( OUString(), xStorage ); + init(OUString(), xStorage, o3tl::temporary(std::unique_lock(m_aMutex))); } // Methods to get library instances of the correct type diff --git a/basic/source/uno/namecont.cxx b/basic/source/uno/namecont.cxx index 337963ef97c1..45b95b654538 100644 --- a/basic/source/uno/namecont.cxx +++ b/basic/source/uno/namecont.cxx @@ -33,6 +33,7 @@ #include #include #include +#include #include #include #include @@ -133,7 +134,8 @@ sal_Bool NameContainer::hasByName( const OUString& aName ) // Methods XNameReplace -void NameContainer::replaceByName( const OUString& aName, const Any& aElement ) +void NameContainer::replaceByName(const OUString& aName, const Any& aElement, + std::unique_lock& guard) { const Type& aAnyType = aElement.getValueType(); if( mType != aAnyType ) @@ -148,33 +150,32 @@ void NameContainer::replaceByName( const OUString& aName, const Any& aElement ) Any aOldElement = aIt->second; aIt->second = aElement; - std::unique_lock aGuard(m_aMutex); - // Fire event - if( maContainerListeners.getLength(aGuard) > 0 ) + if (maContainerListeners.getLength(guard) > 0) { ContainerEvent aEvent; aEvent.Source = mpxEventSource; aEvent.Accessor <<= aName; aEvent.Element = aElement; aEvent.ReplacedElement = aOldElement; - maContainerListeners.notifyEach( aGuard, &XContainerListener::elementReplaced, aEvent ); + maContainerListeners.notifyEach(guard, &XContainerListener::elementReplaced, aEvent); } /* After the container event has been fired (one listener will update the core Basic manager), fire change event. Listeners can rely on that the Basic source code of the core Basic manager is up-to-date. */ - if( maChangesListeners.getLength(aGuard) > 0 ) + if (maChangesListeners.getLength(guard) > 0) { ChangesEvent aEvent; aEvent.Source = mpxEventSource; aEvent.Base <<= aEvent.Source; aEvent.Changes = { { Any(aName), aElement, aOldElement } }; - maChangesListeners.notifyEach( aGuard, &XChangesListener::changesOccurred, aEvent ); + maChangesListeners.notifyEach(guard, &XChangesListener::changesOccurred, aEvent); } } -void NameContainer::insertNoCheck(const OUString& aName, const Any& aElement) +void NameContainer::insertNoCheck(const OUString& aName, const Any& aElement, + std::unique_lock& guard) { const Type& aAnyType = aElement.getValueType(); if( mType != aAnyType ) @@ -184,40 +185,39 @@ void NameContainer::insertNoCheck(const OUString& aName, const Any& aElement) maMap[aName] = aElement; - std::unique_lock aGuard(m_aMutex); - // Fire event - if( maContainerListeners.getLength(aGuard) > 0 ) + if (maContainerListeners.getLength(guard) > 0) { ContainerEvent aEvent; aEvent.Source = mpxEventSource; aEvent.Accessor <<= aName; aEvent.Element = aElement; - maContainerListeners.notifyEach( aGuard, &XContainerListener::elementInserted, aEvent ); + maContainerListeners.notifyEach(guard, &XContainerListener::elementInserted, aEvent); } /* After the container event has been fired (one listener will update the core Basic manager), fire change event. Listeners can rely on that the Basic source code of the core Basic manager is up-to-date. */ - if( maChangesListeners.getLength(aGuard) > 0 ) + if (maChangesListeners.getLength(guard) > 0) { ChangesEvent aEvent; aEvent.Source = mpxEventSource; aEvent.Base <<= aEvent.Source; aEvent.Changes = { { Any(aName), aElement, {} } }; - maChangesListeners.notifyEach( aGuard, &XChangesListener::changesOccurred, aEvent ); + maChangesListeners.notifyEach(guard, &XChangesListener::changesOccurred, aEvent); } } // Methods XNameContainer -void NameContainer::insertByName( const OUString& aName, const Any& aElement ) +void NameContainer::insertByName(const OUString& aName, const Any& aElement, + std::unique_lock& guard) { if (hasByName(aName)) throw ElementExistException(aName); - insertNoCheck(aName, aElement); + insertNoCheck(aName, aElement, guard); } -void NameContainer::removeByName( const OUString& aName ) +void NameContainer::removeByName(const OUString& aName, std::unique_lock& guard) { auto aIt = maMap.find(aName); if (aIt == maMap.end()) @@ -228,22 +228,20 @@ void NameContainer::removeByName( const OUString& aName ) Any aOldElement = aIt->second; maMap.erase(aIt); - std::unique_lock aGuard(m_aMutex); - // Fire event - if( maContainerListeners.getLength(aGuard) > 0 ) + if (maContainerListeners.getLength(guard) > 0) { ContainerEvent aEvent; aEvent.Source = mpxEventSource; aEvent.Accessor <<= aName; aEvent.Element = aOldElement; - maContainerListeners.notifyEach( aGuard, &XContainerListener::elementRemoved, aEvent ); + maContainerListeners.notifyEach(guard, &XContainerListener::elementRemoved, aEvent); } /* After the container event has been fired (one listener will update the core Basic manager), fire change event. Listeners can rely on that the Basic source code of the core Basic manager is up-to-date. */ - if( maChangesListeners.getLength(aGuard) > 0 ) + if (maChangesListeners.getLength(guard) > 0) { ChangesEvent aEvent; aEvent.Source = mpxEventSource; @@ -251,57 +249,57 @@ void NameContainer::removeByName( const OUString& aName ) aEvent.Changes = { { Any(aName), {}, // Element remains empty (meaning "replaced with nothing") aOldElement } }; - maChangesListeners.notifyEach( aGuard, &XChangesListener::changesOccurred, aEvent ); + maChangesListeners.notifyEach(guard, &XChangesListener::changesOccurred, aEvent); } } // Methods XContainer -void NameContainer::addContainerListener(const Reference& xListener) +void NameContainer::addContainerListener(const Reference& xListener, + std::unique_lock& guard) { if( !xListener.is() ) { throw RuntimeException(u"addContainerListener called with null xListener"_ustr,rOwner); } - std::unique_lock aGuard(m_aMutex); - maContainerListeners.addInterface( aGuard, xListener ); + maContainerListeners.addInterface(guard, xListener); } -void NameContainer::removeContainerListener(const Reference& xListener) +void NameContainer::removeContainerListener(const Reference& xListener, + std::unique_lock& guard) { if( !xListener.is() ) { throw RuntimeException(u"removeContainerListener called with null xListener"_ustr,rOwner); } - std::unique_lock aGuard(m_aMutex); - maContainerListeners.removeInterface( aGuard, xListener ); + maContainerListeners.removeInterface(guard, xListener); } // Methods XChangesNotifier -void NameContainer::addChangesListener(const Reference& xListener) +void NameContainer::addChangesListener(const Reference& xListener, + std::unique_lock& guard) { if( !xListener.is() ) { throw RuntimeException(u"addChangesListener called with null xListener"_ustr,rOwner); } - std::unique_lock aGuard(m_aMutex); - maChangesListeners.addInterface( aGuard, xListener ); + maChangesListeners.addInterface(guard, xListener); } -void NameContainer::removeChangesListener(const Reference& xListener) +void NameContainer::removeChangesListener(const Reference& xListener, + std::unique_lock& guard) { if( !xListener.is() ) { throw RuntimeException(u"removeChangesListener called with null xListener"_ustr,rOwner); } - std::unique_lock aGuard(m_aMutex); - maChangesListeners.removeInterface( aGuard, xListener ); + maChangesListeners.removeInterface(guard, xListener); } // ModifiableHelper -void ModifiableHelper::setModified( bool _bModified ) +void ModifiableHelper::setModified(bool _bModified, std::unique_lock& guard) { if ( _bModified == mbModified ) { @@ -309,23 +307,21 @@ void ModifiableHelper::setModified( bool _bModified ) } mbModified = _bModified; - if ( m_aModifyListeners.getLength() == 0 ) + if (m_aModifyListeners.getLength(guard) == 0) { return; } EventObject aModifyEvent( m_rEventSource ); - m_aModifyListeners.notifyEach( &XModifyListener::modified, aModifyEvent ); + m_aModifyListeners.notifyEach(guard, &XModifyListener::modified, aModifyEvent); } // Ctor SfxLibraryContainer::SfxLibraryContainer() - : SfxLibraryContainer_BASE( m_aMutex ) - , maVBAScriptListeners( m_aMutex ) - , mnRunningVBAScripts( 0 ) + : mnRunningVBAScripts( 0 ) , mbVBACompat( false ) , meVBATextEncoding( RTL_TEXTENCODING_DONTKNOW ) - , maModifiable( *this, m_aMutex ) + , maModifiable( *this ) , maNameContainer( cppu::UnoType::get(), *this ) , mpBasMgr( nullptr ) , mbOwnBasMgr( false ) @@ -351,7 +347,7 @@ SfxLibraryContainer::~SfxLibraryContainer() void SfxLibraryContainer::enterMethod() { Application::GetSolarMutex().acquire(); - if ( rBHelper.bInDispose || rBHelper.bDisposed ) + if (m_bDisposed) { throw DisposedException( OUString(), *this ); } @@ -414,7 +410,7 @@ void SAL_CALL SfxLibraryContainer::storeLibrariesToStorage( const Reference< XSt } try { - storeLibraries_Impl( _rxRootStorage, true ); + storeLibraries_Impl(_rxRootStorage, true, o3tl::temporary(std::unique_lock(m_aMutex))); } catch( const Exception& ) { @@ -465,19 +461,19 @@ sal_Bool SfxLibraryContainer::isModified() void SAL_CALL SfxLibraryContainer::setModified( sal_Bool _bModified ) { LibraryContainerMethodGuard aGuard( *this ); - maModifiable.setModified( _bModified ); + maModifiable.setModified(_bModified, o3tl::temporary(std::unique_lock(m_aMutex))); } void SAL_CALL SfxLibraryContainer::addModifyListener( const Reference< XModifyListener >& _rxListener ) { LibraryContainerMethodGuard aGuard( *this ); - maModifiable.addModifyListener( _rxListener ); + maModifiable.addModifyListener(_rxListener, o3tl::temporary(std::unique_lock(m_aMutex))); } void SAL_CALL SfxLibraryContainer::removeModifyListener( const Reference< XModifyListener >& _rxListener ) { LibraryContainerMethodGuard aGuard( *this ); - maModifiable.removeModifyListener( _rxListener ); + maModifiable.removeModifyListener(_rxListener, o3tl::temporary(std::unique_lock(m_aMutex))); } // Methods XPersistentLibraryContainer @@ -498,7 +494,7 @@ void SAL_CALL SfxLibraryContainer::storeLibraries( ) LibraryContainerMethodGuard aGuard( *this ); try { - storeLibraries_Impl( mxStorage, mxStorage.is() ); + storeLibraries_Impl(mxStorage, mxStorage.is(), o3tl::temporary(std::unique_lock(m_aMutex))); // we need to store *all* libraries if and only if we are based on a storage: // in this case, storeLibraries_Impl will remove the source storage, after loading // all libraries, so we need to force them to be stored, again @@ -551,18 +547,21 @@ void createVariableURL( OUString& rStr, std::u16string_view rLibName, } } -void SfxLibraryContainer::init( const OUString& rInitialDocumentURL, const uno::Reference< embed::XStorage >& rxInitialStorage ) +void SfxLibraryContainer::init(const OUString& rInitialDocumentURL, + const uno::Reference& rxInitialStorage, + std::unique_lock& guard) { // this might be called from within the ctor, and the impl_init might (indirectly) create // a UNO reference to ourself. // Ensure that we're not destroyed while we're in here osl_atomic_increment( &m_refCount ); - init_Impl( rInitialDocumentURL, rxInitialStorage ); + init_Impl(rInitialDocumentURL, rxInitialStorage, guard); osl_atomic_decrement( &m_refCount ); } void SfxLibraryContainer::init_Impl( const OUString& rInitialDocumentURL, - const uno::Reference< embed::XStorage >& rxInitialStorage ) + const uno::Reference< embed::XStorage >& rxInitialStorage, + std::unique_lock& guard ) { uno::Reference< embed::XStorage > xStorage = rxInitialStorage; @@ -595,7 +594,7 @@ void SfxLibraryContainer::init_Impl( const OUString& rInitialDocumentURL, meInitMode = LIBRARY_INIT_FILE; uno::Reference< embed::XStorage > xDummyStor; ::xmlscript::LibDescriptor aLibDesc; - implLoadLibraryIndexFile( nullptr, aLibDesc, xDummyStor, aInitFileName ); + implLoadLibraryIndexFile(nullptr, aLibDesc, xDummyStor, aInitFileName, guard); return; } else @@ -804,7 +803,7 @@ void SfxLibraryContainer::init_Impl( const OUString& rInitialDocumentURL, if( mxSFI->isFolder( aLibDirPath ) ) { createVariableURL( rLib.aStorageURL, rLib.aName, maInfoFileName, true ); - maModifiable.setModified( true ); + maModifiable.setModified(true, guard); } else if( rLib.bLink ) { @@ -816,7 +815,7 @@ void SfxLibraryContainer::init_Impl( const OUString& rInitialDocumentURL, if( mxSFI->isFolder( aShareLibDirPath ) ) { createVariableURL( rLib.aStorageURL, rLib.aName, maInfoFileName, false ); - maModifiable.setModified( true ); + maModifiable.setModified(true, guard); } else { @@ -838,12 +837,12 @@ void SfxLibraryContainer::init_Impl( const OUString& rInitialDocumentURL, if( rLib.bLink ) { Reference< XNameAccess > xLib = - createLibraryLink( aLibName, rLib.aStorageURL, rLib.bReadOnly ); + createLibraryLink_Impl(aLibName, rLib.aStorageURL, rLib.bReadOnly, guard); pImplLib = static_cast< SfxLibrary* >( xLib.get() ); } else { - Reference< XNameContainer > xLib = createLibrary( aLibName ); + Reference xLib = createLibrary_Impl(aLibName, guard); pImplLib = static_cast< SfxLibrary* >( xLib.get() ); pImplLib->mbLoaded = false; pImplLib->mbReadOnly = rLib.bReadOnly; @@ -853,7 +852,7 @@ void SfxLibraryContainer::init_Impl( const OUString& rInitialDocumentURL, pImplLib->maStorageURL, pImplLib->maUnexpandedStorageURL ); } } - maModifiable.setModified( false ); + maModifiable.setModified(false, guard); // Read library info files if( !mbOldInfoFormat ) @@ -876,10 +875,10 @@ void SfxLibraryContainer::init_Impl( const OUString& rInitialDocumentURL, } } - // Link is already initialised in createLibraryLink() + // Link is already initialised in createLibraryLink_Impl() if( !pImplLib->mbInitialised && (!bStorage || xLibraryStor.is()) ) { - bool bLoaded = implLoadLibraryIndexFile( pImplLib, rLib, xLibraryStor, OUString() ); + bool bLoaded = implLoadLibraryIndexFile( pImplLib, rLib, xLibraryStor, OUString(), guard ); SAL_WARN_IF( bLoaded && aLibName != rLib.aName, "basic", ("Different library names in library container and" @@ -899,7 +898,7 @@ void SfxLibraryContainer::init_Impl( const OUString& rInitialDocumentURL, implStoreLibraryIndexFile( pImplLib, rLib, xTmpStorage ); } - implImportLibDescriptor( pImplLib, rLib ); + implImportLibDescriptor(pImplLib, rLib, guard); if( nPass == 1 ) { @@ -923,7 +922,7 @@ void SfxLibraryContainer::init_Impl( const OUString& rInitialDocumentURL, { try { - implScanExtensions(); + implScanExtensions(guard); } catch(const uno::Exception& ) { @@ -939,7 +938,7 @@ void SfxLibraryContainer::init_Impl( const OUString& rInitialDocumentURL, SfxLibrary* pImplLib = getImplLib( aName ); if( pImplLib->mbPreload ) { - loadLibrary( aName ); + loadLibrary_Impl(aName, guard); } } } @@ -1087,7 +1086,7 @@ void SfxLibraryContainer::init_Impl( const OUString& rInitialDocumentURL, } if( bCreateLink ) { - createLibraryLink( aLibName, pImplLib->maStorageURL, pImplLib->mbReadOnly ); + createLibraryLink_Impl( aLibName, pImplLib->maStorageURL, pImplLib->mbReadOnly, guard ); } } else @@ -1108,21 +1107,21 @@ void SfxLibraryContainer::init_Impl( const OUString& rInitialDocumentURL, if( aLibName == aStandardStr ) { - maNameContainer.removeByName( aLibName ); + maNameContainer.removeByName(aLibName, guard); } // Create library - Reference< XNameContainer > xLib = createLibrary( aLibName ); + Reference xLib = createLibrary_Impl(aLibName, guard); SfxLibrary* pNewLib = static_cast< SfxLibrary* >( xLib.get() ); pNewLib->mbLoaded = false; - pNewLib->implSetModified( false ); + pNewLib->implSetModified(false, guard); checkStorageURL( aLibFolder, pNewLib->maLibInfoFileURL, pNewLib->maStorageURL, pNewLib->maUnexpandedStorageURL ); uno::Reference< embed::XStorage > xDummyStor; ::xmlscript::LibDescriptor aLibDesc; - implLoadLibraryIndexFile( pNewLib, aLibDesc, xDummyStor, pNewLib->maLibInfoFileURL ); - implImportLibDescriptor( pNewLib, aLibDesc ); + implLoadLibraryIndexFile( pNewLib, aLibDesc, xDummyStor, pNewLib->maLibInfoFileURL, guard ); + implImportLibDescriptor(pNewLib, aLibDesc, guard); } } mxSFI->kill( aPrevFolder ); @@ -1171,7 +1170,7 @@ void SfxLibraryContainer::init_Impl( const OUString& rInitialDocumentURL, {} } -void SfxLibraryContainer::implScanExtensions() +void SfxLibraryContainer::implScanExtensions(std::unique_lock& guard) { #if HAVE_FEATURE_EXTENSIONS ScriptExtensionIterator aScriptIt; @@ -1213,10 +1212,10 @@ void SfxLibraryContainer::implScanExtensions() // Create link const bool bReadOnly = false; - createLibraryLink( aLibName, aIndexFileURL, bReadOnly ); + createLibraryLink_Impl(aLibName, aIndexFileURL, bReadOnly, guard); } #else - (void) this; + (void)guard; #endif } @@ -1292,7 +1291,8 @@ bool SfxLibraryContainer::implStorePasswordLibrary( bool SfxLibraryContainer::implLoadPasswordLibrary( SfxLibrary* /*pLib*/, const OUString& /*Name*/, - bool /*bVerifyPasswordOnly*/ ) + bool /*bVerifyPasswordOnly*/, + std::unique_lock& /*guard*/ ) { return true; } @@ -1580,7 +1580,8 @@ void SfxLibraryContainer::implStoreLibraryIndexFile( SfxLibrary* pLib, bool SfxLibraryContainer::implLoadLibraryIndexFile( SfxLibrary* pLib, ::xmlscript::LibDescriptor& rLib, const uno::Reference< embed::XStorage >& xStorage, - const OUString& aIndexFileName ) + const OUString& aIndexFileName, + std::unique_lock& guard ) { Reference< XParser > xParser = xml::sax::Parser::create(mxContext); @@ -1660,41 +1661,41 @@ bool SfxLibraryContainer::implLoadLibraryIndexFile( SfxLibrary* pLib, if( !pLib ) { - Reference< XNameContainer > xLib = createLibrary( rLib.aName ); + Reference xLib = createLibrary_Impl(rLib.aName, guard); pLib = static_cast< SfxLibrary* >( xLib.get() ); pLib->mbLoaded = false; rLib.aStorageURL = aIndexFileName; checkStorageURL( rLib.aStorageURL, pLib->maLibInfoFileURL, pLib->maStorageURL, pLib->maUnexpandedStorageURL ); - implImportLibDescriptor( pLib, rLib ); + implImportLibDescriptor(pLib, rLib, guard); } return true; } void SfxLibraryContainer::implImportLibDescriptor( SfxLibrary* pLib, - ::xmlscript::LibDescriptor const & rLib ) + ::xmlscript::LibDescriptor const& rLib, + std::unique_lock& guard) { if( pLib->mbInitialised ) return; - Any aDummyElement = createEmptyLibraryElement(); for (auto& name : rLib.aElementNames) { - pLib->maNameContainer.insertByName(name, aDummyElement); + pLib->maNameContainer.insertByName(name, aDummyElement, guard); } pLib->mbPasswordProtected = rLib.bPasswordProtected; pLib->mbReadOnly = rLib.bReadOnly; pLib->mbPreload = rLib.bPreload; - pLib->implSetModified( false ); + pLib->implSetModified(false, guard); pLib->mbInitialised = true; } // Methods of new XLibraryStorage interface? void SfxLibraryContainer::storeLibraries_Impl( const uno::Reference< embed::XStorage >& i_rStorage, - bool bComplete ) + bool bComplete, std::unique_lock& guard ) { const Sequence< OUString > aNames = maNameContainer.getElementNames(); @@ -1890,7 +1891,7 @@ void SfxLibraryContainer::storeLibraries_Impl( const uno::Reference< embed::XSto // Maybe lib is not loaded?! if( bComplete ) { - loadLibrary( rLib.aName ); + loadLibrary_Impl(rLib.aName, guard); } if( pImplLib->mbPasswordProtected ) { @@ -1917,8 +1918,8 @@ void SfxLibraryContainer::storeLibraries_Impl( const uno::Reference< embed::XSto } } } - maModifiable.setModified( true ); - pImplLib->implSetModified( false ); + maModifiable.setModified(true, guard); + pImplLib->implSetModified(false, guard); } // For container info ReadOnly refers to mbReadOnlyLink @@ -1980,7 +1981,7 @@ void SfxLibraryContainer::storeLibraries_Impl( const uno::Reference< embed::XSto { return; } - maModifiable.setModified( false ); + maModifiable.setModified(false, guard); mbOldInfoFormat = false; // Write library container info @@ -2095,6 +2096,12 @@ sal_Bool SfxLibraryContainer::hasByName( const OUString& aName ) Reference< XNameContainer > SAL_CALL SfxLibraryContainer::createLibrary( const OUString& Name ) { LibraryContainerMethodGuard aGuard( *this ); + return createLibrary_Impl(Name, o3tl::temporary(std::unique_lock(m_aMutex))); +} + +css::uno::Reference +SfxLibraryContainer::createLibrary_Impl(const OUString& Name, std::unique_lock& guard) +{ rtl::Reference pNewLib = implCreateLibrary( Name ); pNewLib->maLibElementFileExtension = maLibElementFileExtension; @@ -2106,8 +2113,8 @@ Reference< XNameContainer > SAL_CALL SfxLibraryContainer::createLibrary( const O Reference< XNameAccess > xNameAccess( pNewLib ); Any aElement; aElement <<= xNameAccess; - maNameContainer.insertByName( Name, aElement ); - maModifiable.setModified( true ); + maNameContainer.insertByName(Name, aElement, guard); + maModifiable.setModified(true, guard); return pNewLib; } @@ -2115,6 +2122,13 @@ Reference< XNameAccess > SAL_CALL SfxLibraryContainer::createLibraryLink ( const OUString& Name, const OUString& StorageURL, sal_Bool ReadOnly ) { LibraryContainerMethodGuard aGuard( *this ); + return createLibraryLink_Impl(Name, StorageURL, ReadOnly, o3tl::temporary(std::unique_lock(m_aMutex))); +} + +css::uno::Reference +SfxLibraryContainer::createLibraryLink_Impl(const OUString& Name, const OUString& StorageURL, + sal_Bool ReadOnly, std::unique_lock& guard) +{ // TODO: Check other reasons to force ReadOnly status //if( !ReadOnly ) //{ @@ -2133,14 +2147,14 @@ Reference< XNameAccess > SAL_CALL SfxLibraryContainer::createLibraryLink uno::Reference< embed::XStorage > xDummyStor; ::xmlscript::LibDescriptor aLibDesc; - implLoadLibraryIndexFile( pNewLib.get(), aLibDesc, xDummyStor, OUString() ); - implImportLibDescriptor( pNewLib.get(), aLibDesc ); + implLoadLibraryIndexFile(pNewLib.get(), aLibDesc, xDummyStor, OUString(), guard); + implImportLibDescriptor(pNewLib.get(), aLibDesc, guard); Reference< XNameAccess > xRet( pNewLib ); Any aElement; aElement <<= xRet; - maNameContainer.insertByName( Name, aElement ); - maModifiable.setModified( true ); + maNameContainer.insertByName(Name, aElement, guard); + maModifiable.setModified(true, guard); if( StorageURL.indexOf( "vnd.sun.star.expand:$UNO_USER_PACKAGES_CACHE" ) != -1 ) { @@ -2159,6 +2173,7 @@ Reference< XNameAccess > SAL_CALL SfxLibraryContainer::createLibraryLink void SAL_CALL SfxLibraryContainer::removeLibrary( const OUString& Name ) { LibraryContainerMethodGuard aGuard( *this ); + std::unique_lock guard(m_aMutex); // Get and hold library before removing rtl::Reference pImplLib(getImplLib(Name)); if( pImplLib->mbReadOnly && !pImplLib->mbLink ) @@ -2166,8 +2181,8 @@ void SAL_CALL SfxLibraryContainer::removeLibrary( const OUString& Name ) throw IllegalArgumentException(u"readonly && !link"_ustr, getXWeak(), 1); } // Remove from container - maNameContainer.removeByName( Name ); - maModifiable.setModified( true ); + maNameContainer.removeByName(Name, guard); + maModifiable.setModified(true, guard); // Delete library files, but not for linked libraries if( pImplLib->mbLink ) @@ -2180,7 +2195,7 @@ void SAL_CALL SfxLibraryContainer::removeLibrary( const OUString& Name ) if (pImplLib->hasElements()) { for (auto& name : pImplLib->getElementNames()) - pImplLib->impl_removeWithoutChecks(name); + pImplLib->impl_removeWithoutChecks(name, guard); } // Delete index file @@ -2230,6 +2245,12 @@ sal_Bool SAL_CALL SfxLibraryContainer::isLibraryLoaded( const OUString& Name ) void SAL_CALL SfxLibraryContainer::loadLibrary( const OUString& Name ) { LibraryContainerMethodGuard aGuard( *this ); + return loadLibrary_Impl(Name, o3tl::temporary(std::unique_lock(m_aMutex))); +} + +void SfxLibraryContainer::loadLibrary_Impl(const OUString& Name, + std::unique_lock& guard) +{ SfxLibrary* pImplLib = getImplLib(Name); bool bLoaded = pImplLib->mbLoaded; @@ -2239,7 +2260,7 @@ void SAL_CALL SfxLibraryContainer::loadLibrary( const OUString& Name ) if( pImplLib->mbPasswordProtected ) { - implLoadPasswordLibrary( pImplLib, Name ); + implLoadPasswordLibrary(pImplLib, Name, false, guard); return; } @@ -2346,15 +2367,15 @@ void SAL_CALL SfxLibraryContainer::loadLibrary( const OUString& Name ) { if( aAny.hasValue() ) { - pImplLib->maNameContainer.replaceByName( aElementName, aAny ); + pImplLib->maNameContainer.replaceByName(aElementName, aAny, guard); } } else { - pImplLib->maNameContainer.insertNoCheck(aElementName, aAny); + pImplLib->maNameContainer.insertNoCheck(aElementName, aAny, guard); } } - pImplLib->implSetModified( false ); + pImplLib->implSetModified(false, guard); } // Methods XLibraryContainer2 @@ -2390,14 +2411,15 @@ sal_Bool SAL_CALL SfxLibraryContainer::isLibraryReadOnly( const OUString& Name ) void SAL_CALL SfxLibraryContainer::setLibraryReadOnly( const OUString& Name, sal_Bool bReadOnly ) { LibraryContainerMethodGuard aGuard( *this ); + std::unique_lock guard(m_aMutex); SfxLibrary* pImplLib = getImplLib( Name ); if( pImplLib->mbLink ) { if( pImplLib->mbReadOnlyLink != bool(bReadOnly) ) { pImplLib->mbReadOnlyLink = bReadOnly; - pImplLib->implSetModified( true ); - maModifiable.setModified( true ); + pImplLib->implSetModified(true, guard); + maModifiable.setModified(true, guard); } } else @@ -2405,7 +2427,7 @@ void SAL_CALL SfxLibraryContainer::setLibraryReadOnly( const OUString& Name, sal if( pImplLib->mbReadOnly != bool(bReadOnly) ) { pImplLib->mbReadOnly = bReadOnly; - pImplLib->implSetModified( true ); + pImplLib->implSetModified(true, guard); } } } @@ -2413,6 +2435,7 @@ void SAL_CALL SfxLibraryContainer::setLibraryReadOnly( const OUString& Name, sal void SAL_CALL SfxLibraryContainer::renameLibrary( const OUString& Name, const OUString& NewName ) { LibraryContainerMethodGuard aGuard( *this ); + std::unique_lock guard(m_aMutex); if( maNameContainer.hasByName( NewName ) ) { throw ElementExistException(); @@ -2425,7 +2448,7 @@ void SAL_CALL SfxLibraryContainer::renameLibrary( const OUString& Name, const OU { return; // Lib with unverified password cannot be renamed } - loadLibrary( Name ); + loadLibrary_Impl(Name, guard); // Rename library folder, but not for linked libraries bool bMovedSuccessful = true; @@ -2439,7 +2462,7 @@ void SAL_CALL SfxLibraryContainer::renameLibrary( const OUString& Name, const OU OUString aLibDirPath = pImplLib->maStorageURL; // tdf#151741 - fill various storage URLs for the library // These URLs should not be empty for newly created libraries after - // the change in SfxLibraryContainer::createLibrary. + // the change in SfxLibraryContainer::createLibrary_Impl. if (aLibDirPath.isEmpty()) { checkStorageURL(pImplLib->maUnexpandedStorageURL, pImplLib->maLibInfoFileURL, @@ -2515,7 +2538,7 @@ void SAL_CALL SfxLibraryContainer::renameLibrary( const OUString& Name, const OU } bMovedSuccessful = true; - pImplLib->implSetModified( true ); + pImplLib->implSetModified(true, guard); } } catch(const Exception& ) @@ -2525,14 +2548,14 @@ void SAL_CALL SfxLibraryContainer::renameLibrary( const OUString& Name, const OU if( bStorage && !pImplLib->mbLink ) { - pImplLib->implSetModified( true ); + pImplLib->implSetModified(true, guard); } if( bMovedSuccessful ) { // Remove the old library from the container and insert it back with the new name - maNameContainer.removeByName(Name); - maNameContainer.insertByName(NewName, Any(Reference(pImplLib))); - maModifiable.setModified(true); + maNameContainer.removeByName(Name, guard); + maNameContainer.insertByName(NewName, Any(Reference(pImplLib)), guard); + maModifiable.setModified(true, guard); } } @@ -2541,6 +2564,7 @@ void SAL_CALL SfxLibraryContainer::renameLibrary( const OUString& Name, const OU void SAL_CALL SfxLibraryContainer::initialize( const Sequence< Any >& _rArguments ) { LibraryContainerMethodGuard aGuard( *this ); + std::unique_lock guard(m_aMutex); sal_Int32 nArgCount = _rArguments.getLength(); if ( nArgCount != 1 ) throw IllegalArgumentException(u"too many args"_ustr, getXWeak(), -1); @@ -2549,20 +2573,21 @@ void SAL_CALL SfxLibraryContainer::initialize( const Sequence< Any >& _rArgument Reference< XStorageBasedDocument > xDocument; if ( _rArguments[0] >>= sInitialDocumentURL ) { - init( sInitialDocumentURL, nullptr ); + init(sInitialDocumentURL, nullptr, guard); return; } if ( _rArguments[0] >>= xDocument ) { - initializeFromDocument( xDocument ); + initializeFromDocument(xDocument, guard); return; } throw IllegalArgumentException(u"arg1 unknown type"_ustr, getXWeak(), 1); } -void SfxLibraryContainer::initializeFromDocument( const Reference< XStorageBasedDocument >& _rxDocument ) +void SfxLibraryContainer::initializeFromDocument( const Reference< XStorageBasedDocument >& _rxDocument, + std::unique_lock& guard ) { // check whether this is a valid OfficeDocument, and obtain the document's root storage Reference< XStorage > xDocStorage; @@ -2585,7 +2610,7 @@ void SfxLibraryContainer::initializeFromDocument( const Reference< XStorageBased { throw IllegalArgumentException(u"no doc storage"_ustr, getXWeak(), 1); } - init( OUString(), xDocStorage ); + init(OUString(), xDocStorage, guard); } // OEventListenerAdapter @@ -2603,11 +2628,11 @@ void SfxLibraryContainer::_disposing( const EventObject& _rSource ) } // OComponentHelper -void SAL_CALL SfxLibraryContainer::disposing() +void SfxLibraryContainer::disposing(std::unique_lock& guard) { Reference< XModel > xModel = mxOwnerDocument; EventObject aEvent( xModel ); - maVBAScriptListeners.disposeAndClear( aEvent ); + maVBAScriptListeners.disposeAndClear(guard, aEvent); stopAllComponentListening(); mxOwnerDocument.clear(); } @@ -2637,14 +2662,16 @@ void SAL_CALL SfxLibraryContainer::changeLibraryPassword(const OUString&, const void SAL_CALL SfxLibraryContainer::addContainerListener( const Reference< XContainerListener >& xListener ) { LibraryContainerMethodGuard aGuard( *this ); + std::unique_lock guard(m_aMutex); maNameContainer.setEventSource( getXWeak() ); - maNameContainer.addContainerListener( xListener ); + maNameContainer.addContainerListener(xListener, guard); } void SAL_CALL SfxLibraryContainer::removeContainerListener( const Reference< XContainerListener >& xListener ) { LibraryContainerMethodGuard aGuard( *this ); - maNameContainer.removeContainerListener( xListener ); + std::unique_lock guard(m_aMutex); + maNameContainer.removeContainerListener(xListener, guard); } // Methods XLibraryContainerExport @@ -2652,6 +2679,7 @@ void SAL_CALL SfxLibraryContainer::exportLibrary( const OUString& Name, const OU const Reference< XInteractionHandler >& Handler ) { LibraryContainerMethodGuard aGuard( *this ); + std::unique_lock guard(m_aMutex); SfxLibrary* pImplLib = getImplLib( Name ); Reference< XSimpleFileAccess3 > xToUseSFI; @@ -2662,7 +2690,7 @@ void SAL_CALL SfxLibraryContainer::exportLibrary( const OUString& Name, const OU } // Maybe lib is not loaded?! - loadLibrary( Name ); + loadLibrary_Impl(Name, guard); uno::Reference< css::embed::XStorage > xDummyStor; if( pImplLib->mbPasswordProtected ) @@ -2782,12 +2810,12 @@ sal_Int32 SAL_CALL SfxLibraryContainer::getRunningVBAScripts() void SAL_CALL SfxLibraryContainer::addVBAScriptListener( const Reference< vba::XVBAScriptListener >& rxListener ) { - maVBAScriptListeners.addInterface( rxListener ); + maVBAScriptListeners.addInterface(o3tl::temporary(std::unique_lock(m_aMutex)), rxListener); } void SAL_CALL SfxLibraryContainer::removeVBAScriptListener( const Reference< vba::XVBAScriptListener >& rxListener ) { - maVBAScriptListeners.removeInterface( rxListener ); + maVBAScriptListeners.removeInterface(o3tl::temporary(std::unique_lock(m_aMutex)), rxListener); } void SAL_CALL SfxLibraryContainer::broadcastVBAScriptEvent( sal_Int32 nIdentifier, const OUString& rModuleName ) @@ -2807,7 +2835,9 @@ void SAL_CALL SfxLibraryContainer::broadcastVBAScriptEvent( sal_Int32 nIdentifie Reference< XModel > xModel = mxOwnerDocument; // weak-ref -> ref vba::VBAScriptEvent aEvent( Reference(xModel, UNO_QUERY), nIdentifier, rModuleName ); - maVBAScriptListeners.notifyEach( &css::script::vba::XVBAScriptListener::notifyVBAScriptEvent, aEvent ); + maVBAScriptListeners.notifyEach(o3tl::temporary(std::unique_lock(m_aMutex)), + &css::script::vba::XVBAScriptListener::notifyVBAScriptEvent, + aEvent); } // Methods XPropertySet @@ -2912,7 +2942,7 @@ bool SfxLibrary::isLoadedStorable() return mbLoaded && (!mbPasswordProtected || mbPasswordVerified); } -void SfxLibrary::implSetModified( bool _bIsModified ) +void SfxLibrary::implSetModified(bool _bIsModified, std::unique_lock& guard) { if ( mbIsModified == _bIsModified ) { @@ -2921,7 +2951,7 @@ void SfxLibrary::implSetModified( bool _bIsModified ) mbIsModified = _bIsModified; if ( mbIsModified ) { - mrModifiable.setModified( true ); + mrModifiable.setModified(true, guard); } } @@ -2992,8 +3022,9 @@ void SfxLibrary::replaceByName( const OUString& aName, const Any& aElement ) !isLibraryElementValid(aElement), "basic", "SfxLibrary::replaceByName: replacing element is invalid!"); - maNameContainer.replaceByName( aName, aElement ); - implSetModified( true ); + std::unique_lock guard(m_aMutex); + maNameContainer.replaceByName(aName, aElement, guard); + implSetModified(true, guard); } @@ -3007,14 +3038,16 @@ void SfxLibrary::insertByName( const OUString& aName, const Any& aElement ) !isLibraryElementValid(aElement), "basic", "SfxLibrary::insertByName: to-be-inserted element is invalid!"); - maNameContainer.insertByName( aName, aElement ); - implSetModified( true ); + std::unique_lock guard(m_aMutex); + maNameContainer.insertByName(aName, aElement, guard); + implSetModified(true, guard); } -void SfxLibrary::impl_removeWithoutChecks( const OUString& _rElementName ) +void SfxLibrary::impl_removeWithoutChecks(const OUString& _rElementName, + std::unique_lock& guard) { - maNameContainer.removeByName( _rElementName ); - implSetModified( true ); + maNameContainer.removeByName(_rElementName, guard); + implSetModified(true, guard); // Remove element file if( maStorageURL.isEmpty() ) @@ -3044,31 +3077,31 @@ void SfxLibrary::removeByName( const OUString& Name ) { impl_checkReadOnly(); impl_checkLoaded(); - impl_removeWithoutChecks( Name ); + impl_removeWithoutChecks(Name, o3tl::temporary(std::unique_lock(m_aMutex))); } // Methods XContainer void SAL_CALL SfxLibrary::addContainerListener( const Reference< XContainerListener >& xListener ) { maNameContainer.setEventSource( getXWeak() ); - maNameContainer.addContainerListener( xListener ); + maNameContainer.addContainerListener(xListener, o3tl::temporary(std::unique_lock(m_aMutex))); } void SAL_CALL SfxLibrary::removeContainerListener( const Reference< XContainerListener >& xListener ) { - maNameContainer.removeContainerListener( xListener ); + maNameContainer.removeContainerListener(xListener, o3tl::temporary(std::unique_lock(m_aMutex))); } // Methods XChangesNotifier void SAL_CALL SfxLibrary::addChangesListener( const Reference< XChangesListener >& xListener ) { maNameContainer.setEventSource( getXWeak() ); - maNameContainer.addChangesListener( xListener ); + maNameContainer.addChangesListener(xListener, o3tl::temporary(std::unique_lock(m_aMutex))); } void SAL_CALL SfxLibrary::removeChangesListener( const Reference< XChangesListener >& xListener ) { - maNameContainer.removeChangesListener( xListener ); + maNameContainer.removeChangesListener(xListener, o3tl::temporary(std::unique_lock(m_aMutex))); } diff --git a/basic/source/uno/scriptcont.cxx b/basic/source/uno/scriptcont.cxx index 1fa596222e04..2fbed6ae9253 100644 --- a/basic/source/uno/scriptcont.cxx +++ b/basic/source/uno/scriptcont.cxx @@ -38,7 +38,7 @@ // For password functionality #include - +#include #include #include #include @@ -114,7 +114,7 @@ SfxScriptLibraryContainer::SfxScriptLibraryContainer() SfxScriptLibraryContainer::SfxScriptLibraryContainer( const uno::Reference< embed::XStorage >& xStorage ) { - init( OUString(), xStorage ); + init(OUString(), xStorage, o3tl::temporary(std::unique_lock(m_aMutex))); } // Methods to get library instances of the correct type @@ -371,6 +371,7 @@ sal_Bool SAL_CALL SfxScriptLibraryContainer::verifyLibraryPassword ( const OUString& Name, const OUString& Password ) { LibraryContainerMethodGuard aGuard( *this ); + std::unique_lock guard(m_aMutex); SfxLibrary* pImplLib = getImplLib( Name ); if( !pImplLib->mbPasswordProtected || pImplLib->mbPasswordVerified ) { @@ -389,19 +390,19 @@ sal_Bool SAL_CALL SfxScriptLibraryContainer::verifyLibraryPassword else { pImplLib->maPassword = Password; - bSuccess = implLoadPasswordLibrary( pImplLib, Name, true ); + bSuccess = implLoadPasswordLibrary( pImplLib, Name, true, guard); if( bSuccess ) { // The library gets modified by verifying the password, because other- // wise for saving the storage would be copied and that doesn't work // with mtg's storages when the password is verified - pImplLib->implSetModified( true ); + pImplLib->implSetModified(true, guard); pImplLib->mbPasswordVerified = true; // Reload library to get source if( pImplLib->mbLoaded ) { - implLoadPasswordLibrary( pImplLib, Name ); + implLoadPasswordLibrary( pImplLib, Name, false, guard); } } } @@ -458,14 +459,15 @@ void SAL_CALL SfxScriptLibraryContainer::changeLibraryPassword( const OUString& pImplLib->mbPasswordVerified = false; pImplLib->maPassword.clear(); - maModifiable.setModified( true ); - pImplLib->implSetModified( true ); + std::unique_lock guard(m_aMutex); + maModifiable.setModified(true, guard); + pImplLib->implSetModified(true, guard); if( !bStorage && !pImplLib->mbDoc50Password ) { // Store application basic unencrypted uno::Reference< embed::XStorage > xStorage; - storeLibraries_Impl( xStorage, false ); + storeLibraries_Impl(xStorage, false, guard); bKillCryptedFiles = true; } } @@ -483,14 +485,15 @@ void SAL_CALL SfxScriptLibraryContainer::changeLibraryPassword( const OUString& pSL->mbLoadedSource = true; // must store source code now! } - maModifiable.setModified( true ); - pImplLib->implSetModified( true ); + std::unique_lock guard(m_aMutex); + maModifiable.setModified(true, guard); + pImplLib->implSetModified(true, guard); if( !bStorage && !pImplLib->mbDoc50Password ) { // Store application basic crypted uno::Reference< embed::XStorage > xStorage; - storeLibraries_Impl( xStorage, false ); + storeLibraries_Impl(xStorage, false, guard); bKillUnencryptedFiles = true; } } @@ -806,7 +809,7 @@ bool SfxScriptLibraryContainer::implStorePasswordLibrary( SfxLibrary* pLib, cons } bool SfxScriptLibraryContainer::implLoadPasswordLibrary - ( SfxLibrary* pLib, const OUString& Name, bool bVerifyPasswordOnly ) + ( SfxLibrary* pLib, const OUString& Name, bool bVerifyPasswordOnly, std::unique_lock& guard ) { bool bRet = true; @@ -950,12 +953,12 @@ bool SfxScriptLibraryContainer::implLoadPasswordLibrary { if( aAny.hasValue() ) { - pLib->maNameContainer.replaceByName( aElementName, aAny ); + pLib->maNameContainer.replaceByName(aElementName, aAny, guard); } } else { - pLib->maNameContainer.insertByName( aElementName, aAny ); + pLib->maNameContainer.insertByName(aElementName, aAny, guard); } } } @@ -1063,12 +1066,13 @@ bool SfxScriptLibraryContainer::implLoadPasswordLibrary { if( aAny.hasValue() ) { - pLib->maNameContainer.replaceByName( aElementName, aAny ); + pLib->maNameContainer.replaceByName(aElementName, aAny, + guard); } } else { - pLib->maNameContainer.insertByName( aElementName, aAny ); + pLib->maNameContainer.insertByName(aElementName, aAny, guard); } } } From 57d532057b4dcc248b9332835df2d6b7f61dfd92 Mon Sep 17 00:00:00 2001 From: Michael Weghorn Date: Fri, 6 Dec 2024 09:48:44 +0100 Subject: [PATCH 031/133] weld: Rename weld::Treeview selection signal/connect Rename weld::TreeView member + methods to clarify that these are about selection changes: * m_aChangeHdl to m_aSelectionChangedHdl, * signal_changed to signal_selection_changed * connect_changed to connect_selection_changed In GtkInstanceTreeview, also rename the related methods calling signal_selection_changed accordingly for consistency. Change-Id: I299d7930484677395a0bdd0ff105df18688f2e04 Reviewed-on: https://gerrit.libreoffice.org/c/core/+/178023 Tested-by: Jenkins Reviewed-by: Michael Weghorn --- basctl/source/basicide/ColorSchemeDialog.cxx | 2 +- basctl/source/basicide/baside2b.cxx | 4 ++-- basctl/source/basicide/macrodlg.cxx | 2 +- basctl/source/basicide/moduldl2.cxx | 2 +- basctl/source/dlged/managelang.cxx | 2 +- basctl/source/inc/bastype2.hxx | 5 ++++- .../controller/dialogs/res_BarGeometry.cxx | 2 +- .../source/controller/dialogs/tp_ChartType.cxx | 2 +- .../source/controller/dialogs/tp_DataSource.cxx | 5 +++-- cui/source/customize/SvxMenuConfigPage.cxx | 2 +- cui/source/customize/SvxToolbarConfigPage.cxx | 2 +- cui/source/customize/acccfg.cxx | 4 ++-- cui/source/customize/cfg.cxx | 4 ++-- cui/source/customize/macropg.cxx | 2 +- cui/source/dialogs/cuigaldlg.cxx | 2 +- cui/source/dialogs/dlgname.cxx | 2 +- cui/source/dialogs/hangulhanjadlg.cxx | 6 ++++-- cui/source/dialogs/linkdlg.cxx | 2 +- cui/source/dialogs/multipat.cxx | 4 ++-- cui/source/dialogs/pastedlg.cxx | 2 +- cui/source/dialogs/scriptdlg.cxx | 2 +- cui/source/dialogs/thesdlg.cxx | 3 ++- cui/source/inc/MacroManagerDialog.hxx | 4 ++-- cui/source/inc/cfgutil.hxx | 10 ++++++++-- cui/source/options/connpooloptions.cxx | 3 ++- cui/source/options/dbregister.cxx | 2 +- cui/source/options/fontsubs.cxx | 2 +- cui/source/options/optdict.cxx | 4 ++-- cui/source/options/optjava.cxx | 6 +++--- cui/source/options/optlingu.cxx | 8 ++++---- cui/source/options/optpath.cxx | 2 +- cui/source/options/treeopt.cxx | 2 +- cui/source/options/tsaurls.cxx | 2 +- cui/source/options/webconninfo.cxx | 3 ++- cui/source/tabpages/autocdlg.cxx | 10 +++++----- cui/source/tabpages/chardlg.cxx | 4 ++-- cui/source/tabpages/macroass.cxx | 2 +- cui/source/tabpages/numfmt.cxx | 4 ++-- cui/source/tabpages/numpages.cxx | 4 ++-- dbaccess/source/ui/app/AppDetailView.cxx | 2 +- dbaccess/source/ui/control/dbtreelistbox.cxx | 2 +- dbaccess/source/ui/dlg/adtabdlg.cxx | 4 ++-- dbaccess/source/ui/dlg/dbfindex.cxx | 6 ++++-- dbaccess/source/ui/dlg/indexdialog.cxx | 2 +- dbaccess/source/ui/dlg/paramdialog.cxx | 3 ++- dbaccess/source/ui/dlg/sqlmessage.cxx | 3 ++- dbaccess/source/ui/inc/WTypeSelect.hxx | 2 +- dbaccess/source/ui/misc/WNameMatch.cxx | 4 ++-- .../deployment/gui/dp_gui_updatedialog.cxx | 2 +- extensions/source/abpilot/tableselectionpage.cxx | 2 +- extensions/source/dbpilots/commonpagesdbp.cxx | 5 +++-- extensions/source/dbpilots/gridwizard.cxx | 5 +++-- extensions/source/dbpilots/groupboxwiz.cxx | 5 +++-- extensions/source/dbpilots/listcombowizard.cxx | 6 ++++-- .../source/propctrlr/selectlabeldialog.cxx | 2 +- extensions/source/scanner/sanedlg.cxx | 2 +- filter/source/pdf/impdialog.cxx | 2 +- .../xsltdialog/xmlfiltersettingsdialog.cxx | 3 ++- formula/source/ui/dlg/funcpage.cxx | 2 +- formula/source/ui/dlg/structpg.cxx | 2 +- fpicker/source/office/PlacesListBox.cxx | 2 +- fpicker/source/office/fileview.cxx | 5 ++++- fpicker/source/office/foldertree.hxx | 5 ++++- include/svx/txencbox.hxx | 5 ++++- include/vcl/jsdialog/executor.hxx | 2 +- include/vcl/weld.hxx | 9 ++++++--- reportdesign/source/ui/dlg/AddField.cxx | 2 +- reportdesign/source/ui/dlg/Navigator.cxx | 2 +- sc/source/ui/cctrl/checklistmenu.cxx | 8 +++++--- sc/source/ui/dbgui/consdlg.cxx | 2 +- sc/source/ui/dbgui/tpsubt.cxx | 4 ++-- sc/source/ui/dialogs/searchresults.cxx | 2 +- sc/source/ui/formdlg/dwfunctr.cxx | 2 +- sc/source/ui/inc/namemgrtable.hxx | 5 ++++- sc/source/ui/miscdlgs/acredlin.cxx | 2 +- sc/source/ui/miscdlgs/conflictsdlg.cxx | 2 +- sc/source/ui/miscdlgs/crnrdlg.cxx | 2 +- sc/source/ui/miscdlgs/instbdlg.cxx | 2 +- sc/source/ui/miscdlgs/linkarea.cxx | 2 +- sc/source/ui/miscdlgs/scuiautofmt.cxx | 2 +- sc/source/ui/miscdlgs/solveroptions.cxx | 2 +- sc/source/ui/navipi/scenwnd.cxx | 2 +- sc/source/ui/optdlg/tpusrlst.cxx | 2 +- sc/source/ui/xmlsource/xmlsourcedlg.cxx | 2 +- sd/source/ui/animations/CustomAnimationList.cxx | 2 +- sd/source/ui/animations/CustomAnimationPane.cxx | 2 +- sd/source/ui/dlg/BulletAndPositionDlg.cxx | 2 +- sd/source/ui/dlg/PhotoAlbumDialog.cxx | 2 +- sd/source/ui/dlg/SelectLayerDlg.cxx | 2 +- sd/source/ui/dlg/custsdlg.cxx | 6 +++--- sd/source/ui/dlg/sdtreelb.cxx | 2 +- sfx2/source/appl/newhelp.cxx | 2 +- sfx2/source/control/templatedlglocalview.cxx | 2 +- .../devtools/DevelopmentToolDockingWindow.cxx | 2 +- .../devtools/ObjectInspectorTreeHandler.cxx | 8 ++++---- sfx2/source/dialog/StyleList.cxx | 4 ++-- sfx2/source/dialog/versdlg.cxx | 2 +- sfx2/source/doc/new.cxx | 4 ++-- sfx2/source/doc/saveastemplatedlg.cxx | 3 ++- sfx2/source/doc/templatedlg.cxx | 3 ++- svx/source/form/datanavi.cxx | 4 ++-- svx/source/form/filtnav.cxx | 2 +- svx/source/form/navigatortree.cxx | 2 +- svx/source/gallery2/galbrws1.cxx | 4 ++-- .../chinese_dictionarydialog.hxx | 5 ++++- sw/source/ui/chrdlg/swuiccoll.cxx | 4 ++-- sw/source/ui/config/optload.cxx | 2 +- sw/source/ui/dbui/addresslistdialog.cxx | 2 +- sw/source/ui/dbui/customizeaddresslistdialog.cxx | 3 ++- sw/source/ui/dbui/dbinsdlg.cxx | 6 +++--- sw/source/ui/dbui/mmaddressblockpage.cxx | 3 ++- sw/source/ui/dialog/uiregionsw.cxx | 2 +- sw/source/ui/fldui/DropDownFormFieldDialog.cxx | 3 ++- sw/source/ui/fldui/changedb.cxx | 2 +- sw/source/ui/fldui/flddb.cxx | 2 +- sw/source/ui/fldui/flddinf.cxx | 4 ++-- sw/source/ui/fldui/flddok.cxx | 8 ++++---- sw/source/ui/fldui/fldfunc.cxx | 6 +++--- sw/source/ui/fldui/fldref.cxx | 9 +++++---- sw/source/ui/fldui/fldvar.cxx | 4 ++-- sw/source/ui/inc/bookmark.hxx | 2 +- sw/source/ui/index/cnttab.cxx | 6 +++--- sw/source/ui/index/multmrk.cxx | 2 +- sw/source/ui/misc/contentcontroldlg.cxx | 2 +- sw/source/ui/misc/glosbib.cxx | 2 +- sw/source/ui/misc/glossary.cxx | 2 +- sw/source/ui/misc/num.cxx | 2 +- sw/source/ui/misc/outline.cxx | 4 ++-- sw/source/ui/table/convert.cxx | 2 +- sw/source/ui/table/instable.cxx | 2 +- sw/source/ui/table/tautofmt.cxx | 2 +- sw/source/uibase/inc/dbtree.hxx | 5 ++++- sw/source/uibase/misc/redlndlg.cxx | 6 +++--- sw/source/uibase/sidebar/QuickFindPanel.cxx | 2 +- sw/source/uibase/utlui/content.cxx | 2 +- sw/source/uibase/utlui/glbltree.cxx | 2 +- sw/source/uibase/utlui/gloslst.cxx | 2 +- sw/source/uibase/utlui/numfmtlb.cxx | 2 +- vcl/qt5/QtInstanceTreeView.cxx | 2 +- vcl/source/app/salvtables.cxx | 4 ++-- vcl/source/window/builder.cxx | 2 +- vcl/unx/generic/print/prtsetup.cxx | 4 ++-- vcl/unx/gtk3/gtkinst.cxx | 16 ++++++++-------- .../source/dialogs/certificatechooser.cxx | 2 +- xmlsecurity/source/dialogs/certificateviewer.cxx | 5 +++-- .../source/dialogs/digitalsignaturesdialog.cxx | 3 ++- xmlsecurity/source/dialogs/macrosecurity.cxx | 6 ++++-- 147 files changed, 276 insertions(+), 218 deletions(-) diff --git a/basctl/source/basicide/ColorSchemeDialog.cxx b/basctl/source/basicide/ColorSchemeDialog.cxx index ca3eeca9cbef..c61f2071ae1e 100644 --- a/basctl/source/basicide/ColorSchemeDialog.cxx +++ b/basctl/source/basicide/ColorSchemeDialog.cxx @@ -58,7 +58,7 @@ void ColorSchemeDialog::Init() m_xOk->connect_clicked(LINK(this, ColorSchemeDialog, BtnOkHdl)); m_xUseAppCollors->connect_toggled(LINK(this, ColorSchemeDialog, OptionHdl)); m_xUseScheme->connect_toggled(LINK(this, ColorSchemeDialog, OptionHdl)); - m_xSchemeList->connect_changed(LINK(this, ColorSchemeDialog, SelectHdl)); + m_xSchemeList->connect_selection_changed(LINK(this, ColorSchemeDialog, SelectHdl)); // Populate the list with available color schemes for (auto const& rName : m_pColorConfig->GetColorSchemeNames()) diff --git a/basctl/source/basicide/baside2b.cxx b/basctl/source/basicide/baside2b.cxx index b7b75b958183..93e36ab34061 100644 --- a/basctl/source/basicide/baside2b.cxx +++ b/basctl/source/basicide/baside2b.cxx @@ -1740,7 +1740,7 @@ WatchWindow::WatchWindow(Layout* pParent) m_xTreeListBox->set_help_id(HID_BASICIDE_WATCHWINDOW_LIST); m_xTreeListBox->connect_editing(LINK(this, WatchWindow, EditingEntryHdl), LINK(this, WatchWindow, EditedEntryHdl)); - m_xTreeListBox->connect_changed( LINK( this, WatchWindow, TreeListHdl ) ); + m_xTreeListBox->connect_selection_changed(LINK(this, WatchWindow, TreeListHdl)); m_xTreeListBox->connect_expanding(LINK(this, WatchWindow, RequestingChildrenHdl)); // VarTabWidth, ValueTabWidth, TypeTabWidth @@ -2864,7 +2864,7 @@ CodeCompleteWindow::CodeCompleteWindow(EditorWindow* pPar) , m_xListBox(m_xBuilder->weld_tree_view(u"treeview"_ustr)) { m_xListBox->connect_row_activated(LINK(this, CodeCompleteWindow, ImplDoubleClickHdl)); - m_xListBox->connect_changed(LINK(this, CodeCompleteWindow, ImplSelectHdl)); + m_xListBox->connect_selection_changed(LINK(this, CodeCompleteWindow, ImplSelectHdl)); m_xListBox->connect_key_press(LINK(this, CodeCompleteWindow, KeyInputHdl)); m_xListBox->make_sorted(); m_xListBox->set_direction(false); diff --git a/basctl/source/basicide/macrodlg.cxx b/basctl/source/basicide/macrodlg.cxx index 18ab8e2290f9..89becb241d45 100644 --- a/basctl/source/basicide/macrodlg.cxx +++ b/basctl/source/basicide/macrodlg.cxx @@ -100,7 +100,7 @@ MacroChooser::MacroChooser(weld::Window* pParnt, const Reference< frame::XFrame m_xBasicBox->connect_changed( LINK( this, MacroChooser, BasicSelectHdl ) ); m_xMacroBox->connect_row_activated( LINK( this, MacroChooser, MacroDoubleClickHdl ) ); - m_xMacroBox->connect_changed( LINK( this, MacroChooser, MacroSelectHdl ) ); + m_xMacroBox->connect_selection_changed(LINK(this, MacroChooser, MacroSelectHdl)); m_xMacroBox->connect_popup_menu( LINK( this, MacroChooser, ContextMenuHdl ) ); m_xBasicBox->SetMode( BrowseMode::Modules ); diff --git a/basctl/source/basicide/moduldl2.cxx b/basctl/source/basicide/moduldl2.cxx index 49cf87a2d0d8..259957a48c89 100644 --- a/basctl/source/basicide/moduldl2.cxx +++ b/basctl/source/basicide/moduldl2.cxx @@ -246,7 +246,7 @@ LibPage::LibPage(weld::Container* pParent, OrganizeDialog* pDialog) m_xExportButton->connect_clicked( LINK( this, LibPage, ButtonHdl ) ); m_xInsertLibButton->connect_clicked( LINK( this, LibPage, ButtonHdl ) ); m_xDelButton->connect_clicked( LINK( this, LibPage, ButtonHdl ) ); - m_xLibBox->connect_changed( LINK( this, LibPage, TreeListHighlightHdl ) ); + m_xLibBox->connect_selection_changed(LINK(this, LibPage, TreeListHighlightHdl)); m_xBasicsBox->connect_changed( LINK( this, LibPage, BasicSelectHdl ) ); diff --git a/basctl/source/dlged/managelang.cxx b/basctl/source/dlged/managelang.cxx index c014ca05f1de..3222733ebc10 100644 --- a/basctl/source/dlged/managelang.cxx +++ b/basctl/source/dlged/managelang.cxx @@ -88,7 +88,7 @@ void ManageLanguageDialog::Init() m_xAddPB->connect_clicked( LINK( this, ManageLanguageDialog, AddHdl ) ); m_xDeletePB->connect_clicked( LINK( this, ManageLanguageDialog, DeleteHdl ) ); m_xMakeDefPB->connect_clicked( LINK( this, ManageLanguageDialog, MakeDefHdl ) ); - m_xLanguageLB->connect_changed( LINK( this, ManageLanguageDialog, SelectHdl ) ); + m_xLanguageLB->connect_selection_changed(LINK(this, ManageLanguageDialog, SelectHdl)); m_xLanguageLB->set_selection_mode(SelectionMode::Multiple); } diff --git a/basctl/source/inc/bastype2.hxx b/basctl/source/inc/bastype2.hxx index 292d59b3ea8a..49731333680f 100644 --- a/basctl/source/inc/bastype2.hxx +++ b/basctl/source/inc/bastype2.hxx @@ -227,7 +227,10 @@ public: std::unique_ptr&& rUserData, weld::TreeIter* pRet = nullptr); - void connect_changed(const Link& rLink) { m_xControl->connect_changed(rLink); } + void connect_changed(const Link& rLink) + { + m_xControl->connect_selection_changed(rLink); + } std::unique_ptr make_iterator(const weld::TreeIter* pIter = nullptr) const { return m_xControl->make_iterator(pIter); } void copy_iterator(const weld::TreeIter& rSource, weld::TreeIter& rDest) const { m_xControl->copy_iterator(rSource, rDest); } bool get_selected(weld::TreeIter* pIter) const { return m_xControl->get_selected(pIter); } diff --git a/chart2/source/controller/dialogs/res_BarGeometry.cxx b/chart2/source/controller/dialogs/res_BarGeometry.cxx index cf25d970e99d..927906b06915 100644 --- a/chart2/source/controller/dialogs/res_BarGeometry.cxx +++ b/chart2/source/controller/dialogs/res_BarGeometry.cxx @@ -34,7 +34,7 @@ BarGeometryResources::BarGeometryResources(weld::Builder* pBuilder) void BarGeometryResources::connect_changed(const Link& rLink) { - m_xLB_Geometry->connect_changed(rLink); + m_xLB_Geometry->connect_selection_changed(rLink); } void BarGeometryResources::set_visible(bool bShow) diff --git a/chart2/source/controller/dialogs/tp_ChartType.cxx b/chart2/source/controller/dialogs/tp_ChartType.cxx index 12fa0325cef4..45f5b277ef7e 100644 --- a/chart2/source/controller/dialogs/tp_ChartType.cxx +++ b/chart2/source/controller/dialogs/tp_ChartType.cxx @@ -71,7 +71,7 @@ ChartTypeTabPage::ChartTypeTabPage(weld::Container* pPage, weld::DialogControlle SetPageTitle(SchResId(STR_PAGE_CHARTTYPE)); - m_xMainTypeList->connect_changed(LINK(this, ChartTypeTabPage, SelectMainTypeHdl)); + m_xMainTypeList->connect_selection_changed(LINK(this, ChartTypeTabPage, SelectMainTypeHdl)); m_xSubTypeList->SetSelectHdl( LINK( this, ChartTypeTabPage, SelectSubTypeHdl ) ); m_xSubTypeList->SetStyle(m_xSubTypeList->GetStyle() | diff --git a/chart2/source/controller/dialogs/tp_DataSource.cxx b/chart2/source/controller/dialogs/tp_DataSource.cxx index 577ef29c6b63..4cc12689ebc9 100644 --- a/chart2/source/controller/dialogs/tp_DataSource.cxx +++ b/chart2/source/controller/dialogs/tp_DataSource.cxx @@ -184,8 +184,9 @@ DataSourceTabPage::DataSourceTabPage(weld::Container* pPage, weld::DialogControl SetPageTitle(SchResId(STR_OBJECT_DATASERIES_PLURAL)); // set handlers - m_xLB_SERIES->connect_changed(LINK(this, DataSourceTabPage, SeriesSelectionChangedHdl)); - m_xLB_ROLE->connect_changed(LINK(this, DataSourceTabPage, RoleSelectionChangedHdl)); + m_xLB_SERIES->connect_selection_changed( + LINK(this, DataSourceTabPage, SeriesSelectionChangedHdl)); + m_xLB_ROLE->connect_selection_changed(LINK(this, DataSourceTabPage, RoleSelectionChangedHdl)); m_xIMB_RANGE_MAIN->connect_clicked(LINK(this, DataSourceTabPage, MainRangeButtonClickedHdl)); m_xIMB_RANGE_CAT->connect_clicked(LINK(this, DataSourceTabPage, CategoriesRangeButtonClickedHdl)); diff --git a/cui/source/customize/SvxMenuConfigPage.cxx b/cui/source/customize/SvxMenuConfigPage.cxx index 2a75181ae95a..d8d1d86387d2 100644 --- a/cui/source/customize/SvxMenuConfigPage.cxx +++ b/cui/source/customize/SvxMenuConfigPage.cxx @@ -54,7 +54,7 @@ SvxMenuConfigPage::SvxMenuConfigPage(weld::Container* pPage, weld::DialogControl rTreeView.set_vexpand(true); rTreeView.show(); - rTreeView.connect_changed(LINK(this, SvxMenuConfigPage, SelectMenuEntry)); + rTreeView.connect_selection_changed(LINK(this, SvxMenuConfigPage, SelectMenuEntry)); rTreeView.connect_popup_menu(LINK(this, SvxMenuConfigPage, ContentContextMenuHdl)); m_xFunctions->get_widget().connect_popup_menu( diff --git a/cui/source/customize/SvxToolbarConfigPage.cxx b/cui/source/customize/SvxToolbarConfigPage.cxx index a1ba639f0e27..95afc2e12359 100644 --- a/cui/source/customize/SvxToolbarConfigPage.cxx +++ b/cui/source/customize/SvxToolbarConfigPage.cxx @@ -64,7 +64,7 @@ SvxToolbarConfigPage::SvxToolbarConfigPage(weld::Container* pPage, rTreeView.set_help_id(HID_SVX_CONFIG_TOOLBAR_CONTENTS); rTreeView.show(); - rTreeView.connect_changed(LINK(this, SvxToolbarConfigPage, SelectToolbarEntry)); + rTreeView.connect_selection_changed(LINK(this, SvxToolbarConfigPage, SelectToolbarEntry)); rTreeView.connect_popup_menu(LINK(this, SvxToolbarConfigPage, ContentContextMenuHdl)); m_xFunctions->get_widget().connect_popup_menu( diff --git a/cui/source/customize/acccfg.cxx b/cui/source/customize/acccfg.cxx index a83cc24e520e..49e714146bf5 100644 --- a/cui/source/customize/acccfg.cxx +++ b/cui/source/customize/acccfg.cxx @@ -892,11 +892,11 @@ SfxAcceleratorConfigPage::SfxAcceleratorConfigPage(weld::Container* pPage, // install handler functions m_xChangeButton->connect_clicked(LINK(this, SfxAcceleratorConfigPage, ChangeHdl)); m_xRemoveButton->connect_clicked(LINK(this, SfxAcceleratorConfigPage, RemoveHdl)); - m_xEntriesBox->connect_changed(LINK(this, SfxAcceleratorConfigPage, SelectHdl)); + m_xEntriesBox->connect_selection_changed(LINK(this, SfxAcceleratorConfigPage, SelectHdl)); m_xEntriesBox->connect_key_press(LINK(this, SfxAcceleratorConfigPage, KeyInputHdl)); m_xGroupLBox->connect_changed(LINK(this, SfxAcceleratorConfigPage, SelectHdl)); m_xFunctionBox->connect_changed(LINK(this, SfxAcceleratorConfigPage, SelectHdl)); - m_xKeyBox->connect_changed(LINK(this, SfxAcceleratorConfigPage, SelectHdl)); + m_xKeyBox->connect_selection_changed(LINK(this, SfxAcceleratorConfigPage, SelectHdl)); m_xLoadButton->connect_clicked(LINK(this, SfxAcceleratorConfigPage, Load)); m_xSaveButton->connect_clicked(LINK(this, SfxAcceleratorConfigPage, Save)); m_xResetButton->connect_clicked(LINK(this, SfxAcceleratorConfigPage, Default)); diff --git a/cui/source/customize/cfg.cxx b/cui/source/customize/cfg.cxx index 3aaa07d6bb15..0bd6b44ede66 100644 --- a/cui/source/customize/cfg.cxx +++ b/cui/source/customize/cfg.cxx @@ -1041,7 +1041,7 @@ SvxConfigPage::SvxConfigPage(weld::Container* pPage, weld::DialogController* pCo m_xSearchEdit->connect_focus_out(LINK(this, SvxConfigPage, FocusOut_Impl)); rTreeView.connect_row_activated(LINK(this, SvxConfigPage, FunctionDoubleClickHdl)); - rTreeView.connect_changed(LINK(this, SvxConfigPage, SelectFunctionHdl)); + rTreeView.connect_selection_changed(LINK(this, SvxConfigPage, SelectFunctionHdl)); } IMPL_LINK_NOARG(SvxConfigPage, SelectElementHdl, weld::ComboBox&, void) @@ -1838,7 +1838,7 @@ SvxMainMenuOrganizerDialog::SvxMainMenuOrganizerDialog( m_xDialog->set_title(CuiResId(RID_CUISTR_MOVE_MENU)); } - m_xMenuListBox->connect_changed(LINK(this, SvxMainMenuOrganizerDialog, SelectHdl)); + m_xMenuListBox->connect_selection_changed(LINK(this, SvxMainMenuOrganizerDialog, SelectHdl)); m_xMoveUpButton->connect_clicked(LINK( this, SvxMainMenuOrganizerDialog, MoveHdl)); m_xMoveDownButton->connect_clicked(LINK( this, SvxMainMenuOrganizerDialog, MoveHdl)); diff --git a/cui/source/customize/macropg.cxx b/cui/source/customize/macropg.cxx index 60824e011f00..a6b13d5ff5c1 100644 --- a/cui/source/customize/macropg.cxx +++ b/cui/source/customize/macropg.cxx @@ -561,7 +561,7 @@ void SvxMacroTabPage_::InitAndSetHandler( const Reference< container::XNameRepla if( mpImpl->xAssignComponentPB ) mpImpl->xAssignComponentPB->connect_clicked( aLnk ); mpImpl->xEventLB->connect_row_activated( LINK(this, SvxMacroTabPage_, DoubleClickHdl_Impl ) ); - mpImpl->xEventLB->connect_changed( LINK( this, SvxMacroTabPage_, SelectEvent_Impl )); + mpImpl->xEventLB->connect_selection_changed(LINK(this, SvxMacroTabPage_, SelectEvent_Impl)); std::vector aWidths { diff --git a/cui/source/dialogs/cuigaldlg.cxx b/cui/source/dialogs/cuigaldlg.cxx index 1bf026e7d865..026abd399608 100644 --- a/cui/source/dialogs/cuigaldlg.cxx +++ b/cui/source/dialogs/cuigaldlg.cxx @@ -610,7 +610,7 @@ void TPGalleryThemeProperties::SetXChgData( ExchangeData* _pData ) m_xCbxPreview->connect_toggled(LINK(this, TPGalleryThemeProperties, ClickPreviewHdl)); m_xCbbFileType->connect_changed(LINK(this, TPGalleryThemeProperties, SelectFileTypeHdl)); m_xLbxFound->connect_row_activated(LINK(this, TPGalleryThemeProperties, DClickFoundHdl)); - m_xLbxFound->connect_changed(LINK(this, TPGalleryThemeProperties, SelectFoundHdl)); + m_xLbxFound->connect_selection_changed(LINK(this, TPGalleryThemeProperties, SelectFoundHdl)); m_xLbxFound->append_text(CuiResId(RID_CUISTR_GALLERY_NOFILES)); m_xLbxFound->show(); diff --git a/cui/source/dialogs/dlgname.cxx b/cui/source/dialogs/dlgname.cxx index 8067e29bb7c7..5e0cdacbf599 100644 --- a/cui/source/dialogs/dlgname.cxx +++ b/cui/source/dialogs/dlgname.cxx @@ -160,7 +160,7 @@ SvxListDialog::SvxListDialog(weld::Window* pParent) m_xAddBtn->connect_clicked(LINK(this, SvxListDialog, AddHdl_Impl)); m_xRemoveBtn->connect_clicked(LINK(this, SvxListDialog, RemoveHdl_Impl)); m_xEditBtn->connect_clicked(LINK(this, SvxListDialog, EditHdl_Impl)); - m_xList->connect_changed(LINK(this, SvxListDialog, SelectHdl_Impl)); + m_xList->connect_selection_changed(LINK(this, SvxListDialog, SelectHdl_Impl)); m_xList->connect_row_activated(LINK(this, SvxListDialog, DblClickHdl_Impl)); SelectionChanged(); diff --git a/cui/source/dialogs/hangulhanjadlg.cxx b/cui/source/dialogs/hangulhanjadlg.cxx index 576055575751..66a3643e3b01 100644 --- a/cui/source/dialogs/hangulhanjadlg.cxx +++ b/cui/source/dialogs/hangulhanjadlg.cxx @@ -294,7 +294,8 @@ namespace svx , m_xListBox(rBuilder.weld_tree_view(u"listbox"_ustr)) { m_xValueSet->SetSelectHdl( LINK( this, SuggestionDisplay, SelectSuggestionValueSetHdl ) ); - m_xListBox->connect_changed( LINK( this, SuggestionDisplay, SelectSuggestionListBoxHdl ) ); + m_xListBox->connect_selection_changed( + LINK(this, SuggestionDisplay, SelectSuggestionListBoxHdl)); m_xValueSet->SetLineCount( LINE_CNT ); m_xValueSet->SetStyle( m_xValueSet->GetStyle() | WB_ITEMBORDER | WB_VSCROLL ); @@ -894,7 +895,8 @@ namespace svx m_xDictsLB->enable_toggle_buttons(weld::ColumnToggleType::Check); - m_xDictsLB->connect_changed( LINK( this, HangulHanjaOptionsDialog, DictsLB_SelectHdl ) ); + m_xDictsLB->connect_selection_changed( + LINK(this, HangulHanjaOptionsDialog, DictsLB_SelectHdl)); m_xOkPB->connect_clicked( LINK( this, HangulHanjaOptionsDialog, OkHdl ) ); m_xNewPB->connect_clicked( LINK( this, HangulHanjaOptionsDialog, NewDictHdl ) ); diff --git a/cui/source/dialogs/linkdlg.cxx b/cui/source/dialogs/linkdlg.cxx index e0ff180e1235..d78dd2bbc6d6 100644 --- a/cui/source/dialogs/linkdlg.cxx +++ b/cui/source/dialogs/linkdlg.cxx @@ -115,7 +115,7 @@ SvBaseLinksDlg::SvBaseLinksDlg(weld::Window * pParent, LinkManager* pMgr, bool b aUpdateIdle.SetInvokeHandler( LINK( this, SvBaseLinksDlg, UpdateWaitingHdl ) ); aUpdateIdle.SetPriority( TaskPriority::LOWEST ); - m_xTbLinks->connect_changed( LINK( this, SvBaseLinksDlg, LinksSelectHdl ) ); + m_xTbLinks->connect_selection_changed(LINK(this, SvBaseLinksDlg, LinksSelectHdl)); m_xTbLinks->connect_row_activated( LINK( this, SvBaseLinksDlg, LinksDoubleClickHdl ) ); m_xRbAutomatic->connect_toggled( LINK( this, SvBaseLinksDlg, ToggleHdl ) ); m_xRbManual->connect_toggled( LINK( this, SvBaseLinksDlg, ToggleHdl ) ); diff --git a/cui/source/dialogs/multipat.cxx b/cui/source/dialogs/multipat.cxx index abd8d56411fb..03ba230df8f1 100644 --- a/cui/source/dialogs/multipat.cxx +++ b/cui/source/dialogs/multipat.cxx @@ -196,7 +196,7 @@ SvxMultiPathDialog::SvxMultiPathDialog(weld::Window* pParent) m_xRadioLB->get_text_height() * 10); m_xRadioLB->enable_toggle_buttons(weld::ColumnToggleType::Radio); m_xRadioLB->connect_toggled(LINK(this, SvxMultiPathDialog, CheckHdl_Impl)); - m_xRadioLB->connect_changed(LINK(this, SvxMultiPathDialog, SelectHdl_Impl)); + m_xRadioLB->connect_selection_changed(LINK(this, SvxMultiPathDialog, SelectHdl_Impl)); m_xAddBtn->connect_clicked(LINK(this, SvxMultiPathDialog, AddHdl_Impl)); m_xDelBtn->connect_clicked(LINK(this, SvxMultiPathDialog, DelHdl_Impl)); @@ -213,7 +213,7 @@ SvxPathSelectDialog::SvxPathSelectDialog(weld::Window* pParent) m_xPathLB->set_size_request(m_xPathLB->get_approximate_digit_width() * 60, m_xPathLB->get_text_height() * 10); - m_xPathLB->connect_changed(LINK(this, SvxPathSelectDialog, SelectHdl_Impl)); + m_xPathLB->connect_selection_changed(LINK(this, SvxPathSelectDialog, SelectHdl_Impl)); m_xAddBtn->connect_clicked(LINK(this, SvxPathSelectDialog, AddHdl_Impl)); m_xDelBtn->connect_clicked(LINK(this, SvxPathSelectDialog, DelHdl_Impl)); diff --git a/cui/source/dialogs/pastedlg.cxx b/cui/source/dialogs/pastedlg.cxx index 91e91bf0dcec..4c5a010466f8 100644 --- a/cui/source/dialogs/pastedlg.cxx +++ b/cui/source/dialogs/pastedlg.cxx @@ -39,7 +39,7 @@ SvPasteObjectDialog::SvPasteObjectDialog(weld::Window* pParent) m_xLbInsertList->get_height_rows(6)); m_xOKButton->set_sensitive(false); - ObjectLB().connect_changed(LINK(this, SvPasteObjectDialog, SelectHdl)); + ObjectLB().connect_selection_changed(LINK(this, SvPasteObjectDialog, SelectHdl)); ObjectLB().connect_row_activated(LINK( this, SvPasteObjectDialog, DoubleClickHdl)); } diff --git a/cui/source/dialogs/scriptdlg.cxx b/cui/source/dialogs/scriptdlg.cxx index bdde6fbeaef1..c67be62cc6b8 100644 --- a/cui/source/dialogs/scriptdlg.cxx +++ b/cui/source/dialogs/scriptdlg.cxx @@ -399,7 +399,7 @@ SvxScriptOrgDialog::SvxScriptOrgDialog(weld::Window* pParent, OUString language) m_xScriptsBox->set_size_request(m_xScriptsBox->get_approximate_digit_width() * 45, m_xScriptsBox->get_height_rows(12)); - m_xScriptsBox->connect_changed( LINK( this, SvxScriptOrgDialog, ScriptSelectHdl ) ); + m_xScriptsBox->connect_selection_changed(LINK(this, SvxScriptOrgDialog, ScriptSelectHdl)); m_xScriptsBox->connect_expanding(LINK( this, SvxScriptOrgDialog, ExpandingHdl ) ); m_xRunButton->connect_clicked( LINK( this, SvxScriptOrgDialog, ButtonHdl ) ); m_xCloseButton->connect_clicked( LINK( this, SvxScriptOrgDialog, ButtonHdl ) ); diff --git a/cui/source/dialogs/thesdlg.cxx b/cui/source/dialogs/thesdlg.cxx index d1c284b65b82..07eef25be0dd 100644 --- a/cui/source/dialogs/thesdlg.cxx +++ b/cui/source/dialogs/thesdlg.cxx @@ -259,7 +259,8 @@ SvxThesaurusDialog::SvxThesaurusDialog( m_xWordCB->set_entry_completion(false); m_xWordCB->connect_changed( LINK( this, SvxThesaurusDialog, WordSelectHdl_Impl ) ); m_xLangLB->connect_changed( LINK( this, SvxThesaurusDialog, LanguageHdl_Impl ) ); - m_xAlternativesCT->connect_changed( LINK( this, SvxThesaurusDialog, AlternativesSelectHdl_Impl )); + m_xAlternativesCT->connect_selection_changed( + LINK(this, SvxThesaurusDialog, AlternativesSelectHdl_Impl)); m_xAlternativesCT->connect_row_activated( LINK( this, SvxThesaurusDialog, AlternativesDoubleClickHdl_Impl )); m_xAlternativesCT->connect_key_press(LINK(this, SvxThesaurusDialog, KeyInputHdl)); diff --git a/cui/source/inc/MacroManagerDialog.hxx b/cui/source/inc/MacroManagerDialog.hxx index 25b24c1b6c8e..757728386e59 100644 --- a/cui/source/inc/MacroManagerDialog.hxx +++ b/cui/source/inc/MacroManagerDialog.hxx @@ -71,7 +71,7 @@ public: void connect_changed(const Link& rLink) { - m_xTreeView->connect_changed(rLink); + m_xTreeView->connect_selection_changed(rLink); } void connect_popup_menu(const Link& rLink) { @@ -149,7 +149,7 @@ public: void connect_changed(const Link& rLink) { - m_xTreeView->connect_changed(rLink); + m_xTreeView->connect_selection_changed(rLink); } weld::TreeView& get_widget() { return *m_xTreeView; } void ClearAll(); diff --git a/cui/source/inc/cfgutil.hxx b/cui/source/inc/cfgutil.hxx index ce409c98e72d..0dd4e1f86a58 100644 --- a/cui/source/inc/cfgutil.hxx +++ b/cui/source/inc/cfgutil.hxx @@ -116,7 +116,10 @@ class CuiConfigFunctionListBox public: CuiConfigFunctionListBox(std::unique_ptr xTreeView); void set_sensitive(bool bSensitive) { m_xTreeView->set_sensitive(bSensitive); } - void connect_changed(const Link& rLink) { m_xTreeView->connect_changed(rLink); } + void connect_changed(const Link& rLink) + { + m_xTreeView->connect_selection_changed(rLink); + } void connect_popup_menu(const Link& rLink) { m_xTreeView->connect_popup_menu(rLink); } void connect_row_activated(const Link& rLink) { m_xTreeView->connect_row_activated(rLink); } void freeze() { m_xTreeView->freeze(); } @@ -210,7 +213,10 @@ class CuiConfigGroupListBox public: CuiConfigGroupListBox(std::unique_ptr xTreeView); void set_sensitive(bool bSensitive) { m_xTreeView->set_sensitive(bSensitive); } - void connect_changed(const Link& rLink) { m_xTreeView->connect_changed(rLink); } + void connect_changed(const Link& rLink) + { + m_xTreeView->connect_selection_changed(rLink); + } void set_size_request(int nWidth, int nHeight) { m_xTreeView->set_size_request(nWidth, nHeight); } weld::TreeView& get_widget() { return *m_xTreeView; } ~CuiConfigGroupListBox(); diff --git a/cui/source/options/connpooloptions.cxx b/cui/source/options/connpooloptions.cxx index 557f6cae0fab..2fe1a6982bc5 100644 --- a/cui/source/options/connpooloptions.cxx +++ b/cui/source/options/connpooloptions.cxx @@ -79,7 +79,8 @@ namespace offapp m_xEnablePooling->connect_toggled( LINK(this, ConnectionPoolOptionsPage, OnEnabledDisabled) ); m_xDriverPoolingEnabled->connect_toggled( LINK(this, ConnectionPoolOptionsPage, OnEnabledDisabled) ); - m_xDriverList->connect_changed(LINK(this, ConnectionPoolOptionsPage, OnDriverRowChanged)); + m_xDriverList->connect_selection_changed( + LINK(this, ConnectionPoolOptionsPage, OnDriverRowChanged)); m_xTimeout->connect_value_changed(LINK(this, ConnectionPoolOptionsPage, OnSpinValueChanged)); } diff --git a/cui/source/options/dbregister.cxx b/cui/source/options/dbregister.cxx index b345614fa857..45c8398d23a6 100644 --- a/cui/source/options/dbregister.cxx +++ b/cui/source/options/dbregister.cxx @@ -112,7 +112,7 @@ DbRegistrationOptionsPage::DbRegistrationOptionsPage(weld::Container* pPage, wel m_xPathBox->make_sorted(); m_xPathBox->connect_row_activated( LINK( this, DbRegistrationOptionsPage, PathBoxDoubleClickHdl ) ); - m_xPathBox->connect_changed( LINK( this, DbRegistrationOptionsPage, PathSelect_Impl ) ); + m_xPathBox->connect_selection_changed(LINK(this, DbRegistrationOptionsPage, PathSelect_Impl)); m_xPathBox->set_help_id(HID_DBPATH_CTL_PATH); } diff --git a/cui/source/options/fontsubs.cxx b/cui/source/options/fontsubs.cxx index 2f9d44c0b497..ad7e4e8d8011 100644 --- a/cui/source/options/fontsubs.cxx +++ b/cui/source/options/fontsubs.cxx @@ -72,7 +72,7 @@ SvxFontSubstTabPage::SvxFontSubstTabPage(weld::Container* pPage, weld::DialogCon Link aLink2(LINK(this, SvxFontSubstTabPage, SelectComboBoxHdl)); Link aClickLink(LINK(this, SvxFontSubstTabPage, ClickHdl)); - m_xCheckLB->connect_changed(LINK(this, SvxFontSubstTabPage, TreeListBoxSelectHdl)); + m_xCheckLB->connect_selection_changed(LINK(this, SvxFontSubstTabPage, TreeListBoxSelectHdl)); m_xCheckLB->connect_column_clicked(LINK(this, SvxFontSubstTabPage, HeaderBarClick)); m_xUseTableCB->connect_toggled(LINK(this, SvxFontSubstTabPage, ToggleHdl)); m_xFont1CB->connect_changed(aLink2); diff --git a/cui/source/options/optdict.cxx b/cui/source/options/optdict.cxx index f383280e5bc9..04dbd2ff801b 100644 --- a/cui/source/options/optdict.cxx +++ b/cui/source/options/optdict.cxx @@ -243,8 +243,8 @@ SvxEditDictionaryDialog::SvxEditDictionaryDialog(weld::Window* pParent, std::u16 if (LinguMgr::GetDictionaryList().is()) aDics = LinguMgr::GetDictionaryList()->getDictionaries(); - m_xSingleColumnLB->connect_changed(LINK(this, SvxEditDictionaryDialog, SelectHdl)); - m_xDoubleColumnLB->connect_changed(LINK(this, SvxEditDictionaryDialog, SelectHdl)); + m_xSingleColumnLB->connect_selection_changed(LINK(this, SvxEditDictionaryDialog, SelectHdl)); + m_xDoubleColumnLB->connect_selection_changed(LINK(this, SvxEditDictionaryDialog, SelectHdl)); std::vector aWidths { diff --git a/cui/source/options/optjava.cxx b/cui/source/options/optjava.cxx index e0124974ebfa..4a4ea15ff695 100644 --- a/cui/source/options/optjava.cxx +++ b/cui/source/options/optjava.cxx @@ -89,7 +89,7 @@ SvxJavaOptionsPage::SvxJavaOptionsPage(weld::Container* pPage, weld::DialogContr m_xJavaList->enable_toggle_buttons(weld::ColumnToggleType::Radio); m_xJavaList->connect_toggled( LINK( this, SvxJavaOptionsPage, CheckHdl_Impl ) ); - m_xJavaList->connect_changed( LINK( this, SvxJavaOptionsPage, SelectHdl_Impl ) ); + m_xJavaList->connect_selection_changed(LINK(this, SvxJavaOptionsPage, SelectHdl_Impl)); std::vector aWidths { @@ -653,7 +653,7 @@ SvxJavaParameterDlg::SvxJavaParameterDlg(weld::Window* pParent) m_xAssignBtn->connect_clicked( LINK( this, SvxJavaParameterDlg, AssignHdl_Impl ) ); m_xRemoveBtn->connect_clicked( LINK( this, SvxJavaParameterDlg, RemoveHdl_Impl ) ); m_xEditBtn->connect_clicked( LINK( this, SvxJavaParameterDlg, EditHdl_Impl ) ); - m_xAssignedList->connect_changed( LINK( this, SvxJavaParameterDlg, SelectHdl_Impl ) ); + m_xAssignedList->connect_selection_changed(LINK(this, SvxJavaParameterDlg, SelectHdl_Impl)); m_xAssignedList->connect_row_activated( LINK( this, SvxJavaParameterDlg, DblClickHdl_Impl ) ); ModifyHdl_Impl(*m_xParameterEdit); @@ -814,7 +814,7 @@ SvxJavaClassPathDlg::SvxJavaClassPathDlg(weld::Window* pParent) m_xAddArchiveBtn->connect_clicked( LINK( this, SvxJavaClassPathDlg, AddArchiveHdl_Impl ) ); m_xAddPathBtn->connect_clicked( LINK( this, SvxJavaClassPathDlg, AddPathHdl_Impl ) ); m_xRemoveBtn->connect_clicked( LINK( this, SvxJavaClassPathDlg, RemoveHdl_Impl ) ); - m_xPathList->connect_changed( LINK( this, SvxJavaClassPathDlg, SelectHdl_Impl ) ); + m_xPathList->connect_selection_changed(LINK(this, SvxJavaClassPathDlg, SelectHdl_Impl)); // set initial focus to path list m_xPathList->grab_focus(); diff --git a/cui/source/options/optlingu.cxx b/cui/source/options/optlingu.cxx index c07ab32a1d85..2d6e77ffed07 100644 --- a/cui/source/options/optlingu.cxx +++ b/cui/source/options/optlingu.cxx @@ -815,21 +815,21 @@ SvxLinguTabPage::SvxLinguTabPage(weld::Container* pPage, weld::DialogController* m_xLinguDicsCLB->enable_toggle_buttons(weld::ColumnToggleType::Check); m_xLinguOptionsCLB->enable_toggle_buttons(weld::ColumnToggleType::Check); - m_xLinguModulesCLB->connect_changed( LINK( this, SvxLinguTabPage, SelectHdl_Impl )); + m_xLinguModulesCLB->connect_selection_changed(LINK(this, SvxLinguTabPage, SelectHdl_Impl)); m_xLinguModulesCLB->connect_row_activated(LINK(this, SvxLinguTabPage, BoxDoubleClickHdl_Impl)); m_xLinguModulesCLB->connect_toggled(LINK(this, SvxLinguTabPage, ModulesBoxCheckButtonHdl_Impl)); m_xLinguModulesEditPB->connect_clicked( LINK( this, SvxLinguTabPage, ClickHdl_Impl )); m_xLinguOptionsEditPB->connect_clicked( LINK( this, SvxLinguTabPage, ClickHdl_Impl )); - m_xLinguDicsCLB->connect_changed( LINK( this, SvxLinguTabPage, SelectHdl_Impl )); + m_xLinguDicsCLB->connect_selection_changed(LINK(this, SvxLinguTabPage, SelectHdl_Impl)); m_xLinguDicsCLB->connect_toggled(LINK(this, SvxLinguTabPage, DicsBoxCheckButtonHdl_Impl)); m_xLinguDicsNewPB->connect_clicked( LINK( this, SvxLinguTabPage, ClickHdl_Impl )); m_xLinguDicsEditPB->connect_clicked( LINK( this, SvxLinguTabPage, ClickHdl_Impl )); m_xLinguDicsDelPB->connect_clicked( LINK( this, SvxLinguTabPage, ClickHdl_Impl )); - m_xLinguOptionsCLB->connect_changed( LINK( this, SvxLinguTabPage, SelectHdl_Impl )); + m_xLinguOptionsCLB->connect_selection_changed(LINK(this, SvxLinguTabPage, SelectHdl_Impl)); m_xLinguOptionsCLB->connect_row_activated(LINK(this, SvxLinguTabPage, BoxDoubleClickHdl_Impl)); m_xMoreDictsLink->connect_activate_link(LINK(this, SvxLinguTabPage, OnLinkClick)); @@ -1579,7 +1579,7 @@ SvxEditModulesDlg::SvxEditModulesDlg(weld::Window* pParent, SvxLinguData_Impl& r pDefaultLinguData.reset( new SvxLinguData_Impl( rLinguData ) ); - m_xModulesCLB->connect_changed( LINK( this, SvxEditModulesDlg, SelectHdl_Impl )); + m_xModulesCLB->connect_selection_changed(LINK(this, SvxEditModulesDlg, SelectHdl_Impl)); m_xModulesCLB->connect_toggled(LINK(this, SvxEditModulesDlg, BoxCheckButtonHdl_Impl)); m_xClosePB->connect_clicked( LINK( this, SvxEditModulesDlg, ClickHdl_Impl )); diff --git a/cui/source/options/optpath.cxx b/cui/source/options/optpath.cxx index 97f9c5535cb8..29c554fe8ffb 100644 --- a/cui/source/options/optpath.cxx +++ b/cui/source/options/optpath.cxx @@ -192,7 +192,7 @@ SvxPathTabPage::SvxPathTabPage(weld::Container* pPage, weld::DialogController* p m_xPathBox->connect_row_activated( LINK( this, SvxPathTabPage, DoubleClickPathHdl_Impl ) ); m_xPathBox->connect_column_clicked(LINK(this, SvxPathTabPage, HeaderBarClick)); - m_xPathBox->connect_changed( LINK( this, SvxPathTabPage, PathSelect_Impl ) ); + m_xPathBox->connect_selection_changed(LINK(this, SvxPathTabPage, PathSelect_Impl)); m_xPathBox->set_selection_mode(SelectionMode::Multiple); xDialogListener->SetDialogClosedLink( LINK( this, SvxPathTabPage, DialogClosedHdl ) ); diff --git a/cui/source/options/treeopt.cxx b/cui/source/options/treeopt.cxx index f5d6a9eaf040..32dd79d90a5c 100644 --- a/cui/source/options/treeopt.cxx +++ b/cui/source/options/treeopt.cxx @@ -481,7 +481,7 @@ OfaTreeOptionsDialog::OfaTreeOptionsDialog(weld::Window* pParent, bool fromExten // Init tree and handler xTreeLB->set_help_id(HID_OFADLG_TREELISTBOX); - xTreeLB->connect_changed(LINK(this, OfaTreeOptionsDialog, ShowPageHdl_Impl)); + xTreeLB->connect_selection_changed(LINK(this, OfaTreeOptionsDialog, ShowPageHdl_Impl)); xBackPB->connect_clicked(LINK(this, OfaTreeOptionsDialog, BackHdl_Impl)); xApplyPB->connect_clicked(LINK(this, OfaTreeOptionsDialog, ApplyHdl_Impl)); xOkPB->connect_clicked(LINK(this, OfaTreeOptionsDialog, ApplyHdl_Impl)); diff --git a/cui/source/options/tsaurls.cxx b/cui/source/options/tsaurls.cxx index 925dafbccf21..81a3130852cd 100644 --- a/cui/source/options/tsaurls.cxx +++ b/cui/source/options/tsaurls.cxx @@ -31,7 +31,7 @@ TSAURLsDialog::TSAURLsDialog(weld::Window* pParent) m_xAddBtn->connect_clicked(LINK(this, TSAURLsDialog, AddHdl_Impl)); m_xDeleteBtn->connect_clicked(LINK(this, TSAURLsDialog, DeleteHdl_Impl)); m_xOKBtn->connect_clicked(LINK(this, TSAURLsDialog, OKHdl_Impl)); - m_xURLListBox->connect_changed(LINK(this, TSAURLsDialog, SelectHdl)); + m_xURLListBox->connect_selection_changed(LINK(this, TSAURLsDialog, SelectHdl)); try { diff --git a/cui/source/options/webconninfo.cxx b/cui/source/options/webconninfo.cxx index 4ad32400ebe5..bb55e8dcfa49 100644 --- a/cui/source/options/webconninfo.cxx +++ b/cui/source/options/webconninfo.cxx @@ -57,7 +57,8 @@ WebConnectionInfoDialog::WebConnectionInfoDialog(weld::Window* pParent) m_xRemoveBtn->connect_clicked( LINK( this, WebConnectionInfoDialog, RemovePasswordHdl ) ); m_xRemoveAllBtn->connect_clicked( LINK( this, WebConnectionInfoDialog, RemoveAllPasswordsHdl ) ); m_xChangeBtn->connect_clicked( LINK( this, WebConnectionInfoDialog, ChangePasswordHdl ) ); - m_xPasswordsLB->connect_changed( LINK( this, WebConnectionInfoDialog, EntrySelectedHdl ) ); + m_xPasswordsLB->connect_selection_changed( + LINK(this, WebConnectionInfoDialog, EntrySelectedHdl)); m_xRemoveBtn->set_sensitive( false ); m_xChangeBtn->set_sensitive( false ); diff --git a/cui/source/tabpages/autocdlg.cxx b/cui/source/tabpages/autocdlg.cxx index ba3998445cf5..31e77373a644 100644 --- a/cui/source/tabpages/autocdlg.cxx +++ b/cui/source/tabpages/autocdlg.cxx @@ -382,7 +382,7 @@ OfaSwAutoFmtOptionsPage::OfaSwAutoFmtOptionsPage(weld::Container* pPage, weld::D , m_xCheckLB(m_xBuilder->weld_tree_view(u"list"_ustr)) , m_xEditPB(m_xBuilder->weld_button(u"edit"_ustr)) { - m_xCheckLB->connect_changed(LINK(this, OfaSwAutoFmtOptionsPage, SelectHdl)); + m_xCheckLB->connect_selection_changed(LINK(this, OfaSwAutoFmtOptionsPage, SelectHdl)); m_xCheckLB->connect_row_activated(LINK(this, OfaSwAutoFmtOptionsPage, DoubleClickEditHdl)); std::vector aWidths @@ -728,7 +728,7 @@ OfaAutocorrReplacePage::OfaAutocorrReplacePage(weld::Container* pPage, weld::Dia m_aReplaceFixedWidths.push_back(nColWidth); m_aReplaceFixedWidths.push_back(nColWidth); - m_xReplaceTLB->connect_changed( LINK(this, OfaAutocorrReplacePage, SelectHdl) ); + m_xReplaceTLB->connect_selection_changed(LINK(this, OfaAutocorrReplacePage, SelectHdl)); m_xNewReplacePB->connect_clicked( LINK(this, OfaAutocorrReplacePage, NewDelButtonHdl) ); m_xDeleteReplacePB->connect_clicked( LINK(this, OfaAutocorrReplacePage, NewDelButtonHdl) ); m_xShortED->connect_changed( LINK(this, OfaAutocorrReplacePage, ModifyHdl) ); @@ -1241,8 +1241,8 @@ OfaAutocorrExceptPage::OfaAutocorrExceptPage(weld::Container* pPage, weld::Dialo m_xNewDoublePB->connect_clicked(LINK(this, OfaAutocorrExceptPage, NewDelButtonHdl)); m_xDelDoublePB->connect_clicked(LINK(this, OfaAutocorrExceptPage, NewDelButtonHdl)); - m_xAbbrevLB->connect_changed(LINK(this, OfaAutocorrExceptPage, SelectHdl)); - m_xDoubleCapsLB->connect_changed(LINK(this, OfaAutocorrExceptPage, SelectHdl)); + m_xAbbrevLB->connect_selection_changed(LINK(this, OfaAutocorrExceptPage, SelectHdl)); + m_xDoubleCapsLB->connect_selection_changed(LINK(this, OfaAutocorrExceptPage, SelectHdl)); m_xAbbrevED->connect_changed(LINK(this, OfaAutocorrExceptPage, ModifyHdl)); m_xDoubleCapsED->connect_changed(LINK(this, OfaAutocorrExceptPage, ModifyHdl)); @@ -2180,7 +2180,7 @@ OfaSmartTagOptionsTabPage::OfaSmartTagOptionsTabPage(weld::Container* pPage, wel // set the handlers: m_xMainCB->connect_toggled(LINK(this, OfaSmartTagOptionsTabPage, CheckHdl)); m_xPropertiesPB->connect_clicked(LINK(this, OfaSmartTagOptionsTabPage, ClickHdl)); - m_xSmartTagTypesLB->connect_changed(LINK(this, OfaSmartTagOptionsTabPage, SelectHdl)); + m_xSmartTagTypesLB->connect_selection_changed(LINK(this, OfaSmartTagOptionsTabPage, SelectHdl)); } OfaSmartTagOptionsTabPage::~OfaSmartTagOptionsTabPage() diff --git a/cui/source/tabpages/chardlg.cxx b/cui/source/tabpages/chardlg.cxx index a8d4f716ca3b..1a8a6630aae1 100644 --- a/cui/source/tabpages/chardlg.cxx +++ b/cui/source/tabpages/chardlg.cxx @@ -3078,8 +3078,8 @@ void SvxCharTwoLinesPage::Initialize() m_xTwoLinesBtn->connect_toggled(LINK(this, SvxCharTwoLinesPage, TwoLinesHdl_Impl)); Link aLink = LINK(this, SvxCharTwoLinesPage, CharacterMapHdl_Impl); - m_xStartBracketLB->connect_changed(aLink); - m_xEndBracketLB->connect_changed(aLink); + m_xStartBracketLB->connect_selection_changed(aLink); + m_xEndBracketLB->connect_selection_changed(aLink); SvxFont& rFont = GetPreviewFont(); SvxFont& rCJKFont = GetPreviewCJKFont(); diff --git a/cui/source/tabpages/macroass.cxx b/cui/source/tabpages/macroass.cxx index c0442e7fceaa..afbacb30ad54 100644 --- a/cui/source/tabpages/macroass.cxx +++ b/cui/source/tabpages/macroass.cxx @@ -332,7 +332,7 @@ void SfxMacroTabPage::InitAndSetHandler() mpImpl->m_xAssignPB->connect_clicked(LINK(this, SfxMacroTabPage, AssignDeleteClickHdl_Impl)); rListBox.connect_row_activated(aLnk); - rListBox.connect_changed(LINK(this, SfxMacroTabPage, SelectEvent_Impl)); + rListBox.connect_selection_changed(LINK(this, SfxMacroTabPage, SelectEvent_Impl)); mpImpl->m_xGroupLB->connect_changed(LINK(this, SfxMacroTabPage, SelectGroup_Impl)); mpImpl->m_xMacroLB->connect_changed(LINK(this, SfxMacroTabPage, SelectMacro_Impl)); diff --git a/cui/source/tabpages/numfmt.cxx b/cui/source/tabpages/numfmt.cxx index ab05111e7b95..059c148713c4 100644 --- a/cui/source/tabpages/numfmt.cxx +++ b/cui/source/tabpages/numfmt.cxx @@ -275,9 +275,9 @@ void SvxNumberFormatTabPage::Init_Impl() Link aLink2 = LINK(this, SvxNumberFormatTabPage, SelFormatTreeListBoxHdl_Impl); Link aLink3 = LINK(this, SvxNumberFormatTabPage, SelFormatListBoxHdl_Impl); - m_xLbCategory->connect_changed(aLink2); + m_xLbCategory->connect_selection_changed(aLink2); m_xLbCategory->connect_focus_in(LINK(this, SvxNumberFormatTabPage, LostFocusHdl_Impl)); - m_xLbFormat->connect_changed(aLink2); + m_xLbFormat->connect_selection_changed(aLink2); m_xLbFormat->connect_focus_in(LINK(this, SvxNumberFormatTabPage, LostFocusHdl_Impl)); m_xLbLanguage->connect_changed(aLink3); m_xLbLanguage->connect_focus_in(LINK(this, SvxNumberFormatTabPage, LostFocusHdl_Impl)); diff --git a/cui/source/tabpages/numpages.cxx b/cui/source/tabpages/numpages.cxx index c2309176784f..2dccf21d04e2 100644 --- a/cui/source/tabpages/numpages.cxx +++ b/cui/source/tabpages/numpages.cxx @@ -1170,7 +1170,7 @@ SvxNumOptionsTabPage::SvxNumOptionsTabPage(weld::Container* pPage, weld::DialogC m_xBitmapMB->connect_selected(LINK(this, SvxNumOptionsTabPage, GraphicHdl_Impl)); m_xBitmapMB->connect_toggled(LINK(this, SvxNumOptionsTabPage, PopupActivateHdl_Impl)); m_xLevelLB->set_selection_mode(SelectionMode::Multiple); - m_xLevelLB->connect_changed(LINK(this, SvxNumOptionsTabPage, LevelHdl_Impl)); + m_xLevelLB->connect_selection_changed(LINK(this, SvxNumOptionsTabPage, LevelHdl_Impl)); m_xCharFmtLB->connect_changed(LINK(this, SvxNumOptionsTabPage, CharFmtHdl_Impl)); m_xWidthMF->connect_value_changed(LINK(this, SvxNumOptionsTabPage, SizeHdl_Impl)); m_xHeightMF->connect_value_changed(LINK(this, SvxNumOptionsTabPage, SizeHdl_Impl)); @@ -2328,7 +2328,7 @@ SvxNumPositionTabPage::SvxNumPositionTabPage(weld::Container* pPage, weld::Dialo m_xIndentAtMF->connect_value_changed(LINK(this, SvxNumPositionTabPage, IndentAtHdl_Impl)); m_xLevelLB->set_selection_mode(SelectionMode::Multiple); - m_xLevelLB->connect_changed(LINK(this, SvxNumPositionTabPage, LevelHdl_Impl)); + m_xLevelLB->connect_selection_changed(LINK(this, SvxNumPositionTabPage, LevelHdl_Impl)); m_xRelativeCB->connect_toggled(LINK(this, SvxNumPositionTabPage, RelativeHdl_Impl)); m_xStandardPB->connect_clicked(LINK(this, SvxNumPositionTabPage, StandardHdl_Impl)); diff --git a/dbaccess/source/ui/app/AppDetailView.cxx b/dbaccess/source/ui/app/AppDetailView.cxx index a9613e1b4b36..68b47ae89539 100644 --- a/dbaccess/source/ui/app/AppDetailView.cxx +++ b/dbaccess/source/ui/app/AppDetailView.cxx @@ -118,7 +118,7 @@ OTasksWindow::OTasksWindow(weld::Container* pParent, OApplicationDetailView* pDe m_xTreeView->set_help_id(HID_APP_CREATION_LIST); m_xTreeView->connect_row_activated(LINK(this, OTasksWindow, onSelected)); - m_xTreeView->connect_changed(LINK(this, OTasksWindow, OnEntrySelectHdl)); + m_xTreeView->connect_selection_changed(LINK(this, OTasksWindow, OnEntrySelectHdl)); m_xTreeView->connect_focus_in(LINK(this, OTasksWindow, FocusInHdl)); m_xTreeView->connect_focus_out(LINK(this, OTasksWindow, FocusOutHdl)); // an arbitrary small size it's allowed to shrink to diff --git a/dbaccess/source/ui/control/dbtreelistbox.cxx b/dbaccess/source/ui/control/dbtreelistbox.cxx index c0ebd91ef87a..92e6f2e7d659 100644 --- a/dbaccess/source/ui/control/dbtreelistbox.cxx +++ b/dbaccess/source/ui/control/dbtreelistbox.cxx @@ -113,7 +113,7 @@ TreeListBox::TreeListBox(std::unique_ptr xTreeView, bool bSQLTyp , m_aTimer("dbaccess TreeListBox m_aTimer") { m_xTreeView->connect_key_press(LINK(this, TreeListBox, KeyInputHdl)); - m_xTreeView->connect_changed(LINK(this, TreeListBox, SelectHdl)); + m_xTreeView->connect_selection_changed(LINK(this, TreeListBox, SelectHdl)); m_xTreeView->connect_query_tooltip(LINK(this, TreeListBox, QueryTooltipHdl)); m_xTreeView->connect_popup_menu(LINK(this, TreeListBox, CommandHdl)); diff --git a/dbaccess/source/ui/dlg/adtabdlg.cxx b/dbaccess/source/ui/dlg/adtabdlg.cxx index 9c06085cb2e0..ade72252fda1 100644 --- a/dbaccess/source/ui/dlg/adtabdlg.cxx +++ b/dbaccess/source/ui/dlg/adtabdlg.cxx @@ -344,9 +344,9 @@ OAddTableDlg::OAddTableDlg(weld::Window* pParent, IAddTableDialogContext& _rCont m_xAddButton->connect_clicked( LINK( this, OAddTableDlg, AddClickHdl ) ); m_xCloseButton->connect_clicked( LINK( this, OAddTableDlg, CloseClickHdl ) ); rTableList.connect_row_activated( LINK( this, OAddTableDlg, TableListDoubleClickHdl ) ); - rTableList.connect_changed( LINK( this, OAddTableDlg, TableListSelectHdl ) ); + rTableList.connect_selection_changed(LINK(this, OAddTableDlg, TableListSelectHdl)); m_xQueryList->connect_row_activated( LINK( this, OAddTableDlg, TableListDoubleClickHdl ) ); - m_xQueryList->connect_changed( LINK( this, OAddTableDlg, TableListSelectHdl ) ); + m_xQueryList->connect_selection_changed(LINK(this, OAddTableDlg, TableListSelectHdl)); rTableList.set_selection_mode(SelectionMode::Single); m_xTableList->SuppressEmptyFolders(); diff --git a/dbaccess/source/ui/dlg/dbfindex.cxx b/dbaccess/source/ui/dlg/dbfindex.cxx index bb6f685ce0c1..77f974648369 100644 --- a/dbaccess/source/ui/dlg/dbfindex.cxx +++ b/dbaccess/source/ui/dlg/dbfindex.cxx @@ -65,8 +65,10 @@ ODbaseIndexDialog::ODbaseIndexDialog(weld::Window * pParent, OUString aDataSrcNa m_xRemoveAll->connect_clicked( LINK(this, ODbaseIndexDialog, RemoveAllClickHdl) ); m_xPB_OK->connect_clicked( LINK(this, ODbaseIndexDialog, OKClickHdl) ); - m_xLB_FreeIndexes->connect_changed( LINK(this, ODbaseIndexDialog, OnListEntrySelected) ); - m_xLB_TableIndexes->connect_changed( LINK(this, ODbaseIndexDialog, OnListEntrySelected) ); + m_xLB_FreeIndexes->connect_selection_changed( + LINK(this, ODbaseIndexDialog, OnListEntrySelected)); + m_xLB_TableIndexes->connect_selection_changed( + LINK(this, ODbaseIndexDialog, OnListEntrySelected)); Init(); SetCtrls(); diff --git a/dbaccess/source/ui/dlg/indexdialog.cxx b/dbaccess/source/ui/dlg/indexdialog.cxx index 738b9c07df3b..160eafa192ec 100644 --- a/dbaccess/source/ui/dlg/indexdialog.cxx +++ b/dbaccess/source/ui/dlg/indexdialog.cxx @@ -92,7 +92,7 @@ namespace dbaui m_xActions->connect_clicked(LINK(this, DbaIndexDialog, OnIndexAction)); - m_xIndexList->connect_changed(LINK(this, DbaIndexDialog, OnIndexSelected)); + m_xIndexList->connect_selection_changed(LINK(this, DbaIndexDialog, OnIndexSelected)); m_xIndexList->connect_editing(LINK(this, DbaIndexDialog, OnEntryEditing), LINK(this, DbaIndexDialog, OnEntryEdited)); diff --git a/dbaccess/source/ui/dlg/paramdialog.cxx b/dbaccess/source/ui/dlg/paramdialog.cxx index ad1c23baa9f4..299ab8454594 100644 --- a/dbaccess/source/ui/dlg/paramdialog.cxx +++ b/dbaccess/source/ui/dlg/paramdialog.cxx @@ -109,7 +109,8 @@ namespace dbaui void OParameterDialog::Construct() { - m_xAllParams->connect_changed(LINK(this, OParameterDialog, OnEntryListBoxSelected)); + m_xAllParams->connect_selection_changed( + LINK(this, OParameterDialog, OnEntryListBoxSelected)); m_xParam->connect_focus_out(LINK(this, OParameterDialog, OnValueLoseFocusHdl)); m_xParam->connect_changed(LINK(this, OParameterDialog, OnValueModified)); m_xTravelNext->connect_clicked(LINK(this, OParameterDialog, OnButtonClicked)); diff --git a/dbaccess/source/ui/dlg/sqlmessage.cxx b/dbaccess/source/ui/dlg/sqlmessage.cxx index 0e539a34cb38..60b533f90c19 100644 --- a/dbaccess/source/ui/dlg/sqlmessage.cxx +++ b/dbaccess/source/ui/dlg/sqlmessage.cxx @@ -290,7 +290,8 @@ OExceptionChainDialog::OExceptionChainDialog(weld::Window* pParent, ExceptionDis m_sStatusLabel = DBA_RES( STR_EXCEPTION_STATUS ); m_sErrorCodeLabel = DBA_RES( STR_EXCEPTION_ERRORCODE ); - m_xExceptionList->connect_changed(LINK(this, OExceptionChainDialog, OnExceptionSelected)); + m_xExceptionList->connect_selection_changed( + LINK(this, OExceptionChainDialog, OnExceptionSelected)); bool bHave22018 = false; size_t elementPos = 0; diff --git a/dbaccess/source/ui/inc/WTypeSelect.hxx b/dbaccess/source/ui/inc/WTypeSelect.hxx index 56af0e355d1a..dfda5f6937c0 100644 --- a/dbaccess/source/ui/inc/WTypeSelect.hxx +++ b/dbaccess/source/ui/inc/WTypeSelect.hxx @@ -87,7 +87,7 @@ namespace dbaui void connect_changed(const Link& rLink) { m_aChangeHdl = rLink; - m_xControl->connect_changed(rLink); + m_xControl->connect_selection_changed(rLink); } }; diff --git a/dbaccess/source/ui/misc/WNameMatch.cxx b/dbaccess/source/ui/misc/WNameMatch.cxx index 0d6c3c835163..5eba2844b625 100644 --- a/dbaccess/source/ui/misc/WNameMatch.cxx +++ b/dbaccess/source/ui/misc/WNameMatch.cxx @@ -60,8 +60,8 @@ OWizNameMatching::OWizNameMatching(weld::Container* pPage, OCopyTableWizard* pWi m_xCTRL_LEFT->enable_toggle_buttons(weld::ColumnToggleType::Check); - m_xCTRL_LEFT->connect_changed(LINK(this,OWizNameMatching,TableListClickHdl)); - m_xCTRL_RIGHT->connect_changed(LINK(this,OWizNameMatching,TableListRightSelectHdl)); + m_xCTRL_LEFT->connect_selection_changed(LINK(this, OWizNameMatching, TableListClickHdl)); + m_xCTRL_RIGHT->connect_selection_changed(LINK(this, OWizNameMatching, TableListRightSelectHdl)); m_sSourceText = m_xTABLE_LEFT->get_label() + "\n"; m_sDestText = m_xTABLE_RIGHT->get_label() + "\n"; diff --git a/desktop/source/deployment/gui/dp_gui_updatedialog.cxx b/desktop/source/deployment/gui/dp_gui_updatedialog.cxx index 9117fdfd1048..da576ee07b52 100644 --- a/desktop/source/deployment/gui/dp_gui_updatedialog.cxx +++ b/desktop/source/deployment/gui/dp_gui_updatedialog.cxx @@ -462,7 +462,7 @@ UpdateDialog::UpdateDialog( m_xExtensionManager = deployment::ExtensionManager::get( context ); - m_xUpdates->connect_changed(LINK(this, UpdateDialog, selectionHandler)); + m_xUpdates->connect_selection_changed(LINK(this, UpdateDialog, selectionHandler)); m_xUpdates->connect_toggled(LINK(this, UpdateDialog, entryToggled)); m_xAll->connect_toggled(LINK(this, UpdateDialog, allHandler)); m_xOk->connect_clicked(LINK(this, UpdateDialog, okHandler)); diff --git a/extensions/source/abpilot/tableselectionpage.cxx b/extensions/source/abpilot/tableselectionpage.cxx index 1df2ef092e31..31f88d35a446 100644 --- a/extensions/source/abpilot/tableselectionpage.cxx +++ b/extensions/source/abpilot/tableselectionpage.cxx @@ -31,7 +31,7 @@ namespace abp : AddressBookSourcePage(pPage, pController, u"modules/sabpilot/ui/selecttablepage.ui"_ustr, u"SelectTablePage"_ustr) , m_xTableList(m_xBuilder->weld_tree_view(u"table"_ustr)) { - m_xTableList->connect_changed( LINK( this, TableSelectionPage, OnTableSelected ) ); + m_xTableList->connect_selection_changed(LINK(this, TableSelectionPage, OnTableSelected)); m_xTableList->connect_row_activated( LINK( this, TableSelectionPage, OnTableDoubleClicked ) ); } diff --git a/extensions/source/dbpilots/commonpagesdbp.cxx b/extensions/source/dbpilots/commonpagesdbp.cxx index 9aea1855f199..f3007dcea177 100644 --- a/extensions/source/dbpilots/commonpagesdbp.cxx +++ b/extensions/source/dbpilots/commonpagesdbp.cxx @@ -71,8 +71,9 @@ namespace dbp OSL_FAIL("OTableSelectionPage::OTableSelectionPage: could not collect the data source names!"); } - m_xDatasource->connect_changed(LINK(this, OTableSelectionPage, OnListboxSelection)); - m_xTable->connect_changed(LINK(this, OTableSelectionPage, OnListboxSelection)); + m_xDatasource->connect_selection_changed( + LINK(this, OTableSelectionPage, OnListboxSelection)); + m_xTable->connect_selection_changed(LINK(this, OTableSelectionPage, OnListboxSelection)); m_xTable->connect_row_activated(LINK(this, OTableSelectionPage, OnListboxDoubleClicked)); m_xSearchDatabase->connect_clicked(LINK(this, OTableSelectionPage, OnSearchClicked)); } diff --git a/extensions/source/dbpilots/gridwizard.cxx b/extensions/source/dbpilots/gridwizard.cxx index edf5f9090afe..5bb9625773e2 100644 --- a/extensions/source/dbpilots/gridwizard.cxx +++ b/extensions/source/dbpilots/gridwizard.cxx @@ -292,8 +292,9 @@ namespace dbp m_xDeselectOne->connect_clicked(LINK(this, OGridFieldsSelection, OnMoveOneEntry)); m_xDeselectAll->connect_clicked(LINK(this, OGridFieldsSelection, OnMoveAllEntries)); - m_xExistFields->connect_changed(LINK(this, OGridFieldsSelection, OnEntrySelected)); - m_xSelFields->connect_changed(LINK(this, OGridFieldsSelection, OnEntrySelected)); + m_xExistFields->connect_selection_changed( + LINK(this, OGridFieldsSelection, OnEntrySelected)); + m_xSelFields->connect_selection_changed(LINK(this, OGridFieldsSelection, OnEntrySelected)); m_xExistFields->connect_row_activated(LINK(this, OGridFieldsSelection, OnEntryDoubleClicked)); m_xSelFields->connect_row_activated(LINK(this, OGridFieldsSelection, OnEntryDoubleClicked)); } diff --git a/extensions/source/dbpilots/groupboxwiz.cxx b/extensions/source/dbpilots/groupboxwiz.cxx index 46d6ad1db75f..9ad3e234336f 100644 --- a/extensions/source/dbpilots/groupboxwiz.cxx +++ b/extensions/source/dbpilots/groupboxwiz.cxx @@ -180,7 +180,8 @@ namespace dbp m_xMoveLeft->connect_clicked(LINK(this, ORadioSelectionPage, OnMoveEntry)); m_xMoveRight->connect_clicked(LINK(this, ORadioSelectionPage, OnMoveEntry)); m_xRadioName->connect_changed(LINK(this, ORadioSelectionPage, OnNameModified)); - m_xExistingRadios->connect_changed(LINK(this, ORadioSelectionPage, OnEntrySelected)); + m_xExistingRadios->connect_selection_changed( + LINK(this, ORadioSelectionPage, OnEntrySelected)); implCheckMoveButtons(); m_xExistingRadios->set_selection_mode(SelectionMode::Multiple); @@ -341,7 +342,7 @@ namespace dbp , m_xOptions(m_xBuilder->weld_tree_view(u"radiobuttons"_ustr)) , m_nLastSelection(::vcl::WizardTypes::WizardState(-1)) { - m_xOptions->connect_changed(LINK(this, OOptionValuesPage, OnOptionSelected)); + m_xOptions->connect_selection_changed(LINK(this, OOptionValuesPage, OnOptionSelected)); } OOptionValuesPage::~OOptionValuesPage() diff --git a/extensions/source/dbpilots/listcombowizard.cxx b/extensions/source/dbpilots/listcombowizard.cxx index ed8caf2acc71..f1678379dda5 100644 --- a/extensions/source/dbpilots/listcombowizard.cxx +++ b/extensions/source/dbpilots/listcombowizard.cxx @@ -265,7 +265,8 @@ namespace dbp enableFormDatasourceDisplay(); m_xSelectTable->connect_row_activated(LINK(this, OContentTableSelection, OnTableDoubleClicked)); - m_xSelectTable->connect_changed(LINK(this, OContentTableSelection, OnTableSelected)); + m_xSelectTable->connect_selection_changed( + LINK(this, OContentTableSelection, OnTableSelected)); } OContentTableSelection::~OContentTableSelection() @@ -342,7 +343,8 @@ namespace dbp , m_xInfo(m_xBuilder->weld_label(u"info"_ustr)) { m_xInfo->set_label(compmodule::ModuleRes( isListBox() ? RID_STR_FIELDINFO_LISTBOX : RID_STR_FIELDINFO_COMBOBOX)); - m_xSelectTableField->connect_changed(LINK(this, OContentFieldSelection, OnFieldSelected)); + m_xSelectTableField->connect_selection_changed( + LINK(this, OContentFieldSelection, OnFieldSelected)); m_xSelectTableField->connect_row_activated(LINK(this, OContentFieldSelection, OnTableDoubleClicked)); } diff --git a/extensions/source/propctrlr/selectlabeldialog.cxx b/extensions/source/propctrlr/selectlabeldialog.cxx index f0ba29207794..4fe9116d7096 100644 --- a/extensions/source/propctrlr/selectlabeldialog.cxx +++ b/extensions/source/propctrlr/selectlabeldialog.cxx @@ -60,7 +60,7 @@ namespace pcr , m_xScratchIter(m_xControlTree->make_iterator()) , m_xNoAssignment(m_xBuilder->weld_check_button(u"noassignment"_ustr)) { - m_xControlTree->connect_changed(LINK(this, OSelectLabelDialog, OnEntrySelected)); + m_xControlTree->connect_selection_changed(LINK(this, OSelectLabelDialog, OnEntrySelected)); m_xControlTree->set_size_request(-1, m_xControlTree->get_height_rows(8)); // fill the description diff --git a/extensions/source/scanner/sanedlg.cxx b/extensions/source/scanner/sanedlg.cxx index b7c4ff4d051f..7c2af809a6ab 100644 --- a/extensions/source/scanner/sanedlg.cxx +++ b/extensions/source/scanner/sanedlg.cxx @@ -270,7 +270,7 @@ SaneDlg::SaneDlg(weld::Window* pParent, Sane& rSane, bool bScanEnabled) mxScanButton->connect_clicked( LINK( this, SaneDlg, ClickBtnHdl ) ); mxButtonOption->connect_clicked( LINK( this, SaneDlg, ClickBtnHdl ) ); mxDeviceBox->connect_changed( LINK( this, SaneDlg, SelectHdl ) ); - mxOptionBox->connect_changed( LINK( this, SaneDlg, OptionsBoxSelectHdl ) ); + mxOptionBox->connect_selection_changed(LINK(this, SaneDlg, OptionsBoxSelectHdl)); mxCancelButton->connect_clicked( LINK( this, SaneDlg, ClickBtnHdl ) ); mxBoolCheckBox->connect_toggled( LINK( this, SaneDlg, ToggleBtnHdl ) ); mxStringEdit->connect_changed( LINK( this, SaneDlg, ModifyHdl ) ); diff --git a/filter/source/pdf/impdialog.cxx b/filter/source/pdf/impdialog.cxx index 482d523bed63..ab84bdb95933 100644 --- a/filter/source/pdf/impdialog.cxx +++ b/filter/source/pdf/impdialog.cxx @@ -1689,7 +1689,7 @@ ImplErrorDialog::ImplErrorDialog(weld::Window* pParent, const std::setset_label(m_xErrors->get_id(0)); } - m_xErrors->connect_changed(LINK(this, ImplErrorDialog, SelectHdl)); + m_xErrors->connect_selection_changed(LINK(this, ImplErrorDialog, SelectHdl)); } IMPL_LINK_NOARG(ImplErrorDialog, SelectHdl, weld::TreeView&, void) diff --git a/filter/source/xsltdialog/xmlfiltersettingsdialog.cxx b/filter/source/xsltdialog/xmlfiltersettingsdialog.cxx index 06cb796f28e6..6490d0dcf535 100644 --- a/filter/source/xsltdialog/xmlfiltersettingsdialog.cxx +++ b/filter/source/xsltdialog/xmlfiltersettingsdialog.cxx @@ -80,7 +80,8 @@ XMLFilterSettingsDialog::XMLFilterSettingsDialog(weld::Window* pParent, m_xFilterListBox->set_size_request(m_xFilterListBox->get_approximate_digit_width() * 65, m_xFilterListBox->get_height_rows(12)); - m_xFilterListBox->connect_changed( LINK( this, XMLFilterSettingsDialog, SelectionChangedHdl_Impl ) ); + m_xFilterListBox->connect_selection_changed( + LINK(this, XMLFilterSettingsDialog, SelectionChangedHdl_Impl)); m_xFilterListBox->connect_row_activated( LINK( this, XMLFilterSettingsDialog, DoubleClickHdl_Impl ) ); m_xFilterListBox->set_accessible_name(FilterResId(STR_XML_FILTER_LISTBOX)); diff --git a/formula/source/ui/dlg/funcpage.cxx b/formula/source/ui/dlg/funcpage.cxx index 114cce0da52c..60d1e5adf2a0 100644 --- a/formula/source/ui/dlg/funcpage.cxx +++ b/formula/source/ui/dlg/funcpage.cxx @@ -73,7 +73,7 @@ FuncPage::FuncPage(weld::Container* pParent, const IFunctionManager* _pFunctionM m_xLbFunction->set_size_request(m_xLbFunction->get_preferred_size().Width(), m_xLbFunction->get_height_rows(15)); m_xLbCategory->connect_changed(LINK(this, FuncPage, SelComboBoxHdl)); - m_xLbFunction->connect_changed(LINK(this, FuncPage, SelTreeViewHdl)); + m_xLbFunction->connect_selection_changed(LINK(this, FuncPage, SelTreeViewHdl)); m_xLbFunction->connect_row_activated(LINK(this, FuncPage, DblClkHdl)); m_xLbFunction->connect_key_press(LINK(this, FuncPage, KeyInputHdl)); m_xLbFunctionSearchString->connect_changed(LINK(this, FuncPage, ModifyHdl)); diff --git a/formula/source/ui/dlg/structpg.cxx b/formula/source/ui/dlg/structpg.cxx index be73dffd0594..94101f0da986 100644 --- a/formula/source/ui/dlg/structpg.cxx +++ b/formula/source/ui/dlg/structpg.cxx @@ -44,7 +44,7 @@ StructPage::StructPage(weld::Container* pParent) m_xTlbStruct->set_size_request(m_xTlbStruct->get_approximate_digit_width() * 20, m_xTlbStruct->get_height_rows(17)); - m_xTlbStruct->connect_changed(LINK( this, StructPage, SelectHdl ) ); + m_xTlbStruct->connect_selection_changed(LINK(this, StructPage, SelectHdl)); } StructPage::~StructPage() diff --git a/fpicker/source/office/PlacesListBox.cxx b/fpicker/source/office/PlacesListBox.cxx index 86bd505179a3..c8e815969879 100644 --- a/fpicker/source/office/PlacesListBox.cxx +++ b/fpicker/source/office/PlacesListBox.cxx @@ -27,7 +27,7 @@ PlacesListBox::PlacesListBox(std::unique_ptr xControl, mxImpl->get_height_rows(9)); mxImpl->set_size_request(aSize.Width(), aSize.Height()); - mxImpl->connect_changed( LINK( this, PlacesListBox, Selection ) ); + mxImpl->connect_selection_changed(LINK(this, PlacesListBox, Selection)); mxImpl->connect_row_activated( LINK( this, PlacesListBox, DoubleClick ) ) ; mxImpl->connect_query_tooltip(LINK(this, PlacesListBox, QueryTooltipHdl)); } diff --git a/fpicker/source/office/fileview.cxx b/fpicker/source/office/fileview.cxx index b7eb966e2b58..a5756f5d28d4 100644 --- a/fpicker/source/office/fileview.cxx +++ b/fpicker/source/office/fileview.cxx @@ -176,7 +176,10 @@ public: OUString get_id(const weld::TreeIter& rIter) { return mxTreeView->get_id(rIter); } void connect_row_activated(const Link& rLink) { mxTreeView->connect_row_activated(rLink); } - void connect_changed(const Link& rLink) { mxTreeView->connect_changed(rLink); } + void connect_changed(const Link& rLink) + { + mxTreeView->connect_selection_changed(rLink); + } int n_children() const { return mxTreeView->n_children(); } diff --git a/fpicker/source/office/foldertree.hxx b/fpicker/source/office/foldertree.hxx index 5ee3f794e4f7..9af03f79ff42 100644 --- a/fpicker/source/office/foldertree.hxx +++ b/fpicker/source/office/foldertree.hxx @@ -37,7 +37,10 @@ public: void clear() { m_xTreeView->clear(); } - void connect_changed(const Link& rLink) { m_xTreeView->connect_changed(rLink); } + void connect_changed(const Link& rLink) + { + m_xTreeView->connect_selection_changed(rLink); + } void InsertRootEntry(const OUString& rId, const OUString& rRootLabel); void FillTreeEntry(const weld::TreeIter& rEntry); diff --git a/include/svx/txencbox.hxx b/include/svx/txencbox.hxx index 7795ea81e764..39a878c3dc49 100644 --- a/include/svx/txencbox.hxx +++ b/include/svx/txencbox.hxx @@ -132,7 +132,10 @@ public: rtl_TextEncoding GetSelectTextEncoding() const; - void connect_changed(const Link& rLink) { m_xControl->connect_changed(rLink); } + void connect_changed(const Link& rLink) + { + m_xControl->connect_selection_changed(rLink); + } void connect_row_activated(const Link& rLink) { m_xControl->connect_row_activated(rLink); } void grab_focus() { m_xControl->grab_focus(); } void show() { m_xControl->show(); } diff --git a/include/vcl/jsdialog/executor.hxx b/include/vcl/jsdialog/executor.hxx index 260be394d6b8..83515ca65ef1 100644 --- a/include/vcl/jsdialog/executor.hxx +++ b/include/vcl/jsdialog/executor.hxx @@ -23,7 +23,7 @@ public: static void trigger_changed(weld::ComboBox& rComboBox) { rComboBox.signal_changed(); } - static void trigger_changed(weld::TreeView& rTreeView) { rTreeView.signal_changed(); } + static void trigger_changed(weld::TreeView& rTreeView) { rTreeView.signal_selection_changed(); } static void trigger_changed(weld::IconView& rIconView) { rIconView.signal_selection_changed(); } diff --git a/include/vcl/weld.hxx b/include/vcl/weld.hxx index 74290a3c9ec7..ebe2d8a25ef8 100644 --- a/include/vcl/weld.hxx +++ b/include/vcl/weld.hxx @@ -966,7 +966,7 @@ private: OUString m_sSavedValue; protected: - Link m_aChangeHdl; + Link m_aSelectionChangedHdl; Link m_aRowActivatedHdl; Link m_aColumnClickedHdl; Link m_aRadioToggleHdl; @@ -986,7 +986,7 @@ protected: std::function m_aCustomSort; protected: - void signal_changed() { m_aChangeHdl.Call(*this); } + void signal_selection_changed() { m_aSelectionChangedHdl.Call(*this); } bool signal_row_activated() { return m_aRowActivatedHdl.Call(*this); } void signal_column_clicked(int nColumn) { m_aColumnClickedHdl.Call(nColumn); } bool signal_expanding(const TreeIter& rIter) @@ -1076,7 +1076,10 @@ public: virtual void insert_separator(int pos, const OUString& rId) = 0; void append_separator(const OUString& rId) { insert_separator(-1, rId); } - void connect_changed(const Link& rLink) { m_aChangeHdl = rLink; } + void connect_selection_changed(const Link& rLink) + { + m_aSelectionChangedHdl = rLink; + } /* A row is "activated" when the user double clicks a treeview row. It may also be emitted when a row is selected and Space or Enter is pressed. diff --git a/reportdesign/source/ui/dlg/AddField.cxx b/reportdesign/source/ui/dlg/AddField.cxx index 0289195c0545..059a6ba731e9 100644 --- a/reportdesign/source/ui/dlg/AddField.cxx +++ b/reportdesign/source/ui/dlg/AddField.cxx @@ -86,7 +86,7 @@ OAddFieldWindow::OAddFieldWindow(weld::Window* pParent, uno::Reference< beans::X m_xActions->set_item_sensitive(u"insert"_ustr, false); m_xListBox->connect_row_activated(LINK( this, OAddFieldWindow, OnDoubleClickHdl ) ); - m_xListBox->connect_changed(LINK( this, OAddFieldWindow, OnSelectHdl ) ); + m_xListBox->connect_selection_changed(LINK(this, OAddFieldWindow, OnSelectHdl)); m_xListBox->set_size_request(m_xListBox->get_approximate_digit_width() * 45, m_xListBox->get_height_rows(8)); if (!m_xRowSet.is()) diff --git a/reportdesign/source/ui/dlg/Navigator.cxx b/reportdesign/source/ui/dlg/Navigator.cxx index d1c48ba4382a..31bce2c878dc 100644 --- a/reportdesign/source/ui/dlg/Navigator.cxx +++ b/reportdesign/source/ui/dlg/Navigator.cxx @@ -220,7 +220,7 @@ NavigatorTree::NavigatorTree(std::unique_ptr xTreeView, OReportC m_xTreeView->set_selection_mode(SelectionMode::Multiple); - m_xTreeView->connect_changed(LINK(this, NavigatorTree, OnEntrySelDesel)); + m_xTreeView->connect_selection_changed(LINK(this, NavigatorTree, OnEntrySelDesel)); m_xTreeView->connect_popup_menu(LINK(this, NavigatorTree, CommandHdl)); } diff --git a/sc/source/ui/cctrl/checklistmenu.cxx b/sc/source/ui/cctrl/checklistmenu.cxx index cd66538719b1..23727ebe9677 100644 --- a/sc/source/ui/cctrl/checklistmenu.cxx +++ b/sc/source/ui/cctrl/checklistmenu.cxx @@ -644,7 +644,7 @@ ScCheckListMenuControl::ScCheckListMenuControl(weld::Widget* pParent, ScViewData mxButtonBox->show(); mxMenu->connect_row_activated(LINK(this, ScCheckListMenuControl, RowActivatedHdl)); - mxMenu->connect_changed(LINK(this, ScCheckListMenuControl, SelectHdl)); + mxMenu->connect_selection_changed(LINK(this, ScCheckListMenuControl, SelectHdl)); mxMenu->connect_key_press(LINK(this, ScCheckListMenuControl, MenuKeyInputHdl)); mxBtnOk->connect_clicked(LINK(this, ScCheckListMenuControl, ButtonHdl)); @@ -1743,10 +1743,12 @@ ScListSubMenuControl::ScListSubMenuControl(weld::Widget* pParent, ScCheckListMen { mxBackColorMenu->set_clicks_to_toggle(1); mxBackColorMenu->enable_toggle_buttons(weld::ColumnToggleType::Radio); - mxBackColorMenu->connect_changed(LINK(this, ScListSubMenuControl, ColorSelChangedHdl)); + mxBackColorMenu->connect_selection_changed( + LINK(this, ScListSubMenuControl, ColorSelChangedHdl)); mxTextColorMenu->set_clicks_to_toggle(1); mxTextColorMenu->enable_toggle_buttons(weld::ColumnToggleType::Radio); - mxTextColorMenu->connect_changed(LINK(this, ScListSubMenuControl, ColorSelChangedHdl)); + mxTextColorMenu->connect_selection_changed( + LINK(this, ScListSubMenuControl, ColorSelChangedHdl)); SetupMenu(*mxBackColorMenu); SetupMenu(*mxTextColorMenu); } diff --git a/sc/source/ui/dbgui/consdlg.cxx b/sc/source/ui/dbgui/consdlg.cxx index 22911ed16f6f..09d0dea25ca2 100644 --- a/sc/source/ui/dbgui/consdlg.cxx +++ b/sc/source/ui/dbgui/consdlg.cxx @@ -123,7 +123,7 @@ void ScConsolidateDlg::Init() m_xLbDestArea->connect_focus_in( LINK( this, ScConsolidateDlg, GetFocusHdl ) ); m_xEdDataArea->SetModifyHdl( LINK( this, ScConsolidateDlg, ModifyHdl ) ); m_xEdDestArea->SetModifyHdl( LINK( this, ScConsolidateDlg, ModifyHdl ) ); - m_xLbConsAreas->connect_changed( LINK( this, ScConsolidateDlg, SelectTVHdl ) ); + m_xLbConsAreas->connect_selection_changed(LINK(this, ScConsolidateDlg, SelectTVHdl)); m_xLbDataArea->connect_changed( LINK( this, ScConsolidateDlg, SelectCBHdl ) ); m_xLbDestArea->connect_changed( LINK( this, ScConsolidateDlg, SelectCBHdl ) ); m_xBtnOk->connect_clicked( LINK( this, ScConsolidateDlg, OkHdl ) ); diff --git a/sc/source/ui/dbgui/tpsubt.cxx b/sc/source/ui/dbgui/tpsubt.cxx index f911292c08f7..6acfabef6fa6 100644 --- a/sc/source/ui/dbgui/tpsubt.cxx +++ b/sc/source/ui/dbgui/tpsubt.cxx @@ -82,9 +82,9 @@ void ScTpSubTotalGroup::Init() assert(pDoc && "Document not found :-("); mxLbGroup->connect_changed( LINK( this, ScTpSubTotalGroup, SelectListBoxHdl ) ); - mxLbColumns->connect_changed( LINK( this, ScTpSubTotalGroup, SelectTreeListBoxHdl ) ); + mxLbColumns->connect_selection_changed(LINK(this, ScTpSubTotalGroup, SelectTreeListBoxHdl)); mxLbColumns->connect_toggled( LINK( this, ScTpSubTotalGroup, CheckHdl ) ); - mxLbFunctions->connect_changed( LINK( this, ScTpSubTotalGroup, SelectTreeListBoxHdl) ); + mxLbFunctions->connect_selection_changed(LINK(this, ScTpSubTotalGroup, SelectTreeListBoxHdl)); mxLbSelectAllColumns->connect_toggled( LINK( this, ScTpSubTotalGroup, CheckBoxHdl ) ); mnFieldArr.resize(SC_MAXFIELDS(pDoc->GetSheetLimits())); diff --git a/sc/source/ui/dialogs/searchresults.cxx b/sc/source/ui/dialogs/searchresults.cxx index 4650ce711797..3f37e26458fd 100644 --- a/sc/source/ui/dialogs/searchresults.cxx +++ b/sc/source/ui/dialogs/searchresults.cxx @@ -40,7 +40,7 @@ SearchResultsDlg::SearchResultsDlg(SfxBindings* _pBindings, weld::Window* pParen o3tl::narrowing(mxList->get_approximate_digit_width() * 10) }; mxList->set_column_fixed_widths(aWidths); - mxList->connect_changed(LINK(this, SearchResultsDlg, ListSelectHdl)); + mxList->connect_selection_changed(LINK(this, SearchResultsDlg, ListSelectHdl)); mxList->connect_column_clicked(LINK(this, SearchResultsDlg, HeaderBarClick)); } diff --git a/sc/source/ui/formdlg/dwfunctr.cxx b/sc/source/ui/formdlg/dwfunctr.cxx index 46baa84adf69..3345e1f83f95 100644 --- a/sc/source/ui/formdlg/dwfunctr.cxx +++ b/sc/source/ui/formdlg/dwfunctr.cxx @@ -76,7 +76,7 @@ ScFunctionWin::ScFunctionWin(weld::Widget* pParent) m_xSearchString->connect_key_press(LINK(this, ScFunctionWin, KeyInputHdl)); xCatBox->connect_changed(LINK( this, ScFunctionWin, SelComboHdl)); - xFuncList->connect_changed(LINK( this, ScFunctionWin, SelTreeHdl)); + xFuncList->connect_selection_changed(LINK(this, ScFunctionWin, SelTreeHdl)); xFuncList->connect_row_activated(LINK( this, ScFunctionWin, SetRowActivatedHdl)); xInsertButton->connect_clicked(LINK( this, ScFunctionWin, SetSelectionClickHdl)); diff --git a/sc/source/ui/inc/namemgrtable.hxx b/sc/source/ui/inc/namemgrtable.hxx index 347fbac3db69..34f46bbc1a17 100644 --- a/sc/source/ui/inc/namemgrtable.hxx +++ b/sc/source/ui/inc/namemgrtable.hxx @@ -61,7 +61,10 @@ public: void CheckForFormulaString(); int n_children() const { return m_xTreeView->n_children(); } - void connect_changed(const Link& rLink) { m_xTreeView->connect_changed(rLink); } + void connect_changed(const Link& rLink) + { + m_xTreeView->connect_selection_changed(rLink); + } void set_cursor(int nPos) { m_xTreeView->set_cursor(nPos); } void addEntry(const ScRangeNameLine& rLine, bool bSetCurEntry); diff --git a/sc/source/ui/miscdlgs/acredlin.cxx b/sc/source/ui/miscdlgs/acredlin.cxx index 9a14f39a57ca..66f1b4a1a830 100644 --- a/sc/source/ui/miscdlgs/acredlin.cxx +++ b/sc/source/ui/miscdlgs/acredlin.cxx @@ -126,7 +126,7 @@ ScAcceptChgDlg::ScAcceptChgDlg(SfxBindings* pB, SfxChildWindow* pCW, weld::Windo weld::TreeView& rTreeView = pTheView->GetWidget(); rTreeView.connect_expanding(LINK(this, ScAcceptChgDlg, ExpandingHandle)); - rTreeView.connect_changed(LINK(this, ScAcceptChgDlg, SelectHandle)); + rTreeView.connect_selection_changed(LINK(this, ScAcceptChgDlg, SelectHandle)); rTreeView.connect_popup_menu(LINK(this, ScAcceptChgDlg, CommandHdl)); rTreeView.set_sort_func([this](const weld::TreeIter& rLeft, const weld::TreeIter& rRight){ return ColCompareHdl(rLeft, rRight); diff --git a/sc/source/ui/miscdlgs/conflictsdlg.cxx b/sc/source/ui/miscdlgs/conflictsdlg.cxx index 6e20e04e0414..524b887816da 100644 --- a/sc/source/ui/miscdlgs/conflictsdlg.cxx +++ b/sc/source/ui/miscdlgs/conflictsdlg.cxx @@ -361,7 +361,7 @@ ScConflictsDlg::ScConflictsDlg(weld::Window* pParent, ScViewData* pViewData, ScD maSelectionIdle.SetInvokeHandler( LINK( this, ScConflictsDlg, UpdateSelectionHdl ) ); - rTreeView.connect_changed(LINK(this, ScConflictsDlg, SelectHandle)); + rTreeView.connect_selection_changed(LINK(this, ScConflictsDlg, SelectHandle)); m_xBtnKeepMine->connect_clicked( LINK( this, ScConflictsDlg, KeepMineHandle ) ); m_xBtnKeepOther->connect_clicked( LINK( this, ScConflictsDlg, KeepOtherHandle ) ); diff --git a/sc/source/ui/miscdlgs/crnrdlg.cxx b/sc/source/ui/miscdlgs/crnrdlg.cxx index c59c8d50122c..9020962ff419 100644 --- a/sc/source/ui/miscdlgs/crnrdlg.cxx +++ b/sc/source/ui/miscdlgs/crnrdlg.cxx @@ -101,7 +101,7 @@ void ScColRowNameRangesDlg::Init() m_xBtnCancel->connect_clicked ( LINK( this, ScColRowNameRangesDlg, CancelBtnHdl ) ); m_xBtnAdd->connect_clicked ( LINK( this, ScColRowNameRangesDlg, AddBtnHdl ) ); m_xBtnRemove->connect_clicked ( LINK( this, ScColRowNameRangesDlg, RemoveBtnHdl ) ); - m_xLbRange->connect_changed( LINK( this, ScColRowNameRangesDlg, Range1SelectHdl ) ); + m_xLbRange->connect_selection_changed(LINK(this, ScColRowNameRangesDlg, Range1SelectHdl)); m_xEdAssign->SetModifyHdl ( LINK( this, ScColRowNameRangesDlg, Range1DataModifyHdl ) ); m_xBtnColHead->connect_toggled ( LINK( this, ScColRowNameRangesDlg, ColRowToggleHdl ) ); m_xEdAssign2->SetModifyHdl ( LINK( this, ScColRowNameRangesDlg, Range2DataModifyHdl ) ); diff --git a/sc/source/ui/miscdlgs/instbdlg.cxx b/sc/source/ui/miscdlgs/instbdlg.cxx index 8e34c44a4e7f..3dfa986be326 100644 --- a/sc/source/ui/miscdlgs/instbdlg.cxx +++ b/sc/source/ui/miscdlgs/instbdlg.cxx @@ -72,7 +72,7 @@ void ScInsertTableDlg::Init_Impl( bool bFromFile ) m_xBtnBrowse->connect_clicked( LINK( this, ScInsertTableDlg, BrowseHdl_Impl ) ); m_xBtnNew->connect_toggled( LINK( this, ScInsertTableDlg, ChoiceHdl_Impl ) ); m_xBtnFromFile->connect_toggled( LINK( this, ScInsertTableDlg, ChoiceHdl_Impl ) ); - m_xLbTables->connect_changed( LINK( this, ScInsertTableDlg, SelectHdl_Impl ) ); + m_xLbTables->connect_selection_changed(LINK(this, ScInsertTableDlg, SelectHdl_Impl)); m_xNfCount->connect_value_changed( LINK( this, ScInsertTableDlg, CountHdl_Impl)); m_xBtnOk->connect_clicked( LINK( this, ScInsertTableDlg, DoEnterHdl )); m_xBtnBefore->set_active(true); diff --git a/sc/source/ui/miscdlgs/linkarea.cxx b/sc/source/ui/miscdlgs/linkarea.cxx index e265e97007ad..ca559e626aff 100644 --- a/sc/source/ui/miscdlgs/linkarea.cxx +++ b/sc/source/ui/miscdlgs/linkarea.cxx @@ -50,7 +50,7 @@ ScLinkedAreaDlg::ScLinkedAreaDlg(weld::Widget* pParent) m_xCbUrl->connect_entry_activate(LINK(this, ScLinkedAreaDlg, FileHdl)); m_xBtnBrowse->connect_clicked(LINK( this, ScLinkedAreaDlg, BrowseHdl)); - m_xLbRanges->connect_changed(LINK( this, ScLinkedAreaDlg, RangeHdl)); + m_xLbRanges->connect_selection_changed(LINK(this, ScLinkedAreaDlg, RangeHdl)); m_xLbRanges->set_size_request(m_xLbRanges->get_approximate_digit_width() * 54, m_xLbRanges->get_height_rows(5)); m_xBtnReload->connect_toggled(LINK( this, ScLinkedAreaDlg, ReloadHdl)); diff --git a/sc/source/ui/miscdlgs/scuiautofmt.cxx b/sc/source/ui/miscdlgs/scuiautofmt.cxx index c64373b1dcf2..94e38ee77fd1 100644 --- a/sc/source/ui/miscdlgs/scuiautofmt.cxx +++ b/sc/source/ui/miscdlgs/scuiautofmt.cxx @@ -82,7 +82,7 @@ ScAutoFormatDlg::~ScAutoFormatDlg() void ScAutoFormatDlg::Init() { - m_xLbFormat->connect_changed( LINK( this, ScAutoFormatDlg, SelFmtHdl ) ); + m_xLbFormat->connect_selection_changed(LINK(this, ScAutoFormatDlg, SelFmtHdl)); m_xBtnNumFormat->connect_toggled( LINK( this, ScAutoFormatDlg, CheckHdl ) ); m_xBtnBorder->connect_toggled( LINK( this, ScAutoFormatDlg, CheckHdl ) ); m_xBtnFont->connect_toggled( LINK( this, ScAutoFormatDlg, CheckHdl ) ); diff --git a/sc/source/ui/miscdlgs/solveroptions.cxx b/sc/source/ui/miscdlgs/solveroptions.cxx index 014a7632ea49..e0ea86b1a147 100644 --- a/sc/source/ui/miscdlgs/solveroptions.cxx +++ b/sc/source/ui/miscdlgs/solveroptions.cxx @@ -77,7 +77,7 @@ ScSolverOptionsDialog::ScSolverOptionsDialog(weld::Window* pParent, m_xBtnEdit->connect_clicked( LINK( this, ScSolverOptionsDialog, ButtonHdl ) ); - m_xLbSettings->connect_changed( LINK( this, ScSolverOptionsDialog, SettingsSelHdl ) ); + m_xLbSettings->connect_selection_changed(LINK(this, ScSolverOptionsDialog, SettingsSelHdl)); m_xLbSettings->connect_row_activated( LINK( this, ScSolverOptionsDialog, SettingsDoubleClickHdl ) ); sal_Int32 nSelect = -1; diff --git a/sc/source/ui/navipi/scenwnd.cxx b/sc/source/ui/navipi/scenwnd.cxx index 0b6b6b46bf88..eb62a7d5b6bc 100644 --- a/sc/source/ui/navipi/scenwnd.cxx +++ b/sc/source/ui/navipi/scenwnd.cxx @@ -195,7 +195,7 @@ ScScenarioWindow::ScScenarioWindow(weld::Builder& rBuilder, const OUString& aQH_ m_xLbScenario->set_tooltip_text(aQH_List); m_xEdComment->set_tooltip_text(aQH_Comment); - m_xLbScenario->connect_changed(LINK(this, ScScenarioWindow, SelectHdl)); + m_xLbScenario->connect_selection_changed(LINK(this, ScScenarioWindow, SelectHdl)); m_xLbScenario->connect_row_activated(LINK(this, ScScenarioWindow, DoubleClickHdl)); m_xLbScenario->connect_key_press(LINK(this, ScScenarioWindow, KeyInputHdl)); m_xLbScenario->connect_popup_menu(LINK(this, ScScenarioWindow, ContextMenuHdl)); diff --git a/sc/source/ui/optdlg/tpusrlst.cxx b/sc/source/ui/optdlg/tpusrlst.cxx index 3ee897edc2fd..bb7c8a5fe581 100644 --- a/sc/source/ui/optdlg/tpusrlst.cxx +++ b/sc/source/ui/optdlg/tpusrlst.cxx @@ -89,7 +89,7 @@ void ScTpUserLists::Init() SfxViewShell* pSh = SfxViewShell::Current(); ScTabViewShell* pViewSh = dynamic_cast( pSh ); - mxLbLists->connect_changed ( LINK( this, ScTpUserLists, LbSelectHdl ) ); + mxLbLists->connect_selection_changed(LINK(this, ScTpUserLists, LbSelectHdl)); mxBtnNew->connect_clicked ( LINK( this, ScTpUserLists, BtnClickHdl ) ); mxBtnDiscard->connect_clicked ( LINK( this, ScTpUserLists, BtnClickHdl ) ); mxBtnAdd->connect_clicked ( LINK( this, ScTpUserLists, BtnClickHdl ) ); diff --git a/sc/source/ui/xmlsource/xmlsourcedlg.cxx b/sc/source/ui/xmlsource/xmlsourcedlg.cxx index 4740fec17143..17cc4b928baa 100644 --- a/sc/source/ui/xmlsource/xmlsourcedlg.cxx +++ b/sc/source/ui/xmlsource/xmlsourcedlg.cxx @@ -96,7 +96,7 @@ ScXMLSourceDlg::ScXMLSourceDlg( mxBtnOk->connect_clicked(aBtnHdl); mxBtnCancel->connect_clicked(aBtnHdl); - mxLbTree->connect_changed(LINK(this, ScXMLSourceDlg, TreeItemSelectHdl)); + mxLbTree->connect_selection_changed(LINK(this, ScXMLSourceDlg, TreeItemSelectHdl)); Link aLink = LINK(this, ScXMLSourceDlg, RefModifiedHdl); mxRefEdit->SetModifyHdl(aLink); diff --git a/sd/source/ui/animations/CustomAnimationList.cxx b/sd/source/ui/animations/CustomAnimationList.cxx index 99ce44b5cf50..8df6d31588fd 100644 --- a/sd/source/ui/animations/CustomAnimationList.cxx +++ b/sd/source/ui/animations/CustomAnimationList.cxx @@ -453,7 +453,7 @@ CustomAnimationList::CustomAnimationList(std::unique_ptr xTreeVi mxEmptyLabel->set_stack_background(); mxTreeView->set_selection_mode(SelectionMode::Multiple); - mxTreeView->connect_changed(LINK(this, CustomAnimationList, SelectHdl)); + mxTreeView->connect_selection_changed(LINK(this, CustomAnimationList, SelectHdl)); mxTreeView->connect_key_press(LINK(this, CustomAnimationList, KeyInputHdl)); mxTreeView->connect_popup_menu(LINK(this, CustomAnimationList, CommandHdl)); mxTreeView->connect_row_activated(LINK(this, CustomAnimationList, DoubleClickHdl)); diff --git a/sd/source/ui/animations/CustomAnimationPane.cxx b/sd/source/ui/animations/CustomAnimationPane.cxx index 77a2e4aa6a7d..aa4161697f8e 100644 --- a/sd/source/ui/animations/CustomAnimationPane.cxx +++ b/sd/source/ui/animations/CustomAnimationPane.cxx @@ -163,7 +163,7 @@ css::ui::LayoutSize CustomAnimationPane::GetHeightForWidth(const sal_Int32 /*nWi void CustomAnimationPane::initialize() { - mxLBAnimation->connect_changed(LINK(this, CustomAnimationPane, AnimationSelectHdl)); + mxLBAnimation->connect_selection_changed(LINK(this, CustomAnimationPane, AnimationSelectHdl)); mxCustomAnimationList->setController( static_cast ( this ) ); mxCustomAnimationList->set_size_request(mxCustomAnimationList->get_approximate_digit_width() * 15, mxCustomAnimationList->get_height_rows(4)); diff --git a/sd/source/ui/dlg/BulletAndPositionDlg.cxx b/sd/source/ui/dlg/BulletAndPositionDlg.cxx index abf2563815c7..7479ebb5fc29 100644 --- a/sd/source/ui/dlg/BulletAndPositionDlg.cxx +++ b/sd/source/ui/dlg/BulletAndPositionDlg.cxx @@ -141,7 +141,7 @@ SvxBulletAndPositionDlg::SvxBulletAndPositionDlg(weld::Window* pWindow, const Sf m_xBitmapMB->connect_selected(LINK(this, SvxBulletAndPositionDlg, GraphicHdl_Impl)); m_xBitmapMB->connect_toggled(LINK(this, SvxBulletAndPositionDlg, PopupActivateHdl_Impl)); m_xLevelLB->set_selection_mode(SelectionMode::Multiple); - m_xLevelLB->connect_changed(LINK(this, SvxBulletAndPositionDlg, LevelHdl_Impl)); + m_xLevelLB->connect_selection_changed(LINK(this, SvxBulletAndPositionDlg, LevelHdl_Impl)); m_xWidthMF->connect_value_changed(LINK(this, SvxBulletAndPositionDlg, SizeHdl_Impl)); m_xHeightMF->connect_value_changed(LINK(this, SvxBulletAndPositionDlg, SizeHdl_Impl)); m_xRatioCB->connect_toggled(LINK(this, SvxBulletAndPositionDlg, RatioHdl_Impl)); diff --git a/sd/source/ui/dlg/PhotoAlbumDialog.cxx b/sd/source/ui/dlg/PhotoAlbumDialog.cxx index aeee531d4885..870c6d64f56a 100644 --- a/sd/source/ui/dlg/PhotoAlbumDialog.cxx +++ b/sd/source/ui/dlg/PhotoAlbumDialog.cxx @@ -66,7 +66,7 @@ SdPhotoAlbumDialog::SdPhotoAlbumDialog(weld::Window* pWindow, SdDrawDocument* pA m_xDownBtn->set_sensitive(false); m_xRemoveBtn->connect_clicked(LINK(this, SdPhotoAlbumDialog, RemoveHdl)); m_xRemoveBtn->set_sensitive(false); - m_xImagesLst->connect_changed(LINK(this, SdPhotoAlbumDialog, SelectHdl)); + m_xImagesLst->connect_selection_changed(LINK(this, SdPhotoAlbumDialog, SelectHdl)); m_xInsTypeCombo->connect_changed(LINK(this, SdPhotoAlbumDialog, TypeSelectHdl)); m_pGraphicFilter = std::make_unique(); diff --git a/sd/source/ui/dlg/SelectLayerDlg.cxx b/sd/source/ui/dlg/SelectLayerDlg.cxx index 963d23dc9339..94961f61aac9 100644 --- a/sd/source/ui/dlg/SelectLayerDlg.cxx +++ b/sd/source/ui/dlg/SelectLayerDlg.cxx @@ -29,7 +29,7 @@ SdSelectLayerDlg::SdSelectLayerDlg(weld::Window* pParent) m_xListLB->set_size_request(m_xListLB->get_approximate_digit_width() * 32, m_xListLB->get_height_rows(8)); m_xListLB->connect_row_activated(LINK(this, SdSelectLayerDlg, DoubleClickHdl)); - m_xListLB->connect_changed(LINK(this, SdSelectLayerDlg, SelectHdl)); + m_xListLB->connect_selection_changed(LINK(this, SdSelectLayerDlg, SelectHdl)); } IMPL_LINK_NOARG(SdSelectLayerDlg, DoubleClickHdl, weld::TreeView&, bool) diff --git a/sd/source/ui/dlg/custsdlg.cxx b/sd/source/ui/dlg/custsdlg.cxx index 43535bbc45b9..3cec4c1d738e 100644 --- a/sd/source/ui/dlg/custsdlg.cxx +++ b/sd/source/ui/dlg/custsdlg.cxx @@ -51,7 +51,7 @@ SdCustomShowDlg::SdCustomShowDlg(weld::Window* pWindow, SdDrawDocument& rDrawDoc m_xBtnEdit->connect_clicked( aLink ); m_xBtnRemove->connect_clicked( aLink ); m_xBtnCopy->connect_clicked( aLink ); - m_xLbCustomShows->connect_changed( LINK( this, SdCustomShowDlg, SelectListBoxHdl ) ); + m_xLbCustomShows->connect_selection_changed(LINK(this, SdCustomShowDlg, SelectListBoxHdl)); m_xBtnStartShow->connect_clicked( LINK( this, SdCustomShowDlg, StartShowHdl ) ); // for test @@ -255,8 +255,8 @@ SdDefineCustomShowDlg::SdDefineCustomShowDlg(weld::Window* pWindow, SdDrawDocume m_xBtnAdd->connect_clicked( aLink ); m_xBtnRemove->connect_clicked( aLink ); m_xEdtName->connect_changed( LINK( this, SdDefineCustomShowDlg, ClickButtonEditHdl ) ); - m_xLbPages->connect_changed( LINK( this, SdDefineCustomShowDlg, ClickButtonHdl4 ) ); // because of status - m_xLbCustomPages->connect_changed( LINK( this, SdDefineCustomShowDlg, ClickButtonHdl3 ) ); // because of status + m_xLbPages->connect_selection_changed(LINK(this, SdDefineCustomShowDlg, ClickButtonHdl4)); // because of status + m_xLbCustomPages->connect_selection_changed(LINK(this, SdDefineCustomShowDlg, ClickButtonHdl3)); // because of status m_xBtnOK->connect_clicked( LINK( this, SdDefineCustomShowDlg, OKHdl ) ); diff --git a/sd/source/ui/dlg/sdtreelb.cxx b/sd/source/ui/dlg/sdtreelb.cxx index be28cc2fda73..aecdbe4bda5f 100644 --- a/sd/source/ui/dlg/sdtreelb.cxx +++ b/sd/source/ui/dlg/sdtreelb.cxx @@ -752,7 +752,7 @@ SdPageObjsTLV::SdPageObjsTLV(std::unique_ptr xTreeView) , m_nRowActivateEventId(nullptr) { m_xTreeView->connect_expanding(LINK(this, SdPageObjsTLV, RequestingChildrenHdl)); - m_xTreeView->connect_changed(LINK(this, SdPageObjsTLV, SelectHdl)); + m_xTreeView->connect_selection_changed(LINK(this, SdPageObjsTLV, SelectHdl)); m_xTreeView->connect_row_activated(LINK(this, SdPageObjsTLV, RowActivatedHdl)); m_xTreeView->connect_drag_begin(LINK(this, SdPageObjsTLV, DragBeginHdl)); m_xTreeView->connect_key_press(LINK(this, SdPageObjsTLV, KeyInputHdl)); diff --git a/sfx2/source/appl/newhelp.cxx b/sfx2/source/appl/newhelp.cxx index bceff30d1edc..82261d007e67 100644 --- a/sfx2/source/appl/newhelp.cxx +++ b/sfx2/source/appl/newhelp.cxx @@ -406,7 +406,7 @@ IndexTabPage_Impl::IndexTabPage_Impl(weld::Widget* pParent, SfxHelpIndexWindow_I aAutoCompleteIdle.SetInvokeHandler( LINK(this, IndexTabPage_Impl, AutoCompleteHdl )); aKeywordTimer.SetInvokeHandler( LINK( this, IndexTabPage_Impl, TimeoutHdl ) ); m_xIndexList->connect_row_activated(LINK(this, IndexTabPage_Impl, DoubleClickHdl)); - m_xIndexList->connect_changed(LINK(this, IndexTabPage_Impl, TreeChangeHdl)); + m_xIndexList->connect_selection_changed(LINK(this, IndexTabPage_Impl, TreeChangeHdl)); m_xIndexList->connect_custom_get_size(LINK(this, IndexTabPage_Impl, CustomGetSizeHdl)); m_xIndexList->connect_custom_render(LINK(this, IndexTabPage_Impl, CustomRenderHdl)); m_xIndexList->set_column_custom_renderer(0, true); diff --git a/sfx2/source/control/templatedlglocalview.cxx b/sfx2/source/control/templatedlglocalview.cxx index f6e18feca816..241166bf027a 100644 --- a/sfx2/source/control/templatedlglocalview.cxx +++ b/sfx2/source/control/templatedlglocalview.cxx @@ -31,7 +31,7 @@ TemplateDlgLocalView::TemplateDlgLocalView(std::unique_ptr { mxTreeView->connect_row_activated(LINK(this, TemplateDlgLocalView, RowActivatedHdl)); mxTreeView->connect_column_clicked(LINK(this, ListView, ColumnClickedHdl)); - mxTreeView->connect_changed(LINK(this, TemplateDlgLocalView, ListViewChangedHdl)); + mxTreeView->connect_selection_changed(LINK(this, TemplateDlgLocalView, ListViewChangedHdl)); mxTreeView->connect_popup_menu(LINK(this, TemplateDlgLocalView, PopupMenuHdl)); mxTreeView->connect_key_press(LINK(this, TemplateDlgLocalView, KeyPressHdl)); } diff --git a/sfx2/source/devtools/DevelopmentToolDockingWindow.cxx b/sfx2/source/devtools/DevelopmentToolDockingWindow.cxx index c3fb090ac752..f3bf2a529236 100644 --- a/sfx2/source/devtools/DevelopmentToolDockingWindow.cxx +++ b/sfx2/source/devtools/DevelopmentToolDockingWindow.cxx @@ -37,7 +37,7 @@ DevelopmentToolDockingWindow::DevelopmentToolDockingWindow(SfxBindings* pInputBi pInputBindings->GetDispatcher()->GetFrame()->GetObjectShell()->GetBaseModel()) , maObjectInspectorTreeHandler(mpObjectInspectorWidgets) { - mpDocumentModelTreeView->connect_changed( + mpDocumentModelTreeView->connect_selection_changed( LINK(this, DevelopmentToolDockingWindow, DocumentModelTreeViewSelectionHandler)); mpDomToolbar->connect_clicked( LINK(this, DevelopmentToolDockingWindow, DomToolbarButtonClicked)); diff --git a/sfx2/source/devtools/ObjectInspectorTreeHandler.cxx b/sfx2/source/devtools/ObjectInspectorTreeHandler.cxx index fd9f879ab446..bd403d84c5a3 100644 --- a/sfx2/source/devtools/ObjectInspectorTreeHandler.cxx +++ b/sfx2/source/devtools/ObjectInspectorTreeHandler.cxx @@ -941,13 +941,13 @@ ObjectInspectorTreeHandler::ObjectInspectorTreeHandler( mpObjectInspectorWidgets->mpPropertiesTreeView->connect_popup_menu( LINK(this, ObjectInspectorTreeHandler, PopupMenuHandler)); - mpObjectInspectorWidgets->mpInterfacesTreeView->connect_changed( + mpObjectInspectorWidgets->mpInterfacesTreeView->connect_selection_changed( LINK(this, ObjectInspectorTreeHandler, SelectionChanged)); - mpObjectInspectorWidgets->mpServicesTreeView->connect_changed( + mpObjectInspectorWidgets->mpServicesTreeView->connect_selection_changed( LINK(this, ObjectInspectorTreeHandler, SelectionChanged)); - mpObjectInspectorWidgets->mpPropertiesTreeView->connect_changed( + mpObjectInspectorWidgets->mpPropertiesTreeView->connect_selection_changed( LINK(this, ObjectInspectorTreeHandler, SelectionChanged)); - mpObjectInspectorWidgets->mpMethodsTreeView->connect_changed( + mpObjectInspectorWidgets->mpMethodsTreeView->connect_selection_changed( LINK(this, ObjectInspectorTreeHandler, SelectionChanged)); mpObjectInspectorWidgets->mpInterfacesTreeView->make_sorted(); diff --git a/sfx2/source/dialog/StyleList.cxx b/sfx2/source/dialog/StyleList.cxx index 60151d2c83ad..8fa08c908715 100644 --- a/sfx2/source/dialog/StyleList.cxx +++ b/sfx2/source/dialog/StyleList.cxx @@ -369,11 +369,11 @@ void StyleList::Initialize() m_xFmtLb->connect_row_activated(LINK(this, StyleList, TreeListApplyHdl)); m_xFmtLb->connect_mouse_press(LINK(this, StyleList, MousePressHdl)); m_xFmtLb->connect_query_tooltip(LINK(this, StyleList, QueryTooltipHdl)); - m_xFmtLb->connect_changed(LINK(this, StyleList, FmtSelectHdl)); + m_xFmtLb->connect_selection_changed(LINK(this, StyleList, FmtSelectHdl)); m_xFmtLb->connect_popup_menu(LINK(this, StyleList, PopupFlatMenuHdl)); m_xFmtLb->connect_key_press(LINK(this, StyleList, KeyInputHdl)); m_xFmtLb->set_selection_mode(SelectionMode::Multiple); - m_xTreeBox->connect_changed(LINK(this, StyleList, FmtSelectHdl)); + m_xTreeBox->connect_selection_changed(LINK(this, StyleList, FmtSelectHdl)); m_xTreeBox->connect_row_activated(LINK(this, StyleList, TreeListApplyHdl)); m_xTreeBox->connect_mouse_press(LINK(this, StyleList, MousePressHdl)); m_xTreeBox->connect_query_tooltip(LINK(this, StyleList, QueryTooltipHdl)); diff --git a/sfx2/source/dialog/versdlg.cxx b/sfx2/source/dialog/versdlg.cxx index e63721ffecde..f81bfbc2b4fa 100644 --- a/sfx2/source/dialog/versdlg.cxx +++ b/sfx2/source/dialog/versdlg.cxx @@ -170,7 +170,7 @@ SfxVersionDialog::SfxVersionDialog(weld::Window* pParent, SfxViewFrame* pVwFrame m_xSaveCheckBox->connect_toggled(LINK(this, SfxVersionDialog, ToggleHdl_Impl)); m_xCmisButton->connect_clicked( aClickLink ); - m_xVersionBox->connect_changed( LINK( this, SfxVersionDialog, SelectHdl_Impl ) ); + m_xVersionBox->connect_selection_changed(LINK(this, SfxVersionDialog, SelectHdl_Impl)); m_xVersionBox->connect_row_activated( LINK( this, SfxVersionDialog, DClickHdl_Impl ) ); m_xVersionBox->grab_focus(); diff --git a/sfx2/source/doc/new.cxx b/sfx2/source/doc/new.cxx index 517e222476a4..4b27d131b2c2 100644 --- a/sfx2/source/doc/new.cxx +++ b/sfx2/source/doc/new.cxx @@ -280,7 +280,7 @@ SfxNewFileDialog::SfxNewFileDialog(weld::Window *pParent, SfxNewFileDialogMode n bool bExpand = !sExtraData.isEmpty() && sExtraData[0] == 'Y'; m_xMoreBt->set_expanded(bExpand && (nFlags != SfxNewFileDialogMode::NONE)); - m_xTemplateLb->connect_changed(LINK(this, SfxNewFileDialog, TemplateSelect)); + m_xTemplateLb->connect_selection_changed(LINK(this, SfxNewFileDialog, TemplateSelect)); m_xTemplateLb->connect_row_activated(LINK(this, SfxNewFileDialog, DoubleClick)); // update the template configuration if necessary @@ -294,7 +294,7 @@ SfxNewFileDialog::SfxNewFileDialog(weld::Window *pParent, SfxNewFileDialogMode n { for(sal_uInt16 i = 0; i < nCount; ++i) m_xRegionLb->append_text(m_aTemplates.GetFullRegionName(i)); - m_xRegionLb->connect_changed(LINK(this, SfxNewFileDialog, RegionSelect)); + m_xRegionLb->connect_selection_changed(LINK(this, SfxNewFileDialog, RegionSelect)); } m_aPrevIdle.SetPriority( TaskPriority::LOWEST ); diff --git a/sfx2/source/doc/saveastemplatedlg.cxx b/sfx2/source/doc/saveastemplatedlg.cxx index f967debd6e90..ae2e44cf6915 100644 --- a/sfx2/source/doc/saveastemplatedlg.cxx +++ b/sfx2/source/doc/saveastemplatedlg.cxx @@ -47,7 +47,8 @@ SfxSaveAsTemplateDialog::SfxSaveAsTemplateDialog(weld::Window* pParent, uno::Ref SetCategoryLBEntries(msCategories); m_xTemplateNameEdit->connect_changed(LINK(this, SfxSaveAsTemplateDialog, TemplateNameEditHdl)); - m_xLBCategory->connect_changed(LINK(this, SfxSaveAsTemplateDialog, SelectCategoryHdl)); + m_xLBCategory->connect_selection_changed( + LINK(this, SfxSaveAsTemplateDialog, SelectCategoryHdl)); m_xLBCategory->set_size_request(m_xLBCategory->get_approximate_digit_width() * 32, m_xLBCategory->get_height_rows(8)); m_xOKButton->connect_clicked(LINK(this, SfxSaveAsTemplateDialog, OkClickHdl)); diff --git a/sfx2/source/doc/templatedlg.cxx b/sfx2/source/doc/templatedlg.cxx index e65dfa88f2db..9a32cc1e8458 100644 --- a/sfx2/source/doc/templatedlg.cxx +++ b/sfx2/source/doc/templatedlg.cxx @@ -1267,7 +1267,8 @@ SfxTemplateCategoryDialog::SfxTemplateCategoryDialog(weld::Window* pParent) mxNewCategoryEdit->connect_changed(LINK(this, SfxTemplateCategoryDialog, NewCategoryEditHdl)); mxLBCategory->set_size_request(mxLBCategory->get_approximate_digit_width() * 32, mxLBCategory->get_height_rows(8)); - mxLBCategory->connect_changed(LINK(this, SfxTemplateCategoryDialog, SelectCategoryHdl)); + mxLBCategory->connect_selection_changed( + LINK(this, SfxTemplateCategoryDialog, SelectCategoryHdl)); mxOKButton->set_sensitive(false); } diff --git a/svx/source/form/datanavi.cxx b/svx/source/form/datanavi.cxx index 1831f0255dc7..bcbf7d04393b 100644 --- a/svx/source/form/datanavi.cxx +++ b/svx/source/form/datanavi.cxx @@ -235,7 +235,7 @@ namespace svxform m_xToolBox->connect_clicked(LINK(this, XFormsPage, TbxSelectHdl)); - m_xItemList->connect_changed(LINK(this, XFormsPage, ItemSelectHdl)); + m_xItemList->connect_selection_changed(LINK(this, XFormsPage, ItemSelectHdl)); m_xItemList->connect_key_press(LINK(this, XFormsPage, KeyInputHdl)); m_xItemList->connect_popup_menu(LINK(this, XFormsPage, PopupMenuHdl)); ItemSelectHdl(*m_xItemList); @@ -2679,7 +2679,7 @@ namespace svxform }; m_xNamespacesList->set_column_fixed_widths(aWidths); - m_xNamespacesList->connect_changed( LINK( this, NamespaceItemDialog, SelectHdl ) ); + m_xNamespacesList->connect_selection_changed(LINK(this, NamespaceItemDialog, SelectHdl)); Link aLink = LINK( this, NamespaceItemDialog, ClickHdl ); m_xAddNamespaceBtn->connect_clicked( aLink ); m_xEditNamespaceBtn->connect_clicked( aLink ); diff --git a/svx/source/form/filtnav.cxx b/svx/source/form/filtnav.cxx index add4fc49306f..9d673e76ad70 100644 --- a/svx/source/form/filtnav.cxx +++ b/svx/source/form/filtnav.cxx @@ -1063,7 +1063,7 @@ FmFilterNavigator::FmFilterNavigator(vcl::Window* pTopLevel, std::unique_ptrconnect_custom_render(LINK(this, FmFilterNavigator, CustomRenderHdl)); m_xTreeView->set_column_custom_renderer(1, true); - m_xTreeView->connect_changed(LINK(this, FmFilterNavigator, SelectHdl)); + m_xTreeView->connect_selection_changed(LINK(this, FmFilterNavigator, SelectHdl)); m_xTreeView->connect_key_press(LINK(this, FmFilterNavigator, KeyInputHdl)); m_xTreeView->connect_popup_menu(LINK(this, FmFilterNavigator, PopupMenuHdl)); m_xTreeView->connect_editing(LINK(this, FmFilterNavigator, EditingEntryHdl), diff --git a/svx/source/form/navigatortree.cxx b/svx/source/form/navigatortree.cxx index c5befb5497f6..17571e16838c 100644 --- a/svx/source/form/navigatortree.cxx +++ b/svx/source/form/navigatortree.cxx @@ -156,7 +156,7 @@ namespace svxform StartListening( *m_pNavModel ); m_aSynchronizeTimer.SetInvokeHandler(LINK(this, NavigatorTree, OnSynchronizeTimer)); - m_xTreeView->connect_changed(LINK(this, NavigatorTree, OnEntrySelDesel)); + m_xTreeView->connect_selection_changed(LINK(this, NavigatorTree, OnEntrySelDesel)); m_xTreeView->connect_key_press(LINK(this, NavigatorTree, KeyInputHdl)); m_xTreeView->connect_popup_menu(LINK(this, NavigatorTree, PopupMenuHdl)); m_xTreeView->connect_editing(LINK(this, NavigatorTree, EditingEntryHdl), diff --git a/svx/source/gallery2/galbrws1.cxx b/svx/source/gallery2/galbrws1.cxx index e367101fb759..2346410b3085 100644 --- a/svx/source/gallery2/galbrws1.cxx +++ b/svx/source/gallery2/galbrws1.cxx @@ -150,7 +150,7 @@ GalleryBrowser1::GalleryBrowser1( mxNewTheme->connect_clicked( LINK( this, GalleryBrowser1, ClickNewThemeHdl ) ); mxThemes->make_sorted(); - mxThemes->connect_changed( LINK( this, GalleryBrowser1, SelectThemeHdl ) ); + mxThemes->connect_selection_changed(LINK(this, GalleryBrowser1, SelectThemeHdl)); mxThemes->connect_popup_menu(LINK(this, GalleryBrowser1, PopupMenuHdl1)); mxThemes->connect_key_press(LINK(this, GalleryBrowser1, KeyInputHdl1)); mxThemes->set_size_request(-1, mxThemes->get_height_rows(6)); @@ -183,7 +183,7 @@ GalleryBrowser1::GalleryBrowser1( mxIconView->SetSelectHdl( LINK( this, GalleryBrowser1, SelectObjectValueSetHdl ) ); mxListView->connect_visible_range_changed(LINK(this, GalleryBrowser1, VisRowsScrolledHdl)); mxListView->connect_size_allocate(LINK(this, GalleryBrowser1, SizeAllocHdl)); - mxListView->connect_changed( LINK( this, GalleryBrowser1, SelectObjectHdl ) ); + mxListView->connect_selection_changed(LINK(this, GalleryBrowser1, SelectObjectHdl)); mxListView->connect_popup_menu(LINK(this, GalleryBrowser1, PopupMenuHdl2)); mxListView->connect_key_press(LINK(this, GalleryBrowser1, KeyInputHdl2)); mxListView->connect_row_activated(LINK(this, GalleryBrowser1, RowActivatedHdl)); diff --git a/svx/source/unodialogs/textconversiondlgs/chinese_dictionarydialog.hxx b/svx/source/unodialogs/textconversiondlgs/chinese_dictionarydialog.hxx index fc05f397693d..87aae3dc4543 100644 --- a/svx/source/unodialogs/textconversiondlgs/chinese_dictionarydialog.hxx +++ b/svx/source/unodialogs/textconversiondlgs/chinese_dictionarydialog.hxx @@ -68,7 +68,10 @@ public: void set_size_request(int nWidth, int nHeight) { m_xControl->set_size_request(nWidth, nHeight); } void hide() { m_xControl->hide(); } void show() { m_xControl->show(); } - void connect_changed(const Link& rLink) { m_xControl->connect_changed(rLink); } + void connect_changed(const Link& rLink) + { + m_xControl->connect_selection_changed(rLink); + } void connect_column_clicked(const Link& rLink) { m_xControl->connect_column_clicked(rLink); } bool get_sort_order() const { return m_xControl->get_sort_order(); } void set_sort_order(bool bAscending) { return m_xControl->set_sort_order(bAscending); } diff --git a/sw/source/ui/chrdlg/swuiccoll.cxx b/sw/source/ui/chrdlg/swuiccoll.cxx index 209a468103cb..d111e2dde19c 100644 --- a/sw/source/ui/chrdlg/swuiccoll.cxx +++ b/sw/source/ui/chrdlg/swuiccoll.cxx @@ -67,8 +67,8 @@ SwCondCollPage::SwCondCollPage(weld::Container* pPage, weld::DialogController* p m_xStyleLB->connect_row_activated(LINK(this, SwCondCollPage, AssignRemoveTreeListBoxHdl)); m_xRemovePB->connect_clicked(LINK(this, SwCondCollPage, AssignRemoveClickHdl)); m_xAssignPB->connect_clicked(LINK(this, SwCondCollPage, AssignRemoveClickHdl)); - m_xTbLinks->connect_changed(LINK(this, SwCondCollPage, SelectTreeListBoxHdl)); - m_xStyleLB->connect_changed(LINK(this, SwCondCollPage, SelectTreeListBoxHdl)); + m_xTbLinks->connect_selection_changed(LINK(this, SwCondCollPage, SelectTreeListBoxHdl)); + m_xStyleLB->connect_selection_changed(LINK(this, SwCondCollPage, SelectTreeListBoxHdl)); m_xFilterLB->connect_changed(LINK(this, SwCondCollPage, SelectListBoxHdl)); std::optional xFamilies(SwModule::get()->CreateStyleFamilies()); diff --git a/sw/source/ui/config/optload.cxx b/sw/source/ui/config/optload.cxx index 917f18f7d7d5..7fc48ebe9a0b 100644 --- a/sw/source/ui/config/optload.cxx +++ b/sw/source/ui/config/optload.cxx @@ -1042,7 +1042,7 @@ SwCaptionOptPage::SwCaptionOptPage(weld::Container* pPage, weld::DialogControlle m_xLbCaptionOrder->connect_changed(LINK(this, SwCaptionOptPage, OrderHdl)); - m_xCheckLB->connect_changed(LINK(this, SwCaptionOptPage, ShowEntryHdl)); + m_xCheckLB->connect_selection_changed(LINK(this, SwCaptionOptPage, ShowEntryHdl)); m_xCheckLB->connect_toggled(LINK(this, SwCaptionOptPage, ToggleEntryHdl)); } diff --git a/sw/source/ui/dbui/addresslistdialog.cxx b/sw/source/ui/dbui/addresslistdialog.cxx index 02280ef58135..ab86aa33f0bc 100644 --- a/sw/source/ui/dbui/addresslistdialog.cxx +++ b/sw/source/ui/dbui/addresslistdialog.cxx @@ -218,7 +218,7 @@ SwAddressListDialog::SwAddressListDialog(SwMailMergeAddressBlockPage* pParent) m_xRemovePB->set_sensitive(m_xListLB->n_children() > 0); m_xFilterPB->set_sensitive(m_xListLB->n_children() > 0); m_xTablePB->set_sensitive(m_xListLB->n_children() > 0); - m_xListLB->connect_changed(LINK(this, SwAddressListDialog, ListBoxSelectHdl_Impl)); + m_xListLB->connect_selection_changed(LINK(this, SwAddressListDialog, ListBoxSelectHdl_Impl)); TableSelectHdl(nullptr); } diff --git a/sw/source/ui/dbui/customizeaddresslistdialog.cxx b/sw/source/ui/dbui/customizeaddresslistdialog.cxx index 0d19744c9174..903567e1676e 100644 --- a/sw/source/ui/dbui/customizeaddresslistdialog.cxx +++ b/sw/source/ui/dbui/customizeaddresslistdialog.cxx @@ -34,7 +34,8 @@ SwCustomizeAddressListDialog::SwCustomizeAddressListDialog( { m_xFieldsLB->set_size_request(-1, m_xFieldsLB->get_height_rows(14)); - m_xFieldsLB->connect_changed(LINK(this, SwCustomizeAddressListDialog, ListBoxSelectHdl_Impl)); + m_xFieldsLB->connect_selection_changed( + LINK(this, SwCustomizeAddressListDialog, ListBoxSelectHdl_Impl)); Link aAddRenameLk = LINK(this, SwCustomizeAddressListDialog, AddRenameHdl_Impl ); m_xAddPB->connect_clicked(aAddRenameLk); m_xRenamePB->connect_clicked(aAddRenameLk); diff --git a/sw/source/ui/dbui/dbinsdlg.cxx b/sw/source/ui/dbui/dbinsdlg.cxx index 6ecdd3987211..1139bf27e3a7 100644 --- a/sw/source/ui/dbui/dbinsdlg.cxx +++ b/sw/source/ui/dbui/dbinsdlg.cxx @@ -358,10 +358,10 @@ SwInsertDBColAutoPilot::SwInsertDBColAutoPilot( SwView& rView, m_xCbTableHeadon->connect_toggled( LINK(this, SwInsertDBColAutoPilot, HeaderHdl )); - m_xLbTextDbColumn->connect_changed( LINK( this, SwInsertDBColAutoPilot, TVSelectHdl )); - m_xLbTableDbColumn->connect_changed( LINK( this, SwInsertDBColAutoPilot, TVSelectHdl )); + m_xLbTextDbColumn->connect_selection_changed(LINK(this, SwInsertDBColAutoPilot, TVSelectHdl)); + m_xLbTableDbColumn->connect_selection_changed(LINK(this, SwInsertDBColAutoPilot, TVSelectHdl)); m_xLbDbFormatFromUsr->connect_changed( LINK( this, SwInsertDBColAutoPilot, CBSelectHdl )); - m_xLbTableCol->connect_changed( LINK( this, SwInsertDBColAutoPilot, TVSelectHdl )); + m_xLbTableCol->connect_selection_changed(LINK(this, SwInsertDBColAutoPilot, TVSelectHdl)); m_xLbTextDbColumn->connect_row_activated( LINK( this, SwInsertDBColAutoPilot, DblClickHdl )); m_xLbTableDbColumn->connect_row_activated( LINK( this, SwInsertDBColAutoPilot, DblClickHdl )); diff --git a/sw/source/ui/dbui/mmaddressblockpage.cxx b/sw/source/ui/dbui/mmaddressblockpage.cxx index b674c4373f5e..9fc7b57c71eb 100644 --- a/sw/source/ui/dbui/mmaddressblockpage.cxx +++ b/sw/source/ui/dbui/mmaddressblockpage.cxx @@ -526,7 +526,8 @@ SwCustomizeAddressBlockDialog::SwCustomizeAddressBlockDialog( for (size_t i = 0; i < rHeaders.size(); ++i) m_xAddressElementsLB->append(OUString::number(i), rHeaders[i].first); m_xOK->connect_clicked(LINK(this, SwCustomizeAddressBlockDialog, OKHdl_Impl)); - m_xAddressElementsLB->connect_changed(LINK(this, SwCustomizeAddressBlockDialog, ListBoxSelectHdl_Impl)); + m_xAddressElementsLB->connect_selection_changed( + LINK(this, SwCustomizeAddressBlockDialog, ListBoxSelectHdl_Impl)); if (m_xAddressElementsLB->n_children()) m_xAddressElementsLB->select(0); m_xDragED->SetModifyHdl(LINK(this, SwCustomizeAddressBlockDialog, EditModifyHdl_Impl)); diff --git a/sw/source/ui/dialog/uiregionsw.cxx b/sw/source/ui/dialog/uiregionsw.cxx index 896144f953b1..16c6cda95b58 100644 --- a/sw/source/ui/dialog/uiregionsw.cxx +++ b/sw/source/ui/dialog/uiregionsw.cxx @@ -369,7 +369,7 @@ SwEditRegionDlg::SwEditRegionDlg(weld::Window* pParent, SwWrtShell& rWrtSh) bool bWeb = dynamic_cast( m_rSh.GetView().GetDocShell() ) != nullptr; - m_xTree->connect_changed(LINK(this, SwEditRegionDlg, GetFirstEntryHdl)); + m_xTree->connect_selection_changed(LINK(this, SwEditRegionDlg, GetFirstEntryHdl)); m_xCurName->connect_changed(LINK(this, SwEditRegionDlg, NameEditHdl)); m_xConditionED->connect_changed( LINK( this, SwEditRegionDlg, ConditionEditHdl)); m_xOK->connect_clicked( LINK( this, SwEditRegionDlg, OkHdl)); diff --git a/sw/source/ui/fldui/DropDownFormFieldDialog.cxx b/sw/source/ui/fldui/DropDownFormFieldDialog.cxx index d1c875d718df..d7340186196e 100644 --- a/sw/source/ui/fldui/DropDownFormFieldDialog.cxx +++ b/sw/source/ui/fldui/DropDownFormFieldDialog.cxx @@ -35,7 +35,8 @@ DropDownFormFieldDialog::DropDownFormFieldDialog(weld::Widget* pParent, m_xListItemsTreeView->set_size_request(m_xListItemEntry->get_preferred_size().Width(), m_xListItemEntry->get_preferred_size().Height() * 5); - m_xListItemsTreeView->connect_changed(LINK(this, DropDownFormFieldDialog, ListChangedHdl)); + m_xListItemsTreeView->connect_selection_changed( + LINK(this, DropDownFormFieldDialog, ListChangedHdl)); Link aPushButtonLink(LINK(this, DropDownFormFieldDialog, ButtonPushedHdl)); m_xListAddButton->connect_clicked(aPushButtonLink); diff --git a/sw/source/ui/fldui/changedb.cxx b/sw/source/ui/fldui/changedb.cxx index b277fc176c5e..a6b748d2e8b5 100644 --- a/sw/source/ui/fldui/changedb.cxx +++ b/sw/source/ui/fldui/changedb.cxx @@ -67,7 +67,7 @@ SwChangeDBDlg::SwChangeDBDlg(SwView const & rVw) Link aLink = LINK(this, SwChangeDBDlg, TreeSelectHdl); - m_xUsedDBTLB->connect_changed(aLink); + m_xUsedDBTLB->connect_selection_changed(aLink); m_xAvailDBTLB->connect_changed(aLink); TreeSelect(); } diff --git a/sw/source/ui/fldui/flddb.cxx b/sw/source/ui/fldui/flddb.cxx index 1a4bfebaca4c..5762de379743 100644 --- a/sw/source/ui/fldui/flddb.cxx +++ b/sw/source/ui/fldui/flddb.cxx @@ -170,7 +170,7 @@ void SwFieldDBPage::Reset(const SfxItemSet*) } TypeHdl(nullptr); - m_xTypeLB->connect_changed(LINK(this, SwFieldDBPage, TypeListBoxHdl)); + m_xTypeLB->connect_selection_changed(LINK(this, SwFieldDBPage, TypeListBoxHdl)); m_xTypeLB->connect_row_activated(LINK(this, SwFieldDBPage, TreeViewInsertHdl)); if (IsFieldEdit()) diff --git a/sw/source/ui/fldui/flddinf.cxx b/sw/source/ui/fldui/flddinf.cxx index 36743339ab56..2f2cff7b5e93 100644 --- a/sw/source/ui/fldui/flddinf.cxx +++ b/sw/source/ui/fldui/flddinf.cxx @@ -233,9 +233,9 @@ void SwFieldDokInfPage::Reset(const SfxItemSet* ) if (m_xSelEntry) TypeHdl(*m_pTypeView); - m_pTypeView->connect_changed(LINK(this, SwFieldDokInfPage, TypeHdl)); + m_pTypeView->connect_selection_changed(LINK(this, SwFieldDokInfPage, TypeHdl)); m_pTypeView->connect_row_activated(LINK(this, SwFieldDokInfPage, TreeViewInsertHdl)); - m_xSelectionLB->connect_changed(LINK(this, SwFieldDokInfPage, SubTypeHdl)); + m_xSelectionLB->connect_selection_changed(LINK(this, SwFieldDokInfPage, SubTypeHdl)); m_xSelectionLB->connect_row_activated(LINK(this, SwFieldDokInfPage, TreeViewInsertHdl)); m_xFormatLB->connect_row_activated(LINK(this, SwFieldDokInfPage, TreeViewInsertHdl)); diff --git a/sw/source/ui/fldui/flddok.cxx b/sw/source/ui/fldui/flddok.cxx index bb1048a94563..fa7e12035a24 100644 --- a/sw/source/ui/fldui/flddok.cxx +++ b/sw/source/ui/fldui/flddok.cxx @@ -150,8 +150,8 @@ void SwFieldDokPage::Reset(const SfxItemSet* ) RestorePos(*m_xTypeLB); m_xTypeLB->connect_row_activated(LINK(this, SwFieldDokPage, TreeViewInsertHdl)); - m_xTypeLB->connect_changed(LINK(this, SwFieldDokPage, TypeHdl)); - m_xFormatLB->connect_changed(LINK(this, SwFieldDokPage, FormatHdl)); + m_xTypeLB->connect_selection_changed(LINK(this, SwFieldDokPage, TypeHdl)); + m_xFormatLB->connect_selection_changed(LINK(this, SwFieldDokPage, FormatHdl)); if( !IsRefresh() ) { @@ -276,7 +276,7 @@ IMPL_LINK_NOARG(SwFieldDokPage, TypeHdl, weld::TreeView&, void) } } } - m_xSelectionLB->connect_changed(Link()); + m_xSelectionLB->connect_selection_changed(Link()); } else { @@ -285,7 +285,7 @@ IMPL_LINK_NOARG(SwFieldDokPage, TypeHdl, weld::TreeView&, void) AddSubType(SwFieldTypesEnum::NextPage); nTypeId = static_cast(m_xSelectionLB->get_id(0).toUInt32()); nCount = 3; - m_xSelectionLB->connect_changed(LINK(this, SwFieldDokPage, SubTypeHdl)); + m_xSelectionLB->connect_selection_changed(LINK(this, SwFieldDokPage, SubTypeHdl)); } bool bEnable = nCount != 0; diff --git a/sw/source/ui/fldui/fldfunc.cxx b/sw/source/ui/fldui/fldfunc.cxx index 98fac8e93515..82a485698a2d 100644 --- a/sw/source/ui/fldui/fldfunc.cxx +++ b/sw/source/ui/fldui/fldfunc.cxx @@ -121,8 +121,8 @@ void SwFieldFuncPage::Reset(const SfxItemSet* ) } m_xTypeLB->connect_row_activated(LINK(this, SwFieldFuncPage, TreeViewInsertHdl)); - m_xTypeLB->connect_changed(LINK(this, SwFieldFuncPage, TypeHdl)); - m_xSelectionLB->connect_changed(LINK(this, SwFieldFuncPage, SelectHdl)); + m_xTypeLB->connect_selection_changed(LINK(this, SwFieldFuncPage, TypeHdl)); + m_xSelectionLB->connect_selection_changed(LINK(this, SwFieldFuncPage, SelectHdl)); m_xSelectionLB->connect_row_activated(LINK(this, SwFieldFuncPage, InsertMacroHdl)); m_xFormatLB->connect_row_activated(LINK(this, SwFieldFuncPage, TreeViewInsertHdl)); m_xMacroBT->connect_clicked(LINK(this, SwFieldFuncPage, MacroHdl)); @@ -134,7 +134,7 @@ void SwFieldFuncPage::Reset(const SfxItemSet* ) m_xListItemED->connect_activate(LINK(this, SwFieldFuncPage, ListModifyReturnActionHdl)); Link aListEnableLk = LINK(this, SwFieldFuncPage, ListEnableHdl); m_xListItemED->connect_changed(aListEnableLk); - m_xListItemsLB->connect_changed(LINK(this, SwFieldFuncPage, ListEnableListBoxHdl)); + m_xListItemsLB->connect_selection_changed(LINK(this, SwFieldFuncPage, ListEnableListBoxHdl)); int nSelect = -1; if( !IsRefresh() ) diff --git a/sw/source/ui/fldui/fldref.cxx b/sw/source/ui/fldui/fldref.cxx index ef88650962f0..4eaa24f48c9f 100644 --- a/sw/source/ui/fldui/fldref.cxx +++ b/sw/source/ui/fldui/fldref.cxx @@ -113,14 +113,15 @@ SwFieldRefPage::SwFieldRefPage(weld::Container* pPage, weld::DialogController* p m_xFilterED->connect_changed( LINK( this, SwFieldRefPage, ModifyHdl_Impl ) ); m_xTypeLB->connect_row_activated(LINK(this, SwFieldRefPage, TreeViewInsertHdl)); - m_xTypeLB->connect_changed(LINK(this, SwFieldRefPage, TypeHdl)); - m_xSelectionLB->connect_changed(LINK(this, SwFieldRefPage, SubTypeListBoxHdl)); + m_xTypeLB->connect_selection_changed(LINK(this, SwFieldRefPage, TypeHdl)); + m_xSelectionLB->connect_selection_changed(LINK(this, SwFieldRefPage, SubTypeListBoxHdl)); m_xSelectionLB->connect_row_activated(LINK(this, SwFieldRefPage, TreeViewInsertHdl)); m_xFormatLB->connect_row_activated(LINK(this, SwFieldRefPage, TreeViewInsertHdl)); - m_xFormatLB->connect_changed(LINK(this, SwFieldRefPage, FormatHdl)); + m_xFormatLB->connect_selection_changed(LINK(this, SwFieldRefPage, FormatHdl)); // #i83479# - m_xSelectionToolTipLB->connect_changed( LINK(this, SwFieldRefPage, SubTypeTreeListBoxHdl) ); + m_xSelectionToolTipLB->connect_selection_changed( + LINK(this, SwFieldRefPage, SubTypeTreeListBoxHdl)); m_xSelectionToolTipLB->connect_row_activated( LINK(this, SwFieldRefPage, TreeViewInsertHdl) ); m_xFilterED->grab_focus(); diff --git a/sw/source/ui/fldui/fldvar.cxx b/sw/source/ui/fldui/fldvar.cxx index 63593c9b3077..bdd30be7a443 100644 --- a/sw/source/ui/fldui/fldvar.cxx +++ b/sw/source/ui/fldui/fldvar.cxx @@ -154,8 +154,8 @@ void SwFieldVarPage::Reset(const SfxItemSet* ) RestorePos(*m_xTypeLB); m_xTypeLB->connect_row_activated(LINK(this, SwFieldVarPage, TreeViewInsertHdl)); - m_xTypeLB->connect_changed(LINK(this, SwFieldVarPage, TypeHdl)); - m_xSelectionLB->connect_changed(LINK(this, SwFieldVarPage, SubTypeListBoxHdl)); + m_xTypeLB->connect_selection_changed(LINK(this, SwFieldVarPage, TypeHdl)); + m_xSelectionLB->connect_selection_changed(LINK(this, SwFieldVarPage, SubTypeListBoxHdl)); m_xSelectionLB->connect_row_activated(LINK(this, SwFieldVarPage, SubTypeInsertHdl)); m_xFormatLB->connect_row_activated(LINK(this, SwFieldVarPage, TreeViewInsertHdl)); m_xNumFormatLB->connect_row_activated(LINK(this, SwFieldVarPage, TreeViewInsertHdl)); diff --git a/sw/source/ui/inc/bookmark.hxx b/sw/source/ui/inc/bookmark.hxx index f66fec0d91de..1692e4654ce7 100644 --- a/sw/source/ui/inc/bookmark.hxx +++ b/sw/source/ui/inc/bookmark.hxx @@ -57,7 +57,7 @@ public: void connect_changed(const Link& rLink) { - m_xControl->connect_changed(rLink); + m_xControl->connect_selection_changed(rLink); } void connect_row_activated(const Link& rLink) { diff --git a/sw/source/ui/index/cnttab.cxx b/sw/source/ui/index/cnttab.cxx index d083d7a59e65..cc7432867163 100644 --- a/sw/source/ui/index/cnttab.cxx +++ b/sw/source/ui/index/cnttab.cxx @@ -1986,7 +1986,7 @@ SwTOXEntryTabPage::SwTOXEntryTabPage(weld::Container* pPage, weld::DialogControl m_xTabPB->connect_clicked(LINK(this, SwTOXEntryTabPage, InsertTokenHdl)); m_xHyperLinkPB->connect_clicked(LINK(this, SwTOXEntryTabPage, InsertTokenHdl)); m_xEditStylePB->connect_clicked(LINK(this, SwTOXEntryTabPage, EditStyleHdl)); - m_xLevelLB->connect_changed(LINK(this, SwTOXEntryTabPage, LevelHdl)); + m_xLevelLB->connect_selection_changed(LINK(this, SwTOXEntryTabPage, LevelHdl)); m_xTokenWIN->SetButtonSelectedHdl(LINK(this, SwTOXEntryTabPage, TokenSelectedHdl)); m_xTokenWIN->SetModifyHdl(LINK(this, SwTOXEntryTabPage, ModifyHdl)); m_xCharStyleLB->connect_changed(LINK(this, SwTOXEntryTabPage, StyleSelectHdl)); @@ -3573,8 +3573,8 @@ SwTOXStylesTabPage::SwTOXStylesTabPage(weld::Container* pPage, weld::DialogContr m_xEditStyleBT->connect_clicked(LINK(this, SwTOXStylesTabPage, EditStyleHdl)); m_xAssignBT->connect_clicked(LINK(this, SwTOXStylesTabPage, AssignHdl)); m_xStdBT->connect_clicked(LINK(this, SwTOXStylesTabPage, StdHdl)); - m_xParaLayLB->connect_changed(LINK(this, SwTOXStylesTabPage, EnableSelectHdl)); - m_xLevelLB->connect_changed(LINK(this, SwTOXStylesTabPage, EnableSelectHdl)); + m_xParaLayLB->connect_selection_changed(LINK(this, SwTOXStylesTabPage, EnableSelectHdl)); + m_xLevelLB->connect_selection_changed(LINK(this, SwTOXStylesTabPage, EnableSelectHdl)); m_xParaLayLB->connect_row_activated(LINK(this, SwTOXStylesTabPage, DoubleClickHdl)); } diff --git a/sw/source/ui/index/multmrk.cxx b/sw/source/ui/index/multmrk.cxx index 3710c18cc798..c6393b7c6cf8 100644 --- a/sw/source/ui/index/multmrk.cxx +++ b/sw/source/ui/index/multmrk.cxx @@ -32,7 +32,7 @@ SwMultiTOXMarkDlg::SwMultiTOXMarkDlg(weld::Window* pParent, SwTOXMgr& rTOXMgr) m_xTOXLB->set_size_request(m_xTOXLB->get_approximate_digit_width() * 32, m_xTOXLB->get_height_rows(8)); - m_xTOXLB->connect_changed(LINK(this, SwMultiTOXMarkDlg, SelectHdl)); + m_xTOXLB->connect_selection_changed(LINK(this, SwMultiTOXMarkDlg, SelectHdl)); sal_uInt16 nSize = m_rMgr.GetTOXMarkCount(); for (sal_uInt16 i = 0; i < nSize; ++i) diff --git a/sw/source/ui/misc/contentcontroldlg.cxx b/sw/source/ui/misc/contentcontroldlg.cxx index f075701a8689..8a3db74823ac 100644 --- a/sw/source/ui/misc/contentcontroldlg.cxx +++ b/sw/source/ui/misc/contentcontroldlg.cxx @@ -62,7 +62,7 @@ SwContentControlDlg::SwContentControlDlg(weld::Window* pParent, SwWrtShell& rWrt { m_xCheckedStateBtn->connect_clicked(LINK(this, SwContentControlDlg, SelectCharHdl)); m_xUncheckedStateBtn->connect_clicked(LINK(this, SwContentControlDlg, SelectCharHdl)); - m_xListItems->connect_changed(LINK(this, SwContentControlDlg, SelectionChangedHdl)); + m_xListItems->connect_selection_changed(LINK(this, SwContentControlDlg, SelectionChangedHdl)); m_xOk->connect_clicked(LINK(this, SwContentControlDlg, OkHdl)); // Only 2 items would be visible by default. diff --git a/sw/source/ui/misc/glosbib.cxx b/sw/source/ui/misc/glosbib.cxx index da9b4b1220b2..bda68dd1ac8a 100644 --- a/sw/source/ui/misc/glosbib.cxx +++ b/sw/source/ui/misc/glosbib.cxx @@ -59,7 +59,7 @@ SwGlossaryGroupDlg::SwGlossaryGroupDlg(weld::Window * pParent, m_xGroupTLB->set_size_request(nWidth, m_xGroupTLB->get_height_rows(10)); m_xGroupTLB->set_column_fixed_widths( { nWidth } ); - m_xGroupTLB->connect_changed(LINK(this, SwGlossaryGroupDlg, SelectHdl)); + m_xGroupTLB->connect_selection_changed(LINK(this, SwGlossaryGroupDlg, SelectHdl)); m_xNewPB->connect_clicked(LINK(this, SwGlossaryGroupDlg, NewHdl)); m_xDelPB->connect_clicked(LINK(this, SwGlossaryGroupDlg, DeleteHdl)); diff --git a/sw/source/ui/misc/glossary.cxx b/sw/source/ui/misc/glossary.cxx index 476dac604edc..7a12be03473e 100644 --- a/sw/source/ui/misc/glossary.cxx +++ b/sw/source/ui/misc/glossary.cxx @@ -330,7 +330,7 @@ SwGlossaryDlg::SwGlossaryDlg(const SfxViewFrame& rViewFrame, m_xShortNameEdit->connect_changed(LINK(this,SwGlossaryDlg,NameModify)); m_xCategoryBox->connect_row_activated(LINK(this, SwGlossaryDlg, NameDoubleClick)); - m_xCategoryBox->connect_changed(LINK(this, SwGlossaryDlg, GrpSelect)); + m_xCategoryBox->connect_selection_changed(LINK(this, SwGlossaryDlg, GrpSelect)); m_xCategoryBox->connect_key_press(LINK(this, SwGlossaryDlg, KeyInputHdl)); m_xDropTarget.reset(new SwGlossaryDropTarget(*m_xCategoryBox, pGlosHdl)); diff --git a/sw/source/ui/misc/num.cxx b/sw/source/ui/misc/num.cxx index 4905a49eba55..95c406494ef0 100644 --- a/sw/source/ui/misc/num.cxx +++ b/sw/source/ui/misc/num.cxx @@ -112,7 +112,7 @@ SwNumPositionTabPage::SwNumPositionTabPage(weld::Container* pPage, weld::DialogC aLk = LINK(this, SwNumPositionTabPage, IndentAtHdl_Impl); m_xIndentAtMF->connect_value_changed(aLk); - m_xLevelLB->connect_changed(LINK(this, SwNumPositionTabPage, LevelHdl)); + m_xLevelLB->connect_selection_changed(LINK(this, SwNumPositionTabPage, LevelHdl)); m_xRelativeCB->connect_toggled(LINK(this, SwNumPositionTabPage, RelativeHdl)); m_xStandardPB->connect_clicked(LINK(this, SwNumPositionTabPage, StandardHdl)); diff --git a/sw/source/ui/misc/outline.cxx b/sw/source/ui/misc/outline.cxx index c3a92f33131d..eb68def4c6c6 100644 --- a/sw/source/ui/misc/outline.cxx +++ b/sw/source/ui/misc/outline.cxx @@ -122,7 +122,7 @@ SwNumNamesDlg::SwNumNamesDlg(weld::Window *pParent) m_xFormBox->append_text(SwResId(aID)); m_xFormEdit->connect_changed(LINK(this, SwNumNamesDlg, ModifyHdl)); - m_xFormBox->connect_changed(LINK(this, SwNumNamesDlg, SelectHdl)); + m_xFormBox->connect_selection_changed(LINK(this, SwNumNamesDlg, SelectHdl)); m_xFormBox->connect_row_activated(LINK(this, SwNumNamesDlg, DoubleClickHdl)); m_xFormBox->set_size_request(-1, m_xFormBox->get_height_rows(9)); } @@ -411,7 +411,7 @@ SwOutlineSettingsTabPage::SwOutlineSettingsTabPage(weld::Container* pPage, weld: m_xNumberBox->Reload(SwInsertNumTypes::NoNumbering | SwInsertNumTypes::Extended); m_xCollBox->make_sorted(); m_xCollBox->append_text(m_aNoFormatName); - m_xLevelLB->connect_changed(LINK(this, SwOutlineSettingsTabPage, LevelHdl)); + m_xLevelLB->connect_selection_changed(LINK(this, SwOutlineSettingsTabPage, LevelHdl)); m_xAllLevelNF->connect_value_changed(LINK(this, SwOutlineSettingsTabPage, ToggleComplete)); m_xCollBox->connect_changed(LINK(this, SwOutlineSettingsTabPage, CollSelect)); m_xNumberBox->connect_changed(LINK(this, SwOutlineSettingsTabPage, NumberSelect)); diff --git a/sw/source/ui/table/convert.cxx b/sw/source/ui/table/convert.cxx index 32f2d9323acb..88fbe8c8d4a2 100644 --- a/sw/source/ui/table/convert.cxx +++ b/sw/source/ui/table/convert.cxx @@ -214,7 +214,7 @@ void SwConvertTableDlg::Init() m_xBtnAlignment->connect_toggled(aLk); m_xBtnNumFormat->connect_toggled(aLk); - m_xLbFormat->connect_changed(LINK(this, SwConvertTableDlg, SelFormatHdl)); + m_xLbFormat->connect_selection_changed(LINK(this, SwConvertTableDlg, SelFormatHdl)); // Then the list to be expanded by the entry "- none -". m_xLbFormat->append_text(SwViewShell::GetShellRes()->aStrNone); diff --git a/sw/source/ui/table/instable.cxx b/sw/source/ui/table/instable.cxx index 5a38be0efea9..516bec604b6d 100644 --- a/sw/source/ui/table/instable.cxx +++ b/sw/source/ui/table/instable.cxx @@ -129,7 +129,7 @@ void SwInsTableDlg::InitAutoTableFormat() { m_aWndPreview.DetectRTL(m_pShell); - m_xLbFormat->connect_changed(LINK(this, SwInsTableDlg, SelFormatHdl)); + m_xLbFormat->connect_selection_changed(LINK(this, SwInsTableDlg, SelFormatHdl)); m_xTableTable.reset(new SwTableAutoFormatTable); m_xTableTable->Load(); diff --git a/sw/source/ui/table/tautofmt.cxx b/sw/source/ui/table/tautofmt.cxx index ca05712486e2..3d4a9c38abe8 100644 --- a/sw/source/ui/table/tautofmt.cxx +++ b/sw/source/ui/table/tautofmt.cxx @@ -115,7 +115,7 @@ void SwAutoFormatDlg::Init(const SwTableAutoFormat* pSelFormat) m_xBtnAdd->connect_clicked(LINK(this, SwAutoFormatDlg, AddHdl)); m_xBtnRemove->connect_clicked(LINK(this, SwAutoFormatDlg, RemoveHdl)); m_xBtnRename->connect_clicked(LINK(this, SwAutoFormatDlg, RenameHdl)); - m_xLbFormat->connect_changed(LINK(this, SwAutoFormatDlg, SelFormatHdl)); + m_xLbFormat->connect_selection_changed(LINK(this, SwAutoFormatDlg, SelFormatHdl)); m_xBtnAdd->set_sensitive(m_bSetAutoFormat); diff --git a/sw/source/uibase/inc/dbtree.hxx b/sw/source/uibase/inc/dbtree.hxx index c6806cdfed8a..2e9524675456 100644 --- a/sw/source/uibase/inc/dbtree.hxx +++ b/sw/source/uibase/inc/dbtree.hxx @@ -54,7 +54,10 @@ public: void AddDataSource(const OUString& rSource); - void connect_changed(const Link& rLink) { m_xTreeView->connect_changed(rLink); } + void connect_changed(const Link& rLink) + { + m_xTreeView->connect_selection_changed(rLink); + } void connect_row_activated(const Link& rLink) { m_xTreeView->connect_row_activated(rLink); } std::unique_ptr make_iterator(const weld::TreeIter* pOrig = nullptr) const { return m_xTreeView->make_iterator(pOrig); } bool get_selected(weld::TreeIter* pIter) const { return m_xTreeView->get_selected(pIter); } diff --git a/sw/source/uibase/misc/redlndlg.cxx b/sw/source/uibase/misc/redlndlg.cxx index d1180be8271a..b2dd7fd8b4db 100644 --- a/sw/source/uibase/misc/redlndlg.cxx +++ b/sw/source/uibase/misc/redlndlg.cxx @@ -248,7 +248,7 @@ SwRedlineAcceptDlg::SwRedlineAcceptDlg(std::shared_ptr xParent, we weld::TreeView& rTreeView = m_pTable->GetWidget(); rTreeView.set_selection_mode(SelectionMode::Multiple); - rTreeView.connect_changed(LINK(this, SwRedlineAcceptDlg, SelectHdl)); + rTreeView.connect_selection_changed(LINK(this, SwRedlineAcceptDlg, SelectHdl)); rTreeView.connect_popup_menu(LINK(this, SwRedlineAcceptDlg, CommandHdl)); // avoid multiple selection of the same texts: @@ -823,7 +823,7 @@ void SwRedlineAcceptDlg::RemoveParents(SwRedlineTable::size_type nStart, SwRedli weld::TreeView& rTreeView = m_pTable->GetWidget(); // because of Bug of TLB that ALWAYS calls the SelectHandler at Remove: - rTreeView.connect_changed(Link()); + rTreeView.connect_selection_changed(Link()); bool bChildrenRemoved = false; rTreeView.thaw(); @@ -881,7 +881,7 @@ void SwRedlineAcceptDlg::RemoveParents(SwRedlineTable::size_type nStart, SwRedli } rTreeView.thaw(); - rTreeView.connect_changed(LINK(this, SwRedlineAcceptDlg, SelectHdl)); + rTreeView.connect_selection_changed(LINK(this, SwRedlineAcceptDlg, SelectHdl)); // unfortunately by Remove it was selected from the TLB always again ... rTreeView.unselect_all(); rTreeView.freeze(); diff --git a/sw/source/uibase/sidebar/QuickFindPanel.cxx b/sw/source/uibase/sidebar/QuickFindPanel.cxx index 6cbaa4fe1f55..a5e633254ab0 100644 --- a/sw/source/uibase/sidebar/QuickFindPanel.cxx +++ b/sw/source/uibase/sidebar/QuickFindPanel.cxx @@ -137,7 +137,7 @@ QuickFindPanel::QuickFindPanel(weld::Widget* pParent, const uno::Referenceconnect_custom_render(LINK(this, QuickFindPanel, SearchFindsListRender)); m_xSearchFindsList->set_column_custom_renderer(1, true); - m_xSearchFindsList->connect_changed( + m_xSearchFindsList->connect_selection_changed( LINK(this, QuickFindPanel, SearchFindsListSelectionChangedHandler)); m_xSearchFindsList->connect_row_activated( LINK(this, QuickFindPanel, SearchFindsListRowActivatedHandler)); diff --git a/sw/source/uibase/utlui/content.cxx b/sw/source/uibase/utlui/content.cxx index c48b519bb276..72cb5c3c0931 100644 --- a/sw/source/uibase/utlui/content.cxx +++ b/sw/source/uibase/utlui/content.cxx @@ -1165,7 +1165,7 @@ SwContentTree::SwContentTree(std::unique_ptr xTreeView, SwNaviga m_xTreeView->connect_expanding(LINK(this, SwContentTree, ExpandHdl)); m_xTreeView->connect_collapsing(LINK(this, SwContentTree, CollapseHdl)); m_xTreeView->connect_row_activated(LINK(this, SwContentTree, ContentDoubleClickHdl)); - m_xTreeView->connect_changed(LINK(this, SwContentTree, SelectHdl)); + m_xTreeView->connect_selection_changed(LINK(this, SwContentTree, SelectHdl)); m_xTreeView->connect_focus_in(LINK(this, SwContentTree, FocusInHdl)); m_xTreeView->connect_key_press(LINK(this, SwContentTree, KeyInputHdl)); m_xTreeView->connect_popup_menu(LINK(this, SwContentTree, CommandHdl)); diff --git a/sw/source/uibase/utlui/glbltree.cxx b/sw/source/uibase/utlui/glbltree.cxx index 7fef7e0c7520..6d08ca16e36d 100644 --- a/sw/source/uibase/utlui/glbltree.cxx +++ b/sw/source/uibase/utlui/glbltree.cxx @@ -146,7 +146,7 @@ SwGlobalTree::SwGlobalTree(std::unique_ptr xTreeView, SwNavigati m_xTreeView->set_help_id(HID_NAVIGATOR_GLOB_TREELIST); Select(); m_xTreeView->connect_row_activated(LINK(this, SwGlobalTree, DoubleClickHdl)); - m_xTreeView->connect_changed(LINK(this, SwGlobalTree, SelectHdl)); + m_xTreeView->connect_selection_changed(LINK(this, SwGlobalTree, SelectHdl)); m_xTreeView->connect_focus_in(LINK(this, SwGlobalTree, FocusInHdl)); m_xTreeView->connect_key_press(LINK(this, SwGlobalTree, KeyInputHdl)); m_xTreeView->connect_popup_menu(LINK(this, SwGlobalTree, CommandHdl)); diff --git a/sw/source/uibase/utlui/gloslst.cxx b/sw/source/uibase/utlui/gloslst.cxx index 1013300daa83..a9131a6dc6a8 100644 --- a/sw/source/uibase/utlui/gloslst.cxx +++ b/sw/source/uibase/utlui/gloslst.cxx @@ -71,7 +71,7 @@ SwGlossDecideDlg::SwGlossDecideDlg(weld::Window* pParent) m_xListLB->set_size_request(m_xListLB->get_approximate_digit_width() * 32, m_xListLB->get_height_rows(8)); m_xListLB->connect_row_activated(LINK(this, SwGlossDecideDlg, DoubleClickHdl)); - m_xListLB->connect_changed(LINK(this, SwGlossDecideDlg, SelectHdl)); + m_xListLB->connect_selection_changed(LINK(this, SwGlossDecideDlg, SelectHdl)); } IMPL_LINK_NOARG(SwGlossDecideDlg, DoubleClickHdl, weld::TreeView&, bool) diff --git a/sw/source/uibase/utlui/numfmtlb.cxx b/sw/source/uibase/utlui/numfmtlb.cxx index d30afecdce7b..a7251b159953 100644 --- a/sw/source/uibase/utlui/numfmtlb.cxx +++ b/sw/source/uibase/utlui/numfmtlb.cxx @@ -157,7 +157,7 @@ void SwNumFormatTreeView::Init() { SwNumFormatBase::Init(); - mxControl->connect_changed(LINK(this, SwNumFormatTreeView, SelectHdl)); + mxControl->connect_selection_changed(LINK(this, SwNumFormatTreeView, SelectHdl)); } void SwNumFormatBase::SetFormatType(const SvNumFormatType nFormatType) diff --git a/vcl/qt5/QtInstanceTreeView.cxx b/vcl/qt5/QtInstanceTreeView.cxx index e72826ce8734..2644ac9fdce1 100644 --- a/vcl/qt5/QtInstanceTreeView.cxx +++ b/vcl/qt5/QtInstanceTreeView.cxx @@ -740,7 +740,7 @@ void QtInstanceTreeView::handleActivated() void QtInstanceTreeView::handleSelectionChanged() { SolarMutexGuard g; - signal_changed(); + signal_selection_changed(); } /* vim:set shiftwidth=4 softtabstop=4 expandtab cinoptions=b1,g0,N-s cinkeys+=0=break: */ diff --git a/vcl/source/app/salvtables.cxx b/vcl/source/app/salvtables.cxx index 8f0bb080accb..af609ee0d9f6 100644 --- a/vcl/source/app/salvtables.cxx +++ b/vcl/source/app/salvtables.cxx @@ -5302,7 +5302,7 @@ IMPL_LINK_NOARG(SalInstanceTreeView, SelectHdl, SvTreeListBox*, void) { if (notify_events_disabled()) return; - signal_changed(); + signal_selection_changed(); } IMPL_LINK_NOARG(SalInstanceTreeView, DeSelectHdl, SvTreeListBox*, void) @@ -5312,7 +5312,7 @@ IMPL_LINK_NOARG(SalInstanceTreeView, DeSelectHdl, SvTreeListBox*, void) if (m_xTreeView->GetSelectionMode() == SelectionMode::Single && !m_xTreeView->GetHoverSelection()) return; - signal_changed(); + signal_selection_changed(); } IMPL_LINK_NOARG(SalInstanceTreeView, DoubleClickHdl, SvTreeListBox*, bool) diff --git a/vcl/source/window/builder.cxx b/vcl/source/window/builder.cxx index e181acf7ed21..74a4aa479b0e 100644 --- a/vcl/source/window/builder.cxx +++ b/vcl/source/window/builder.cxx @@ -384,7 +384,7 @@ namespace weld : m_xEntry(std::move(xEntry)) , m_xTreeView(std::move(xTreeView)) { - m_xTreeView->connect_changed(LINK(this, EntryTreeView, ClickHdl)); + m_xTreeView->connect_selection_changed(LINK(this, EntryTreeView, ClickHdl)); m_xEntry->connect_changed(LINK(this, EntryTreeView, ModifyHdl)); } diff --git a/vcl/unx/generic/print/prtsetup.cxx b/vcl/unx/generic/print/prtsetup.cxx index 6869dcecd919..630debb88444 100644 --- a/vcl/unx/generic/print/prtsetup.cxx +++ b/vcl/unx/generic/print/prtsetup.cxx @@ -280,8 +280,8 @@ RTSDevicePage::RTSDevicePage(weld::Widget* pPage, RTSDialog* pParent) m_xCustomEdit->connect_changed(LINK(this, RTSDevicePage, ModifyHdl)); - m_xPPDKeyBox->connect_changed( LINK( this, RTSDevicePage, SelectHdl ) ); - m_xPPDValueBox->connect_changed( LINK( this, RTSDevicePage, SelectHdl ) ); + m_xPPDKeyBox->connect_selection_changed(LINK(this, RTSDevicePage, SelectHdl)); + m_xPPDValueBox->connect_selection_changed(LINK(this, RTSDevicePage, SelectHdl)); m_xSpaceBox->connect_changed(LINK(this, RTSDevicePage, ComboChangedHdl)); m_xDepthBox->connect_changed(LINK(this, RTSDevicePage, ComboChangedHdl)); diff --git a/vcl/unx/gtk3/gtkinst.cxx b/vcl/unx/gtk3/gtkinst.cxx index 13d33a19a30a..729d4dcc93ac 100644 --- a/vcl/unx/gtk3/gtkinst.cxx +++ b/vcl/unx/gtk3/gtkinst.cxx @@ -14205,9 +14205,9 @@ private: GtkAdjustment* m_pVAdjustment; ImplSVEvent* m_pChangeEvent; - DECL_LINK(async_signal_changed, void*, void); + DECL_LINK(async_signal_selection_changed, void*, void); - void launch_signal_changed() + void launch_signal_selection_changed() { //tdf#117991 selection change is sent before the focus change, and focus change //is what will cause a spinbutton that currently has the focus to set its contents @@ -14227,13 +14227,13 @@ private: //TODO maybe iterate over gtk_widget_observe_controllers looking for a motion controller #endif - m_pChangeEvent = Application::PostUserEvent(LINK(this, GtkInstanceTreeView, async_signal_changed)); + m_pChangeEvent = Application::PostUserEvent(LINK(this, GtkInstanceTreeView, async_signal_selection_changed)); } - static void signalChanged(GtkTreeView*, gpointer widget) + static void signalSelectionChanged(GtkTreeView*, gpointer widget) { GtkInstanceTreeView* pThis = static_cast(widget); - pThis->launch_signal_changed(); + pThis->launch_signal_selection_changed(); } void handle_row_activated() @@ -14946,7 +14946,7 @@ public: , m_nExpanderImageCol(-1) , m_nPendingVAdjustment(-1) , m_nChangedSignalId(g_signal_connect(gtk_tree_view_get_selection(pTreeView), "changed", - G_CALLBACK(signalChanged), this)) + G_CALLBACK(signalSelectionChanged), this)) , m_nRowActivatedSignalId(g_signal_connect(pTreeView, "row-activated", G_CALLBACK(signalRowActivated), this)) , m_nTestExpandRowSignalId(g_signal_connect(pTreeView, "test-expand-row", G_CALLBACK(signalTestExpandRow), this)) , m_nTestCollapseRowSignalId(g_signal_connect(pTreeView, "test-collapse-row", G_CALLBACK(signalTestCollapseRow), this)) @@ -16964,10 +16964,10 @@ public: } -IMPL_LINK_NOARG(GtkInstanceTreeView, async_signal_changed, void*, void) +IMPL_LINK_NOARG(GtkInstanceTreeView, async_signal_selection_changed, void*, void) { m_pChangeEvent = nullptr; - signal_changed(); + signal_selection_changed(); m_bChangedByMouse = false; } diff --git a/xmlsecurity/source/dialogs/certificatechooser.cxx b/xmlsecurity/source/dialogs/certificatechooser.cxx index 89fef57d032d..0cb00f7a049b 100644 --- a/xmlsecurity/source/dialogs/certificatechooser.cxx +++ b/xmlsecurity/source/dialogs/certificatechooser.cxx @@ -72,7 +72,7 @@ CertificateChooser::CertificateChooser(weld::Window* _pParent, o3tl::narrowing(20*nControlWidth/100) }; m_xCertLB->set_column_fixed_widths(aWidths); - m_xCertLB->connect_changed( LINK( this, CertificateChooser, CertificateHighlightHdl ) ); + m_xCertLB->connect_selection_changed(LINK(this, CertificateChooser, CertificateHighlightHdl)); m_xCertLB->connect_row_activated( LINK( this, CertificateChooser, CertificateSelectHdl ) ); m_xViewBtn->connect_clicked( LINK( this, CertificateChooser, ViewButtonHdl ) ); m_xSearchBox->connect_changed(LINK(this, CertificateChooser, SearchModifyHdl)); diff --git a/xmlsecurity/source/dialogs/certificateviewer.cxx b/xmlsecurity/source/dialogs/certificateviewer.cxx index 2cd3e11e8571..6624048e25a5 100644 --- a/xmlsecurity/source/dialogs/certificateviewer.cxx +++ b/xmlsecurity/source/dialogs/certificateviewer.cxx @@ -235,7 +235,8 @@ CertificateViewerDetailsTP::CertificateViewerDetailsTP(weld::Container* pParent, InsertElement( XsResId( STR_THUMBPRINT_MD5 ), aLBEntry, aDetails, true ); m_xElementsLB->columns_autosize(); - m_xElementsLB->connect_changed(LINK(this, CertificateViewerDetailsTP, ElementSelectHdl)); + m_xElementsLB->connect_selection_changed( + LINK(this, CertificateViewerDetailsTP, ElementSelectHdl)); } IMPL_LINK_NOARG(CertificateViewerDetailsTP, ElementSelectHdl, weld::TreeView&, void) @@ -275,7 +276,7 @@ CertificateViewerCertPathTP::CertificateViewerCertPathTP(weld::Container* pParen mxCertStatusML->set_editable(false); mxCertPathLB->columns_autosize(); - mxCertPathLB->connect_changed( LINK( this, CertificateViewerCertPathTP, CertSelectHdl ) ); + mxCertPathLB->connect_selection_changed(LINK(this, CertificateViewerCertPathTP, CertSelectHdl)); mxViewCertPB->connect_clicked( LINK( this, CertificateViewerCertPathTP, ViewCertHdl ) ); } diff --git a/xmlsecurity/source/dialogs/digitalsignaturesdialog.cxx b/xmlsecurity/source/dialogs/digitalsignaturesdialog.cxx index aa4bfec4664b..4c865aac9817 100644 --- a/xmlsecurity/source/dialogs/digitalsignaturesdialog.cxx +++ b/xmlsecurity/source/dialogs/digitalsignaturesdialog.cxx @@ -234,7 +234,8 @@ DigitalSignaturesDialog::DigitalSignaturesDialog( mbVerifySignatures = true; mbSignaturesChanged = false; - m_xSignaturesLB->connect_changed( LINK( this, DigitalSignaturesDialog, SignatureHighlightHdl ) ); + m_xSignaturesLB->connect_selection_changed( + LINK(this, DigitalSignaturesDialog, SignatureHighlightHdl)); m_xSignaturesLB->connect_row_activated( LINK( this, DigitalSignaturesDialog, SignatureSelectHdl ) ); m_xViewBtn->connect_clicked( LINK( this, DigitalSignaturesDialog, ViewButtonHdl ) ); diff --git a/xmlsecurity/source/dialogs/macrosecurity.cxx b/xmlsecurity/source/dialogs/macrosecurity.cxx index cd21d68e32e8..6e11410afe8b 100644 --- a/xmlsecurity/source/dialogs/macrosecurity.cxx +++ b/xmlsecurity/source/dialogs/macrosecurity.cxx @@ -417,13 +417,15 @@ MacroSecurityTrustedSourcesTP::MacroSecurityTrustedSourcesTP(weld::Container* pP m_xTrustCertLB->set_column_fixed_widths(aWidths); m_xTrustCertLB->set_size_request(nColWidth * 5.5, m_xTrustCertLB->get_height_rows(5)); - m_xTrustCertLB->connect_changed( LINK( this, MacroSecurityTrustedSourcesTP, TrustCertLBSelectHdl ) ); + m_xTrustCertLB->connect_selection_changed( + LINK(this, MacroSecurityTrustedSourcesTP, TrustCertLBSelectHdl)); m_xViewCertPB->connect_clicked( LINK( this, MacroSecurityTrustedSourcesTP, ViewCertPBHdl ) ); m_xViewCertPB->set_sensitive(false); m_xRemoveCertPB->connect_clicked( LINK( this, MacroSecurityTrustedSourcesTP, RemoveCertPBHdl ) ); m_xRemoveCertPB->set_sensitive(false); - m_xTrustFileLocLB->connect_changed( LINK( this, MacroSecurityTrustedSourcesTP, TrustFileLocLBSelectHdl ) ); + m_xTrustFileLocLB->connect_selection_changed( + LINK(this, MacroSecurityTrustedSourcesTP, TrustFileLocLBSelectHdl)); m_xTrustFileLocLB->set_size_request(nColWidth * 5, m_xTrustFileLocLB->get_height_rows(5)); m_xAddLocPB->connect_clicked( LINK( this, MacroSecurityTrustedSourcesTP, AddLocPBHdl ) ); m_xRemoveLocPB->connect_clicked( LINK( this, MacroSecurityTrustedSourcesTP, RemoveLocPBHdl ) ); From 634e226c6b0b0fea7c620395a4e84c4701179a86 Mon Sep 17 00:00:00 2001 From: Michael Weghorn Date: Fri, 6 Dec 2024 09:59:32 +0100 Subject: [PATCH 032/133] tdf#130857 qt weld: Implement getting/setting cursor This is independent of the selection. (For selection, there is weld::TreeView::select and weld::TreeView::get_selected_index instead.) Change-Id: I3698a080cebaf4411740b0e7a95c54743e84d881 Reviewed-on: https://gerrit.libreoffice.org/c/core/+/178024 Tested-by: Jenkins Reviewed-by: Michael Weghorn --- vcl/qt5/QtInstanceTreeView.cxx | 22 +++++++++++++++++++--- 1 file changed, 19 insertions(+), 3 deletions(-) diff --git a/vcl/qt5/QtInstanceTreeView.cxx b/vcl/qt5/QtInstanceTreeView.cxx index 2644ac9fdce1..e2d28af9932c 100644 --- a/vcl/qt5/QtInstanceTreeView.cxx +++ b/vcl/qt5/QtInstanceTreeView.cxx @@ -248,11 +248,27 @@ bool QtInstanceTreeView::is_selected(int) const int QtInstanceTreeView::get_cursor_index() const { - assert(false && "Not implemented yet"); - return -1; + SolarMutexGuard g; + + int nIndex = -1; + GetQtInstance().RunInMainThread([&] { + const QModelIndex aCurrentIndex = m_pSelectionModel->currentIndex(); + if (aCurrentIndex.isValid()) + nIndex = aCurrentIndex.row(); + + }); + + return nIndex; } -void QtInstanceTreeView::set_cursor(int) { assert(false && "Not implemented yet"); } +void QtInstanceTreeView::set_cursor(int nPos) +{ + SolarMutexGuard g; + + GetQtInstance().RunInMainThread([&] { + m_pSelectionModel->setCurrentIndex(m_pModel->index(nPos, 0), QItemSelectionModel::NoUpdate); + }); +} int QtInstanceTreeView::find_text(const OUString& rText) const { From b664c08a6d1096d279437c883e55735a0c431ac8 Mon Sep 17 00:00:00 2001 From: Mike Kaganski Date: Sat, 7 Dec 2024 14:46:24 +0500 Subject: [PATCH 033/133] Drop support for Windows versions prior to Windows 10 Now when version 25.8 is in development, and the drop of legacy Windows versions was announced in release notes. Change-Id: Iefda63a29cafe40aec78d149067bdd7a3f20cffb Reviewed-on: https://gerrit.libreoffice.org/c/core/+/178025 Tested-by: Jenkins Reviewed-by: Mike Kaganski --- connectivity/Library_ado.mk | 6 ++++++ connectivity/source/drivers/ado/AResultSet.cxx | 2 +- connectivity/source/drivers/ado/AStatement.cxx | 6 +++--- connectivity/source/drivers/ado/Awrapado.cxx | 12 ++++++------ connectivity/source/inc/ado/AResultSet.hxx | 2 +- connectivity/source/inc/ado/AStatement.hxx | 2 +- connectivity/source/inc/ado/Awrapado.hxx | 6 +++--- solenv/gbuild/platform/win_compatibility.manifest | 6 ------ solenv/gbuild/platform/windows.mk | 4 ++-- vcl/win/app/fileregistration.cxx | 4 ---- 10 files changed, 23 insertions(+), 27 deletions(-) diff --git a/connectivity/Library_ado.mk b/connectivity/Library_ado.mk index 8cfd5485fe15..7a406299083d 100644 --- a/connectivity/Library_ado.mk +++ b/connectivity/Library_ado.mk @@ -31,6 +31,12 @@ $(eval $(call gb_Library_add_cxxflags,ado,\ )) endif +ifeq ($(COM),MSC) +$(eval $(call gb_Library_add_cxxflags,ado,\ + -DADO_SUPPRESS_MESSAGE \ +)) +endif + $(eval $(call gb_Library_use_system_win32_libs,ado,\ ole32 \ oleaut32 \ diff --git a/connectivity/source/drivers/ado/AResultSet.cxx b/connectivity/source/drivers/ado/AResultSet.cxx index 3e7c143d839a..f1357449d471 100644 --- a/connectivity/source/drivers/ado/AResultSet.cxx +++ b/connectivity/source/drivers/ado/AResultSet.cxx @@ -263,7 +263,7 @@ sal_Int32 SAL_CALL OResultSet::getRow( ) checkDisposed(OResultSet_BASE::rBHelper.bDisposed); - PositionEnum_Param aPos; + PositionEnum aPos; m_pRecordSet->get_AbsolutePosition(&aPos); return (aPos > 0) ? static_cast(aPos) : m_nRowPos; // return the rowcount from driver if the driver doesn't support this return our count diff --git a/connectivity/source/drivers/ado/AStatement.cxx b/connectivity/source/drivers/ado/AStatement.cxx index f5fed2c22027..935e361f8000 100644 --- a/connectivity/source/drivers/ado/AStatement.cxx +++ b/connectivity/source/drivers/ado/AStatement.cxx @@ -374,7 +374,7 @@ Sequence< sal_Int32 > SAL_CALL OStatement::executeBatch( ) { assignRecordSet( pSet ); - ADO_LONGPTR nValue; + long nValue; if(m_RecordSet.get_RecordCount(nValue)) pArray[j] = nValue; } @@ -426,7 +426,7 @@ sal_Int32 SAL_CALL OStatement_Base::getUpdateCount( ) checkDisposed(OStatement_BASE::rBHelper.bDisposed); - ADO_LONGPTR nRet; + long nRet; if(m_RecordSet.IsValid() && m_RecordSet.get_RecordCount(nRet)) return nRet; return -1; @@ -489,7 +489,7 @@ sal_Int32 OStatement_Base::getQueryTimeOut() const sal_Int32 OStatement_Base::getMaxRows() const { - ADO_LONGPTR nRet=-1; + long nRet = -1; if(!(m_RecordSet.IsValid() && m_RecordSet.get_MaxRecords(nRet))) ::dbtools::throwFunctionSequenceException(nullptr); return nRet; diff --git a/connectivity/source/drivers/ado/Awrapado.cxx b/connectivity/source/drivers/ado/Awrapado.cxx index e9e016c09330..74abd185353f 100644 --- a/connectivity/source/drivers/ado/Awrapado.cxx +++ b/connectivity/source/drivers/ado/Awrapado.cxx @@ -422,7 +422,7 @@ WpADOProperties WpADOField::get_Properties() sal_Int32 WpADOField::GetActualSize() const { assert(pInterface); - ADO_LONGPTR nActualSize=0; + long nActualSize = 0; pInterface->get_ActualSize(&nActualSize); return nActualSize; } @@ -445,7 +445,7 @@ sal_Int32 WpADOField::GetStatus() const sal_Int32 WpADOField::GetDefinedSize() const { assert(pInterface); - ADO_LONGPTR nDefinedSize=0; + long nDefinedSize = 0; pInterface->get_DefinedSize(&nDefinedSize); return nDefinedSize; } @@ -697,10 +697,10 @@ bool WpADORecordset::Supports( /* [in] */ CursorOptionEnum CursorOptions) return bSupports == VARIANT_TRUE; } -PositionEnum_Param WpADORecordset::get_AbsolutePosition() +PositionEnum WpADORecordset::get_AbsolutePosition() { assert(pInterface); - PositionEnum_Param aTemp=adPosUnknown; + PositionEnum aTemp = adPosUnknown; pInterface->get_AbsolutePosition(&aTemp); return aTemp; } @@ -815,13 +815,13 @@ bool WpADORecordset::NextRecordset(OLEVariant& RecordsAffected,ADORecordset** pp return SUCCEEDED(pInterface->NextRecordset(&RecordsAffected,ppiRset)); } -bool WpADORecordset::get_RecordCount(ADO_LONGPTR &_nRet) const +bool WpADORecordset::get_RecordCount(long& _nRet) const { assert(pInterface); return SUCCEEDED(pInterface->get_RecordCount(&_nRet)); } -bool WpADORecordset::get_MaxRecords(ADO_LONGPTR &_nRet) const +bool WpADORecordset::get_MaxRecords(long& _nRet) const { assert(pInterface); return SUCCEEDED(pInterface->get_MaxRecords(&_nRet)); diff --git a/connectivity/source/inc/ado/AResultSet.hxx b/connectivity/source/inc/ado/AResultSet.hxx index 58de2baeb539..b9f024765b34 100644 --- a/connectivity/source/inc/ado/AResultSet.hxx +++ b/connectivity/source/inc/ado/AResultSet.hxx @@ -66,7 +66,7 @@ namespace connectivity::ado css::uno::Reference< css::sdbc::XResultSetMetaData> m_xMetaData; std::vector m_aBookmarks; OLEVariant m_aValue; - ADO_LONGPTR m_nRowPos; + long m_nRowPos; bool m_bEOF; bool m_bOnFirstAfterOpen; diff --git a/connectivity/source/inc/ado/AStatement.hxx b/connectivity/source/inc/ado/AStatement.hxx index ce4369b347f2..b8e3e1a6ff9c 100644 --- a/connectivity/source/inc/ado/AStatement.hxx +++ b/connectivity/source/inc/ado/AStatement.hxx @@ -71,7 +71,7 @@ namespace connectivity::ado std::vector m_aTypeInfo; // Hashtable containing an entry // for each row returned by // DatabaseMetaData.getTypeInfo. - ADO_LONGPTR m_nMaxRows; + long m_nMaxRows; sal_Int32 m_nFetchSize; LockTypeEnum m_eLockType; CursorTypeEnum m_eCursorType; diff --git a/connectivity/source/inc/ado/Awrapado.hxx b/connectivity/source/inc/ado/Awrapado.hxx index 507b85522674..bcdbe18b0dd9 100644 --- a/connectivity/source/inc/ado/Awrapado.hxx +++ b/connectivity/source/inc/ado/Awrapado.hxx @@ -289,7 +289,7 @@ namespace connectivity::ado bool Cancel() const; sal_Int32 get_State( ); bool Supports( /* [in] */ CursorOptionEnum CursorOptions); - PositionEnum_Param get_AbsolutePosition(); + PositionEnum get_AbsolutePosition(); void GetDataSource(IUnknown** pIUnknown) const ; void PutRefDataSource(IUnknown* pIUnknown); void GetBookmark(VARIANT& var); @@ -311,8 +311,8 @@ namespace connectivity::ado bool CancelUpdate(); WpADOProperties get_Properties() const; bool NextRecordset(OLEVariant& RecordsAffected,ADORecordset** ppiRset); - bool get_RecordCount(ADO_LONGPTR &_nRet) const; - bool get_MaxRecords(ADO_LONGPTR &_nRet) const; + bool get_RecordCount(long& _nRet) const; + bool get_MaxRecords(long& _nRet) const; bool put_MaxRecords(ADO_LONGPTR _nRet); bool get_CursorType(CursorTypeEnum &_nRet) const; bool put_CursorType(CursorTypeEnum _nRet); diff --git a/solenv/gbuild/platform/win_compatibility.manifest b/solenv/gbuild/platform/win_compatibility.manifest index 709f6f3c705b..26aaa752358f 100644 --- a/solenv/gbuild/platform/win_compatibility.manifest +++ b/solenv/gbuild/platform/win_compatibility.manifest @@ -4,12 +4,6 @@ - - - - - - diff --git a/solenv/gbuild/platform/windows.mk b/solenv/gbuild/platform/windows.mk index 797680038320..49b256519d9a 100644 --- a/solenv/gbuild/platform/windows.mk +++ b/solenv/gbuild/platform/windows.mk @@ -22,11 +22,11 @@ gb_MKTEMP := mktemp --tmpdir=$(TMPDIR) gbuild.XXXXXX gb_RUN_CONFIGURE := CONFIG_SHELL=$(shell cygpath -ms /bin/sh) # define _WIN32_WINNT and WINVER will be derived from it in sdkddkver.h -# current baseline is Windows 7 (NT 6.1) +# current baseline is Windows 10 (1507) # for _WIN32_IE, if _WIN32_WINNT >= 0x0600 the derived value from # sdkddkver.h is sufficient gb_WIN_VERSION_DEFS := \ - -D_WIN32_WINNT=0x0601 \ + -D_WIN32_WINNT=_WIN32_WINNT_WIN10 \ -DWIN32 \ -DWNT \ diff --git a/vcl/win/app/fileregistration.cxx b/vcl/win/app/fileregistration.cxx index ec7ccbcee2aa..9e72e5bf03a0 100644 --- a/vcl/win/app/fileregistration.cxx +++ b/vcl/win/app/fileregistration.cxx @@ -7,10 +7,6 @@ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ -#if !defined(NTDDI_VERSION) || NTDDI_VERSION < NTDDI_WIN8 -#define NTDDI_VERSION NTDDI_WIN8 // needed for IApplicationActivationManager -#endif - #include #include From 734f80b66947210861ab2beb216e0dc327959e18 Mon Sep 17 00:00:00 2001 From: Alin Andrei Abahnencei Date: Wed, 27 Nov 2024 10:39:54 +0200 Subject: [PATCH 034/133] tdf#162716 Always strip line-ending characters Signed-off-by: Alin Andrei Abahnencei Change-Id: I3dfc6908e18f7bad54468620cf657a0a4afb8046 Reviewed-on: https://gerrit.libreoffice.org/c/core/+/177393 Reviewed-by: Mike Kaganski Tested-by: Jenkins --- io/qa/textinputstream.cxx | 80 ++++++++++++++----- io/source/TextInputStream/TextInputStream.cxx | 12 +-- 2 files changed, 69 insertions(+), 23 deletions(-) diff --git a/io/qa/textinputstream.cxx b/io/qa/textinputstream.cxx index ddfbd3afd134..e53a35ba3801 100644 --- a/io/qa/textinputstream.cxx +++ b/io/qa/textinputstream.cxx @@ -32,7 +32,11 @@ namespace { class Input: public cppu::WeakImplHelper { public: - Input(): open_(true), index_(0) {} + Input(char* inputData, sal_Int32 inputSize): + open_(true), + index_(0), + size(inputSize), + data(inputData) {} private: virtual ~Input() override {} @@ -47,14 +51,14 @@ private: assert(nMaxBytesToRead >= 0); osl::MutexGuard g(mutex_); checkClosed(); - assert(index_ >= 0 && index_ <= SIZE); + assert(index_ >= 0 && index_ <= size); sal_Int32 n = std::min( - std::min(nMaxBytesToRead, 2), SIZE - index_); - assert(n >= 0 && n <= SIZE - index_); + std::min(nMaxBytesToRead, 2), size - index_); + assert(n >= 0 && n <= size - index_); aData.realloc(n); std::memcpy(aData.getArray(), data + index_, n); index_ += n; - assert(index_ >= 0 && index_ <= SIZE); + assert(index_ >= 0 && index_ <= size); return n; } @@ -63,17 +67,17 @@ private: assert(nBytesToSkip >= 0); osl::MutexGuard g(mutex_); checkClosed(); - assert(index_ >= 0 && index_ <= SIZE); - index_ += std::min(nBytesToSkip, SIZE - index_); - assert(index_ >= 0 && index_ <= SIZE); + assert(index_ >= 0 && index_ <= size); + index_ += std::min(nBytesToSkip, size - index_); + assert(index_ >= 0 && index_ <= size); } sal_Int32 SAL_CALL available() override { osl::MutexGuard g(mutex_); checkClosed(); - assert(index_ >= 0 && index_ <= SIZE); - return SIZE - index_; + assert(index_ >= 0 && index_ <= size); + return size - index_; } void SAL_CALL closeInput() override @@ -90,33 +94,73 @@ private: } } - static sal_Int32 const SIZE = 9; - static char const data[SIZE]; - osl::Mutex mutex_; bool open_; sal_Int32 index_; -}; -char const Input::data[] = { '1', '2', '3', '4', '5', '6', '7', '8', '9' }; + sal_Int32 size; + char* data; + +}; class Test: public test::BootstrapFixtureBase { private: CPPUNIT_TEST_SUITE(Test); CPPUNIT_TEST(testReadLine); + CPPUNIT_TEST(testReadLineEndChars); CPPUNIT_TEST_SUITE_END(); void testReadLine(); + void testReadLineEndChars(); + + OUString readFirstLine(char data1[], int size); }; -void Test::testReadLine() { +OUString Test::readFirstLine(char *inputData, int inputSize) { css::uno::Reference s( css::io::TextInputStream::create(getComponentContext())); - s->setInputStream(new Input); - OUString l(s->readLine()); + s->setInputStream(new Input(inputData, inputSize)); + return s->readLine(); +} + +void Test::testReadLine() { + char inputData[] = {'1', '2', '3', '4', '5', '6', '7', '8', '9'}; + OUString l(readFirstLine(inputData, sizeof(inputData))); CPPUNIT_ASSERT_EQUAL(u"123456789"_ustr, l); } +void Test::testReadLineEndChars() { + std::vector inputData = {'a', 'b', 'c', '\r'}; + OUString l(readFirstLine(inputData.data(), inputData.size())); + CPPUNIT_ASSERT_EQUAL(u"abc"_ustr, l); + + inputData = {'a', 'b', 'c', '\n'}; + l = readFirstLine(inputData.data(), inputData.size()); + CPPUNIT_ASSERT_EQUAL(u"abc"_ustr, l); + + inputData = {'a', 'b', 'c', '\r', '\n'}; + l = readFirstLine(inputData.data(), inputData.size()); + CPPUNIT_ASSERT_EQUAL(u"abc"_ustr, l); + + inputData = {'a', 'b', 'c', '\r', 'd', 'e', 'f'}; + l = readFirstLine(inputData.data(), inputData.size()); + CPPUNIT_ASSERT_EQUAL(u"abc"_ustr, l); + + inputData = {'a', 'b', 'c', '\n', 'd', 'e', 'f'}; + l = readFirstLine(inputData.data(), inputData.size()); + CPPUNIT_ASSERT_EQUAL(u"abc"_ustr, l); + + css::uno::Reference s( + css::io::TextInputStream::create(getComponentContext())); + inputData = {'a', 'b', 'c', '\r', '\n', 'd', 'e', 'f'}; + s->setInputStream(new Input(inputData.data(), inputData.size())); + l = s->readLine(); + CPPUNIT_ASSERT_EQUAL(u"abc"_ustr, l); + l = s->readLine(); + CPPUNIT_ASSERT_EQUAL(u"def"_ustr, l); +} + + CPPUNIT_TEST_SUITE_REGISTRATION(Test); } diff --git a/io/source/TextInputStream/TextInputStream.cxx b/io/source/TextInputStream/TextInputStream.cxx index 4dd0bd50dc25..bcea56604e3c 100644 --- a/io/source/TextInputStream/TextInputStream.cxx +++ b/io/source/TextInputStream/TextInputStream.cxx @@ -183,12 +183,14 @@ OUString OTextInputStream::implReadString( const Sequence< sal_Unicode >& Delimi if( nBufferReadPos == mnCharsInBuffer ) { // Already reached EOF? Then we can't read any more - if( mbReachedEOF ) - break; - - // No, so read new characters - if( !implReadNext() ) + // Or no, so read new characters + if( mbReachedEOF || !implReadNext() ) { + if( bFoundFirstLineEndChar ) { + bFound = true; + nCopyLen = nBufferReadPos - 1; + } break; + } } // Now there should be characters available From 259480c5e1a387e01618dcd772e0ecdeead9b88b Mon Sep 17 00:00:00 2001 From: Mike Kaganski Date: Sat, 7 Dec 2024 01:34:27 +0500 Subject: [PATCH 035/133] Simplify OABSPilotUno Change-Id: Id722754aadecbb0cdb0a35fd8b3a7ac24e21b546 Reviewed-on: https://gerrit.libreoffice.org/c/core/+/178026 Reviewed-by: Mike Kaganski Tested-by: Jenkins --- extensions/source/abpilot/unodialogabp.cxx | 31 +--------------------- extensions/source/abpilot/unodialogabp.hxx | 14 ++-------- 2 files changed, 3 insertions(+), 42 deletions(-) diff --git a/extensions/source/abpilot/unodialogabp.cxx b/extensions/source/abpilot/unodialogabp.cxx index 4baafbf7f705..b8d78e81e888 100644 --- a/extensions/source/abpilot/unodialogabp.cxx +++ b/extensions/source/abpilot/unodialogabp.cxx @@ -35,41 +35,12 @@ namespace abp using namespace ::com::sun::star::ui::dialogs; OABSPilotUno::OABSPilotUno(const Reference< XComponentContext >& _rxORB) - :OGenericUnoDialog(_rxORB) + : OABSPilotUno_JBase(_rxORB) { registerProperty( u"DataSourceName"_ustr, PROPERTY_ID_DATASOURCENAME, PropertyAttribute::READONLY , &m_sDataSourceName, cppu::UnoType::get() ); } - Any SAL_CALL OABSPilotUno::queryInterface( const Type& aType ) - { - Any aReturn = svt::OGenericUnoDialog::queryInterface( aType ); - return aReturn.hasValue() ? aReturn : OABSPilotUno_JBase::queryInterface( aType ); - } - - void SAL_CALL OABSPilotUno::acquire( ) noexcept - { - svt::OGenericUnoDialog::acquire(); - } - - void SAL_CALL OABSPilotUno::release( ) noexcept - { - svt::OGenericUnoDialog::release(); - } - - Sequence< Type > SAL_CALL OABSPilotUno::getTypes( ) - { - return ::comphelper::concatSequences( - svt::OGenericUnoDialog::getTypes(), - OABSPilotUno_JBase::getTypes() - ); - } - - Sequence SAL_CALL OABSPilotUno::getImplementationId( ) - { - return css::uno::Sequence(); - } - OUString SAL_CALL OABSPilotUno::getImplementationName() { return u"org.openoffice.comp.abp.OAddressBookSourcePilot"_ustr; diff --git a/extensions/source/abpilot/unodialogabp.hxx b/extensions/source/abpilot/unodialogabp.hxx index b8bd940afa04..b07f0b2d870b 100644 --- a/extensions/source/abpilot/unodialogabp.hxx +++ b/extensions/source/abpilot/unodialogabp.hxx @@ -28,12 +28,11 @@ namespace abp { class OABSPilotUno; - typedef ::cppu::ImplHelper1< css::task::XJob > OABSPilotUno_JBase; + typedef cppu::ImplInheritanceHelper OABSPilotUno_JBase; typedef ::comphelper::OPropertyArrayUsageHelper< OABSPilotUno > OABSPilotUno_PBase; /// the UNO wrapper for the address book source pilot class OABSPilotUno - : public svt::OGenericUnoDialog - , public OABSPilotUno_JBase + : public OABSPilotUno_JBase , public OABSPilotUno_PBase { OUString m_sDataSourceName; @@ -42,15 +41,6 @@ namespace abp explicit OABSPilotUno(const css::uno::Reference< css::uno::XComponentContext >& _rxORB); private: - // XInterface (disambiguation) - virtual css::uno::Any SAL_CALL queryInterface( const css::uno::Type& aType ) override; - virtual void SAL_CALL acquire( ) noexcept override; - virtual void SAL_CALL release( ) noexcept override; - - // XTypeProvider - virtual css::uno::Sequence< css::uno::Type > SAL_CALL getTypes( ) override; - virtual css::uno::Sequence SAL_CALL getImplementationId( ) override; - // XServiceInfo virtual OUString SAL_CALL getImplementationName() override; virtual css::uno::Sequence SAL_CALL getSupportedServiceNames() override; From ffa47ff780ed737aef3ab988db4f42aee92653a3 Mon Sep 17 00:00:00 2001 From: Mike Kaganski Date: Sat, 7 Dec 2024 02:19:21 +0500 Subject: [PATCH 036/133] Simplify BrowseBoxAccessibleElement Change-Id: Ic8322090d38d58475c4c946e1f850950bce7421a Reviewed-on: https://gerrit.libreoffice.org/c/core/+/178027 Reviewed-by: Mike Kaganski Tested-by: Jenkins --- .../inc/extended/AccessibleBrowseBoxBase.hxx | 12 +++--------- .../source/extended/AccessibleBrowseBoxBase.cxx | 10 ++-------- 2 files changed, 5 insertions(+), 17 deletions(-) diff --git a/accessibility/inc/extended/AccessibleBrowseBoxBase.hxx b/accessibility/inc/extended/AccessibleBrowseBoxBase.hxx index d4ea1aabc07f..362ff829a6ac 100644 --- a/accessibility/inc/extended/AccessibleBrowseBoxBase.hxx +++ b/accessibility/inc/extended/AccessibleBrowseBoxBase.hxx @@ -309,12 +309,10 @@ private: // a version of AccessibleBrowseBoxBase which implements not only the XAccessibleContext, // but also the XAccessible -typedef ::cppu::ImplHelper1 < css::accessibility::XAccessible - > BrowseBoxAccessibleElement_Base; +typedef cppu::ImplInheritanceHelper + BrowseBoxAccessibleElement_Base; -class BrowseBoxAccessibleElement - :public AccessibleBrowseBoxBase - ,public BrowseBoxAccessibleElement_Base +class BrowseBoxAccessibleElement : public BrowseBoxAccessibleElement_Base { protected: /** Constructor sets specified name and description. If the constant of a @@ -355,10 +353,6 @@ public: // noncopyable BrowseBoxAccessibleElement(const BrowseBoxAccessibleElement&) = delete; const BrowseBoxAccessibleElement& operator=(const BrowseBoxAccessibleElement&) = delete; - // XInterface - DECLARE_XINTERFACE( ) - // XTypeProvider - DECLARE_XTYPEPROVIDER( ) protected: virtual ~BrowseBoxAccessibleElement() override; diff --git a/accessibility/source/extended/AccessibleBrowseBoxBase.cxx b/accessibility/source/extended/AccessibleBrowseBoxBase.cxx index 6108fa0a1801..466963ca3bda 100644 --- a/accessibility/source/extended/AccessibleBrowseBoxBase.cxx +++ b/accessibility/source/extended/AccessibleBrowseBoxBase.cxx @@ -515,12 +515,6 @@ sal_Int32 SAL_CALL AccessibleBrowseBoxBase::getBackground( ) } -// XInterface -IMPLEMENT_FORWARD_XINTERFACE2( BrowseBoxAccessibleElement, AccessibleBrowseBoxBase, BrowseBoxAccessibleElement_Base ) - -// XTypeProvider -IMPLEMENT_FORWARD_XTYPEPROVIDER2( BrowseBoxAccessibleElement, AccessibleBrowseBoxBase, BrowseBoxAccessibleElement_Base ) - // css::accessibility::XAccessible Reference< css::accessibility::XAccessibleContext > SAL_CALL BrowseBoxAccessibleElement::getAccessibleContext() @@ -533,7 +527,7 @@ Reference< css::accessibility::XAccessibleContext > SAL_CALL BrowseBoxAccessible BrowseBoxAccessibleElement::BrowseBoxAccessibleElement( const css::uno::Reference< css::accessibility::XAccessible >& rxParent, ::vcl::IAccessibleTableProvider& rBrowseBox, const css::uno::Reference< css::awt::XWindow >& _xFocusWindow, AccessibleBrowseBoxObjType eObjType ) - :AccessibleBrowseBoxBase( rxParent, rBrowseBox, _xFocusWindow, eObjType ) + : BrowseBoxAccessibleElement_Base(rxParent, rBrowseBox, _xFocusWindow, eObjType) { } @@ -541,7 +535,7 @@ BrowseBoxAccessibleElement::BrowseBoxAccessibleElement( const css::uno::Referenc BrowseBoxAccessibleElement::BrowseBoxAccessibleElement( const css::uno::Reference< css::accessibility::XAccessible >& rxParent, ::vcl::IAccessibleTableProvider& rBrowseBox, const css::uno::Reference< css::awt::XWindow >& _xFocusWindow, AccessibleBrowseBoxObjType eObjType, const OUString& rName, const OUString& rDescription ) - :AccessibleBrowseBoxBase( rxParent, rBrowseBox, _xFocusWindow, eObjType, rName, rDescription ) + : BrowseBoxAccessibleElement_Base(rxParent, rBrowseBox, _xFocusWindow, eObjType, rName, rDescription) { } From ac6b34ed9d21c33bfc9ac89ff74c408f2b008403 Mon Sep 17 00:00:00 2001 From: Mike Kaganski Date: Sat, 7 Dec 2024 01:38:56 +0500 Subject: [PATCH 037/133] Simplify AccessibleBrowseBoxTableBase Change-Id: I8af6ac72923aa823db356769153790ae9d7752a7 Reviewed-on: https://gerrit.libreoffice.org/c/core/+/178028 Reviewed-by: Mike Kaganski Tested-by: Jenkins --- .../extended/AccessibleBrowseBoxTableBase.hxx | 25 ++----------- .../extended/AccessibleBrowseBoxTableBase.cxx | 35 +------------------ 2 files changed, 3 insertions(+), 57 deletions(-) diff --git a/accessibility/inc/extended/AccessibleBrowseBoxTableBase.hxx b/accessibility/inc/extended/AccessibleBrowseBoxTableBase.hxx index 422aa177ad48..da7643dd6d7c 100644 --- a/accessibility/inc/extended/AccessibleBrowseBoxTableBase.hxx +++ b/accessibility/inc/extended/AccessibleBrowseBoxTableBase.hxx @@ -27,16 +27,14 @@ namespace accessibility { -typedef ::cppu::ImplHelper1< css::accessibility::XAccessibleTable > +typedef cppu::ImplInheritanceHelper AccessibleBrowseBoxTableImplHelper; /** The BrowseBox accessible table objects inherit from this base class. It implements basic functionality for the XAccessibleTable interface. BrowseBox table objects are: the data table, the column header bar and the row header bar. */ -class AccessibleBrowseBoxTableBase : - public BrowseBoxAccessibleElement, - public AccessibleBrowseBoxTableImplHelper +class AccessibleBrowseBoxTableBase : public AccessibleBrowseBoxTableImplHelper { public: /** Constructor sets specified name and description. If the constant of a @@ -121,25 +119,6 @@ public: - getAccessibleCellAt, - isAccessibleSelected. */ - // XInterface - - /** Queries for a new interface. */ - css::uno::Any SAL_CALL queryInterface( const css::uno::Type& rType ) override; - - /** Acquires the object (calls acquire() on base class). */ - virtual void SAL_CALL acquire() noexcept override; - - /** Releases the object (calls release() on base class). */ - virtual void SAL_CALL release() noexcept override; - - // XTypeProvider - - /** @return a sequence of possible types (received from base classes). */ - virtual css::uno::Sequence< css::uno::Type > SAL_CALL getTypes() override; - - /** @return a unique implementation ID. */ - virtual css::uno::Sequence< sal_Int8 > SAL_CALL getImplementationId() override; - // XServiceInfo /* Derived classes have to implement: diff --git a/accessibility/source/extended/AccessibleBrowseBoxTableBase.cxx b/accessibility/source/extended/AccessibleBrowseBoxTableBase.cxx index 044a85958e98..bb213c348f3d 100644 --- a/accessibility/source/extended/AccessibleBrowseBoxTableBase.cxx +++ b/accessibility/source/extended/AccessibleBrowseBoxTableBase.cxx @@ -41,7 +41,7 @@ AccessibleBrowseBoxTableBase::AccessibleBrowseBoxTableBase( const Reference< XAccessible >& rxParent, vcl::IAccessibleTableProvider& rBrowseBox, AccessibleBrowseBoxObjType eObjType ) : - BrowseBoxAccessibleElement( rxParent, rBrowseBox,nullptr, eObjType ) + AccessibleBrowseBoxTableImplHelper( rxParent, rBrowseBox, nullptr, eObjType ) { } @@ -132,39 +132,6 @@ sal_Int32 SAL_CALL AccessibleBrowseBoxTableBase::getAccessibleColumn( sal_Int64 return implGetColumn( nChildIndex ); } -// XInterface ----------------------------------------------------------------- - -Any SAL_CALL AccessibleBrowseBoxTableBase::queryInterface( const uno::Type& rType ) -{ - Any aAny( BrowseBoxAccessibleElement::queryInterface( rType ) ); - return aAny.hasValue() ? - aAny : AccessibleBrowseBoxTableImplHelper::queryInterface( rType ); -} - -void SAL_CALL AccessibleBrowseBoxTableBase::acquire() noexcept -{ - BrowseBoxAccessibleElement::acquire(); -} - -void SAL_CALL AccessibleBrowseBoxTableBase::release() noexcept -{ - BrowseBoxAccessibleElement::release(); -} - -// XTypeProvider -------------------------------------------------------------- - -Sequence< uno::Type > SAL_CALL AccessibleBrowseBoxTableBase::getTypes() -{ - return ::comphelper::concatSequences( - BrowseBoxAccessibleElement::getTypes(), - AccessibleBrowseBoxTableImplHelper::getTypes() ); -} - -Sequence< sal_Int8 > SAL_CALL AccessibleBrowseBoxTableBase::getImplementationId() -{ - return css::uno::Sequence(); -} - // internal virtual methods --------------------------------------------------- sal_Int32 AccessibleBrowseBoxTableBase::implGetRowCount() const From bbf4c5ca179697f302893d3c193b28cbc241e1c4 Mon Sep 17 00:00:00 2001 From: Mike Kaganski Date: Sat, 7 Dec 2024 02:13:05 +0500 Subject: [PATCH 038/133] Simplify GridControlAccessibleElement Change-Id: I1509ca337b5864805132a87dab2627df721091db Reviewed-on: https://gerrit.libreoffice.org/c/core/+/178029 Tested-by: Jenkins Reviewed-by: Mike Kaganski --- .../inc/extended/AccessibleGridControlBase.hxx | 14 +++----------- .../source/extended/AccessibleGridControlBase.cxx | 8 +------- 2 files changed, 4 insertions(+), 18 deletions(-) diff --git a/accessibility/inc/extended/AccessibleGridControlBase.hxx b/accessibility/inc/extended/AccessibleGridControlBase.hxx index 186edc83797c..4e30bddda541 100644 --- a/accessibility/inc/extended/AccessibleGridControlBase.hxx +++ b/accessibility/inc/extended/AccessibleGridControlBase.hxx @@ -252,12 +252,10 @@ private: // a version of AccessibleGridControlBase which implements not only the XAccessibleContext, // but also the XAccessible -typedef ::cppu::ImplHelper1 < css::accessibility::XAccessible - > GridControlAccessibleElement_Base; +typedef cppu::ImplInheritanceHelper + GridControlAccessibleElement_Base; -class GridControlAccessibleElement - :public AccessibleGridControlBase - ,public GridControlAccessibleElement_Base +class GridControlAccessibleElement : public GridControlAccessibleElement_Base { protected: /** Constructor sets specified name and description. @@ -271,12 +269,6 @@ protected: ::vcl::table::IAccessibleTable& rTable, ::vcl::table::AccessibleTableControlObjType eObjType ); -public: - // XInterface - DECLARE_XINTERFACE( ) - // XTypeProvider - DECLARE_XTYPEPROVIDER( ) - protected: virtual ~GridControlAccessibleElement() override; diff --git a/accessibility/source/extended/AccessibleGridControlBase.cxx b/accessibility/source/extended/AccessibleGridControlBase.cxx index aff3dc66a247..3f8609d020f1 100644 --- a/accessibility/source/extended/AccessibleGridControlBase.cxx +++ b/accessibility/source/extended/AccessibleGridControlBase.cxx @@ -430,16 +430,10 @@ sal_Int32 SAL_CALL AccessibleGridControlBase::getBackground( ) GridControlAccessibleElement::GridControlAccessibleElement( const css::uno::Reference< css::accessibility::XAccessible >& rxParent, ::vcl::table::IAccessibleTable& rTable, ::vcl::table::AccessibleTableControlObjType eObjType ) - :AccessibleGridControlBase( rxParent, rTable, eObjType ) + : GridControlAccessibleElement_Base(rxParent, rTable, eObjType) { } -// XInterface -IMPLEMENT_FORWARD_XINTERFACE2( GridControlAccessibleElement, AccessibleGridControlBase, GridControlAccessibleElement_Base) - -// XTypeProvider -IMPLEMENT_FORWARD_XTYPEPROVIDER2( GridControlAccessibleElement, AccessibleGridControlBase, GridControlAccessibleElement_Base ) - // css::accessibility::XAccessible css::uno::Reference< css::accessibility::XAccessibleContext > SAL_CALL GridControlAccessibleElement::getAccessibleContext() From d751cbefb4e1380cde2ac3d9d372cda8e88e33c9 Mon Sep 17 00:00:00 2001 From: Mike Kaganski Date: Sat, 7 Dec 2024 01:41:28 +0500 Subject: [PATCH 039/133] Simplify AccessibleGridControlTableBase Change-Id: If4b8379f676a1a412eed6d79bf6b5382d3c726b0 Reviewed-on: https://gerrit.libreoffice.org/c/core/+/178030 Tested-by: Jenkins Reviewed-by: Mike Kaganski --- .../AccessibleGridControlTableBase.hxx | 22 +----------- .../AccessibleGridControlTableBase.cxx | 35 +------------------ 2 files changed, 2 insertions(+), 55 deletions(-) diff --git a/accessibility/inc/extended/AccessibleGridControlTableBase.hxx b/accessibility/inc/extended/AccessibleGridControlTableBase.hxx index 39de903ec855..a7032553c82d 100644 --- a/accessibility/inc/extended/AccessibleGridControlTableBase.hxx +++ b/accessibility/inc/extended/AccessibleGridControlTableBase.hxx @@ -27,7 +27,7 @@ namespace accessibility { -typedef ::cppu::ImplHelper1 < css::accessibility::XAccessibleTable > +typedef cppu::ImplInheritanceHelper AccessibleGridControlTableImplHelper; /** The Grid Control accessible table objects inherit from this base class. It @@ -35,7 +35,6 @@ typedef ::cppu::ImplHelper1 < css::accessibility::XAccessibleTable > Grid COntrol table objects are: the data table, the column header bar and the row header bar. */ class AccessibleGridControlTableBase : - public GridControlAccessibleElement, public AccessibleGridControlTableImplHelper { public: @@ -115,25 +114,6 @@ public: - getAccessibleCellAt, - isAccessibleSelected. */ - // XInterface - - /** Queries for a new interface. */ - css::uno::Any SAL_CALL queryInterface( const css::uno::Type& rType ) override; - - /** Acquires the object (calls acquire() on base class). */ - virtual void SAL_CALL acquire() noexcept override; - - /** Releases the object (calls release() on base class). */ - virtual void SAL_CALL release() noexcept override; - - // XTypeProvider - - /** @return a sequence of possible types (received from base classes). */ - virtual css::uno::Sequence< css::uno::Type > SAL_CALL getTypes() override; - - /** @return a unique implementation ID. */ - virtual css::uno::Sequence< sal_Int8 > SAL_CALL getImplementationId() override; - protected: // internal helper methods diff --git a/accessibility/source/extended/AccessibleGridControlTableBase.cxx b/accessibility/source/extended/AccessibleGridControlTableBase.cxx index 08fae3d0c3f3..cec5382fcf28 100644 --- a/accessibility/source/extended/AccessibleGridControlTableBase.cxx +++ b/accessibility/source/extended/AccessibleGridControlTableBase.cxx @@ -41,7 +41,7 @@ AccessibleGridControlTableBase::AccessibleGridControlTableBase( const Reference< XAccessible >& rxParent, IAccessibleTable& rTable, AccessibleTableControlObjType eObjType ) : - GridControlAccessibleElement( rxParent, rTable, eObjType ) + AccessibleGridControlTableImplHelper( rxParent, rTable, eObjType ) { } @@ -158,39 +158,6 @@ sal_Int32 SAL_CALL AccessibleGridControlTableBase::getAccessibleColumn( sal_Int6 return implGetColumn( nChildIndex ); } -// XInterface ----------------------------------------------------------------- - -Any SAL_CALL AccessibleGridControlTableBase::queryInterface( const uno::Type& rType ) -{ - Any aAny( GridControlAccessibleElement::queryInterface( rType ) ); - return aAny.hasValue() ? - aAny : AccessibleGridControlTableImplHelper::queryInterface( rType ); -} - -void SAL_CALL AccessibleGridControlTableBase::acquire() noexcept -{ - GridControlAccessibleElement::acquire(); -} - -void SAL_CALL AccessibleGridControlTableBase::release() noexcept -{ - GridControlAccessibleElement::release(); -} - -// XTypeProvider -------------------------------------------------------------- - -Sequence< uno::Type > SAL_CALL AccessibleGridControlTableBase::getTypes() -{ - return ::comphelper::concatSequences( - GridControlAccessibleElement::getTypes(), - AccessibleGridControlTableImplHelper::getTypes() ); -} - -Sequence< sal_Int8 > SAL_CALL AccessibleGridControlTableBase::getImplementationId() -{ - return css::uno::Sequence(); -} - // internal helper methods ---------------------------------------------------- sal_Int32 AccessibleGridControlTableBase::implGetRow( sal_Int64 nChildIndex ) From 93350f4694ef8606150a95786c760bb2efd43979 Mon Sep 17 00:00:00 2001 From: Mike Kaganski Date: Sat, 7 Dec 2024 16:41:20 +0500 Subject: [PATCH 040/133] Drop pre-Win10 code from WinSkiaSalGraphicsImpl Introduced in commit a1b18eba354dc773c214fc3b7ee92c3473ec4a5e (Implement Custom Font Collections on pre-Windows 10 systems, 2024-08-20). Change-Id: I2aa16ae560d4dad8489e13289ad79d8be349b6b1 Reviewed-on: https://gerrit.libreoffice.org/c/core/+/178031 Tested-by: Jenkins Reviewed-by: Mike Kaganski --- vcl/skia/win/gdiimpl.cxx | 178 +++------------------------------------ 1 file changed, 14 insertions(+), 164 deletions(-) diff --git a/vcl/skia/win/gdiimpl.cxx b/vcl/skia/win/gdiimpl.cxx index 93b4ed75980a..2f257594b668 100644 --- a/vcl/skia/win/gdiimpl.cxx +++ b/vcl/skia/win/gdiimpl.cxx @@ -37,24 +37,29 @@ namespace { sal::systools::COMReference -getDWritePrivateFontCollection_w10(IDWriteFontFile* fontFile) +getDWritePrivateFontCollection(IDWriteFontFace* fontFace) { + UINT32 numberOfFiles; + sal::systools::ThrowIfFailed(fontFace->GetFiles(&numberOfFiles, nullptr), SAL_WHERE); + if (numberOfFiles != 1) + return {}; + + sal::systools::COMReference fontFile; + sal::systools::ThrowIfFailed(fontFace->GetFiles(&numberOfFiles, &fontFile), SAL_WHERE); + static sal::systools::COMReference dwriteFactory3 = [] { IDWriteFactory* dwriteFactory = WinSalGraphics::getDWriteFactory(); sal::systools::COMReference factory3; - dwriteFactory->QueryInterface(&factory3); + sal::systools::ThrowIfFailed(dwriteFactory->QueryInterface(&factory3), SAL_WHERE); return factory3; }(); - if (!dwriteFactory3) - return {}; static sal::systools::COMReference dwriteFontSetBuilder = [] { sal::systools::COMReference builder; - dwriteFactory3->CreateFontSetBuilder(&dwriteFontSetBuilder); + sal::systools::ThrowIfFailed(dwriteFactory3->CreateFontSetBuilder(&dwriteFontSetBuilder), + SAL_WHERE); return builder; }(); - if (!dwriteFontSetBuilder) - return {}; BOOL isSupported; DWRITE_FONT_FILE_TYPE fileType; @@ -84,163 +89,6 @@ getDWritePrivateFontCollection_w10(IDWriteFontFile* fontFile) SAL_WHERE); return { fc1.get() }; } - -// The following is only needed until we bump baseline to Windows 10 - -template requires std::is_base_of_v class IUnknown_Impl : public I -{ -public: - virtual ~IUnknown_Impl() {} - - // IUnknown - HRESULT STDMETHODCALLTYPE QueryInterface(REFIID iid, void** ppvObject) override - { - if (iid == IID_IUnknown || iid == __uuidof(I)) - { - *ppvObject = this; - AddRef(); - return S_OK; - } - - *ppvObject = nullptr; - return E_NOINTERFACE; - } - ULONG STDMETHODCALLTYPE AddRef() override { return ++m_nRef; } - ULONG STDMETHODCALLTYPE Release() override - { - ULONG n = --m_nRef; - if (n == 0) - delete this; - return n; - }; - -private: - std::atomic m_nRef = 0; -}; - -// A simple loader class, which only stores the font files (to fulfill the requirement that -// "each key is ... valid until the loader is unregistered using the factory"), and creates -// instances of enumerator -class FontCollectionLoader_w7 : public IUnknown_Impl -{ -public: - // IDWriteFontCollectionLoader - HRESULT STDMETHODCALLTYPE CreateEnumeratorFromKey( - IDWriteFactory* factory, void const* collectionKey, UINT32 collectionKeySize, - /* OUT */ IDWriteFontFileEnumerator** fontFileEnumerator) override; - -private: - std::vector> m_fontFiles; -}; - -// A singleton class, that (1) caches IDWriteFactory, to avoid destruction order problems, -// (2) holds the FontCollectionLoader_w7 singleton, and (3) calls IDWriteFactory's -// (Un)RegisterFontCollectionLoader, because these can't be called from destructor of -// FontCollectionLoader_w7, because RegisterFontCollectionLoader calls AddRef. -struct FontCollectionLoader_w7_singleton_t -{ - sal::systools::COMReference factory; - sal::systools::COMReference loader; - FontCollectionLoader_w7_singleton_t() - : factory(WinSalGraphics::getDWriteFactory()) - , loader(new FontCollectionLoader_w7) - { - factory->RegisterFontCollectionLoader(loader); - } - ~FontCollectionLoader_w7_singleton_t() { factory->UnregisterFontCollectionLoader(loader); } -}; - -// A simple enumerator class, which only operates on a single font file. -class FontFileEnumerator_w7 : public IUnknown_Impl -{ -public: - FontFileEnumerator_w7(IDWriteFontFile* collectionKey) - : m_fontFile(collectionKey) - { - assert(collectionKey); - AddRef(); - } - - // IDWriteFontFileEnumerator - HRESULT STDMETHODCALLTYPE MoveNext(BOOL* hasCurrentFile) override; - HRESULT STDMETHODCALLTYPE GetCurrentFontFile(IDWriteFontFile** fontFile) override; - -private: - sal::systools::COMReference m_fontFile; - size_t m_nextIndex = 0; -}; - -HRESULT STDMETHODCALLTYPE FontCollectionLoader_w7::CreateEnumeratorFromKey( - IDWriteFactory* /*factory*/, void const* collectionKey, UINT32 collectionKeySize, - /* OUT */ IDWriteFontFileEnumerator** fontFileEnumerator) -{ - if (!fontFileEnumerator) - return E_INVALIDARG; - *fontFileEnumerator = nullptr; - if (!collectionKey || collectionKeySize != sizeof(IDWriteFontFile*)) - return E_INVALIDARG; - - auto pFontFile = *static_cast(collectionKey); - auto it = std::find_if(m_fontFiles.begin(), m_fontFiles.end(), - [pFontFile](const auto& el) { return el.get() == pFontFile; }); - if (it == m_fontFiles.end()) - m_fontFiles.emplace_back(pFontFile); // cals AddRef - - *fontFileEnumerator = new (std::nothrow) FontFileEnumerator_w7(pFontFile); - return *fontFileEnumerator ? S_OK : E_OUTOFMEMORY; -} - -HRESULT STDMETHODCALLTYPE FontFileEnumerator_w7::MoveNext(BOOL* hasCurrentFile) -{ - if (!hasCurrentFile) - return E_INVALIDARG; - *hasCurrentFile = m_nextIndex == 0 ? TRUE : FALSE; - ++m_nextIndex; - return S_OK; -} - -HRESULT STDMETHODCALLTYPE FontFileEnumerator_w7::GetCurrentFontFile(IDWriteFontFile** fontFile) -{ - if (!fontFile) - return E_INVALIDARG; - if (m_nextIndex == 1) - { - *fontFile = m_fontFile; - m_fontFile->AddRef(); - return S_OK; - } - *fontFile = nullptr; - return E_FAIL; -} - -sal::systools::COMReference -getDWritePrivateFontCollection_w7(IDWriteFontFile* fontFile) -{ - static FontCollectionLoader_w7_singleton_t singleton; - sal::systools::COMReference collection; - sal::systools::ThrowIfFailed(singleton.factory->CreateCustomFontCollection( - singleton.loader, &fontFile, sizeof(fontFile), &collection), - SAL_WHERE); - return collection; -} - -// End of pre-Windows 10 compatibility code - -sal::systools::COMReference -getDWritePrivateFontCollection(IDWriteFontFace* fontFace) -{ - UINT32 numberOfFiles; - sal::systools::ThrowIfFailed(fontFace->GetFiles(&numberOfFiles, nullptr), SAL_WHERE); - if (numberOfFiles != 1) - return {}; - - sal::systools::COMReference fontFile; - sal::systools::ThrowIfFailed(fontFace->GetFiles(&numberOfFiles, &fontFile), SAL_WHERE); - - if (auto collection = getDWritePrivateFontCollection_w10(fontFile)) - return collection; - return getDWritePrivateFontCollection_w7(fontFile); -} } using namespace SkiaHelper; @@ -363,6 +211,8 @@ WinSkiaSalGraphicsImpl::createDirectWriteTypeface(const WinFontInstance* pWinFon // private fonts with this newly used font. dwritePrivateCollection = getDWritePrivateFontCollection(fontFace); + if (!dwritePrivateCollection) // Not one file? Unsupported font? + return nullptr; ThrowIfFailed(dwritePrivateCollection->GetFontFromFontFace(fontFace, &font), SAL_WHERE); } } From c812bb3fe730a68f7fd9e5a32a5e1be7a59f60a7 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Caol=C3=A1n=20McNamara?= Date: Sat, 7 Dec 2024 12:17:55 +0000 Subject: [PATCH 041/133] cid#1636575 COPY_INSTEAD_OF_MOVE MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit and cid#1636577 COPY_INSTEAD_OF_MOVE cid#1636583 COPY_INSTEAD_OF_MOVE Change-Id: Ic56139c5a17d8cc83d90afc78072ae073e99308c Reviewed-on: https://gerrit.libreoffice.org/c/core/+/178034 Reviewed-by: Caolán McNamara Tested-by: Jenkins --- sd/source/ui/sidebar/MasterPagesSelector.cxx | 4 ++-- sd/source/ui/sidebar/MasterPagesSelector.hxx | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/sd/source/ui/sidebar/MasterPagesSelector.cxx b/sd/source/ui/sidebar/MasterPagesSelector.cxx index 2ee57bca11c3..33d87e4d919c 100644 --- a/sd/source/ui/sidebar/MasterPagesSelector.cxx +++ b/sd/source/ui/sidebar/MasterPagesSelector.cxx @@ -466,9 +466,9 @@ void MasterPagesSelector::InvalidatePreview (const SdPage* pPage) } } -VclPtr MasterPagesSelector::GetVirtualDevice(Image pImage) +VclPtr MasterPagesSelector::GetVirtualDevice(const Image& rImage) { - BitmapEx aPreviewBitmap = pImage.GetBitmapEx(); + BitmapEx aPreviewBitmap = rImage.GetBitmapEx(); VclPtr pVDev = VclPtr::Create(); const Point aNull(0, 0); if (pVDev->GetDPIScaleFactor() > 1) diff --git a/sd/source/ui/sidebar/MasterPagesSelector.hxx b/sd/source/ui/sidebar/MasterPagesSelector.hxx index 3eaf9851e317..b1c92b5d1c55 100644 --- a/sd/source/ui/sidebar/MasterPagesSelector.hxx +++ b/sd/source/ui/sidebar/MasterPagesSelector.hxx @@ -173,7 +173,7 @@ private: sal_uInt16 nIndex, MasterPageContainer::Token aToken); - static VclPtr GetVirtualDevice(Image pPreview); + static VclPtr GetVirtualDevice(const Image& rPreview); }; } // end of namespace sd::sidebar From 88986086f9d785491f7430a66bbc255dd737738b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Caol=C3=A1n=20McNamara?= Date: Sat, 7 Dec 2024 12:08:25 +0000 Subject: [PATCH 042/133] cid#1636582 Negative loop bound MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Change-Id: Ib91ee62814837765f89f65a1204021e9d9610e53 Reviewed-on: https://gerrit.libreoffice.org/c/core/+/178035 Tested-by: Jenkins Reviewed-by: Caolán McNamara --- editeng/source/outliner/outlin2.cxx | 2 +- include/editeng/outliner.hxx | 2 +- sd/source/ui/view/DocumentRenderer.cxx | 4 ++-- svx/source/svdraw/svdview.cxx | 2 +- 4 files changed, 5 insertions(+), 5 deletions(-) diff --git a/editeng/source/outliner/outlin2.cxx b/editeng/source/outliner/outlin2.cxx index a0e384d1388f..18bf47edfe3f 100644 --- a/editeng/source/outliner/outlin2.cxx +++ b/editeng/source/outliner/outlin2.cxx @@ -308,7 +308,7 @@ bool Outliner::IsInUndo() const return pEditEngine->IsInUndo(); } -sal_uInt32 Outliner::GetLineCount( sal_Int32 nParagraph ) const +sal_Int32 Outliner::GetLineCount( sal_Int32 nParagraph ) const { return pEditEngine->GetLineCount( nParagraph ); } diff --git a/include/editeng/outliner.hxx b/include/editeng/outliner.hxx index b18690050037..d1d46dc67326 100644 --- a/include/editeng/outliner.hxx +++ b/include/editeng/outliner.hxx @@ -866,7 +866,7 @@ public: SAL_DLLPRIVATE const Link& GetEndMovingHdl() const {return aEndMovingHdl;} SAL_DLLPRIVATE void SetEndMovingHdl( const Link& rLink){aEndMovingHdl=rLink;} - sal_uInt32 GetLineCount( sal_Int32 nParagraph ) const; + sal_Int32 GetLineCount( sal_Int32 nParagraph ) const; sal_Int32 GetLineLen( sal_Int32 nParagraph, sal_Int32 nLine ) const; sal_uInt32 GetLineHeight( sal_Int32 nParagraph, sal_Int32 nLine = 0 ); diff --git a/sd/source/ui/view/DocumentRenderer.cxx b/sd/source/ui/view/DocumentRenderer.cxx index 467c3fba4bc9..9812d963e604 100644 --- a/sd/source/ui/view/DocumentRenderer.cxx +++ b/sd/source/ui/view/DocumentRenderer.cxx @@ -921,8 +921,8 @@ namespace { for (sal_Int32 i = 0; i < nParaCount && !bExit; ++i) { sal_Int32 nActualLineLen = 0; - sal_uInt32 nLineCount = pOut->GetLineCount(i); - for (sal_uInt32 j = 0; j < nLineCount; ++j) + sal_Int32 nLineCount = pOut->GetLineCount(i); + for (sal_Int32 j = 0; j < nLineCount; ++j) { nActualLineLen += pOut->GetLineLen(i, j); sal_Int32 nLineHeight = pOut->GetLineHeight(i, j); diff --git a/svx/source/svdraw/svdview.cxx b/svx/source/svdraw/svdview.cxx index 33f7fb5913d1..3fac4208e6bc 100644 --- a/svx/source/svdraw/svdview.cxx +++ b/svx/source/svdraw/svdview.cxx @@ -1246,7 +1246,7 @@ OUString SdrView::GetStatusText() // At the end of a line of any multi-line paragraph, we display the // position of the next line of the same paragraph, if there is one. sal_uInt16 nParaLine = 0; - sal_uInt32 nParaLineCount = mpTextEditOutliner->GetLineCount(aSel.end.nPara); + sal_Int32 nParaLineCount = mpTextEditOutliner->GetLineCount(aSel.end.nPara); bool bBrk = false; while (!bBrk) { From c97decfe2e4544f76a2b6f5704928cad0e30b56e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Caol=C3=A1n=20McNamara?= Date: Sat, 7 Dec 2024 12:02:47 +0000 Subject: [PATCH 043/133] cid#1636576 Dereference null return value MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit since: commit 43e511e642a2ce7026b30ea5c212940ff3eb522e CommitDate: Wed Dec 4 10:17:24 2024 +0100 tdf#88226 sd: fix cutting off the overflow text on the notes print page Change-Id: I0a982a0a4213e220ec1bbd166e08bf14191eed0b Reviewed-on: https://gerrit.libreoffice.org/c/core/+/178032 Reviewed-by: Caolán McNamara Tested-by: Jenkins --- sd/source/ui/view/DocumentRenderer.cxx | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/sd/source/ui/view/DocumentRenderer.cxx b/sd/source/ui/view/DocumentRenderer.cxx index 9812d963e604..0c7fd6e5698c 100644 --- a/sd/source/ui/view/DocumentRenderer.cxx +++ b/sd/source/ui/view/DocumentRenderer.cxx @@ -2454,9 +2454,8 @@ private: rInfo.meOrientation, nPaperBin)); } - else // Notes + else if (SdPage* pPage = GetFilteredPage(nPageIndex, PageKind::Notes))// Notes { - SdPage* pPage = GetFilteredPage(nPageIndex, PageKind::Notes); SdDrawDocument* pDocument = mrBase.GetMainViewShell()->GetDoc(); // Clone the current page to create an independent instance. From e92db94e19c869050140fc1df64c09b59e97cd67 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Caol=C3=A1n=20McNamara?= Date: Sat, 7 Dec 2024 12:12:29 +0000 Subject: [PATCH 044/133] cid#1636579 Dereference after null check MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit and cid#1636580 Dereference after null check cid#1636581 Dereference after null check Change-Id: I856876a99a0bbccf27055d2db0dd24f7f040d3af Reviewed-on: https://gerrit.libreoffice.org/c/core/+/178036 Tested-by: Jenkins Reviewed-by: Caolán McNamara --- sw/source/core/unocore/unostyle.cxx | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/sw/source/core/unocore/unostyle.cxx b/sw/source/core/unocore/unostyle.cxx index 67facb9fcf58..44b710f6d8fc 100644 --- a/sw/source/core/unocore/unostyle.cxx +++ b/sw/source/core/unocore/unostyle.cxx @@ -958,7 +958,7 @@ rtl::Reference SwXStyleFamily::getStyleByName(const OUString& rNam SolarMutexGuard aGuard; OUString sStyleName; SwStyleNameMapper::FillUIName(rName, sStyleName, m_rEntry.poolId(), - m_pDocShell && !m_pDocShell->GetDoc()->IsInWriterfilterImport()); + !m_pDocShell->GetDoc()->IsInWriterfilterImport()); if(!m_pBasePool) throw uno::RuntimeException(); SfxStyleSheetBase* pBase = m_pBasePool->Find(sStyleName, m_rEntry.family()); @@ -1026,7 +1026,7 @@ void SwXStyleFamily::insertStyleByName(const OUString& rName, const rtl::Referen throw uno::RuntimeException(); OUString sStyleName; SwStyleNameMapper::FillUIName(rName, sStyleName, m_rEntry.poolId(), - m_pDocShell && !m_pDocShell->GetDoc()->IsInWriterfilterImport()); + !m_pDocShell->GetDoc()->IsInWriterfilterImport()); SfxStyleSheetBase* pBase = m_pBasePool->Find(sStyleName, m_rEntry.family()); if (pBase) throw container::ElementExistException(); @@ -1040,7 +1040,7 @@ void SwXStyleFamily::insertByName(const OUString& rName, const uno::Any& rElemen throw uno::RuntimeException(); OUString sStyleName; SwStyleNameMapper::FillUIName(rName, sStyleName, m_rEntry.poolId(), - m_pDocShell && !m_pDocShell->GetDoc()->IsInWriterfilterImport()); + !m_pDocShell->GetDoc()->IsInWriterfilterImport()); SfxStyleSheetBase* pBase = m_pBasePool->Find(sStyleName, m_rEntry.family()); if (pBase) throw container::ElementExistException(); From 5528f9c8b8ea08ad0a347e9564e7ce98564bed30 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Caol=C3=A1n=20McNamara?= Date: Fri, 6 Dec 2024 15:24:36 +0000 Subject: [PATCH 045/133] cid#1635776 Overflowed constant MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit there is intended to be no logic change here, just rearrangement and acknowledgement that SwOutlineNodesInline::Seek_Entry always sets nEndPosInline to some value. Change-Id: I10d694e20c8619ae297a61f612590556c9a9effa Reviewed-on: https://gerrit.libreoffice.org/c/core/+/178037 Reviewed-by: Caolán McNamara Tested-by: Jenkins --- sw/source/core/crsr/crstrvl.cxx | 77 ++++++++++++++++++--------------- 1 file changed, 42 insertions(+), 35 deletions(-) diff --git a/sw/source/core/crsr/crstrvl.cxx b/sw/source/core/crsr/crstrvl.cxx index 910a62d05bbc..35ca30cf5bb8 100644 --- a/sw/source/core/crsr/crstrvl.cxx +++ b/sw/source/core/crsr/crstrvl.cxx @@ -1366,7 +1366,6 @@ SwOutlineNodes::size_type SwCursorShell::GetOutlinePos(sal_uInt8 nLevel, SwPaM* void SwCursorShell::MakeOutlineSel(SwOutlineNodes::size_type nSttPos, SwOutlineNodes::size_type nEndPos, bool bWithChildren , bool bKillPams, SwOutlineNodesInline* pOutlNdsInline) { - SwOutlineNodesInline::size_type nEndPosInline = SwOutlineNodesInline::npos; const SwNodes& rNds = GetDoc()->GetNodes(); const SwOutlineNodes& rOutlNds = rNds.GetOutLineNds(); if( rOutlNds.empty() ) @@ -1384,47 +1383,55 @@ void SwCursorShell::MakeOutlineSel(SwOutlineNodes::size_type nSttPos, SwOutlineN SwNode* pSttNd = rOutlNds[ nSttPos ]; SwNode* pEndNd = rOutlNds[ nEndPos ]; - if( pOutlNdsInline ) + if (pOutlNdsInline) { pSttNd = const_cast(SwOutlineNodes::GetRootNode(pSttNd)); + + SwOutlineNodesInline::size_type nEndPosInline; pOutlNdsInline->Seek_Entry( pEndNd, &nEndPosInline ); - } + assert(nEndPosInline != SwOutlineNodesInline::npos && "always sets some number <= pOutlNdsInline->size()"); - if( bWithChildren && !pOutlNdsInline ) - { - const int nLevel = pEndNd->GetTextNode()->GetAttrOutlineLevel()-1; - for( ++nEndPos; nEndPos < rOutlNds.size(); ++nEndPos ) + // headings in flys + if (bWithChildren) { + const int nLevel = pEndNd->GetTextNode()->GetAttrOutlineLevel() - 1; + for( ++nEndPosInline; nEndPosInline < pOutlNdsInline->size(); ++nEndPosInline ) + { + pEndNd = (*pOutlNdsInline)[ nEndPosInline ]; + const int nNxtLevel = pEndNd->GetTextNode()->GetAttrOutlineLevel()-1; + if( nNxtLevel <= nLevel ) + break; // EndPos is now on the next one + } + // set anchor node of the fly node + if ( nEndPosInline < pOutlNdsInline->size() ) + pEndNd = const_cast(SwOutlineNodes::GetRootNode(pEndNd)); + } + else if (++nEndPosInline < pOutlNdsInline->size()) + pEndNd = const_cast(SwOutlineNodes::GetRootNode((*pOutlNdsInline)[nEndPosInline])); + + if (nEndPosInline == pOutlNdsInline->size()) // no end found + pEndNd = &rNds.GetEndOfContent(); + } + else + { + if (bWithChildren) + { + const int nLevel = pEndNd->GetTextNode()->GetAttrOutlineLevel()-1; + for( ++nEndPos; nEndPos < rOutlNds.size(); ++nEndPos ) + { + pEndNd = rOutlNds[ nEndPos ]; + const int nNxtLevel = pEndNd->GetTextNode()->GetAttrOutlineLevel()-1; + if( nNxtLevel <= nLevel ) + break; // EndPos is now on the next one + } + } + // if without children then set onto next one + else if (++nEndPos < rOutlNds.size()) pEndNd = rOutlNds[ nEndPos ]; - const int nNxtLevel = pEndNd->GetTextNode()->GetAttrOutlineLevel()-1; - if( nNxtLevel <= nLevel ) - break; // EndPos is now on the next one - } - } - // headings in flys - else if( bWithChildren && pOutlNdsInline ) - { - const int nLevel = pEndNd->GetTextNode()->GetAttrOutlineLevel() - 1; - for( ++nEndPosInline; nEndPosInline < pOutlNdsInline->size(); ++nEndPosInline ) - { - pEndNd = (*pOutlNdsInline)[ nEndPosInline ]; - const int nNxtLevel = pEndNd->GetTextNode()->GetAttrOutlineLevel()-1; - if( nNxtLevel <= nLevel ) - break; // EndPos is now on the next one - } - // set anchor node of the fly node - if ( nEndPosInline < pOutlNdsInline->size() ) - pEndNd = const_cast(SwOutlineNodes::GetRootNode(pEndNd)); - } - // if without children then set onto next one - else if( !pOutlNdsInline && ++nEndPos < rOutlNds.size() ) - pEndNd = rOutlNds[ nEndPos ]; - else if( pOutlNdsInline && ++nEndPosInline < pOutlNdsInline->size() ) - pEndNd = const_cast(SwOutlineNodes::GetRootNode((*pOutlNdsInline)[nEndPosInline])); - if( ( pOutlNdsInline && nEndPosInline == pOutlNdsInline->size() ) || - ( !pOutlNdsInline && nEndPos == rOutlNds.size() ) ) // no end found - pEndNd = &rNds.GetEndOfContent(); + if (nEndPos == rOutlNds.size()) // no end found + pEndNd = &rNds.GetEndOfContent(); + } if( bKillPams ) KillPams(); From a9734683dfa8a36eafd6f32414408c9b8f4a221c Mon Sep 17 00:00:00 2001 From: Mike Kaganski Date: Sat, 7 Dec 2024 18:33:17 +0500 Subject: [PATCH 046/133] Simplify OTextInputStream a bit Change-Id: I94c4432228c470ad31d15a765de87565b4ada9df Reviewed-on: https://gerrit.libreoffice.org/c/core/+/178039 Reviewed-by: Mike Kaganski Tested-by: Jenkins --- io/source/TextInputStream/TextInputStream.cxx | 114 +++++++----------- 1 file changed, 43 insertions(+), 71 deletions(-) diff --git a/io/source/TextInputStream/TextInputStream.cxx b/io/source/TextInputStream/TextInputStream.cxx index bcea56604e3c..94710fe6c8d5 100644 --- a/io/source/TextInputStream/TextInputStream.cxx +++ b/io/source/TextInputStream/TextInputStream.cxx @@ -169,28 +169,21 @@ OUString OTextInputStream::implReadString( const Sequence< sal_Unicode >& Delimi return aRetStr; // Only for bFindLineEnd - sal_Unicode cLineEndChar1 = 0x0D; - sal_Unicode cLineEndChar2 = 0x0A; + constexpr sal_Unicode cLineEndChar1 = '\r'; + constexpr sal_Unicode cLineEndChar2 = '\n'; sal_Int32 nBufferReadPos = 0; - sal_Int32 nCopyLen = 0; - bool bFound = false; - bool bFoundFirstLineEndChar = false; + sal_Int32 nCopyLen = -1; sal_Unicode cFirstLineEndChar = 0; - while( !bFound ) + while (true) { // Still characters available? if( nBufferReadPos == mnCharsInBuffer ) { // Already reached EOF? Then we can't read any more // Or no, so read new characters - if( mbReachedEOF || !implReadNext() ) { - if( bFoundFirstLineEndChar ) { - bFound = true; - nCopyLen = nBufferReadPos - 1; - } + if( !implReadNext() ) break; - } } // Now there should be characters available @@ -199,41 +192,35 @@ OUString OTextInputStream::implReadString( const Sequence< sal_Unicode >& Delimi if( bFindLineEnd ) { - if( bFoundFirstLineEndChar ) + if (cFirstLineEndChar != 0) { - bFound = true; - nCopyLen = nBufferReadPos - 2; - if( c == cLineEndChar1 || c == cLineEndChar2 ) + assert(nCopyLen >= 0); + // This is a check if the next character after a line end char is its second half + // Same line end char -> new line break; non-line-end char -> new line start + if ((c == cFirstLineEndChar) || (c != cLineEndChar1 && c != cLineEndChar2)) { - // Same line end char -> new line break - if( c == cFirstLineEndChar ) - { - nBufferReadPos--; - } - } - else - { - // No second line end char + // Not a two-char line end nBufferReadPos--; } + break; } else if( c == cLineEndChar1 || c == cLineEndChar2 ) { - bFoundFirstLineEndChar = true; - cFirstLineEndChar = c; + nCopyLen = nBufferReadPos - 1; // we know what to copy + cFirstLineEndChar = c; // take one more loop, to check if it's a two-char line end } } else if( comphelper::findValue(Delimiters, c) != -1 ) { - bFound = true; nCopyLen = nBufferReadPos; if( bRemoveDelimiter ) nCopyLen--; + break; } } // Nothing found? Return all - if( !nCopyLen && !bFound && mbReachedEOF ) + if (nCopyLen < 0) nCopyLen = nBufferReadPos; // Create string @@ -251,35 +238,40 @@ OUString OTextInputStream::implReadString( const Sequence< sal_Unicode >& Delimi sal_Int32 OTextInputStream::implReadNext() { - sal_Int32 nFreeBufferSize = mvBuffer.size() - mnCharsInBuffer; - if( nFreeBufferSize < READ_BYTE_COUNT ) - mvBuffer.resize(mvBuffer.size() * 2); - nFreeBufferSize = mvBuffer.size() - mnCharsInBuffer; + // Already reached EOF? Then we can't read any more + if (mbReachedEOF) + return 0; try { - sal_Int32 nRead = mxStream->readSomeBytes( mSeqSource, READ_BYTE_COUNT ); - sal_Int32 nTotalRead = nRead; - if( nRead == 0 ) + if (mxStream->readSomeBytes(mSeqSource, READ_BYTE_COUNT) == 0) + { mbReachedEOF = true; + return 0; + } // Try to convert - sal_uInt32 uiInfo; - sal_Size nSrcCvtBytes = 0; - sal_Size nTargetCount = 0; + sal_uInt32 uiInfo = mvBuffer.size() - mnCharsInBuffer < o3tl::make_unsigned(mSeqSource.getLength()) + ? RTL_TEXTTOUNICODE_INFO_DESTBUFFERTOOSMALL + : 0; + const sal_Int32 nOldCharsInBuffer = mnCharsInBuffer; sal_Size nSourceCount = 0; while( true ) { - const sal_Int8 *pbSource = mSeqSource.getConstArray(); + if (uiInfo & RTL_TEXTTOUNICODE_INFO_DESTBUFFERTOOSMALL) + { + mvBuffer.resize(mvBuffer.size() * 2); + } // All invalid characters are transformed to the unicode undefined char - nTargetCount += rtl_convertTextToUnicode( + sal_Size nSrcCvtBytes = 0; + mnCharsInBuffer += rtl_convertTextToUnicode( mConvText2Unicode, mContextText2Unicode, - reinterpret_cast(&( pbSource[nSourceCount] )), - nTotalRead - nSourceCount, - mvBuffer.data() + mnCharsInBuffer + nTargetCount, - nFreeBufferSize - nTargetCount, + reinterpret_cast(mSeqSource.getConstArray() + nSourceCount), + mSeqSource.getLength() - nSourceCount, + mvBuffer.data() + mnCharsInBuffer, + mvBuffer.size() - mnCharsInBuffer, RTL_TEXTTOUNICODE_FLAGS_UNDEFINED_DEFAULT | RTL_TEXTTOUNICODE_FLAGS_MBUNDEFINED_DEFAULT | RTL_TEXTTOUNICODE_FLAGS_INVALID_DEFAULT, @@ -287,41 +279,21 @@ sal_Int32 OTextInputStream::implReadNext() &nSrcCvtBytes ); nSourceCount += nSrcCvtBytes; - bool bCont = false; - if( uiInfo & RTL_TEXTTOUNICODE_INFO_DESTBUFFERTOOSMALL ) - { - mvBuffer.resize(mvBuffer.size() * 2); - bCont = true; - } - if( uiInfo & RTL_TEXTTOUNICODE_INFO_SRCBUFFERTOOSMALL ) { // read next byte - static Sequence< sal_Int8 > aOneByteSeq( 1 ); - nRead = mxStream->readSomeBytes( aOneByteSeq, 1 ); - if( nRead == 0 ) + Sequence aOneByteSeq(1); + if (mxStream->readSomeBytes(aOneByteSeq, 1) == 0) { mbReachedEOF = true; - break; + return mnCharsInBuffer - nOldCharsInBuffer; } - sal_Int32 nOldLen = mSeqSource.getLength(); - nTotalRead++; - if( nTotalRead > nOldLen ) - { - mSeqSource.realloc( nTotalRead ); - } - mSeqSource.getArray()[ nOldLen ] = aOneByteSeq.getConstArray()[ 0 ]; - bCont = true; + mSeqSource = comphelper::concatSequences(mSeqSource, aOneByteSeq); } - - if( bCont ) - continue; - break; + else if (!(uiInfo & RTL_TEXTTOUNICODE_INFO_DESTBUFFERTOOSMALL)) + return mnCharsInBuffer - nOldCharsInBuffer; // finished } - - mnCharsInBuffer += nTargetCount; - return nTargetCount; } catch( NotConnectedException& ) { From ab5b5ad75d7816d449255b8e0663032749bfc041 Mon Sep 17 00:00:00 2001 From: Jim Raykowski Date: Thu, 5 Dec 2024 15:34:44 -0900 Subject: [PATCH 047/133] Resolves tdf#164143 Tooltip with path to macro in new Macro Organizer dialog contains percent symbols instead Cyrillic Additionally use the same approach to make the expected symbols appear in the description text view. Change-Id: I89adafde4305dbe9a6e56481ed246376bc1d94a1 Reviewed-on: https://gerrit.libreoffice.org/c/core/+/177925 Tested-by: Jenkins Reviewed-by: Jim Raykowski --- cui/source/dialogs/MacroManagerDialog.cxx | 10 +++++++++- 1 file changed, 9 insertions(+), 1 deletion(-) diff --git a/cui/source/dialogs/MacroManagerDialog.cxx b/cui/source/dialogs/MacroManagerDialog.cxx index a017e4da31fb..ebc07902dcb3 100644 --- a/cui/source/dialogs/MacroManagerDialog.cxx +++ b/cui/source/dialogs/MacroManagerDialog.cxx @@ -25,6 +25,7 @@ #include #include #include +#include #include #include #include @@ -578,6 +579,7 @@ IMPL_LINK(ScriptContainersListBox, QueryTooltip, const weld::TreeIter&, rEntryIt && xModLibContainer->isLibraryLink(aLibName)) { OUString aLinkURL = xModLibContainer->getLibraryLinkURL(aLibName); + osl::File::getSystemPathFromFileURL(aLinkURL, aLinkURL); return aLinkURL; } } @@ -966,7 +968,13 @@ void MacroManagerDialog::UpdateUI() if (xModLibContainer.is() && xModLibContainer->hasByName(aLibName) && xModLibContainer->isLibraryLink(aLibName)) { - sDescriptionText = xModLibContainer->getLibraryLinkURL(aLibName); + OUString aLinkURL = xModLibContainer->getLibraryLinkURL(aLibName); + OUString aSysPath; + if (osl::File::getSystemPathFromFileURL(aLinkURL, aSysPath) + == osl::FileBase::E_None) + sDescriptionText = aSysPath; + else + sDescriptionText = aLinkURL; } } } From b96894426f187a323688953f625e21d4fdbc63f4 Mon Sep 17 00:00:00 2001 From: Jim Raykowski Date: Thu, 5 Dec 2024 15:07:20 -0900 Subject: [PATCH 048/133] check passed functions before use This is a follow up to commit 55e86edcb37a37123a69ce3e1eb9e20758415fb6 to fix a crash that occurs when importing a Basic library. The change made to functions arguments passed to ImportLib in PS28 requires they be checked for nullptr before use. For further understanding please see change to moduldl2.cxx at https:// gerrit.libreoffice.org/c/core/+/176254/27..28 Change-Id: I3f7ccc46134ddd2429c499d6e728e30331b51d7d Reviewed-on: https://gerrit.libreoffice.org/c/core/+/177924 Tested-by: Jenkins Reviewed-by: Jim Raykowski --- basctl/source/basicide/moduldl2.cxx | 10 ++++++---- 1 file changed, 6 insertions(+), 4 deletions(-) diff --git a/basctl/source/basicide/moduldl2.cxx b/basctl/source/basicide/moduldl2.cxx index 259957a48c89..b61a39f7e185 100644 --- a/basctl/source/basicide/moduldl2.cxx +++ b/basctl/source/basicide/moduldl2.cxx @@ -817,7 +817,8 @@ void ImportLib(const ScriptDocument& rDocument, weld::Dialog* pDialog, // remove existing libraries if ( bRemove ) { - func_remove_entry(aLibName); // LibPage::InsertLib + if (func_remove_entry) + func_remove_entry(aLibName); // LibPage::InsertLib // remove module library if ( xModLibContainer.is() && xModLibContainer->hasByName( aLibName ) ) @@ -939,15 +940,16 @@ void ImportLib(const ScriptDocument& rDocument, weld::Dialog* pDialog, } } } - - func_insert_entry(aLibName); // LibPage::InsertLib + if (func_insert_entry) + func_insert_entry(aLibName); // LibPage::InsertLib bChanges = true; } } if (bChanges) { - func_insert_entries(); // MacroManager + if (func_insert_entries) + func_insert_entries(); // MacroManager MarkDocumentModified(rDocument); } }); From a35f0aee6270da1c99e9104a372634d7e8913bd6 Mon Sep 17 00:00:00 2001 From: Mike Kaganski Date: Sat, 7 Dec 2024 18:04:42 +0500 Subject: [PATCH 049/133] Simplify a bit Change-Id: Ie2b96e099a0507e14ad8e79276abdbe0f21d35f0 Reviewed-on: https://gerrit.libreoffice.org/c/core/+/178040 Tested-by: Jenkins Reviewed-by: Mike Kaganski --- editeng/source/uno/unotext.cxx | 2 +- editeng/source/uno/unotext2.cxx | 18 +++++++++--------- forms/source/component/Grid.cxx | 4 +--- svx/source/unodraw/unoshap3.cxx | 22 +++++++++++----------- sw/source/core/unocore/unodraw.cxx | 2 +- 5 files changed, 23 insertions(+), 25 deletions(-) diff --git a/editeng/source/uno/unotext.cxx b/editeng/source/uno/unotext.cxx index 6f149cdc67e1..c80399609572 100644 --- a/editeng/source/uno/unotext.cxx +++ b/editeng/source/uno/unotext.cxx @@ -2219,7 +2219,7 @@ uno::Sequence< OUString > SAL_CALL SvxUnoTextBase::getSupportedServiceNames_Stat { return comphelper::concatSequences( SvxUnoTextRangeBase::getSupportedServiceNames_Static(), - std::initializer_list{ u"com.sun.star.text.Text" }); + std::initializer_list{ u"com.sun.star.text.Text"_ustr }); } const uno::Sequence< sal_Int8 > & SvxUnoTextBase::getUnoTunnelId() noexcept diff --git a/editeng/source/uno/unotext2.cxx b/editeng/source/uno/unotext2.cxx index 520aa65c74bf..5cfea9d63173 100644 --- a/editeng/source/uno/unotext2.cxx +++ b/editeng/source/uno/unotext2.cxx @@ -357,11 +357,11 @@ uno::Sequence< OUString > SAL_CALL SvxUnoTextContent::getSupportedServiceNames() { return comphelper::concatSequences( SvxUnoTextRangeBase::getSupportedServiceNames(), - std::initializer_list{ u"com.sun.star.style.ParagraphProperties", - u"com.sun.star.style.ParagraphPropertiesComplex", - u"com.sun.star.style.ParagraphPropertiesAsian", - u"com.sun.star.text.TextContent", - u"com.sun.star.text.Paragraph" }); + std::initializer_list{ u"com.sun.star.style.ParagraphProperties"_ustr, + u"com.sun.star.style.ParagraphPropertiesComplex"_ustr, + u"com.sun.star.style.ParagraphPropertiesAsian"_ustr, + u"com.sun.star.text.TextContent"_ustr, + u"com.sun.star.text.Paragraph"_ustr }); } @@ -618,10 +618,10 @@ uno::Sequence< OUString > SAL_CALL SvxUnoTextCursor::getSupportedServiceNames() { return comphelper::concatSequences( SvxUnoTextRangeBase::getSupportedServiceNames(), - std::initializer_list{ u"com.sun.star.style.ParagraphProperties", - u"com.sun.star.style.ParagraphPropertiesComplex", - u"com.sun.star.style.ParagraphPropertiesAsian", - u"com.sun.star.text.TextCursor" }); + std::initializer_list{ u"com.sun.star.style.ParagraphProperties"_ustr, + u"com.sun.star.style.ParagraphPropertiesComplex"_ustr, + u"com.sun.star.style.ParagraphPropertiesAsian"_ustr, + u"com.sun.star.text.TextCursor"_ustr }); } diff --git a/forms/source/component/Grid.cxx b/forms/source/component/Grid.cxx index 18e52ff7eb9d..7b41dec828d8 100644 --- a/forms/source/component/Grid.cxx +++ b/forms/source/component/Grid.cxx @@ -231,11 +231,9 @@ void SAL_CALL OGridControlModel::setParent( const css::uno::Reference SAL_CALL OGridControlModel::getTypes( ) { return concatSequences( - concatSequences( OControlModel::getTypes(), OInterfaceContainer::getTypes(), - OErrorBroadcaster::getTypes() - ), + OErrorBroadcaster::getTypes(), OGridControlModel_BASE::getTypes() ); } diff --git a/svx/source/unodraw/unoshap3.cxx b/svx/source/unodraw/unoshap3.cxx index ea4e90ee46cb..b24c9f6b53df 100644 --- a/svx/source/unodraw/unoshap3.cxx +++ b/svx/source/unodraw/unoshap3.cxx @@ -420,7 +420,7 @@ uno::Sequence< OUString > SAL_CALL Svx3DSceneObject::getSupportedServiceNames() { return comphelper::concatSequences( SvxShape::getSupportedServiceNames(), - std::initializer_list{ u"com.sun.star.drawing.Shape3DScene" }); + std::initializer_list{ u"com.sun.star.drawing.Shape3DScene"_ustr }); } Svx3DCubeObject::Svx3DCubeObject(SdrObject* pObj) @@ -540,8 +540,8 @@ uno::Sequence< OUString > SAL_CALL Svx3DCubeObject::getSupportedServiceNames() { return comphelper::concatSequences( SvxShape::getSupportedServiceNames(), - std::initializer_list{ u"com.sun.star.drawing.Shape3D", - u"com.sun.star.drawing.Shape3DCube" }); + std::initializer_list{ u"com.sun.star.drawing.Shape3D"_ustr, + u"com.sun.star.drawing.Shape3DCube"_ustr }); } Svx3DSphereObject::Svx3DSphereObject(SdrObject* pObj) @@ -645,8 +645,8 @@ uno::Sequence< OUString > SAL_CALL Svx3DSphereObject::getSupportedServiceNames() { return comphelper::concatSequences( SvxShape::getSupportedServiceNames(), - std::initializer_list{ u"com.sun.star.drawing.Shape3D", - u"com.sun.star.drawing.Shape3DSphere" }); + std::initializer_list{ u"com.sun.star.drawing.Shape3D"_ustr, + u"com.sun.star.drawing.Shape3DSphere"_ustr }); } Svx3DLatheObject::Svx3DLatheObject(SdrObject* pObj) @@ -825,8 +825,8 @@ uno::Sequence< OUString > SAL_CALL Svx3DLatheObject::getSupportedServiceNames() { return comphelper::concatSequences( SvxShape::getSupportedServiceNames(), - std::initializer_list{ u"com.sun.star.drawing.Shape3D", - u"com.sun.star.drawing.Shape3DLathe" }); + std::initializer_list{ u"com.sun.star.drawing.Shape3D"_ustr, + u"com.sun.star.drawing.Shape3DLathe"_ustr }); } Svx3DExtrudeObject::Svx3DExtrudeObject(SdrObject* pObj) @@ -908,8 +908,8 @@ uno::Sequence< OUString > SAL_CALL Svx3DExtrudeObject::getSupportedServiceNames( { return comphelper::concatSequences( SvxShape::getSupportedServiceNames(), - std::initializer_list{ u"com.sun.star.drawing.Shape3D", - u"com.sun.star.drawing.Shape3DExtrude" }); + std::initializer_list{ u"com.sun.star.drawing.Shape3D"_ustr, + u"com.sun.star.drawing.Shape3DExtrude"_ustr }); } Svx3DPolygonObject::Svx3DPolygonObject(SdrObject* pObj) @@ -1044,8 +1044,8 @@ uno::Sequence< OUString > SAL_CALL Svx3DPolygonObject::getSupportedServiceNames( { return comphelper::concatSequences( SvxShape::getSupportedServiceNames(), - std::initializer_list{ u"com.sun.star.drawing.Shape3D", - u"com.sun.star.drawing.Shape3DPolygon" }); + std::initializer_list{ u"com.sun.star.drawing.Shape3D"_ustr, + u"com.sun.star.drawing.Shape3DPolygon"_ustr }); } /* vim:set shiftwidth=4 softtabstop=4 expandtab: */ diff --git a/sw/source/core/unocore/unodraw.cxx b/sw/source/core/unocore/unodraw.cxx index d5b0a60f32b2..991f40fdd013 100644 --- a/sw/source/core/unocore/unodraw.cxx +++ b/sw/source/core/unocore/unodraw.cxx @@ -2212,7 +2212,7 @@ uno::Sequence< OUString > SwXShape::getSupportedServiceNames() if (SvxShape* pSvxShape = GetSvxShape()) aSeq = pSvxShape->getSupportedServiceNames(); return comphelper::concatSequences( - aSeq, std::initializer_list{ u"com.sun.star.drawing.Shape" }); + aSeq, std::initializer_list{ u"com.sun.star.drawing.Shape"_ustr }); } SvxShape* SwXShape::GetSvxShape() From 04c62acc63a88e668edea67ea6dd2127858e25be Mon Sep 17 00:00:00 2001 From: Mike Kaganski Date: Sat, 7 Dec 2024 17:23:17 +0500 Subject: [PATCH 050/133] Use std::initializer_list, C-style array instead of more expensive Sequence Change-Id: Ibb268268926cc91f595f19026f6cee4b5a74a8bc Reviewed-on: https://gerrit.libreoffice.org/c/core/+/178038 Tested-by: Jenkins Reviewed-by: Mike Kaganski --- accessibility/source/standard/vclxaccessiblecombobox.cxx | 2 +- .../source/standard/vclxaccessibledropdowncombobox.cxx | 2 +- .../source/standard/vclxaccessibledropdownlistbox.cxx | 2 +- accessibility/source/standard/vclxaccessiblelist.cxx | 2 +- accessibility/source/standard/vclxaccessiblelistbox.cxx | 2 +- accessibility/source/standard/vclxaccessibletextfield.cxx | 2 +- accessibility/source/standard/vclxaccessibletoolbox.cxx | 2 +- comphelper/source/misc/proxyaggregation.cxx | 2 +- connectivity/source/drivers/jdbc/CallableStatement.cxx | 6 +++--- editeng/source/uno/unofield.cxx | 2 +- forms/source/component/DatabaseForm.cxx | 6 +++--- forms/source/component/Date.cxx | 2 +- forms/source/component/File.cxx | 2 +- forms/source/component/FormComponent.cxx | 2 +- forms/source/component/scrollbar.cxx | 2 +- forms/source/component/spinbutton.cxx | 2 +- forms/source/richtext/richtextmodel.cxx | 2 +- svx/source/form/fmdmod.cxx | 6 +----- svx/source/form/formcontroller.cxx | 2 +- svx/source/table/cell.cxx | 2 +- svx/source/unodraw/unomod.cxx | 2 +- 21 files changed, 25 insertions(+), 29 deletions(-) diff --git a/accessibility/source/standard/vclxaccessiblecombobox.cxx b/accessibility/source/standard/vclxaccessiblecombobox.cxx index 5e0c77304ad8..1673048cf771 100644 --- a/accessibility/source/standard/vclxaccessiblecombobox.cxx +++ b/accessibility/source/standard/vclxaccessiblecombobox.cxx @@ -41,7 +41,7 @@ OUString VCLXAccessibleComboBox::getImplementationName() Sequence< OUString > VCLXAccessibleComboBox::getSupportedServiceNames() { return comphelper::concatSequences(VCLXAccessibleBox::getSupportedServiceNames(), - Sequence{u"com.sun.star.accessibility.AccessibleComboBox"_ustr}); + std::initializer_list{u"com.sun.star.accessibility.AccessibleComboBox"_ustr}); } /* vim:set shiftwidth=4 softtabstop=4 expandtab: */ diff --git a/accessibility/source/standard/vclxaccessibledropdowncombobox.cxx b/accessibility/source/standard/vclxaccessibledropdowncombobox.cxx index 5dc7073e7f0b..91b51606d9e0 100644 --- a/accessibility/source/standard/vclxaccessibledropdowncombobox.cxx +++ b/accessibility/source/standard/vclxaccessibledropdowncombobox.cxx @@ -60,7 +60,7 @@ OUString VCLXAccessibleDropDownComboBox::getImplementationName() Sequence< OUString > VCLXAccessibleDropDownComboBox::getSupportedServiceNames() { return comphelper::concatSequences(VCLXAccessibleBox::getSupportedServiceNames(), - Sequence{u"com.sun.star.accessibility.AccessibleDropDownComboBox"_ustr}); + std::initializer_list{u"com.sun.star.accessibility.AccessibleDropDownComboBox"_ustr}); } /* vim:set shiftwidth=4 softtabstop=4 expandtab: */ diff --git a/accessibility/source/standard/vclxaccessibledropdownlistbox.cxx b/accessibility/source/standard/vclxaccessibledropdownlistbox.cxx index 360eab0dc26c..0445e39b2d29 100644 --- a/accessibility/source/standard/vclxaccessibledropdownlistbox.cxx +++ b/accessibility/source/standard/vclxaccessibledropdownlistbox.cxx @@ -39,7 +39,7 @@ OUString VCLXAccessibleDropDownListBox::getImplementationName() Sequence< OUString > VCLXAccessibleDropDownListBox::getSupportedServiceNames() { return comphelper::concatSequences(VCLXAccessibleBox::getSupportedServiceNames(), - Sequence{u"com.sun.star.accessibility.AccessibleDropDownListBox"_ustr}); + std::initializer_list{u"com.sun.star.accessibility.AccessibleDropDownListBox"_ustr}); } /* vim:set shiftwidth=4 softtabstop=4 expandtab: */ diff --git a/accessibility/source/standard/vclxaccessiblelist.cxx b/accessibility/source/standard/vclxaccessiblelist.cxx index d84a631687fc..79cb5241d567 100644 --- a/accessibility/source/standard/vclxaccessiblelist.cxx +++ b/accessibility/source/standard/vclxaccessiblelist.cxx @@ -602,7 +602,7 @@ OUString VCLXAccessibleList::getImplementationName() Sequence< OUString > VCLXAccessibleList::getSupportedServiceNames() { return comphelper::concatSequences(VCLXAccessibleComponent::getSupportedServiceNames(), - Sequence{u"com.sun.star.accessibility.AccessibleList"_ustr}); + std::initializer_list{u"com.sun.star.accessibility.AccessibleList"_ustr}); } void VCLXAccessibleList::UpdateVisibleLineCount() diff --git a/accessibility/source/standard/vclxaccessiblelistbox.cxx b/accessibility/source/standard/vclxaccessiblelistbox.cxx index 2f9392ab0341..de282aba1a64 100644 --- a/accessibility/source/standard/vclxaccessiblelistbox.cxx +++ b/accessibility/source/standard/vclxaccessiblelistbox.cxx @@ -40,7 +40,7 @@ OUString VCLXAccessibleListBox::getImplementationName() Sequence< OUString > VCLXAccessibleListBox::getSupportedServiceNames() { return comphelper::concatSequences(VCLXAccessibleBox::getSupportedServiceNames(), - Sequence{u"com.sun.star.accessibility.AccessibleListBox"_ustr}); + std::initializer_list{u"com.sun.star.accessibility.AccessibleListBox"_ustr}); } /* vim:set shiftwidth=4 softtabstop=4 expandtab: */ diff --git a/accessibility/source/standard/vclxaccessibletextfield.cxx b/accessibility/source/standard/vclxaccessibletextfield.cxx index 4f43656419b0..238a7f1a670f 100644 --- a/accessibility/source/standard/vclxaccessibletextfield.cxx +++ b/accessibility/source/standard/vclxaccessibletextfield.cxx @@ -96,7 +96,7 @@ OUString VCLXAccessibleTextField::getImplementationName() Sequence< OUString > VCLXAccessibleTextField::getSupportedServiceNames() { return comphelper::concatSequences(VCLXAccessibleTextComponent::getSupportedServiceNames(), - Sequence{u"com.sun.star.accessibility.AccessibleTextField"_ustr}); + std::initializer_list{u"com.sun.star.accessibility.AccessibleTextField"_ustr}); } /* vim:set shiftwidth=4 softtabstop=4 expandtab: */ diff --git a/accessibility/source/standard/vclxaccessibletoolbox.cxx b/accessibility/source/standard/vclxaccessibletoolbox.cxx index d2a1e8d23e27..c8601d707ad3 100644 --- a/accessibility/source/standard/vclxaccessibletoolbox.cxx +++ b/accessibility/source/standard/vclxaccessibletoolbox.cxx @@ -589,7 +589,7 @@ OUString VCLXAccessibleToolBox::getImplementationName() Sequence< OUString > VCLXAccessibleToolBox::getSupportedServiceNames() { return comphelper::concatSequences(VCLXAccessibleComponent::getSupportedServiceNames(), - Sequence{u"com.sun.star.accessibility.AccessibleToolBox"_ustr}); + std::initializer_list{u"com.sun.star.accessibility.AccessibleToolBox"_ustr}); } // XAccessibleContext diff --git a/comphelper/source/misc/proxyaggregation.cxx b/comphelper/source/misc/proxyaggregation.cxx index db580bea496c..b24629d5614a 100644 --- a/comphelper/source/misc/proxyaggregation.cxx +++ b/comphelper/source/misc/proxyaggregation.cxx @@ -208,7 +208,7 @@ namespace comphelper return comphelper::concatSequences( OComponentProxyAggregationHelper::getTypes(), // append XComponent, coming from WeakComponentImplHelperBase - Sequence { cppu::UnoType::get() }); + std::initializer_list{ cppu::UnoType::get() }); } diff --git a/connectivity/source/drivers/jdbc/CallableStatement.cxx b/connectivity/source/drivers/jdbc/CallableStatement.cxx index f98dbe337888..6c1714e06352 100644 --- a/connectivity/source/drivers/jdbc/CallableStatement.cxx +++ b/connectivity/source/drivers/jdbc/CallableStatement.cxx @@ -61,10 +61,10 @@ Any SAL_CALL java_sql_CallableStatement::queryInterface( const Type & rType ) css::uno::Sequence< css::uno::Type > SAL_CALL java_sql_CallableStatement::getTypes( ) { - ::cppu::OTypeCollection aTypes( cppu::UnoType::get(), - cppu::UnoType::get()); + css::uno::Type aTypes[] { cppu::UnoType::get(), + cppu::UnoType::get() }; - return ::comphelper::concatSequences(aTypes.getTypes(),java_sql_PreparedStatement::getTypes()); + return ::comphelper::concatSequences(java_sql_PreparedStatement::getTypes(), aTypes); } sal_Bool SAL_CALL java_sql_CallableStatement::wasNull( ) diff --git a/editeng/source/uno/unofield.cxx b/editeng/source/uno/unofield.cxx index cc2eb9b6367c..cb5000f5ae92 100644 --- a/editeng/source/uno/unofield.cxx +++ b/editeng/source/uno/unofield.cxx @@ -550,7 +550,7 @@ uno::Sequence< uno::Type > SAL_CALL SvxUnoTextField::getTypes() { maTypeSequence = comphelper::concatSequences( OComponentHelper::getTypes(), - uno::Sequence { + std::initializer_list{ cppu::UnoType::get(), cppu::UnoType::get(), cppu::UnoType::get(), diff --git a/forms/source/component/DatabaseForm.cxx b/forms/source/component/DatabaseForm.cxx index 7cc92ac11c32..999bc986bf07 100644 --- a/forms/source/component/DatabaseForm.cxx +++ b/forms/source/component/DatabaseForm.cxx @@ -3717,11 +3717,11 @@ Sequence< OUString > SAL_CALL ODatabaseForm::getSupportedServiceNames() // concat without own services return ::comphelper::concatSequences( - css::uno::Sequence { + aServices, + std::initializer_list{ FRM_SUN_FORMCOMPONENT, u"com.sun.star.form.FormComponents"_ustr, FRM_SUN_COMPONENT_FORM, FRM_SUN_COMPONENT_HTMLFORM, - FRM_SUN_COMPONENT_DATAFORM, FRM_COMPONENT_FORM }, - aServices + FRM_SUN_COMPONENT_DATAFORM, FRM_COMPONENT_FORM } ); } diff --git a/forms/source/component/Date.cxx b/forms/source/component/Date.cxx index 6958a2b3b40b..16cfa00c139d 100644 --- a/forms/source/component/Date.cxx +++ b/forms/source/component/Date.cxx @@ -119,7 +119,7 @@ css::uno::Reference< css::util::XCloneable > SAL_CALL ODateModel::createClone() css::uno::Sequence SAL_CALL ODateModel::getSupportedServiceNames() { - const css::uno::Sequence vals { + static constexpr OUString vals[] { BINDABLE_CONTROL_MODEL, DATA_AWARE_CONTROL_MODEL, VALIDATABLE_CONTROL_MODEL, diff --git a/forms/source/component/File.cxx b/forms/source/component/File.cxx index a4533403c129..ac7c2816da68 100644 --- a/forms/source/component/File.cxx +++ b/forms/source/component/File.cxx @@ -48,7 +48,7 @@ using namespace ::com::sun::star::util; Sequence OFileControlModel::_getTypes() { static Sequence const aTypes = - concatSequences(OControlModel::_getTypes(), Sequence{ cppu::UnoType::get() }); + concatSequences(OControlModel::_getTypes(), std::initializer_list{ cppu::UnoType::get() }); return aTypes; } diff --git a/forms/source/component/FormComponent.cxx b/forms/source/component/FormComponent.cxx index b36329283262..74d46b8c0a83 100644 --- a/forms/source/component/FormComponent.cxx +++ b/forms/source/component/FormComponent.cxx @@ -1508,7 +1508,7 @@ css::uno::Sequence SAL_CALL OBoundControlModel::getSupportedServiceNam Sequence< OUString > OBoundControlModel::getSupportedServiceNames_Static() { - Sequence aOwnServiceNames { u"com.sun.star.form.DataAwareControlModel"_ustr }; + static constexpr OUString aOwnServiceNames[] { u"com.sun.star.form.DataAwareControlModel"_ustr }; return ::comphelper::concatSequences( OControlModel::getSupportedServiceNames_Static(), aOwnServiceNames diff --git a/forms/source/component/scrollbar.cxx b/forms/source/component/scrollbar.cxx index edf44e1a56d9..4eb5786f9fed 100644 --- a/forms/source/component/scrollbar.cxx +++ b/forms/source/component/scrollbar.cxx @@ -120,7 +120,7 @@ namespace frm // to benefit from the functionality for binding to spreadsheet cells Sequence< OUString > SAL_CALL OScrollBarModel::getSupportedServiceNames() { - Sequence< OUString > aOwnNames { FRM_SUN_COMPONENT_SCROLLBAR, BINDABLE_INTEGER_VALUE_RANGE }; + static constexpr OUString aOwnNames[] { FRM_SUN_COMPONENT_SCROLLBAR, BINDABLE_INTEGER_VALUE_RANGE }; return ::comphelper::combineSequences( getAggregateServiceNames(), diff --git a/forms/source/component/spinbutton.cxx b/forms/source/component/spinbutton.cxx index 5d12db677be9..c294983c21cb 100644 --- a/forms/source/component/spinbutton.cxx +++ b/forms/source/component/spinbutton.cxx @@ -73,7 +73,7 @@ namespace frm // to benefit from the functionality for binding to spreadsheet cells Sequence< OUString > SAL_CALL OSpinButtonModel::getSupportedServiceNames() { - Sequence< OUString > aOwnNames { FRM_SUN_COMPONENT_SPINBUTTON, BINDABLE_INTEGER_VALUE_RANGE }; + static constexpr OUString aOwnNames[] { FRM_SUN_COMPONENT_SPINBUTTON, BINDABLE_INTEGER_VALUE_RANGE }; return ::comphelper::combineSequences( getAggregateServiceNames(), diff --git a/forms/source/richtext/richtextmodel.cxx b/forms/source/richtext/richtextmodel.cxx index 8ef6d5973b74..fa2900f11903 100644 --- a/forms/source/richtext/richtextmodel.cxx +++ b/forms/source/richtext/richtextmodel.cxx @@ -263,7 +263,7 @@ namespace frm Sequence< OUString > SAL_CALL ORichTextModel::getSupportedServiceNames() { - Sequence< OUString > aOwnNames { + static constexpr OUString aOwnNames[] { FRM_SUN_COMPONENT_RICHTEXTCONTROL, u"com.sun.star.text.TextRange"_ustr, u"com.sun.star.style.CharacterProperties"_ustr, diff --git a/svx/source/form/fmdmod.cxx b/svx/source/form/fmdmod.cxx index 1c5468f49f3c..ea1c80aeaa18 100644 --- a/svx/source/form/fmdmod.cxx +++ b/svx/source/form/fmdmod.cxx @@ -81,12 +81,8 @@ using namespace ::svxform; FM_SUN_COMPONENT_IMAGECONTROL }; - static const sal_uInt16 nSvxComponentServiceNameListCount = SAL_N_ELEMENTS(aSvxComponentServiceNameList); - - auto aSeq( comphelper::arrayToSequence< OUString >(aSvxComponentServiceNameList, nSvxComponentServiceNameListCount) ); - ::com::sun::star::uno::Sequence< OUString > aParentSeq( SvxUnoDrawMSFactory::getAvailableServiceNames() ); - return comphelper::concatSequences( aParentSeq, aSeq ); + return comphelper::concatSequences(aParentSeq, aSvxComponentServiceNameList); } /* vim:set shiftwidth=4 softtabstop=4 expandtab: */ diff --git a/svx/source/form/formcontroller.cxx b/svx/source/form/formcontroller.cxx index 287cb4933eaf..25c368852a87 100644 --- a/svx/source/form/formcontroller.cxx +++ b/svx/source/form/formcontroller.cxx @@ -656,7 +656,7 @@ Sequence< OUString> SAL_CALL FormController::getSupportedServiceNames() { // service names which are supported only, but cannot be used to created an // instance at a service factory - Sequence aNonCreatableServiceNames { u"com.sun.star.form.FormControllerDispatcher"_ustr }; + static constexpr OUString aNonCreatableServiceNames[] { u"com.sun.star.form.FormControllerDispatcher"_ustr }; // services which can be used to created an instance at a service factory Sequence< OUString > aCreatableServiceNames( getSupportedServiceNames_Static() ); diff --git a/svx/source/table/cell.cxx b/svx/source/table/cell.cxx index 637305c9e6fc..a38b3e46315f 100644 --- a/svx/source/table/cell.cxx +++ b/svx/source/table/cell.cxx @@ -834,7 +834,7 @@ void SAL_CALL Cell::release() noexcept Sequence< Type > SAL_CALL Cell::getTypes( ) { return comphelper::concatSequences( SvxUnoTextBase::getTypes(), - Sequence { + std::initializer_list{ cppu::UnoType::get(), cppu::UnoType::get() }); } diff --git a/svx/source/unodraw/unomod.cxx b/svx/source/unodraw/unomod.cxx index d6b2dac6b2b7..7cfb7e22227b 100644 --- a/svx/source/unodraw/unomod.cxx +++ b/svx/source/unodraw/unomod.cxx @@ -468,7 +468,7 @@ uno::Sequence< OUString > SAL_CALL SvxUnoDrawingModel::getAvailableServiceNames( { const uno::Sequence< OUString > aSNS_ORG( SvxFmMSFactory::getAvailableServiceNames() ); - uno::Sequence< OUString > aSNS{ + static constexpr OUString aSNS[] { u"com.sun.star.drawing.DashTable"_ustr, u"com.sun.star.drawing.GradientTable"_ustr, u"com.sun.star.drawing.HatchTable"_ustr, From 762d76d9a44704af45b4989f900a906f8f7aa3a3 Mon Sep 17 00:00:00 2001 From: Mike Kaganski Date: Sat, 7 Dec 2024 22:12:08 +0500 Subject: [PATCH 051/133] Simplify avmedia::SoundHandler Change-Id: I253d6eda265e3e93d4b85ac35376a96676a68553 Reviewed-on: https://gerrit.libreoffice.org/c/core/+/178050 Tested-by: Jenkins Reviewed-by: Mike Kaganski --- avmedia/source/framework/soundhandler.cxx | 62 ++--------------------- avmedia/source/framework/soundhandler.hxx | 22 ++------ 2 files changed, 9 insertions(+), 75 deletions(-) diff --git a/avmedia/source/framework/soundhandler.cxx b/avmedia/source/framework/soundhandler.cxx index d3cc8b724d39..5af9aca90594 100644 --- a/avmedia/source/framework/soundhandler.cxx +++ b/avmedia/source/framework/soundhandler.cxx @@ -33,61 +33,7 @@ namespace avmedia{ -// XInterface, XTypeProvider, XServiceInfo - - -void SAL_CALL SoundHandler::acquire() noexcept -{ - /* Don't use mutex in methods of XInterface! */ - OWeakObject::acquire(); -} - -void SAL_CALL SoundHandler::release() noexcept -{ - /* Don't use mutex in methods of XInterface! */ - OWeakObject::release(); -} - -css::uno::Any SAL_CALL SoundHandler::queryInterface( const css::uno::Type& aType ) -{ - /* Attention: Don't use mutex or guard in this method!!! Is a method of XInterface. */ - /* Ask for my own supported interfaces ...*/ - css::uno::Any aReturn( ::cppu::queryInterface( aType, - static_cast< css::lang::XTypeProvider* >(this), - static_cast< css::lang::XServiceInfo* >(this), - static_cast< css::frame::XNotifyingDispatch* >(this), - static_cast< css::frame::XDispatch* >(this), - static_cast< css::document::XExtendedFilterDetection* >(this))); - /* If searched interface not supported by this class ... */ - if ( !aReturn.hasValue() ) - { - /* ... ask baseclass for interfaces! */ - aReturn = OWeakObject::queryInterface( aType ); - } - /* Return result of this search. */ - return aReturn; -} - -css::uno::Sequence< sal_Int8 > SAL_CALL SoundHandler::getImplementationId() -{ - return css::uno::Sequence(); -} - -css::uno::Sequence< css::uno::Type > SAL_CALL SoundHandler::getTypes() -{ - static ::cppu::OTypeCollection aTypeCollection( - cppu::UnoType::get(), - cppu::UnoType::get(), - cppu::UnoType::get(), - cppu::UnoType::get(), - cppu::UnoType::get()); - - return aTypeCollection.getTypes(); -} - -/*===========================================================================================================*/ -/* XServiceInfo */ -/*===========================================================================================================*/ +// XServiceInfo OUString SAL_CALL SoundHandler::getImplementationName() { return u"com.sun.star.comp.framework.SoundHandler"_ustr; @@ -162,7 +108,7 @@ void SAL_CALL SoundHandler::dispatchWithNotification(const css::util::URL& const css::uno::Reference< css::frame::XDispatchResultListener >& xListener ) { // SAFE { - const ::osl::MutexGuard aLock( m_aMutex ); + const std::unique_lock aLock(m_aMutex); utl::MediaDescriptor aDescriptor(lDescriptor); @@ -274,7 +220,7 @@ OUString SAL_CALL SoundHandler::detect( css::uno::Sequence< css::beans::Property IMPL_LINK_NOARG(SoundHandler, implts_PlayerNotify, Timer *, void) { // SAFE { - ::osl::ClearableMutexGuard aLock( m_aMutex ); + std::unique_lock aLock(m_aMutex); if (m_xPlayer.is() && m_xPlayer->isPlaying() && m_xPlayer->getMediaTime() < m_xPlayer->getDuration()) { @@ -304,7 +250,7 @@ IMPL_LINK_NOARG(SoundHandler, implts_PlayerNotify, Timer *, void) // } SAFE //release aLock before end of method at which point xOperationHold goes out of scope and pThis dies - aLock.clear(); + aLock.unlock(); } } // namespace framework diff --git a/avmedia/source/framework/soundhandler.hxx b/avmedia/source/framework/soundhandler.hxx index 648cbe59dd4b..a143fcb87eaa 100644 --- a/avmedia/source/framework/soundhandler.hxx +++ b/avmedia/source/framework/soundhandler.hxx @@ -29,6 +29,7 @@ #include +#include #include #include @@ -49,15 +50,9 @@ namespace avmedia{ @devstatus ready @threadsafe yes *//*-*************************************************************************************************************/ -class SoundHandler : // interfaces - public css::lang::XTypeProvider - , public css::lang::XServiceInfo - , public css::frame::XNotifyingDispatch // => XDispatch - , public css::document::XExtendedFilterDetection - // baseclasses - // Order is necessary for right initialization! - , private cppu::BaseMutex - , public ::cppu::OWeakObject +class SoundHandler : public comphelper::WeakImplHelper XDispatch + css::document::XExtendedFilterDetection> { // public methods public: @@ -66,14 +61,7 @@ class SoundHandler : // interfaces SoundHandler(); virtual ~SoundHandler( ) override; - // XInterface, XTypeProvider, XServiceInfo - virtual css::uno::Any SAL_CALL queryInterface( const css::uno::Type& aType ) override; - virtual void SAL_CALL acquire() noexcept override; - virtual void SAL_CALL release() noexcept override; - virtual css::uno::Sequence< css::uno::Type > SAL_CALL getTypes () override; - virtual css::uno::Sequence< sal_Int8 > SAL_CALL getImplementationId() override; - - /* interface XServiceInfo */ + // XServiceInfo virtual OUString SAL_CALL getImplementationName ( ) override; virtual sal_Bool SAL_CALL supportsService ( const OUString& sServiceName ) override; virtual css::uno::Sequence< OUString > SAL_CALL getSupportedServiceNames ( ) override; From ec0a49ecc7ea8449d90c1e69857d62728af19829 Mon Sep 17 00:00:00 2001 From: Mike Kaganski Date: Sat, 7 Dec 2024 22:20:03 +0500 Subject: [PATCH 052/133] Windows 7-8.1 support was removed, prevent install on these old systems There is no simple "Windows is 10 or newer" check in MSI, with the Microsoft policy of "you don't need to know real Windows version". See also https://developercommunity.visualstudio.com/t/detect-a-windows-version-from-msi/412198 The values that MSI sees (e.g. on my Win11) are: Property(C): VersionNT = 603 Property(C): VersionNT64 = 603 Property(C): WindowsBuild = 9600 So those can't be used for the check. I use the WINMAJORVER that is read from registry (Software\Microsoft\Windows NT\CurrentVersion). There is no more need to check and install UCRT; it was dropped. Change-Id: Ic02d6aeb965e9684bafd4357f969980f77000e73 Reviewed-on: https://gerrit.libreoffice.org/c/core/+/178049 Tested-by: Jenkins Reviewed-by: Mike Kaganski --- Repository.mk | 1 - RepositoryExternal.mk | 4 - config_host.mk.in | 1 - configure.ac | 46 -- external/Module_external.mk | 4 - external/msc-externals/Makefile | 7 - .../msc-externals/Module_msc-externals.mk | 29 - external/msc-externals/Package_msvc_dlls.mk | 16 - external/msc-externals/Package_ucrt.mk | 21 - external/msc-externals/README | 1 - .../windows/msi_languages/LaunchCo.ulf | 2 - .../windows/msi_templates/AppSearc.idt | 1 - .../windows/msi_templates/DrLocato.idt | 1 - .../windows/msi_templates/LaunchCo.idt | 3 +- .../windows/msi_templates/Property.idt | 3 +- .../windows/msi_templates/Signatur.idt | 4 - postprocess/signing/no_signing.txt | 6 - scp2/InstallModule_windows.mk | 1 - scp2/source/ooo/ucrt.scp | 157 ---- setup_native/Library_inst_msu_msi.mk | 41 -- setup_native/Module_setup_native.mk | 1 - .../win32/customactions/inst_msu/inst_msu.cxx | 678 ------------------ .../customactions/inst_msu/inst_msu_msi.def | 5 - .../bin/modules/installer/windows/property.pm | 8 +- 24 files changed, 5 insertions(+), 1036 deletions(-) delete mode 100644 external/msc-externals/Makefile delete mode 100644 external/msc-externals/Module_msc-externals.mk delete mode 100644 external/msc-externals/Package_msvc_dlls.mk delete mode 100644 external/msc-externals/Package_ucrt.mk delete mode 100644 external/msc-externals/README delete mode 100644 scp2/source/ooo/ucrt.scp delete mode 100644 setup_native/Library_inst_msu_msi.mk delete mode 100644 setup_native/source/win32/customactions/inst_msu/inst_msu.cxx delete mode 100644 setup_native/source/win32/customactions/inst_msu/inst_msu_msi.def diff --git a/Repository.mk b/Repository.mk index fc2e071ccc26..70e2cf6eee51 100644 --- a/Repository.mk +++ b/Repository.mk @@ -745,7 +745,6 @@ $(eval $(call gb_Helper_register_libraries_for_install,PLAINLIBS_OOO,spsuppfiles $(eval $(call gb_Helper_register_libraries_for_install,PLAINLIBS_OOO,ooobinarytable, \ $(if $(WINDOWS_SDK_HOME),\ instooofiltmsi \ - inst_msu_msi \ qslnkmsi \ reg_dlls \ reg4allmsdoc \ diff --git a/RepositoryExternal.mk b/RepositoryExternal.mk index 23e397263254..fd5c02d29287 100644 --- a/RepositoryExternal.mk +++ b/RepositoryExternal.mk @@ -4310,10 +4310,6 @@ $(call gb_ExternalProject_use_static_libraries,$(1),dtoa) endef -$(eval $(call gb_Helper_register_packages_for_install,ucrt_binarytable,\ - $(if $(UCRT_REDISTDIR),ucrt) \ -)) - ifneq ($(SYSTEM_BOX2D),) define gb_LinkTarget__use_box2d diff --git a/config_host.mk.in b/config_host.mk.in index 7ce742cf3987..8baece8fb531 100644 --- a/config_host.mk.in +++ b/config_host.mk.in @@ -744,7 +744,6 @@ export TMPDIR=@TEMP_DIRECTORY@ export TOUCH=@TOUCH@ export UCRTSDKDIR=@UCRTSDKDIR@ export UCRTVERSION=@UCRTVERSION@ -export UCRT_REDISTDIR=@UCRT_REDISTDIR@ export UNIQ=@UNIQ@ export UNIX_DLAPI_LIBS=@UNIX_DLAPI_LIBS@ export USE_HEADLESS_CODE=@USE_HEADLESS_CODE@ diff --git a/configure.ac b/configure.ac index 370cedc91c29..db7a8e901626 100644 --- a/configure.ac +++ b/configure.ac @@ -4158,7 +4158,6 @@ cygwin*|wsl*) SCPDEFS="$SCPDEFS -DWINDOWS_AARCH64" WIN_HOST_ARCH="arm64" WIN_HOST_BITS=64 - with_ucrt_dir=no ;; *) AC_MSG_ERROR([Unsupported host_cpu $host_cpu for host_os $host_os]) @@ -8945,23 +8944,6 @@ if test "$_os" = "Linux" -a "$host_cpu" = "powerpc"; then fi AC_SUBST([JITC_PROCESSOR_TYPE]) -# Misc Windows Stuff -AC_ARG_WITH(ucrt-dir, - AS_HELP_STRING([--with-ucrt-dir], - [path to the directory with the arch-specific MSU packages of the Windows Universal CRT redistributables - (MS KB 2999226) for packaging into the installsets (without those the target system needs to install - the UCRT or Visual C++ Runtimes manually). The directory must contain the following 6 files: - Windows6.1-KB2999226-x64.msu - Windows6.1-KB2999226-x86.msu - Windows8.1-KB2999226-x64.msu - Windows8.1-KB2999226-x86.msu - Windows8-RT-KB2999226-x64.msu - Windows8-RT-KB2999226-x86.msu - A zip archive including those files is available from Microsoft site: - https://www.microsoft.com/en-us/download/details.aspx?id=48234]), -,) - -UCRT_REDISTDIR="$with_ucrt_dir" if test $_os = "WINNT"; then find_msvc_x64_dlls MSVC_DLL_PATH=`win_short_path_for_make "$msvcdllpath"` @@ -8983,36 +8965,8 @@ if test $_os = "WINNT"; then break fi done - - if test "$UCRT_REDISTDIR" = "no"; then - dnl explicitly disabled - UCRT_REDISTDIR="" - else - PathFormat "$UCRT_REDISTDIR" - UCRT_REDISTDIR="$formatted_path" - UCRT_REDISTDIR_unix="$formatted_path_unix" - if ! test -f "$UCRT_REDISTDIR_unix/Windows6.1-KB2999226-x64.msu" -a \ - -f "$UCRT_REDISTDIR_unix/Windows6.1-KB2999226-x86.msu" -a \ - -f "$UCRT_REDISTDIR_unix/Windows8.1-KB2999226-x64.msu" -a \ - -f "$UCRT_REDISTDIR_unix/Windows8.1-KB2999226-x86.msu" -a \ - -f "$UCRT_REDISTDIR_unix/Windows8-RT-KB2999226-x64.msu" -a \ - -f "$UCRT_REDISTDIR_unix/Windows8-RT-KB2999226-x86.msu"; then - UCRT_REDISTDIR="" - if test -n "$PKGFORMAT"; then - for i in $PKGFORMAT; do - case "$i" in - msi) - AC_MSG_WARN([--without-ucrt-dir not specified or MSUs not found - installer will have runtime dependency]) - add_warning "--without-ucrt-dir not specified or MSUs not found - installer will have runtime dependency" - ;; - esac - done - fi - fi - fi fi -AC_SUBST(UCRT_REDISTDIR) AC_SUBST(MSVC_DLL_PATH) AC_SUBST(MSVC_DLLS) AC_SUBST(MSM_PATH) diff --git a/external/Module_external.mk b/external/Module_external.mk index e60765634ab5..8742fe3b37a4 100644 --- a/external/Module_external.mk +++ b/external/Module_external.mk @@ -9,10 +9,6 @@ $(eval $(call gb_Module_Module,external)) -ifeq ($(COM),MSC) -$(eval $(call gb_Module_add_moduledir,external,msc-externals)) -endif - $(eval $(call gb_Module_add_moduledirs,external,\ $(call gb_Helper_optional,XMLSEC,xmlsec) \ $(call gb_Helper_optional,ABW,libabw) \ diff --git a/external/msc-externals/Makefile b/external/msc-externals/Makefile deleted file mode 100644 index e4968cf85fb6..000000000000 --- a/external/msc-externals/Makefile +++ /dev/null @@ -1,7 +0,0 @@ -# -*- Mode: makefile-gmake; tab-width: 4; indent-tabs-mode: t -*- - -module_directory:=$(dir $(realpath $(firstword $(MAKEFILE_LIST)))) - -include $(module_directory)/../../solenv/gbuild/partial_build.mk - -# vim: set noet sw=4 ts=4: diff --git a/external/msc-externals/Module_msc-externals.mk b/external/msc-externals/Module_msc-externals.mk deleted file mode 100644 index 07ea3878a106..000000000000 --- a/external/msc-externals/Module_msc-externals.mk +++ /dev/null @@ -1,29 +0,0 @@ -# -*- Mode: makefile-gmake; tab-width: 4; indent-tabs-mode: t -*- -# -# This file is part of the LibreOffice project. -# -# This Source Code Form is subject to the terms of the Mozilla Public -# License, v. 2.0. If a copy of the MPL was not distributed with this -# file, You can obtain one at http://mozilla.org/MPL/2.0/. -# - -$(eval $(call gb_Module_Module,msc-externals)) - -ifneq ($(BUILD_X64),) - -$(eval $(call gb_Module_add_targets,msc-externals,\ - Package_msvc_dlls \ -)) - -endif - -# Install the universal crts (tdf#108580) -ifneq ($(UCRT_REDISTDIR),) - -$(eval $(call gb_Module_add_targets,msc-externals,\ - Package_ucrt \ -)) - -endif - -# vim: set noet sw=4 ts=4: diff --git a/external/msc-externals/Package_msvc_dlls.mk b/external/msc-externals/Package_msvc_dlls.mk deleted file mode 100644 index d82dd06c3cec..000000000000 --- a/external/msc-externals/Package_msvc_dlls.mk +++ /dev/null @@ -1,16 +0,0 @@ -# -*- Mode: makefile-gmake; tab-width: 4; indent-tabs-mode: t -*- -# -# This file is part of the LibreOffice project. -# -# This Source Code Form is subject to the terms of the Mozilla Public -# License, v. 2.0. If a copy of the MPL was not distributed with this -# file, You can obtain one at http://mozilla.org/MPL/2.0/. -# - -$(eval $(call gb_Package_Package,msvc_dlls,$(MSVC_DLL_PATH))) - -$(eval $(call gb_Package_add_files,msvc_dlls,program/shlxthdl,\ - $(MSVC_DLLS) \ -)) - -# vim:set shiftwidth=4 tabstop=4 noexpandtab: diff --git a/external/msc-externals/Package_ucrt.mk b/external/msc-externals/Package_ucrt.mk deleted file mode 100644 index 52e6f0cbae97..000000000000 --- a/external/msc-externals/Package_ucrt.mk +++ /dev/null @@ -1,21 +0,0 @@ -# -*- Mode: makefile-gmake; tab-width: 4; indent-tabs-mode: t -*- -# -# This file is part of the LibreOffice project. -# -# This Source Code Form is subject to the terms of the Mozilla Public -# License, v. 2.0. If a copy of the MPL was not distributed with this -# file, You can obtain one at http://mozilla.org/MPL/2.0/. -# - -$(eval $(call gb_Package_Package,ucrt,$(UCRT_REDISTDIR))) - -$(eval $(call gb_Package_add_files,ucrt,$(LIBO_ETC_FOLDER),\ - Windows6.1-KB2999226-x64.msu \ - Windows6.1-KB2999226-x86.msu \ - Windows8.1-KB2999226-x64.msu \ - Windows8.1-KB2999226-x86.msu \ - Windows8-RT-KB2999226-x64.msu \ - Windows8-RT-KB2999226-x86.msu \ -)) - -# vim:set shiftwidth=4 tabstop=4 noexpandtab: diff --git a/external/msc-externals/README b/external/msc-externals/README deleted file mode 100644 index 9ffb415c36e4..000000000000 --- a/external/msc-externals/README +++ /dev/null @@ -1 +0,0 @@ -module msc-externals copies the bundled MSVC runtime DLLs into instdir diff --git a/instsetoo_native/inc_openoffice/windows/msi_languages/LaunchCo.ulf b/instsetoo_native/inc_openoffice/windows/msi_languages/LaunchCo.ulf index 5e57eb1c3c0e..8f4fa841aac6 100644 --- a/instsetoo_native/inc_openoffice/windows/msi_languages/LaunchCo.ulf +++ b/instsetoo_native/inc_openoffice/windows/msi_languages/LaunchCo.ulf @@ -2,5 +2,3 @@ en-US = "The Installation Wizard cannot be run properly because you are logged in as a user without sufficient administrator rights for this system." [OOO_LAUNCH_2] en-US = "[ProductName] cannot be installed on this Windows version. [WindowsMinVersionText] or newer is required." -[OOO_LAUNCH_3] -en-US = "To install [ProductName] on Windows 8.1, at least April 2014 update rollup (MS KB 2919355) must be installed." diff --git a/instsetoo_native/inc_openoffice/windows/msi_templates/AppSearc.idt b/instsetoo_native/inc_openoffice/windows/msi_templates/AppSearc.idt index 0a5b68ed4186..569132a50bae 100644 --- a/instsetoo_native/inc_openoffice/windows/msi_templates/AppSearc.idt +++ b/instsetoo_native/inc_openoffice/windows/msi_templates/AppSearc.idt @@ -1,5 +1,4 @@ Property Signature_ s72 s72 AppSearch Property Signature_ -WIN81S14 win81s14 WINMAJORVER WinMajorVer diff --git a/instsetoo_native/inc_openoffice/windows/msi_templates/DrLocato.idt b/instsetoo_native/inc_openoffice/windows/msi_templates/DrLocato.idt index 589ab7c52806..dfdbe78c60ec 100644 --- a/instsetoo_native/inc_openoffice/windows/msi_templates/DrLocato.idt +++ b/instsetoo_native/inc_openoffice/windows/msi_templates/DrLocato.idt @@ -1,4 +1,3 @@ Signature_ Parent Path Depth s72 S72 S255 I2 DrLocator Signature_ Parent Path -win81s14 [SystemFolder] diff --git a/instsetoo_native/inc_openoffice/windows/msi_templates/LaunchCo.idt b/instsetoo_native/inc_openoffice/windows/msi_templates/LaunchCo.idt index 629c3c5582e1..4d064b92ed0a 100644 --- a/instsetoo_native/inc_openoffice/windows/msi_templates/LaunchCo.idt +++ b/instsetoo_native/inc_openoffice/windows/msi_templates/LaunchCo.idt @@ -2,5 +2,4 @@ Condition Description s255 l255 65001 LaunchCondition Condition Privileged OOO_LAUNCH_1 -Installed Or VersionNT > WindowsMinVersionNumber Or (VersionNT = WindowsMinVersionNumber And ServicePackLevel >= WindowsMinSPNumber) OOO_LAUNCH_2 -Installed Or VersionNT <> 603 Or WIN81S14 OOO_LAUNCH_3 +Installed Or (WINMAJORVER >= WinMajorVerMin) OOO_LAUNCH_2 diff --git a/instsetoo_native/inc_openoffice/windows/msi_templates/Property.idt b/instsetoo_native/inc_openoffice/windows/msi_templates/Property.idt index e528cac384ec..c066aa162c7f 100644 --- a/instsetoo_native/inc_openoffice/windows/msi_templates/Property.idt +++ b/instsetoo_native/inc_openoffice/windows/msi_templates/Property.idt @@ -63,5 +63,4 @@ STR_INSTALLATION_WIZARD OOO_STR_INSTALLATION_WIZARD UpgradeCode UPGRADECODETEMPLATE VC_REDIST 1 WindowsMinVersionText WINDOWSMINVERSIONTEXTTEMPLATE -WindowsMinVersionNumber WINDOWSMINVERSIONNUMBERTEMPLATE -WindowsMinSPNumber WINDOWSMINSPNUMBERTEMPLATE +WinMajorVerMin WINMAJORVERMINTEMPLATE diff --git a/instsetoo_native/inc_openoffice/windows/msi_templates/Signatur.idt b/instsetoo_native/inc_openoffice/windows/msi_templates/Signatur.idt index d5abd9769125..5004a55863ba 100644 --- a/instsetoo_native/inc_openoffice/windows/msi_templates/Signatur.idt +++ b/instsetoo_native/inc_openoffice/windows/msi_templates/Signatur.idt @@ -1,7 +1,3 @@ Signature FileName MinVersion MaxVersion MinSize MaxSize MinDate MaxDate Languages s72 s255 S20 S20 I4 I4 I4 I4 S255 Signature Signature -# Since it's impossible to match minimal version in Signature table independent of -# language, and we need language-independent comparison, we use a value that is at -# least 1 less (see note at https://msdn.microsoft.com/en-us/library/aa371853). -win81s14 kernel32.dll 6.3.9600.17030 diff --git a/postprocess/signing/no_signing.txt b/postprocess/signing/no_signing.txt index 6de68e2e8cc2..53aaac652c2b 100644 --- a/postprocess/signing/no_signing.txt +++ b/postprocess/signing/no_signing.txt @@ -8,9 +8,3 @@ policy.1.0.cli_oootypes.dll policy.1.0.cli_ure.dll policy.1.0.cli_cppuhelper.dll policy.1.0.cli_basetypes.dll -Windows6.1-KB2999226-x64.msu -Windows6.1-KB2999226-x86.msu -Windows8.1-KB2999226-x64.msu -Windows8.1-KB2999226-x86.msu -Windows8-RT-KB2999226-x64.msu -Windows8-RT-KB2999226-x86.msu diff --git a/scp2/InstallModule_windows.mk b/scp2/InstallModule_windows.mk index bd6e478e7785..296f7fccfa5b 100644 --- a/scp2/InstallModule_windows.mk +++ b/scp2/InstallModule_windows.mk @@ -22,7 +22,6 @@ $(eval $(call gb_InstallModule_add_defs,scp2/windows,\ $(eval $(call gb_InstallModule_add_scpfiles,scp2/windows,\ scp2/source/ooo/folder_ooo \ $(if $(MSM_PATH),scp2/source/ooo/vc_redist) \ - $(if $(UCRT_REDISTDIR),scp2/source/ooo/ucrt) \ scp2/source/ooo/windowscustomaction_ooo \ )) diff --git a/scp2/source/ooo/ucrt.scp b/scp2/source/ooo/ucrt.scp deleted file mode 100644 index 7f4ec8195870..000000000000 --- a/scp2/source/ooo/ucrt.scp +++ /dev/null @@ -1,157 +0,0 @@ -/* - * This file is part of the LibreOffice project. - * - * This Source Code Form is subject to the terms of the Mozilla Public - * License, v. 2.0. If a copy of the MPL was not distributed with this - * file, You can obtain one at http://mozilla.org/MPL/2.0/. - */ - -#include "macros.inc" - -File gid_File_Windows6_1_KB2999226_x64_msu - Name = "Windows6.1-KB2999226-x64.msu"; - Dir = gid_Brand_Dir_Program; - Styles = (PACKED, BINARYTABLE, BINARYTABLE_ONLY); -End - -File gid_File_Windows8_RT_KB2999226_x64_msu - Name = "Windows8-RT-KB2999226-x64.msu"; - Dir = gid_Brand_Dir_Program; - Styles = (PACKED, BINARYTABLE, BINARYTABLE_ONLY); -End - -File gid_File_Windows8_1_KB2999226_x64_msu - Name = "Windows8.1-KB2999226-x64.msu"; - Dir = gid_Brand_Dir_Program; - Styles = (PACKED, BINARYTABLE, BINARYTABLE_ONLY); -End - -#ifndef WINDOWS_X64 - -File gid_File_Windows6_1_KB2999226_x86_msu - Name = "Windows6.1-KB2999226-x86.msu"; - Dir = gid_Brand_Dir_Program; - Styles = (PACKED, BINARYTABLE, BINARYTABLE_ONLY); -End - -File gid_File_Windows8_RT_KB2999226_x86_msu - Name = "Windows8-RT-KB2999226-x86.msu"; - Dir = gid_Brand_Dir_Program; - Styles = (PACKED, BINARYTABLE, BINARYTABLE_ONLY); -End - -File gid_File_Windows8_1_KB2999226_x86_msu - Name = "Windows8.1-KB2999226-x86.msu"; - Dir = gid_Brand_Dir_Program; - Styles = (PACKED, BINARYTABLE, BINARYTABLE_ONLY); -End - -#endif /* WINDOWS_X64 */ - -/* A deferred not-impersonated action that will call wusa.exe to actually install - msu. Since deferred actions don't have access to current DB, the action depends - on immediate-executed action inst_ucrt (see below) that precedes it, unpacks - the binary to a temp file, and sets this action's CustomActionData property. -*/ -WindowsCustomAction gid_Customaction_inst_msu - Name = "inst_msu"; - Typ = "3073"; - Source = "inst_msu_msi.dll"; - Target = "InstallMSU"; - Inbinarytable = 1; - Assignment1 = ("InstallExecuteSequence", "Not Installed And inst_msu", "InstallFiles"); -End - -/* An immediately-executed action that will unpack a binary, which name in binary table is set - in "InstMSUBinary" property, to a temporary file, and sets "inst_msu" and "cleanup_msu" props. -*/ -WindowsCustomAction gid_Customaction_unpack_msu - Name = "unpack_msu"; - Typ = "1"; - Source = "inst_msu_msi.dll"; - Target = "UnpackMSUForInstall"; - Inbinarytable = 1; - Assignment1 = ("InstallExecuteSequence", "Not Installed And InstMSUBinary", "cleanup_msu"); -End - -/* A rollback action that removes temp file. It must precede inst_msu. -*/ -WindowsCustomAction gid_Customaction_cleanup_msu - Name = "cleanup_msu"; - Typ = "1345"; - Source = "inst_msu_msi.dll"; - Target = "CleanupMSU"; - Inbinarytable = 1; - Assignment1 = ("InstallExecuteSequence", "Not Installed And cleanup_msu", "inst_msu"); -End - -/* The "InstMSUBinary" property contains an error message number and a binary name, separated by "|". - The former is used when installing the MSU fails. -*/ -WindowsCustomAction gid_Customaction_check_win7x64_ucrt - Name = "check_win7x64_ucrt"; - Typ = "51"; - Source = "InstMSUBinary"; - Target = "KB2999226|Windows61_KB2999226_x64msu"; - Inbinarytable = 0; - Assignment1 = ("InstallExecuteSequence", "Not Installed And VersionNT = 601 And VersionNT64", "FileCost"); - Styles = "NO_FILE"; -End - -WindowsCustomAction gid_Customaction_check_win8x64_ucrt - Name = "check_win8x64_ucrt"; - Typ = "51"; - Source = "InstMSUBinary"; - Target = "KB2999226|Windows8_RT_KB2999226_x64msu"; - Inbinarytable = 0; - Assignment1 = ("InstallExecuteSequence", "Not Installed And VersionNT = 602 And VersionNT64", "check_win7x64_ucrt"); - Styles = "NO_FILE"; -End - -WindowsCustomAction gid_Customaction_check_win81x64_ucrt - Name = "check_win81x64_ucrt"; - Typ = "51"; - Source = "InstMSUBinary"; - Target = "KB2999226|Windows81_KB2999226_x64msu"; - Inbinarytable = 0; - Assignment1 = ("InstallExecuteSequence", "Not Installed And VersionNT = 603 And (Not WINMAJORVER Or WINMAJORVER = \"#6\") And VersionNT64", "check_win8x64_ucrt"); - Styles = "NO_FILE"; -End - -#ifndef WINDOWS_X64 - -/* 32-bit installer must be prepared to run on both 32- and 64-bit Windows. So, it might need to - install either 32-bit or 64-bit UCRT package, depending on OS bitness. -*/ - -WindowsCustomAction gid_Customaction_check_win7x32_ucrt - Name = "check_win7x32_ucrt"; - Typ = "51"; - Source = "InstMSUBinary"; - Target = "KB2999226|Windows61_KB2999226_x86msu"; - Inbinarytable = 0; - Assignment1 = ("InstallExecuteSequence", "Not Installed And VersionNT = 601 And Not VersionNT64", "check_win81x64_ucrt"); - Styles = "NO_FILE"; -End - -WindowsCustomAction gid_Customaction_check_win8x32_ucrt - Name = "check_win8x32_ucrt"; - Typ = "51"; - Source = "InstMSUBinary"; - Target = "KB2999226|Windows8_RT_KB2999226_x86msu"; - Inbinarytable = 0; - Assignment1 = ("InstallExecuteSequence", "Not Installed And VersionNT = 602 And Not VersionNT64", "check_win7x32_ucrt"); - Styles = "NO_FILE"; -End - -WindowsCustomAction gid_Customaction_check_win81x32_ucrt - Name = "check_win81x32_ucrt"; - Typ = "51"; - Source = "InstMSUBinary"; - Target = "KB2999226|Windows81_KB2999226_x86msu"; - Inbinarytable = 0; - Assignment1 = ("InstallExecuteSequence", "Not Installed And VersionNT = 603 And (Not WINMAJORVER Or WINMAJORVER = \"#6\") And Not VersionNT64", "check_win8x32_ucrt"); - Styles = "NO_FILE"; -End - -#endif /* WINDOWS_X64 */ diff --git a/setup_native/Library_inst_msu_msi.mk b/setup_native/Library_inst_msu_msi.mk deleted file mode 100644 index 1a6646f2fa30..000000000000 --- a/setup_native/Library_inst_msu_msi.mk +++ /dev/null @@ -1,41 +0,0 @@ -# -*- Mode: makefile-gmake; tab-width: 4; indent-tabs-mode: t -*- -# -# This file is part of the LibreOffice project. -# -# This Source Code Form is subject to the terms of the Mozilla Public -# License, v. 2.0. If a copy of the MPL was not distributed with this -# file, You can obtain one at http://mozilla.org/MPL/2.0/. -# - -$(eval $(call gb_Library_Library,inst_msu_msi)) - -$(eval $(call gb_Library_add_defs,inst_msu_msi,\ - -U_DLL \ -)) - -$(eval $(call gb_Library_add_cxxflags,inst_msu_msi,\ - $(if $(MSVC_USE_DEBUG_RUNTIME),/MTd,/MT) \ - $(if $(filter -fsanitize=%,$(CC)),,/fno-sanitize-address-vcasan-lib) \ -)) - -$(eval $(call gb_Library_add_ldflags,inst_msu_msi,\ - /DEF:$(SRCDIR)/setup_native/source/win32/customactions/inst_msu/inst_msu_msi.def \ - /NODEFAULTLIB \ -)) - -$(eval $(call gb_Library_add_exception_objects,inst_msu_msi,\ - setup_native/source/win32/customactions/inst_msu/inst_msu \ -)) - -$(eval $(call gb_Library_use_system_win32_libs,inst_msu_msi,\ - libcmt \ - libcpmt \ - libucrt \ - libvcruntime \ - kernel32 \ - Ole32 \ - Shell32 \ - Msi \ -)) - -# vim: set noet sw=4 ts=4: diff --git a/setup_native/Module_setup_native.mk b/setup_native/Module_setup_native.mk index 42fa1421786d..12a6b7cc837d 100644 --- a/setup_native/Module_setup_native.mk +++ b/setup_native/Module_setup_native.mk @@ -23,7 +23,6 @@ $(eval $(call gb_Module_add_targets,setup_native,\ ifeq ($(OS),WNT) $(eval $(call gb_Module_add_targets,setup_native,\ Library_instooofiltmsi \ - Library_inst_msu_msi \ Library_qslnkmsi \ Library_reg_dlls \ Library_reg4allmsdoc \ diff --git a/setup_native/source/win32/customactions/inst_msu/inst_msu.cxx b/setup_native/source/win32/customactions/inst_msu/inst_msu.cxx deleted file mode 100644 index d890f2628193..000000000000 --- a/setup_native/source/win32/customactions/inst_msu/inst_msu.cxx +++ /dev/null @@ -1,678 +0,0 @@ -/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */ -/* - * This file is part of the LibreOffice project. - * - * This Source Code Form is subject to the terms of the Mozilla Public - * License, v. 2.0. If a copy of the MPL was not distributed with this - * file, You can obtain one at http://mozilla.org/MPL/2.0/. - */ - -#include -#include -#include -#include - -#define WIN32_LEAN_AND_MEAN -#include -#include -#include -#include - -namespace -{ -template std::string Num2Hex(IntType n) -{ - std::stringstream sMsg; - sMsg << "0x" << std::uppercase << std::setfill('0') << std::setw(sizeof(n) * 2) << std::hex - << n; - return sMsg.str(); -} - -template std::string Num2Dec(IntType n) -{ - std::stringstream sMsg; - sMsg << n; - return sMsg.str(); -} - -std::string Win32ErrorMessage(const char* sFunc, DWORD nWin32Error) -{ - std::stringstream sMsg; - sMsg << sFunc << " failed with Win32 error code " << Num2Hex(nWin32Error) << "!"; - - return sMsg.str(); -} - -void ThrowHResult(const char* sFunc, HRESULT hr) -{ - std::stringstream sMsg; - sMsg << sFunc << " failed (HRESULT = " << Num2Hex(hr) << ")!"; - - throw std::exception(sMsg.str().c_str()); -} - -void CheckHResult(const char* sFunc, HRESULT hr) -{ - if (FAILED(hr)) - ThrowHResult(sFunc, hr); -} - -void ThrowWin32Error(const char* sFunc, DWORD nWin32Error) -{ - throw std::exception(Win32ErrorMessage(sFunc, nWin32Error).c_str()); -} - -void ThrowLastError(const char* sFunc) { ThrowWin32Error(sFunc, GetLastError()); } - -void CheckWin32Error(const char* sFunc, DWORD nWin32Error) -{ - if (nWin32Error != ERROR_SUCCESS) - ThrowWin32Error(sFunc, nWin32Error); -} - -std::wstring GetKnownFolder(const KNOWNFOLDERID& rfid) -{ - PWSTR sPath = nullptr; - HRESULT hr = SHGetKnownFolderPath(rfid, KF_FLAG_DEFAULT, nullptr, &sPath); - CheckHResult("SHGetKnownFolderPath", hr); - std::wstring sResult(sPath); - CoTaskMemFree(sPath); - return sResult; -} - -void WriteLogElem(MSIHANDLE hInst, MSIHANDLE hRecord, std::ostringstream& sTmpl, UINT) -{ - MsiRecordSetStringA(hRecord, 0, sTmpl.str().c_str()); - MsiProcessMessage(hInst, INSTALLMESSAGE_INFO, hRecord); -} - -void RecSetString(MSIHANDLE hRec, UINT nField, LPCSTR sVal) -{ - MsiRecordSetStringA(hRec, nField, sVal); -} - -void RecSetString(MSIHANDLE hRec, UINT nField, LPCWSTR sVal) -{ - MsiRecordSetStringW(hRec, nField, sVal); -} - -template -void WriteLogElem(MSIHANDLE hInst, MSIHANDLE hRec, std::ostringstream& sTmpl, UINT nField, - const S1& elem, const SOther&... others); - -template -void WriteLogElem(MSIHANDLE hInst, MSIHANDLE hRec, std::ostringstream& sTmpl, UINT nField, - const Ch* elem, const SOther&... others) -{ - sTmpl << " [" << nField << "]"; - RecSetString(hRec, nField, elem); - WriteLogElem(hInst, hRec, sTmpl, nField + 1, others...); -} - -template -void WriteLogElem(MSIHANDLE hInst, MSIHANDLE hRec, std::ostringstream& sTmpl, UINT nField, - const S1& elem, const SOther&... others) -{ - WriteLogElem(hInst, hRec, sTmpl, nField, elem.c_str(), others...); -} - -std::string sLogPrefix; - -template void WriteLog(MSIHANDLE hInst, const StrType&... elements) -{ - PMSIHANDLE hRec = MsiCreateRecord(sizeof...(elements)); - if (!hRec) - return; - - std::ostringstream sTemplate; - sTemplate << sLogPrefix; - WriteLogElem(hInst, hRec, sTemplate, 1, elements...); -} - -// Show a warning message box. This will be automatically suppressed in unattended installation. -void ShowWarning(MSIHANDLE hInst, const std::wstring& sKBNo, const char* sMessage) -{ - // Error table's message #25000: "Installing a pre-requisite [2] failed. - // You might need to manually install it from Microsoft site to be able to run the product.[3]" - PMSIHANDLE hRec = MsiCreateRecord(3); - // To show a message from Error table, record's Field 0 must be null - MsiRecordSetInteger(hRec, 1, 25000); - MsiRecordSetStringW(hRec, 2, sKBNo.c_str()); - std::string s("\n"); - s += sMessage; - MsiRecordSetStringA(hRec, 3, s.c_str()); - MsiProcessMessage(hInst, INSTALLMESSAGE_WARNING, hRec); -} - -// Set custom action description visible in progress dialog -void SetStatusText(MSIHANDLE hInst, const std::wstring& actName, const std::wstring& actDesc) -{ - PMSIHANDLE hRec = MsiCreateRecord(3); - // For INSTALLMESSAGE_ACTIONSTART, record's Field 0 must be null - // Field 1: Action name - must be non-null - MsiRecordSetStringW(hRec, 1, actName.c_str()); - // Field 2: Action description - displayed in dialog - MsiRecordSetStringW(hRec, 2, actDesc.c_str()); - // Let Field 3 stay null - no action template - MsiProcessMessage(hInst, INSTALLMESSAGE_ACTIONSTART, hRec); -} - -typedef std::unique_ptr CloseHandleGuard; -CloseHandleGuard Guard(HANDLE h) { return CloseHandleGuard(h, CloseHandle); } - -typedef std::unique_ptr DeleteFileGuard; -DeleteFileGuard Guard(const wchar_t* sFileName) { return DeleteFileGuard(sFileName, DeleteFileW); } - -typedef std::unique_ptr CloseServiceHandleGuard; -CloseServiceHandleGuard Guard(SC_HANDLE h) -{ - return CloseServiceHandleGuard(h, CloseServiceHandle); -} - -std::wstring GetTempFile() -{ - wchar_t sPath[MAX_PATH + 1]; - DWORD nResult = GetTempPathW(sizeof(sPath) / sizeof(*sPath), sPath); - if (!nResult) - ThrowLastError("GetTempPathW"); - - wchar_t sFile[MAX_PATH + 1]; - nResult = GetTempFileNameW(sPath, L"TMP", 0, sFile); - if (!nResult) - ThrowLastError("GetTempFileNameW"); - return sFile; -} - -bool IsWow64Process() -{ -#if !defined _WIN64 - BOOL bResult = FALSE; - typedef BOOL(WINAPI * LPFN_ISWOW64PROCESS)(HANDLE, PBOOL); - LPFN_ISWOW64PROCESS fnIsWow64Process = reinterpret_cast( - GetProcAddress(GetModuleHandleW(L"kernel32"), "IsWow64Process")); - - if (fnIsWow64Process) - { - if (!fnIsWow64Process(GetCurrentProcess(), &bResult)) - ThrowLastError("IsWow64Process"); - } - - return bResult; -#else - return false; -#endif -} - -// This class uses MsiProcessMessage to check for user input: it returns IDCANCEL when user cancels -// installation. It throws a special exception, to be intercepted in main action function to return -// corresponding exit code. -class UserInputChecker -{ -public: - class eUserCancelled - { - }; - - UserInputChecker(MSIHANDLE hInstall) - : m_hInstall(hInstall) - , m_hProgressRec(MsiCreateRecord(3)) - { - // Use explicit progress messages - MsiRecordSetInteger(m_hProgressRec, 1, 1); - MsiRecordSetInteger(m_hProgressRec, 2, 1); - MsiRecordSetInteger(m_hProgressRec, 3, 0); - int nResult = MsiProcessMessage(m_hInstall, INSTALLMESSAGE_PROGRESS, m_hProgressRec); - if (nResult == IDCANCEL) - throw eUserCancelled(); - // Prepare the record to following progress update calls - MsiRecordSetInteger(m_hProgressRec, 1, 2); - MsiRecordSetInteger(m_hProgressRec, 2, 0); // step by 0 - don't move progress - MsiRecordSetInteger(m_hProgressRec, 3, 0); - } - - void ThrowIfUserCancelled() - { - // Check if user has cancelled - int nResult = MsiProcessMessage(m_hInstall, INSTALLMESSAGE_PROGRESS, m_hProgressRec); - if (nResult == IDCANCEL) - throw eUserCancelled(); - } - -private: - MSIHANDLE m_hInstall; - PMSIHANDLE m_hProgressRec; -}; - -// Checks if Windows Update service is disabled, and if it is, enables it temporarily. -// Also stops the service if it's currently running, because it seems that wusa.exe -// does not freeze when it starts the service itself. -class WUServiceEnabler -{ -public: - WUServiceEnabler(MSIHANDLE hInstall) - : mhInstall(hInstall) - , mhService(EnableWUService(hInstall)) - { - } - - ~WUServiceEnabler() - { - try - { - if (mhService) - { - EnsureServiceEnabled(mhInstall, mhService.get(), false); - StopService(mhInstall, mhService.get(), false); - } - } - catch (std::exception& e) - { - WriteLog(mhInstall, e.what()); - } - } - -private: - static CloseServiceHandleGuard EnableWUService(MSIHANDLE hInstall) - { - auto hSCM = Guard(OpenSCManagerW(nullptr, nullptr, SC_MANAGER_ALL_ACCESS)); - if (!hSCM) - ThrowLastError("OpenSCManagerW"); - WriteLog(hInstall, "Opened service control manager"); - - auto hService = Guard(OpenServiceW(hSCM.get(), L"wuauserv", - SERVICE_QUERY_CONFIG | SERVICE_CHANGE_CONFIG - | SERVICE_QUERY_STATUS | SERVICE_STOP)); - if (!hService) - ThrowLastError("OpenServiceW"); - WriteLog(hInstall, "Obtained WU service handle"); - - const DWORD nCurrentStatus = ServiceStatus(hInstall, hService.get()); - // Stop currently running service to prevent wusa.exe from hanging trying to detect if the - // update is applicable (sometimes this freezes it ~indefinitely; it seems that it doesn't - // happen if wusa.exe starts the service itself: https://superuser.com/questions/1044528/). - // tdf#124794: Wait for service to stop. - if (nCurrentStatus == SERVICE_RUNNING) - StopService(hInstall, hService.get(), true); - - if (nCurrentStatus == SERVICE_RUNNING - || !EnsureServiceEnabled(hInstall, hService.get(), true)) - { - // No need to restore anything back, since we didn't change config - hService.reset(); - WriteLog(hInstall, "Service configuration is unchanged"); - } - - return hService; - } - - // Returns if the service configuration was actually changed - static bool EnsureServiceEnabled(MSIHANDLE hInstall, SC_HANDLE hService, bool bEnabled) - { - bool bConfigChanged = false; - - DWORD nCbRequired = 0; - if (!QueryServiceConfigW(hService, nullptr, 0, &nCbRequired)) - { - if (DWORD nError = GetLastError(); nError != ERROR_INSUFFICIENT_BUFFER) - ThrowWin32Error("QueryServiceConfigW", nError); - } - std::unique_ptr pBuf(new char[nCbRequired]); - LPQUERY_SERVICE_CONFIGW pConfig = reinterpret_cast(pBuf.get()); - if (!QueryServiceConfigW(hService, pConfig, nCbRequired, &nCbRequired)) - ThrowLastError("QueryServiceConfigW"); - WriteLog(hInstall, "Obtained service config"); - - DWORD eNewStartType = 0; - if (bEnabled && pConfig->dwStartType == SERVICE_DISABLED) - { - bConfigChanged = true; - eNewStartType = SERVICE_DEMAND_START; - WriteLog(hInstall, "Service is disabled, and requested to enable"); - } - else if (!bEnabled && pConfig->dwStartType != SERVICE_DISABLED) - { - bConfigChanged = true; - eNewStartType = SERVICE_DISABLED; - WriteLog(hInstall, "Service is enabled, and requested to disable"); - } - - if (bConfigChanged) - { - if (!ChangeServiceConfigW(hService, SERVICE_NO_CHANGE, eNewStartType, SERVICE_NO_CHANGE, - nullptr, nullptr, nullptr, nullptr, nullptr, nullptr, - nullptr)) - ThrowLastError("ChangeServiceConfigW"); - WriteLog(hInstall, "WU service config successfully changed"); - } - else - WriteLog(hInstall, "No need to modify service config"); - - return bConfigChanged; - } - - static DWORD ServiceStatus(MSIHANDLE hInstall, SC_HANDLE hService) - { - SERVICE_STATUS aServiceStatus{}; - if (!QueryServiceStatus(hService, &aServiceStatus)) - ThrowLastError("QueryServiceStatus"); - - std::string sStatus; - switch (aServiceStatus.dwCurrentState) - { - case SERVICE_STOPPED: - sStatus = "SERVICE_STOPPED"; - break; - case SERVICE_START_PENDING: - sStatus = "SERVICE_START_PENDING"; - break; - case SERVICE_STOP_PENDING: - sStatus = "SERVICE_STOP_PENDING"; - break; - case SERVICE_RUNNING: - sStatus = "SERVICE_RUNNING"; - break; - case SERVICE_CONTINUE_PENDING: - sStatus = "SERVICE_CONTINUE_PENDING"; - break; - case SERVICE_PAUSE_PENDING: - sStatus = "SERVICE_PAUSE_PENDING"; - break; - case SERVICE_PAUSED: - sStatus = "SERVICE_PAUSED"; - break; - default: - sStatus = Num2Hex(aServiceStatus.dwCurrentState); - } - WriteLog(hInstall, "Service status is", sStatus); - - return aServiceStatus.dwCurrentState; - } - - static void StopService(MSIHANDLE hInstall, SC_HANDLE hService, bool bWait) - { - try - { - if (ServiceStatus(hInstall, hService) != SERVICE_STOPPED) - { - SERVICE_STATUS aServiceStatus{}; - if (!ControlService(hService, SERVICE_CONTROL_STOP, &aServiceStatus)) - ThrowLastError("ControlService"); - WriteLog(hInstall, - "Successfully sent SERVICE_CONTROL_STOP code to Windows Update service"); - if (aServiceStatus.dwCurrentState != SERVICE_STOPPED && bWait) - { - // Let user cancel too long wait - UserInputChecker aInputChecker(hInstall); - // aServiceStatus.dwWaitHint is unreasonably high for Windows Update (30000), - // so don't use it, but simply poll service status each second - for (int nWait = 0; nWait < 30; ++nWait) // arbitrary limit of 30 s - { - for (int i = 0; i < 2; ++i) // check user input twice a second - { - Sleep(500); - aInputChecker.ThrowIfUserCancelled(); - } - - if (!QueryServiceStatus(hService, &aServiceStatus)) - ThrowLastError("QueryServiceStatus"); - - if (aServiceStatus.dwCurrentState == SERVICE_STOPPED) - break; - } - } - if (aServiceStatus.dwCurrentState == SERVICE_STOPPED) - WriteLog(hInstall, "Successfully stopped Windows Update service"); - else if (bWait) - WriteLog(hInstall, "Wait for Windows Update stop timed out - proceeding"); - } - else - WriteLog(hInstall, "Windows Update service is not running"); - } - catch (std::exception& e) - { - WriteLog(hInstall, e.what()); - } - } - - MSIHANDLE mhInstall; - CloseServiceHandleGuard mhService; -}; -} - -// Immediate action "unpack_msu" that has access to installation database and properties; checks -// "InstMSUBinary" property and unpacks the binary with that name to a temporary file; sets -// "cleanup_msu" and "inst_msu" properties to the full name of the extracted temporary file. These -// properties will become "CustomActionData" property inside relevant deferred actions. -extern "C" __declspec(dllexport) UINT __stdcall UnpackMSUForInstall(MSIHANDLE hInstall) -{ - try - { - sLogPrefix = "UnpackMSUForInstall:"; - WriteLog(hInstall, "started"); - - WriteLog(hInstall, "Checking value of InstMSUBinary"); - wchar_t sInstMSUBinary[MAX_PATH + 10]; - DWORD nCCh = sizeof(sInstMSUBinary) / sizeof(*sInstMSUBinary); - CheckWin32Error("MsiGetPropertyW", - MsiGetPropertyW(hInstall, L"InstMSUBinary", sInstMSUBinary, &nCCh)); - WriteLog(hInstall, "Got InstMSUBinary value:", - sInstMSUBinary); // KB2999226|Windows61_KB2999226_x64msu - const wchar_t* sBinaryName = wcschr(sInstMSUBinary, L'|'); - if (!sBinaryName) - throw std::exception("No KB number in InstMSUBinary!"); - // "KB2999226" - const std::wstring sKBNo(sInstMSUBinary, sBinaryName - sInstMSUBinary); - ++sBinaryName; - - PMSIHANDLE hDatabase = MsiGetActiveDatabase(hInstall); - if (!hDatabase) - ThrowLastError("MsiGetActiveDatabase"); - WriteLog(hInstall, "MsiGetActiveDatabase succeeded"); - - std::wstringstream sQuery; - sQuery << "SELECT `Data` FROM `Binary` WHERE `Name`='" << sBinaryName << "'"; - - PMSIHANDLE hBinaryView; - CheckWin32Error("MsiDatabaseOpenViewW", - MsiDatabaseOpenViewW(hDatabase, sQuery.str().c_str(), &hBinaryView)); - WriteLog(hInstall, "MsiDatabaseOpenViewW succeeded"); - - CheckWin32Error("MsiViewExecute", MsiViewExecute(hBinaryView, 0)); - WriteLog(hInstall, "MsiViewExecute succeeded"); - - PMSIHANDLE hBinaryRecord; - CheckWin32Error("MsiViewFetch", MsiViewFetch(hBinaryView, &hBinaryRecord)); - WriteLog(hInstall, "MsiViewFetch succeeded"); - - const std::wstring sBinary = GetTempFile(); - auto aDeleteFileGuard(Guard(sBinary.c_str())); - WriteLog(hInstall, "Temp file path:", sBinary.c_str()); - - CheckWin32Error("MsiSetPropertyW", - MsiSetPropertyW(hInstall, L"cleanup_msu", sBinary.c_str())); - - { - HANDLE hFile = CreateFileW(sBinary.c_str(), GENERIC_WRITE, 0, nullptr, CREATE_ALWAYS, - FILE_ATTRIBUTE_NORMAL, nullptr); - if (hFile == INVALID_HANDLE_VALUE) - ThrowLastError("CreateFileW"); - auto aFileHandleGuard(Guard(hFile)); - - const DWORD nBufSize = 1024 * 1024; - std::unique_ptr buf(new char[nBufSize]); - DWORD nTotal = 0; - DWORD nRead; - do - { - nRead = nBufSize; - CheckWin32Error("MsiRecordReadStream", - MsiRecordReadStream(hBinaryRecord, 1, buf.get(), &nRead)); - - if (nRead > 0) - { - DWORD nWritten; - if (!WriteFile(hFile, buf.get(), nRead, &nWritten, nullptr)) - ThrowLastError("WriteFile"); - nTotal += nWritten; - } - } while (nRead == nBufSize); - - WriteLog(hInstall, "Successfully wrote", Num2Dec(nTotal), "bytes"); - } - const std::wstring s_inst_msu = sKBNo + L"|" + sBinary; - CheckWin32Error("MsiSetPropertyW", - MsiSetPropertyW(hInstall, L"inst_msu", s_inst_msu.c_str())); - - // Don't delete the file: it will be done by following actions (inst_msu or cleanup_msu) - (void)aDeleteFileGuard.release(); - return ERROR_SUCCESS; - } - catch (std::exception& e) - { - WriteLog(hInstall, e.what()); - } - return ERROR_INSTALL_FAILURE; -} - -// Deferred action "inst_msu" that must be run from system account. Receives the tempfile name from -// "CustomActionData" property, and runs wusa.exe to install it. Waits for it and checks exit code. -extern "C" __declspec(dllexport) UINT __stdcall InstallMSU(MSIHANDLE hInstall) -{ - std::wstring sKBNo; // "KB2999226" - try - { - sLogPrefix = "InstallMSU:"; - WriteLog(hInstall, "started"); - - WriteLog(hInstall, "Checking value of CustomActionData"); - wchar_t sCustomActionData[MAX_PATH + 10]; // "KB2999226|C:\Temp\binary.tmp" - DWORD nCCh = sizeof(sCustomActionData) / sizeof(*sCustomActionData); - CheckWin32Error("MsiGetPropertyW", - MsiGetPropertyW(hInstall, L"CustomActionData", sCustomActionData, &nCCh)); - WriteLog(hInstall, "Got CustomActionData value:", sCustomActionData); - const wchar_t* sBinaryName = wcschr(sCustomActionData, L'|'); - if (!sBinaryName) - throw std::exception("No KB number in CustomActionData!"); - sKBNo = std::wstring(sCustomActionData, sBinaryName - sCustomActionData); - ++sBinaryName; - auto aDeleteFileGuard(Guard(sBinaryName)); - - SetStatusText(hInstall, L"WU service state check", - L"Checking Windows Update service state"); - - // In case the Windows Update service is disabled, we temporarily enable it here. We also - // stop running WU service, to avoid wusa.exe freeze (see comment in EnableWUService). - WUServiceEnabler aWUServiceEnabler(hInstall); - - SetStatusText(hInstall, sKBNo + L" installation", L"Installing " + sKBNo); - - const bool bWow64Process = IsWow64Process(); - WriteLog(hInstall, "Is Wow64 Process:", bWow64Process ? "YES" : "NO"); - std::wstring sWUSAPath = bWow64Process ? GetKnownFolder(FOLDERID_Windows) + L"\\SysNative" - : GetKnownFolder(FOLDERID_System); - sWUSAPath += L"\\wusa.exe"; - WriteLog(hInstall, "Prepared wusa path:", sWUSAPath); - - std::wstring sWUSACmd - = L"\"" + sWUSAPath + L"\" \"" + sBinaryName + L"\" /quiet /norestart"; - WriteLog(hInstall, "Prepared wusa command:", sWUSACmd); - - STARTUPINFOW si{}; - si.cb = sizeof(si); - PROCESS_INFORMATION pi{}; - if (!CreateProcessW(sWUSAPath.c_str(), const_cast(sWUSACmd.c_str()), nullptr, - nullptr, FALSE, CREATE_NO_WINDOW, nullptr, nullptr, &si, &pi)) - ThrowLastError("CreateProcessW"); - CloseHandle(pi.hThread); - auto aCloseProcHandleGuard(Guard(pi.hProcess)); - WriteLog(hInstall, "CreateProcessW succeeded"); - - { - // This block waits when the started wusa.exe process finishes. Since it's possible - // for wusa.exe in some circumstances to wait really long (indefinitely?), we check - // for user input here. - UserInputChecker aInputChecker(hInstall); - for (;;) - { - DWORD nWaitResult = WaitForSingleObject(pi.hProcess, 500); - if (nWaitResult == WAIT_OBJECT_0) - break; // wusa.exe finished - else if (nWaitResult == WAIT_TIMEOUT) - aInputChecker.ThrowIfUserCancelled(); - else - ThrowWin32Error("WaitForSingleObject", nWaitResult); - } - } - - DWORD nExitCode = 0; - if (!GetExitCodeProcess(pi.hProcess, &nExitCode)) - ThrowLastError("GetExitCodeProcess"); - - HRESULT hr = static_cast(nExitCode); - - // HRESULT_FROM_WIN32 is defined as an inline function in SDK 8.1 without the constexpr - // And it won't work to place it inside the switch statement. - if (HRESULT_FROM_WIN32(ERROR_SUCCESS_REBOOT_REQUIRED) == hr) - { - hr = ERROR_SUCCESS_REBOOT_REQUIRED; - } - - switch (hr) - { - case S_OK: - case WU_S_ALREADY_INSTALLED: - case WU_E_NOT_APPLICABLE: // Windows could lie us about its version, etc. - case ERROR_SUCCESS_REBOOT_REQUIRED: - case WU_S_REBOOT_REQUIRED: - WriteLog(hInstall, "wusa.exe succeeded with exit code", Num2Hex(nExitCode)); - return ERROR_SUCCESS; - - default: - ThrowHResult("Execution of wusa.exe", hr); - } - } - catch (const UserInputChecker::eUserCancelled&) - { - return ERROR_INSTALL_USEREXIT; - } - catch (std::exception& e) - { - WriteLog(hInstall, e.what()); - ShowWarning(hInstall, sKBNo, e.what()); - } - return ERROR_SUCCESS; // Do not break on MSU installation errors -} - -// Rollback deferred action "cleanup_msu" that is executed on error or cancel. -// It removes the temporary file created by UnpackMSUForInstall action. -// MUST be placed IMMEDIATELY AFTER "unpack_msu" in execute sequence. -extern "C" __declspec(dllexport) UINT __stdcall CleanupMSU(MSIHANDLE hInstall) -{ - try - { - sLogPrefix = "CleanupMSU:"; - WriteLog(hInstall, "started"); - - WriteLog(hInstall, "Checking value of CustomActionData"); - wchar_t sBinaryName[MAX_PATH + 1]; - DWORD nCCh = sizeof(sBinaryName) / sizeof(*sBinaryName); - CheckWin32Error("MsiGetPropertyW", - MsiGetPropertyW(hInstall, L"CustomActionData", sBinaryName, &nCCh)); - WriteLog(hInstall, "Got CustomActionData value:", sBinaryName); - - if (!DeleteFileW(sBinaryName)) - { - if (DWORD nError = GetLastError(); nError != ERROR_FILE_NOT_FOUND) - ThrowWin32Error("DeleteFileW", nError); - } - WriteLog(hInstall, "File successfully removed"); - } - catch (std::exception& e) - { - WriteLog(hInstall, e.what()); - } - // Always return success - we don't want rollback to fail. - return ERROR_SUCCESS; -} - -/* vim:set shiftwidth=4 softtabstop=4 expandtab: */ diff --git a/setup_native/source/win32/customactions/inst_msu/inst_msu_msi.def b/setup_native/source/win32/customactions/inst_msu/inst_msu_msi.def deleted file mode 100644 index 49ade9c0169e..000000000000 --- a/setup_native/source/win32/customactions/inst_msu/inst_msu_msi.def +++ /dev/null @@ -1,5 +0,0 @@ -LIBRARY "inst_msu_msi.dll" -EXPORTS - UnpackMSUForInstall - InstallMSU - CleanupMSU \ No newline at end of file diff --git a/solenv/bin/modules/installer/windows/property.pm b/solenv/bin/modules/installer/windows/property.pm index fe8e94d44aae..90d39ff86cb2 100644 --- a/solenv/bin/modules/installer/windows/property.pm +++ b/solenv/bin/modules/installer/windows/property.pm @@ -411,9 +411,8 @@ sub update_property_table my $productname = get_productname_for_property_table($language, $allvariables); my $productversion = get_productversion_for_property_table(); my $quickstarterlinkname = get_quickstarterlinkname_for_property_table($language, $allvariables); - my $windowsminversiontext = "Windows 7 SP1"; - my $windowsminversionnumber = "601"; - my $windowsminspnumber = "1"; + my $windowsminversiontext = "Windows 10"; + my $winmajorvermin = "#10"; # Updating the values @@ -428,8 +427,7 @@ sub update_property_table ${$propertyfile}[$i] =~ s/\bPRODUCTVERSIONTEMPLATE\b/$productversion/; ${$propertyfile}[$i] =~ s/\bQUICKSTARTERLINKNAMETEMPLATE\b/$quickstarterlinkname/; ${$propertyfile}[$i] =~ s/\bWINDOWSMINVERSIONTEXTTEMPLATE\b/$windowsminversiontext/; - ${$propertyfile}[$i] =~ s/\bWINDOWSMINVERSIONNUMBERTEMPLATE\b/$windowsminversionnumber/; - ${$propertyfile}[$i] =~ s/\bWINDOWSMINSPNUMBERTEMPLATE\b/$windowsminspnumber/; + ${$propertyfile}[$i] =~ s/\bWINMAJORVERMINTEMPLATE\b/$winmajorvermin/; if ( ${$propertyfile}[$i] =~ m/\bARPNOMODIFY\b/ ) { $hasarpnomodify = 1; } } From 75f5c610de6161284dc7db0550d7875c18fbf27f Mon Sep 17 00:00:00 2001 From: Mike Kaganski Date: Sat, 7 Dec 2024 01:55:39 +0500 Subject: [PATCH 053/133] Simplify OPreparedStatement Change-Id: I1c36ec85d1acafc5c6ef33ea250ac6027d604da7 Reviewed-on: https://gerrit.libreoffice.org/c/core/+/178053 Reviewed-by: Mike Kaganski Tested-by: Jenkins --- .../source/drivers/ado/APreparedStatement.cxx | 30 +------------------ .../source/inc/ado/APreparedStatement.hxx | 17 ++++------- 2 files changed, 6 insertions(+), 41 deletions(-) diff --git a/connectivity/source/drivers/ado/APreparedStatement.cxx b/connectivity/source/drivers/ado/APreparedStatement.cxx index 6be6cfefd993..d7c82d184fdb 100644 --- a/connectivity/source/drivers/ado/APreparedStatement.cxx +++ b/connectivity/source/drivers/ado/APreparedStatement.cxx @@ -55,7 +55,7 @@ using namespace com::sun::star::util; IMPLEMENT_SERVICE_INFO(OPreparedStatement,"com.sun.star.sdbcx.APreparedStatement","com.sun.star.sdbc.PreparedStatement"); OPreparedStatement::OPreparedStatement( OConnection* _pConnection, const OUString& sql) - : OStatement_Base( _pConnection ) + : OPreparedStatement_BASE(_pConnection) { osl_atomic_increment( &m_refCount ); @@ -92,24 +92,6 @@ OPreparedStatement::~OPreparedStatement() } } -Any SAL_CALL OPreparedStatement::queryInterface( const Type & rType ) -{ - Any aRet = OStatement_Base::queryInterface(rType); - return aRet.hasValue() ? aRet : ::cppu::queryInterface( rType, - static_cast< XPreparedStatement*>(this), - static_cast< XParameters*>(this), - static_cast< XResultSetMetaDataSupplier*>(this)); -} - -css::uno::Sequence< css::uno::Type > SAL_CALL OPreparedStatement::getTypes( ) -{ - ::cppu::OTypeCollection aTypes( cppu::UnoType::get(), - cppu::UnoType::get(), - cppu::UnoType::get()); - - return ::comphelper::concatSequences(aTypes.getTypes(),OStatement_Base::getTypes()); -} - Reference< XResultSetMetaData > SAL_CALL OPreparedStatement::getMetaData( ) { if(!m_xMetaData.is() && m_RecordSet.IsValid()) @@ -421,16 +403,6 @@ void SAL_CALL OPreparedStatement::clearParameters( ) } } -void SAL_CALL OPreparedStatement::acquire() noexcept -{ - OStatement_Base::acquire(); -} - -void SAL_CALL OPreparedStatement::release() noexcept -{ - OStatement_Base::release(); -} - void OPreparedStatement::replaceParameterNodeName(OSQLParseNode const * _pNode, const OUString& _sDefaultName, sal_Int32& _rParameterCount) diff --git a/connectivity/source/inc/ado/APreparedStatement.hxx b/connectivity/source/inc/ado/APreparedStatement.hxx index 2ce394dbdefb..8227252b685c 100644 --- a/connectivity/source/inc/ado/APreparedStatement.hxx +++ b/connectivity/source/inc/ado/APreparedStatement.hxx @@ -34,13 +34,12 @@ namespace connectivity class OSQLParseNode; namespace ado { + using OPreparedStatement_BASE + = cppu::ImplInheritanceHelper; - class OPreparedStatement : public OStatement_Base, - public css::sdbc::XPreparedStatement, - public css::sdbc::XParameters, - public css::sdbc::XResultSetMetaDataSupplier, - public css::lang::XServiceInfo - + class OPreparedStatement : public OPreparedStatement_BASE { /// @throws css::sdbc::SQLException /// @throws css::uno::RuntimeException @@ -62,12 +61,6 @@ namespace connectivity // a Constructor, that is needed for when Returning the Object is needed: OPreparedStatement( OConnection* _pConnection, const OUString& sql); - virtual void SAL_CALL acquire() noexcept override; - virtual void SAL_CALL release() noexcept override; - virtual css::uno::Any SAL_CALL queryInterface( const css::uno::Type & rType ) override; - //XTypeProvider - virtual css::uno::Sequence< css::uno::Type > SAL_CALL getTypes( ) override; - // XPreparedStatement virtual css::uno::Reference< css::sdbc::XResultSet > SAL_CALL executeQuery( ) override; using OStatement_Base::executeQuery; From 831700824d6c6c86ee798fec4617307aedded7df Mon Sep 17 00:00:00 2001 From: Mike Kaganski Date: Sat, 7 Dec 2024 02:01:07 +0500 Subject: [PATCH 054/133] Simplify getTypes implementations Change-Id: Ia0f7e8497f628b17a108a4dd8ffebc60745b7d6a Reviewed-on: https://gerrit.libreoffice.org/c/core/+/178054 Tested-by: Jenkins Reviewed-by: Mike Kaganski --- .../source/drivers/ado/ADatabaseMetaDataResultSet.cxx | 7 ++----- connectivity/source/drivers/ado/AResultSet.cxx | 7 ++----- connectivity/source/drivers/ado/AStatement.cxx | 7 ++----- 3 files changed, 6 insertions(+), 15 deletions(-) diff --git a/connectivity/source/drivers/ado/ADatabaseMetaDataResultSet.cxx b/connectivity/source/drivers/ado/ADatabaseMetaDataResultSet.cxx index 0e5c082d7fdf..5c96b394da0f 100644 --- a/connectivity/source/drivers/ado/ADatabaseMetaDataResultSet.cxx +++ b/connectivity/source/drivers/ado/ADatabaseMetaDataResultSet.cxx @@ -99,11 +99,8 @@ Any SAL_CALL ODatabaseMetaDataResultSet::queryInterface( const Type & rType ) css::uno::Sequence< css::uno::Type > SAL_CALL ODatabaseMetaDataResultSet::getTypes( ) { - ::cppu::OTypeCollection aTypes( cppu::UnoType::get(), - cppu::UnoType::get(), - cppu::UnoType::get()); - - return ::comphelper::concatSequences(aTypes.getTypes(),ODatabaseMetaDataResultSet_BASE::getTypes()); + return comphelper::concatSequences(cppu::OPropertySetHelper::getTypes(), + ODatabaseMetaDataResultSet_BASE::getTypes()); } void ODatabaseMetaDataResultSet::checkRecordSet() diff --git a/connectivity/source/drivers/ado/AResultSet.cxx b/connectivity/source/drivers/ado/AResultSet.cxx index f1357449d471..ae1013c1c177 100644 --- a/connectivity/source/drivers/ado/AResultSet.cxx +++ b/connectivity/source/drivers/ado/AResultSet.cxx @@ -132,11 +132,8 @@ Any SAL_CALL OResultSet::queryInterface( const Type & rType ) css::uno::Sequence< css::uno::Type > SAL_CALL OResultSet::getTypes( ) { - ::cppu::OTypeCollection aTypes( cppu::UnoType::get(), - cppu::UnoType::get(), - cppu::UnoType::get()); - - return ::comphelper::concatSequences(aTypes.getTypes(),OResultSet_BASE::getTypes()); + return comphelper::concatSequences(cppu::OPropertySetHelper::getTypes(), + OResultSet_BASE::getTypes()); } sal_Int32 SAL_CALL OResultSet::findColumn( const OUString& columnName ) diff --git a/connectivity/source/drivers/ado/AStatement.cxx b/connectivity/source/drivers/ado/AStatement.cxx index 935e361f8000..0764a4b335a5 100644 --- a/connectivity/source/drivers/ado/AStatement.cxx +++ b/connectivity/source/drivers/ado/AStatement.cxx @@ -120,11 +120,8 @@ Any SAL_CALL OStatement_Base::queryInterface( const Type & rType ) css::uno::Sequence< css::uno::Type > SAL_CALL OStatement_Base::getTypes( ) { - ::cppu::OTypeCollection aTypes( cppu::UnoType::get(), - cppu::UnoType::get(), - cppu::UnoType::get()); - - return ::comphelper::concatSequences(aTypes.getTypes(),OStatement_BASE::getTypes()); + return comphelper::concatSequences(cppu::OPropertySetHelper::getTypes(), + OStatement_BASE::getTypes()); } From 8fdef548702ef240980b52e4076af36122534fed Mon Sep 17 00:00:00 2001 From: Mike Kaganski Date: Sat, 7 Dec 2024 02:38:08 +0500 Subject: [PATCH 055/133] Simplify OPropertyContainer::getBaseTypes Change-Id: I438d510e05329163dabdc8ed42d3a97d49e19ef9 Reviewed-on: https://gerrit.libreoffice.org/c/core/+/178055 Tested-by: Jenkins Reviewed-by: Mike Kaganski --- comphelper/source/property/propertycontainer.cxx | 7 +------ include/comphelper/propertycontainer.hxx | 2 +- 2 files changed, 2 insertions(+), 7 deletions(-) diff --git a/comphelper/source/property/propertycontainer.cxx b/comphelper/source/property/propertycontainer.cxx index ad24c5f30aa7..0c17feb50234 100644 --- a/comphelper/source/property/propertycontainer.cxx +++ b/comphelper/source/property/propertycontainer.cxx @@ -42,12 +42,7 @@ OPropertyContainer::~OPropertyContainer() Sequence< Type > OPropertyContainer::getBaseTypes() { // just the types from our one and only base class - ::cppu::OTypeCollection aTypes( - cppu::UnoType::get(), - cppu::UnoType::get(), - cppu::UnoType::get() - ); - return aTypes.getTypes(); + return cppu::OPropertySetHelper::getTypes(); } sal_Bool OPropertyContainer::convertFastPropertyValue( diff --git a/include/comphelper/propertycontainer.hxx b/include/comphelper/propertycontainer.hxx index 2c64b2cdfedf..0c663e7bacab 100644 --- a/include/comphelper/propertycontainer.hxx +++ b/include/comphelper/propertycontainer.hxx @@ -53,7 +53,7 @@ protected: /// for scripting : the types of the interfaces supported by this class /// /// @throws css::uno::RuntimeException - static css::uno::Sequence< css::uno::Type > getBaseTypes(); + css::uno::Sequence< css::uno::Type > getBaseTypes(); // OPropertySetHelper overridables virtual sal_Bool SAL_CALL convertFastPropertyValue( From cd9976d2b1019a01f7de0b1850acf1957cbb8946 Mon Sep 17 00:00:00 2001 From: Mike Kaganski Date: Sat, 7 Dec 2024 02:54:25 +0500 Subject: [PATCH 056/133] Avoid needless temporary Sequence creation Change-Id: Ia0b6df8b329136292917c94ee5d5e69a0931a200 Reviewed-on: https://gerrit.libreoffice.org/c/core/+/178056 Reviewed-by: Mike Kaganski Tested-by: Jenkins --- editeng/source/accessibility/AccessibleStaticTextBase.cxx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/editeng/source/accessibility/AccessibleStaticTextBase.cxx b/editeng/source/accessibility/AccessibleStaticTextBase.cxx index e318dc4eecba..9dd2a3483a93 100644 --- a/editeng/source/accessibility/AccessibleStaticTextBase.cxx +++ b/editeng/source/accessibility/AccessibleStaticTextBase.cxx @@ -943,7 +943,7 @@ namespace accessibility } } - return ::comphelper::concatSequences( aRunAttrSeq, comphelper::containerToSequence(aDiffVec) ); + return comphelper::concatSequences(aRunAttrSeq, aDiffVec); } tools::Rectangle AccessibleStaticTextBase::GetParagraphBoundingBox() const From 05eb50c396c3ff2adcc824cba20f8af1ed0d27c8 Mon Sep 17 00:00:00 2001 From: Mike Kaganski Date: Sat, 7 Dec 2024 23:15:21 +0500 Subject: [PATCH 057/133] Simplify unocontrols::BaseControl hierarchy Change-Id: I7c690cd429b2ac52f8aac602b4c9129bdd774b09 Reviewed-on: https://gerrit.libreoffice.org/c/core/+/178052 Tested-by: Jenkins Reviewed-by: Mike Kaganski --- UnoControls/inc/basecontainercontrol.hxx | 41 ++-------- UnoControls/inc/basecontrol.hxx | 79 ++----------------- .../source/base/basecontainercontrol.cxx | 39 +-------- UnoControls/source/base/basecontrol.cxx | 74 ----------------- UnoControls/source/controls/framecontrol.cxx | 34 +++----- UnoControls/source/controls/progressbar.cxx | 53 +------------ UnoControls/source/inc/framecontrol.hxx | 7 +- UnoControls/source/inc/progressbar.hxx | 34 ++------ 8 files changed, 34 insertions(+), 327 deletions(-) diff --git a/UnoControls/inc/basecontainercontrol.hxx b/UnoControls/inc/basecontainercontrol.hxx index 18e027cc43d5..bdc63b481b7a 100644 --- a/UnoControls/inc/basecontainercontrol.hxx +++ b/UnoControls/inc/basecontainercontrol.hxx @@ -33,9 +33,11 @@ struct IMPL_ControlInfo OUString sName; }; -class BaseContainerControl : public css::awt::XControlModel - , public css::awt::XControlContainer - , public BaseControl +using BaseContainerControl_BASE = cppu::ImplInheritanceHelper; + +class BaseContainerControl : public BaseContainerControl_BASE { public: @@ -43,37 +45,6 @@ public: virtual ~BaseContainerControl() override; - // XInterface - - /** - @short give answer, if interface is supported - @descr The interfaces are searched by type. - - @seealso XInterface - - @param "rType" is the type of searched interface. - - @return Any information about found interface - - @onerror A RuntimeException is thrown. - */ - - virtual css::uno::Any SAL_CALL queryInterface( - const css::uno::Type& aType - ) override; - - // XTypeProvider - - /** - @short get information about supported interfaces - @seealso XTypeProvider - @return Sequence of types of all supported interfaces - - @onerror A RuntimeException is thrown. - */ - - virtual css::uno::Sequence< css::uno::Type > SAL_CALL getTypes() override; - // XControl virtual void SAL_CALL createPeer( @@ -121,7 +92,7 @@ public: virtual void SAL_CALL setVisible( sal_Bool bVisible ) override; protected: - using WeakComponentImplHelper::disposing; + using WeakComponentImplHelperBase::disposing; virtual css::awt::WindowDescriptor impl_getWindowDescriptor( const css::uno::Reference< css::awt::XWindowPeer >& xParentPeer diff --git a/UnoControls/inc/basecontrol.hxx b/UnoControls/inc/basecontrol.hxx index 9f60537bb7cb..90cdf51f7c7a 100644 --- a/UnoControls/inc/basecontrol.hxx +++ b/UnoControls/inc/basecontrol.hxx @@ -39,82 +39,19 @@ namespace unocontrols { class OMRCListenerMultiplexerHelper; } namespace unocontrols { -class BaseControl : public css::lang::XServiceInfo - , public css::awt::XPaintListener - , public css::awt::XWindowListener - , public css::awt::XView - , public css::awt::XWindow - , public css::awt::XControl - , public cppu::BaseMutex - , public ::cppu::WeakComponentImplHelper<> +class BaseControl : public cppu::BaseMutex, + public cppu::WeakComponentImplHelper { public: BaseControl( const css::uno::Reference< css::uno::XComponentContext >& rxContext ); virtual ~BaseControl() override; - // XInterface - - /** - @short give answer, if interface is supported - @descr The interfaces are searched by type. - - @seealso XInterface - - @param "rType" is the type of searched interface. - - @return Any information about found interface - - @onerror A RuntimeException is thrown. - */ - - virtual css::uno::Any SAL_CALL queryInterface( - const css::uno::Type& aType - ) override; - - /** - @short increment refcount - @seealso XInterface - @seealso release() - @onerror A RuntimeException is thrown. - */ - - virtual void SAL_CALL acquire() noexcept override; - - /** - @short decrement refcount - @seealso XInterface - @seealso acquire() - @onerror A RuntimeException is thrown. - */ - - virtual void SAL_CALL release() noexcept override; - - // XTypeProvider - - /** - @short get information about supported interfaces - @seealso XTypeProvider - @return Sequence of types of all supported interfaces - - @onerror A RuntimeException is thrown. - */ - - virtual css::uno::Sequence< css::uno::Type > SAL_CALL getTypes() override; - - /** - @short get implementation id - @descr This ID is necessary for UNO-caching. If there no ID, cache is disabled. - Another way, cache is enabled. - - @seealso XTypeProvider - @return ID as Sequence of byte - - @onerror A RuntimeException is thrown. - */ - - virtual css::uno::Sequence< sal_Int8 > SAL_CALL getImplementationId() override; - // XServiceInfo virtual sal_Bool SAL_CALL supportsService( @@ -265,7 +202,7 @@ public: virtual void SAL_CALL windowHidden( const css::lang::EventObject& aEvent ) override; protected: - using WeakComponentImplHelper::disposing; + using WeakComponentImplHelperBase::disposing; const css::uno::Reference< css::uno::XComponentContext >& impl_getComponentContext() const { return m_xComponentContext;} diff --git a/UnoControls/source/base/basecontainercontrol.cxx b/UnoControls/source/base/basecontainercontrol.cxx index bf638a9c56a4..f78ed4552eac 100644 --- a/UnoControls/source/base/basecontainercontrol.cxx +++ b/UnoControls/source/base/basecontainercontrol.cxx @@ -40,7 +40,7 @@ namespace unocontrols { // construct/destruct BaseContainerControl::BaseContainerControl( const Reference< XComponentContext >& rxContext ) - : BaseControl ( rxContext ) + : BaseContainerControl_BASE(rxContext) , m_aListeners ( m_aMutex ) { } @@ -49,43 +49,6 @@ BaseContainerControl::~BaseContainerControl() { } -// XInterface - -Any SAL_CALL BaseContainerControl::queryInterface( const Type& rType ) -{ - // Ask for my own supported interfaces ... - // Attention: XTypeProvider and XInterface are supported by WeakComponentImplHelper! - Any aReturn ( ::cppu::queryInterface( rType , - static_cast< XControlModel* > ( this ) , - static_cast< XControlContainer* > ( this ) - ) - ); - - // If searched interface supported by this class ... - if ( aReturn.hasValue() ) - { - // ... return this information. - return aReturn; - } - else - { - // Else; ... ask baseclass for interfaces! - return BaseControl::queryInterface( rType ); - } -} - -// XTypeProvider - -Sequence< Type > SAL_CALL BaseContainerControl::getTypes() -{ - static OTypeCollection ourTypeCollection( - cppu::UnoType::get(), - cppu::UnoType::get(), - BaseControl::getTypes() ); - - return ourTypeCollection.getTypes(); -} - // XControl void SAL_CALL BaseContainerControl::createPeer( const Reference< XToolkit >& xToolkit , diff --git a/UnoControls/source/base/basecontrol.cxx b/UnoControls/source/base/basecontrol.cxx index 247142e5c151..59c5888d4c3f 100644 --- a/UnoControls/source/base/basecontrol.cxx +++ b/UnoControls/source/base/basecontrol.cxx @@ -65,80 +65,6 @@ BaseControl::~BaseControl() { } -// XInterface - -Any SAL_CALL BaseControl::queryInterface( const Type& rType ) -{ - // Ask for my own supported interfaces ... - // Attention: XTypeProvider and XInterface are supported by WeakComponentImplHelper! - Any aReturn ( ::cppu::queryInterface( rType , - static_cast< XPaintListener*> ( this ) , - static_cast< XWindowListener*> ( this ) , - static_cast< XView* > ( this ) , - static_cast< XWindow* > ( this ) , - static_cast< XServiceInfo* > ( this ) , - static_cast< XControl* > ( this ) - ) - ); - - // If searched interface supported by this class ... - if ( aReturn.hasValue() ) - { - // ... return this information. - return aReturn; - } - else - { - // Else; ... ask baseclass for interfaces! - return WeakComponentImplHelper::queryInterface( rType ); - } -} - -// XInterface - -void SAL_CALL BaseControl::acquire() noexcept -{ - // Attention: - // Don't use mutex or guard in this method!!! Is a method of XInterface. - - // Forward to baseclass - WeakComponentImplHelper::acquire(); -} - -// XInterface - -void SAL_CALL BaseControl::release() noexcept -{ - // Attention: - // Don't use mutex or guard in this method!!! Is a method of XInterface. - - // Forward to baseclass - WeakComponentImplHelper::release(); -} - -// XTypeProvider - -Sequence< Type > SAL_CALL BaseControl::getTypes() -{ - static OTypeCollection ourTypeCollection( - cppu::UnoType::get(), - cppu::UnoType::get(), - cppu::UnoType::get(), - cppu::UnoType::get(), - cppu::UnoType::get(), - cppu::UnoType::get(), - WeakComponentImplHelper::getTypes() ); - - return ourTypeCollection.getTypes(); -} - -// XTypeProvider - -Sequence< sal_Int8 > SAL_CALL BaseControl::getImplementationId() -{ - return css::uno::Sequence(); -} - // XServiceInfo OUString SAL_CALL BaseControl::getImplementationName() diff --git a/UnoControls/source/controls/framecontrol.cxx b/UnoControls/source/controls/framecontrol.cxx index 6b12862d734b..e6eefda2124c 100644 --- a/UnoControls/source/controls/framecontrol.cxx +++ b/UnoControls/source/controls/framecontrol.cxx @@ -27,6 +27,7 @@ #include #include #include +#include #include #include #include @@ -58,7 +59,7 @@ enum PropertyHandle // values represent index in PropertyArray // construct/destruct FrameControl::FrameControl( const Reference< XComponentContext >& rxContext) - : BaseControl ( rxContext ) + : FrameControl_BASE ( rxContext ) , OBroadcastHelper ( m_aMutex ) , OPropertySetHelper ( *static_cast< OBroadcastHelper * >(this) ) , m_aConnectionPointContainer ( new OConnectionPointContainerHelper(m_aMutex) ) @@ -72,23 +73,10 @@ FrameControl::~FrameControl() // XInterface Any SAL_CALL FrameControl::queryInterface( const Type& rType ) { - // Ask for my own supported interfaces ... - // Attention: XTypeProvider and XInterface are supported by WeakComponentImplHelper! - Any aReturn ( ::cppu::queryInterface( rType , - static_cast< XControlModel* > ( this ) , - static_cast< XConnectionPointContainer* > ( this ) - ) - ); - + Any aReturn = OPropertySetHelper::queryInterface(rType); if (aReturn.hasValue()) return aReturn; - - // If searched interface not supported by this class ... - // ... ask baseclasses. - aReturn = OPropertySetHelper::queryInterface(rType); - if (aReturn.hasValue()) - return aReturn; - return BaseControl::queryInterface(rType); + return FrameControl_BASE::queryInterface(rType); } // XInterface @@ -98,7 +86,7 @@ void SAL_CALL FrameControl::acquire() noexcept // Don't use mutex or guard in this method!!! Is a method of XInterface. // Forward to baseclass - BaseControl::acquire(); + FrameControl_BASE::acquire(); } // XInterface @@ -108,20 +96,16 @@ void SAL_CALL FrameControl::release() noexcept // Don't use mutex or guard in this method!!! Is a method of XInterface. // Forward to baseclass - BaseControl::release(); + FrameControl_BASE::release(); } // XTypeProvider Sequence< Type > SAL_CALL FrameControl::getTypes() { - static OTypeCollection ourTypeCollection( - cppu::UnoType::get(), - cppu::UnoType::get(), - cppu::UnoType::get(), - BaseControl::getTypes() ); - - return ourTypeCollection.getTypes(); + static Sequence myTypes = comphelper::concatSequences(FrameControl_BASE::getTypes(), + OPropertySetHelper::getTypes()); + return myTypes; } OUString FrameControl::getImplementationName() diff --git a/UnoControls/source/controls/progressbar.cxx b/UnoControls/source/controls/progressbar.cxx index 85653c1cc1a3..e2425916bbcc 100644 --- a/UnoControls/source/controls/progressbar.cxx +++ b/UnoControls/source/controls/progressbar.cxx @@ -34,7 +34,7 @@ namespace unocontrols { // construct/destruct ProgressBar::ProgressBar( const Reference< XComponentContext >& rxContext ) - : BaseControl ( rxContext ) + : ProgressBar_BASE ( rxContext ) , m_bHorizontal ( PROGRESSBAR_DEFAULT_HORIZONTAL ) , m_aBlockSize ( PROGRESSBAR_DEFAULT_BLOCKDIMENSION ) , m_nForegroundColor ( PROGRESSBAR_DEFAULT_FOREGROUNDCOLOR ) @@ -50,57 +50,6 @@ ProgressBar::~ProgressBar() { } -// XInterface -Any SAL_CALL ProgressBar::queryInterface( const Type& rType ) -{ - // Ask for my own supported interfaces ... - // Attention: XTypeProvider and XInterface are supported by WeakComponentImplHelper! - Any aReturn ( ::cppu::queryInterface( rType , - static_cast< XControlModel* > ( this ) , - static_cast< XProgressBar* > ( this ) - ) - ); - - if (aReturn.hasValue()) - return aReturn; - - // If searched interface not supported by this class ... - // ... ask baseclasses. - return BaseControl::queryInterface(rType); -} - -// XInterface -void SAL_CALL ProgressBar::acquire() noexcept -{ - // Attention: - // Don't use mutex or guard in this method!!! Is a method of XInterface. - - // Forward to baseclass - BaseControl::acquire(); -} - -// XInterface -void SAL_CALL ProgressBar::release() noexcept -{ - // Attention: - // Don't use mutex or guard in this method!!! Is a method of XInterface. - - // Forward to baseclass - BaseControl::release(); -} - -// XTypeProvider - -Sequence< Type > SAL_CALL ProgressBar::getTypes() -{ - static OTypeCollection ourTypeCollection( - cppu::UnoType::get(), - cppu::UnoType::get(), - BaseControl::getTypes() ); - - return ourTypeCollection.getTypes(); -} - // XProgressBar void SAL_CALL ProgressBar::setForegroundColor( sal_Int32 nColor ) diff --git a/UnoControls/source/inc/framecontrol.hxx b/UnoControls/source/inc/framecontrol.hxx index 514e7cd79994..f8b5cd423582 100644 --- a/UnoControls/source/inc/framecontrol.hxx +++ b/UnoControls/source/inc/framecontrol.hxx @@ -31,9 +31,10 @@ namespace unocontrols { class OConnectionPointContainerHelper; } namespace unocontrols { -class FrameControl final : public css::awt::XControlModel - , public css::lang::XConnectionPointContainer - , public BaseControl // This order is necessary for right initialization of m_aMutex! +using FrameControl_BASE = cppu::ImplInheritanceHelper; + +class FrameControl final : public FrameControl_BASE // This order is necessary for right initialization of m_aMutex! , public ::cppu::OBroadcastHelper , public ::cppu::OPropertySetHelper { diff --git a/UnoControls/source/inc/progressbar.hxx b/UnoControls/source/inc/progressbar.hxx index 3c9f5c8bebf1..78104ca3b924 100644 --- a/UnoControls/source/inc/progressbar.hxx +++ b/UnoControls/source/inc/progressbar.hxx @@ -41,9 +41,11 @@ constexpr auto PROGRESSBAR_DEFAULT_BLOCKVALUE = 1; constexpr sal_Int32 PROGRESSBAR_LINECOLOR_BRIGHT = sal_Int32(COL_WHITE); constexpr sal_Int32 PROGRESSBAR_LINECOLOR_SHADOW = sal_Int32(COL_BLACK); -class ProgressBar final : public css::awt::XControlModel - , public css::awt::XProgressBar - , public BaseControl +using ProgressBar_BASE = cppu::ImplInheritanceHelper; + +class ProgressBar final : public ProgressBar_BASE { public: @@ -51,32 +53,6 @@ public: virtual ~ProgressBar() override; - // XInterface - - virtual css::uno::Any SAL_CALL queryInterface( const css::uno::Type& aType ) override; - - /** - @short increment refcount - @seealso XInterface - @seealso release() - @onerror A RuntimeException is thrown. - */ - - virtual void SAL_CALL acquire() noexcept override; - - /** - @short decrement refcount - @seealso XInterface - @seealso acquire() - @onerror A RuntimeException is thrown. - */ - - virtual void SAL_CALL release() noexcept override; - - // XTypeProvider - - virtual css::uno::Sequence< css::uno::Type > SAL_CALL getTypes() override; - // XProgressBar virtual void SAL_CALL setForegroundColor( sal_Int32 nColor ) override; From 8075798b22f2188530f57b8747589923bfd419ef Mon Sep 17 00:00:00 2001 From: Stephan Bergmann Date: Sat, 7 Dec 2024 17:36:22 +0100 Subject: [PATCH 058/133] Fix check for further exotic protocols ...that were added in 59891cd3985469bc44dbd05c9fc704eeb07f0c78 "look at 'embedded' protocols for protocols that support them" Change-Id: I42836d6fd27cd99e39ab07e626053f002a2651f5 Reviewed-on: https://gerrit.libreoffice.org/c/core/+/178047 Tested-by: Jenkins Reviewed-by: Stephan Bergmann --- tools/qa/cppunit/test_urlobj.cxx | 44 ++++++++++++++++++++++++++++++++ tools/source/fsys/urlobj.cxx | 17 +++++++++--- 2 files changed, 58 insertions(+), 3 deletions(-) diff --git a/tools/qa/cppunit/test_urlobj.cxx b/tools/qa/cppunit/test_urlobj.cxx index cf4fa5a03cd2..31347cf4b576 100644 --- a/tools/qa/cppunit/test_urlobj.cxx +++ b/tools/qa/cppunit/test_urlobj.cxx @@ -354,6 +354,49 @@ namespace tools_urlobj } } + void testIsExoticProtocol() { + { + INetURLObject url(u"vnd.sun.star.pkg://slot%3A0"); + CPPUNIT_ASSERT_EQUAL(INetProtocol::VndSunStarPkg, url.GetProtocol()); + CPPUNIT_ASSERT(url.IsExoticProtocol()); + } + { + INetURLObject url(u"vnd.sun.star.pkg://vnd.sun.star.pkg%3A%2F%2Fslot%253A0"); + CPPUNIT_ASSERT_EQUAL(INetProtocol::VndSunStarPkg, url.GetProtocol()); + CPPUNIT_ASSERT(url.IsExoticProtocol()); + } + { + INetURLObject url(u"vnd.sun.star.pkg://http%3A%2F%2Fexample.net"); + CPPUNIT_ASSERT_EQUAL(INetProtocol::VndSunStarPkg, url.GetProtocol()); + CPPUNIT_ASSERT(!url.IsExoticProtocol()); + } + { + INetURLObject url(u"vnd.sun.star.zip://slot%3A0"); + CPPUNIT_ASSERT_EQUAL(INetProtocol::Generic, url.GetProtocol()); + CPPUNIT_ASSERT(url.IsExoticProtocol()); + } + { + INetURLObject url(u"vnd.sun.star.zip://slot%3A0/foo"); + CPPUNIT_ASSERT_EQUAL(INetProtocol::Generic, url.GetProtocol()); + CPPUNIT_ASSERT(url.IsExoticProtocol()); + } + { + INetURLObject url(u"vnd.sun.star.zip://slot%3A0?foo"); + CPPUNIT_ASSERT_EQUAL(INetProtocol::Generic, url.GetProtocol()); + CPPUNIT_ASSERT(url.IsExoticProtocol()); + } + { + INetURLObject url(u"vnd.sun.star.zip://slot%3A0#foo"); + CPPUNIT_ASSERT_EQUAL(INetProtocol::Generic, url.GetProtocol()); + CPPUNIT_ASSERT(url.IsExoticProtocol()); + } + { + INetURLObject url(u"vnd.sun.star.zip://http%3A%2F%2Fexample.net"); + CPPUNIT_ASSERT_EQUAL(INetProtocol::Generic, url.GetProtocol()); + CPPUNIT_ASSERT(!url.IsExoticProtocol()); + } + } + // Change the following lines only, if you add, remove or rename // member functions of the current class, // because these macros are need by auto register mechanism. @@ -371,6 +414,7 @@ namespace tools_urlobj CPPUNIT_TEST( testChangeScheme ); CPPUNIT_TEST( testTd146382 ); CPPUNIT_TEST( testParseSmart ); + CPPUNIT_TEST( testIsExoticProtocol ); CPPUNIT_TEST_SUITE_END( ); }; // class createPool diff --git a/tools/source/fsys/urlobj.cxx b/tools/source/fsys/urlobj.cxx index 7c9b75a0650f..7f6e43cfc322 100644 --- a/tools/source/fsys/urlobj.cxx +++ b/tools/source/fsys/urlobj.cxx @@ -4898,10 +4898,21 @@ bool INetURLObject::IsExoticProtocol() const { return true; } - if (isSchemeEqualTo(u"vnd.sun.star.pkg") || isSchemeEqualTo(u"vnd.sun.star.zip")) + if (m_eScheme == INetProtocol::VndSunStarPkg) { + return INetURLObject(GetHost(INetURLObject::DecodeMechanism::WithCharset)) + .IsExoticProtocol(); + } + if (isSchemeEqualTo(u"vnd.sun.star.zip")) { - OUString sPayloadURL = GetURLPath(INetURLObject::DecodeMechanism::WithCharset); - return sPayloadURL.startsWith(u"//") && INetURLObject(sPayloadURL.subView(2)).IsExoticProtocol(); + OUString sPayloadURL = GetURLPath(INetURLObject::DecodeMechanism::NONE); + if (!sPayloadURL.startsWith(u"//")) { + return false; + } + auto const find = [&sPayloadURL](auto c) { + auto const n = sPayloadURL.indexOf(c, 2); + return n == -1 ? sPayloadURL.getLength() : n; + }; + return INetURLObject(decode(sPayloadURL.subView(2, std::min(find('/'), find('?')) - 2), INetURLObject::DecodeMechanism::WithCharset)).IsExoticProtocol(); } return false; } From a26173266db38a2e9f91c37005097e33bb0e628d Mon Sep 17 00:00:00 2001 From: Mike Kaganski Date: Sat, 7 Dec 2024 18:09:17 +0500 Subject: [PATCH 059/133] Simplify a bit Change-Id: I7ecbf2c1e4b08175dabd29782a40dd2f25fe040c Reviewed-on: https://gerrit.libreoffice.org/c/core/+/178058 Reviewed-by: Mike Kaganski Tested-by: Jenkins --- sc/source/ui/vba/vbaaxistitle.cxx | 2 +- sc/source/ui/vba/vbacharttitle.cxx | 2 +- sc/source/ui/vba/vbaglobals.cxx | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/sc/source/ui/vba/vbaaxistitle.cxx b/sc/source/ui/vba/vbaaxistitle.cxx index c35166cdc56c..7bf277ff5d5b 100644 --- a/sc/source/ui/vba/vbaaxistitle.cxx +++ b/sc/source/ui/vba/vbaaxistitle.cxx @@ -37,7 +37,7 @@ ScVbaAxisTitle::getServiceNames() { static uno::Sequence< OUString > const aServiceNames = comphelper::concatSequences( AxisTitleBase::getServiceNames(), - uno::Sequence { u"ooo.vba.excel.AxisTitle"_ustr } ); + std::initializer_list{ u"ooo.vba.excel.AxisTitle"_ustr } ); return aServiceNames; } diff --git a/sc/source/ui/vba/vbacharttitle.cxx b/sc/source/ui/vba/vbacharttitle.cxx index 93a9acdca82f..4a4e5e7f1563 100644 --- a/sc/source/ui/vba/vbacharttitle.cxx +++ b/sc/source/ui/vba/vbacharttitle.cxx @@ -37,7 +37,7 @@ ScVbaChartTitle::getServiceNames() { static uno::Sequence< OUString > const aServiceNames = comphelper::concatSequences( ChartTitleBase::getServiceNames(), - uno::Sequence< OUString > { u"ooo.vba.excel.Chart"_ustr } ); + std::initializer_list{ u"ooo.vba.excel.Chart"_ustr } ); return aServiceNames; } diff --git a/sc/source/ui/vba/vbaglobals.cxx b/sc/source/ui/vba/vbaglobals.cxx index 9fec0ccba8fd..366496024295 100644 --- a/sc/source/ui/vba/vbaglobals.cxx +++ b/sc/source/ui/vba/vbaglobals.cxx @@ -225,7 +225,7 @@ ScVbaGlobals::getAvailableServiceNames( ) { static const uno::Sequence< OUString > serviceNames = comphelper::concatSequences( ScVbaGlobals_BASE::getAvailableServiceNames(), - uno::Sequence< OUString > + std::initializer_list { u"ooo.vba.excel.Range"_ustr, u"ooo.vba.excel.Workbook"_ustr, From 23ea73587adead7b41e39a9c2cf55d5bb5f8b926 Mon Sep 17 00:00:00 2001 From: Michael Weghorn Date: Sat, 7 Dec 2024 19:53:28 +0100 Subject: [PATCH 060/133] tdf#130857 qt weld: Implement QtInstanceTreeView::set_text For now, require that the actual column index is passed. The weld::TreeView::set_text doc mentions // col index -1 sets the first text column , but that is not supported yet, so assert a different index is passed for now. Revisit when implementing support for a dialog that actually makes use of this. Change-Id: I8ba6e965ba22542bf3151548200b92c8c6b085d9 Reviewed-on: https://gerrit.libreoffice.org/c/core/+/178061 Tested-by: Jenkins Reviewed-by: Michael Weghorn --- vcl/inc/qt5/QtInstanceTreeView.hxx | 2 +- vcl/qt5/QtInstanceTreeView.cxx | 15 +++++++++++++-- 2 files changed, 14 insertions(+), 3 deletions(-) diff --git a/vcl/inc/qt5/QtInstanceTreeView.hxx b/vcl/inc/qt5/QtInstanceTreeView.hxx index 15fab0ff0792..110bc09c8bd2 100644 --- a/vcl/inc/qt5/QtInstanceTreeView.hxx +++ b/vcl/inc/qt5/QtInstanceTreeView.hxx @@ -44,7 +44,7 @@ public: virtual void unselect(int nPos) override; virtual void remove(int pos) override; virtual OUString get_text(int nRow, int nCol = -1) const override; - virtual void set_text(int row, const OUString& rText, int col = -1) override; + virtual void set_text(int nRow, const OUString& rText, int nCol = -1) override; virtual void set_sensitive(int row, bool bSensitive, int col = -1) override; virtual bool get_sensitive(int row, int col) const override; virtual void set_id(int row, const OUString& rId) override; diff --git a/vcl/qt5/QtInstanceTreeView.cxx b/vcl/qt5/QtInstanceTreeView.cxx index e2d28af9932c..23fe407e8033 100644 --- a/vcl/qt5/QtInstanceTreeView.cxx +++ b/vcl/qt5/QtInstanceTreeView.cxx @@ -162,9 +162,20 @@ OUString QtInstanceTreeView::get_text(int nRow, int nCol) const return sText; } -void QtInstanceTreeView::set_text(int, const OUString&, int) +void QtInstanceTreeView::set_text(int nRow, const OUString& rText, int nCol) { - assert(false && "Not implemented yet"); + assert(nCol != -1 && "Support for special index -1 (first text column) not implemented yet"); + + SolarMutexGuard g; + GetQtInstance().RunInMainThread([&] { + QStandardItem* pItem = m_pModel->item(nRow, nCol); + if (!pItem) + { + pItem = new QStandardItem; + m_pModel->setItem(nRow, nCol, pItem); + } + pItem->setText(toQString(rText)); + }); } void QtInstanceTreeView::set_sensitive(int, bool, int) { assert(false && "Not implemented yet"); } From 36ab4833c96bf9568e7fb06880c01729f2c75ece Mon Sep 17 00:00:00 2001 From: Michael Weghorn Date: Sat, 7 Dec 2024 20:02:08 +0100 Subject: [PATCH 061/133] tdf#130857 qt weld: Implement QtInstanceTreeView::columns_autosize QTreeView::resizeColumnToContents [1] looks like the Qt equivalent for GTK's gtk_tree_view_columns_autosize [2]. [1] https://doc.qt.io/qt-6/qtreeview.html#resizeColumnToContents [2] https://docs.gtk.org/gtk3/method.TreeView.columns_autosize.html Change-Id: I4771896fb932834f51fa48ceaa3557181f474fcc Reviewed-on: https://gerrit.libreoffice.org/c/core/+/178062 Tested-by: Jenkins Reviewed-by: Michael Weghorn --- vcl/qt5/QtInstanceTreeView.cxx | 10 +++++++++- 1 file changed, 9 insertions(+), 1 deletion(-) diff --git a/vcl/qt5/QtInstanceTreeView.cxx b/vcl/qt5/QtInstanceTreeView.cxx index 23fe407e8033..d65bcdd4746e 100644 --- a/vcl/qt5/QtInstanceTreeView.cxx +++ b/vcl/qt5/QtInstanceTreeView.cxx @@ -653,7 +653,15 @@ int QtInstanceTreeView::get_height_rows(int) const return 0; } -void QtInstanceTreeView::columns_autosize() { assert(false && "Not implemented yet"); } +void QtInstanceTreeView::columns_autosize() +{ + SolarMutexGuard g; + + GetQtInstance().RunInMainThread([&] { + for (int i = 0; i < m_pModel->columnCount(); i++) + m_pTreeView->resizeColumnToContents(i); + }); +} void QtInstanceTreeView::set_column_fixed_widths(const std::vector&) { From 77f4c8c78aa1b79f1e81d7dac477ed1676e1d5df Mon Sep 17 00:00:00 2001 From: Michael Weghorn Date: Sat, 7 Dec 2024 21:04:49 +0100 Subject: [PATCH 062/133] tdf#130857 qt weld: Set tree view column header title Make the `extractTitle` helper function used by VclBuilder a static method in the BuilderBase base class for reuse by QtBuilder. In QtBuilder::makeObject, when encountering a "GtkTreeViewColumn" object, add a new column to the QTreeView and set the column title in the underlying model using QStandardItemModel::setHeaderData. Return the parent (tree view). (Returning no object would cause WidgetBuilder::handleObject to call WidgetBuilder::insertObject again, and thus result in every column being processed twice, i.e. the double amount of columns would be inserted). Adjust QtInstanceTreeView::clear to no longer call QStandardItemModel::clear [1], as that would not only remove the "actual" items, but also the header items, i.e. the column titles would get lost as well. Remove all rows instead. With this in place, the tree view in Writer's "Tool" -> "XML Filter Settings" dialog has the correct data + title set on open in a WIP branch where support for that dialog is declared in QtInstanceBuilder. (Other aspects in the dialog still need to be addressed however.) [1] https://doc.qt.io/qt-6/qstandarditemmodel.html#clear Change-Id: I59956c007ed73cddb299ad2374afd88199ddc94d Reviewed-on: https://gerrit.libreoffice.org/c/core/+/178063 Tested-by: Jenkins Reviewed-by: Michael Weghorn --- include/vcl/builderbase.hxx | 1 + vcl/qt5/QtBuilder.cxx | 11 ++++++++++- vcl/qt5/QtInstanceTreeView.cxx | 5 ++++- vcl/source/window/builder.cxx | 10 +++++----- 4 files changed, 20 insertions(+), 7 deletions(-) diff --git a/include/vcl/builderbase.hxx b/include/vcl/builderbase.hxx index 04b534b92a4e..573817315f72 100644 --- a/include/vcl/builderbase.hxx +++ b/include/vcl/builderbase.hxx @@ -88,6 +88,7 @@ protected: static bool extractEntry(stringmap& rMap); static OUString extractIconName(stringmap& rMap); static bool extractShowExpanders(stringmap& rMap); + static OUString extractTitle(stringmap& rMap); static OUString extractTooltipText(stringmap& rMap); static bool extractVisible(stringmap& rMap); void extractClassAndIdAndCustomProperty(xmlreader::XmlReader& reader, OUString& rClass, diff --git a/vcl/qt5/QtBuilder.cxx b/vcl/qt5/QtBuilder.cxx index 89c8a36d2573..e282ce872790 100644 --- a/vcl/qt5/QtBuilder.cxx +++ b/vcl/qt5/QtBuilder.cxx @@ -296,7 +296,16 @@ QObject* QtBuilder::makeObject(QObject* pParent, std::u16string_view sName, std: } else if (sName == u"GtkTreeViewColumn") { - SAL_WARN("vcl.qt", "GtkTreeViewColumn properties not evaluated yet"); + QTreeView* pTreeView = qobject_cast(pParentWidget); + assert(pTreeView && "Tree view column doesn't have a tree view parent"); + QStandardItemModel* pModel = qobject_cast(pTreeView->model()); + assert(pModel && "Tree view doesn't have QStandardItemModel set"); + const int nCol = pModel->columnCount(); + pModel->insertColumn(nCol); + pModel->setHeaderData(nCol, Qt::Horizontal, toQString(extractTitle(rMap))); + + // nothing else to do, return tree view parent for the widget + return pTreeView; } else { diff --git a/vcl/qt5/QtInstanceTreeView.cxx b/vcl/qt5/QtInstanceTreeView.cxx index d65bcdd4746e..10fb36413f6f 100644 --- a/vcl/qt5/QtInstanceTreeView.cxx +++ b/vcl/qt5/QtInstanceTreeView.cxx @@ -644,7 +644,10 @@ void QtInstanceTreeView::clear() { SolarMutexGuard g; - GetQtInstance().RunInMainThread([&] { m_pModel->clear(); }); + GetQtInstance().RunInMainThread([&] { + // don't use QStandardItemModel::clear, as that would remove header data as well + m_pModel->removeRows(0, m_pModel->rowCount()); + }); } int QtInstanceTreeView::get_height_rows(int) const diff --git a/vcl/source/window/builder.cxx b/vcl/source/window/builder.cxx index 74a4aa479b0e..66924872b649 100644 --- a/vcl/source/window/builder.cxx +++ b/vcl/source/window/builder.cxx @@ -1007,11 +1007,6 @@ namespace return f; } - OUString extractTitle(VclBuilder::stringmap &rMap) - { - return extractStringEntry(rMap, u"title"_ustr); - } - bool extractSortIndicator(VclBuilder::stringmap &rMap) { return extractBoolEntry(rMap, u"sort-indicator"_ustr, false); @@ -3411,6 +3406,11 @@ bool BuilderBase::extractShowExpanders(VclBuilder::stringmap& rMap) return extractBoolEntry(rMap, u"show-expanders"_ustr, true); } +OUString BuilderBase::extractTitle(VclBuilder::stringmap &rMap) +{ + return extractStringEntry(rMap, u"title"_ustr); +} + OUString BuilderBase::extractTooltipText(stringmap& rMap) { OUString sTooltipText; From 4d91b67e1f0dbd73ee594c6539d08a6ebc935b7e Mon Sep 17 00:00:00 2001 From: Michael Weghorn Date: Sat, 7 Dec 2024 22:08:14 +0100 Subject: [PATCH 063/133] tdf#130857 qt weld: Evaluate button box orientation Set orientation to vertical if that's specified in the .ui file instead of using the default of horizontal. This is used by the button box on the right hand side of the "Tools" -> "XML Filter Settings" dialog. Change-Id: I64460037649dcd24897c7a5d7148430836702edc Reviewed-on: https://gerrit.libreoffice.org/c/core/+/178064 Reviewed-by: Michael Weghorn Tested-by: Jenkins --- vcl/qt5/QtBuilder.cxx | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/vcl/qt5/QtBuilder.cxx b/vcl/qt5/QtBuilder.cxx index e282ce872790..95a27a2ec162 100644 --- a/vcl/qt5/QtBuilder.cxx +++ b/vcl/qt5/QtBuilder.cxx @@ -164,7 +164,10 @@ QObject* QtBuilder::makeObject(QObject* pParent, std::u16string_view sName, std: } else { - pObject = new QDialogButtonBox(pParentWidget); + QDialogButtonBox* pButtonBox = new QDialogButtonBox(pParentWidget); + if (hasOrientationVertical(rMap)) + pButtonBox->setOrientation(Qt::Vertical); + pObject = pButtonBox; } } else if (sName == u"GtkButton") From c91edf5e57a7441fbac399c7a44f26a57878e5be Mon Sep 17 00:00:00 2001 From: Mike Kaganski Date: Sun, 8 Dec 2024 11:13:22 +0500 Subject: [PATCH 064/133] SvtRemoteFilePicker doesn't extend SvtFilePicker's interface list Change-Id: Iad25fa30a550494ba5a27d30f703ee6748fd338c Reviewed-on: https://gerrit.libreoffice.org/c/core/+/178071 Reviewed-by: Mike Kaganski Tested-by: Jenkins --- fpicker/source/office/OfficeFilePicker.cxx | 15 --------------- fpicker/source/office/OfficeFilePicker.hxx | 8 -------- 2 files changed, 23 deletions(-) diff --git a/fpicker/source/office/OfficeFilePicker.cxx b/fpicker/source/office/OfficeFilePicker.cxx index cdb28d34364c..956915e6cebc 100644 --- a/fpicker/source/office/OfficeFilePicker.cxx +++ b/fpicker/source/office/OfficeFilePicker.cxx @@ -458,21 +458,6 @@ IMPLEMENT_FORWARD_XINTERFACE2( SvtFilePicker, OCommonPicker, SvtFilePicker_Base IMPLEMENT_FORWARD_XTYPEPROVIDER2( SvtFilePicker, OCommonPicker, SvtFilePicker_Base ) -IMPLEMENT_FORWARD_XINTERFACE3( SvtRemoteFilePicker, SvtFilePicker, OCommonPicker, SvtFilePicker_Base ) - - -// disambiguate XTypeProvider - -css::uno::Sequence< css::uno::Type > SAL_CALL SvtRemoteFilePicker::getTypes( ) -{ - return ::comphelper::concatSequences( - SvtFilePicker::getTypes(), - OCommonPicker::getTypes(), - SvtFilePicker_Base::getTypes() - ); -} -IMPLEMENT_GET_IMPLEMENTATION_ID( SvtRemoteFilePicker ) - // XExecutableDialog functions diff --git a/fpicker/source/office/OfficeFilePicker.hxx b/fpicker/source/office/OfficeFilePicker.hxx index b75a3f6368db..48f2ef076625 100644 --- a/fpicker/source/office/OfficeFilePicker.hxx +++ b/fpicker/source/office/OfficeFilePicker.hxx @@ -221,14 +221,6 @@ public: virtual std::shared_ptr implCreateDialog( weld::Window* pParent ) override; - // disambiguate XInterface - - DECLARE_XINTERFACE( ) - - // disambiguate XTypeProvider - - DECLARE_XTYPEPROVIDER( ) - /* XServiceInfo */ virtual OUString SAL_CALL getImplementationName() override; virtual sal_Bool SAL_CALL supportsService( const OUString& sServiceName ) override; From 9c334767305ec0b24bdf05f3eb3df1fa41aa330c Mon Sep 17 00:00:00 2001 From: Michael Weghorn Date: Sat, 7 Dec 2024 23:02:08 +0100 Subject: [PATCH 065/133] tdf#130857 qt weld: Fix incorrect param order for row/col In QtInstanceTreeView::get_id, the nPos param is the row number, but was incorrectly passed as the second parameter to QStandardItemModel::index [1] which is for the column. Swap the params to fix that. Passing incorrectly would trigger a crash in a WIP branch for Writer's "Tools" -> "XML Filter Settings" dialog when clicking on the second row, as the ID data is only set for the item in the first, not the second column, so `pInfo` in XMLFilterSettingsDialog::updateStates would be null. Backtrace: 1 XMLFilterSettingsDialog::updateStates xmlfiltersettingsdialog.cxx 183 0x7f3eb862194e 2 XMLFilterSettingsDialog::SelectionChangedHdl_Impl xmlfiltersettingsdialog.cxx 153 0x7f3eb8621859 3 XMLFilterSettingsDialog::LinkStubSelectionChangedHdl_Impl xmlfiltersettingsdialog.cxx 151 0x7f3eb861e8cd 4 Link::Call link.hxx 111 0x7f3eeb997aa1 5 weld::TreeView::signal_selection_changed weld.hxx 989 0x7f3eeb99733c 6 QtInstanceTreeView::handleSelectionChanged QtInstanceTreeView.cxx 781 0x7f3eeb98cb2d 7 QtPrivate::FunctorCall, QtPrivate::List<>, void, void (QtInstanceTreeView:: *)()>::call(void (QtInstanceTreeView:: *)(), QtInstanceTreeView *, void * *)::{lambda()#1}::operator()() const qobjectdefs_impl.h 127 0x7f3eeb998141 8 QtPrivate::FunctorCallBase::call_internal, QtPrivate::List<>, void, void (QtInstanceTreeView:: *)()>::call(void (QtInstanceTreeView:: *)(), QtInstanceTreeView *, void * *)::{lambda()#1}>(void * *, QtPrivate::FunctorCall, QtPrivate::List<>, void, void (QtInstanceTreeView:: *)()>::call(void (QtInstanceTreeView:: *)(), QtInstanceTreeView *, void * *)::{lambda()#1}&&) qobjectdefs_impl.h 65 0x7f3eeb998079 9 QtPrivate::FunctorCall, QtPrivate::List<>, void, void (QtInstanceTreeView:: *)()>::call(void (QtInstanceTreeView:: *)(), QtInstanceTreeView *, void * *) qobjectdefs_impl.h 126 0x7f3eeb997fab 10 QtPrivate::FunctionPointer::call, void>(void (QtInstanceTreeView:: *)(), QtInstanceTreeView *, void * *) qobjectdefs_impl.h 174 0x7f3eeb997f2d 11 QtPrivate::QCallableObject, void>::impl(int, QtPrivate::QSlotObjectBase *, QObject *, void * *, bool *) qobjectdefs_impl.h 545 0x7f3eeb997e56 12 QtPrivate::QSlotObjectBase::call qobjectdefs_impl.h 461 0x7f3eeaa5ce22 13 doActivate qobject.cpp 4139 0x7f3eeab1c644 14 QMetaObject::activate qobject.cpp 4199 0x7f3eeab121b3 15 QMetaObject::activate qobjectdefs.h 306 0x7f3eeaf93da5 16 QItemSelectionModel::selectionChanged moc_qitemselectionmodel.cpp 390 0x7f3eeaf85b76 17 QItemSelectionModel::emitSelectionChanged qitemselectionmodel.cpp 2029 0x7f3eeaf87a2f 18 QItemSelectionModel::select qitemselectionmodel.cpp 1372 0x7f3eeaf872f9 19 QTreeViewPrivate::select qtreeview.cpp 4016 0x7f3ee906f2ec 20 QTreeView::setSelection qtreeview.cpp 2393 0x7f3ee906eaae ... Change-Id: Icf6b3004ab95991da69c0ff86201421d620aaa43 Reviewed-on: https://gerrit.libreoffice.org/c/core/+/178066 Reviewed-by: Michael Weghorn Tested-by: Jenkins --- vcl/qt5/QtInstanceTreeView.cxx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/vcl/qt5/QtInstanceTreeView.cxx b/vcl/qt5/QtInstanceTreeView.cxx index 10fb36413f6f..8e26055cf1f9 100644 --- a/vcl/qt5/QtInstanceTreeView.cxx +++ b/vcl/qt5/QtInstanceTreeView.cxx @@ -301,7 +301,7 @@ OUString QtInstanceTreeView::get_id(int nPos) const OUString sId; GetQtInstance().RunInMainThread([&] { - QVariant aRoleData = m_pModel->data(m_pModel->index(0, nPos), ROLE_ID); + QVariant aRoleData = m_pModel->data(m_pModel->index(nPos, 0), ROLE_ID); if (aRoleData.canConvert()) sId = toOUString(aRoleData.toString()); }); From 044f2113dc3f5e76fa3b56e57823c9c9b7f390b6 Mon Sep 17 00:00:00 2001 From: Michael Weghorn Date: Sat, 7 Dec 2024 23:13:25 +0100 Subject: [PATCH 066/133] tdf#130857 qt weld: Report selected tree view row only once Now that support for multiple columns has been implemented in QtInstanceTreeView, iterating over all selected model indices and appending their row index to the vector results in the row being appended once fore each column of the selected row. (Index seen twice in `aRows` in XMLFilterSettingsDialog::updateStates while debugging another issue in the "Tools" > "XML Filter Settings" dialog with the qt6 VCL plugin and SAL_VCL_QT_USE_WELDED_WIDGETS=1). Use QItemSelectionModel::selectedRows (with the default column index of 0) instead of QItemSelectionModel::selectedIndexes to prevent that. Change-Id: Ic8caa299549d954ed844c39c4b2ba957edf2b404 Reviewed-on: https://gerrit.libreoffice.org/c/core/+/178067 Tested-by: Jenkins Reviewed-by: Michael Weghorn --- vcl/qt5/QtInstanceTreeView.cxx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/vcl/qt5/QtInstanceTreeView.cxx b/vcl/qt5/QtInstanceTreeView.cxx index 8e26055cf1f9..34bf6dee0c13 100644 --- a/vcl/qt5/QtInstanceTreeView.cxx +++ b/vcl/qt5/QtInstanceTreeView.cxx @@ -236,7 +236,7 @@ std::vector QtInstanceTreeView::get_selected_rows() const std::vector aSelectedRows; GetQtInstance().RunInMainThread([&] { - const QModelIndexList aSelectionIndexes = m_pSelectionModel->selection().indexes(); + const QModelIndexList aSelectionIndexes = m_pSelectionModel->selectedRows(); for (const QModelIndex& aIndex : aSelectionIndexes) aSelectedRows.push_back(aIndex.row()); }); From 254743e93f67fb6d623b659b33a8c78387f23a1a Mon Sep 17 00:00:00 2001 From: Michael Weghorn Date: Sat, 7 Dec 2024 23:29:44 +0100 Subject: [PATCH 067/133] tdf#130857 qt weld: Implement QtInstanceTreeView::remove Side note: In Writer's "Tool" > "XML Filter Settings" dialog, trying to always delete the first entry works 3 times (when using a fresh profile), but doing it again after then doesn't remove the entry from the treeview, but the entry is still gone when closing and reopening the dialog. That's the same with gtk3 however, weld::TreeView::remove doesn't get called. So it's not a problem in the weld::TreeView implementations, but probably in XMLFilterSettingsDialog or some other underlying logic. Change-Id: Ic91b3d1d62b66574b9e0710b17b2d9606d27a0fb Reviewed-on: https://gerrit.libreoffice.org/c/core/+/178068 Reviewed-by: Michael Weghorn Tested-by: Jenkins --- vcl/inc/qt5/QtInstanceTreeView.hxx | 2 +- vcl/qt5/QtInstanceTreeView.cxx | 7 ++++++- 2 files changed, 7 insertions(+), 2 deletions(-) diff --git a/vcl/inc/qt5/QtInstanceTreeView.hxx b/vcl/inc/qt5/QtInstanceTreeView.hxx index 110bc09c8bd2..a57734ed9079 100644 --- a/vcl/inc/qt5/QtInstanceTreeView.hxx +++ b/vcl/inc/qt5/QtInstanceTreeView.hxx @@ -42,7 +42,7 @@ public: virtual int get_selected_index() const override; virtual void select(int nPos) override; virtual void unselect(int nPos) override; - virtual void remove(int pos) override; + virtual void remove(int nPos) override; virtual OUString get_text(int nRow, int nCol = -1) const override; virtual void set_text(int nRow, const OUString& rText, int nCol = -1) override; virtual void set_sensitive(int row, bool bSensitive, int col = -1) override; diff --git a/vcl/qt5/QtInstanceTreeView.cxx b/vcl/qt5/QtInstanceTreeView.cxx index 34bf6dee0c13..613987c44a80 100644 --- a/vcl/qt5/QtInstanceTreeView.cxx +++ b/vcl/qt5/QtInstanceTreeView.cxx @@ -142,7 +142,12 @@ void QtInstanceTreeView::unselect(int nPos) }); } -void QtInstanceTreeView::remove(int) { assert(false && "Not implemented yet"); } +void QtInstanceTreeView::remove(int nPos) +{ + SolarMutexGuard g; + + GetQtInstance().RunInMainThread([&] { m_pModel->removeRow(nPos); }); +} OUString QtInstanceTreeView::get_text(int nRow, int nCol) const { From aad48b06e7262cfa3979ade40b85819b506cb78e Mon Sep 17 00:00:00 2001 From: Michael Weghorn Date: Sun, 8 Dec 2024 00:51:02 +0100 Subject: [PATCH 068/133] tdf#130857 qt weld: Add tree view iter and implement some methods Add a new QtInstanceTreeIter struct as the weld::TreeIter implementaton for QtInstanceTreeView. It uses the QModelIndex of the item it points to. Add QtInstanceTreeView::modelIndex helper methods to convert both, an int row index and a QtInstanceTreeIter to a QModelIndex. This can be used to deduplicate code when (re)implementing the methods that have two variants that either take an int row index or a TreeIter input param. For QtInstanceTreeView::get_id, add a new variant that takes a QModelIndex and move the existing logic from the implementation for the int param there and reuse it to implemetnat the variant taking a TreeIter param as well. Implement a few more methods taking or returning a weld::TreeIter. Change-Id: I0508ad14a43214faccc6a3cba208400031bb231c Reviewed-on: https://gerrit.libreoffice.org/c/core/+/178069 Tested-by: Jenkins Reviewed-by: Michael Weghorn --- vcl/inc/qt5/QtInstanceTreeView.hxx | 3 ++ vcl/qt5/QtInstanceTreeView.cxx | 85 +++++++++++++++++++++--------- 2 files changed, 64 insertions(+), 24 deletions(-) diff --git a/vcl/inc/qt5/QtInstanceTreeView.hxx b/vcl/inc/qt5/QtInstanceTreeView.hxx index a57734ed9079..1e8ebbec2d21 100644 --- a/vcl/inc/qt5/QtInstanceTreeView.hxx +++ b/vcl/inc/qt5/QtInstanceTreeView.hxx @@ -185,6 +185,9 @@ public: using QtInstanceWidget::get_sensitive; private: + QModelIndex modelIndex(int nPos) const; + static QModelIndex modelIndex(const weld::TreeIter& rIter); + OUString get_id(const QModelIndex& rModelIndex) const; static QAbstractItemView::SelectionMode mapSelectionMode(SelectionMode eMode); private Q_SLOTS: diff --git a/vcl/qt5/QtInstanceTreeView.cxx b/vcl/qt5/QtInstanceTreeView.cxx index 613987c44a80..581ad70c37df 100644 --- a/vcl/qt5/QtInstanceTreeView.cxx +++ b/vcl/qt5/QtInstanceTreeView.cxx @@ -15,6 +15,24 @@ // role used for the ID in the QStandardItem constexpr int ROLE_ID = Qt::UserRole + 1000; +namespace +{ +struct QtInstanceTreeIter final : public weld::TreeIter +{ + QModelIndex m_aModelIndex; + + explicit QtInstanceTreeIter(QModelIndex aModelIndex) + : m_aModelIndex(aModelIndex) + { + } + + virtual bool equal(const TreeIter& rOther) const override + { + return m_aModelIndex == static_cast(rOther).m_aModelIndex; + } +}; +}; + QtInstanceTreeView::QtInstanceTreeView(QTreeView* pTreeView) : QtInstanceWidget(pTreeView) , m_pTreeView(pTreeView) @@ -300,19 +318,7 @@ int QtInstanceTreeView::find_text(const OUString& rText) const return nIndex; } -OUString QtInstanceTreeView::get_id(int nPos) const -{ - SolarMutexGuard g; - - OUString sId; - GetQtInstance().RunInMainThread([&] { - QVariant aRoleData = m_pModel->data(m_pModel->index(nPos, 0), ROLE_ID); - if (aRoleData.canConvert()) - sId = toOUString(aRoleData.toString()); - }); - - return sId; -} +OUString QtInstanceTreeView::get_id(int nPos) const { return get_id(modelIndex(nPos)); } int QtInstanceTreeView::find_id(const OUString& rId) const { @@ -333,21 +339,32 @@ int QtInstanceTreeView::find_id(const OUString& rId) const return nIndex; } -std::unique_ptr QtInstanceTreeView::make_iterator(const weld::TreeIter*) const +std::unique_ptr QtInstanceTreeView::make_iterator(const weld::TreeIter* pOrig) const { - assert(false && "Not implemented yet"); - return nullptr; + const QModelIndex aIndex = pOrig ? modelIndex(*pOrig) : QModelIndex(); + return std::make_unique(aIndex); } -void QtInstanceTreeView::copy_iterator(const weld::TreeIter&, weld::TreeIter&) const +void QtInstanceTreeView::copy_iterator(const weld::TreeIter& rSource, weld::TreeIter& rDest) const { - assert(false && "Not implemented yet"); + static_cast(rDest).m_aModelIndex = modelIndex(rSource); } -bool QtInstanceTreeView::get_selected(weld::TreeIter*) const +bool QtInstanceTreeView::get_selected(weld::TreeIter* pIter) const { - assert(false && "Not implemented yet"); - return false; + SolarMutexGuard g; + + bool bHasSelection = false; + GetQtInstance().RunInMainThread([&] { + const QModelIndexList aSelectedIndexes = m_pSelectionModel->selectedIndexes(); + if (aSelectedIndexes.empty()) + return; + + bHasSelection = true; + if (pIter) + static_cast(pIter)->m_aModelIndex = aSelectedIndexes.first(); + }); + return bHasSelection; } bool QtInstanceTreeView::get_cursor(weld::TreeIter*) const @@ -498,10 +515,9 @@ void QtInstanceTreeView::set_id(const weld::TreeIter&, const OUString&) assert(false && "Not implemented yet"); } -OUString QtInstanceTreeView::get_id(const weld::TreeIter&) const +OUString QtInstanceTreeView::get_id(const weld::TreeIter& rIter) const { - assert(false && "Not implemented yet"); - return OUString(); + return get_id(modelIndex(rIter)); } void QtInstanceTreeView::set_image(const weld::TreeIter&, const OUString&, int) @@ -774,6 +790,27 @@ QAbstractItemView::SelectionMode QtInstanceTreeView::mapSelectionMode(SelectionM } } +QModelIndex QtInstanceTreeView::modelIndex(int nPos) const { return m_pModel->index(nPos, 0); } + +QModelIndex QtInstanceTreeView::modelIndex(const weld::TreeIter& rIter) +{ + return static_cast(rIter).m_aModelIndex; +} + +OUString QtInstanceTreeView::get_id(const QModelIndex& rModelIndex) const +{ + SolarMutexGuard g; + + OUString sId; + GetQtInstance().RunInMainThread([&] { + QVariant aRoleData = m_pModel->data(rModelIndex, ROLE_ID); + if (aRoleData.canConvert()) + sId = toOUString(aRoleData.toString()); + }); + + return sId; +} + void QtInstanceTreeView::handleActivated() { SolarMutexGuard g; From 495e38c85396f9116d8f2831fc925404bf933905 Mon Sep 17 00:00:00 2001 From: Michael Weghorn Date: Sun, 8 Dec 2024 01:17:53 +0100 Subject: [PATCH 069/133] tdf#130857 qt weld: Implement QtInstanceTreeView::selected_foreach This gets used in the "Tools" -> "XML Filter Settings" dialog in Writer when selecting multiple rows in the tree view, then clicking the "Save as Package" button. The result with SAL_VCL_QT_USE_WELDED_WIDGETS=1 and the qt6 VCL plugin in XMLFilterSettingsDialog::onSave looks as expected with this change in place (variables `aFilters` and `nFilters` contain the selected filters and total count of these when observed with a breakpoint after the call to `m_xFilterListBox->selected_foreach`). The method still triggers an assert later in a WIP branch where support for that dialog is declared, because `QtInstanceWindow::GetXWindow` is called, but not implemented yet. Change-Id: Iab47f391106132b5a6ee03fd2ad1902d493c0999 Reviewed-on: https://gerrit.libreoffice.org/c/core/+/178070 Tested-by: Jenkins Reviewed-by: Michael Weghorn --- vcl/qt5/QtInstanceTreeView.cxx | 14 ++++++++++++-- 1 file changed, 12 insertions(+), 2 deletions(-) diff --git a/vcl/qt5/QtInstanceTreeView.cxx b/vcl/qt5/QtInstanceTreeView.cxx index 581ad70c37df..6223377e2be9 100644 --- a/vcl/qt5/QtInstanceTreeView.cxx +++ b/vcl/qt5/QtInstanceTreeView.cxx @@ -562,9 +562,19 @@ void QtInstanceTreeView::all_foreach(const std::function& assert(false && "Not implemented yet"); } -void QtInstanceTreeView::selected_foreach(const std::function&) +void QtInstanceTreeView::selected_foreach(const std::function& func) { - assert(false && "Not implemented yet"); + SolarMutexGuard g; + + GetQtInstance().RunInMainThread([&] { + QModelIndexList aSelectionIndexes = m_pSelectionModel->selectedRows(); + for (QModelIndex& aIndex : aSelectionIndexes) + { + QtInstanceTreeIter aIter(aIndex); + if (func(aIter)) + return; + } + }); } void QtInstanceTreeView::visible_foreach(const std::function&) From c4dee829f397a7ad1fe195e8f3a6f849dac459d7 Mon Sep 17 00:00:00 2001 From: Mike Kaganski Date: Sun, 8 Dec 2024 11:41:03 +0500 Subject: [PATCH 070/133] Simplify SvtFilePicker Change-Id: I2b6d1589c25cb1fa4711f088641afe1bfe1d7411 Reviewed-on: https://gerrit.libreoffice.org/c/core/+/178072 Tested-by: Jenkins Reviewed-by: Mike Kaganski --- fpicker/source/office/OfficeFilePicker.cxx | 10 ---------- fpicker/source/office/OfficeFilePicker.hxx | 14 ++------------ 2 files changed, 2 insertions(+), 22 deletions(-) diff --git a/fpicker/source/office/OfficeFilePicker.cxx b/fpicker/source/office/OfficeFilePicker.cxx index 956915e6cebc..6d845f3fd0c3 100644 --- a/fpicker/source/office/OfficeFilePicker.cxx +++ b/fpicker/source/office/OfficeFilePicker.cxx @@ -449,16 +449,6 @@ std::shared_ptr SvtFilePicker::implCreateDialog( weld::Windo } -// disambiguate XInterface - -IMPLEMENT_FORWARD_XINTERFACE2( SvtFilePicker, OCommonPicker, SvtFilePicker_Base ) - - -// disambiguate XTypeProvider - -IMPLEMENT_FORWARD_XTYPEPROVIDER2( SvtFilePicker, OCommonPicker, SvtFilePicker_Base ) - - // XExecutableDialog functions diff --git a/fpicker/source/office/OfficeFilePicker.hxx b/fpicker/source/office/OfficeFilePicker.hxx index 48f2ef076625..33e2b6d16e7c 100644 --- a/fpicker/source/office/OfficeFilePicker.hxx +++ b/fpicker/source/office/OfficeFilePicker.hxx @@ -46,7 +46,8 @@ typedef css::uno::Sequence< UnoFilterEntry > UnoFilterList; // can be transpo // class SvtFilePicker --------------------------------------------------- -typedef ::cppu::ImplHelper5 < css::ui::dialogs::XFilePicker3 +typedef cppu::ImplInheritanceHelper SvtFilePicker_Base; class SvtFilePicker :public SvtFilePicker_Base - ,public ::svt::OCommonPicker ,public ::svt::IFilePickerListener { protected: @@ -85,16 +85,6 @@ public: virtual ~SvtFilePicker() override; - // disambiguate XInterface - - DECLARE_XINTERFACE( ) - - - // disambiguate XTypeProvider - - DECLARE_XTYPEPROVIDER( ) - - // XExecutableDialog functions virtual void SAL_CALL setTitle( const OUString& _rTitle ) override; From 813f34d6726584368641f2e93fdaf79ff387d6b8 Mon Sep 17 00:00:00 2001 From: Andreas Heinisch Date: Thu, 5 Dec 2024 10:24:32 +0100 Subject: [PATCH 071/133] tdf#79298 - FORMATTING: Copy/paste: import strikethrough attribute Change-Id: I0539e87f2a87f869e234ed7c944b9da6bd0e82bf Reviewed-on: https://gerrit.libreoffice.org/c/core/+/177847 Reviewed-by: Andreas Heinisch Tested-by: Jenkins --- .../data/tdf79298_strikeout_variants.html | 3 +++ sc/qa/filter/html/html.cxx | 26 +++++++++++++++++++ sc/source/filter/html/htmlpars.cxx | 9 +++++++ sc/source/filter/rtf/eeimpars.cxx | 2 ++ .../data/tdf79298-strikeout-variants.html | 3 +++ sw/qa/extras/htmlimport/htmlimport.cxx | 19 ++++++++++++++ sw/source/filter/html/swhtml.cxx | 2 +- 7 files changed, 63 insertions(+), 1 deletion(-) create mode 100644 sc/qa/filter/html/data/tdf79298_strikeout_variants.html create mode 100644 sw/qa/extras/htmlimport/data/tdf79298-strikeout-variants.html diff --git a/sc/qa/filter/html/data/tdf79298_strikeout_variants.html b/sc/qa/filter/html/data/tdf79298_strikeout_variants.html new file mode 100644 index 000000000000..391ddf095c2b --- /dev/null +++ b/sc/qa/filter/html/data/tdf79298_strikeout_variants.html @@ -0,0 +1,3 @@ +

s

+

strike

+

del

\ No newline at end of file diff --git a/sc/qa/filter/html/html.cxx b/sc/qa/filter/html/html.cxx index c243dea350b0..2f6b9cb249b8 100644 --- a/sc/qa/filter/html/html.cxx +++ b/sc/qa/filter/html/html.cxx @@ -13,6 +13,8 @@ #include #include +#include + #include #include #include @@ -205,6 +207,30 @@ CPPUNIT_TEST_FIXTURE(Test, testPasteSingleCell) CPPUNIT_ASSERT_EQUAL(static_cast(3), pDoc->GetValue(/*col=*/2, /*row=*/0, /*tab=*/0)); } +CPPUNIT_TEST_FIXTURE(Test, testTdf79298_strikeout_variants) +{ + createScDoc(); + + // Paste different strikeout variants into the first cell + ScDocument* pDoc = getScDoc(); + ScAddress aCellPos(/*nColP=*/0, /*nRowP=*/0, /*nTabP=*/0); + ScImportExport aImporter(*pDoc, aCellPos); + SvFileStream aFile(createFileURL(u"tdf79298_strikeout_variants.html"), StreamMode::READ); + SvMemoryStream aMemory; + aMemory.WriteStream(aFile); + aMemory.Seek(0); + CPPUNIT_ASSERT(aImporter.ImportStream(aMemory, OUString(), SotClipboardFormatId::HTML)); + + // Verify HTML strikeout tags (, , and ) + for (size_t nCol = 0; nCol < 3; ++nCol) + { + const ScPatternAttr* pAttr = pDoc->GetPattern(ScAddress(0, nCol, 0)); + CPPUNIT_ASSERT_MESSAGE("Failed to get cell attribute.", pAttr); + const SvxCrossedOutItem& rCrossedOutItem = pAttr->GetItem(ATTR_FONT_CROSSEDOUT); + CPPUNIT_ASSERT_EQUAL(FontStrikeout::STRIKEOUT_SINGLE, rCrossedOutItem.GetStrikeout()); + } +} + CPPUNIT_TEST_FIXTURE(Test, testCopyText) { // Given a document with 01 in A1: diff --git a/sc/source/filter/html/htmlpars.cxx b/sc/source/filter/html/htmlpars.cxx index 125d6e98ec80..6c225c3020c8 100644 --- a/sc/source/filter/html/htmlpars.cxx +++ b/sc/source/filter/html/htmlpars.cxx @@ -26,6 +26,7 @@ #include #include +#include #include #include #include @@ -1794,6 +1795,14 @@ void ScHTMLLayoutParser::ProcToken( HtmlImportInfo* pInfo ) } } break; + case HtmlTokenId::STRIKE_ON: + case HtmlTokenId::STRIKETHROUGH_ON: + case HtmlTokenId::DELETEDTEXT_ON: + { + if (IsAtBeginningOfText(pInfo)) + mxActEntry->aItemSet.Put(SvxCrossedOutItem(STRIKEOUT_SINGLE, ATTR_FONT_CROSSEDOUT)); + } + break; case HtmlTokenId::UNDERLINE_ON : { if ( IsAtBeginningOfText( pInfo ) ) diff --git a/sc/source/filter/rtf/eeimpars.cxx b/sc/source/filter/rtf/eeimpars.cxx index 5b6ad74377f9..8b5b5b58dfb9 100644 --- a/sc/source/filter/rtf/eeimpars.cxx +++ b/sc/source/filter/rtf/eeimpars.cxx @@ -246,6 +246,8 @@ void ScEEImport::WriteToDocument( bool bSizeColsRows, double nOutputFactor, SvNu pAttrItemSet->Put( *pItem ); if ( rESet.GetItemState( ATTR_FONT_UNDERLINE, false, &pItem) == SfxItemState::SET ) pAttrItemSet->Put( *pItem ); + if ( rESet.GetItemState( ATTR_FONT_CROSSEDOUT, false, &pItem) == SfxItemState::SET ) + pAttrItemSet->Put( *pItem ); // HTML LATIN/CJK/CTL script type dependent const SfxPoolItem* pFont; if ( rESet.GetItemState( ATTR_FONT, false, &pFont) != SfxItemState::SET ) diff --git a/sw/qa/extras/htmlimport/data/tdf79298-strikeout-variants.html b/sw/qa/extras/htmlimport/data/tdf79298-strikeout-variants.html new file mode 100644 index 000000000000..391ddf095c2b --- /dev/null +++ b/sw/qa/extras/htmlimport/data/tdf79298-strikeout-variants.html @@ -0,0 +1,3 @@ +

s

+

strike

+

del

\ No newline at end of file diff --git a/sw/qa/extras/htmlimport/htmlimport.cxx b/sw/qa/extras/htmlimport/htmlimport.cxx index 43163ce5a39a..746379b6f7b1 100644 --- a/sw/qa/extras/htmlimport/htmlimport.cxx +++ b/sw/qa/extras/htmlimport/htmlimport.cxx @@ -11,6 +11,7 @@ #include #include +#include #include #include #include @@ -376,6 +377,24 @@ CPPUNIT_TEST_FIXTURE(HtmlImportTest, testImageSize) CPPUNIT_ASSERT_EQUAL(static_cast(aExpected.getHeight()), aSize.Height); } +CPPUNIT_TEST_FIXTURE(HtmlImportTest, testTdf79298StrikeoutVariants) +{ + createSwWebDoc("tdf79298-strikeout-variants.html"); + + // Without the accompanying fix in place, this tests would have failed with: + // - Expected: 1 (FontStrikeout::SINGLE) + // - Actual : 0 (FontStrikeout::NONE) + CPPUNIT_ASSERT_EQUAL_MESSAGE( + "Strikeout for missing", sal_Int16(awt::FontStrikeout::SINGLE), + getProperty(getRun(getParagraph(1), 1), u"CharStrikeout"_ustr)); + CPPUNIT_ASSERT_EQUAL_MESSAGE( + "Strikeout for missing", sal_Int16(awt::FontStrikeout::SINGLE), + getProperty(getRun(getParagraph(2), 1), u"CharStrikeout"_ustr)); + CPPUNIT_ASSERT_EQUAL_MESSAGE( + "Strikeout for missing", sal_Int16(awt::FontStrikeout::SINGLE), + getProperty(getRun(getParagraph(3), 1), u"CharStrikeout"_ustr)); +} + CPPUNIT_TEST_FIXTURE(HtmlImportTest, testTdf142781) { // FIXME: the DPI check should be removed when either (1) the test is fixed to work with diff --git a/sw/source/filter/html/swhtml.cxx b/sw/source/filter/html/swhtml.cxx index fb0ed452336f..9488fb0dafff 100644 --- a/sw/source/filter/html/swhtml.cxx +++ b/sw/source/filter/html/swhtml.cxx @@ -1889,6 +1889,7 @@ void SwHTMLParser::NextToken( HtmlTokenId nToken ) case HtmlTokenId::STRIKE_ON: case HtmlTokenId::STRIKETHROUGH_ON: + case HtmlTokenId::DELETEDTEXT_ON: { NewStdAttr( HtmlTokenId::STRIKE_ON, &m_xAttrTab->pStrike, SvxCrossedOutItem(STRIKEOUT_SINGLE, RES_CHRATR_CROSSEDOUT) ); @@ -1974,7 +1975,6 @@ void SwHTMLParser::NextToken( HtmlTokenId nToken ) case HtmlTokenId::ACRONYM_ON: case HtmlTokenId::ABBREVIATION_ON: case HtmlTokenId::INSERTEDTEXT_ON: - case HtmlTokenId::DELETEDTEXT_ON: case HtmlTokenId::TELETYPE_ON: NewCharFormat( nToken ); From 32767d081e10bac317b21cd53b48755837b5b533 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Caol=C3=A1n=20McNamara?= Date: Sat, 7 Dec 2024 14:56:52 +0000 Subject: [PATCH 072/133] cid#1607247 Overflowed constant MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Change-Id: I9648bc8a41a44a98fd8d0d78e889228948e38a34 Reviewed-on: https://gerrit.libreoffice.org/c/core/+/178045 Reviewed-by: Caolán McNamara Tested-by: Jenkins --- sc/source/ui/condformat/condformatdlgdata.cxx | 4 ++-- sc/source/ui/inc/condformatdlg.hxx | 2 +- sc/source/ui/inc/condformatdlgdata.hxx | 6 +++--- sc/source/ui/view/cellsh1.cxx | 2 +- 4 files changed, 7 insertions(+), 7 deletions(-) diff --git a/sc/source/ui/condformat/condformatdlgdata.cxx b/sc/source/ui/condformat/condformatdlgdata.cxx index 89cd51b41abb..024bd8d9bd9a 100644 --- a/sc/source/ui/condformat/condformatdlgdata.cxx +++ b/sc/source/ui/condformat/condformatdlgdata.cxx @@ -14,7 +14,7 @@ #include ScCondFormatDlgData::ScCondFormatDlgData(std::shared_ptr pCondFormats, - sal_Int32 nItem, bool bManaged): + sal_uInt32 nItem, bool bManaged): mpCondFormats(std::move(pCondFormats)), mnItem(nItem), meDialogType(condformat::dialog::CONDITION), @@ -32,7 +32,7 @@ condformat::dialog::ScCondFormatDialogType ScCondFormatDlgData::GetDialogType() return meDialogType; } -sal_Int32 ScCondFormatDlgData::GetIndex() const +sal_uInt32 ScCondFormatDlgData::GetIndex() const { return mnItem; } diff --git a/sc/source/ui/inc/condformatdlg.hxx b/sc/source/ui/inc/condformatdlg.hxx index 1946196b5028..19b2322bdcaa 100644 --- a/sc/source/ui/inc/condformatdlg.hxx +++ b/sc/source/ui/inc/condformatdlg.hxx @@ -78,7 +78,7 @@ public: class ScCondFormatDlg : public ScAnyRefDlgController { private: - sal_Int32 mnKey; + sal_uInt32 mnKey; ScAddress maPos; ScViewData* mpViewData; diff --git a/sc/source/ui/inc/condformatdlgdata.hxx b/sc/source/ui/inc/condformatdlgdata.hxx index bbee525b3bdd..31d42265601c 100644 --- a/sc/source/ui/inc/condformatdlgdata.hxx +++ b/sc/source/ui/inc/condformatdlgdata.hxx @@ -30,7 +30,7 @@ class ScConditionalFormatList; class ScCondFormatDlgData { public: - ScCondFormatDlgData(std::shared_ptr pCondFormats, sal_Int32 nItem, + ScCondFormatDlgData(std::shared_ptr pCondFormats, sal_uInt32 nItem, bool bManaged); ScCondFormatDlgData(ScCondFormatDlgData const&) = default; @@ -38,7 +38,7 @@ public: bool IsManaged() const; condformat::dialog::ScCondFormatDialogType GetDialogType() const; - sal_Int32 GetIndex() const; + sal_uInt32 GetIndex() const; void SetDialogType(condformat::dialog::ScCondFormatDialogType eType); @@ -46,7 +46,7 @@ public: private: std::shared_ptr mpCondFormats; - sal_Int32 mnItem; + sal_uInt32 mnItem; condformat::dialog::ScCondFormatDialogType meDialogType; bool mbManaged; }; diff --git a/sc/source/ui/view/cellsh1.cxx b/sc/source/ui/view/cellsh1.cxx index 4b94a67eed1a..99f5075f6b3a 100644 --- a/sc/source/ui/view/cellsh1.cxx +++ b/sc/source/ui/view/cellsh1.cxx @@ -2958,7 +2958,7 @@ void ScCellShell::ExecuteEdit( SfxRequest& rReq ) else if (nRet == DLG_RET_EDIT) { ScConditionalFormat* pFormat = pDlg->GetCondFormatSelected(); - sal_Int32 nIndex = pFormat ? pFormat->GetKey() : -1; + sal_uInt32 nIndex = pFormat ? pFormat->GetKey() : sal_uInt32(-1); // Put the xml string parameter to initialize the // Conditional Format Dialog. ( edit selected conditional format ) pTabViewShell->setScCondFormatDlgItem( From 18399240f2aa976041db1928b1ae9db1a0ad706d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Caol=C3=A1n=20McNamara?= Date: Sat, 7 Dec 2024 14:39:38 +0000 Subject: [PATCH 073/133] cid#1607671 Data race condition MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Change-Id: Id2e87001b77087a072705ba7ffa1a2190220a082 Reviewed-on: https://gerrit.libreoffice.org/c/core/+/178074 Tested-by: Jenkins Reviewed-by: Caolán McNamara --- sw/source/uibase/dbui/dbmgr.cxx | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/sw/source/uibase/dbui/dbmgr.cxx b/sw/source/uibase/dbui/dbmgr.cxx index 757eba8c24c7..022104934d8c 100644 --- a/sw/source/uibase/dbui/dbmgr.cxx +++ b/sw/source/uibase/dbui/dbmgr.cxx @@ -1129,7 +1129,10 @@ bool SwDBManager::MergeMailFiles(SwWrtShell* pSourceShell, if( bMT_EMAIL ) { // Reset internal mail accounting data - m_pImpl->m_xLastMessage.clear(); + { + std::unique_lock aGuard(m_pImpl->m_aAllEmailSendMutex); + m_pImpl->m_xLastMessage.clear(); + } xMailDispatcher.set( new MailDispatcher(rMergeDescriptor.xSmtpServer) ); xMailListener = new MailDispatcherListener_Impl( *this ); From 143e89dbf85b13e1acccb76877d774a7fca1b016 Mon Sep 17 00:00:00 2001 From: Marc Mondesir Date: Wed, 4 Dec 2024 16:57:49 -0800 Subject: [PATCH 074/133] tdf#119745: Fix touchpad scrolling for Slides and Pages panes. Use fractional lines scrolled to calculate distance to scroll view, instead of jumping forward or backward a full page every call based on sign. Also fixes existing bugs: horizontal pane can scroll too far to right; and snapping pane from vertical to horizontal can break scrolling if view partially scrolled. Change-Id: I0ead4710a296aac26f1cf1a0fc48e6ea403271a6 Reviewed-on: https://gerrit.libreoffice.org/c/core/+/177836 Tested-by: Jenkins Reviewed-by: Patrick Luby --- .../controller/SlideSorterController.cxx | 7 +- .../controller/SlsScrollBarManager.cxx | 78 ++++++++++--------- .../inc/controller/SlsScrollBarManager.hxx | 2 +- .../ui/slidesorter/inc/view/SlsLayouter.hxx | 6 ++ sd/source/ui/slidesorter/view/SlsLayouter.cxx | 10 ++- 5 files changed, 61 insertions(+), 42 deletions(-) diff --git a/sd/source/ui/slidesorter/controller/SlideSorterController.cxx b/sd/source/ui/slidesorter/controller/SlideSorterController.cxx index ad1d84bc1564..1589488dd6f8 100644 --- a/sd/source/ui/slidesorter/controller/SlideSorterController.cxx +++ b/sd/source/ui/slidesorter/controller/SlideSorterController.cxx @@ -382,6 +382,9 @@ bool SlideSorterController::Command ( // We do not support zooming with control+mouse wheel. return false; } + // tdf#119745: ScrollLines gives accurate distance scrolled on touchpad. NotchDelta sign + // gives direction. Default is 3 lines at a time, so factor that out. + double scrollDistance = -pData->GetScrollLines() * pData->GetNotchDelta() / 3.0; // Determine whether to scroll horizontally or vertically. This // depends on the orientation of the scroll bar and the // IsHoriz() flag of the event. @@ -390,13 +393,13 @@ bool SlideSorterController::Command ( { GetScrollBarManager().Scroll( ScrollBarManager::Orientation_Vertical, - -pData->GetNotchDelta()); + scrollDistance); } else { GetScrollBarManager().Scroll( ScrollBarManager::Orientation_Horizontal, - -pData->GetNotchDelta()); + scrollDistance); } mrSlideSorter.GetView().UpdatePageUnderMouse(rEvent.GetMousePosPixel()); diff --git a/sd/source/ui/slidesorter/controller/SlsScrollBarManager.cxx b/sd/source/ui/slidesorter/controller/SlsScrollBarManager.cxx index 6ee20c8dd93c..6a0244f41655 100644 --- a/sd/source/ui/slidesorter/controller/SlsScrollBarManager.cxx +++ b/sd/source/ui/slidesorter/controller/SlsScrollBarManager.cxx @@ -516,7 +516,7 @@ IMPL_LINK_NOARG(ScrollBarManager, AutoScrollTimeoutHandler, Timer *, void) void ScrollBarManager::Scroll( const Orientation eOrientation, - const sal_Int32 nDistance) + const double nDistance) { bool bIsVertical (false); switch (eOrientation) @@ -528,51 +528,53 @@ void ScrollBarManager::Scroll( return; } - Point aNewTopLeft ( - mpHorizontalScrollBar ? mpHorizontalScrollBar->GetThumbPos() : 0, - mpVerticalScrollBar ? mpVerticalScrollBar->GetThumbPos() : 0); + // Get current scrolling view position + // Fix bug where 1) scrolling view is partially scrolled, 2) view window is snapped from vertical + // to horizontal or vice-versa, then 3) mouse wheel scrolled. Scrolling broke because we got an + // invalid starting position from the scrollbar that's no longer displayed. Check scrollbars + // visible before getting position from each. + bool bHorizontalScrollShown = mpHorizontalScrollBar && mpHorizontalScrollBar->IsVisible(); + bool bVerticalScrollShown = mpVerticalScrollBar && mpVerticalScrollBar->IsVisible(); + Point aNewTopLeft( + bHorizontalScrollShown ? mpHorizontalScrollBar->GetThumbPos() : 0, + bVerticalScrollShown ? mpVerticalScrollBar->GetThumbPos() : 0); view::Layouter& rLayouter (mrSlideSorter.GetView().GetLayouter()); - // Calculate estimate of new location. + // Calculate new location + Size objectSize( rLayouter.GetPageObjectSize() ); // Size of a page in pane + Size objectAndGapSize = view::Layouter::AddGap(objectSize); // Add gap between pages to size if (bIsVertical) - aNewTopLeft.AdjustY(nDistance * rLayouter.GetPageObjectSize().Height() ); + aNewTopLeft.AdjustY(nDistance * objectAndGapSize.Height() ); // New position else - aNewTopLeft.AdjustX(nDistance * rLayouter.GetPageObjectSize().Width() ); + aNewTopLeft.AdjustX(nDistance * objectAndGapSize.Width() ); // New position - // Adapt location to show whole slides. + // Get displayable area for pages + ::tools::Rectangle scrollArea = rLayouter.GetTotalBoundingBox(); + + // Prevent scrolling out of bounds by limiting scroll destination point. if (bIsVertical) - if (nDistance > 0) - { - const sal_Int32 nIndex (rLayouter.GetIndexAtPoint( - Point(aNewTopLeft.X(), aNewTopLeft.Y()+mpVerticalScrollBar->GetVisibleSize()), - true)); - aNewTopLeft.setY( rLayouter.GetPageObjectBox(nIndex,true).Bottom() - - mpVerticalScrollBar->GetVisibleSize() ); - } - else - { - const sal_Int32 nIndex (rLayouter.GetIndexAtPoint( - Point(aNewTopLeft.X(), aNewTopLeft.Y()), - true)); - aNewTopLeft.setY( rLayouter.GetPageObjectBox(nIndex,true).Top() ); - } + { + // Subtract size of view itself to get scrollable area. + ::tools::Long scrollbarSize = mpVerticalScrollBar->GetVisibleSize(); + // Prevent (-) height. std::max needs type specified explicitly so params match. + ::tools::Long scrollHeight = std::max(static_cast<::tools::Long>(0), scrollArea.GetHeight() - scrollbarSize); + scrollArea.SetHeight(scrollHeight); + // Constrain scroll point to valid area + ::tools::Long constrainedY = std::clamp(aNewTopLeft.getY(), scrollArea.Top(), scrollArea.Bottom()); + aNewTopLeft.setY(constrainedY); + } else - if (nDistance > 0) - { - const sal_Int32 nIndex (rLayouter.GetIndexAtPoint( - Point(aNewTopLeft.X()+mpVerticalScrollBar->GetVisibleSize(), aNewTopLeft.Y()), - true)); - aNewTopLeft.setX( rLayouter.GetPageObjectBox(nIndex,true).Right() - - mpVerticalScrollBar->GetVisibleSize() ); - } - else - { - const sal_Int32 nIndex (rLayouter.GetIndexAtPoint( - Point(aNewTopLeft.X(), aNewTopLeft.Y()), - true)); - aNewTopLeft.setX( rLayouter.GetPageObjectBox(nIndex,true).Left() ); - } + { + // Subtract size of view itself to get scrollable area. + ::tools::Long scrollbarSize = mpHorizontalScrollBar->GetVisibleSize(); + // Prevent (-) width. std::max needs type specified explicitly so params match. + ::tools::Long scrollWidth = std::max(static_cast<::tools::Long>(0), scrollArea.GetWidth() - scrollbarSize); + scrollArea.SetWidth(scrollWidth); + // Constrain scroll point to valid area + ::tools::Long constrainedX = std::clamp(aNewTopLeft.getX(), scrollArea.Left(), scrollArea.Right()); + aNewTopLeft.setX(constrainedX); + } mrSlideSorter.GetController().GetVisibleAreaManager().DeactivateCurrentSlideTracking(); SetTopLeft(aNewTopLeft); diff --git a/sd/source/ui/slidesorter/inc/controller/SlsScrollBarManager.hxx b/sd/source/ui/slidesorter/inc/controller/SlsScrollBarManager.hxx index df04a3b5952f..1ed5b9fead87 100644 --- a/sd/source/ui/slidesorter/inc/controller/SlsScrollBarManager.hxx +++ b/sd/source/ui/slidesorter/inc/controller/SlsScrollBarManager.hxx @@ -155,7 +155,7 @@ public: */ void Scroll( const Orientation eOrientation, - const sal_Int32 nDistance); + const double nDistance); private: SlideSorter& mrSlideSorter; diff --git a/sd/source/ui/slidesorter/inc/view/SlsLayouter.hxx b/sd/source/ui/slidesorter/inc/view/SlsLayouter.hxx index b91ae83c544c..c54dee655503 100644 --- a/sd/source/ui/slidesorter/inc/view/SlsLayouter.hxx +++ b/sd/source/ui/slidesorter/inc/view/SlsLayouter.hxx @@ -111,6 +111,12 @@ public: Size const & GetPageObjectSize() const; + /** Returns the passed Size plus the gap between pages. + @param rObjectSize + Object size to start from. + */ + static Size AddGap(const Size & rObjectSize); + /** Return the bounding box in window coordinates of the nIndex-th page object. */ diff --git a/sd/source/ui/slidesorter/view/SlsLayouter.cxx b/sd/source/ui/slidesorter/view/SlsLayouter.cxx index 8bc0daf3f5e9..371e410d3fee 100644 --- a/sd/source/ui/slidesorter/view/SlsLayouter.cxx +++ b/sd/source/ui/slidesorter/view/SlsLayouter.cxx @@ -183,7 +183,7 @@ public: const sal_Int32 nColumn, const bool bClampToValidRange) const; - ::tools::Rectangle GetPageObjectBox ( + ::tools::Rectangle GetPageObjectBox ( const sal_Int32 nIndex, const bool bIncludeBorderAndGap = false) const; @@ -349,6 +349,14 @@ Size const & Layouter::GetPageObjectSize() const return mpImplementation->maPageObjectSize; } +Size Layouter::AddGap(const Size & rObjectSize) +{ + Size newSize = rObjectSize; + newSize.AdjustWidth(Implementation::gnHorizontalGap); + newSize.AdjustHeight(Implementation::gnVerticalGap); + return newSize; +} + ::tools::Rectangle Layouter::GetPageObjectBox ( const sal_Int32 nIndex, const bool bIncludeBorderAndGap) const From 7dd9d6525aa45ebd22d58cb3980c63d8c7341d2c Mon Sep 17 00:00:00 2001 From: Ilmari Lauhakangas Date: Sun, 8 Dec 2024 13:45:52 +0200 Subject: [PATCH 075/133] Drop windows7.patch.1 from pdfium Change-Id: Idb458e3e65bc22d148cc68e496aa0dda32fec2a2 Reviewed-on: https://gerrit.libreoffice.org/c/core/+/178079 Tested-by: Jenkins Reviewed-by: Ilmari Lauhakangas Reviewed-by: Mike Kaganski --- external/pdfium/UnpackedTarball_pdfium.mk | 2 -- external/pdfium/windows7.patch.1 | 34 ----------------------- 2 files changed, 36 deletions(-) delete mode 100644 external/pdfium/windows7.patch.1 diff --git a/external/pdfium/UnpackedTarball_pdfium.mk b/external/pdfium/UnpackedTarball_pdfium.mk index 6c5bce9b2e29..4a47b35bd6f3 100644 --- a/external/pdfium/UnpackedTarball_pdfium.mk +++ b/external/pdfium/UnpackedTarball_pdfium.mk @@ -10,8 +10,6 @@ pdfium_patches := # Fixes build on our baseline. pdfium_patches += build.patch.1 -# Avoids Windows 8 build dependency. -pdfium_patches += windows7.patch.1 pdfium_patches += c++20-comparison.patch pdfium_patches += constexpr-template.patch diff --git a/external/pdfium/windows7.patch.1 b/external/pdfium/windows7.patch.1 deleted file mode 100644 index 9c82a8a34d49..000000000000 --- a/external/pdfium/windows7.patch.1 +++ /dev/null @@ -1,34 +0,0 @@ -diff --git a/core/fxcrt/win/win_util.cc b/core/fxcrt/win/win_util.cc -index 43e9151d1..76657ac0a 100644 ---- a/core/fxcrt/win/win_util.cc -+++ b/core/fxcrt/win/win_util.cc -@@ -10,28 +10,7 @@ - namespace pdfium { - - bool IsUser32AndGdi32Available() { -- static auto is_user32_and_gdi32_available = []() { -- // If win32k syscalls aren't disabled, then user32 and gdi32 are available. -- -- typedef decltype( -- GetProcessMitigationPolicy)* GetProcessMitigationPolicyType; -- GetProcessMitigationPolicyType get_process_mitigation_policy_func = -- reinterpret_cast(GetProcAddress( -- GetModuleHandle(L"kernel32.dll"), "GetProcessMitigationPolicy")); -- -- if (!get_process_mitigation_policy_func) -- return true; -- -- PROCESS_MITIGATION_SYSTEM_CALL_DISABLE_POLICY policy = {}; -- if (get_process_mitigation_policy_func(GetCurrentProcess(), -- ProcessSystemCallDisablePolicy, -- &policy, sizeof(policy))) { -- return policy.DisallowWin32kSystemCalls == 0; -- } -- -- return true; -- }(); -- return is_user32_and_gdi32_available; -+ return true; - } - - } // namespace pdfium From 599dc2a504fde53a39599a39b1cc895edf06b300 Mon Sep 17 00:00:00 2001 From: Ilmari Lauhakangas Date: Sun, 8 Dec 2024 13:34:44 +0200 Subject: [PATCH 076/133] Remove Windows 7, 8 and 8.1 from driver blocklist code Change-Id: If3138b9b603c21a9cc6fedc08a7db144fb9f00ac Reviewed-on: https://gerrit.libreoffice.org/c/core/+/178077 Reviewed-by: Ilmari Lauhakangas Tested-by: Jenkins Reviewed-by: Mike Kaganski --- vcl/inc/driverblocklist.hxx | 5 +---- vcl/qa/cppunit/blocklistparsertest.cxx | 14 ++++---------- vcl/qa/cppunit/test_blocklist_parse.xml | 16 ++++++++-------- vcl/qa/cppunit/test_blocklist_vulkan.xml | 2 +- vcl/source/helper/driverblocklist.cxx | 12 ------------ 5 files changed, 14 insertions(+), 35 deletions(-) diff --git a/vcl/inc/driverblocklist.hxx b/vcl/inc/driverblocklist.hxx index f3fc81c6642d..4b3bc9cd502e 100644 --- a/vcl/inc/driverblocklist.hxx +++ b/vcl/inc/driverblocklist.hxx @@ -58,10 +58,7 @@ enum OperatingSystem { DRIVER_OS_UNKNOWN = 0, DRIVER_OS_WINDOWS_FIRST, - DRIVER_OS_WINDOWS_7 = DRIVER_OS_WINDOWS_FIRST, - DRIVER_OS_WINDOWS_8, - DRIVER_OS_WINDOWS_8_1, - DRIVER_OS_WINDOWS_10, + DRIVER_OS_WINDOWS_10 = DRIVER_OS_WINDOWS_FIRST, DRIVER_OS_WINDOWS_LAST = DRIVER_OS_WINDOWS_10, DRIVER_OS_WINDOWS_ALL, DRIVER_OS_LINUX, diff --git a/vcl/qa/cppunit/blocklistparsertest.cxx b/vcl/qa/cppunit/blocklistparsertest.cxx index 1cef4dfbfbc7..d0592f33c975 100644 --- a/vcl/qa/cppunit/blocklistparsertest.cxx +++ b/vcl/qa/cppunit/blocklistparsertest.cxx @@ -108,10 +108,6 @@ void BlocklistParserTest::testEvaluate() OUString vendorMicrosoft = GetVendorId(VendorMicrosoft); // Check OS - CPPUNIT_ASSERT_EQUAL(false, FindBlocklistedDeviceInList( - aDriveInfos, VersionType::OpenGL, u"10.20.30.40", vendorNVIDIA, u"all"_ustr, DRIVER_OS_WINDOWS_7)); - CPPUNIT_ASSERT_EQUAL(false, FindBlocklistedDeviceInList( - aDriveInfos, VersionType::OpenGL, u"10.20.30.40", vendorNVIDIA, u"all"_ustr, DRIVER_OS_WINDOWS_8)); CPPUNIT_ASSERT_EQUAL(false, FindBlocklistedDeviceInList( aDriveInfos, VersionType::OpenGL, u"10.20.30.40", vendorNVIDIA, u"all"_ustr, DRIVER_OS_WINDOWS_10)); @@ -126,22 +122,20 @@ void BlocklistParserTest::testEvaluate() aDriveInfos, VersionType::OpenGL, u"10.20.30.50", vendorMicrosoft, u"all"_ustr, DRIVER_OS_OSX_10_8)); // Check Vendors - CPPUNIT_ASSERT_EQUAL(true, FindBlocklistedDeviceInList( - aDriveInfos, VersionType::OpenGL, u"10.20.30.40", vendorMicrosoft, u"all"_ustr, DRIVER_OS_WINDOWS_7)); CPPUNIT_ASSERT_EQUAL(true, FindBlocklistedDeviceInList( aDriveInfos, VersionType::OpenGL, u"10.20.30.40", vendorMicrosoft, u"all"_ustr, DRIVER_OS_WINDOWS_10)); // Check Versions CPPUNIT_ASSERT_EQUAL(true, FindBlocklistedDeviceInList( - aDriveInfos, VersionType::OpenGL, u"10.20.30.39", vendorAMD, u"all"_ustr, DRIVER_OS_WINDOWS_7)); + aDriveInfos, VersionType::OpenGL, u"10.20.30.39", vendorAMD, u"all"_ustr, DRIVER_OS_WINDOWS_10)); CPPUNIT_ASSERT_EQUAL(false, FindBlocklistedDeviceInList( - aDriveInfos, VersionType::OpenGL, u"10.20.30.40", vendorAMD, u"all"_ustr, DRIVER_OS_WINDOWS_7)); + aDriveInfos, VersionType::OpenGL, u"10.20.30.40", vendorAMD, u"all"_ustr, DRIVER_OS_WINDOWS_10)); CPPUNIT_ASSERT_EQUAL(false, FindBlocklistedDeviceInList( - aDriveInfos, VersionType::OpenGL, u"10.20.30.41", vendorAMD, u"all"_ustr, DRIVER_OS_WINDOWS_7)); + aDriveInfos, VersionType::OpenGL, u"10.20.30.41", vendorAMD, u"all"_ustr, DRIVER_OS_WINDOWS_10)); // Check CPPUNIT_ASSERT_EQUAL(true, FindBlocklistedDeviceInList( - aDriveInfos, VersionType::OpenGL, u"9.17.10.4229", vendorIntel, u"all"_ustr, DRIVER_OS_WINDOWS_7)); + aDriveInfos, VersionType::OpenGL, u"9.17.10.4229", vendorIntel, u"all"_ustr, DRIVER_OS_WINDOWS_10)); } diff --git a/vcl/qa/cppunit/test_blocklist_parse.xml b/vcl/qa/cppunit/test_blocklist_parse.xml index 9a0f6acc574f..9f0fc496ef4c 100644 --- a/vcl/qa/cppunit/test_blocklist_parse.xml +++ b/vcl/qa/cppunit/test_blocklist_parse.xml @@ -12,16 +12,16 @@ - + - + - + - + @@ -38,16 +38,16 @@ - + - + - + - + diff --git a/vcl/qa/cppunit/test_blocklist_vulkan.xml b/vcl/qa/cppunit/test_blocklist_vulkan.xml index 9542ee5f22a5..4503bfcfb28e 100644 --- a/vcl/qa/cppunit/test_blocklist_vulkan.xml +++ b/vcl/qa/cppunit/test_blocklist_vulkan.xml @@ -9,7 +9,7 @@ In this case we // mention that it is a CJK font - for(size_t i = 0; i < rFontName.size(); i++) + for (const sal_Unicode& ch : rFontName) { - const sal_Unicode ch = rFontName[i]; // japanese if ( ((ch >= 0x3040) && (ch <= 0x30FF)) || ((ch >= 0x3190) && (ch <= 0x319F)) ) From 47b4b1633a08dd4c97d66feabe8cd3290074dc0f Mon Sep 17 00:00:00 2001 From: Eike Rathke Date: Mon, 9 Dec 2024 19:03:44 +0100 Subject: [PATCH 125/133] Resolves: tdf#164239 Can force Y-M-D to ISO 8601 if no date acceptance pattern ... was matched at all, even for a-b-c with MDY a<=12 or DMY a<=31. Change-Id: Ie2d62c73c91794a96114b787d6ad2357c7affb2a Reviewed-on: https://gerrit.libreoffice.org/c/core/+/178171 Reviewed-by: Eike Rathke Tested-by: Jenkins --- svl/qa/unit/svl.cxx | 21 ++++++++++++--------- svl/source/numbers/zforfind.cxx | 4 ++++ 2 files changed, 16 insertions(+), 9 deletions(-) diff --git a/svl/qa/unit/svl.cxx b/svl/qa/unit/svl.cxx index 1b90ee5c8b88..80ec80e0d87e 100644 --- a/svl/qa/unit/svl.cxx +++ b/svl/qa/unit/svl.cxx @@ -1170,7 +1170,7 @@ void Test::testIsNumberFormat() { "Sept 1", true }, //tdf#127363 { "5/d", false }, //tdf#143165 { "Jan 1 2000", true }, - { "5-12-14", false }, + { "5-12-14", true }, // tdf#164239 { "005-12-14", true }, { "15-10-30", true }, { "2015-10-30", true }, @@ -1232,26 +1232,28 @@ void checkSpecificNumberFormats( SvNumberFormatter& rFormatter, void Test::testIsNumberFormatSpecific() { { - // en-US uses M/D/Y format, test that a-b-c input with a<=31 and b<=12 - // does not lead to a/b/c date output + // en-US uses M/D/Y format, test that without Y-M-D pattern an a-b-c + // input with a<=12 leads to ISO a-b-c date output. SvNumberFormatter aFormatter(m_xContext, LANGUAGE_ENGLISH_US); std::vector aIO = { - { "5-12-14", false, "", 0 }, - { "32-12-14", true, "1932-12-14", 0 } + { "005-12-14", true, "0005-12-14", 0 }, + { "5-12-14", true, "2005-12-14", 0 }, + { "32-12-14", true, "1932-12-14", 0 } }; checkSpecificNumberFormats( aFormatter, aIO, "[en-US] date"); } { - // de-DE uses D.M.Y format, test that a-b-c input with a<=31 and b<=12 - // does not lead to a.b.c date output + // de-DE uses D.M.Y format, test that without Y-M-D pattern an a-b-c + // input with a<=31 leads to ISO a-b-c date output. SvNumberFormatter aFormatter(m_xContext, LANGUAGE_GERMAN); std::vector aIO = { - { "5-12-14", false, "", 0 }, - { "32-12-14", true, "1932-12-14", 0 } + { "005-12-14", true, "0005-12-14", 0 }, + { "5-12-14", true, "2005-12-14", 0 }, + { "32-12-14", true, "1932-12-14", 0 } }; checkSpecificNumberFormats( aFormatter, aIO, "[de-DE] date"); @@ -1263,6 +1265,7 @@ void Test::testIsNumberFormatSpecific() SvNumberFormatter aFormatter(m_xContext, LANGUAGE_DUTCH); std::vector aIO = { + { "001-2-11", true, "0001-02-11", 0 }, { "22-11-1999", true, "22-11-99", 0 }, // if default YY changes to YYYY adapt this { "1999-11-22", true, "1999-11-22", 0 }, { "1-2-11", true, "01-02-11", 0 }, // if default YY changes to YYYY adapt this diff --git a/svl/source/numbers/zforfind.cxx b/svl/source/numbers/zforfind.cxx index 13cdcb3ca53b..2b91fa662845 100644 --- a/svl/source/numbers/zforfind.cxx +++ b/svl/source/numbers/zforfind.cxx @@ -1172,6 +1172,10 @@ bool ImpSvNumberInputScan::CanForceToIso8601( DateOrder eDateOrder ) eDateOrder = GetDateOrder(); } + // No date pattern matched at all can be forced to ISO 8601 here as is. + if (GetDatePatternNumbers() == 0) + return true; + nCanForceToIso8601 = 1; } From b012d206350f57bf4268d8cd8528c32647c6b933 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Caol=C3=A1n=20McNamara?= Date: Mon, 9 Dec 2024 17:34:00 +0000 Subject: [PATCH 126/133] cid#1636669 Dereference after null check MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Change-Id: I56e9669058a79750f83bb99e682e25c3fea2a0bd Reviewed-on: https://gerrit.libreoffice.org/c/core/+/178170 Tested-by: Jenkins Reviewed-by: Caolán McNamara --- sc/source/filter/xml/xmlexprt.cxx | 54 ++++++++++++++++--------------- 1 file changed, 28 insertions(+), 26 deletions(-) diff --git a/sc/source/filter/xml/xmlexprt.cxx b/sc/source/filter/xml/xmlexprt.cxx index 246a7fe8e3a1..e41e3ece60c4 100644 --- a/sc/source/filter/xml/xmlexprt.cxx +++ b/sc/source/filter/xml/xmlexprt.cxx @@ -5261,36 +5261,38 @@ void ScXMLExport::GetChangeTrackViewSettings(ScDocument& rDoc, uno::Sequence& rProps) { - if (GetModel().is()) + if (!GetModel().is()) + return; + + ScModelObj* pDocObj(comphelper::getFromUnoTunnel( GetModel() )); + if (!pDocObj) + return; + + SfxObjectShell* pEmbeddedObj = pDocObj->GetEmbeddedObject(); + if (pEmbeddedObj) { rProps.realloc(4); beans::PropertyValue* pProps(rProps.getArray()); - ScModelObj* pDocObj(comphelper::getFromUnoTunnel( GetModel() )); - if (pDocObj) - { - SfxObjectShell* pEmbeddedObj = pDocObj->GetEmbeddedObject(); - if (pEmbeddedObj) - { - tools::Rectangle aRect(pEmbeddedObj->GetVisArea()); - sal_uInt16 i(0); - pProps[i].Name = "VisibleAreaTop"; - pProps[i].Value <<= static_cast(aRect.Top()); - pProps[++i].Name = "VisibleAreaLeft"; - pProps[i].Value <<= static_cast(aRect.Left()); - pProps[++i].Name = "VisibleAreaWidth"; - pProps[i].Value <<= static_cast(aRect.getOpenWidth()); - pProps[++i].Name = "VisibleAreaHeight"; - pProps[i].Value <<= static_cast(aRect.getOpenHeight()); - } - } - ScDocument* pDoc = pDocObj->GetDocument(); - if (!pDoc) - { - SAL_WARN("sc", "no ScDocument!"); - return; - } - GetChangeTrackViewSettings(*pDoc, rProps); + + tools::Rectangle aRect(pEmbeddedObj->GetVisArea()); + sal_uInt16 i(0); + pProps[i].Name = "VisibleAreaTop"; + pProps[i].Value <<= static_cast(aRect.Top()); + pProps[++i].Name = "VisibleAreaLeft"; + pProps[i].Value <<= static_cast(aRect.Left()); + pProps[++i].Name = "VisibleAreaWidth"; + pProps[i].Value <<= static_cast(aRect.getOpenWidth()); + pProps[++i].Name = "VisibleAreaHeight"; + pProps[i].Value <<= static_cast(aRect.getOpenHeight()); } + + ScDocument* pDoc = pDocObj->GetDocument(); + if (!pDoc) + { + SAL_WARN("sc", "no ScDocument!"); + return; + } + GetChangeTrackViewSettings(*pDoc, rProps); } void ScXMLExport::GetConfigurationSettings(uno::Sequence& rProps) From adf11923692b5baf3750a6c5c5d3043772a68338 Mon Sep 17 00:00:00 2001 From: Dione Maddern Date: Mon, 9 Dec 2024 15:12:35 -0500 Subject: [PATCH 127/133] Update git submodules * Update helpcontent2 from branch 'master' to f723cce6039b88b82380fbc8ebe9a2e18eaf3fd4 - tdf#162504 Create help page for Alignment Sidebar panel Create new file source/text/scalc/01/sidebar_alignment.xhp to explain the features of the Alignment panel of the Properties sidebar. In AllLangHelp_scalc.mk - Add new file source/text/scalc/01/sidebar_alignment.xhp to the make file - Change the file path for source/text/scalc/01/sidebar_number_format.xhp to show amended file location. In source/text/shared/01/05020700.xhp - Add variable tag so that the file can easily be linked from other help pages. In source/text/shared/01/05100100.xhp - Add section tags so that content can be easily embedded in other pages. In source/text/shared/01/05340300.xhp - Add section and variable tags so that content can be easily embedded in other pages. - Reformat the "reference_edge" section so that each option has its own heading. This improves readability and consistency and allows the same content to be re-used in the help page for the Alignment Sidebar panel. In source/text/shared/01/LeftToRight.xhp - Add section tags so that content can be easily embedded in other pages. In source/text/shared/01/RightToLeft.xhp - Add section tags so that content can be easily embedded in other pages. In source/text/scalc/sidebar_number_format.xhp - Moved file to source/text/scalc/01/sidebar_number_format.xhp In source/text/shared/01/sidebar_properties.xhp - Embed description of Alignment sidebar panel - Update file path for source/text/scalc/01/sidebar_number_format.xhp - Add loc_false tags for embedded variables Change-Id: Id9c232c18bab1cfab99eec83e796f8db25681898 Reviewed-on: https://gerrit.libreoffice.org/c/help/+/177707 Reviewed-by: Olivier Hallot Tested-by: Jenkins --- helpcontent2 | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/helpcontent2 b/helpcontent2 index f45820f45e2c..f723cce6039b 160000 --- a/helpcontent2 +++ b/helpcontent2 @@ -1 +1 @@ -Subproject commit f45820f45e2cf351d3f08238952d25de0f68337d +Subproject commit f723cce6039b88b82380fbc8ebe9a2e18eaf3fd4 From 45aca23c11bb37b7e7c9fe33019c2fa5f4e64f81 Mon Sep 17 00:00:00 2001 From: Bogdan Buzea Date: Mon, 9 Dec 2024 21:49:37 +0100 Subject: [PATCH 128/133] Update git submodules * Update helpcontent2 from branch 'master' to d1e72401e01866e317fa763f914d15ea9a277372 - tdf#156317 Explain: Use superordinate object settings Change-Id: I24f55c9a28acb53d1f9af431e0d215a4a18d8637 Reviewed-on: https://gerrit.libreoffice.org/c/help/+/178059 Reviewed-by: Olivier Hallot Tested-by: Jenkins --- helpcontent2 | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/helpcontent2 b/helpcontent2 index f723cce6039b..d1e72401e018 160000 --- a/helpcontent2 +++ b/helpcontent2 @@ -1 +1 @@ -Subproject commit f723cce6039b88b82380fbc8ebe9a2e18eaf3fd4 +Subproject commit d1e72401e01866e317fa763f914d15ea9a277372 From 3dd137c50f94f2b0ae602eb7ed66827cf0d9af9d Mon Sep 17 00:00:00 2001 From: Olivier Hallot Date: Mon, 9 Dec 2024 17:56:23 -0300 Subject: [PATCH 129/133] Update git submodules * Update helpcontent2 from branch 'master' to 635f1dc3de1c1af8b6a99205d2237c0650084bea - tdf#155193 No indexing when indexer="excluded" in Use omindex property of HTML indexing. See https://xapian.org/docs/omega/overview.html Change-Id: I9737d0111860da875e09f27814adf7b14104919b Reviewed-on: https://gerrit.libreoffice.org/c/help/+/178156 Tested-by: Jenkins Reviewed-by: Olivier Hallot --- helpcontent2 | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/helpcontent2 b/helpcontent2 index d1e72401e018..635f1dc3de1c 160000 --- a/helpcontent2 +++ b/helpcontent2 @@ -1 +1 @@ -Subproject commit d1e72401e01866e317fa763f914d15ea9a277372 +Subproject commit 635f1dc3de1c1af8b6a99205d2237c0650084bea From a80b04058084826f28cfe58a66a96116383b1146 Mon Sep 17 00:00:00 2001 From: Bogdan Buzea Date: Thu, 5 Dec 2024 20:51:32 +0100 Subject: [PATCH 130/133] tdf#161915 Wrong extended tip Change-Id: I3c7be8f877f6ae0a505d6ec9a8bd786a0bd76745 Reviewed-on: https://gerrit.libreoffice.org/c/core/+/177902 Reviewed-by: Heiko Tietze Tested-by: Jenkins Reviewed-by: Olivier Hallot --- cui/uiconfig/ui/numberingpositionpage.ui | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/cui/uiconfig/ui/numberingpositionpage.ui b/cui/uiconfig/ui/numberingpositionpage.ui index 8b6cb954bccb..566c4a52f251 100644 --- a/cui/uiconfig/ui/numberingpositionpage.ui +++ b/cui/uiconfig/ui/numberingpositionpage.ui @@ -203,7 +203,7 @@ 2 - Enter the distance from the left page margin to the start of all lines in the numbered paragraph that follow the first line. + Enter the distance from the left page margin at which the numbering symbol will be aligned. @@ -275,7 +275,7 @@ - Enter the distance from the left page margin at which the numbering symbol will be aligned. + Enter the distance from the left page margin to the start of all lines in the numbered paragraph that follow the first line. From 50a8b8e6e47d804358ba6cbf497a0d34ce4782b0 Mon Sep 17 00:00:00 2001 From: Bogdan Buzea Date: Mon, 9 Dec 2024 23:46:27 +0100 Subject: [PATCH 131/133] Update git submodules * Update helpcontent2 from branch 'master' to 22c587639a5c06e9a61a390b4ea18da0cb0c0b68 - tdf#131332: Replace custom date formats with ISO 8601 Change-Id: Idf08d44bb5287da44b281820e73e08c58e154f99 Reviewed-on: https://gerrit.libreoffice.org/c/help/+/178163 Tested-by: Jenkins Reviewed-by: Olivier Hallot --- helpcontent2 | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/helpcontent2 b/helpcontent2 index 635f1dc3de1c..22c587639a5c 160000 --- a/helpcontent2 +++ b/helpcontent2 @@ -1 +1 @@ -Subproject commit 635f1dc3de1c1af8b6a99205d2237c0650084bea +Subproject commit 22c587639a5c06e9a61a390b4ea18da0cb0c0b68 From d97085cc6cd2bdc3b6723d1960d0ec5fa0a48165 Mon Sep 17 00:00:00 2001 From: Justin Luth Date: Sat, 7 Dec 2024 11:42:39 -0500 Subject: [PATCH 132/133] tdf#164201 docx import: compat14+ cannot be ECMA_376_1ST_EDITION This fixes a 7.6 regression from commit e66ddcd4b66923bc835bd7c5f5c784a809a420a2. At import, the base filter was treating too many documents as if they were limited to Word 2007 format, and thus reducing their compatibilityMode to 12 on export. This import case is matched in a LOT of unit tests. However, it doesn't manifest itself in saveAndReload(mpFilter) (or DECLARE_OOXMLEXPORT_TEST) because the mpFilter string set in the Test class with SwModelTestBase(..."ooxmlexport/data/", "Office Open XML Text"), forces saving in ISOIEC_29500_2008 mode and thus unit tests basically NEVER round-trip as "MS Word 2007 XML". However, the general user was almost always round-tripping these as MS Word 2007 XML / compat12 since LO 7.6. make CppunitTest_sw_ooxmlexport20 CPPUNIT_TEST_NAME=testTdf158855 Change-Id: If635866cc816e7b4734443f87b30410ac3bba951 Reviewed-on: https://gerrit.libreoffice.org/c/core/+/178048 Reviewed-by: Justin Luth Tested-by: Jenkins Reviewed-by: Miklos Vajna --- sfx2/source/doc/sfxbasemodel.cxx | 13 +++++++++++ sw/qa/extras/ooxmlexport/ooxmlexport20.cxx | 22 ++++++++++++++++--- .../dmapper/DomainMapper_Impl.cxx | 16 ++++++++++++++ 3 files changed, 48 insertions(+), 3 deletions(-) diff --git a/sfx2/source/doc/sfxbasemodel.cxx b/sfx2/source/doc/sfxbasemodel.cxx index 7ecfd1d9a60c..18dc4e87a1cb 100644 --- a/sfx2/source/doc/sfxbasemodel.cxx +++ b/sfx2/source/doc/sfxbasemodel.cxx @@ -1188,6 +1188,19 @@ void SAL_CALL SfxBaseModel::setArgs(const Sequence& aArgs) pMedium->GetItemSet().Put(SfxUnoAnyItem(SID_ENCRYPTIONDATA, rArg.Value)); ok = true; } + else if (rArg.Name == "FilterName") + { + // HACK: Needed a way to tweak the filter after loading has started, + // but changing this must be avoided unless clearly intentional. + if (aArgs.size() == 1) + { + if (rArg.Value >>= sValue) + { + pMedium->GetItemSet().Put(SfxStringItem(SID_FILTER_NAME, sValue)); + ok = true; + } + } + } if (!ok) { throw lang::IllegalArgumentException("Setting property not supported: " + rArg.Name, diff --git a/sw/qa/extras/ooxmlexport/ooxmlexport20.cxx b/sw/qa/extras/ooxmlexport/ooxmlexport20.cxx index c418c1904197..74f020e614f2 100644 --- a/sw/qa/extras/ooxmlexport/ooxmlexport20.cxx +++ b/sw/qa/extras/ooxmlexport/ooxmlexport20.cxx @@ -15,6 +15,9 @@ #include #include +#include +#include + #include #include #include @@ -1050,15 +1053,28 @@ CPPUNIT_TEST_FIXTURE(Test, testTdf158855) // Check that the import doesn't produce an extra empty paragraph before a page break CPPUNIT_ASSERT_EQUAL(2, getPages()); // was 3 CPPUNIT_ASSERT_EQUAL(2, getParagraphs()); // was 3 - uno::Reference(getParagraphOrTable(1), uno::UNO_QUERY_THROW); + + uno::Reference xTableImport(getParagraphOrTable(1), uno::UNO_QUERY_THROW); getParagraph(2, u"Next page"_ustr); // was empty, with the 3rd being "Next page" - saveAndReload(mpFilter); + // tdf#164201 the table was shifting to left of the page margin because it became compat12 + CPPUNIT_ASSERT_EQUAL(sal_Int32(9), getProperty(xTableImport, u"LeftMargin"_ustr)); + CPPUNIT_ASSERT_EQUAL(OUString("Office Open XML Text"), + getSwDocShell()->GetMedium()->GetFilter()->GetFilterName()); + + saveAndReload(getSwDocShell()->GetMedium()->GetFilter()->GetFilterName()); CPPUNIT_ASSERT_EQUAL(2, getPages()); CPPUNIT_ASSERT_EQUAL(2, getParagraphs()); - uno::Reference(getParagraphOrTable(1), uno::UNO_QUERY_THROW); + uno::Reference xTableExport(getParagraphOrTable(1), uno::UNO_QUERY_THROW); getParagraph(2, u"Next page"_ustr); + + // tdf#164201 instead of "From left: 0" (aka 9), it was "From Left: -0.19cm" (aka -191) + CPPUNIT_ASSERT_EQUAL(sal_Int32(9), getProperty(xTableExport, u"LeftMargin"_ustr)); + + xmlDocUniquePtr pXmlSettings = parseExport(u"word/settings.xml"_ustr); + assertXPath(pXmlSettings, "//w:compat/w:compatSetting[1]", "name", u"compatibilityMode"); + assertXPath(pXmlSettings, "//w:compat/w:compatSetting[1]", "val", u"15"); } CPPUNIT_TEST_FIXTURE(Test, testTdf158971) diff --git a/sw/source/writerfilter/dmapper/DomainMapper_Impl.cxx b/sw/source/writerfilter/dmapper/DomainMapper_Impl.cxx index aab6be1833a6..d095afef0b35 100644 --- a/sw/source/writerfilter/dmapper/DomainMapper_Impl.cxx +++ b/sw/source/writerfilter/dmapper/DomainMapper_Impl.cxx @@ -9840,6 +9840,22 @@ void DomainMapper_Impl::ApplySettingsTable() // i.e. it typesets the same text with less lines and pages. if (m_pSettingsTable->GetWordCompatibilityMode() >= 15) xSettings->setPropertyValue(u"JustifyLinesWithShrinking"_ustr, uno::Any( true )); + + if (m_pSettingsTable->GetWordCompatibilityMode() > 12) + { + // impossible to be importing as a 2007-only format when compat mode is not equal to 12, + // so change from ECMA_376_1ST_EDITION to ISOIEC_29500_2008 + // so that at export time it will not be forced into compat12 mode. + OUString sFilterName; + comphelper::SequenceAsHashMap aMap(m_xTextDocument->getArgs()); + aMap["FilterName"] >>= sFilterName; + if (sFilterName == "MS Word 2007 XML") + { + m_xTextDocument->setArgs( + { comphelper::makePropertyValue("FilterName", OUString("Office Open XML Text")) }); + } + } + if (m_pSettingsTable->GetUsePrinterMetrics()) xSettings->setPropertyValue(u"PrinterIndependentLayout"_ustr, uno::Any(document::PrinterIndependentLayout::DISABLED)); if( m_pSettingsTable->GetEmbedTrueTypeFonts()) From a366cd34a85a21210939482d229d6d2dd9c1087c Mon Sep 17 00:00:00 2001 From: Justin Luth Date: Thu, 7 Nov 2024 15:52:53 -0500 Subject: [PATCH 133/133] tdf#125969 cui: add in-use area image to bitmap list This fixes a five year old (non-)easyhack with 3 duplicates. Note the nice-to-have dependencies in the bug report(s). When the document has a unique background (area) image, it is now added to the list of available images IF/WHEN the user looks in the area tab. This allows the user to switch back after changing, or re-use it in other places in the document. Most of this patch ended up being plumbing to ensure that this added image is ONLY available to the current document, because it MUST NOT be saved to the user profile. This change affects all apps and all types of areas: NICE -tested Writer pages, paragraphs, headers, textbox, sidebar(page) -tested Calc page style -tested Draw page, sidebar(page), textbox Caveats: -the bitmap list is NOT updated at the time of document import, only when area property inspected. (The bug requesting inclusion at the time of import is tdf#100832). make -srj1 UITest_writer_tests8 \ UITEST_TEST_NAME=tdf125969.tdf125969.test_tdf125969 \ SAL_USE_VCLPLUGIN=gen Change-Id: Ic9fea9b199602c4df1376e781d5df019526473d5 Reviewed-on: https://gerrit.libreoffice.org/c/core/+/176253 Tested-by: Jenkins Reviewed-by: Justin Luth --- cui/source/inc/cuitabarea.hxx | 2 + cui/source/tabpages/tpbitmap.cxx | 50 +++++++++++---- include/svx/XPropertyEntry.hxx | 4 ++ include/svx/xtable.hxx | 9 +++ svx/source/xoutdev/XPropertyEntry.cxx | 1 + svx/source/xoutdev/xtable.cxx | 55 +++++++++++++++- sw/qa/uitest/data/paragraphAreaFill.odt | Bin 0 -> 169234 bytes sw/qa/uitest/writer_tests8/tdf125969.py | 81 ++++++++++++++++++++++++ 8 files changed, 187 insertions(+), 15 deletions(-) create mode 100644 sw/qa/uitest/data/paragraphAreaFill.odt create mode 100644 sw/qa/uitest/writer_tests8/tdf125969.py diff --git a/cui/source/inc/cuitabarea.hxx b/cui/source/inc/cuitabarea.hxx index 7021a7aa7847..30feba7fe85f 100644 --- a/cui/source/inc/cuitabarea.hxx +++ b/cui/source/inc/cuitabarea.hxx @@ -551,6 +551,8 @@ private: void CalculateBitmapPresetSize(); sal_Int32 SearchBitmapList(std::u16string_view rBitmapName); sal_Int32 SearchBitmapList(const GraphicObject& rGraphicObject); + tools::Long AddBitmap(const GraphicObject& rGraphicObject, const OUString& rName, + bool bOnlyForThisDocument = false); public: SvxBitmapTabPage(weld::Container* pPage, weld::DialogController* pController, const SfxItemSet& rInAttrs); diff --git a/cui/source/tabpages/tpbitmap.cxx b/cui/source/tabpages/tpbitmap.cxx index 9e016879b4cb..a4154aa344c8 100644 --- a/cui/source/tabpages/tpbitmap.cxx +++ b/cui/source/tabpages/tpbitmap.cxx @@ -37,8 +37,10 @@ #include #include #include +#include #include #include +#include #include #include #include @@ -167,9 +169,13 @@ void SvxBitmapTabPage::ActivatePage( const SfxItemSet& rSet ) sal_Int32 nPos( 0 ); if ( !aItem.isPattern() ) { - nPos = SearchBitmapList( aItem.GetGraphicObject() ); - if (nPos == -1) + const GraphicObject& aGraphicObj = aItem.GetGraphicObject(); + if (aGraphicObj.GetType() != GraphicType::Bitmap) return; + + nPos = SearchBitmapList(aGraphicObj); + if (nPos == -1) + nPos = AddBitmap(aGraphicObj, aItem.GetName(), /*OnlyForThisDocument=*/true); } else { @@ -781,18 +787,7 @@ IMPL_LINK_NOARG(SvxBitmapTabPage, ClickImportHdl, weld::Button&, void) pDlg.disposeAndClear(); if( !nError ) - { - m_pBitmapList->Insert(std::make_unique(aGraphic, aName), nCount); - - sal_Int32 nId = m_xBitmapLB->GetItemId( nCount - 1 ); - BitmapEx aBitmap = m_pBitmapList->GetBitmapForPreview( nCount, m_xBitmapLB->GetIconSize() ); - - m_xBitmapLB->InsertItem( nId + 1, Image(aBitmap), aName ); - m_xBitmapLB->SelectItem( nId + 1 ); - m_nBitmapListState |= ChangeType::MODIFIED; - - ModifyBitmapHdl(m_xBitmapLB.get()); - } + AddBitmap(aGraphic, aName); } else { @@ -836,4 +831,31 @@ sal_Int32 SvxBitmapTabPage::SearchBitmapList(std::u16string_view rBitmapName) return nPos; } +tools::Long SvxBitmapTabPage::AddBitmap(const GraphicObject& rGraphicObject, const OUString& rName, + bool bOnlyForThisDocument) +{ + const tools::Long nLastPos = m_pBitmapList->Count(); + + auto xBitmapEntry = std::make_unique(rGraphicObject, rName); + if (bOnlyForThisDocument) + xBitmapEntry->SetSavingAllowed(false); + m_pBitmapList->Insert(std::move(xBitmapEntry), nLastPos); + + BitmapEx aBitmap = m_pBitmapList->GetBitmapForPreview(nLastPos, m_xBitmapLB->GetIconSize()); + + const sal_uInt16 nHighestId = m_xBitmapLB->GetItemId(nLastPos - 1); + m_xBitmapLB->InsertItem(nHighestId + 1, Image(aBitmap), rName); + m_xBitmapLB->SelectItem(nHighestId + 1); + m_nBitmapListState |= ChangeType::MODIFIED; + + ModifyBitmapHdl(m_xBitmapLB.get()); + + // inform sidebar, etc. that the list of images has changed. + SfxViewFrame* pViewFrame = SfxViewFrame::Current(); + if (pViewFrame) + pViewFrame->GetBindings().Invalidate(SID_ATTR_PAGE_BITMAP, /*ClearCacheStatus=*/true); + + return nLastPos; +} + /* vim:set shiftwidth=4 softtabstop=4 expandtab: */ diff --git a/include/svx/XPropertyEntry.hxx b/include/svx/XPropertyEntry.hxx index bfb0aa25c702..8ac1734a4196 100644 --- a/include/svx/XPropertyEntry.hxx +++ b/include/svx/XPropertyEntry.hxx @@ -28,6 +28,7 @@ class SVXCORE_DLLPUBLIC XPropertyEntry private: OUString maPropEntryName; BitmapEx maUiBitmap; + bool mbSavingAllowed; protected: XPropertyEntry(OUString aPropEntryName); @@ -40,11 +41,14 @@ public: XPropertyEntry& operator=(XPropertyEntry const&) = default; XPropertyEntry& operator=(XPropertyEntry&&) = default; + virtual std::unique_ptr Clone() const = 0; void SetName(const OUString& rPropEntryName) { maPropEntryName = rPropEntryName; } const OUString& GetName() const { return maPropEntryName; } void SetUiBitmap(const BitmapEx& rUiBitmap) { maUiBitmap = rUiBitmap; } const BitmapEx& GetUiBitmap() const { return maUiBitmap; } + void SetSavingAllowed(bool bSet) { mbSavingAllowed = bSet; } + bool GetSavingAllowed() const { return mbSavingAllowed; } }; #endif // INCLUDED_SVX_XPROPERTYENTRY_HXX diff --git a/include/svx/xtable.hxx b/include/svx/xtable.hxx index 43ea9820d5a1..5725d02dd76e 100644 --- a/include/svx/xtable.hxx +++ b/include/svx/xtable.hxx @@ -46,6 +46,7 @@ private: public: XColorEntry(const Color& rColor, const OUString& rName); + std::unique_ptr Clone() const override; const Color& GetColor() const { @@ -61,6 +62,7 @@ private: public: XLineEndEntry(basegfx::B2DPolyPolygon aB2DPolyPolygon, const OUString& rName); XLineEndEntry(const XLineEndEntry& rOther); + std::unique_ptr Clone() const override; const basegfx::B2DPolyPolygon& GetLineEnd() const { @@ -76,6 +78,7 @@ private: public: XDashEntry(const XDash& rDash, const OUString& rName); XDashEntry(const XDashEntry& rOther); + std::unique_ptr Clone() const override; const XDash& GetDash() const { @@ -91,6 +94,7 @@ private: public: XHatchEntry(const XHatch& rHatch, const OUString& rName); XHatchEntry(const XHatchEntry& rOther); + std::unique_ptr Clone() const override; const XHatch& GetHatch() const { @@ -106,6 +110,7 @@ private: public: XGradientEntry(const basegfx::BGradient& rGradient, const OUString& rName); XGradientEntry(const XGradientEntry& rOther); + std::unique_ptr Clone() const override; const basegfx::BGradient& GetGradient() const { @@ -121,6 +126,7 @@ private: public: XBitmapEntry(const GraphicObject& rGraphicObject, const OUString& rName); XBitmapEntry(const XBitmapEntry& rOther); + std::unique_ptr Clone() const override; const GraphicObject& GetGraphicObject() const { @@ -167,6 +173,9 @@ protected: bool isValidIdx(tools::Long nIndex) const; virtual BitmapEx CreateBitmapForUI(tools::Long nIndex) = 0; +private: + bool mbNeedsExportableList; // impl: avoid seldom-needed, expensive list cloning + public: XPropertyList(const XPropertyList&) = delete; XPropertyList& operator=(const XPropertyList&) = delete; diff --git a/svx/source/xoutdev/XPropertyEntry.cxx b/svx/source/xoutdev/XPropertyEntry.cxx index 2791946838c9..14b54cb8c6b3 100644 --- a/svx/source/xoutdev/XPropertyEntry.cxx +++ b/svx/source/xoutdev/XPropertyEntry.cxx @@ -22,6 +22,7 @@ XPropertyEntry::XPropertyEntry(OUString aPropEntryName) : maPropEntryName(std::move(aPropEntryName)) + , mbSavingAllowed(true) { } diff --git a/svx/source/xoutdev/xtable.cxx b/svx/source/xoutdev/xtable.cxx index ea7385063701..ab6cfc60882c 100644 --- a/svx/source/xoutdev/xtable.cxx +++ b/svx/source/xoutdev/xtable.cxx @@ -36,6 +36,11 @@ XColorEntry::XColorEntry(const Color& rColor, const OUString& rName) { } +std::unique_ptr XColorEntry::Clone() const +{ + return std::make_unique(m_aColor, GetName()); +} + XLineEndEntry::XLineEndEntry(basegfx::B2DPolyPolygon _aB2DPolyPolygon, const OUString& rName) : XPropertyEntry(rName), m_aB2DPolyPolygon(std::move(_aB2DPolyPolygon)) @@ -48,6 +53,11 @@ XLineEndEntry::XLineEndEntry(const XLineEndEntry& rOther) { } +std::unique_ptr XLineEndEntry::Clone() const +{ + return std::make_unique(*this); +} + XDashEntry::XDashEntry(const XDash& rDash, const OUString& rName) : XPropertyEntry(rName), m_aDash(rDash) @@ -60,6 +70,11 @@ m_aDash(rOther.m_aDash) { } +std::unique_ptr XDashEntry::Clone() const +{ + return std::make_unique(*this); +} + XHatchEntry::XHatchEntry(const XHatch& rHatch, const OUString& rName) : XPropertyEntry(rName), m_aHatch(rHatch) @@ -72,6 +87,11 @@ XHatchEntry::XHatchEntry(const XHatchEntry& rOther) { } +std::unique_ptr XHatchEntry::Clone() const +{ + return std::make_unique(*this); +} + XGradientEntry::XGradientEntry(const basegfx::BGradient& rGradient, const OUString& rName) : XPropertyEntry(rName), m_aGradient(rGradient) @@ -84,6 +104,11 @@ XGradientEntry::XGradientEntry(const XGradientEntry& rOther) { } +std::unique_ptr XGradientEntry::Clone() const +{ + return std::make_unique(*this); +} + XBitmapEntry::XBitmapEntry(const GraphicObject& rGraphicObject, const OUString& rName) : XPropertyEntry(rName), maGraphicObject(rGraphicObject) @@ -96,6 +121,11 @@ XBitmapEntry::XBitmapEntry(const XBitmapEntry& rOther) { } +std::unique_ptr XBitmapEntry::Clone() const +{ + return std::make_unique(*this); +} + XPropertyList::XPropertyList( XPropertyListType type, OUString aPath, OUString aReferer @@ -105,6 +135,7 @@ XPropertyList::XPropertyList( maReferer (std::move( aReferer )), mbListDirty ( true ), mbEmbedInDocument( false ) + , mbNeedsExportableList(false) { // fprintf (stderr, "Create type %d count %d\n", (int)meType, count++); } @@ -183,6 +214,9 @@ void XPropertyList::Insert(std::unique_ptr pEntry, tools::Long n return; } + if (!pEntry->GetSavingAllowed()) + mbNeedsExportableList = true; + if (isValidIdx(nIndex)) { maList.insert( maList.begin()+nIndex, std::move(pEntry) ); } else { @@ -302,8 +336,27 @@ bool XPropertyList::Save() if( aURL.getExtension().isEmpty() ) aURL.setExtension( GetDefaultExt() ); + XPropertyListRef rExportableList = CreatePropertyList(meType, maPath, ""); + if (mbNeedsExportableList) + { + rExportableList->SetName(maName); + rExportableList->SetDirty(mbListDirty); + bool bHasUnsaveableEntry = false; + for (const std::unique_ptr& rEntry : maList) + { + if (rEntry->GetSavingAllowed()) + rExportableList->Insert(rEntry->Clone()); + else + bHasUnsaveableEntry = true; + } + if (!bHasUnsaveableEntry) + mbNeedsExportableList = false; + } + css::uno::Reference xExportableNameContainer + = mbNeedsExportableList ? rExportableList->createInstance() : createInstance(); + return SvxXMLXTableExportComponent::save( aURL.GetMainURL( INetURLObject::DecodeMechanism::NONE ), - createInstance(), + xExportableNameContainer, uno::Reference< embed::XStorage >(), nullptr ); } diff --git a/sw/qa/uitest/data/paragraphAreaFill.odt b/sw/qa/uitest/data/paragraphAreaFill.odt new file mode 100644 index 0000000000000000000000000000000000000000..01baf1592621c5d898ddfc24122047a9275d70ed GIT binary patch literal 169234 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

R|;XBJd`0~_qWOmI-(!r?kiEv65@m9tD@2F=t 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 BqDcS% literal 0 HcmV?d00001 diff --git a/sw/qa/uitest/writer_tests8/tdf125969.py b/sw/qa/uitest/writer_tests8/tdf125969.py new file mode 100644 index 000000000000..2334bec06fc4 --- /dev/null +++ b/sw/qa/uitest/writer_tests8/tdf125969.py @@ -0,0 +1,81 @@ +# -*- tab-width: 4; indent-tabs-mode: nil; py-indent-offset: 4 -*- +# +# This file is part of the LibreOffice project. +# +# This Source Code Form is subject to the terms of the Mozilla Public +# License, v. 2.0. If a copy of the MPL was not distributed with this +# file, You can obtain one at http://mozilla.org/MPL/2.0/. +# +from libreoffice.uno.propertyvalue import mkPropertyValues + +from uitest.framework import UITestCase +from uitest.uihelper.common import get_url_for_data_file +from uitest.uihelper.common import select_pos, get_state_as_dict +import time + +# bug 125969: make in-use bitmap-area-fill available for re-use, but ONLY IN THE SAME DOCUMENT +class tdf125969(UITestCase): + + number_of_images = 0 + + def click_button(self, dialog, button): + xButton = dialog.getChild(button) + xButton.executeAction("CLICK", tuple()) + + def test_tdf125969(self): + with self.ui_test.load_file(get_url_for_data_file("paragraphAreaFill.odt")): + xWriterDoc = self.xUITest.getTopFocusWindow() + xWriterEdit = xWriterDoc.getChild("writer_edit") + + self.xUITest.executeCommand(".uno:Sidebar") #turn on sidebar + xWriterEdit.executeAction("SIDEBAR", mkPropertyValues({"PANEL": "PageStylesPanel"})) + + # Get baseline from sidebar: count number of initially available bitmaps by default + backgroundType = xWriterEdit.getChild('bgselect') #type of background: color, gradient, ... + self.ui_test.wait_until_property_is_updated(backgroundType, "SelectEntryText", "Bitmap") + + imageCollection = xWriterEdit.getChild("lbbitmap") #listbox containing image names + number_of_images = get_state_as_dict(imageCollection)["EntryCount"] + # print (get_state_as_dict(imageCollection)) + # time.sleep (10) + + # The paragraph area has a custom background logo - which we want to become available + # for re-use everywhere as a background fill + + # visit the paragraph background property - which now auto-adds it to the collection + with self.ui_test.execute_dialog_through_command(".uno:ParagraphDialog", close_button="cancel") as xDialog: + tabcontrol = xDialog.getChild("tabcontrol") + select_pos(tabcontrol, "8") # area tab + #time.sleep(1) + + self.ui_test.wait_until_property_is_updated(imageCollection, "SelectEntryText", "Painted White") + # xToolkit = self.xContext.ServiceManager.createInstance('com.sun.star.awt.Toolkit') + # xToolkit.waitUntilAllIdlesDispatched() + time.sleep (1) + # test: the paragraph's wasta-offline logo was added and the list box was refreshed + self.assertEqual(int(number_of_images) + 1, int(get_state_as_dict(imageCollection)["EntryCount"])) + + # A new document must not have access to the collected images from another document + with self.ui_test.create_doc_in_start_center("writer"): + xWriterDoc = self.xUITest.getTopFocusWindow() + xWriterEdit = xWriterDoc.getChild("writer_edit") + + # because I don't know how to change the sidebar to bitmap mode, use the page dialog + with self.ui_test.execute_dialog_through_command(".uno:PageDialog", close_button="ok") as xDialog: + tabcontrol = xDialog.getChild("tabcontrol") + select_pos(tabcontrol, "2") # area tab + self.click_button(xDialog, 'btnbitmap') + #time.sleep (2) + + backgroundType = xWriterEdit.getChild('bgselect') + imageCollection = xWriterEdit.getChild("lbbitmap") + self.ui_test.wait_until_property_is_updated(backgroundType, "SelectEntryText", "Bitmap") + # This number MUST NOT be higher than the initial state. + # We must not allow document images to leak into the user profile + self.assertEqual(number_of_images, get_state_as_dict(imageCollection)["EntryCount"]) + #time.sleep (10) + + # xWriterEdit.getChild("bogus for debugging") + + self.xUITest.executeCommand(".uno:Sidebar") # good idea to turn off sidebar again +# vim: set shiftwidth=4 softtabstop=4 expandtab: