[Libreoffice-commits] core.git: Branch 'libreoffice-5-0' - 2 commits - sc/inc sc/source

Eike Rathke erack at redhat.com
Wed Jun 17 17:48:29 PDT 2015


 sc/inc/refdata.hxx               |    5 ++
 sc/source/core/inc/interpre.hxx  |    2 +
 sc/source/core/tool/interpr1.cxx |    5 +-
 sc/source/core/tool/interpr4.cxx |   20 ++++++++++
 sc/source/core/tool/refdata.cxx  |   73 ++++++++++++++++++++++++++++++++++++++-
 5 files changed, 101 insertions(+), 4 deletions(-)

New commits:
commit 7b7aac2402038c3c9aaeacbbd61c83618728b857
Author: Eike Rathke <erack at redhat.com>
Date:   Thu Jun 18 00:05:58 2015 +0200

    Resolves: tdf#83365 push proper references in INDIRECT
    
    ... that take relative/absolute addressing and sheet 3D flag into
    account to be fed to reference extension via range operator.
    
    Change-Id: Iabe13ae384577e2d71ca87af6482ddccbf7ad0ac
    (cherry picked from commit fb6dd2a73074b9695bd8ddf7ba40f1819b03024e)

diff --git a/sc/inc/refdata.hxx b/sc/inc/refdata.hxx
index ac27db8..e0d9b80 100644
--- a/sc/inc/refdata.hxx
+++ b/sc/inc/refdata.hxx
@@ -57,6 +57,8 @@ public:
     void InitAddress( SCCOL nCol, SCROW nRow, SCTAB nTab );
     /// InitAddressRel: InitFlags and set address, everything relative to rPos
     void InitAddressRel( const ScAddress& rAdr, const ScAddress& rPos );
+    /// InitFlags and set address, relative to rPos if rRef says so.
+    void InitFromRefAddress( const ScRefAddress& rRef, const ScAddress& rPos );
     sal_uInt8 FlagValue() const { return mnFlagValue;}
 
     void SetColRel( bool bVal ) { Flags.bColRel = bVal; }
@@ -135,6 +137,9 @@ struct ScComplexRefData
             Ref2.InitAddress( nCol2, nRow2, nTab2 );
         }
 
