Kaydet (Commit) 9528fb4a authored tarafından Katarina Behrens's avatar Katarina Behrens

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
üst 5da0dce1
......@@ -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 );
......
......@@ -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;
}
}
......
......@@ -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();
......
......@@ -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
......
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