summaryrefslogtreecommitdiff
path: root/sc/source/filter/oox
diff options
context:
space:
mode:
authorRafael Lima <rafael.palma.lima@gmail.com>2023-08-14 00:34:43 +0200
committerTomaž Vajngerl <quikee@gmail.com>2023-10-01 13:01:32 +0200
commit8938bc703980e3bdf4a32863f3e0193302a08cde (patch)
tree48ea2e72a2cf6e30e37e9667e071ba09249f09d5 /sc/source/filter/oox
parenteb68c77168db379d9d805a221a30581962040afb (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.cxx22
-rw-r--r--sc/source/filter/oox/workbookhelper.cxx26
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