diff options
author | Eike Rathke <erack@redhat.com> | 2014-08-14 23:36:47 +0200 |
---|---|---|
committer | Andras Timar <andras.timar@collabora.com> | 2014-08-23 07:43:15 -0700 |
commit | 84584cc237b2eb93f7684d8fcd063bb37e87b5fb (patch) | |
tree | 3f7e759cdda73628b5987656116ed9cf9328700a /sc/source/core/data/bcaslot.cxx | |
parent | 8ecff2710f0ea19c9048900e7d5399471e262c47 (diff) |
correct references after sort, fdo#79441cp-4.2-8
5c6ee09126631342939ae8766fe36083d8c011e3 introduced a different
algorithm for reference handling during sort. Unfortunately that clashed
with the SC_CLONECELL_ADJUST3DREL introduced a little earlier resulting
in relative 3D references effectively being "adjusted" twice.
Furthermore, in-sort-range range references to one row (or column) were
not adapted to the move at all if the formula within the range listened
only to ranges and not a single cell. Added collecting and adjusting
area listeners for this.
Last but not least, external (relative) references need to be treated
the same as internal 3D references, making them point to the same
location after the sort.
(cherry picked from commit 69adec3ec051ff94f600ab899506ca9d645a8b56)
Conflicts:
sc/inc/types.hxx
sc/source/core/data/bcaslot.cxx
Plus necessary parts of 27182231acd3a0c9898a8dba78b76dc8a827b4c0 related
to bcaslot changes.
Change-Id: I492768b525f95f1c43d1c6e7a63a36cce093fa5a
Reviewed-on: https://gerrit.libreoffice.org/10930
Reviewed-by: Kohei Yoshida <libreoffice@kohei.us>
Tested-by: Kohei Yoshida <libreoffice@kohei.us>
Diffstat (limited to 'sc/source/core/data/bcaslot.cxx')
-rw-r--r-- | sc/source/core/data/bcaslot.cxx | 36 |
1 files changed, 31 insertions, 5 deletions
diff --git a/sc/source/core/data/bcaslot.cxx b/sc/source/core/data/bcaslot.cxx index 2dfc9a7d6ac6..1eff597ca194 100644 --- a/sc/source/core/data/bcaslot.cxx +++ b/sc/source/core/data/bcaslot.cxx @@ -446,7 +446,8 @@ void ScBroadcastAreaSlot::EraseArea( ScBroadcastAreas::iterator& rIter ) } } -void ScBroadcastAreaSlot::GetAllListeners( const ScRange& rRange, std::vector<sc::AreaListener>& rListeners ) +void ScBroadcastAreaSlot::GetAllListeners( + const ScRange& rRange, std::vector<sc::AreaListener>& rListeners, sc::AreaOverlapType eType ) { for (ScBroadcastAreas::const_iterator aIter( aBroadcastAreaTbl.begin()), aIterEnd( aBroadcastAreaTbl.end()); aIter != aIterEnd; ++aIter ) @@ -456,8 +457,32 @@ void ScBroadcastAreaSlot::GetAllListeners( const ScRange& rRange, std::vector<sc ScBroadcastArea* pArea = (*aIter).mpArea; const ScRange& rAreaRange = pArea->GetRange(); - if (!rRange.In(rAreaRange)) - continue; + + switch (eType) + { + case sc::AreaInside: + if (!rRange.In(rAreaRange)) + // The range needs to be fully inside specified range. + continue; + break; + case sc::AreaPartialOverlap: + if (!rRange.Intersects(rAreaRange) || rRange.In(rAreaRange)) + // The range needs to be only partially overlapping. + continue; + break; + case sc::OneRowInsideArea: + if (rAreaRange.aStart.Row() != rAreaRange.aEnd.Row() || !rRange.In(rAreaRange)) + // The range needs to be one single row and fully inside + // specified range. + continue; + break; + case sc::OneColumnInsideArea: + if (rAreaRange.aStart.Col() != rAreaRange.aEnd.Col() || !rRange.In(rAreaRange)) + // The range needs to be one single column and fully inside + // specified range. + continue; + break; + } SvtBroadcaster::ListenersType& rLst = pArea->GetBroadcaster().GetAllListeners(); SvtBroadcaster::ListenersType::iterator itLst = rLst.begin(), itLstEnd = rLst.end(); @@ -1000,7 +1025,8 @@ void ScBroadcastAreaSlotMachine::FinallyEraseAreas( ScBroadcastAreaSlot* pSlot ) maAreasToBeErased.swap( aCopy); } -std::vector<sc::AreaListener> ScBroadcastAreaSlotMachine::GetAllListeners( const ScRange& rRange ) +std::vector<sc::AreaListener> ScBroadcastAreaSlotMachine::GetAllListeners( + const ScRange& rRange, sc::AreaOverlapType eType ) { std::vector<sc::AreaListener> aRet; @@ -1017,7 +1043,7 @@ std::vector<sc::AreaListener> ScBroadcastAreaSlotMachine::GetAllListeners( const while ( nOff <= nEnd ) { ScBroadcastAreaSlot* p = *pp; - p->GetAllListeners(rRange, aRet); + p->GetAllListeners(rRange, aRet, eType); ComputeNextSlot( nOff, nBreak, pp, nStart, ppSlots, nRowBreak); } } |