summaryrefslogtreecommitdiff
path: root/sc/source/filter/excel/xeescher.cxx
diff options
context:
space:
mode:
authorNoel Grandin <noel@peralex.com>2015-11-30 14:50:14 +0200
committerNoel Grandin <noel@peralex.com>2015-12-01 08:36:04 +0200
commit5d1ab09936040689b96fc724d4ada13385131a55 (patch)
tree060c0160b6f984616c9e0076753fd80b22fea3c4 /sc/source/filter/excel/xeescher.cxx
parent3d5f762b49253f4758824e883d1a429f09001b99 (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.cxx57
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 =======================================================