diff options
Diffstat (limited to 'sc/inc/dpdimsave.hxx')
-rw-r--r-- | sc/inc/dpdimsave.hxx | 218 |
1 files changed, 218 insertions, 0 deletions
diff --git a/sc/inc/dpdimsave.hxx b/sc/inc/dpdimsave.hxx new file mode 100644 index 0000000000..400d532609 --- /dev/null +++ b/sc/inc/dpdimsave.hxx @@ -0,0 +1,218 @@ +/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */ +/* + * This file is part of the LibreOffice project. + * + * This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. + * + * This file incorporates work covered by the following license notice: + * + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed + * with this work for additional information regarding copyright + * ownership. The ASF licenses this file to you under the Apache + * License, Version 2.0 (the "License"); you may not use this file + * except in compliance with the License. You may obtain a copy of + * the License at http://www.apache.org/licenses/LICENSE-2.0 . + */ + +#pragma once + +#include <tools/long.hxx> + +#include <vector> +#include <map> +#include <string_view> + +#include "dpitemdata.hxx" +#include "dpnumgroupinfo.hxx" +#include "scdllapi.h" +#include "dptypes.hxx" + +class ScDPGroupTableData; +class ScDPGroupDimension; +class ScDPObject; +class ScDPCache; +class SvNumberFormatter; + +class ScDPSaveGroupDimension; + +/** + * Classes to save Data Pilot settings that create new dimensions (fields). + * These have to be applied before the other ScDPSaveData settings. + */ + +class SC_DLLPUBLIC ScDPSaveGroupItem +{ + OUString aGroupName; ///< name of group + std::vector<OUString> aElements; ///< names of items in original dimension + mutable std::vector<ScDPItemData> maItems; ///< items converted from the strings. + +public: + ScDPSaveGroupItem( OUString aName ); + ~ScDPSaveGroupItem(); + + ScDPSaveGroupItem(ScDPSaveGroupItem const &) = default; + ScDPSaveGroupItem(ScDPSaveGroupItem &&) = default; + ScDPSaveGroupItem & operator =(ScDPSaveGroupItem const &) = default; + ScDPSaveGroupItem & operator =(ScDPSaveGroupItem &&) = default; + + void AddToData(ScDPGroupDimension& rDataDim) const; + + void AddElement( const OUString& rName ); + void AddElementsFromGroup( const ScDPSaveGroupItem& rGroup ); + const OUString& GetGroupName() const { return aGroupName; } + + /// @return true if found (removed) + bool RemoveElement( const OUString& rName ); + + bool IsEmpty() const; + size_t GetElementCount() const; + const OUString* GetElementByIndex(size_t nIndex) const; + + void Rename( const OUString& rNewName ); + + /** remove this group's elements from their groups in rDimension + (rDimension must be a different dimension from the one which contains this)*/ + void RemoveElementsFromGroups( ScDPSaveGroupDimension& rDimension ) const; + + void ConvertElementsToItems(SvNumberFormatter* pFormatter) const; + bool HasInGroup(const ScDPItemData& rItem) const; +}; + +typedef ::std::vector<ScDPSaveGroupItem> ScDPSaveGroupItemVec; + +/** + * Represents a new group dimension whose dimension ID is higher than the + * highest source dimension ID. + */ +class SC_DLLPUBLIC ScDPSaveGroupDimension +{ + OUString aSourceDim; ///< always the real source from the original data + OUString aGroupDimName; + ScDPSaveGroupItemVec aGroups; + mutable ScDPNumGroupInfo aDateInfo; + sal_Int32 nDatePart; + +public: + ScDPSaveGroupDimension( OUString aSource, OUString aName ); + ScDPSaveGroupDimension( OUString aSource, OUString aName, const ScDPNumGroupInfo& rDateInfo, sal_Int32 nPart ); + + void AddToData( ScDPGroupTableData& rData ) const; + void AddToCache(ScDPCache& rCache) const; + void SetDateInfo( const ScDPNumGroupInfo& rInfo, sal_Int32 nPart ); + + void AddGroupItem( const ScDPSaveGroupItem& rItem ); + const OUString& GetGroupDimName() const { return aGroupDimName; } + const OUString& GetSourceDimName() const { return aSourceDim; } + + sal_Int32 GetDatePart() const { return nDatePart; } + const ScDPNumGroupInfo& GetDateInfo() const { return aDateInfo; } + + OUString CreateGroupName( std::u16string_view rPrefix ); + const ScDPSaveGroupItem* GetNamedGroup( const OUString& rGroupName ) const; + ScDPSaveGroupItem* GetNamedGroupAcc( const OUString& rGroupName ); + void RemoveFromGroups( const OUString& rItemName ); + void RemoveGroup(const OUString& rGroupName); + bool IsEmpty() const; + bool HasOnlyHidden(const ScDPUniqueStringSet& rVisible); + + tools::Long GetGroupCount() const; + const ScDPSaveGroupItem& GetGroupByIndex( tools::Long nIndex ) const; + + void Rename( const OUString& rNewName ); + +private: + bool IsInGroup(const ScDPItemData& rItem) const; +}; + +/** + * Represents a group dimension that introduces a new hierarchy for an + * existing dimension. Unlike the ScDPSaveGroupDimension counterpart, it + * re-uses the source dimension name and ID. + */ +class SC_DLLPUBLIC ScDPSaveNumGroupDimension +{ + OUString aDimensionName; + mutable ScDPNumGroupInfo aGroupInfo; + mutable ScDPNumGroupInfo aDateInfo; + sal_Int32 nDatePart; + +public: + ScDPSaveNumGroupDimension( OUString aName, const ScDPNumGroupInfo& rInfo ); + ScDPSaveNumGroupDimension( OUString aName, const ScDPNumGroupInfo& rDateInfo, sal_Int32 nPart ); + + void AddToData( ScDPGroupTableData& rData ) const; + void AddToCache(ScDPCache& rCache) const; + + const OUString& GetDimensionName() const { return aDimensionName; } + const ScDPNumGroupInfo& GetInfo() const { return aGroupInfo; } + + sal_Int32 GetDatePart() const { return nDatePart; } + const ScDPNumGroupInfo& GetDateInfo() const { return aDateInfo; } + + void SetGroupInfo( const ScDPNumGroupInfo& rNew ); + void SetDateInfo( const ScDPNumGroupInfo& rInfo, sal_Int32 nPart ); +}; + +/** + * This class has to do with handling exclusively grouped dimensions? TODO: + * Find out what this class does and document it here. + */ +class SC_DLLPUBLIC ScDPDimensionSaveData +{ +public: + ScDPDimensionSaveData(); + ScDPDimensionSaveData(ScDPDimensionSaveData const &) = default; + + bool operator==( const ScDPDimensionSaveData& r ) const; + + void WriteToData( ScDPGroupTableData& rData ) const; + + void WriteToCache(ScDPCache& rCache) const; + + OUString CreateGroupDimName( + const OUString& rSourceName, const ScDPObject& rObject, bool bAllowSource, + const ::std::vector<OUString>* pDeletedNames ); + + OUString CreateDateGroupDimName( + sal_Int32 nDatePart, const ScDPObject& rObject, bool bAllowSource, + const ::std::vector<OUString>* pDeletedNames ); + + void AddGroupDimension( const ScDPSaveGroupDimension& rGroupDim ); + void ReplaceGroupDimension( const ScDPSaveGroupDimension& rGroupDim ); + void RemoveGroupDimension( const OUString& rGroupDimName ); + + void AddNumGroupDimension( const ScDPSaveNumGroupDimension& rGroupDim ); + void ReplaceNumGroupDimension( const ScDPSaveNumGroupDimension& rGroupDim ); + void RemoveNumGroupDimension( const OUString& rGroupDimName ); + + const ScDPSaveGroupDimension* GetGroupDimForBase( const OUString& rBaseDimName ) const; + const ScDPSaveGroupDimension* GetNamedGroupDim( const OUString& rGroupDimName ) const; + const ScDPSaveGroupDimension* GetFirstNamedGroupDim( const OUString& rBaseDimName ) const; + const ScDPSaveGroupDimension* GetNextNamedGroupDim( const OUString& rGroupDimName ) const; + const ScDPSaveNumGroupDimension* GetNumGroupDim( const OUString& rGroupDimName ) const; + + ScDPSaveGroupDimension* GetGroupDimAccForBase( const OUString& rBaseDimName ); + ScDPSaveGroupDimension* GetNamedGroupDimAcc( const OUString& rGroupDimName ); + ScDPSaveGroupDimension* GetFirstNamedGroupDimAcc( const OUString& rBaseDimName ); + ScDPSaveGroupDimension* GetNextNamedGroupDimAcc( const OUString& rGroupDimName ); + + ScDPSaveNumGroupDimension* GetNumGroupDimAcc( const OUString& rGroupDimName ); + + bool HasGroupDimensions() const; + + sal_Int32 CollectDateParts( const OUString& rBaseDimName ) const; + +private: + typedef ::std::vector< ScDPSaveGroupDimension > ScDPSaveGroupDimVec; + typedef ::std::map<OUString, ScDPSaveNumGroupDimension> ScDPSaveNumGroupDimMap; + + ScDPDimensionSaveData& operator=( const ScDPDimensionSaveData& ) = delete; + + ScDPSaveGroupDimVec maGroupDims; + ScDPSaveNumGroupDimMap maNumGroupDims; +}; + +/* vim:set shiftwidth=4 softtabstop=4 expandtab: */ |