offapi/com/sun/star/sheet/NamedRangeFlag.idl | 7 + sc/inc/rangenam.hxx | 7 - sc/qa/unit/data/ods/named-ranges-hidden.ods |binary sc/qa/unit/data/xlsx/named-ranges-hidden.xlsx |binary sc/qa/unit/subsequent_filters_test.cxx | 64 ++++++++++++ sc/source/core/tool/rangenam.cxx | 1 sc/source/filter/excel/xename.cxx | 6 + sc/source/filter/inc/workbookhelper.hxx | 4 sc/source/filter/oox/defnamesbuffer.cxx | 22 +++- sc/source/filter/oox/workbookhelper.cxx | 26 ++-- sc/source/filter/xml/xmlexprt.cxx | 6 + sc/source/filter/xml/xmlimprt.cxx | 4 sc/source/ui/namedlg/namemgrtable.cxx | 4 sc/source/ui/unoobj/nameuno.cxx | 6 - schema/libreoffice/OpenDocument-v1.3+libreoffice-schema.rng | 34 ++++++ 15 files changed, 166 insertions(+), 25 deletions(-)
New commits: commit 8938bc703980e3bdf4a32863f3e0193302a08cde Author: Rafael Lima <rafael.palma.l...@gmail.com> AuthorDate: Mon Aug 14 00:34:43 2023 +0200 Commit: Tomaž Vajngerl <qui...@gmail.com> CommitDate: Sun Oct 1 13:01:32 2023 +0200 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 <qui...@gmail.com> diff --git a/offapi/com/sun/star/sheet/NamedRangeFlag.idl b/offapi/com/sun/star/sheet/NamedRangeFlag.idl index 3c42431cb992..5addc08ad561 100644 --- a/offapi/com/sun/star/sheet/NamedRangeFlag.idl +++ b/offapi/com/sun/star/sheet/NamedRangeFlag.idl @@ -45,6 +45,13 @@ published constants NamedRangeFlag */ const long ROW_HEADER = 8; + + /** The range is hidden from the user interface + + @since LibreOffice 24.2 + */ + const long HIDDEN = 16; + }; diff --git a/sc/inc/rangenam.hxx b/sc/inc/rangenam.hxx index 31bdd1f5a23c..881a2e876bda 100644 --- a/sc/inc/rangenam.hxx +++ b/sc/inc/rangenam.hxx @@ -55,7 +55,8 @@ public: RowHeader = 0x0010, AbsArea = 0x0020, RefArea = 0x0040, - AbsPos = 0x0080 + AbsPos = 0x0080, + Hidden = 0x0100 }; enum class IsNameValidType @@ -124,7 +125,7 @@ public: void AddType( Type nType ); Type GetType() const { return eType; } bool HasType( Type nType ) const; - sal_uInt32 GetUnoType() const; + SC_DLLPUBLIC sal_uInt32 GetUnoType() const; SC_DLLPUBLIC OUString GetSymbol( const formula::FormulaGrammar::Grammar eGrammar = formula::FormulaGrammar::GRAM_DEFAULT ) const; SC_DLLPUBLIC OUString GetSymbol( const ScAddress& rPos, const formula::FormulaGrammar::Grammar eGrammar = formula::FormulaGrammar::GRAM_DEFAULT ) const; void UpdateSymbol( OUStringBuffer& rBuffer, const ScAddress& ); @@ -166,7 +167,7 @@ public: }; namespace o3tl { - template<> struct typed_flags<ScRangeData::Type> : is_typed_flags<ScRangeData::Type, 0xff> {}; + template<> struct typed_flags<ScRangeData::Type> : is_typed_flags<ScRangeData::Type, 0x1ff> {}; } diff --git a/sc/qa/unit/data/ods/named-ranges-hidden.ods b/sc/qa/unit/data/ods/named-ranges-hidden.ods new file mode 100644 index 000000000000..ff68f549f06a Binary files /dev/null and b/sc/qa/unit/data/ods/named-ranges-hidden.ods differ diff --git a/sc/qa/unit/data/xlsx/named-ranges-hidden.xlsx b/sc/qa/unit/data/xlsx/named-ranges-hidden.xlsx new file mode 100644 index 000000000000..bfb365943ee1 Binary files /dev/null and b/sc/qa/unit/data/xlsx/named-ranges-hidden.xlsx differ diff --git a/sc/qa/unit/subsequent_filters_test.cxx b/sc/qa/unit/subsequent_filters_test.cxx index d02ebc075e3e..19563674501e 100644 --- a/sc/qa/unit/subsequent_filters_test.cxx +++ b/sc/qa/unit/subsequent_filters_test.cxx @@ -26,6 +26,7 @@ #include <postit.hxx> #include <undomanager.hxx> +#include <com/sun/star/sheet/NamedRangeFlag.hdl> #include "helper/qahelper.hxx" #include "helper/shared_test_impl.hxx" @@ -640,6 +641,69 @@ CPPUNIT_TEST_FIXTURE(ScFiltersTest, testRangeNameODS) testFile(aCSVPath, *pDoc, 1); } +CPPUNIT_TEST_FIXTURE(ScFiltersTest, testHiddenRangeNameODS) +{ + createScDoc("ods/named-ranges-hidden.ods"); + ScDocument* pDoc = getScDoc(); + + // This named range is set to "hidden" + ScRangeData* pRangeData1 = pDoc->GetRangeName()->findByUpperName(OUString("NAMEDRANGE1")); + CPPUNIT_ASSERT(pRangeData1); + CPPUNIT_ASSERT_EQUAL(static_cast<sal_uInt32>(sheet::NamedRangeFlag::HIDDEN), + pRangeData1->GetUnoType() & sheet::NamedRangeFlag::HIDDEN); + // This named range is visible + ScRangeData* pRangeData2 = pDoc->GetRangeName()->findByUpperName(OUString("NAMEDRANGE2")); + CPPUNIT_ASSERT(pRangeData2); + CPPUNIT_ASSERT_EQUAL(static_cast<sal_uInt32>(0), + pRangeData2->GetUnoType() & sheet::NamedRangeFlag::HIDDEN); + + // Set NamedRange2 to hidden + pRangeData2->AddType(ScRangeData::Type::Hidden); + CPPUNIT_ASSERT_EQUAL(static_cast<sal_uInt32>(sheet::NamedRangeFlag::HIDDEN), + pRangeData2->GetUnoType() & sheet::NamedRangeFlag::HIDDEN); + + // Check if both named ranges are hidden after saving and reloading + saveAndReload("calc8"); + pDoc = getScDoc(); + pRangeData1 = pDoc->GetRangeName()->findByUpperName(OUString("NAMEDRANGE1")); + CPPUNIT_ASSERT(pRangeData1); + CPPUNIT_ASSERT_EQUAL(static_cast<sal_uInt32>(sheet::NamedRangeFlag::HIDDEN), + pRangeData1->GetUnoType() & sheet::NamedRangeFlag::HIDDEN); + pRangeData2 = pDoc->GetRangeName()->findByUpperName(OUString("NAMEDRANGE2")); + CPPUNIT_ASSERT(pRangeData2); + CPPUNIT_ASSERT_EQUAL(static_cast<sal_uInt32>(sheet::NamedRangeFlag::HIDDEN), + pRangeData2->GetUnoType() & sheet::NamedRangeFlag::HIDDEN); +} + +CPPUNIT_TEST_FIXTURE(ScFiltersTest, testHiddenRangeNameXLSX) +{ + createScDoc("xlsx/named-ranges-hidden.xlsx"); + ScDocument* pDoc = getScDoc(); + + // This named range is set to "hidden" + ScRangeData* pRangeData1 = pDoc->GetRangeName()->findByUpperName(OUString("NAMEDRANGE1")); + CPPUNIT_ASSERT(pRangeData1); + CPPUNIT_ASSERT_EQUAL(static_cast<sal_uInt32>(sheet::NamedRangeFlag::HIDDEN), + pRangeData1->GetUnoType() & sheet::NamedRangeFlag::HIDDEN); + // This named range is visible + ScRangeData* pRangeData2 = pDoc->GetRangeName()->findByUpperName(OUString("NAMEDRANGE2")); + CPPUNIT_ASSERT(pRangeData2); + CPPUNIT_ASSERT_EQUAL(static_cast<sal_uInt32>(0), + pRangeData2->GetUnoType() & sheet::NamedRangeFlag::HIDDEN); + + // Save as ODS and test if the named ranges are still with the correct hidden flag + saveAndReload("calc8"); + pDoc = getScDoc(); + pRangeData1 = pDoc->GetRangeName()->findByUpperName(OUString("NAMEDRANGE1")); + CPPUNIT_ASSERT(pRangeData1); + CPPUNIT_ASSERT_EQUAL(static_cast<sal_uInt32>(sheet::NamedRangeFlag::HIDDEN), + pRangeData1->GetUnoType() & sheet::NamedRangeFlag::HIDDEN); + pRangeData2 = pDoc->GetRangeName()->findByUpperName(OUString("NAMEDRANGE2")); + CPPUNIT_ASSERT(pRangeData2); + CPPUNIT_ASSERT_EQUAL(static_cast<sal_uInt32>(0), + pRangeData2->GetUnoType() & sheet::NamedRangeFlag::HIDDEN); +} + CPPUNIT_TEST_FIXTURE(ScFiltersTest, testHyperlinksXLSX) { createScDoc("xlsx/hyperlinks.xlsx"); diff --git a/sc/source/core/tool/rangenam.cxx b/sc/source/core/tool/rangenam.cxx index b5578ca26590..051b0a5e77ac 100644 --- a/sc/source/core/tool/rangenam.cxx +++ b/sc/source/core/tool/rangenam.cxx @@ -529,6 +529,7 @@ sal_uInt32 ScRangeData::GetUnoType() const if ( HasType(Type::PrintArea) ) nUnoType |= css::sheet::NamedRangeFlag::PRINT_AREA; if ( HasType(Type::ColHeader) ) nUnoType |= css::sheet::NamedRangeFlag::COLUMN_HEADER; if ( HasType(Type::RowHeader) ) nUnoType |= css::sheet::NamedRangeFlag::ROW_HEADER; + if ( HasType(Type::Hidden) ) nUnoType |= css::sheet::NamedRangeFlag::HIDDEN; return nUnoType; } diff --git a/sc/source/filter/excel/xename.cxx b/sc/source/filter/excel/xename.cxx index 5ce4a2ff18c4..bdb23c6cf93a 100644 --- a/sc/source/filter/excel/xename.cxx +++ b/sc/source/filter/excel/xename.cxx @@ -35,8 +35,10 @@ #include <formula/grammar.hxx> #include <oox/export/utils.hxx> #include <oox/token/tokens.hxx> +#include <com/sun/star/sheet/NamedRangeFlag.hdl> using namespace ::oox; +using namespace ::com::sun::star; // *** Helper classes *** @@ -630,6 +632,10 @@ sal_uInt16 XclExpNameManagerImpl::CreateName( SCTAB nTab, const ScRangeData& rRa NamedExpMap::key_type key(nTab, rRangeData.GetName()); maNamedExpMap[key] = nNameIdx; + // Check if it is a hidden named range + if ((rRangeData.GetUnoType() & sheet::NamedRangeFlag::HIDDEN) == sheet::NamedRangeFlag::HIDDEN) + xName->SetHidden(true); + /* Create the definition formula. This may cause recursive creation of other defined names. */ if( const ScTokenArray* pScTokArr = const_cast< ScRangeData& >( rRangeData ).GetCode() ) diff --git a/sc/source/filter/inc/workbookhelper.hxx b/sc/source/filter/inc/workbookhelper.hxx index 8e2aa221241a..fd6343a31a79 100644 --- a/sc/source/filter/inc/workbookhelper.hxx +++ b/sc/source/filter/inc/workbookhelper.hxx @@ -219,7 +219,7 @@ public: RangeDataRet createNamedRangeObject( OUString& orName, sal_Int32 nIndex, - sal_Int32 nNameFlags, bool bHidden ) const; + sal_Int32 nNameFlags ) const; /** Creates and returns a defined name on-the-fly in the sheet. The name will not be buffered in the global defined names buffer. @@ -227,7 +227,7 @@ public: RangeDataRet createLocalNamedRangeObject( OUString& orName, sal_Int32 nIndex, - sal_Int32 nNameFlags, sal_Int32 nTab, bool bHidden ) const; + sal_Int32 nNameFlags, sal_Int32 nTab ) const; /** Creates and returns a database range on-the-fly in the Calc document. The range will not be buffered in the global table buffer. 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 diff --git a/sc/source/filter/xml/xmlexprt.cxx b/sc/source/filter/xml/xmlexprt.cxx index 65a94257cbc9..2ac992a20930 100644 --- a/sc/source/filter/xml/xmlexprt.cxx +++ b/sc/source/filter/xml/xmlexprt.cxx @@ -4549,6 +4549,12 @@ void ScXMLExport::WriteNamedRange(ScRangeName* pRangeName) sBufferRangeType.append(" "); sBufferRangeType.append(GetXMLToken(XML_PRINT_RANGE)); } + if ((nRangeType & sheet::NamedRangeFlag::HIDDEN) == sheet::NamedRangeFlag::HIDDEN) + { + if (!sBufferRangeType.isEmpty()) + sBufferRangeType.append(" "); + sBufferRangeType.append(GetXMLToken(XML_HIDDEN)); + } OUString sRangeType = sBufferRangeType.makeStringAndClear(); if (!sRangeType.isEmpty()) AddAttribute(XML_NAMESPACE_TABLE, XML_RANGE_USABLE_AS, sRangeType); diff --git a/sc/source/filter/xml/xmlimprt.cxx b/sc/source/filter/xml/xmlimprt.cxx index 3aa681b10bdc..78473c76b6a9 100644 --- a/sc/source/filter/xml/xmlimprt.cxx +++ b/sc/source/filter/xml/xmlimprt.cxx @@ -106,6 +106,7 @@ constexpr OUStringLiteral SC_CURRENCYSYMBOL = u"CurrencySymbol"; constexpr OUStringLiteral SC_REPEAT_ROW = u"repeat-row"; constexpr OUStringLiteral SC_FILTER = u"filter"; constexpr OUStringLiteral SC_PRINT_RANGE = u"print-range"; +constexpr OUStringLiteral SC_HIDDEN = u"hidden"; using namespace com::sun::star; using namespace ::xmloff::token; @@ -1202,6 +1203,8 @@ sal_Int32 ScXMLImport::GetRangeType(std::u16string_view sRangeType) nRangeType |= sheet::NamedRangeFlag::FILTER_CRITERIA; else if (sTemp == SC_PRINT_RANGE) nRangeType |= sheet::NamedRangeFlag::PRINT_AREA; + else if (sTemp == SC_HIDDEN) + nRangeType |= sheet::NamedRangeFlag::HIDDEN; } else if (i < sRangeType.size()) sBuffer.append(sRangeType[i]); @@ -1275,6 +1278,7 @@ public: if ( nUnoType & sheet::NamedRangeFlag::PRINT_AREA ) nNewType |= ScRangeData::Type::PrintArea; if ( nUnoType & sheet::NamedRangeFlag::COLUMN_HEADER ) nNewType |= ScRangeData::Type::ColHeader; if ( nUnoType & sheet::NamedRangeFlag::ROW_HEADER ) nNewType |= ScRangeData::Type::RowHeader; + if ( nUnoType & sheet::NamedRangeFlag::HIDDEN ) nNewType |= ScRangeData::Type::Hidden; // Insert a new name. ScAddress aPos; diff --git a/sc/source/ui/namedlg/namemgrtable.cxx b/sc/source/ui/namedlg/namemgrtable.cxx index fbf6b64d3a1f..c2dbc19e721c 100644 --- a/sc/source/ui/namedlg/namemgrtable.cxx +++ b/sc/source/ui/namedlg/namemgrtable.cxx @@ -152,7 +152,9 @@ void ScRangeManagerTable::Init() aLine.aScope = itr.first; for (const auto& rEntry : rLocalRangeName) { - if (!rEntry.second->HasType(ScRangeData::Type::Database)) + // Database and hidden named ranges are not shown in the Manage Names dialog + if (!rEntry.second->HasType(ScRangeData::Type::Database) + && !rEntry.second->HasType(ScRangeData::Type::Hidden)) { aLine.aName = rEntry.second->GetName(); addEntry(aLine, false); diff --git a/sc/source/ui/unoobj/nameuno.cxx b/sc/source/ui/unoobj/nameuno.cxx index 84283b1ede14..6e02ab723b62 100644 --- a/sc/source/ui/unoobj/nameuno.cxx +++ b/sc/source/ui/unoobj/nameuno.cxx @@ -75,10 +75,11 @@ SC_SIMPLE_SERVICE_INFO( ScLabelRangeObj, "ScLabelRangeObj", "com.sun.star.sheet. SC_SIMPLE_SERVICE_INFO( ScLabelRangesObj, "ScLabelRangesObj", "com.sun.star.sheet.LabelRanges" ) SC_SIMPLE_SERVICE_INFO( ScNamedRangesObj, "ScNamedRangesObj", "com.sun.star.sheet.NamedRanges" ) +// Database named ranges are not considered by getCount, hasByName, removeByName and getElementNames +// Note that hidden named ranges are considered by these methods static bool lcl_UserVisibleName(const ScRangeData& rData) { //! as method to ScRangeData - return !rData.HasType(ScRangeData::Type::Database); } @@ -293,6 +294,7 @@ sal_Int32 SAL_CALL ScNamedRangeObj::getType() if ( pData->HasType(ScRangeData::Type::PrintArea) ) nType |= sheet::NamedRangeFlag::PRINT_AREA; if ( pData->HasType(ScRangeData::Type::ColHeader) ) nType |= sheet::NamedRangeFlag::COLUMN_HEADER; if ( pData->HasType(ScRangeData::Type::RowHeader) ) nType |= sheet::NamedRangeFlag::ROW_HEADER; + if ( pData->HasType(ScRangeData::Type::Hidden) ) nType |= sheet::NamedRangeFlag::HIDDEN; } return nType; } @@ -305,6 +307,7 @@ void SAL_CALL ScNamedRangeObj::setType( sal_Int32 nUnoType ) if ( nUnoType & sheet::NamedRangeFlag::PRINT_AREA ) nNewType |= ScRangeData::Type::PrintArea; if ( nUnoType & sheet::NamedRangeFlag::COLUMN_HEADER ) nNewType |= ScRangeData::Type::ColHeader; if ( nUnoType & sheet::NamedRangeFlag::ROW_HEADER ) nNewType |= ScRangeData::Type::RowHeader; + if ( nUnoType & sheet::NamedRangeFlag::HIDDEN ) nNewType |= ScRangeData::Type::Hidden; // GRAM_API for API compatibility. Modify_Impl( nullptr, nullptr, nullptr, nullptr, &nNewType,formula::FormulaGrammar::GRAM_API ); @@ -458,6 +461,7 @@ void SAL_CALL ScNamedRangesObj::addNewByName( const OUString& aName, if ( nUnoType & sheet::NamedRangeFlag::PRINT_AREA ) nNewType |= ScRangeData::Type::PrintArea; if ( nUnoType & sheet::NamedRangeFlag::COLUMN_HEADER ) nNewType |= ScRangeData::Type::ColHeader; if ( nUnoType & sheet::NamedRangeFlag::ROW_HEADER ) nNewType |= ScRangeData::Type::RowHeader; + if ( nUnoType & sheet::NamedRangeFlag::HIDDEN ) nNewType |= ScRangeData::Type::Hidden; bool bDone = false; if (pDocShell) diff --git a/schema/libreoffice/OpenDocument-v1.3+libreoffice-schema.rng b/schema/libreoffice/OpenDocument-v1.3+libreoffice-schema.rng index 0f71070ea983..6b52ab7307df 100644 --- a/schema/libreoffice/OpenDocument-v1.3+libreoffice-schema.rng +++ b/schema/libreoffice/OpenDocument-v1.3+libreoffice-schema.rng @@ -2061,6 +2061,40 @@ xmlns:loext="urn:org:documentfoundation:names:experimental:office:xmlns:loext:1. </rng:element> </rng:define> + <!-- Adds hidden option to named ranges --> + <rng:define name="table-named-range-attlist"> + <rng:attribute name="table:name"> + <rng:ref name="string"/> + </rng:attribute> + <rng:attribute name="table:cell-range-address"> + <rng:ref name="cellRangeAddress"/> + </rng:attribute> + <rng:optional> + <rng:attribute name="table:base-cell-address"> + <rng:ref name="cellAddress"/> + </rng:attribute> + </rng:optional> + <rng:optional> + <rng:attribute name="table:range-usable-as"> + <rng:choice> + <rng:value>none</rng:value> + <rng:list> + <rng:oneOrMore> + <rng:choice> + <rng:value>print-range</rng:value> + <rng:value>filter</rng:value> + <rng:value>repeat-row</rng:value> + <rng:value>repeat-column</rng:value> + <!-- The option "hidden" is the new value for "range-usable-as" --> + <rng:value>hidden</rng:value> + </rng:choice> + </rng:oneOrMore> + </rng:list> + </rng:choice> + </rng:attribute> + </rng:optional> + </rng:define> + </rng:include> <!-- TODO no proposal -->