Kaydet (Commit) 7c351c32 authored tarafından Markus Mohrhard's avatar Markus Mohrhard

delay importing all drawing elements until content is loaded, fdo#60488

Otherwise charts with data ranges on other sheets will not be painted
correctly as the data is missing when the chart is rendered for the
first time. This was not a problem before the cached value import
because the hard recalc would have forced a repaint anyway.

The new way should also be a bit quicker.

Change-Id: Ieeee6a010a4dffad6ebe2264b8312f93b16d9c87
üst 0a967d4c
......@@ -303,6 +303,8 @@ public:
void initializeWorksheetImport();
/** Final conversion after importing the worksheet. */
void finalizeWorksheetImport();
/** Final import of drawing objects. Has to be called after all content has been imported */
void finalizeDrawingImport();
void setCellFormula( const ::com::sun::star::table::CellAddress& rTokenAddress, const rtl::OUString& );
void setCellFormula( const ::com::sun::star::table::CellAddress& rTokenAddress, sal_Int32 );
......
......@@ -231,6 +231,7 @@ void WorkbookFragment::finalizeImport()
typedef ::std::pair< WorksheetGlobalsRef, FragmentHandlerRef > SheetFragmentHandler;
typedef ::std::vector< SheetFragmentHandler > SheetFragmentVector;
SheetFragmentVector aSheetFragments;
std::vector<WorksheetHelper*> maHelpers;
WorksheetBuffer& rWorksheets = getWorksheets();
sal_Int32 nWorksheetCount = rWorksheets.getWorksheetCount();
for( sal_Int32 nWorksheet = 0; nWorksheet < nWorksheetCount; ++nWorksheet )
......@@ -286,7 +287,10 @@ void WorkbookFragment::finalizeImport()
// insert the fragment into the map
if( xFragment.is() )
{
aSheetFragments.push_back( SheetFragmentHandler( xSheetGlob, xFragment.get() ) );
maHelpers.push_back(xFragment.get());
}
}
}
}
......@@ -301,6 +305,15 @@ void WorkbookFragment::finalizeImport()
{
// import the sheet fragment
importOoxFragment( aIt->second );
}
for( std::vector<WorksheetHelper*>::iterator aIt = maHelpers.begin(), aEnd = maHelpers.end(); aIt != aEnd; ++aIt )
{
(*aIt)->finalizeDrawingImport();
}
for( SheetFragmentVector::iterator aIt = aSheetFragments.begin(), aEnd = aSheetFragments.end(); aIt != aEnd; ++aIt )
{
// delete fragment object and WorkbookGlobals object, will free all allocated sheet buffers
aIt->second.clear();
aIt->first.reset();
......
......@@ -343,6 +343,8 @@ public:
/** Final conversion after importing the worksheet. */
void finalizeWorksheetImport();
void finalizeDrawingImport();
private:
typedef ::std::vector< sal_Int32 > OutlineLevelVec;
typedef ::std::pair< ColumnModel, sal_Int32 > ColumnModelRange;
......@@ -957,9 +959,12 @@ void WorksheetGlobals::finalizeWorksheetImport()
lclUpdateProgressBar( mxFinalProgress, 0.5 );
convertColumns();
convertRows();
lclUpdateProgressBar( mxFinalProgress, 0.75 );
finalizeDrawings();
lclUpdateProgressBar( mxFinalProgress, 1.0 );
}
void WorksheetGlobals::finalizeDrawingImport()
{
finalizeDrawings();
// forget current sheet index in global data
setCurrentSheetIndex( -1 );
......@@ -1580,6 +1585,11 @@ void WorksheetHelper::finalizeWorksheetImport()
mrSheetGlob.finalizeWorksheetImport();
}
void WorksheetHelper::finalizeDrawingImport()
{
mrSheetGlob.finalizeDrawingImport();
}
void WorksheetHelper::setCellFormula( const ::com::sun::star::table::CellAddress& rTokenAddress, const rtl::OUString& rTokenStr )
{
getFormulaBuffer().setCellFormula( rTokenAddress, rTokenStr );
......
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