27 #include <com/sun/star/beans/XPropertySet.hpp>
28 #include <com/sun/star/container/XNameAccess.hpp>
29 #include <com/sun/star/sheet/DataPilotFieldFilter.hpp>
30 #include <com/sun/star/sheet/DataPilotFieldGroupBy.hpp>
31 #include <com/sun/star/sheet/DataPilotFieldOrientation.hpp>
32 #include <com/sun/star/sheet/DataPilotFieldSortMode.hpp>
33 #include <com/sun/star/sheet/DataPilotTableHeaderData.hpp>
34 #include <com/sun/star/sheet/MemberResultFlags.hpp>
35 #include <com/sun/star/sheet/XDimensionsSupplier.hpp>
36 #include <com/sun/star/sheet/XDrillDownDataSupplier.hpp>
40 #include <globstr.hrc>
56 #include <unonames.hxx>
67 #include <string_view>
68 #include <unordered_set>
69 #include <unordered_map>
74 using ::com::sun::star::uno::Any;
75 using ::com::sun::star::uno::Sequence;
76 using ::com::sun::star::uno::Reference;
77 using ::com::sun::star::uno::UNO_QUERY;
78 using ::com::sun::star::beans::XPropertySet;
79 using ::com::sun::star::container::XNameAccess;
80 using ::com::sun::star::sheet::XDimensionsSupplier;
92 ScDocShell* pDocSh = GetViewData().GetDocShell();
94 aFunc.
MakeOutline( aRange, bColumns, bRecord,
false );
98 bColumns, !bColumns,
false ,
100 true , GetViewData().GetTabNo());
103 ErrorMessage(STR_NOMULTISELECT);
113 ScDocShell* pDocSh = GetViewData().GetDocShell();
119 bColumns, !bColumns,
false ,
121 true , GetViewData().GetTabNo());
124 ErrorMessage(STR_NOMULTISELECT);
131 bool bColFound =
false;
132 bool bRowFound =
false;
134 SCCOL nStartCol, nEndCol;
135 SCROW nStartRow, nEndRow;
136 SCTAB nStartTab, nEndTab;
137 if (GetViewData().GetSimpleArea(nStartCol,nStartRow,nStartTab,nEndCol,nEndRow,nEndTab) ==
SC_MARK_SIMPLE)
139 SCTAB nTab = nStartTab;
140 ScDocument& rDoc = GetViewData().GetDocument();
147 bool bColMarked = ( nStartRow == 0 && nEndRow == rDoc.
MaxRow() );
148 bool bRowMarked = ( nStartCol == 0 && nEndCol == rDoc.
MaxCol() );
152 if ( !bRowMarked || bColMarked )
163 if ( nStartCol<=static_cast<SCCOL>(nEnd) && nEndCol>=static_cast<SCCOL>(nStart) )
170 if ( !bColMarked || bRowMarked )
181 if ( nStartRow<=nEnd && nEndRow>=nStart )
194 SCTAB nTab = GetViewData().GetTabNo();
195 ScDocShell* pDocSh = GetViewData().GetDocShell();
203 true ,
true ,
false ,
214 ScDocument& rDoc = GetViewData().GetDocument();
215 SCTAB nTab = GetViewData().GetTabNo();
217 ScMarkData& rMark = GetViewData().GetMarkData();
218 if ( rMark.IsMarked() || rMark.IsMultiMarked() )
221 rMark.GetMultiMarkArea( aRange );
224 ScDocShell* pDocSh = GetViewData().GetDocShell();
233 SCTAB nTab = GetViewData().GetTabNo();
234 ScDocShell* pDocSh = GetViewData().GetDocShell();
237 bool bOk = aFunc.
SelectLevel( nTab, bColumns, nLevel, bRecord,
true );
242 bColumns, !bColumns,
false ,
253 const sal_uInt16 nHeadEntry =
static_cast< sal_uInt16
>( -1 );
254 if ( nEntry == nHeadEntry)
255 SelectLevel( bColumns, sal::static_int_cast<sal_uInt16>(nLevel) );
259 ShowOutline( bColumns, sal::static_int_cast<sal_uInt16>(nLevel), sal::static_int_cast<sal_uInt16>(nEntry) );
261 HideOutline( bColumns, sal::static_int_cast<sal_uInt16>(nLevel), sal::static_int_cast<sal_uInt16>(nEntry) );
267 SCTAB nTab = GetViewData().GetTabNo();
268 ScDocShell* pDocSh = GetViewData().GetDocShell();
271 aFunc.
ShowOutline( nTab, bColumns, nLevel, nEntry, bRecord, bPaint );
276 bColumns, !bColumns,
false ,
287 SCTAB nTab = GetViewData().GetTabNo();
288 ScDocShell* pDocSh = GetViewData().GetDocShell();
291 bool bOk = aFunc.
HideOutline( nTab, bColumns, nLevel, nEntry, bRecord, bPaint );
296 bColumns, !bColumns,
false ,
307 bool bEnable =
false;
316 if (GetViewData().GetSimpleArea(nStartCol,nStartRow,nStartTab,nEndCol,nEndRow,nEndTab) ==
SC_MARK_SIMPLE)
318 ScDocument& rDoc = GetViewData().GetDocument();
319 SCTAB nTab = GetViewData().GetTabNo();
339 if ( nStartCol<=static_cast<SCCOL>(nEnd) && nEndCol>=static_cast<SCCOL>(nStart) )
345 if ( nStart>=nStartCol && nEnd<=nEndCol )
364 if ( nStartRow<=nEnd && nEndRow>=nStart )
370 if ( nStart>=nStartRow && nEnd<=nEndRow )
388 ScDocShell* pDocSh = GetViewData().GetDocShell();
394 GetViewData().GetViewShell(),
true,
true,
395 false ,
true ,
true ,
396 true , GetViewData().GetTabNo());
401 ErrorMessage(STR_NOMULTISELECT);
411 ScDocShell* pDocSh = GetViewData().GetDocShell();
417 GetViewData().GetViewShell(),
true,
true,
418 false ,
true ,
true ,
419 true , GetViewData().GetTabNo());
424 ErrorMessage(STR_NOMULTISELECT);
434 ScDocShell* pDocSh = GetViewData().GetDocShell();
436 ScMarkData& rMark = GetViewData().GetMarkData();
437 SCTAB nTab = GetViewData().GetTabNo();
445 OSL_FAIL(
"SubTotals: no DBData" );
450 if (!aTester.IsEditable())
452 ErrorMessage(aTester.GetMessageId());
459 ErrorMessage(STR_MSSG_INSERTCELLS_0);
470 VclMessageType::Question, VclButtonsType::YesNo,
471 ScResId(STR_MSSG_DOSUBTOTALS_1)));
472 xBox->set_title(
ScResId(STR_MSSG_DOSUBTOTALS_0));
473 xBox->set_default_response(
RET_YES);
485 std::unique_ptr<ScOutlineTable> pUndoTab;
486 std::unique_ptr<ScRangeName> pUndoRange;
487 std::unique_ptr<ScDBCollection> pUndoDB;
491 bool bOldFilter = bDo && rParam.
bDoSort;
506 pUndoDoc->InitUndo( rDoc, nTab, nTab,
true,
true );
511 pUndoDoc->InitUndo( rDoc, nTab, nTab,
false, bOldFilter );
523 if (!pDocRange->
empty())
526 if (!pDocDB->
empty())
535 sal_uInt16 nDepth = rRowArray.
GetDepth();
536 for (sal_uInt16
i = 0;
i < nDepth; ++
i)
545 bool bSuccess =
true;
549 if ( rParam.
bDoSort || pForceNewSort )
558 ScSortParam aSortParam( aNewParam, pForceNewSort ? *pForceNewSort : aOldSort );
559 Sort( aSortParam,
false,
false );
571 std::make_unique<ScUndoSubTotals>( pDocSh, nTab,
572 rParam, aNewParam.
nRow2,
573 std::move(pUndoDoc), std::move(pUndoTab),
574 std::move(pUndoRange), std::move(pUndoDB) ) );
580 ErrorMessage(STR_MSSG_DOSUBTOTALS_2);
606 ScDocShell* pDocShell = GetViewData().GetDocShell();
608 SetTabNo( rParam.
nTab,
true );
615 OUString
aName = rPrefix + OUString::number( nNumber );
628 ErrorMessage(STR_PIVOT_NODATA);
632 ScDocShell* pDocSh = GetViewData().GetDocShell();
633 ScDocument& rDoc = GetViewData().GetDocument();
639 SCTAB nSrcTab = GetViewData().GetTabNo();
645 aName +=
"_" + aStr +
"_";
647 SCTAB nNewTab = nSrcTab+1;
657 std::make_unique<ScUndoInsertTab>( pDocSh, nNewTab, bAppend,
lcl_MakePivotTabName( aName, i ) ));
660 GetViewData().InsertTab( nNewTab );
661 SetTabNo(nNewTab,
true);
663 aDestRange =
ScRange( 0, 0, nNewTab );
688 bool bAllowMove = (pDPObj !=
nullptr);
691 bool bSuccess = aFunc.
DataPilotUpdate(pDPObj, &aObj,
true,
false, bAllowMove);
706 ScDocShell* pDocSh = GetViewData().GetDocShell();
709 GetViewData().GetCurY(),
710 GetViewData().GetTabNo() );
718 ErrorMessage(STR_PIVOT_NOTFOUND);
723 ScDocShell* pDocSh = GetViewData().GetDocShell();
724 ScDocument& rDoc = GetViewData().GetDocument();
727 GetViewData().GetCurY(),
728 GetViewData().GetTabNo() );
739 ErrorMessage(STR_PIVOT_NOTFOUND);
744 ScDPObject* pDPObj = GetViewData().GetDocument().GetDPAtCursor( GetViewData().GetCurX(),
745 GetViewData().GetCurY(), GetViewData().GetTabNo() );
754 GetViewData().GetMultiArea( xRanges );
755 size_t nRangeCount = xRanges->
size();
756 bool bContinue =
true;
758 for (
size_t nRangePos=0; nRangePos < nRangeCount && bContinue; nRangePos++)
760 ScRange const & rRange = (*xRanges)[nRangePos];
767 for (
SCROW nRow=nStartRow; nRow<=nEndRow && bContinue; nRow++)
768 for (
SCCOL nCol=nStartCol; nCol<=nEndCol && bContinue; nCol++)
770 sheet::DataPilotTableHeaderData
aData;
772 if ( aData.Dimension < 0 )
776 if ( nStartDimension < 0 )
778 nStartDimension = aData.Dimension;
779 nStartHierarchy = aData.Hierarchy;
780 nStartLevel = aData.Level;
782 if ( aData.Dimension != nStartDimension ||
783 aData.Hierarchy != nStartHierarchy ||
784 aData.Level != nStartLevel )
793 if ( aData.Flags & sheet::MemberResultFlags::HASMEMBER )
794 rEntries.insert(aData.MemberName);
799 rDimension = nStartDimension;
810 SCCOL nCurX = GetViewData().GetCurX();
811 SCROW nCurY = GetViewData().GetCurY();
812 SCTAB nTab = GetViewData().GetTabNo();
813 ScDocument& rDoc = GetViewData().GetDocument();
820 GetSelectedMemberList( aEntries, nSelectDimension );
822 if (!aEntries.empty())
825 OUString aDimName = pDPObj->
GetDimName( nSelectDimension, bIsDataLayout );
826 OUString aBaseDimName( aDimName );
828 bool bInGroupDim =
false;
829 bool bFoundParts =
false;
854 rOldInfo = pNumGroupDim->
GetInfo();
855 rParts = css::sheet::DataPilotFieldGroupBy::DAYS;
861 else if ( pGroupDim )
877 if ( bFound && !bFoundParts )
882 if ( !bFound && !bInGroupDim )
888 if ( (GetViewData().GetSimpleArea( aSelRange ) ==
SC_MARK_SIMPLE) &&
899 if ( nType == SvNumFormatType::DATE || nType == SvNumFormatType::TIME || nType == SvNumFormatType::DATETIME )
923 SCCOL nCurX = GetViewData().GetCurX();
924 SCROW nCurY = GetViewData().GetCurY();
925 SCTAB nTab = GetViewData().GetTabNo();
926 ScDocument& rDoc = GetViewData().GetDocument();
933 GetSelectedMemberList( aEntries, nSelectDimension );
935 if (!aEntries.empty())
938 OUString aDimName = pDPObj->
GetDimName( nSelectDimension, bIsDataLayout );
940 bool bInGroupDim =
false;
952 rOldInfo = pNumGroupDim->
GetInfo();
958 if ( !bFound && !bInGroupDim )
964 if ( (GetViewData().GetSimpleArea( aSelRange ) ==
SC_MARK_SIMPLE) &&
987 ScDPObject* pDPObj = GetViewData().GetDocument().GetDPAtCursor( GetViewData().GetCurX(),
988 GetViewData().GetCurY(), GetViewData().GetTabNo() );
994 GetSelectedMemberList( aEntries, nSelectDimension );
996 if (aEntries.empty())
999 std::vector<OUString> aDeletedNames;
1001 OUString aDimName = pDPObj->
GetDimName( nSelectDimension, bIsDataLayout );
1007 OUString aBaseDimName = aDimName;
1009 aBaseDimName = pBaseGroupDim->GetSourceDimName();
1015 aData.RemoveAllGroupDimensions(aBaseDimName, &aDeletedNames);
1022 sal_Int32 nMask = 1;
1025 if ( nParts & nMask )
1032 if ( (nParts == sheet::DataPilotFieldGroupBy::DAYS) && (rInfo.
mfStep >= 1.0) )
1041 pDimData->AddNumGroupDimension( aNumGroupDim );
1046 pDimData->AddNumGroupDimension( aNumGroupDim );
1054 OUString aGroupDimName =
1055 pDimData->CreateDateGroupDimName(nMask, *pDPObj,
true, &aDeletedNames);
1058 pDimData->AddGroupDimension( aGroupDim );
1062 if ( pSaveDimension->
GetOrientation() == sheet::DataPilotFieldOrientation_HIDDEN )
1066 aData.SetPosition( pSaveDimension, 0 );
1075 ScDBDocFunc aFunc( *GetViewData().GetDocShell() );
1085 ScDPObject* pDPObj = GetViewData().GetDocument().GetDPAtCursor( GetViewData().GetCurX(),
1086 GetViewData().GetCurY(), GetViewData().GetTabNo() );
1092 GetSelectedMemberList( aEntries, nSelectDimension );
1094 if (aEntries.empty())
1098 OUString aDimName = pDPObj->
GetDimName( nSelectDimension, bIsDataLayout );
1113 pDimData->AddNumGroupDimension( aNumGroupDim );
1117 ScDBDocFunc aFunc( *GetViewData().GetDocShell() );
1127 ScDPObject* pDPObj = GetViewData().GetDocument().GetDPAtCursor( GetViewData().GetCurX(),
1128 GetViewData().GetCurY(), GetViewData().GetTabNo() );
1134 GetSelectedMemberList( aEntries, nSelectDimension );
1136 if (aEntries.empty())
1140 OUString aDimName = pDPObj->
GetDimName( nSelectDimension, bIsDataLayout );
1146 OUString aBaseDimName = aDimName;
1148 if ( pBaseGroupDim )
1160 if ( pGroupDimension )
1164 if ( pBaseGroupDim )
1179 std::unique_ptr<ScDPSaveGroupDimension> pNewGroupDim;
1180 if ( !pGroupDimension )
1183 OUString aGroupDimName =
1184 pDimData->CreateGroupDimName(aBaseDimName, *pDPObj,
false,
nullptr);
1187 pGroupDimension = pNewGroupDim.get();
1189 if ( pBaseGroupDim )
1199 for (
tools::Long nGroup = 0; nGroup < nGroupCount; nGroup++ )
1219 if ( pBaseGroupDim )
1236 pDimData->AddGroupDimension( *pNewGroupDim );
1237 pNewGroupDim.reset();
1240 pGroupDimension =
nullptr;
1244 if ( pSaveDimension->
GetOrientation() == sheet::DataPilotFieldOrientation_HIDDEN )
1248 aData.SetPosition( pSaveDimension, 0 );
1252 ScDBDocFunc aFunc( *GetViewData().GetDocShell() );
1262 ScDPObject* pDPObj = GetViewData().GetDocument().GetDPAtCursor( GetViewData().GetCurX(),
1263 GetViewData().GetCurY(), GetViewData().GetTabNo() );
1269 GetSelectedMemberList( aEntries, nSelectDimension );
1271 if (aEntries.empty())
1275 OUString aDimName = pDPObj->
GetDimName( nSelectDimension, bIsDataLayout );
1278 if (!
aData.GetExistingDimensionData())
1286 if ( ( pGroupDim && pGroupDim->
GetDatePart() != 0 ) ||
1287 ( pNumGroupDim && pNumGroupDim->
GetDatePart() != 0 ) )
1298 for (
const auto& rEntry : aEntries)
1302 bool bEmptyDim = pGroupDim->
IsEmpty();
1316 aData.RemoveDimensionByName( aDimName );
1319 else if ( pNumGroupDim )
1327 ScDBDocFunc aFunc( *GetViewData().GetDocShell() );
1337 sal_Int32
n = rSubtotal.getLength();
1339 OUStringBuffer
aBuf, aWordBuf;
1340 for (sal_Int32
i = 0;
i < n; ++
i)
1345 OUString aWord = aWordBuf.makeStringAndClear();
1346 if (aWord == rMemberName)
1361 aWordBuf.append(
'\\');
1368 if (!aWordBuf.isEmpty())
1370 OUString aWord = aWordBuf.makeStringAndClear();
1371 if (aWord == rMemberName)
1377 return aBuf.makeStringAndClear();
1384 ScDocument& rDoc = GetViewData().GetDocument();
1391 if ( aOldText == rString )
1397 const char* pErrorId =
nullptr;
1401 bool bChange =
false;
1402 bool bNeedReloadGroups =
false;
1404 DataPilotFieldOrientation nOrient = DataPilotFieldOrientation_HIDDEN;
1409 if (
aData.GetExistingDimensionData() )
1420 pGroupDim->
Rename( rString );
1429 pErrorId = STR_INVALIDNAME;
1432 else if (nOrient == DataPilotFieldOrientation_COLUMN || nOrient == DataPilotFieldOrientation_ROW)
1434 bool bDataLayout =
false;
1435 OUString aDimName = pDPObj->
GetDimName(nField, bDataLayout);
1439 if (!rString.isEmpty())
1441 if (rString.equalsIgnoreAsciiCase(aDimName))
1452 pErrorId = STR_INVALIDNAME;
1455 pErrorId = STR_INVALIDNAME;
1465 if (!rString.isEmpty())
1467 if (pDim->
GetName().equalsIgnoreAsciiCase(rString))
1478 pErrorId = STR_INVALIDNAME;
1481 pErrorId = STR_INVALIDNAME;
1487 sheet::DataPilotTableHeaderData aPosData;
1490 if ((aPosData.Flags & MemberResultFlags::HASMEMBER) && !aOldText.isEmpty())
1492 if (
aData.GetExistingDimensionData() && !(aPosData.Flags & MemberResultFlags::SUBTOTAL))
1495 OUString aDimName = pDPObj->
GetDimName( aPosData.Dimension, bIsDataLayout );
1503 if (!rString.isEmpty() && !pGroupDim->
GetNamedGroup(rString))
1507 pGroup->
Rename( rString );
1520 pSaveMember->
SetName( rString );
1523 bNeedReloadGroups =
true;
1526 pErrorId = STR_INVALIDNAME;
1529 else if (aPosData.Flags & MemberResultFlags::GRANDTOTAL)
1531 aData.SetGrandTotalName(rString);
1534 else if (aPosData.Dimension >= 0 && !aPosData.MemberName.isEmpty())
1536 bool bDataLayout =
false;
1537 OUString aDimName = pDPObj->
GetDimName(static_cast<tools::Long>(aPosData.Dimension), bDataLayout);
1543 if (aPosData.Flags & MemberResultFlags::SUBTOTAL)
1550 if (rString.isEmpty())
1552 pErrorId = STR_INVALIDNAME;
1556 if (aPosData.MemberName.equalsIgnoreAsciiCase(rString))
1567 pErrorId = STR_INVALIDNAME;
1584 if (aPosData.Flags & MemberResultFlags::SUBTOTAL)
1587 if (
aData.GetDataDimensionCount() > 1)
1597 const std::optional<OUString> & pLayoutName = pMem->
GetLayoutName();
1598 OUString aMemberName;
1600 aMemberName = *pLayoutName;
1602 aMemberName = aPosData.MemberName;
1612 if (!rString.isEmpty())
1614 if (rString.equalsIgnoreAsciiCase(pMem->
GetName()))
1625 pErrorId = STR_INVALIDNAME;
1628 pErrorId = STR_INVALIDNAME;
1640 ScDBDocFunc aFunc( *GetViewData().GetDocShell() );
1642 if (bNeedReloadGroups)
1657 pErrorId = STR_ERR_DATAPILOT_INPUT;
1658 ErrorMessage(pErrorId);
1664 std::unique_ptr<ScDPSaveMember> pNewMember;
1670 rDim.
AddMember( std::move(pNewMember) );
1677 struct ScOUStringCollate
1681 explicit ScOUStringCollate(
CollatorWrapper* pColl) : mpCollator(pColl) {}
1683 bool operator()(
const OUString& rStr1,
const OUString& rStr2)
const
1710 OUString aDimName = pDPObj->
GetDimName(nDimIndex, bDataLayout);
1719 const MemList& rDimMembers = pSaveDim->
GetMembers();
1720 vector<OUString> aMembers;
1721 std::unordered_set<OUString> aMemberSet;
1722 size_t nMemberCount = 0;
1725 aMembers.push_back(pMem->GetName());
1726 aMemberSet.insert(pMem->GetName());
1732 std::stable_sort(aMembers.begin(), aMembers.end(), aCollate);
1736 typedef std::unordered_map<OUString, sal_uInt16> UserSortMap;
1737 UserSortMap aSubStrs;
1738 sal_uInt16 nSubCount = 0;
1744 size_t n = pUserList->
size();
1745 if (!n || *pUserListId >= static_cast<sal_uInt16>(n))
1751 for (sal_uInt16
i = 0;
i < n; ++
i)
1754 if (!aMemberSet.count(aSub))
1758 aSubStrs.emplace(aSub, nSubCount++);
1763 vector<OUString> aRankedNames(nMemberCount);
1764 sal_uInt16 nCurStrId = 0;
1765 for (
auto const& aMemberName : aMembers)
1767 sal_uInt16 nRank = 0;
1768 UserSortMap::const_iterator itrSub = aSubStrs.find(aMemberName);
1769 if (itrSub == aSubStrs.end())
1770 nRank = nSubCount + nCurStrId++;
1772 nRank = itrSub->second;
1775 nRank =
static_cast< sal_uInt16
>( nMemberCount - nRank - 1 );
1777 aRankedNames[nRank] = aMemberName;
1781 for (
auto const& aRankedName : aRankedNames)
1794 sheet::DataPilotFieldSortInfo aSortInfo;
1795 aSortInfo.Mode = sheet::DataPilotFieldSortMode::MANUAL;
1802 sheet::DataPilotFieldSortInfo aSortInfo;
1803 aSortInfo.Mode = sheet::DataPilotFieldSortMode::NAME;
1804 aSortInfo.IsAscending = bAscending;
1810 std::unique_ptr<ScDPObject> pNewObj(
new ScDPObject(*pDPObj));
1811 pNewObj->SetSaveData(aNewSaveData);
1820 ScDocument& rDoc = GetViewData().GetDocument();
1824 sheet::DataPilotTableHeaderData aDestData;
1826 bool bValid = ( aDestData.Dimension >= 0 );
1829 std::unordered_set< OUString > aMembersSet;
1830 std::vector< OUString > aMembersVector;
1831 aMembersVector.reserve( std::max( static_cast<SCSIZE>( rSource.
aEnd.
Col() - rSource.
aStart.
Col() + 1 ),
1836 sheet::DataPilotTableHeaderData aSourceData;
1838 if ( aSourceData.Dimension == aDestData.Dimension && !aSourceData.MemberName.isEmpty() )
1840 if ( aMembersSet.insert( aSourceData.MemberName ).second )
1842 aMembersVector.push_back( aSourceData.MemberName );
1853 OUString aDimName = pDPObj->
GetDimName( aDestData.Dimension, bIsDataLayout );
1854 if ( !bIsDataLayout )
1860 uno::Sequence<OUString> aMemberNames;
1863 bool bInserted =
false;
1865 for (
const OUString& aMemberStr : std::as_const(aMemberNames))
1867 if ( !bInserted && aMemberStr == aDestData.MemberName )
1870 for (
const auto& rMember : aMembersVector )
1875 if ( aMembersSet.find( aMemberStr ) == aMembersSet.end() )
1880 for (
const auto& rMember : aMembersVector )
1886 sheet::DataPilotFieldSortInfo aSortInfo;
1887 aSortInfo.Mode = sheet::DataPilotFieldSortMode::MANUAL;
1888 pDim->SetSortInfo( &aSortInfo );
1891 ScDBDocFunc aFunc( *GetViewData().GetDocShell() );
1892 std::unique_ptr<ScDPObject> pNewObj(
new ScDPObject( *pDPObj ));
1893 pNewObj->SetSaveData(
aData );
1911 ScDPObject* pDPObj = GetViewData().GetDocument().GetDPAtCursor( GetViewData().GetCurX(),
1912 GetViewData().GetCurY(), GetViewData().GetTabNo() );
1917 GetSelectedMemberList( aEntries, nSelectDimension );
1919 if (!aEntries.empty())
1922 OUString aDimName = pDPObj->
GetDimName( nSelectDimension, bIsDataLayout );
1923 if ( !bIsDataLayout )
1929 css::sheet::DataPilotFieldOrientation nDimOrient = pDim->
GetOrientation();
1931 if ( pDim == pInner )
1933 rOrientation = nDimOrient;
1946 ScDPObject* pDPObj = GetViewData().GetDocument().GetDPAtCursor( GetViewData().GetCurX(),
1947 GetViewData().GetCurY(), GetViewData().GetTabNo() );
1953 GetSelectedMemberList( aEntries, nSelectDimension );
1955 if (aEntries.empty())
1959 OUString aDimName = pDPObj->
GetDimName( nSelectDimension, bIsDataLayout );
1960 if ( bIsDataLayout )
1966 if ( bShow && pNewDimensionName )
1972 if ( pNewDim->
GetOrientation() == sheet::DataPilotFieldOrientation_DATA )
1976 pDuplicated =
aData.DuplicateDimension( *pNewDimensionName );
1979 css::sheet::DataPilotFieldOrientation nOrientation = pDim->GetOrientation();
1983 aData.SetPosition( pNewDim, nPosition );
1987 aData.GetDataDimensionCount() <= 1 )
1991 aData.SetPosition( pDataLayout, nPosition );
1997 aData.SetPosition( pDuplicated, nPosition );
2006 for (
const OUString& aVisName : aVisibleEntries)
2013 for (
const auto& rEntry : aEntries)
2020 ScDBDocFunc aFunc( *GetViewData().GetDocShell() );
2021 std::unique_ptr<ScDPObject> pNewObj(
new ScDPObject( *pDPObj ));
2022 pNewObj->SetSaveData(
aData );
2032 ScDocument& rDoc = GetViewData().GetDocument();
2035 ErrorMessage(STR_READONLYERR);
2039 Reference<sheet::XDimensionsSupplier> xDimSupplier = rDPObj.
GetSource();
2041 Reference<sheet::XDrillDownDataSupplier> xDDSupplier(xDimSupplier, UNO_QUERY);
2042 if (!xDDSupplier.is())
2045 Sequence< Sequence<Any> > aTabData = xDDSupplier->getDrillDownData(rFilters);
2046 sal_Int32 nRowSize = aTabData.getLength();
2051 SCCOL nColSize = aTabData[0].getLength();
2053 SCTAB nNewTab = GetViewData().GetTabNo();
2056 pInsDoc->ResetClip( &rDoc, nNewTab );
2057 for (
SCROW nRow = 0; nRow < nRowSize; ++nRow)
2059 for (
SCCOL nCol = 0; nCol < nColSize; ++nCol)
2061 const Any& rAny = aTabData[nRow][nCol];
2066 pInsDoc->SetString(
ScAddress(nCol,nRow,nNewTab), aStr);
2068 else if (rAny >>= fVal)
2069 pInsDoc->SetValue(nCol, nRow, nNewTab, fVal);
2074 for (
SCCOL nCol = 0; nCol < nColSize; ++nCol)
2077 if (!(aTabData[0][nCol] >>= aStr))
2085 sal_Int32 nNumFmt = 0;
2086 if (!(any >>= nNumFmt))
2091 pInsDoc->ApplyPatternAreaTab(nCol, 1, nCol, nRowSize-1, nNewTab, aPattern);
2096 pInsDoc->GetCellArea( nNewTab, nEndCol, nEndRow );
2097 pInsDoc->SetClipArea(
ScRange( 0, 0, nNewTab, nEndCol, nEndRow, nNewTab ) );
2099 SfxUndoManager* pMgr = GetViewData().GetDocShell()->GetUndoManager();
2100 OUString aUndo =
ScResId( STR_UNDO_DOOUTLINE );
2101 pMgr->
EnterListAction( aUndo, aUndo, 0, GetViewData().GetViewShell()->GetViewShellId() );
2103 OUString aNewTabName;
2105 if ( InsertTable(aNewTabName, nNewTab) )
2115 SCCOL nCurX = GetViewData().GetCurX();
2116 SCROW nCurY = GetViewData().GetCurY();
2117 SCTAB nTab = GetViewData().GetTabNo();
2118 ScDocument& rDoc = GetViewData().GetDocument();
2129 bool bSort = aSortParam.
maKeyState[0].bDoSort;
2135 if ( bQuery || bSort || bSubTotal )
2137 bool bQuerySize =
false;
2140 if (bQuery && !aQueryParam.
bInplace)
2156 pDBData->
GetArea( nDummy, nStartCol, nStartRow, nEndCol, nEndRow );
2161 std::unique_ptr<ScOutlineTable> pUndoTab;
2162 std::unique_ptr<ScRangeName> pUndoRange;
2163 std::unique_ptr<ScDBCollection> pUndoDB;
2181 pUndoDoc->InitUndo( rDoc, nTab, nTab,
true,
true );
2186 pUndoDoc->InitUndo( rDoc, nTab, nTab,
false,
true );
2196 if (!pDocRange->
empty())
2199 if (!pDocDB->
empty())
2203 if (bSort && bSubTotal)
2208 DoSubTotals( aSubTotalParam,
false );
2214 Sort( aSortParam,
false,
false);
2223 Query( aQueryParam, &aAdvSource,
false );
2226 Query( aQueryParam,
nullptr,
false );
2236 DoSubTotals( aSubTotalParam,
false );
2243 SCROW nDummyRow, nNewEndRow;
2244 pDBData->
GetArea( nDummyTab, nDummyCol,nDummyRow, nDummyCol,nNewEndRow );
2246 const ScRange* pOld =
nullptr;
2247 const ScRange* pNew =
nullptr;
2260 GetViewData().GetDocShell()->GetUndoManager()->AddUndoAction(
2261 std::make_unique<ScUndoRepeatDB>( GetViewData().GetDocShell(), nTab,
2262 nStartCol, nStartRow, nEndCol, nEndRow,
2265 std::move(pUndoDoc), std::move(pUndoTab),
2266 std::move(pUndoRange), std::move(pUndoDB),
2270 GetViewData().GetDocShell()->PostPaint(
2275 ErrorMessage(STR_MSSG_REPEATDB_0);
2283 SCTAB nCurrentTabIndex = GetViewData().GetTabNo();
2289 if (pTabViewShell && pTabViewShell->
GetDocId() == pThisViewShell->
GetDocId())
2296 if (pTabViewShell->
getPart() == nCurrentTabIndex)
::std::vector< ScSortKeyState > maKeyState
bool bGroupActive[MAXSUBTOTAL]
active groups
const ScDPDimensionSaveData * GetExistingDimensionData() const
SC_DLLPUBLIC ScDPObject * GetDPAtCursor(SCCOL nCol, SCROW nRow, SCTAB nTab) const
const OUString & GetGroupDimName() const
function is determined automatically.
Collection of user-defined sort lists.
bool IsDimNameInUse(std::u16string_view rName) const
void GetHeaderPositionData(const ScAddress &rPos, css::sheet::DataPilotTableHeaderData &rData)
SC_DLLPUBLIC ScDBCollection * GetDBCollection() const
void DataPilotInput(const ScAddress &rPos, const OUString &rString)
void ShowDataPilotSourceData(ScDPObject &rDPObj, const css::uno::Sequence< css::sheet::DataPilotFieldFilter > &rFilters)
todo: It should be possible to have MarkArrays for each table, in order to enable "search all" across...
This class has to do with handling exclusively grouped dimensions? TODO: Find out what this class doe...
sal_Int32 compareString(const OUString &s1, const OUString &s2) const
void Rename(const OUString &rNewName)
void SetOrientation(css::sheet::DataPilotFieldOrientation nNew)
SC_DLLPUBLIC bool IsHidden() const
bool RemoveAllOutlines(SCTAB nTab, bool bRecord)
bool MakePivotTable(const ScDPSaveData &rData, const ScRange &rDest, bool bNewTable, const ScDPObject &rSource)
bool IsMemberNameInUse(const OUString &rName) const
const MemberList & GetMembers() const
css::sheet::DataPilotFieldOrientation GetOrientation() const
SC_DLLPUBLIC void GetSortParam(ScSortParam &rSortParam) const
SC_DLLPUBLIC SCCOLROW GetEnd() const
static void lcl_MoveToEnd(ScDPSaveDimension &rDim, const OUString &rItemName)
int getPart() const override
See SfxViewShell::getPart().
ScGeneralFunction GetSubTotalFunc(tools::Long nIndex) const
SC_DLLPUBLIC ScRangeName * GetRangeName(SCTAB nTab) const
Classes to save Data Pilot settings that create new dimensions (fields).
const OUString & GetGroupName() const
SC_DLLPUBLIC ScDPCollection * GetDPCollection()
ViewShellDocId GetDocId() const override
void SetOutRange(const ScRange &rRange)
static SC_DLLPUBLIC CollatorWrapper * GetCollator()
const OUString & GetSourceDimName() const
void RemoveGroupDimension(const OUString &rGroupDimName)
void MakeOutline(bool bColumns, bool bRecord=true)
const SfxItemSet & GetItemSet() const
const ContentProperties & rData
SC_DLLPUBLIC const ScDBData * GetDBAtArea(SCTAB nTab, SCCOL nCol1, SCROW nRow1, SCCOL nCol2, SCROW nRow2) const
sal_Int32 GetDatePart() const
ScDPSaveMember * GetExistingMemberByName(const OUString &rName)
SC_DLLPUBLIC bool CreateQueryParam(const ScRange &rRange, ScQueryParam &rQueryParam)
void RemoveNumGroupDimension(const OUString &rGroupDimName)
const ScDPNumGroupInfo & GetDateInfo() const
void SetName(const OUString &rNew)
static OUString lcl_MakePivotTabName(std::u16string_view rPrefix, SCTAB nNumber)
bool DoSubTotals(SCTAB nTab, ScSubTotalParam &rParam)
SC_DLLPUBLIC bool HasAttrib(SCCOL nCol1, SCROW nRow1, SCTAB nTab1, SCCOL nCol2, SCROW nRow2, SCTAB nTab2, HasAttrFlags nMask) const
static void notifyAllViewsSheetGeomInvalidation(const SfxViewShell *pForViewShell, bool bColumns, bool bRows, bool bSizes, bool bHidden, bool bFiltered, bool bGroups, SCTAB nCurrentTabIndex)
Emits a LOK_CALLBACK_INVALIDATE_SHEET_GEOMETRY for all views whose current tab is equal to nCurrentTa...
void HideMarkedOutlines(bool bRecord=true)
virtual void ShowCursor(bool bOn) override
bool HasSelectionForDateGroup(ScDPNumGroupInfo &rOldInfo, sal_Int32 &rParts)
SfxApplication * SfxGetpApp()
void ShowOutline(bool bColumns, sal_uInt16 nLevel, sal_uInt16 nEntry, bool bRecord=true, bool bPaint=true)
bool UpdatePivotTable(ScDPObject &rDPObj, bool bRecord, bool bApi)
virtual SfxUndoManager * GetUndoManager() override
void DateGroupDataPilot(const ScDPNumGroupInfo &rInfo, sal_Int32 nParts)
Stores individual user-defined sort list.
const ScDPSaveGroupDimension * GetNamedGroupDim(const OUString &rGroupDimName) const
void RefreshPivotTables(const ScDPObject *pDPObj, bool bApi)
Reload the referenced pivot cache, and refresh all pivot tables that reference the cache...
SC_DLLPUBLIC SCROW MaxRow() const
sal_Int32 SCCOLROW
a type capable of holding either SCCOL or SCROW
SC_DLLPUBLIC SCTAB GetTableCount() const
static SfxViewShell * GetNext(const SfxViewShell &rPrev, bool bOnlyVisible=true, const std::function< bool(const SfxViewShell *)> &isViewShell=nullptr)
SC_DLLPUBLIC OUString GetString(SCCOL nCol, SCROW nRow, SCTAB nTab, const ScInterpreterContext *pContext=nullptr) const
void DataPilotSort(ScDPObject *pDPObject, tools::Long nDimIndex, bool bAscending, const sal_uInt16 *pUserListId=nullptr)
void CopyToDocument(SCCOL nCol1, SCROW nRow1, SCTAB nTab1, SCCOL nCol2, SCROW nRow2, SCTAB nTab2, InsertDeleteFlags nFlags, bool bMarked, ScDocument &rDestDoc, const ScMarkData *pMarks=nullptr, bool bColRowFlags=true)
void DoSubTotals(const ScSubTotalParam &rParam, bool bRecord=true, const ScSortParam *pForceNewSort=nullptr)
SC_DLLPUBLIC const ScQueryEntry & GetEntry(SCSIZE n) const
const OUString & GetName() const
bool ReloadGroupsInCache(const ScDPObject *pDPObj, o3tl::sorted_vector< ScDPObject * > &rRefs)
void MakeOutline(const ScRange &rRange, bool bColumns, bool bRecord, bool bApi)
void AddElementsFromGroup(const ScDPSaveGroupItem &rGroup)
size_t GetSubCount() const
bool HasSelectionForNumGroup(ScDPNumGroupInfo &rOldInfo)
void SetGroupInfo(const ScDPNumGroupInfo &rNew)
sal_Int32 GetDatePart() const
bool IsDataDescriptionCell(const ScAddress &rPos)
Data description cell displays the description of a data dimension if and only if there is only one d...
ScViewData & GetViewData()
std::vector< ScDPSaveMember * > MemberList
SC_DLLPUBLIC const SfxPoolItem * GetAttr(SCCOL nCol, SCROW nRow, SCTAB nTab, sal_uInt16 nWhich) const
void GetRange(SCCOLROW &rStart, SCCOLROW &rEnd) const
void SetOutlineState(bool bColumn, sal_uInt16 nLevel, sal_uInt16 nEntry, bool bHidden)
constexpr OUStringLiteral aData
ScDPSaveGroupDimension * GetNamedGroupDimAcc(const OUString &rGroupDimName)
ScDPSaveDimension * GetInnermostDimension(css::sheet::DataPilotFieldOrientation nOrientation)
void SetLayoutName(const OUString &rName)
SC_DLLPUBLIC double GetValue(const ScAddress &rPos) const
void SetArea(SCTAB nTab, SCCOL nCol1, SCROW nRow1, SCCOL nCol2, SCROW nRow2)
tools::Long GetGroupCount() const
void SetMarkArea(const ScRange &rRange)
SC_DLLPUBLIC SCCOL MaxCol() const
void RepeatDB(bool bRecord=true)
SC_DLLPUBLIC SvNumberFormatter * GetFormatTable() const
virtual void AddUndoAction(std::unique_ptr< SfxUndoAction > pAction, bool bTryMerg=false)
const ScDPSaveGroupItem & GetGroupByIndex(tools::Long nIndex) const
void RemoveOutline(const ScRange &rRange, bool bColumns, bool bRecord, bool bApi)
tools::Long GetSubTotalsCount() const
SC_DLLPUBLIC void SetDimensionData(const ScDPDimensionSaveData *pNew)
bool HideMarkedOutlines(const ScRange &rRange, bool bRecord)
Represents a group dimension that introduces a new hierarchy for an existing dimension.
SC_DLLPUBLIC SCCOLROW GetStart() const
SC_DLLPUBLIC void SetLayoutName(const OUString &rName)
css::uno::Reference< css::sheet::XDimensionsSupplier > const & GetSource()
void invalidateByIndex(index_type nIndex)
std::unique_ptr< ScDocument, o3tl::default_delete< ScDocument > > ScDocumentUniquePtr
const ScOutlineArray & GetRowArray() const
void RemoveGroup(const OUString &rGroupName)
const ScOutlineArray & GetColArray() const
bool DataPilotUpdate(ScDPObject *pOldObj, const ScDPObject *pNewObj, bool bRecord, bool bApi, bool bAllowMove=false)
void OnLOKShowHideColRow(bool bColumns, SCCOLROW nStartRow)
void SetSaveData(const ScDPSaveData &rData)
void SetName(const OUString &rNew)
SC_DLLPUBLIC void CreateValidTabName(OUString &rName) const
bool OutlinePossible(bool bHide)
OUString ScResId(const char *pId)
static SC_DLLPUBLIC ScUserList * GetUserList()
constexpr TypedWhichId< SfxUInt32Item > ATTR_VALUE_FORMAT(146)
SC_DLLPUBLIC bool InsertTab(SCTAB nPos, const OUString &rName, bool bExternalDocument=false, bool bUndoDeleteTab=false)
bool Remove(SCCOLROW nBlockStart, SCCOLROW nBlockEnd, bool &rSizeChanged)
ScDPSaveData * GetSaveData() const
void Consolidate(const ScConsolidateParam &rParam)
void RemoveAllOutlines(bool bRecord=true)
const ScDPNumGroupInfo & GetDateInfo() const
void AutoOutline(const ScRange &rRange, bool bRecord)
void SelectLevel(bool bColumns, sal_uInt16 nLevel, bool bRecord=true)
SC_DLLPUBLIC ScDPSaveDimension * GetExistingDimensionByName(std::u16string_view rName) const
void ShowMarkedOutlines(bool bRecord=true)
SC_DLLPUBLIC bool HasValueData(SCCOL nCol, SCROW nRow, SCTAB nTab) const
static SfxViewShell * GetFirst(bool bOnlyVisible=true, const std::function< bool(const SfxViewShell *)> &isViewShell=nullptr)
static void notifyAllViewsHeaderInvalidation(const SfxViewShell *pForViewShell, HeaderType eHeaderType, SCTAB nCurrentTabIndex)
Emits a LOK_CALLBACK_INVALIDATE_HEADER for all views whose current tab is equal to nCurrentTabIndex...
void PostPaint(SCCOL nStartCol, SCROW nStartRow, SCTAB nStartTab, SCCOL nEndCol, SCROW nEndRow, SCTAB nEndTab, PaintPartFlags nPart, sal_uInt16 nExtFlags=0)
void GetArea(SCTAB &rTab, SCCOL &rCol1, SCROW &rRow1, SCCOL &rCol2, SCROW &rRow2) const
SfxViewShell * GetViewShell() const
void GetSubTotalParam(ScSubTotalParam &rSubTotalParam) const
SC_DLLPUBLIC void SetShowDetails(bool bSet)
void RemoveSubTotals(SCTAB nTab, ScSubTotalParam &rParam)
bool bReplace
replace existing results
bool SelectLevel(SCTAB nTab, bool bColumns, sal_uInt16 nLevel, bool bRecord, bool bPaint)
OUString GetDimName(tools::Long nDim, bool &rIsDataLayout, sal_Int32 *pFlags=nullptr)
bool GetMemberNames(sal_Int32 nDim, css::uno::Sequence< OUString > &rNames)
bool DataPilotMove(const ScRange &rSource, const ScAddress &rDest)
const SfxPoolItem * Put(const SfxPoolItem &rItem, sal_uInt16 nWhich)
bool RemovePivotTable(ScDPObject &rDPObj, bool bRecord, bool bApi)
void SetDirty(const ScRange &, bool bIncludeEmptyCells)
void GetSelectedMemberList(ScDPUniqueStringSet &rEntries, tools::Long &rDimension)
void HideOutline(bool bColumns, sal_uInt16 nLevel, sal_uInt16 nEntry, bool bRecord=true, bool bPaint=true)
ScOutlineEntry * GetNext()
bool ShowMarkedOutlines(const ScRange &rRange, bool bRecord)
bool HasOnlyHidden(const ScDPUniqueStringSet &rVisible)
void RemoveElementsFromGroups(ScDPSaveGroupDimension &rDimension) const
remove this group's elements from their groups in rDimension (rDimension must be a different dimensio...
ScDPSaveGroupItem * GetNamedGroupAcc(const OUString &rGroupName)
void SetSubtotalName(const OUString &rName)
std::unordered_set< OUString > ScDPUniqueStringSet
void RemoveFromGroups(const OUString &rItemName)
const OUString & GetName() const
Represents a new group dimension whose dimension ID is higher than the highest source dimension ID...
static OUString lcl_replaceMemberNameInSubtotal(const OUString &rSubtotal, std::u16string_view rMemberName)
SC_DLLPUBLIC ScOutlineTable * GetOutlineTable(SCTAB nTab, bool bCreate=false)
void Rename(const OUString &rNewName)
virtual void EnterListAction(const OUString &rComment, const OUString &rRepeatComment, sal_uInt16 nId, ViewShellId nViewShellId)
void NumGroupDataPilot(const ScDPNumGroupInfo &rInfo)
void AddElement(const OUString &rName)
const ScDPSaveGroupItem * GetNamedGroup(const OUString &rGroupName) const
void GetMemberResultNames(ScDPUniqueStringSet &rNames, tools::Long nDimension)
const ScDocument & GetDocument() const
sal_Int32 CollectDateParts(const OUString &rBaseDimName) const
SC_DLLPUBLIC void GetQueryParam(ScQueryParam &rQueryParam) const
bool TestRemoveSubTotals(SCTAB nTab, const ScSubTotalParam &rParam)
void SetDataPilotDetails(bool bShow, const OUString *pNewDimensionName=nullptr)
ScPositionHelper & GetLOKWidthHelper()
void SetDocumentModified()
bool HasSelectionForDrillDown(css::sheet::DataPilotFieldOrientation &rOrientation)
const ScDPNumGroupInfo & GetInfo() const
void DoConsolidate(const ScConsolidateParam &rParam, bool bRecord=true)
void SetSubTotalParam(const ScSubTotalParam &rSubTotalParam)
ScXMLEditAttributeMap::Entry const aEntries[]
SfxObjectShell * GetDocumentShell() const
SC_DLLPUBLIC bool GetAdvancedQuerySource(ScRange &rSource) const
bool IsUndoEnabled() const
void ShowOutline(SCTAB nTab, bool bColumns, sal_uInt16 nLevel, sal_uInt16 nEntry, bool bRecord, bool bPaint)
void RemoveOutline(bool bColumns, bool bRecord=true)
SC_DLLPUBLIC const std::optional< OUString > & GetLayoutName() const
ScPositionHelper & GetLOKHeightHelper()
const ScDPSaveNumGroupDimension * GetNumGroupDim(const OUString &rGroupDimName) const
const ScDBData * GetDBAtCursor(SCCOL nCol, SCROW nRow, SCTAB nTab, ScDBDataPortion ePortion) const
void BuildAllDimensionMembers()
void RefreshPivotTableGroups(ScDPObject *pDPObj)
Refresh the group dimensions of all pivot tables referencing the same cache.
void TestRemoveOutline(bool &rCol, bool &rRow)
SC_DLLPUBLIC bool GetName(SCTAB nTab, OUString &rName) const
void AddGroupItem(const ScDPSaveGroupItem &rItem)
SC_DLLPUBLIC ScDPSaveDimension * GetDimensionByName(const OUString &rName)
Get a dimension object by its name.
#define SC_UNO_DP_NUMBERFO
static weld::MessageDialog * CreateMessageDialog(weld::Widget *pParent, VclMessageType eMessageType, VclButtonsType eButtonType, const OUString &rPrimaryMessage, bool bMobile=false)
Create before modifications of the document and destroy thereafter.
tools::Long GetHeaderDim(const ScAddress &rPos, css::sheet::DataPilotFieldOrientation &rOrient)
bool HideOutline(SCTAB nTab, bool bColumns, sal_uInt16 nLevel, sal_uInt16 nEntry, bool bRecord, bool bPaint)
void SetDateInfo(const ScDPNumGroupInfo &rInfo, sal_Int32 nPart)
OUString CreateGroupName(std::u16string_view rPrefix)
void AddMember(std::unique_ptr< ScDPSaveMember > pMember)
OUString GetSubStr(sal_uInt16 nIndex) const
void SetSortInfo(const css::sheet::DataPilotFieldSortInfo *pNew)