summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorKatarina Behrens <Katarina.Behrens@cib.de>2015-08-17 15:42:35 +0200
committerKatarina Behrens <Katarina.Behrens@cib.de>2015-08-19 12:48:08 +0200
commit9528fb4a6adb2116a287653cfadc208e6c970fbc (patch)
treeeacdfba61ccee731cc08f76fc7826c4de0b9afb1
parent5da0dce19caaf87a6fe53750a7e9ea5d564d6a12 (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
-rw-r--r--sc/source/filter/inc/worksheetbuffer.hxx5
-rw-r--r--sc/source/filter/oox/pivotcachebuffer.cxx2
-rw-r--r--sc/source/filter/oox/workbookfragment.cxx3
-rw-r--r--sc/source/filter/oox/worksheetbuffer.cxx33
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