28 #include <com/sun/star/beans/XPropertySet.hpp>
29 #include <com/sun/star/container/XNameAccess.hpp>
30 #include <com/sun/star/sheet/DataPilotFieldFilter.hpp>
31 #include <com/sun/star/sheet/DataPilotFieldGroupBy.hpp>
32 #include <com/sun/star/sheet/DataPilotFieldOrientation.hpp>
33 #include <com/sun/star/sheet/DataPilotFieldSortMode.hpp>
34 #include <com/sun/star/sheet/DataPilotTableHeaderData.hpp>
35 #include <com/sun/star/sheet/MemberResultFlags.hpp>
36 #include <com/sun/star/sheet/XDimensionsSupplier.hpp>
37 #include <com/sun/star/sheet/XDrillDownDataSupplier.hpp>
41 #include <globstr.hrc>
57 #include <unonames.hxx>
66 #include <osl/diagnose.h>
69 #include <string_view>
70 #include <unordered_set>
71 #include <unordered_map>
76 using ::com::sun::star::uno::Any;
77 using ::com::sun::star::uno::Sequence;
78 using ::com::sun::star::uno::Reference;
79 using ::com::sun::star::uno::UNO_QUERY;
80 using ::com::sun::star::beans::XPropertySet;
81 using ::com::sun::star::container::XNameAccess;
82 using ::com::sun::star::sheet::XDimensionsSupplier;
94 ScDocShell* pDocSh = GetViewData().GetDocShell();
96 aFunc.
MakeOutline( aRange, bColumns, bRecord,
false );
100 bColumns, !bColumns,
false ,
102 true , GetViewData().GetTabNo());
105 ErrorMessage(STR_NOMULTISELECT);
115 ScDocShell* pDocSh = GetViewData().GetDocShell();
121 bColumns, !bColumns,
false ,
123 true , GetViewData().GetTabNo());
126 ErrorMessage(STR_NOMULTISELECT);
133 bool bColFound =
false;
134 bool bRowFound =
false;
136 SCCOL nStartCol, nEndCol;
137 SCROW nStartRow, nEndRow;
138 SCTAB nStartTab, nEndTab;
139 if (GetViewData().GetSimpleArea(nStartCol,nStartRow,nStartTab,nEndCol,nEndRow,nEndTab) ==
SC_MARK_SIMPLE)
141 SCTAB nTab = nStartTab;
142 ScDocument& rDoc = GetViewData().GetDocument();
149 bool bColMarked = ( nStartRow == 0 && nEndRow == rDoc.
MaxRow() );
150 bool bRowMarked = ( nStartCol == 0 && nEndCol == rDoc.
MaxCol() );
154 if ( !bRowMarked || bColMarked )
165 if ( nStartCol<=static_cast<SCCOL>(nEnd) && nEndCol>=static_cast<SCCOL>(nStart) )
172 if ( !bColMarked || bRowMarked )
183 if ( nStartRow<=nEnd && nEndRow>=nStart )
196 SCTAB nTab = GetViewData().GetTabNo();
197 ScDocShell* pDocSh = GetViewData().GetDocShell();
205 true ,
true ,
false ,
216 ScDocument& rDoc = GetViewData().GetDocument();
217 SCTAB nTab = GetViewData().GetTabNo();
219 ScMarkData& rMark = GetViewData().GetMarkData();
220 if ( rMark.IsMarked() || rMark.IsMultiMarked() )
223 aRange = rMark.GetMultiMarkArea();
226 ScDocShell* pDocSh = GetViewData().GetDocShell();
235 SCTAB nTab = GetViewData().GetTabNo();
236 ScDocShell* pDocSh = GetViewData().GetDocShell();
239 bool bOk = aFunc.
SelectLevel( nTab, bColumns, nLevel, bRecord,
true );
244 bColumns, !bColumns,
false ,
255 const sal_uInt16 nHeadEntry =
static_cast< sal_uInt16
>( -1 );
256 if ( nEntry == nHeadEntry)
257 SelectLevel( bColumns, sal::static_int_cast<sal_uInt16>(nLevel) );
261 ShowOutline( bColumns, sal::static_int_cast<sal_uInt16>(nLevel), sal::static_int_cast<sal_uInt16>(nEntry) );
263 HideOutline( bColumns, sal::static_int_cast<sal_uInt16>(nLevel), sal::static_int_cast<sal_uInt16>(nEntry) );
269 SCTAB nTab = GetViewData().GetTabNo();
270 ScDocShell* pDocSh = GetViewData().GetDocShell();
273 aFunc.
ShowOutline( nTab, bColumns, nLevel, nEntry, bRecord, bPaint );
278 bColumns, !bColumns,
false ,
289 SCTAB nTab = GetViewData().GetTabNo();
290 ScDocShell* pDocSh = GetViewData().GetDocShell();
293 bool bOk = aFunc.
HideOutline( nTab, bColumns, nLevel, nEntry, bRecord, bPaint );
298 bColumns, !bColumns,
false ,
309 bool bEnable =
false;
318 if (GetViewData().GetSimpleArea(nStartCol,nStartRow,nStartTab,nEndCol,nEndRow,nEndTab) ==
SC_MARK_SIMPLE)
320 ScDocument& rDoc = GetViewData().GetDocument();
321 SCTAB nTab = GetViewData().GetTabNo();
341 if ( nStartCol<=static_cast<SCCOL>(nEnd) && nEndCol>=static_cast<SCCOL>(nStart) )
347 if ( nStart>=nStartCol && nEnd<=nEndCol )
366 if ( nStartRow<=nEnd && nEndRow>=nStart )
372 if ( nStart>=nStartRow && nEnd<=nEndRow )
390 ScDocShell* pDocSh = GetViewData().GetDocShell();
396 GetViewData().GetViewShell(),
true,
true,
397 false ,
true ,
true ,
398 true , GetViewData().GetTabNo());
403 ErrorMessage(STR_NOMULTISELECT);
413 ScDocShell* pDocSh = GetViewData().GetDocShell();
419 GetViewData().GetViewShell(),
true,
true,
420 false ,
true ,
true ,
421 true , GetViewData().GetTabNo());
426 ErrorMessage(STR_NOMULTISELECT);
436 ScDocShell* pDocSh = GetViewData().GetDocShell();
438 ScMarkData& rMark = GetViewData().GetMarkData();
439 SCTAB nTab = GetViewData().GetTabNo();
447 OSL_FAIL(
"SubTotals: no DBData" );
452 if (!aTester.IsEditable())
454 ErrorMessage(aTester.GetMessageId());
461 ErrorMessage(STR_MSSG_INSERTCELLS_0);
472 VclMessageType::Question, VclButtonsType::YesNo,
473 ScResId(STR_MSSG_DOSUBTOTALS_1)));
474 xBox->set_title(
ScResId(STR_MSSG_DOSUBTOTALS_0));
475 xBox->set_default_response(
RET_YES);
487 std::unique_ptr<ScOutlineTable> pUndoTab;
488 std::unique_ptr<ScRangeName> pUndoRange;
489 std::unique_ptr<ScDBCollection> pUndoDB;
493 bool bOldFilter = bDo && rParam.
bDoSort;
508 pUndoDoc->InitUndo( rDoc, nTab, nTab,
true,
true );
513 pUndoDoc->InitUndo( rDoc, nTab, nTab,
false, bOldFilter );
525 if (!pDocRange->
empty())
528 if (!pDocDB->
empty())
537 sal_uInt16 nDepth = rRowArray.
GetDepth();
538 for (sal_uInt16
i = 0;
i < nDepth; ++
i)
547 bool bSuccess =
true;
551 if ( rParam.
bDoSort || pForceNewSort )
560 ScSortParam aSortParam( aNewParam, pForceNewSort ? *pForceNewSort : aOldSort );
561 Sort( aSortParam,
false,
false );
573 std::make_unique<ScUndoSubTotals>( pDocSh, nTab,
574 rParam, aNewParam.
nRow2,
575 std::move(pUndoDoc), std::move(pUndoTab),
576 std::move(pUndoRange), std::move(pUndoDB) ) );
582 ErrorMessage(STR_MSSG_DOSUBTOTALS_2);
592 InitOwnBlockMode( aMarkRange );
608 ScDocShell* pDocShell = GetViewData().GetDocShell();
610 SetTabNo( rParam.
nTab,
true );
617 OUString
aName = rPrefix + OUString::number( nNumber );
630 ErrorMessage(STR_PIVOT_NODATA);
634 ScDocShell* pDocSh = GetViewData().GetDocShell();
635 ScDocument& rDoc = GetViewData().GetDocument();
641 SCTAB nSrcTab = GetViewData().GetTabNo();
647 aName +=
"_" + aStr +
"_";
649 SCTAB nNewTab = nSrcTab+1;
659 std::make_unique<ScUndoInsertTab>( pDocSh, nNewTab, bAppend,
lcl_MakePivotTabName( aName, i ) ));
662 GetViewData().InsertTab( nNewTab );
663 SetTabNo(nNewTab,
true);
665 aDestRange =
ScRange( 0, 0, nNewTab );
690 bool bAllowMove = (pDPObj !=
nullptr);
693 bool bSuccess = aFunc.
DataPilotUpdate(pDPObj, &aObj,
true,
false, bAllowMove);
708 ScDocShell* pDocSh = GetViewData().GetDocShell();
711 GetViewData().GetCurY(),
712 GetViewData().GetTabNo() );
720 ErrorMessage(STR_PIVOT_NOTFOUND);
725 ScDocShell* pDocSh = GetViewData().GetDocShell();
726 ScDocument& rDoc = GetViewData().GetDocument();
729 GetViewData().GetCurY(),
730 GetViewData().GetTabNo() );
741 ErrorMessage(STR_PIVOT_NOTFOUND);
746 ScDPObject* pDPObj = GetViewData().GetDocument().GetDPAtCursor( GetViewData().GetCurX(),
747 GetViewData().GetCurY(), GetViewData().GetTabNo() );
756 GetViewData().GetMultiArea( xRanges );
757 size_t nRangeCount = xRanges->
size();
758 bool bContinue =
true;
760 for (
size_t nRangePos=0; nRangePos < nRangeCount && bContinue; nRangePos++)
762 ScRange const & rRange = (*xRanges)[nRangePos];
769 for (
SCROW nRow=nStartRow; nRow<=nEndRow && bContinue; nRow++)
770 for (
SCCOL nCol=nStartCol; nCol<=nEndCol && bContinue; nCol++)
772 sheet::DataPilotTableHeaderData
aData;
774 if ( aData.Dimension < 0 )
778 if ( nStartDimension < 0 )
780 nStartDimension = aData.Dimension;
781 nStartHierarchy = aData.Hierarchy;
782 nStartLevel = aData.Level;
784 if ( aData.Dimension != nStartDimension ||
785 aData.Hierarchy != nStartHierarchy ||
786 aData.Level != nStartLevel )
795 if ( aData.Flags & sheet::MemberResultFlags::HASMEMBER )
796 rEntries.insert(aData.MemberName);
801 rDimension = nStartDimension;
812 SCCOL nCurX = GetViewData().GetCurX();
813 SCROW nCurY = GetViewData().GetCurY();
814 SCTAB nTab = GetViewData().GetTabNo();
815 ScDocument& rDoc = GetViewData().GetDocument();
822 GetSelectedMemberList( aEntries, nSelectDimension );
824 if (!aEntries.empty())
827 OUString aDimName = pDPObj->
GetDimName( nSelectDimension, bIsDataLayout );
828 OUString aBaseDimName( aDimName );
830 bool bInGroupDim =
false;
831 bool bFoundParts =
false;
856 rOldInfo = pNumGroupDim->
GetInfo();
857 rParts = css::sheet::DataPilotFieldGroupBy::DAYS;
863 else if ( pGroupDim )
879 if ( bFound && !bFoundParts )
884 if ( !bFound && !bInGroupDim )
890 if ( (GetViewData().GetSimpleArea( aSelRange ) ==
SC_MARK_SIMPLE) &&
901 if ( nType == SvNumFormatType::DATE || nType == SvNumFormatType::TIME || nType == SvNumFormatType::DATETIME )
925 SCCOL nCurX = GetViewData().GetCurX();
926 SCROW nCurY = GetViewData().GetCurY();
927 SCTAB nTab = GetViewData().GetTabNo();
928 ScDocument& rDoc = GetViewData().GetDocument();
935 GetSelectedMemberList( aEntries, nSelectDimension );
937 if (!aEntries.empty())
940 OUString aDimName = pDPObj->
GetDimName( nSelectDimension, bIsDataLayout );
942 bool bInGroupDim =
false;
954 rOldInfo = pNumGroupDim->
GetInfo();
960 if ( !bFound && !bInGroupDim )
966 if ( (GetViewData().GetSimpleArea( aSelRange ) ==
SC_MARK_SIMPLE) &&
989 ScDPObject* pDPObj = GetViewData().GetDocument().GetDPAtCursor( GetViewData().GetCurX(),
990 GetViewData().GetCurY(), GetViewData().GetTabNo() );
996 GetSelectedMemberList( aEntries, nSelectDimension );
998 if (aEntries.empty())
1001 std::vector<OUString> aDeletedNames;
1003 OUString aDimName = pDPObj->
GetDimName( nSelectDimension, bIsDataLayout );
1009 OUString aBaseDimName = aDimName;
1011 aBaseDimName = pBaseGroupDim->GetSourceDimName();
1017 aData.RemoveAllGroupDimensions(aBaseDimName, &aDeletedNames);
1024 sal_Int32 nMask = 1;
1027 if ( nParts & nMask )
1034 if ( (nParts == sheet::DataPilotFieldGroupBy::DAYS) && (rInfo.
mfStep >= 1.0) )
1043 pDimData->AddNumGroupDimension( aNumGroupDim );
1048 pDimData->AddNumGroupDimension( aNumGroupDim );
1056 OUString aGroupDimName =
1057 pDimData->CreateDateGroupDimName(nMask, *pDPObj,
true, &aDeletedNames);
1060 pDimData->AddGroupDimension( aGroupDim );
1064 if ( pSaveDimension->
GetOrientation() == sheet::DataPilotFieldOrientation_HIDDEN )
1068 aData.SetPosition( pSaveDimension, 0 );
1077 ScDBDocFunc aFunc( *GetViewData().GetDocShell() );
1087 ScDPObject* pDPObj = GetViewData().GetDocument().GetDPAtCursor( GetViewData().GetCurX(),
1088 GetViewData().GetCurY(), GetViewData().GetTabNo() );
1094 GetSelectedMemberList( aEntries, nSelectDimension );
1096 if (aEntries.empty())
1100 OUString aDimName = pDPObj->
GetDimName( nSelectDimension, bIsDataLayout );
1115 pDimData->AddNumGroupDimension( aNumGroupDim );
1119 ScDBDocFunc aFunc( *GetViewData().GetDocShell() );
1129 ScDPObject* pDPObj = GetViewData().GetDocument().GetDPAtCursor( GetViewData().GetCurX(),
1130 GetViewData().GetCurY(), GetViewData().GetTabNo() );
1136 GetSelectedMemberList( aEntries, nSelectDimension );
1138 if (aEntries.empty())
1142 OUString aDimName = pDPObj->
GetDimName( nSelectDimension, bIsDataLayout );
1148 OUString aBaseDimName = aDimName;
1150 if ( pBaseGroupDim )
1162 if ( pGroupDimension )
1166 if ( pBaseGroupDim )
1181 std::unique_ptr<ScDPSaveGroupDimension> pNewGroupDim;
1182 if ( !pGroupDimension )
1185 OUString aGroupDimName =
1186 pDimData->CreateGroupDimName(aBaseDimName, *pDPObj,
false,
nullptr);
1189 pGroupDimension = pNewGroupDim.get();
1191 if ( pBaseGroupDim )
1201 for (
tools::Long nGroup = 0; nGroup < nGroupCount; nGroup++ )
1221 if ( pBaseGroupDim )
1238 pDimData->AddGroupDimension( *pNewGroupDim );
1239 pNewGroupDim.reset();
1242 pGroupDimension =
nullptr;
1246 if ( pSaveDimension->
GetOrientation() == sheet::DataPilotFieldOrientation_HIDDEN )
1250 aData.SetPosition( pSaveDimension, 0 );
1254 ScDBDocFunc aFunc( *GetViewData().GetDocShell() );
1264 ScDPObject* pDPObj = GetViewData().GetDocument().GetDPAtCursor( GetViewData().GetCurX(),
1265 GetViewData().GetCurY(), GetViewData().GetTabNo() );
1271 GetSelectedMemberList( aEntries, nSelectDimension );
1273 if (aEntries.empty())
1277 OUString aDimName = pDPObj->
GetDimName( nSelectDimension, bIsDataLayout );
1280 if (!
aData.GetExistingDimensionData())
1288 if ( ( pGroupDim && pGroupDim->
GetDatePart() != 0 ) ||
1289 ( pNumGroupDim && pNumGroupDim->
GetDatePart() != 0 ) )
1300 for (
const auto& rEntry : aEntries)
1304 bool bEmptyDim = pGroupDim->
IsEmpty();
1318 aData.RemoveDimensionByName( aDimName );
1321 else if ( pNumGroupDim )
1329 ScDBDocFunc aFunc( *GetViewData().GetDocShell() );
1339 sal_Int32
n = rSubtotal.getLength();
1341 OUStringBuffer
aBuf, aWordBuf;
1342 for (sal_Int32
i = 0;
i < n; ++
i)
1347 OUString aWord = aWordBuf.makeStringAndClear();
1348 if (aWord == rMemberName)
1363 aWordBuf.append(
'\\');
1370 if (!aWordBuf.isEmpty())
1372 OUString aWord = aWordBuf.makeStringAndClear();
1373 if (aWord == rMemberName)
1379 return aBuf.makeStringAndClear();
1386 ScDocument& rDoc = GetViewData().GetDocument();
1393 if ( aOldText == rString )
1403 bool bChange =
false;
1404 bool bNeedReloadGroups =
false;
1406 DataPilotFieldOrientation nOrient = DataPilotFieldOrientation_HIDDEN;
1411 if (
aData.GetExistingDimensionData() )
1422 pGroupDim->
Rename( rString );
1431 pErrorId = STR_INVALIDNAME;
1434 else if (nOrient == DataPilotFieldOrientation_COLUMN || nOrient == DataPilotFieldOrientation_ROW)
1436 bool bDataLayout =
false;
1437 OUString aDimName = pDPObj->
GetDimName(nField, bDataLayout);
1441 if (!rString.isEmpty())
1443 if (rString.equalsIgnoreAsciiCase(aDimName))
1454 pErrorId = STR_INVALIDNAME;
1457 pErrorId = STR_INVALIDNAME;
1467 if (!rString.isEmpty())
1469 if (pDim->
GetName().equalsIgnoreAsciiCase(rString))
1480 pErrorId = STR_INVALIDNAME;
1483 pErrorId = STR_INVALIDNAME;
1489 sheet::DataPilotTableHeaderData aPosData;
1492 if ((aPosData.Flags & MemberResultFlags::HASMEMBER) && !aOldText.isEmpty())
1494 if (
aData.GetExistingDimensionData() && !(aPosData.Flags & MemberResultFlags::SUBTOTAL))
1497 OUString aDimName = pDPObj->
GetDimName( aPosData.Dimension, bIsDataLayout );
1505 if (!rString.isEmpty() && !pGroupDim->
GetNamedGroup(rString))
1509 pGroup->
Rename( rString );
1522 pSaveMember->
SetName( rString );
1525 bNeedReloadGroups =
true;
1528 pErrorId = STR_INVALIDNAME;
1531 else if (aPosData.Flags & MemberResultFlags::GRANDTOTAL)
1533 aData.SetGrandTotalName(rString);
1536 else if (aPosData.Dimension >= 0 && !aPosData.MemberName.isEmpty())
1538 bool bDataLayout =
false;
1539 OUString aDimName = pDPObj->
GetDimName(static_cast<tools::Long>(aPosData.Dimension), bDataLayout);
1545 if (aPosData.Flags & MemberResultFlags::SUBTOTAL)
1552 if (rString.isEmpty())
1554 pErrorId = STR_INVALIDNAME;
1558 if (aPosData.MemberName.equalsIgnoreAsciiCase(rString))
1569 pErrorId = STR_INVALIDNAME;
1586 if (aPosData.Flags & MemberResultFlags::SUBTOTAL)
1589 if (
aData.GetDataDimensionCount() > 1)
1599 const std::optional<OUString> & pLayoutName = pMem->
GetLayoutName();
1600 OUString aMemberName;
1602 aMemberName = *pLayoutName;
1604 aMemberName = aPosData.MemberName;
1614 if (!rString.isEmpty())
1616 if (rString.equalsIgnoreAsciiCase(pMem->
GetName()))
1627 pErrorId = STR_INVALIDNAME;
1630 pErrorId = STR_INVALIDNAME;
1642 ScDBDocFunc aFunc( *GetViewData().GetDocShell() );
1644 if (bNeedReloadGroups)
1659 pErrorId = STR_ERR_DATAPILOT_INPUT;
1660 ErrorMessage(pErrorId);
1666 std::unique_ptr<ScDPSaveMember> pNewMember;
1672 rDim.
AddMember( std::move(pNewMember) );
1679 struct ScOUStringCollate
1683 explicit ScOUStringCollate(
CollatorWrapper* pColl) : mpCollator(pColl) {}
1685 bool operator()(
const OUString& rStr1,
const OUString& rStr2)
const
1712 OUString aDimName = pDPObj->
GetDimName(nDimIndex, bDataLayout);
1721 const MemList& rDimMembers = pSaveDim->
GetMembers();
1722 vector<OUString> aMembers;
1723 std::unordered_set<OUString> aMemberSet;
1724 size_t nMemberCount = 0;
1727 aMembers.push_back(pMem->GetName());
1728 aMemberSet.insert(pMem->GetName());
1734 std::stable_sort(aMembers.begin(), aMembers.end(), aCollate);
1738 typedef std::unordered_map<OUString, sal_uInt16> UserSortMap;
1739 UserSortMap aSubStrs;
1740 sal_uInt16 nSubCount = 0;
1746 size_t n = pUserList->
size();
1747 if (!n || *pUserListId >= static_cast<sal_uInt16>(n))
1753 for (sal_uInt16
i = 0;
i < n; ++
i)
1756 if (!aMemberSet.count(aSub))
1760 aSubStrs.emplace(aSub, nSubCount++);
1765 vector<OUString> aRankedNames(nMemberCount);
1766 sal_uInt16 nCurStrId = 0;
1767 for (
auto const& aMemberName : aMembers)
1769 sal_uInt16 nRank = 0;
1770 UserSortMap::const_iterator itrSub = aSubStrs.find(aMemberName);
1771 if (itrSub == aSubStrs.end())
1772 nRank = nSubCount + nCurStrId++;
1774 nRank = itrSub->second;
1777 nRank =
static_cast< sal_uInt16
>( nMemberCount - nRank - 1 );
1779 aRankedNames[nRank] = aMemberName;
1783 for (
auto const& aRankedName : aRankedNames)
1796 sheet::DataPilotFieldSortInfo aSortInfo;
1797 aSortInfo.Mode = sheet::DataPilotFieldSortMode::MANUAL;
1804 sheet::DataPilotFieldSortInfo aSortInfo;
1805 aSortInfo.Mode = sheet::DataPilotFieldSortMode::NAME;
1806 aSortInfo.IsAscending = bAscending;
1812 std::unique_ptr<ScDPObject> pNewObj(
new ScDPObject(*pDPObj));
1813 pNewObj->SetSaveData(aNewSaveData);
1822 ScDocument& rDoc = GetViewData().GetDocument();
1826 sheet::DataPilotTableHeaderData aDestData;
1828 bool bValid = ( aDestData.Dimension >= 0 );
1831 std::unordered_set< OUString > aMembersSet;
1832 std::vector< OUString > aMembersVector;
1833 aMembersVector.reserve( std::max( static_cast<SCSIZE>( rSource.
aEnd.
Col() - rSource.
aStart.
Col() + 1 ),
1838 sheet::DataPilotTableHeaderData aSourceData;
1840 if ( aSourceData.Dimension == aDestData.Dimension && !aSourceData.MemberName.isEmpty() )
1842 if ( aMembersSet.insert( aSourceData.MemberName ).second )
1844 aMembersVector.push_back( aSourceData.MemberName );
1855 OUString aDimName = pDPObj->
GetDimName( aDestData.Dimension, bIsDataLayout );
1856 if ( !bIsDataLayout )
1862 uno::Sequence<OUString> aMemberNames;
1865 bool bInserted =
false;
1867 for (
const OUString& aMemberStr : std::as_const(aMemberNames))
1869 if ( !bInserted && aMemberStr == aDestData.MemberName )
1872 for (
const auto& rMember : aMembersVector )
1877 if ( aMembersSet.find( aMemberStr ) == aMembersSet.end() )
1882 for (
const auto& rMember : aMembersVector )
1888 sheet::DataPilotFieldSortInfo aSortInfo;
1889 aSortInfo.Mode = sheet::DataPilotFieldSortMode::MANUAL;
1890 pDim->SetSortInfo( &aSortInfo );
1893 ScDBDocFunc aFunc( *GetViewData().GetDocShell() );
1894 std::unique_ptr<ScDPObject> pNewObj(
new ScDPObject( *pDPObj ));
1895 pNewObj->SetSaveData(
aData );
1913 ScDPObject* pDPObj = GetViewData().GetDocument().GetDPAtCursor( GetViewData().GetCurX(),
1914 GetViewData().GetCurY(), GetViewData().GetTabNo() );
1919 GetSelectedMemberList( aEntries, nSelectDimension );
1921 if (!aEntries.empty())
1924 OUString aDimName = pDPObj->
GetDimName( nSelectDimension, bIsDataLayout );
1925 if ( !bIsDataLayout )
1931 css::sheet::DataPilotFieldOrientation nDimOrient = pDim->
GetOrientation();
1933 if ( pDim == pInner )
1935 rOrientation = nDimOrient;
1948 ScDPObject* pDPObj = GetViewData().GetDocument().GetDPAtCursor( GetViewData().GetCurX(),
1949 GetViewData().GetCurY(), GetViewData().GetTabNo() );
1955 GetSelectedMemberList( aEntries, nSelectDimension );
1957 if (aEntries.empty())
1961 OUString aDimName = pDPObj->
GetDimName( nSelectDimension, bIsDataLayout );
1962 if ( bIsDataLayout )
1968 if ( bShow && pNewDimensionName )
1974 if ( pNewDim->
GetOrientation() == sheet::DataPilotFieldOrientation_DATA )
1978 pDuplicated =
aData.DuplicateDimension( *pNewDimensionName );
1981 css::sheet::DataPilotFieldOrientation nOrientation = pDim->GetOrientation();
1985 aData.SetPosition( pNewDim, nPosition );
1989 aData.GetDataDimensionCount() <= 1 )
1993 aData.SetPosition( pDataLayout, nPosition );
1999 aData.SetPosition( pDuplicated, nPosition );
2008 for (
const OUString& aVisName : aVisibleEntries)
2015 for (
const auto& rEntry : aEntries)
2022 ScDBDocFunc aFunc( *GetViewData().GetDocShell() );
2023 std::unique_ptr<ScDPObject> pNewObj(
new ScDPObject( *pDPObj ));
2024 pNewObj->SetSaveData(
aData );
2034 ScDocument& rDoc = GetViewData().GetDocument();
2037 ErrorMessage(STR_READONLYERR);
2041 Reference<sheet::XDimensionsSupplier> xDimSupplier = rDPObj.
GetSource();
2043 Reference<sheet::XDrillDownDataSupplier> xDDSupplier(xDimSupplier, UNO_QUERY);
2044 if (!xDDSupplier.is())
2047 Sequence< Sequence<Any> > aTabData = xDDSupplier->getDrillDownData(rFilters);
2048 sal_Int32 nRowSize = aTabData.getLength();
2053 SCCOL nColSize = aTabData[0].getLength();
2055 SCTAB nNewTab = GetViewData().GetTabNo();
2058 pInsDoc->ResetClip( &rDoc, nNewTab );
2059 for (
SCROW nRow = 0; nRow < nRowSize; ++nRow)
2061 for (
SCCOL nCol = 0; nCol < nColSize; ++nCol)
2063 const Any& rAny = aTabData[nRow][nCol];
2068 pInsDoc->SetString(
ScAddress(nCol,nRow,nNewTab), aStr);
2070 else if (rAny >>= fVal)
2071 pInsDoc->SetValue(nCol, nRow, nNewTab, fVal);
2076 for (
SCCOL nCol = 0; nCol < nColSize; ++nCol)
2079 if (!(aTabData[0][nCol] >>= aStr))
2087 sal_Int32 nNumFmt = 0;
2088 if (!(any >>= nNumFmt))
2093 pInsDoc->ApplyPatternAreaTab(nCol, 1, nCol, nRowSize-1, nNewTab, aPattern);
2098 pInsDoc->GetCellArea( nNewTab, nEndCol, nEndRow );
2099 pInsDoc->SetClipArea(
ScRange( 0, 0, nNewTab, nEndCol, nEndRow, nNewTab ) );
2101 SfxUndoManager* pMgr = GetViewData().GetDocShell()->GetUndoManager();
2102 OUString aUndo =
ScResId( STR_UNDO_DOOUTLINE );
2103 pMgr->
EnterListAction( aUndo, aUndo, 0, GetViewData().GetViewShell()->GetViewShellId() );
2105 OUString aNewTabName;
2107 if ( InsertTable(aNewTabName, nNewTab) )
2117 SCCOL nCurX = GetViewData().GetCurX();
2118 SCROW nCurY = GetViewData().GetCurY();
2119 SCTAB nTab = GetViewData().GetTabNo();
2120 ScDocument& rDoc = GetViewData().GetDocument();
2131 bool bSort = aSortParam.
maKeyState[0].bDoSort;
2137 if ( bQuery || bSort || bSubTotal )
2139 bool bQuerySize =
false;
2142 if (bQuery && !aQueryParam.
bInplace)
2158 pDBData->
GetArea( nDummy, nStartCol, nStartRow, nEndCol, nEndRow );
2163 std::unique_ptr<ScOutlineTable> pUndoTab;
2164 std::unique_ptr<ScRangeName> pUndoRange;
2165 std::unique_ptr<ScDBCollection> pUndoDB;
2183 pUndoDoc->InitUndo( rDoc, nTab, nTab,
true,
true );
2188 pUndoDoc->InitUndo( rDoc, nTab, nTab,
false,
true );
2198 if (!pDocRange->
empty())
2201 if (!pDocDB->
empty())
2205 if (bSort && bSubTotal)
2210 DoSubTotals( aSubTotalParam,
false );
2216 Sort( aSortParam,
false,
false);
2225 Query( aQueryParam, &aAdvSource,
false );
2228 Query( aQueryParam,
nullptr,
false );
2238 DoSubTotals( aSubTotalParam,
false );
2245 SCROW nDummyRow, nNewEndRow;
2246 pDBData->
GetArea( nDummyTab, nDummyCol,nDummyRow, nDummyCol,nNewEndRow );
2248 const ScRange* pOld =
nullptr;
2249 const ScRange* pNew =
nullptr;
2262 GetViewData().GetDocShell()->GetUndoManager()->AddUndoAction(
2263 std::make_unique<ScUndoRepeatDB>( GetViewData().GetDocShell(), nTab,
2264 nStartCol, nStartRow, nEndCol, nEndRow,
2267 std::move(pUndoDoc), std::move(pUndoTab),
2268 std::move(pUndoRange), std::move(pUndoDB),
2272 GetViewData().GetDocShell()->PostPaint(
2277 ErrorMessage(STR_MSSG_REPEATDB_0);
2285 SCTAB nCurrentTabIndex = GetViewData().GetTabNo();
2291 if (pTabViewShell && pTabViewShell->
GetDocId() == pThisViewShell->
GetDocId())
2296 pPosHelper->invalidateByIndex(nStart);
2301 pPosHelper->invalidateByIndex(nStart);
2304 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
OUString ScResId(TranslateId aId)
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)
const OUString & GetSourceDimName() const
void RemoveGroupDimension(const OUString &rGroupDimName)
void MakeOutline(bool bColumns, bool bRecord=true)
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
bool RemovePivotTable(const ScDPObject &rDPObj, bool bRecord, bool bApi)
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()
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)
SfxItemSet & GetItemSet()
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)
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)
static SC_DLLPUBLIC CollatorWrapper & GetCollator()
case-insensitive collator
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)
bool m_bDetectedRangeSegmentation false