Kaydet (Commit) 42e80ec6 authored tarafından Eike Rathke's avatar Eike Rathke

dr80: #i116460# performance of Excel file with many outlines

# HG changeset patch
# User Niklas Nebel <nn@openoffice.org>
# Date 1300438660 -3600
# Node ID aa7d08a12d7ee60c71eb4f2dc1241197e009c443
# Parent  49c53fbe0cd4d663f419b659c82618bd106282ef
üst 62e8e2a3
...@@ -494,6 +494,7 @@ VerticalSplitMode ...@@ -494,6 +494,7 @@ VerticalSplitMode
VerticalSplitPositionTwips VerticalSplitPositionTwips
ViewBox ViewBox
Visible Visible
VisibleFlag
VisibleSize VisibleSize
VisualArea VisualArea
VisualEffect VisualEffect
......
...@@ -1243,7 +1243,9 @@ void WorksheetGlobals::convertRows( OutlineLevelVec& orRowLevels, ...@@ -1243,7 +1243,9 @@ void WorksheetGlobals::convertRows( OutlineLevelVec& orRowLevels,
if( rModel.mbHidden ) if( rModel.mbHidden )
{ {
PropertySet aPropSet( getRows( rRowRange ) ); PropertySet aPropSet( getRows( rRowRange ) );
aPropSet.setProperty( PROP_IsVisible, false ); // #i116460# Use VisibleFlag instead of IsVisible: directly set the flag,
// without drawing layer update etc. (only possible before shapes are inserted)
aPropSet.setProperty( PROP_VisibleFlag, false );
} }
// outline settings for this row range // outline settings for this row range
......
...@@ -179,6 +179,8 @@ ...@@ -179,6 +179,8 @@
#define SC_UNONAME_AUTOPRINT "AutomaticPrintArea" #define SC_UNONAME_AUTOPRINT "AutomaticPrintArea"
#define SC_UNONAME_TABCOLOR "TabColor" #define SC_UNONAME_TABCOLOR "TabColor"
#define SC_UNONAME_VISFLAG "VisibleFlag"
// LinkTarget // LinkTarget
#define SC_UNO_LINKDISPBIT "LinkDisplayBitmap" #define SC_UNO_LINKDISPBIT "LinkDisplayBitmap"
#define SC_UNO_LINKDISPNAME "LinkDisplayName" #define SC_UNO_LINKDISPNAME "LinkDisplayName"
......
...@@ -959,6 +959,15 @@ void ScDrawLayer::MoveArea( SCTAB nTab, SCCOL nCol1,SCROW nRow1, SCCOL nCol2,SCR ...@@ -959,6 +959,15 @@ void ScDrawLayer::MoveArea( SCTAB nTab, SCCOL nCol1,SCROW nRow1, SCCOL nCol2,SCR
if (!bAdjustEnabled) if (!bAdjustEnabled)
return; return;
SdrPage* pPage = GetPage(static_cast<sal_uInt16>(nTab));
OSL_ENSURE(pPage,"Page not found");
if (!pPage)
return;
// for an empty page, there's no need to calculate the row heights
if (!pPage->GetObjCount())
return;
sal_Bool bNegativePage = pDoc->IsNegativePage( nTab ); sal_Bool bNegativePage = pDoc->IsNegativePage( nTab );
Rectangle aRect = pDoc->GetMMRect( nCol1, nRow1, nCol2, nRow2, nTab ); Rectangle aRect = pDoc->GetMMRect( nCol1, nRow1, nCol2, nRow2, nTab );
...@@ -1003,6 +1012,15 @@ sal_Bool ScDrawLayer::HasObjectsInRows( SCTAB nTab, SCROW nStartRow, SCROW nEndR ...@@ -1003,6 +1012,15 @@ sal_Bool ScDrawLayer::HasObjectsInRows( SCTAB nTab, SCROW nStartRow, SCROW nEndR
if ( !pDoc ) if ( !pDoc )
return false; return false;
SdrPage* pPage = GetPage(static_cast<sal_uInt16>(nTab));
OSL_ENSURE(pPage,"Page not found");
if (!pPage)
return sal_False;
// for an empty page, there's no need to calculate the row heights
if (!pPage->GetObjCount())
return sal_False;
Rectangle aTestRect; Rectangle aTestRect;
aTestRect.Top() += pDoc->GetRowHeight( 0, nStartRow-1, nTab); aTestRect.Top() += pDoc->GetRowHeight( 0, nStartRow-1, nTab);
...@@ -1025,11 +1043,6 @@ sal_Bool ScDrawLayer::HasObjectsInRows( SCTAB nTab, SCROW nStartRow, SCROW nEndR ...@@ -1025,11 +1043,6 @@ sal_Bool ScDrawLayer::HasObjectsInRows( SCTAB nTab, SCROW nStartRow, SCROW nEndR
if ( bNegativePage ) if ( bNegativePage )
MirrorRectRTL( aTestRect ); MirrorRectRTL( aTestRect );
SdrPage* pPage = GetPage(static_cast<sal_uInt16>(nTab));
OSL_ENSURE(pPage,"Page nicht gefunden");
if (!pPage)
return false;
sal_Bool bFound = false; sal_Bool bFound = false;
Rectangle aObjRect; Rectangle aObjRect;
......
...@@ -161,10 +161,12 @@ struct SetRowHeightRangeFunc : public OptimalHeightsFuncObjBase ...@@ -161,10 +161,12 @@ struct SetRowHeightRangeFunc : public OptimalHeightsFuncObjBase
} }
}; };
bool SetOptimalHeightsToRows(OptimalHeightsFuncObjBase& rFuncObj, bool SetOptimalHeightsToRows( OptimalHeightsFuncObjBase& rFuncObj, ScTable* pTab,
ScBitMaskCompressedArray<SCROW, sal_uInt8>* pRowFlags, SCROW nStartRow, SCROW nEndRow, sal_uInt16 nExtra, ScBitMaskCompressedArray<SCROW, sal_uInt8>* pRowFlags, SCROW nStartRow, SCROW nEndRow, sal_uInt16 nExtra,
const vector<sal_uInt16>& aHeights, bool bForce) const vector<sal_uInt16>& aHeights, bool bForce)
{ {
pTab->IncRecalcLevel(); // #i116460# avoid problems with Excel files
SCSIZE nCount = static_cast<SCSIZE>(nEndRow-nStartRow+1); SCSIZE nCount = static_cast<SCSIZE>(nEndRow-nStartRow+1);
bool bChanged = false; bool bChanged = false;
SCROW nRngStart = 0; SCROW nRngStart = 0;
...@@ -221,6 +223,8 @@ bool SetOptimalHeightsToRows(OptimalHeightsFuncObjBase& rFuncObj, ...@@ -221,6 +223,8 @@ bool SetOptimalHeightsToRows(OptimalHeightsFuncObjBase& rFuncObj,
if (nLast) if (nLast)
bChanged |= rFuncObj(nRngStart, nRngEnd, nLast); bChanged |= rFuncObj(nRngStart, nRngEnd, nLast);
pTab->DecRecalcLevel(); // #i116460# avoid problems with Excel files
return bChanged; return bChanged;
} }
...@@ -478,7 +482,7 @@ bool ScTable::SetOptimalHeight( SCROW nStartRow, SCROW nEndRow, sal_uInt16 nExtr ...@@ -478,7 +482,7 @@ bool ScTable::SetOptimalHeight( SCROW nStartRow, SCROW nEndRow, sal_uInt16 nExtr
SetRowHeightRangeFunc aFunc(this, nPPTX, nPPTY); SetRowHeightRangeFunc aFunc(this, nPPTX, nPPTY);
bool bChanged = SetOptimalHeightsToRows( bool bChanged = SetOptimalHeightsToRows(
aFunc, pRowFlags, nStartRow, nEndRow, nExtra, aHeights, bForce); aFunc, this, pRowFlags, nStartRow, nEndRow, nExtra, aHeights, bForce);
if ( pProgress != pOuterProgress ) if ( pProgress != pOuterProgress )
delete pProgress; delete pProgress;
...@@ -509,7 +513,7 @@ void ScTable::SetOptimalHeightOnly( SCROW nStartRow, SCROW nEndRow, sal_uInt16 n ...@@ -509,7 +513,7 @@ void ScTable::SetOptimalHeightOnly( SCROW nStartRow, SCROW nEndRow, sal_uInt16 n
SetRowHeightOnlyFunc aFunc(this); SetRowHeightOnlyFunc aFunc(this);
SetOptimalHeightsToRows( SetOptimalHeightsToRows(
aFunc, pRowFlags, nStartRow, nEndRow, nExtra, aHeights, bForce); aFunc, this, pRowFlags, nStartRow, nEndRow, nExtra, aHeights, bForce);
if ( pProgress != pOuterProgress ) if ( pProgress != pOuterProgress )
delete pProgress; delete pProgress;
......
...@@ -297,6 +297,7 @@ void XclImpColRowSettings::Convert( SCTAB nScTab ) ...@@ -297,6 +297,7 @@ void XclImpColRowSettings::Convert( SCTAB nScTab )
void XclImpColRowSettings::ConvertHiddenFlags( SCTAB nScTab ) void XclImpColRowSettings::ConvertHiddenFlags( SCTAB nScTab )
{ {
ScDocument& rDoc = GetDoc(); ScDocument& rDoc = GetDoc();
rDoc.IncSizeRecalcLevel( nScTab ); // #i116460# performance with many hidden rows
// hide the columns // hide the columns
for( SCCOL nScCol = 0; nScCol <= MAXCOL; ++nScCol ) for( SCCOL nScCol = 0; nScCol <= MAXCOL; ++nScCol )
...@@ -340,7 +341,7 @@ void XclImpColRowSettings::ConvertHiddenFlags( SCTAB nScTab ) ...@@ -340,7 +341,7 @@ void XclImpColRowSettings::ConvertHiddenFlags( SCTAB nScTab )
{ {
if (bPrevHidden) if (bPrevHidden)
{ {
rDoc.ShowRows(nPrevRow, nRow-1, nScTab, false); rDoc.SetRowHidden(nPrevRow, nRow-1, nScTab, true); // #i116460# SetRowHidden instead of ShowRow
// #i38093# rows hidden by filter need extra flag // #i38093# rows hidden by filter need extra flag
if (nFirstFilterScRow <= nPrevRow && nPrevRow <= nLastFilterScRow) if (nFirstFilterScRow <= nPrevRow && nPrevRow <= nLastFilterScRow)
{ {
...@@ -357,6 +358,8 @@ void XclImpColRowSettings::ConvertHiddenFlags( SCTAB nScTab ) ...@@ -357,6 +358,8 @@ void XclImpColRowSettings::ConvertHiddenFlags( SCTAB nScTab )
// #i47438# if default row format is hidden, hide remaining rows // #i47438# if default row format is hidden, hide remaining rows
if( ::get_flag( mnDefRowFlags, EXC_DEFROW_HIDDEN ) && (mnLastScRow < MAXROW) ) if( ::get_flag( mnDefRowFlags, EXC_DEFROW_HIDDEN ) && (mnLastScRow < MAXROW) )
rDoc.ShowRows( mnLastScRow + 1, MAXROW, nScTab, false ); rDoc.ShowRows( mnLastScRow + 1, MAXROW, nScTab, false );
rDoc.DecSizeRecalcLevel( nScTab ); // #i116460# performance with many hidden rows
} }
/* vim:set shiftwidth=4 softtabstop=4 expandtab: */ /* vim:set shiftwidth=4 softtabstop=4 expandtab: */
...@@ -391,6 +391,8 @@ sal_Bool ScOutlineDocFunc::SelectLevel( SCTAB nTab, sal_Bool bColumns, sal_uInt1 ...@@ -391,6 +391,8 @@ sal_Bool ScOutlineDocFunc::SelectLevel( SCTAB nTab, sal_Bool bColumns, sal_uInt1
bColumns, nLevel ) ); bColumns, nLevel ) );
} }
pDoc->IncSizeRecalcLevel( nTab );
pDoc->InitializeNoteCaptions(nTab); pDoc->InitializeNoteCaptions(nTab);
ScSubOutlineIterator aIter( pArray ); // alle Eintraege ScSubOutlineIterator aIter( pArray ); // alle Eintraege
ScOutlineEntry* pEntry; ScOutlineEntry* pEntry;
...@@ -420,11 +422,19 @@ sal_Bool ScOutlineDocFunc::SelectLevel( SCTAB nTab, sal_Bool bColumns, sal_uInt1 ...@@ -420,11 +422,19 @@ sal_Bool ScOutlineDocFunc::SelectLevel( SCTAB nTab, sal_Bool bColumns, sal_uInt1
if ( bColumns ) if ( bColumns )
pDoc->ShowCol( static_cast<SCCOL>(i), nTab, bShow ); pDoc->ShowCol( static_cast<SCCOL>(i), nTab, bShow );
else else
if ( !bShow || !pDoc->RowFiltered( i,nTab ) ) {
pDoc->ShowRow( i, nTab, bShow ); // show several rows together, don't show filtered rows
SCROW nFilterEnd = i;
bool bFiltered = pDoc->RowFiltered( i, nTab, NULL, &nFilterEnd );
nFilterEnd = std::min( nThisEnd, nFilterEnd );
if ( !bShow || !bFiltered )
pDoc->ShowRows( i, nFilterEnd, nTab, bShow );
i = nFilterEnd;
}
} }
} }
pDoc->DecSizeRecalcLevel( nTab );
pDoc->SetDrawPageSize(nTab); pDoc->SetDrawPageSize(nTab);
pDoc->UpdatePageBreaks( nTab ); pDoc->UpdatePageBreaks( nTab );
...@@ -479,6 +489,8 @@ sal_Bool ScOutlineDocFunc::ShowMarkedOutlines( const ScRange& rRange, sal_Bool b ...@@ -479,6 +489,8 @@ sal_Bool ScOutlineDocFunc::ShowMarkedOutlines( const ScRange& rRange, sal_Bool b
pUndoDoc, pUndoTab, sal_True ) ); pUndoDoc, pUndoTab, sal_True ) );
} }
pDoc->IncSizeRecalcLevel( nTab );
// Spalten // Spalten
nMin=MAXCOL; nMin=MAXCOL;
...@@ -520,9 +532,17 @@ sal_Bool ScOutlineDocFunc::ShowMarkedOutlines( const ScRange& rRange, sal_Bool b ...@@ -520,9 +532,17 @@ sal_Bool ScOutlineDocFunc::ShowMarkedOutlines( const ScRange& rRange, sal_Bool b
} }
} }
for ( i=nMin; i<=nMax; i++ ) for ( i=nMin; i<=nMax; i++ )
if ( !pDoc->RowFiltered( i,nTab ) ) // weggefilterte nicht einblenden {
pDoc->ShowRow( i, nTab, sal_True ); // show several rows together, don't show filtered rows
SCROW nFilterEnd = i;
bool bFiltered = pDoc->RowFiltered( i, nTab, NULL, &nFilterEnd );
nFilterEnd = std::min( nMax, nFilterEnd );
if ( !bFiltered )
pDoc->ShowRows( i, nFilterEnd, nTab, sal_True );
i = nFilterEnd;
}
pDoc->DecSizeRecalcLevel( nTab );
pDoc->SetDrawPageSize(nTab); pDoc->SetDrawPageSize(nTab);
pDoc->UpdatePageBreaks( nTab ); pDoc->UpdatePageBreaks( nTab );
...@@ -592,6 +612,8 @@ sal_Bool ScOutlineDocFunc::HideMarkedOutlines( const ScRange& rRange, sal_Bool b ...@@ -592,6 +612,8 @@ sal_Bool ScOutlineDocFunc::HideMarkedOutlines( const ScRange& rRange, sal_Bool b
pUndoDoc, pUndoTab, false ) ); pUndoDoc, pUndoTab, false ) );
} }
pDoc->IncSizeRecalcLevel( nTab );
// Spalten // Spalten
nCount = pColArray->GetCount(nColLevel); nCount = pColArray->GetCount(nColLevel);
...@@ -618,6 +640,7 @@ sal_Bool ScOutlineDocFunc::HideMarkedOutlines( const ScRange& rRange, sal_Bool b ...@@ -618,6 +640,7 @@ sal_Bool ScOutlineDocFunc::HideMarkedOutlines( const ScRange& rRange, sal_Bool b
HideOutline( nTab, false, nRowLevel, i, false, false, bApi ); HideOutline( nTab, false, nRowLevel, i, false, false, bApi );
} }
pDoc->DecSizeRecalcLevel( nTab );
pDoc->UpdatePageBreaks( nTab ); pDoc->UpdatePageBreaks( nTab );
rDocShell.PostPaint( 0,0,nTab, MAXCOL,MAXROW,nTab, PAINT_GRID | PAINT_LEFT | PAINT_TOP ); rDocShell.PostPaint( 0,0,nTab, MAXCOL,MAXROW,nTab, PAINT_GRID | PAINT_LEFT | PAINT_TOP );
...@@ -673,6 +696,8 @@ sal_Bool ScOutlineDocFunc::ShowOutline( SCTAB nTab, sal_Bool bColumns, sal_uInt1 ...@@ -673,6 +696,8 @@ sal_Bool ScOutlineDocFunc::ShowOutline( SCTAB nTab, sal_Bool bColumns, sal_uInt1
//! HideCursor(); //! HideCursor();
pDoc->IncSizeRecalcLevel( nTab );
pDoc->InitializeNoteCaptions(nTab); pDoc->InitializeNoteCaptions(nTab);
pEntry->SetHidden(false); pEntry->SetHidden(false);
SCCOLROW i; SCCOLROW i;
...@@ -681,8 +706,15 @@ sal_Bool ScOutlineDocFunc::ShowOutline( SCTAB nTab, sal_Bool bColumns, sal_uInt1 ...@@ -681,8 +706,15 @@ sal_Bool ScOutlineDocFunc::ShowOutline( SCTAB nTab, sal_Bool bColumns, sal_uInt1
if ( bColumns ) if ( bColumns )
pDoc->ShowCol( static_cast<SCCOL>(i), nTab, sal_True ); pDoc->ShowCol( static_cast<SCCOL>(i), nTab, sal_True );
else else
if ( !pDoc->RowFiltered( i,nTab ) ) // weggefilterte nicht einblenden {
pDoc->ShowRow( i, nTab, sal_True ); // show several rows together, don't show filtered rows
SCROW nFilterEnd = i;
bool bFiltered = pDoc->RowFiltered( i, nTab, NULL, &nFilterEnd );
nFilterEnd = std::min( nEnd, nFilterEnd );
if ( !bFiltered )
pDoc->ShowRows( i, nFilterEnd, nTab, sal_True );
i = nFilterEnd;
}
} }
ScSubOutlineIterator aIter( pArray, nLevel, nEntry ); ScSubOutlineIterator aIter( pArray, nLevel, nEntry );
...@@ -692,13 +724,11 @@ sal_Bool ScOutlineDocFunc::ShowOutline( SCTAB nTab, sal_Bool bColumns, sal_uInt1 ...@@ -692,13 +724,11 @@ sal_Bool ScOutlineDocFunc::ShowOutline( SCTAB nTab, sal_Bool bColumns, sal_uInt1
{ {
SCCOLROW nSubStart = pEntry->GetStart(); SCCOLROW nSubStart = pEntry->GetStart();
SCCOLROW nSubEnd = pEntry->GetEnd(); SCCOLROW nSubEnd = pEntry->GetEnd();
for ( i = nSubStart; i <= nSubEnd; i++ ) if ( bColumns )
{ for ( i = nSubStart; i <= nSubEnd; i++ )
if ( bColumns )
pDoc->ShowCol( static_cast<SCCOL>(i), nTab, false ); pDoc->ShowCol( static_cast<SCCOL>(i), nTab, false );
else else
pDoc->ShowRow( i, nTab, false ); pDoc->ShowRows( nSubStart, nSubEnd, nTab, sal_False );
}
} }
} }
...@@ -759,19 +789,20 @@ sal_Bool ScOutlineDocFunc::HideOutline( SCTAB nTab, sal_Bool bColumns, sal_uInt1 ...@@ -759,19 +789,20 @@ sal_Bool ScOutlineDocFunc::HideOutline( SCTAB nTab, sal_Bool bColumns, sal_uInt1
//! HideCursor(); //! HideCursor();
pDoc->IncSizeRecalcLevel( nTab );
pDoc->InitializeNoteCaptions(nTab); pDoc->InitializeNoteCaptions(nTab);
pEntry->SetHidden(true); pEntry->SetHidden(true);
SCCOLROW i; SCCOLROW i;
for ( i = nStart; i <= nEnd; i++ ) if ( bColumns )
{ for ( i = nStart; i <= nEnd; i++ )
if ( bColumns ) pDoc->ShowCol( static_cast<SCCOL>(i), nTab, sal_False );
pDoc->ShowCol( static_cast<SCCOL>(i), nTab, false ); else
else pDoc->ShowRows( nStart, nEnd, nTab, sal_False );
pDoc->ShowRow( i, nTab, false );
}
pArray->SetVisibleBelow( nLevel, nEntry, false ); pArray->SetVisibleBelow( nLevel, nEntry, false );
pDoc->DecSizeRecalcLevel( nTab );
pDoc->SetDrawPageSize(nTab); pDoc->SetDrawPageSize(nTab);
pDoc->InvalidatePageBreaks(nTab); pDoc->InvalidatePageBreaks(nTab);
pDoc->UpdatePageBreaks( nTab ); pDoc->UpdatePageBreaks( nTab );
......
...@@ -3267,6 +3267,12 @@ void SAL_CALL ScTableRowsObj::setPropertyValue( ...@@ -3267,6 +3267,12 @@ void SAL_CALL ScTableRowsObj::setPropertyValue(
aFunc.SetWidthOrHeight( false, 1, nRowArr, nTab, eMode, 0, sal_True, sal_True ); aFunc.SetWidthOrHeight( false, 1, nRowArr, nTab, eMode, 0, sal_True, sal_True );
// SC_SIZE_DIRECT with size 0: hide // SC_SIZE_DIRECT with size 0: hide
} }
else if ( aNameString.EqualsAscii( SC_UNONAME_VISFLAG ) )
{
// #i116460# Shortcut to only set the flag, without drawing layer update etc.
// Should only be used from import filters.
pDoc->SetRowHidden(nStartRow, nEndRow, nTab, !ScUnoHelpFunctions::GetBoolFromAny( aValue ));
}
else if ( aNameString.EqualsAscii( SC_UNONAME_CELLFILT ) ) else if ( aNameString.EqualsAscii( SC_UNONAME_CELLFILT ) )
{ {
//! undo etc. //! undo etc.
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment