From 5d1ab09936040689b96fc724d4ada13385131a55 Mon Sep 17 00:00:00 2001 From: Noel Grandin Date: Mon, 30 Nov 2015 14:50:14 +0200 Subject: tdf#66668 - FILESAVE: Saving an XLSX file freezes Calc Change-Id: I7abbb1cc5056f33458257afe28ed933e2d3c378d (cherry picked from commit 343e405f18a51abd6d386072ad33978fa83b8b31) --- sc/inc/document.hxx | 2 +- 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(HMM2XL( nColOff )), nRow-1, static_cast(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(HMM2XL( nColOff )), + nRow-1, static_cast(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(HMM2XL( r.Left() - aRect.Right() )), + nRow, static_cast(HMM2XL( aRect.Bottom() - r.Top() ))); + break; + } + } + } } // Escher client anchor ======================================================= -- cgit