+    /// InitFlags and set range, relative to rPos if rRef1 and rRef2 say so.
+    void InitFromRefAddresses( const ScRefAddress& rRef1, const ScRefAddress& rRef2, const ScAddress& rPos );
+
     bool Valid() const;
 
     /** In external references nTab is -1 for the start tab and -1 for the end
diff --git a/sc/source/core/inc/interpre.hxx b/sc/source/core/inc/interpre.hxx
index 443164e..aea7c5f 100644
--- a/sc/source/core/inc/interpre.hxx
+++ b/sc/source/core/inc/interpre.hxx
@@ -333,6 +333,8 @@ void PushExternalSingleRef(sal_uInt16 nFileId, const OUString& rTabName,
 void PushExternalDoubleRef(sal_uInt16 nFileId, const OUString& rTabName,
                            SCCOL nCol1, SCROW nRow1, SCTAB nTab1,
                            SCCOL nCol2, SCROW nRow2, SCTAB nTab2);
+void PushSingleRef( const ScRefAddress& rRef );
+void PushDoubleRef( const ScRefAddress& rRef1, const ScRefAddress& rRef2 );
 void PushMatrix( const sc::RangeMatrix& rMat );
 void PushMatrix(const ScMatrixRef& pMat);
 void PushError( sal_uInt16 nError );
diff --git a/sc/source/core/tool/interpr1.cxx b/sc/source/core/tool/interpr1.cxx
index 66eef72..df14604 100644
--- a/sc/source/core/tool/interpr1.cxx
+++ b/sc/source/core/tool/interpr1.cxx
@@ -7052,8 +7052,7 @@ void ScInterpreter::ScIndirect()
                     aRefAd2.Col(), aRefAd2.Row(), aRefAd2.Tab());
             }
             else
-                PushDoubleRef( aRefAd.Col(), aRefAd.Row(), aRefAd.Tab(),
-                        aRefAd2.Col(), aRefAd2.Row(), aRefAd2.Tab() );
+                PushDoubleRef( aRefAd, aRefAd2);
         }
         else if (ConvertSingleRef(pDok, sRefStr, nTab, aRefAd, aDetails, &aExtInfo))
         {
@@ -7063,7 +7062,7 @@ void ScInterpreter::ScIndirect()
                     aExtInfo.mnFileId, aExtInfo.maTabName, aRefAd.Col(), aRefAd.Row(), aRefAd.Tab());
             }
             else
-                PushSingleRef( aRefAd.Col(), aRefAd.Row(), aRefAd.Tab() );
+                PushSingleRef( aRefAd);
         }
         else
         {
diff --git a/sc/source/core/tool/interpr4.cxx b/sc/source/core/tool/interpr4.cxx
index 2e8ae00..18dee8e 100644
--- a/sc/source/core/tool/interpr4.cxx
+++ b/sc/source/core/tool/interpr4.cxx
@@ -1968,6 +1968,26 @@ void ScInterpreter::PushExternalDoubleRef(
     }
 }
 
+void ScInterpreter::PushSingleRef( const ScRefAddress& rRef )
+{
+    if (!IfErrorPushError())
+    {
+        ScSingleRefData aRef;
+        aRef.InitFromRefAddress( rRef, aPos);
+        PushTempTokenWithoutError( new ScSingleRefToken( aRef ) );
+    }
+}
+
+void ScInterpreter::PushDoubleRef( const ScRefAddress& rRef1, const ScRefAddress& rRef2 )
+{
+    if (!IfErrorPushError())
+    {
+        ScComplexRefData aRef;
+        aRef.InitFromRefAddresses( rRef1, rRef2, aPos);
+        PushTempTokenWithoutError( new ScDoubleRefToken( aRef ) );
+    }
+}
+
 void ScInterpreter::PushMatrix( const sc::RangeMatrix& rMat )
 {
     if (!rMat.isRangeValid())
diff --git a/sc/source/core/tool/refdata.cxx b/sc/source/core/tool/refdata.cxx
index af18610..97d419c 100644
--- a/sc/source/core/tool/refdata.cxx
+++ b/sc/source/core/tool/refdata.cxx
@@ -41,6 +41,16 @@ void ScSingleRefData::InitAddressRel( const ScAddress& rAdr, const ScAddress& rP
     SetAddress(rAdr, rPos);
 }
 
+void ScSingleRefData::InitFromRefAddress( const ScRefAddress& rRef, const ScAddress& rPos )
+{
+    InitFlags();
+    SetColRel( rRef.IsRelCol());
+    SetRowRel( rRef.IsRelRow());
+    SetTabRel( rRef.IsRelTab());
+    SetFlag3D( rRef.Tab() != rPos.Tab());
+    SetAddress( rRef.GetAddress(), rPos);
+}
+
 void ScSingleRefData::SetAbsCol( SCCOL nVal )
 {
     Flags.bColRel = false;
@@ -257,6 +267,20 @@ void ScSingleRefData::Dump( int nIndent ) const
 }
 #endif
 
+void ScComplexRefData::InitFromRefAddresses( const ScRefAddress& rRef1, const ScRefAddress& rRef2, const ScAddress& rPos )
+{
+    InitFlags();
+    Ref1.SetColRel( rRef1.IsRelCol());
+    Ref1.SetRowRel( rRef1.IsRelRow());
+    Ref1.SetTabRel( rRef1.IsRelTab());
+    Ref1.SetFlag3D( rRef1.Tab() != rPos.Tab() || rRef1.Tab() != rRef2.Tab());
+    Ref2.SetColRel( rRef2.IsRelCol());
+    Ref2.SetRowRel( rRef2.IsRelRow());
+    Ref2.SetTabRel( rRef2.IsRelTab());
+    Ref2.SetFlag3D( rRef1.Tab() != rRef2.Tab());
+    SetRange( ScRange( rRef1.GetAddress(), rRef2.GetAddress()), rPos);
+}
+
 ScComplexRefData& ScComplexRefData::Extend( const ScSingleRefData & rRef, const ScAddress & rPos )
 {
     bool bInherit3D = (Ref1.IsFlag3D() && !Ref2.IsFlag3D() && !rRef.IsFlag3D());
commit a60fc4bf72bd4cecda8b50a4b62b0c14101f8a58
Author: Eike Rathke <erack at redhat.com>
Date:   Wed Jun 17 17:12:49 2015 +0200

    properly inherit relative and 3D flags when extending, tdf#83365 related
    
    Commit 194e9f9bae28bdf22a9ed4779c1656ee693f3302 oversimplified things.
    
    Change-Id: Iea6a84c4a7be49af036690afbb1512ae2c1045a2
    (cherry picked from commit e503addfbbe45efe1a3c06392c66fb79c3c72d07)

diff --git a/sc/source/core/tool/refdata.cxx b/sc/source/core/tool/refdata.cxx
index d508247..af18610 100644
--- a/sc/source/core/tool/refdata.cxx
+++ b/sc/source/core/tool/refdata.cxx
@@ -259,8 +259,22 @@ void ScSingleRefData::Dump( int nIndent ) const
 
 ScComplexRefData& ScComplexRefData::Extend( const ScSingleRefData & rRef, const ScAddress & rPos )
 {
+    bool bInherit3D = (Ref1.IsFlag3D() && !Ref2.IsFlag3D() && !rRef.IsFlag3D());
     ScRange aAbsRange = toAbs(rPos);
-    ScAddress aAbs = rRef.toAbs(rPos);
+
+    ScSingleRefData aRef = rRef;
+    // If no sheet was given in the extending part, let it point to the same
+    // sheet as this reference's end point, inheriting the absolute/relative
+    // mode.
+    // [$]Sheet1.A5:A6:A7 on Sheet2 do still reference only Sheet1.
+    if (!rRef.IsFlag3D())
+    {
+        if (Ref2.IsTabRel())
+            aRef.SetRelTab( Ref2.Tab());
+        else
+            aRef.SetAbsTab( Ref2.Tab());
+    }
+    ScAddress aAbs = aRef.toAbs(rPos);
 
     if (aAbs.Col() < aAbsRange.aStart.Col())
         aAbsRange.aStart.SetCol(aAbs.Col());
@@ -280,6 +294,39 @@ ScComplexRefData& ScComplexRefData::Extend( const ScSingleRefData & rRef, const
     if (aAbsRange.aEnd.Tab() < aAbs.Tab())
         aAbsRange.aEnd.SetTab(aAbs.Tab());
 
+    // In Ref2 inherit absolute/relative addressing from the extending part.
+    // A$5:A5 => A$5:A$5:A5 => A$5:A5, and not A$5:A$5
+    // A$6:$A5 => A$6:A$6:$A5 => A5:$A$6
+    if (aAbsRange.aEnd.Col() == aAbs.Col())
+        Ref2.SetColRel( rRef.IsColRel());
+    if (aAbsRange.aEnd.Row() == aAbs.Row())
+        Ref2.SetRowRel( rRef.IsRowRel());
+
+    // In Ref1 inherit relative sheet from extending part if given.
+    if (aAbsRange.aStart.Tab() == aAbs.Tab() && rRef.IsFlag3D())
+        Ref1.SetTabRel( rRef.IsTabRel());
+
+    // In Ref2 inherit relative sheet from either Ref1 or extending part.
+    // Use the original 3D flags to determine which.
+    // $Sheet1.$A$5:$A$6 => $Sheet1.$A$5:$A$5:$A$6 => $Sheet1.$A$5:$A$6, and
+    // not $Sheet1.$A$5:Sheet1.$A$6 (with invisible second 3D, but relative).
+    if (aAbsRange.aEnd.Tab() == aAbs.Tab())
+        Ref2.SetTabRel( bInherit3D ? Ref1.IsTabRel() : rRef.IsTabRel());
+
+    // Force 3D flag in Ref1 if different sheet or more than one sheet
+    // referenced.
+    if (aAbsRange.aStart.Tab() != rPos.Tab() || aAbsRange.aStart.Tab() != aAbsRange.aEnd.Tab())
+        Ref1.SetFlag3D(true);
+
+    // Force 3D flag in Ref2 if more than one sheet referenced.
+    if (aAbsRange.aStart.Tab() != aAbsRange.aEnd.Tab())
+        Ref2.SetFlag3D(true);
+
+    // Inherit 3D flag in Ref1 from extending part in case range wasn't
+    // extended as in A5:A5:Sheet1.A5 if on Sheet1.
+    if (rRef.IsFlag3D())
+        Ref1.SetFlag3D( true);
+
     SetRange(aAbsRange, rPos);
 
     return *this;


More information about the Libreoffice-commits mailing list