summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMarkus Mohrhard <markus.mohrhard@googlemail.com>2013-02-21 02:23:13 +0100
committerFridrich Strba <fridrich@documentfoundation.org>2013-02-26 07:24:34 +0000
commit0c58a1425233d76812f32c3e9e2a5910e7b88f0e (patch)
treea5fb7ae82b3746970527a65cf52844f1040a9674
parentc4322062929815445f9f3f2b3a5c232a43d4abd3 (diff)
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 Reviewed-on: https://gerrit.libreoffice.org/2412 Reviewed-by: Fridrich Strba <fridrich@documentfoundation.org> Tested-by: Fridrich Strba <fridrich@documentfoundation.org>
-rw-r--r--sc/source/filter/inc/worksheethelper.hxx2
-rw-r--r--sc/source/filter/oox/workbookfragment.cxx13
-rw-r--r--sc/source/filter/oox/worksheethelper.cxx14
3 files changed, 27 insertions, 2 deletions
diff --git a/sc/source/filter/inc/worksheethelper.hxx b/sc/source/filter/inc/worksheethelper.hxx
index 32db180b423f..2efa6e4a19cd 100644
--- a/sc/source/filter/inc/worksheethelper.hxx
+++ b/sc/source/filter/inc/worksheethelper.hxx
@@ -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 );
diff --git a/sc/source/filter/oox/workbookfragment.cxx b/sc/source/filter/oox/workbookfragment.cxx
index ba0c2fdd86b4..41a6ce71098c 100644
--- a/sc/source/filter/oox/workbookfragment.cxx
+++ b/sc/source/filter/oox/workbookfragment.cxx
@@ -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();
diff --git a/sc/source/filter/oox/worksheethelper.cxx b/sc/source/filter/oox/worksheethelper.cxx
index fbb4dd223ddd..4d29ad31d136 100644
--- a/sc/source/filter/oox/worksheethelper.cxx
+++ b/sc/source/filter/oox/worksheethelper.cxx
@@ -339,6 +339,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;
@@ -953,9 +955,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 );
@@ -1575,6 +1580,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 );