diff options
author | Kurt Zenker <kz@openoffice.org> | 2008-03-06 14:37:49 +0000 |
---|---|---|
committer | Kurt Zenker <kz@openoffice.org> | 2008-03-06 14:37:49 +0000 |
commit | 3c725fd6347061ad7b8712185a997d9da246b377 (patch) | |
tree | 297b7d900802386815930bec4703b9c9c4c151ee /sc/source/core | |
parent | f1d75266fa6b020d171824ef27dff3b571245905 (diff) |
INTEGRATION: CWS odff (1.5.318); FILE MERGED
2008/02/07 13:10:02 er 1.5.318.4: Always wanted to do this, now I'm taking the opportunity: :retab on selected files and all tabs are gone, producing hopefully easier to read diffs in future.
2007/12/05 22:13:38 er 1.5.318.3: #i4904# ocRange: treat Flag3D as expected by stringizer and UI
2007/11/30 18:30:55 er 1.5.318.2: #i4904# ocRange: if sheet reference not given adjust inherited from first SingleRef
2007/11/29 19:06:46 er 1.5.318.1: #i4904# range operator ocRange
Diffstat (limited to 'sc/source/core')
-rw-r--r-- | sc/source/core/tool/refdata.cxx | 178 |
1 files changed, 118 insertions, 60 deletions
diff --git a/sc/source/core/tool/refdata.cxx b/sc/source/core/tool/refdata.cxx index 53e2be68e748..da181f5a4e2b 100644 --- a/sc/source/core/tool/refdata.cxx +++ b/sc/source/core/tool/refdata.cxx @@ -4,9 +4,9 @@ * * $RCSfile: refdata.cxx,v $ * - * $Revision: 1.5 $ + * $Revision: 1.6 $ * - * last change: $Author: kz $ $Date: 2006-07-21 11:42:25 $ + * last change: $Author: kz $ $Date: 2008-03-06 15:37:49 $ * * The Contents of this file are made available subject to * the terms of GNU Lesser General Public License Version 2.1. @@ -206,99 +206,157 @@ BOOL SingleRefData::operator==( const SingleRefData& r ) const } -// Abs-Refs muessen vorher aktualisiert werden! -// wird in refupdat.cxx mit MoveRelWrap verwendet -void ComplRefData::PutInOrder() +static void lcl_putInOrder( SingleRefData & rRef1, SingleRefData & rRef2 ) { SCCOL nCol1, nCol2; SCROW nRow1, nRow2; SCTAB nTab1, nTab2; BOOL bTmp; BYTE nRelState1, nRelState2; - if ( Ref1.Flags.bRelName ) + if ( rRef1.Flags.bRelName ) nRelState1 = - ((Ref1.Flags.bTabRel & 0x01) << 2) - | ((Ref1.Flags.bRowRel & 0x01) << 1) - | ((Ref1.Flags.bColRel & 0x01)); + ((rRef1.Flags.bTabRel & 0x01) << 2) + | ((rRef1.Flags.bRowRel & 0x01) << 1) + | ((rRef1.Flags.bColRel & 0x01)); else nRelState1 = 0; - if ( Ref2.Flags.bRelName ) + if ( rRef2.Flags.bRelName ) nRelState2 = - ((Ref2.Flags.bTabRel & 0x01) << 2) - | ((Ref2.Flags.bRowRel & 0x01) << 1) - | ((Ref2.Flags.bColRel & 0x01)); + ((rRef2.Flags.bTabRel & 0x01) << 2) + | ((rRef2.Flags.bRowRel & 0x01) << 1) + | ((rRef2.Flags.bColRel & 0x01)); else nRelState2 = 0; - if ( (nCol1 = Ref1.nCol) > (nCol2 = Ref2.nCol) ) + if ( (nCol1 = rRef1.nCol) > (nCol2 = rRef2.nCol) ) { - Ref1.nCol = nCol2; - Ref2.nCol = nCol1; - nCol1 = Ref1.nRelCol; - Ref1.nRelCol = Ref2.nRelCol; - Ref2.nRelCol = nCol1; - if ( Ref1.Flags.bRelName && Ref1.Flags.bColRel ) + rRef1.nCol = nCol2; + rRef2.nCol = nCol1; + nCol1 = rRef1.nRelCol; + rRef1.nRelCol = rRef2.nRelCol; + rRef2.nRelCol = nCol1; + if ( rRef1.Flags.bRelName && rRef1.Flags.bColRel ) nRelState2 |= 1; else nRelState2 &= ~1; - if ( Ref2.Flags.bRelName && Ref2.Flags.bColRel ) + if ( rRef2.Flags.bRelName && rRef2.Flags.bColRel ) nRelState1 |= 1; else nRelState1 &= ~1; - bTmp = Ref1.Flags.bColRel; - Ref1.Flags.bColRel = Ref2.Flags.bColRel; - Ref2.Flags.bColRel = bTmp; - bTmp = Ref1.Flags.bColDeleted; - Ref1.Flags.bColDeleted = Ref2.Flags.bColDeleted; - Ref2.Flags.bColDeleted = bTmp; + bTmp = rRef1.Flags.bColRel; + rRef1.Flags.bColRel = rRef2.Flags.bColRel; + rRef2.Flags.bColRel = bTmp; + bTmp = rRef1.Flags.bColDeleted; + rRef1.Flags.bColDeleted = rRef2.Flags.bColDeleted; + rRef2.Flags.bColDeleted = bTmp; } - if ( (nRow1 = Ref1.nRow) > (nRow2 = Ref2.nRow) ) + if ( (nRow1 = rRef1.nRow) > (nRow2 = rRef2.nRow) ) { - Ref1.nRow = nRow2; - Ref2.nRow = nRow1; - nRow1 = Ref1.nRelRow; - Ref1.nRelRow = Ref2.nRelRow; - Ref2.nRelRow = nRow1; - if ( Ref1.Flags.bRelName && Ref1.Flags.bRowRel ) + rRef1.nRow = nRow2; + rRef2.nRow = nRow1; + nRow1 = rRef1.nRelRow; + rRef1.nRelRow = rRef2.nRelRow; + rRef2.nRelRow = nRow1; + if ( rRef1.Flags.bRelName && rRef1.Flags.bRowRel ) nRelState2 |= 2; else nRelState2 &= ~2; - if ( Ref2.Flags.bRelName && Ref2.Flags.bRowRel ) + if ( rRef2.Flags.bRelName && rRef2.Flags.bRowRel ) nRelState1 |= 2; else nRelState1 &= ~2; - bTmp = Ref1.Flags.bRowRel; - Ref1.Flags.bRowRel = Ref2.Flags.bRowRel; - Ref2.Flags.bRowRel = bTmp; - bTmp = Ref1.Flags.bRowDeleted; - Ref1.Flags.bRowDeleted = Ref2.Flags.bRowDeleted; - Ref2.Flags.bRowDeleted = bTmp; + bTmp = rRef1.Flags.bRowRel; + rRef1.Flags.bRowRel = rRef2.Flags.bRowRel; + rRef2.Flags.bRowRel = bTmp; + bTmp = rRef1.Flags.bRowDeleted; + rRef1.Flags.bRowDeleted = rRef2.Flags.bRowDeleted; + rRef2.Flags.bRowDeleted = bTmp; } - if ( (nTab1 = Ref1.nTab) > (nTab2 = Ref2.nTab) ) + if ( (nTab1 = rRef1.nTab) > (nTab2 = rRef2.nTab) ) { - Ref1.nTab = nTab2; - Ref2.nTab = nTab1; - nTab1 = Ref1.nRelTab; - Ref1.nRelTab = Ref2.nRelTab; - Ref2.nRelTab = nTab1; - if ( Ref1.Flags.bRelName && Ref1.Flags.bTabRel ) + rRef1.nTab = nTab2; + rRef2.nTab = nTab1; + nTab1 = rRef1.nRelTab; + rRef1.nRelTab = rRef2.nRelTab; + rRef2.nRelTab = nTab1; + if ( rRef1.Flags.bRelName && rRef1.Flags.bTabRel ) nRelState2 |= 4; else nRelState2 &= ~4; - if ( Ref2.Flags.bRelName && Ref2.Flags.bTabRel ) + if ( rRef2.Flags.bRelName && rRef2.Flags.bTabRel ) nRelState1 |= 4; else nRelState1 &= ~4; - bTmp = Ref1.Flags.bTabRel; - Ref1.Flags.bTabRel = Ref2.Flags.bTabRel; - Ref2.Flags.bTabRel = bTmp; - bTmp = Ref1.Flags.bTabDeleted; - Ref1.Flags.bTabDeleted = Ref2.Flags.bTabDeleted; - Ref2.Flags.bTabDeleted = bTmp; - bTmp = Ref1.Flags.bFlag3D; - Ref1.Flags.bFlag3D = Ref2.Flags.bFlag3D; - Ref2.Flags.bFlag3D = bTmp; + bTmp = rRef1.Flags.bTabRel; + rRef1.Flags.bTabRel = rRef2.Flags.bTabRel; + rRef2.Flags.bTabRel = bTmp; + bTmp = rRef1.Flags.bTabDeleted; + rRef1.Flags.bTabDeleted = rRef2.Flags.bTabDeleted; + rRef2.Flags.bTabDeleted = bTmp; + } + rRef1.Flags.bRelName = ( nRelState1 ? TRUE : FALSE ); + rRef2.Flags.bRelName = ( nRelState2 ? TRUE : FALSE ); +} + + +void ComplRefData::PutInOrder() +{ + lcl_putInOrder( Ref1, Ref2); +} + + +static void lcl_adjustInOrder( SingleRefData & rRef1, SingleRefData & rRef2, bool bFirstLeader ) +{ + // a1:a2:a3, bFirstLeader: rRef1==a1==r1, rRef2==a3==r2 + // else: rRef1==a3==r2, rRef2==a2==r1 + SingleRefData& r1 = (bFirstLeader ? rRef1 : rRef2); + SingleRefData& r2 = (bFirstLeader ? rRef2 : rRef1); + if (r1.Flags.bFlag3D && !r2.Flags.bFlag3D) + { + // [$]Sheet1.A5:A6 on Sheet2 do still refer only Sheet1. + r2.nTab = r1.nTab; + r2.nRelTab = r1.nRelTab; + r2.Flags.bTabRel = r1.Flags.bTabRel; } - Ref1.Flags.bRelName = ( nRelState1 ? TRUE : FALSE ); - Ref2.Flags.bRelName = ( nRelState2 ? TRUE : FALSE ); + lcl_putInOrder( rRef1, rRef2); } + +ComplRefData& ComplRefData::Extend( const SingleRefData & rRef, const ScAddress & rPos ) +{ + CalcAbsIfRel( rPos); + SingleRefData aRef = rRef; + aRef.CalcAbsIfRel( rPos); + bool bInherit3D = Ref1.IsFlag3D() && !Ref2.IsFlag3D(); + bool bInherit3Dtemp = bInherit3D && !rRef.IsFlag3D(); + if (aRef.nCol < Ref1.nCol || aRef.nRow < Ref1.nRow || aRef.nTab < Ref1.nTab) + { + lcl_adjustInOrder( Ref1, aRef, true); + aRef = rRef; + aRef.CalcAbsIfRel( rPos); + } + if (aRef.nCol > Ref2.nCol || aRef.nRow > Ref2.nRow || aRef.nTab > Ref2.nTab) + { + if (bInherit3D) + Ref2.SetFlag3D( true); + lcl_adjustInOrder( aRef, Ref2, false); + if (bInherit3Dtemp) + Ref2.SetFlag3D( false); + } + // Force 3D if necessary. References to other sheets always. + if (Ref1.nTab != rPos.Tab()) + Ref1.SetFlag3D( true); + // In the second part only if different sheet thus not inherited. + if (Ref2.nTab != Ref1.nTab) + Ref2.SetFlag3D( true); + // Merge Flag3D to Ref2 in case there was nothing to inherit and/or range + // wasn't extended as in A5:A5:Sheet1.A5 if on Sheet1. + if (!Ref1.IsFlag3D() && !Ref2.IsFlag3D() && rRef.IsFlag3D()) + Ref2.SetFlag3D( true); + return *this; +} + + +ComplRefData& ComplRefData::Extend( const ComplRefData & rRef, const ScAddress & rPos ) +{ + return Extend( rRef.Ref1, rPos).Extend( rRef.Ref2, rPos); +} |