summaryrefslogtreecommitdiff
path: root/sc
diff options
context:
space:
mode:
authorNoel Grandin <noel@peralex.com>2015-11-30 14:50:14 +0200
committerNoel Grandin <noel@peralex.com>2015-11-30 14:50:52 +0200
commit343e405f18a51abd6d386072ad33978fa83b8b31 (patch)
tree51e0ec98c89ce6fe185c483bcef3cfeed642ae79 /sc
parentb8627ad4db379bfa5b9411aaccb1663d7c66c933 (diff)
tdf#66668 - FILESAVE: Saving an XLSX file freezes Calc
Change-Id: I7abbb1cc5056f33458257afe28ed933e2d3c378d
Diffstat (limited to 'sc')
-rw-r--r--sc/inc/document.hxx2
-rw-r--r--sc/source/filter/excel/xeescher.cxx57
2 files changed, 51 insertions, 8 deletions
diff --git a/sc/inc/document.hxx b/sc/inc/document.hxx
index 781db63bb50a..4720d340c9e2 100644
--- a/sc/inc/document.hxx
+++ b/sc/inc/document.hxx
@@ -693,7 +693,7 @@ public:
void SetPendingRowHeights( SCTAB nTab, bool bSet );
SC_DLLPUBLIC void SetLayoutRTL( SCTAB nTab, bool bRTL );
SC_DLLPUBLIC bool IsLayoutRTL( SCTAB nTab ) const;
- bool IsNegativePage( SCTAB nTab ) const;
+ SC_DLLPUBLIC bool IsNegativePage( SCTAB nTab ) const;
SC_DLLPUBLIC void SetScenario( SCTAB nTab, bool bFlag );
SC_DLLPUBLIC bool IsScenario( SCTAB nTab ) const;
SC_DLLPUBLIC void GetScenarioData( SCTAB nTab, OUString& rComment,
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 =======================================================