diff options
author | Noel Grandin <noel@peralex.com> | 2015-11-30 14:50:14 +0200 |
---|---|---|
committer | Noel Grandin <noel@peralex.com> | 2015-11-30 14:50:52 +0200 |
commit | 343e405f18a51abd6d386072ad33978fa83b8b31 (patch) | |
tree | 51e0ec98c89ce6fe185c483bcef3cfeed642ae79 | |
parent | b8627ad4db379bfa5b9411aaccb1663d7c66c933 (diff) |
tdf#66668 - FILESAVE: Saving an XLSX file freezes Calc
Change-Id: I7abbb1cc5056f33458257afe28ed933e2d3c378d
-rw-r--r-- | sc/inc/document.hxx | 2 | ||||
-rw-r--r-- | sc/source/filter/excel/xeescher.cxx | 57 |
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 ======================================================= |