editeng/source/editeng/editview.cxx | 10 ++++++++ editeng/source/editeng/impedit.cxx | 23 +++++++++++++++++++ editeng/source/editeng/impedit.hxx | 2 + include/editeng/editview.hxx | 2 + sd/source/ui/func/fuformatpaintbrush.cxx | 36 +++++++++++++++++++++++++------ sw/source/uibase/docvw/edtwin.cxx | 5 +++- 6 files changed, 71 insertions(+), 7 deletions(-)
New commits: commit 5eea6974d937148a9a1f3d078c2174fe8d420d31 Author: Sarper Akdemir <sarper.akdemir.ext...@allotropia.de> AuthorDate: Mon Jul 31 17:11:04 2023 +0300 Commit: Sarper Akdemir <sarper.akdemir.ext...@allotropia.de> CommitDate: Tue Aug 29 11:06:44 2023 +0200 tdf#103706: tdf#142857: sd: context aware paste for clone format Introduces selection aware pasting for Impress/Draw's Clone Format where paragraph properties are applied when the selection contains a whole paragraph or there's no selection at all (i.e. clone format applied with just a left click - without drag). Change-Id: I37e7197580c2b8da333ada1a60408f40f85d7ef5 Reviewed-on: https://gerrit.libreoffice.org/c/core/+/155108 Tested-by: Jenkins Reviewed-by: Sarper Akdemir <sarper.akdemir.ext...@allotropia.de> diff --git a/editeng/source/editeng/editview.cxx b/editeng/source/editeng/editview.cxx index 72e9aec2dc3d..72411fab6588 100644 --- a/editeng/source/editeng/editview.cxx +++ b/editeng/source/editeng/editview.cxx @@ -316,6 +316,16 @@ bool EditView::HasSelection() const return pImpEditView->HasSelection(); } +bool EditView::IsSelectionFullPara() const +{ + return pImpEditView->IsSelectionFullPara(); +} + +bool EditView::IsSelectionWithinSinglePara() const +{ + return pImpEditView->IsSelectionInSinglePara(); +} + bool EditView::IsSelectionAtPoint(const Point& rPointPixel) { return pImpEditView->IsSelectionAtPoint(rPointPixel); diff --git a/editeng/source/editeng/impedit.cxx b/editeng/source/editeng/impedit.cxx index f69b0d1cad82..8813376dacdd 100644 --- a/editeng/source/editeng/impedit.cxx +++ b/editeng/source/editeng/impedit.cxx @@ -2049,6 +2049,29 @@ bool ImpEditView::IsInSelection( const EditPaM& rPaM ) return false; } +bool ImpEditView::IsSelectionFullPara() const +{ + if (!IsSelectionInSinglePara()) + return false; + + sal_Int32 nSelectionStartPos = GetEditSelection().Min().GetIndex(); + sal_Int32 nSelectionEndPos = GetEditSelection().Max().GetIndex(); + + if (nSelectionStartPos > nSelectionEndPos) + std::swap(nSelectionStartPos, nSelectionEndPos); + + if (nSelectionStartPos != 0) + return false; + + const ContentNode* pNode = GetEditSelection().Min().GetNode(); + return pNode->Len() == nSelectionEndPos; +} + +bool ImpEditView::IsSelectionInSinglePara() const +{ + return GetEditSelection().Min().GetNode() == GetEditSelection().Max().GetNode(); +} + void ImpEditView::CreateAnchor() { pEditEngine->SetInSelectionMode(true); diff --git a/editeng/source/editeng/impedit.hxx b/editeng/source/editeng/impedit.hxx index 815c42328ba8..2fba7bd778f4 100644 --- a/editeng/source/editeng/impedit.hxx +++ b/editeng/source/editeng/impedit.hxx @@ -420,6 +420,8 @@ public: bool IsSelectionAtPoint( const Point& rPosPixel ); bool IsInSelection( const EditPaM& rPaM ); + bool IsSelectionFullPara() const; + bool IsSelectionInSinglePara() const; void SetAnchorMode( EEAnchorMode eMode ); EEAnchorMode GetAnchorMode() const { return eAnchorMode; } diff --git a/include/editeng/editview.hxx b/include/editeng/editview.hxx index 1ea777eb7d91..c7c7507a9ba8 100644 --- a/include/editeng/editview.hxx +++ b/include/editeng/editview.hxx @@ -219,6 +219,8 @@ public: void SelectCurrentWord( sal_Int16 nWordType = css::i18n::WordType::ANYWORD_IGNOREWHITESPACES ); /// Returns the rectangles of the current selection in TWIPs. void GetSelectionRectangles(std::vector<tools::Rectangle>& rLogicRects) const; + bool IsSelectionFullPara() const; + bool IsSelectionWithinSinglePara() const; bool IsInsertMode() const; void SetInsertMode( bool bInsert ); diff --git a/sd/source/ui/func/fuformatpaintbrush.cxx b/sd/source/ui/func/fuformatpaintbrush.cxx index 40bde764ffaa..0d2b29d33d75 100644 --- a/sd/source/ui/func/fuformatpaintbrush.cxx +++ b/sd/source/ui/func/fuformatpaintbrush.cxx @@ -37,6 +37,25 @@ #include <Window.hxx> +namespace +{ +// Paragraph properties are pasted if the selection contains a whole paragraph +// or there was no selection at all (i.e. just a left click) +bool ShouldPasteParaFormatPerSelection(const OutlinerView* pOLV) +{ + if(!pOLV) + return true; + + if(!pOLV->GetEditView().HasSelection()) + return true; + + if(!pOLV->GetEditView().IsSelectionWithinSinglePara()) + return true; + + return pOLV->GetEditView().IsSelectionFullPara(); +} +} + namespace sd { @@ -165,16 +184,21 @@ bool FuFormatPaintBrush::MouseButtonUp(const MouseEvent& rMEvt) { if( mxItemSet && mpView && mpView->AreObjectsMarked() ) { + OutlinerView* pOLV = mpView->GetTextEditOutlinerView(); + bool bNoCharacterFormats = false; - bool bNoParagraphFormats = false; + bool bNoParagraphFormats = !ShouldPasteParaFormatPerSelection(pOLV); + + if ((rMEvt.GetModifier() & KEY_MOD1) && (rMEvt.GetModifier() & KEY_SHIFT)) + { + bNoCharacterFormats = true; + bNoParagraphFormats = false; + } + else if (rMEvt.GetModifier() & KEY_MOD1) { - if( (rMEvt.GetModifier()&KEY_MOD1) && (rMEvt.GetModifier()&KEY_SHIFT) ) - bNoCharacterFormats = true; - else if( rMEvt.GetModifier() & KEY_MOD1 ) - bNoParagraphFormats = true; + bNoParagraphFormats = true; } - OutlinerView* pOLV = mpView->GetTextEditOutlinerView(); if( pOLV ) pOLV->MouseButtonUp(rMEvt); commit 7b5327ffcb18a4b4f456afecea313039dd79449a Author: Sarper Akdemir <sarper.akdemir.ext...@allotropia.de> AuthorDate: Mon Jul 31 14:05:08 2023 +0300 Commit: Sarper Akdemir <sarper.akdemir.ext...@allotropia.de> CommitDate: Tue Aug 29 11:06:37 2023 +0200 tdf#103706: tdf#142857: sw: context aware paste for clone format Introduces selection aware pasting for Writer's Clone Format where paragraph properties are applied when the selection contains a whole paragraph or there's no selection at all (i.e. clone format applied with just a left click - without drag). Change-Id: I9f3eedb4544bf53dabed4bb659ce2e44313a692a Reviewed-on: https://gerrit.libreoffice.org/c/core/+/155107 Tested-by: Jenkins Reviewed-by: Sarper Akdemir <sarper.akdemir.ext...@allotropia.de> diff --git a/sw/source/uibase/docvw/edtwin.cxx b/sw/source/uibase/docvw/edtwin.cxx index aa97df53e8ab..ba05f034cafd 100644 --- a/sw/source/uibase/docvw/edtwin.cxx +++ b/sw/source/uibase/docvw/edtwin.cxx @@ -5102,7 +5102,10 @@ void SwEditWin::MouseButtonUp(const MouseEvent& rMEvt) SwWrtShell& rWrtShell = m_rView.GetWrtShell(); SfxStyleSheetBasePool* pPool=nullptr; bool bNoCharacterFormats = false; - bool bNoParagraphFormats = false; + // Paste paragraph properties if the selection contains a whole paragraph or + // there was no selection at all (i.e. just a left click) + bool bNoParagraphFormats = rSh.HasSelection() && rSh.IsSelOnePara() && !rSh.IsSelFullPara(); + { SwDocShell* pDocSh = m_rView.GetDocShell(); if(pDocSh)