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

Reply via email to