diff options
author | Noel Grandin <noel@peralex.com> | 2015-11-30 14:50:14 +0200 |
---|---|---|
committer | Noel Grandin <noel@peralex.com> | 2015-12-01 08:36:04 +0200 |
commit | 5d1ab09936040689b96fc724d4ada13385131a55 (patch) | |
tree | 060c0160b6f984616c9e0076753fd80b22fea3c4 /sc/source/filter/excel/xeescher.cxx | |
parent | 3d5f762b49253f4758824e883d1a429f09001b99 (diff) |
tdf#66668 - FILESAVE: Saving an XLSX file freezes Calc
Change-Id: I7abbb1cc5056f33458257afe28ed933e2d3c378d
(cherry picked from commit 343e405f18a51abd6d386072ad33978fa83b8b31)
Diffstat (limited to 'sc/source/filter/excel/xeescher.cxx')
-rw-r--r-- | sc/source/filter/excel/xeescher.cxx | 57 |
1 files changed, 50 insertions, 7 deletions
diff --git a/sc/source/filter/excel/xeescher.cxx b/sc/source/filter/excel/xeescher.cxx index cbaf7c254916..6e04a38a4f09 100644 --- a/sc/source/filter/excel/xeescher.cxx +++ b/sc/source/filter/excel/xeescher.cxx @@ -159,15 +159,15 @@ static void lcl_WriteAnchorVertex( sax_fastparser::FSHelperPtr rComments, Rectan static void lcl_GetFromTo( const XclExpRoot& rRoot, const Rectangle &aRect, sal_Int32 nTab, Rectangle &aFrom, Rectangle &aTo ) { - bool bTo = false; sal_Int32 nCol = 0, nRow = 0; sal_Int32 nColOff = 0, nRowOff= 0; - while(true) + const bool bRTL = rRoot.GetDocRef().IsNegativePage( nTab ); + if (!bRTL) { - Rectangle r = rRoot.GetDocRef().GetMMRect( nCol,nRow,nCol,nRow,nTab ); - if( !bTo ) + while(true) { + Rectangle r = rRoot.GetDocRef().GetMMRect( nCol,nRow,nCol,nRow,nTab ); if( r.Left() <= aRect.Left() ) { nCol++; @@ -182,11 +182,38 @@ static void lcl_GetFromTo( const XclExpRoot& rRoot, const Rectangle &aRect, sal_ { aFrom = Rectangle( nCol-1, static_cast<long>(HMM2XL( nColOff )), nRow-1, static_cast<long>(HMM2XL( nRowOff )) ); - bTo=true; + break; } } - if( bTo ) + } + else + { + while(true) { + Rectangle r = rRoot.GetDocRef().GetMMRect( nCol,nRow,nCol,nRow,nTab ); + if( r.Left() >= aRect.Left() ) + { + nCol++; + nColOff = r.Left() - aRect.Left(); + } + if( r.Top() <= aRect.Top() ) + { + nRow++; + nRowOff = aRect.Top() - r.Top(); + } + if( r.Left() < aRect.Left() && r.Top() > aRect.Top() ) + { + aFrom = Rectangle( nCol-1, static_cast<long>(HMM2XL( nColOff )), + nRow-1, static_cast<long>(HMM2XL( nRowOff )) ); + break; + } + } + } + if (!bRTL) + { + while(true) + { + Rectangle r = rRoot.GetDocRef().GetMMRect( nCol,nRow,nCol,nRow,nTab ); if( r.Right() < aRect.Right() ) nCol++; if( r.Bottom() < aRect.Bottom() ) @@ -199,7 +226,23 @@ static void lcl_GetFromTo( const XclExpRoot& rRoot, const Rectangle &aRect, sal_ } } } - return; + else + { + while(true) + { + Rectangle r = rRoot.GetDocRef().GetMMRect( nCol,nRow,nCol,nRow,nTab ); + if( r.Right() >= aRect.Right() ) + nCol++; + if( r.Bottom() < aRect.Bottom() ) + nRow++; + if( r.Right() < aRect.Right() && r.Bottom() >= aRect.Bottom() ) + { + aTo = Rectangle( nCol, static_cast<long>(HMM2XL( r.Left() - aRect.Right() )), + nRow, static_cast<long>(HMM2XL( aRect.Bottom() - r.Top() ))); + break; + } + } + } } // Escher client anchor ======================================================= |