[Libreoffice-commits] core.git: sc/source

Katarina Behrens Katarina.Behrens at cib.de
Wed Aug 19 03:49:42 PDT 2015


 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.Behrens at 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
 


More information about the Libreoffice-commits mailing list