diff options
author | Rafael Lima <rafael.palma.lima@gmail.com> | 2023-08-14 00:34:43 +0200 |
---|---|---|
committer | Tomaž Vajngerl <quikee@gmail.com> | 2023-10-01 13:01:32 +0200 |
commit | 8938bc703980e3bdf4a32863f3e0193302a08cde (patch) | |
tree | 48ea2e72a2cf6e30e37e9667e071ba09249f09d5 /sc/source/filter/oox | |
parent | eb68c77168db379d9d805a221a30581962040afb (diff) |
tdf#154449 Add support for hidden named ranges
This patch adds the possibility of having "hidden" named ranges in Calc, in a way similar to what MS Excel has (i.e. they're not visible in the UI and can only be hidden/shown via scripting).
This is done by creating a new HIDDEN flag in com.sun.star.sheet.NamedRangeFlag.
Hence thia patch makes it so that named ranges can be made hidden/visible via scripting. For instance, consider a Calc document with a named range "NamedRange1". The following scripts hides "NamedRange1" from the UI (i.e. it's no longer visible in the Manage Names dialog):
Sub SetHidden
Dim eFlags : eFlags = com.sun.star.sheet.NamedRangeFlag
aNamedRange = ThisComponent.NamedRanges.getByName("NamedRange1")
nType = aNamedRange.getType() Or eFlags.HIDDEN
aNamedRange.setType(nType)
End Sub
To make the named range visible again:
Sub RemoveHidden
Dim eFlags : eFlags = com.sun.star.sheet.NamedRangeFlag
aNamedRange = ThisComponent.NamedRanges.getByName("NamedRange1")
nType = aNamedRange.getType()
nType = nType - (aNamedRange.getType() And eFlags.HIDDEN)
aNamedRange.setType(nType)
End Sub
This patch also implements ODS and OOX import/export, as well as QA tests.
Change-Id: I10efe46938fe772b87dc17fc597cb83648b5efb2
Reviewed-on: https://gerrit.libreoffice.org/c/core/+/155599
Tested-by: Jenkins
Reviewed-by: Tomaž Vajngerl <quikee@gmail.com>
Diffstat (limited to 'sc/source/filter/oox')
-rw-r--r-- | sc/source/filter/oox/defnamesbuffer.cxx | 22 | ||||
-rw-r--r-- | sc/source/filter/oox/workbookhelper.cxx | 26 |
2 files changed, 30 insertions, 18 deletions
diff --git a/sc/source/filter/oox/defnamesbuffer.cxx b/sc/source/filter/oox/defnamesbuffer.cxx index e79b56211105..7b64ec696b34 100644 --- a/sc/source/filter/oox/defnamesbuffer.cxx +++ b/sc/source/filter/oox/defnamesbuffer.cxx @@ -223,20 +223,30 @@ void DefinedName::createNameObject( sal_Int32 nIndex ) // special flags for this name sal_Int32 nNameFlags = 0; - using namespace ::com::sun::star::sheet::NamedRangeFlag; + using namespace ::com::sun::star::sheet; if( !isGlobalName() ) switch( mcBuiltinId ) { case BIFF_DEFNAME_CRITERIA: - case BIFF_DEFNAME_FILTERDATABASE: nNameFlags = FILTER_CRITERIA; break; - case BIFF_DEFNAME_PRINTAREA: nNameFlags = PRINT_AREA; break; - case BIFF_DEFNAME_PRINTTITLES: nNameFlags = COLUMN_HEADER | ROW_HEADER; break; + case BIFF_DEFNAME_FILTERDATABASE: + nNameFlags = NamedRangeFlag::FILTER_CRITERIA; + break; + case BIFF_DEFNAME_PRINTAREA: + nNameFlags = NamedRangeFlag::PRINT_AREA; + break; + case BIFF_DEFNAME_PRINTTITLES: + nNameFlags = NamedRangeFlag::COLUMN_HEADER | NamedRangeFlag::ROW_HEADER; + break; } + // Set the appropriate flag if it is a hidden named range + if (maModel.mbHidden) + nNameFlags |= NamedRangeFlag::HIDDEN; + // create the name and insert it into the document, maCalcName will be changed to the resulting name if (maModel.mnSheet >= 0) - maScRangeData = createLocalNamedRangeObject(maCalcName, nIndex, nNameFlags, maModel.mnSheet, maModel.mbHidden); + maScRangeData = createLocalNamedRangeObject(maCalcName, nIndex, nNameFlags, maModel.mnSheet); else - maScRangeData = createNamedRangeObject( maCalcName, nIndex, nNameFlags, maModel.mbHidden); + maScRangeData = createNamedRangeObject( maCalcName, nIndex, nNameFlags); mnTokenIndex = nIndex; } diff --git a/sc/source/filter/oox/workbookhelper.cxx b/sc/source/filter/oox/workbookhelper.cxx index eaeca2d09912..91166cb9c478 100644 --- a/sc/source/filter/oox/workbookhelper.cxx +++ b/sc/source/filter/oox/workbookhelper.cxx @@ -155,9 +155,9 @@ public: /** Returns the specified cell or page style from the Calc document. */ Reference< XStyle > getStyleObject( const OUString& rStyleName, bool bPageStyle ) const; /** Creates and returns a defined name on-the-fly in the Calc document. */ - WorkbookHelper::RangeDataRet createNamedRangeObject(OUString& orName, sal_Int32 nIndex, sal_Int32 nNameFlags, bool bHidden); + WorkbookHelper::RangeDataRet createNamedRangeObject(OUString& orName, sal_Int32 nIndex, sal_Int32 nNameFlags); /** Creates and returns a defined name on the-fly in the correct Calc sheet. */ - WorkbookHelper::RangeDataRet createLocalNamedRangeObject(OUString& orName, sal_Int32 nIndex, sal_Int32 nNameFlags, sal_Int32 nTab, bool bHidden); + WorkbookHelper::RangeDataRet createLocalNamedRangeObject(OUString& orName, sal_Int32 nIndex, sal_Int32 nNameFlags, sal_Int32 nTab); /** Creates and returns a database range on-the-fly in the Calc document. */ Reference< XDatabaseRange > createDatabaseRangeObject( OUString& orName, const ScRange& rRangeAddr ); /** Creates and returns an unnamed database range on-the-fly in the Calc document. */ @@ -367,7 +367,7 @@ Reference< XStyle > WorkbookGlobals::getStyleObject( const OUString& rStyleName, namespace { -WorkbookHelper::RangeDataRet lcl_addNewByName(ScDocument& rDoc, ScRangeName* pNames, const OUString& rName, sal_Int16 nIndex, sal_Int32 nUnoType, bool bHidden) +WorkbookHelper::RangeDataRet lcl_addNewByName(ScDocument& rDoc, ScRangeName* pNames, const OUString& rName, sal_Int16 nIndex, sal_Int32 nUnoType) { bool bDone = false; ScRangeData::Type nNewType = ScRangeData::Type::Name; @@ -375,13 +375,15 @@ WorkbookHelper::RangeDataRet lcl_addNewByName(ScDocument& rDoc, ScRangeName* pNa if ( nUnoType & NamedRangeFlag::PRINT_AREA ) nNewType |= ScRangeData::Type::PrintArea; if ( nUnoType & NamedRangeFlag::COLUMN_HEADER ) nNewType |= ScRangeData::Type::ColHeader; if ( nUnoType & NamedRangeFlag::ROW_HEADER ) nNewType |= ScRangeData::Type::RowHeader; + if ( nUnoType & NamedRangeFlag::HIDDEN ) nNewType |= ScRangeData::Type::Hidden; ScTokenArray aTokenArray(rDoc); ScRangeData* pNew = new ScRangeData(rDoc, rName, aTokenArray, ScAddress(), nNewType); pNew->GuessPosition(); if ( nIndex ) pNew->SetIndex( nIndex ); // create but not insert hidden FILTER_CRITERIA named ranges to ScRangeName - if ( bHidden && nNewType == ScRangeData::Type::Criteria ) + if (((nUnoType & NamedRangeFlag::HIDDEN) == NamedRangeFlag::HIDDEN) + && ((nUnoType & NamedRangeFlag::FILTER_CRITERIA) == NamedRangeFlag::FILTER_CRITERIA)) { return WorkbookHelper::RangeDataRet(pNew, true); } @@ -408,7 +410,7 @@ OUString findUnusedName( const ScRangeName* pRangeName, const OUString& rSuggest } WorkbookHelper::RangeDataRet WorkbookGlobals::createNamedRangeObject( - OUString& orName, sal_Int32 nIndex, sal_Int32 nNameFlags, bool bHidden) + OUString& orName, sal_Int32 nIndex, sal_Int32 nNameFlags) { // create the name and insert it into the Calc document WorkbookHelper::RangeDataRet aScRangeData(nullptr, false); @@ -419,13 +421,13 @@ WorkbookHelper::RangeDataRet WorkbookGlobals::createNamedRangeObject( // find an unused name orName = findUnusedName( pNames, orName ); // create the named range - aScRangeData = lcl_addNewByName(rDoc, pNames, orName, nIndex, nNameFlags, bHidden); + aScRangeData = lcl_addNewByName(rDoc, pNames, orName, nIndex, nNameFlags); } return aScRangeData; } WorkbookHelper::RangeDataRet WorkbookGlobals::createLocalNamedRangeObject( - OUString& orName, sal_Int32 nIndex, sal_Int32 nNameFlags, sal_Int32 nTab, bool bHidden) + OUString& orName, sal_Int32 nIndex, sal_Int32 nNameFlags, sal_Int32 nTab) { // create the name and insert it into the Calc document WorkbookHelper::RangeDataRet aScRangeData(nullptr, false); @@ -438,7 +440,7 @@ WorkbookHelper::RangeDataRet WorkbookGlobals::createLocalNamedRangeObject( // find an unused name orName = findUnusedName( pNames, orName ); // create the named range - aScRangeData = lcl_addNewByName(rDoc, pNames, orName, nIndex, nNameFlags, bHidden); + aScRangeData = lcl_addNewByName(rDoc, pNames, orName, nIndex, nNameFlags); } return aScRangeData; } @@ -896,14 +898,14 @@ Reference< XStyle > WorkbookHelper::getStyleObject( const OUString& rStyleName, return mrBookGlob.getStyleObject( rStyleName, bPageStyle ); } -WorkbookHelper::RangeDataRet WorkbookHelper::createNamedRangeObject(OUString& orName, sal_Int32 nIndex, sal_Int32 nNameFlags, bool bHidden) const +WorkbookHelper::RangeDataRet WorkbookHelper::createNamedRangeObject(OUString& orName, sal_Int32 nIndex, sal_Int32 nNameFlags) const { - return mrBookGlob.createNamedRangeObject(orName, nIndex, nNameFlags, bHidden); + return mrBookGlob.createNamedRangeObject(orName, nIndex, nNameFlags); } -WorkbookHelper::RangeDataRet WorkbookHelper::createLocalNamedRangeObject(OUString& orName, sal_Int32 nIndex, sal_Int32 nNameFlags, sal_Int32 nTab, bool bHidden) const +WorkbookHelper::RangeDataRet WorkbookHelper::createLocalNamedRangeObject(OUString& orName, sal_Int32 nIndex, sal_Int32 nNameFlags, sal_Int32 nTab) const { - return mrBookGlob.createLocalNamedRangeObject(orName, nIndex, nNameFlags, nTab, bHidden); + return mrBookGlob.createLocalNamedRangeObject(orName, nIndex, nNameFlags, nTab); } Reference< XDatabaseRange > WorkbookHelper::createDatabaseRangeObject( OUString& orName, const ScRange& rRangeAddr ) const |