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)

Reply via email to