summaryrefslogtreecommitdiff
path: root/sc
diff options
context:
space:
mode:
authorEike Rathke <erack@redhat.com>2023-05-16 17:33:36 +0200
committerAndras Timar <andras.timar@collabora.com>2023-05-21 13:28:40 +0200
commitfdc42e11634b97fcbf226d1824fe9b8acd3ca822 (patch)
tree371244e526203377fdcf399de444e97fb3fd7a1b /sc
parent323c3bc92f0169aed6ea1bc03270aec5050b4bc9 (diff)
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 <erack@redhat.com> Tested-by: Jenkins (cherry picked from commit fcb66a74ae3af322b2829040bb84669d5c63e568) Reviewed-on: https://gerrit.libreoffice.org/c/core/+/151782 Reviewed-by: Christian Lohmaier <lohmaier+LibreOffice@googlemail.com>
Diffstat (limited to 'sc')
-rw-r--r--sc/source/core/tool/token.cxx35
1 files changed, 28 insertions, 7 deletions
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: