diff options
author | Katarina Behrens <Katarina.Behrens@cib.de> | 2015-08-17 15:42:35 +0200 |
---|---|---|
committer | Katarina Behrens <Katarina.Behrens@cib.de> | 2015-08-19 12:48:08 +0200 |
commit | 9528fb4a6adb2116a287653cfadc208e6c970fbc (patch) | |
tree | eacdfba61ccee731cc08f76fc7826c4de0b9afb1 /sc | |
parent | 5da0dce19caaf87a6fe53750a7e9ea5d564d6a12 (diff) |
tdf#77431: Move setting sheet visibility to finalize phase
and thus fix xlsx-specific issue that 1st sheet can't be hidden.
Also kill some UNO in the process.
I'm not sure if guarding against all sheets being hidden (by having
at least active sheet visible) is absolutely necessary, but better
be safe than sorry.
Change-Id: I4ad21d223b2effe427ab1d5411c035886f6cc71c
Diffstat (limited to 'sc')
-rw-r--r-- | sc/source/filter/inc/worksheetbuffer.hxx | 5 | ||||
-rw-r--r-- | sc/source/filter/oox/pivotcachebuffer.cxx | 2 | ||||
-rw-r--r-- | sc/source/filter/oox/workbookfragment.cxx | 3 | ||||
-rw-r--r-- | sc/source/filter/oox/worksheetbuffer.cxx | 33 |
4 files changed, 30 insertions, 13 deletions
diff --git a/sc/source/filter/inc/worksheetbuffer.hxx b/sc/source/filter/inc/worksheetbuffer.hxx index 35e9c66eae23..148f44770c48 100644 --- a/sc/source/filter/inc/worksheetbuffer.hxx +++ b/sc/source/filter/inc/worksheetbuffer.hxx @@ -62,7 +62,7 @@ public: void importSheet( SequenceInputStream& rStrm ); /** Inserts a new empty sheet into the document. Looks for an unused name. @return Index of the new sheet in the Calc document. */ - sal_Int16 insertEmptySheet( const OUString& rPreferredName, bool bVisible ); + sal_Int16 insertEmptySheet( const OUString& rPreferredName ); /** Returns the number of original sheets contained in the workbook. */ sal_Int32 getWorksheetCount() const; @@ -84,6 +84,7 @@ public: if sSheetNameRef doesn't start with '#' it is ignored and not modified */ void convertSheetNameRef( OUString& sSheetNameRef ) const; + void finalizeImport( sal_Int16 nActiveSheet ); private: struct SheetInfo : public SheetInfoModel @@ -98,7 +99,7 @@ private: typedef ::std::pair< sal_Int16, OUString > IndexNamePair; /** Creates a new sheet in the Calc document. Does not insert anything in the own lists. */ - IndexNamePair createSheet( const OUString& rPreferredName, sal_Int32 nSheetPos, bool bVisible ); + IndexNamePair createSheet( const OUString& rPreferredName, sal_Int32 nSheetPos ); /** Creates a new sheet in the Calc document and inserts the related SheetInfo. */ void insertSheet( const SheetInfoModel& rModel ); diff --git a/sc/source/filter/oox/pivotcachebuffer.cxx b/sc/source/filter/oox/pivotcachebuffer.cxx index e35eaaeb00f0..e7bad2d0a18b 100644 --- a/sc/source/filter/oox/pivotcachebuffer.cxx +++ b/sc/source/filter/oox/pivotcachebuffer.cxx @@ -1371,7 +1371,7 @@ void PivotCache::prepareSourceDataSheet() { maColSpans.insert( ValueRange( rRange.StartColumn, rRange.EndColumn ) ); OUString aSheetName = "DPCache_" + maSheetSrcModel.maSheet; - rRange.Sheet = getWorksheets().insertEmptySheet( aSheetName, false ); + rRange.Sheet = getWorksheets().insertEmptySheet( aSheetName ); mbValidSource = mbDummySheet = rRange.Sheet >= 0; } } diff --git a/sc/source/filter/oox/workbookfragment.cxx b/sc/source/filter/oox/workbookfragment.cxx index 06881c02c5cf..0560ad52bc8e 100644 --- a/sc/source/filter/oox/workbookfragment.cxx +++ b/sc/source/filter/oox/workbookfragment.cxx @@ -494,6 +494,9 @@ void WorkbookFragment::finalizeImport() aIt->first.reset(); } + sal_Int16 nActiveSheet = getViewSettings().getActiveCalcSheet(); + getWorksheets().finalizeImport( nActiveSheet ); + // final conversions, e.g. calculation settings and view settings finalizeWorkbookImport(); diff --git a/sc/source/filter/oox/worksheetbuffer.cxx b/sc/source/filter/oox/worksheetbuffer.cxx index 9d680dcc5205..e55ea4249853 100644 --- a/sc/source/filter/oox/worksheetbuffer.cxx +++ b/sc/source/filter/oox/worksheetbuffer.cxx @@ -34,6 +34,7 @@ #include <oox/token/properties.hxx> #include "biffinputstream.hxx" #include "excelhandlers.hxx" +#include "document.hxx" namespace oox { namespace xls { @@ -76,9 +77,13 @@ void WorksheetBuffer::importSheet( SequenceInputStream& rStrm ) insertSheet( aModel ); } -sal_Int16 WorksheetBuffer::insertEmptySheet( const OUString& rPreferredName, bool bVisible ) +sal_Int16 WorksheetBuffer::insertEmptySheet( const OUString& rPreferredName ) { - return createSheet( rPreferredName, SAL_MAX_INT32, bVisible ).first; + IndexNamePair aIndexName = createSheet( rPreferredName, SAL_MAX_INT32 ); + ScDocument& rDoc = getScDocument(); + + rDoc.SetVisible( aIndexName.first, false ); + return aIndexName.first; } sal_Int32 WorksheetBuffer::getWorksheetCount() const @@ -170,7 +175,7 @@ WorksheetBuffer::SheetInfo::SheetInfo( const SheetInfoModel& rModel, sal_Int16 n { } -WorksheetBuffer::IndexNamePair WorksheetBuffer::createSheet( const OUString& rPreferredName, sal_Int32 nSheetPos, bool bVisible ) +WorksheetBuffer::IndexNamePair WorksheetBuffer::createSheet( const OUString& rPreferredName, sal_Int32 nSheetPos ) { //FIXME: Rewrite this block using ScDocument[Import] instead of UNO try @@ -179,7 +184,6 @@ WorksheetBuffer::IndexNamePair WorksheetBuffer::createSheet( const OUString& rPr Reference< XIndexAccess > xSheetsIA( xSheets, UNO_QUERY_THROW ); sal_Int16 nCalcSheet = -1; OUString aSheetName = rPreferredName.isEmpty() ? "Sheet" : rPreferredName; - PropertySet aPropSet; if( nSheetPos < xSheetsIA->getCount() ) { nCalcSheet = static_cast< sal_Int16 >( nSheetPos ); @@ -190,7 +194,6 @@ WorksheetBuffer::IndexNamePair WorksheetBuffer::createSheet( const OUString& rPr aSheetName = ContainerHelper::getUnusedName( xSheets, aSheetName, ' ' ); xSheetName->setName( aSheetName ); } - aPropSet.set( xSheetName ); } else { @@ -198,12 +201,8 @@ WorksheetBuffer::IndexNamePair WorksheetBuffer::createSheet( const OUString& rPr // new sheet - insert with unused name aSheetName = ContainerHelper::getUnusedName( xSheets, aSheetName, ' ' ); xSheets->insertNewByName( aSheetName, nCalcSheet ); - aPropSet.set( xSheetsIA->getByIndex( nCalcSheet ) ); } - // sheet properties - aPropSet.setProperty( PROP_IsVisible, bVisible ); - // return final sheet index if sheet exists return IndexNamePair( nCalcSheet, aSheetName ); } @@ -217,13 +216,27 @@ WorksheetBuffer::IndexNamePair WorksheetBuffer::createSheet( const OUString& rPr void WorksheetBuffer::insertSheet( const SheetInfoModel& rModel ) { sal_Int32 nWorksheet = static_cast< sal_Int32 >( maSheetInfos.size() ); - IndexNamePair aIndexName = createSheet( rModel.maName, nWorksheet, rModel.mnState == XML_visible ); + IndexNamePair aIndexName = createSheet( rModel.maName, nWorksheet ); std::shared_ptr< SheetInfo > xSheetInfo( new SheetInfo( rModel, aIndexName.first, aIndexName.second ) ); maSheetInfos.push_back( xSheetInfo ); maSheetInfosByName[ rModel.maName ] = xSheetInfo; maSheetInfosByName[ lclQuoteName( rModel.maName ) ] = xSheetInfo; } +void WorksheetBuffer::finalizeImport( sal_Int16 nActiveSheet ) +{ + ScDocument& rDoc = getScDocument(); + + for ( auto aSheetInfo: maSheetInfos ) + { + // make sure at least 1 sheet (the active one) is visible + if ( aSheetInfo->mnCalcSheet == nActiveSheet) + rDoc.SetVisible( aSheetInfo->mnCalcSheet, true ); + else + rDoc.SetVisible( aSheetInfo->mnCalcSheet, (aSheetInfo->mnState == XML_visible) ? 1 : 0 ); + } +} + } // namespace xls } // namespace oox |