sc/source/core/tool/token.cxx |   35 ++++++++++++++++++++++++++++-------
 1 file changed, 28 insertions(+), 7 deletions(-)

New commits:
commit 41fb05d4b21ab8fd5a522ff8eba6844333fbf4cf
Author:     Eike Rathke <er...@redhat.com>
AuthorDate: Tue May 16 17:33:36 2023 +0200
Commit:     Christian Lohmaier <lohmaier+libreoff...@googlemail.com>
CommitDate: Wed May 17 14:02:49 2023 +0200

    Resolves: tdf#153790 Suppress duplicated end part sheet reference, 
tdf#103890
    
    Also keep explicitly given sheet reference relative to the same
    sheet as user wished.
    
    Affected only when moving formula cell position like with
    cut&paste and drag&drop.
    
    Change-Id: I6b1da6aea58b88a24567189ef6aa212dab01de49
    Reviewed-on: https://gerrit.libreoffice.org/c/core/+/151845
    Reviewed-by: Eike Rathke <er...@redhat.com>
    Tested-by: Jenkins
    (cherry picked from commit fcb66a74ae3af322b2829040bb84669d5c63e568)
    Reviewed-on: https://gerrit.libreoffice.org/c/core/+/151782
    Reviewed-by: Christian Lohmaier <lohmaier+libreoff...@googlemail.com>

diff --git a/sc/source/core/tool/token.cxx b/sc/source/core/tool/token.cxx
index 4315f017e67c..337a2fb86d21 100644
--- a/sc/source/core/tool/token.cxx
+++ b/sc/source/core/tool/token.cxx
@@ -3416,7 +3416,7 @@ sc::RefUpdateResult ScTokenArray::AdjustReferenceOnMove(
                         }
 
                         rRef.SetAddress(*mxSheetLimits, aAbs, rNewPos);
-                        rRef.SetFlag3D(aAbs.Tab() != rNewPos.Tab() || 
!rRef.IsTabRel());
+                        rRef.SetFlag3D(rRef.IsFlag3D() || !rRef.IsTabRel() || 
aAbs.Tab() != rNewPos.Tab());
                     }
                     break;
                 case svDoubleRef:
@@ -3446,12 +3446,33 @@ sc::RefUpdateResult ScTokenArray::AdjustReferenceOnMove(
                         }
 
                         rRef.SetRange(*mxSheetLimits, aAbs, rNewPos);
-                        // Absolute sheet reference => set 3D flag.
-                        // More than one sheet referenced => has to have both 
3D flags.
-                        // If end part has 3D flag => start part must have it 
too.
-                        rRef.Ref2.SetFlag3D(aAbs.aStart.Tab() != 
aAbs.aEnd.Tab() || !rRef.Ref2.IsTabRel());
-                        rRef.Ref1.SetFlag3D(aAbs.aStart.Tab() != rNewPos.Tab() 
|| !rRef.Ref1.IsTabRel() ||
-                                rRef.Ref2.IsFlag3D());
+                        bool b1, b2;
+                        if (aAbs.aStart.Tab() != aAbs.aEnd.Tab())
+                        {
+                            // More than one sheet referenced => has to have
+                            // both 3D flags.
+                            b1 = b2 = true;
+                        }
+                        else
+                        {
+                            // Keep given 3D flag even for relative sheet
+                            // reference to same sheet.
+                            // Absolute sheet reference => set 3D flag.
+                            // Reference to another sheet => set 3D flag.
+                            b1 = rRef.Ref1.IsFlag3D() || !rRef.Ref1.IsTabRel() 
|| rNewPos.Tab() != aAbs.aStart.Tab();
+                            b2 = rRef.Ref2.IsFlag3D() || !rRef.Ref2.IsTabRel() 
|| rNewPos.Tab() != aAbs.aEnd.Tab();
+                            // End part has 3D flag => start part must have it 
too.
+                            if (b2)
+                                b1 = true;
+                            // End part sheet reference is identical to start
+                            // part sheet reference and end part sheet
+                            // reference was not explicitly given => clear end
+                            // part 3D flag.
+                            if (b1 && b2 && rRef.Ref1.IsTabRel() == 
rRef.Ref2.IsTabRel() && !rRef.Ref2.IsFlag3D())
+                                b2 = false;
+                        }
+                        rRef.Ref1.SetFlag3D(b1);
+                        rRef.Ref2.SetFlag3D(b2);
                     }
                     break;
                 case svExternalSingleRef:

Reply via email to