sc/source/filter/inc/worksheetbuffer.hxx | 5 ++-- sc/source/filter/oox/pivotcachebuffer.cxx | 2 - sc/source/filter/oox/workbookfragment.cxx | 3 ++ sc/source/filter/oox/worksheetbuffer.cxx | 33 ++++++++++++++++++++---------- 4 files changed, 30 insertions(+), 13 deletions(-)
New commits: commit 9528fb4a6adb2116a287653cfadc208e6c970fbc Author: Katarina Behrens <katarina.behr...@cib.de> Date: Mon Aug 17 15:42:35 2015 +0200 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 diff --git a/sc/source/filter/inc/worksheetbuffer.hxx b/sc/source/filter/inc/worksheetbuffer.hxx index 35e9c66..148f447 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 e35eaae..e7bad2d 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 06881c0..0560ad5 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 9d680dcc..e55ea42 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 _______________________________________________ Libreoffice-commits mailing list libreoffice-comm...@lists.freedesktop.org http://lists.freedesktop.org/mailman/listinfo/libreoffice-commits