43#include <com/sun/star/sheet/DataPilotFieldOrientation.hpp>
45#include <unordered_map>
50using namespace css::sheet;
51using css::sheet::DataPilotFieldOrientation;
60 return DataPilotFieldOrientation_HIDDEN;
62 DataPilotFieldOrientation nOrient = DataPilotFieldOrientation_HIDDEN;
69 if ( nField >= 0 && nOrient == DataPilotFieldOrientation_PAGE )
71 bool bIsDataLayout =
false;
72 OUString aFieldName = pDPObj->
GetDimName( nField, bIsDataLayout );
73 if ( !aFieldName.isEmpty() && !bIsDataLayout )
74 return DataPilotFieldOrientation_PAGE;
78 nOrient = DataPilotFieldOrientation_HIDDEN;
82 if (nField >= 0 && (nOrient == DataPilotFieldOrientation_COLUMN || nOrient == DataPilotFieldOrientation_ROW) )
84 bool bIsDataLayout =
false;
85 OUString aFieldName = pDPObj->
GetDimName(nField, bIsDataLayout);
86 if (!aFieldName.isEmpty() && !bIsDataLayout)
90 return DataPilotFieldOrientation_HIDDEN;
114 if ( bLayoutRTL && !bLOKActive )
115 aDiffPix.setX( -aDiffPix.X() );
121 Size aScrSize(nSizeX-1, nSizeY-1);
125 mpFilterButton->setBoundingBox(aScrPos, aScrSize, bLayoutRTL && !bLOKActive);
126 mpFilterButton->setPopupLeft(bLayoutRTL && bLOKActive ?
false : bLayoutRTL);
158 DataPilotFieldOrientation nOrient = DataPilotFieldOrientation_HIDDEN;
161 if (!bButton &&
bPopup && aDimPos.
Col() > 0)
192 OSL_ENSURE(pDesc,
"no sheet source for filter button");
207 if ( pDlg->Execute() ==
RET_OK )
213 const ScQueryItem& rQueryItem = pDlg->GetOutputItem();
226 OSL_FAIL(
"Nothing here");
244 if ( aPixel.X() < 0 )
246 if ( aPixel.Y() < 0 )
249 if ( aPixel.X() >= aSize.
Width() )
251 if ( aPixel.Y() >= aSize.
Height() )
253 if ( nDx != 0 || nDy != 0 )
275 DataPilotFieldOrientation nOrient;
278 aPosRect, nOrient, nDimPos );
282 sal_Int32 nDimFlags = 0;
290 ePointer = PointerStyle::NotAllowed;
291 else if ( bHasRange )
294 case DataPilotFieldOrientation_COLUMN: ePointer = PointerStyle::PivotCol;
break;
295 case DataPilotFieldOrientation_ROW: ePointer = PointerStyle::PivotRow;
break;
296 case DataPilotFieldOrientation_PAGE:
297 case DataPilotFieldOrientation_DATA: ePointer = PointerStyle::PivotField;
break;
305 nOrient = DataPilotFieldOrientation_HIDDEN;
307 if ( bIsDataLayout && ( nOrient != DataPilotFieldOrientation_COLUMN &&
308 nOrient != DataPilotFieldOrientation_ROW ) )
352 Size aScrSize(nSizeX-1, nSizeY-1);
387 virtual bool execute()
override
389 mpGridWindow->UpdateDPFromFieldPopupMenu();
399 enum SortType { ASCENDING, DESCENDING,
CUSTOM };
403 : mpDPObject(pDPObject)
404 , mnDimIndex(nDimIndex)
406 , mnUserListIndex(nUserListIndex)
407 , mpViewShell(pViewShell)
410 virtual bool execute()
override
415 mpViewShell->DataPilotSort(mpDPObject, mnDimIndex,
true);
418 mpViewShell->DataPilotSort(mpDPObject, mnDimIndex,
false);
421 mpViewShell->DataPilotSort(mpDPObject, mnDimIndex,
true, &mnUserListIndex);
433 sal_uInt16 mnUserListIndex;
442 DataPilotFieldOrientation nOrient;
451 std::unique_ptr<DPFieldPopupData> pDPData(
new DPFieldPopupData);
452 pDPData->mnDim = nDimIndex;
456 OUString aDimName = pDPObj->
GetDimName(pDPData->mnDim, bIsDataLayout);
464 bool bDimOrientNotPage = pDim->
GetOrientation() != DataPilotFieldOrientation_PAGE;
468 pDPData->mpDPObj = pDPObj;
484 for (
size_t i = 0;
i <
n; ++
i)
496 if (bDimOrientNotPage)
498 vector<OUString> aUserSortNames;
502 size_t n = pUserList->
size();
503 aUserSortNames.reserve(
n);
504 for (
size_t i = 0;
i <
n; ++
i)
507 aUserSortNames.push_back(rData.
GetString());
515 new PopupSortAction(pDPObj, nDimIndex, PopupSortAction::ASCENDING, 0, pViewShell));
518 new PopupSortAction(pDPObj, nDimIndex, PopupSortAction::DESCENDING, 0, pViewShell));
523 size_t n = aUserSortNames.size();
524 for (
size_t i = 0;
i <
n; ++
i)
527 new PopupSortAction(pDPObj, nDimIndex, PopupSortAction::CUSTOM, sal_uInt16(
i), pViewShell));
547 typedef std::unordered_map<OUString, OUString> MemNameMapType;
552 DPFieldPopupData* pDPData =
static_cast<DPFieldPopupData*
>(
mpDPFieldPopup->getExtendedData());
560 OUString aDimName = pDPObj->
GetDimName(pDPData->mnDim, bIsDataLayout);
567 MemNameMapType aMemNameMap;
568 for (
const auto& rMember : rLabelData.
maMembers)
569 aMemNameMap.emplace(rMember.maLayoutName, rMember.maName);
575 std::unordered_map<OUString, bool> aResult;
576 for (
const auto& rItem : aRawResult)
578 MemNameMapType::const_iterator itrNameMap = aMemNameMap.find(rItem.aName);
579 if (itrNameMap == aMemNameMap.end())
582 OUString
aName = rItem.aName;
587 aResult.emplace(
aName, rItem.bValid);
592 aResult.emplace(itrNameMap->second, rItem.bValid);
605T lcl_getValidValue(T value, T defvalue)
607 return (value <0) ? defvalue :
value;
633 if (nXRight > rDoc.
MaxCol())
636 if (nYBottom > rDoc.
MaxRow())
712 if ( nMouseX <= aTL.X() + 4 )
717 else if ( nMouseX >= aBR.X() - 6 )
722 if ( nMouseY <= aTL.Y() + 2 )
727 else if ( nMouseY >= aBR.Y() - 4 )
733 if ( bHori || bVert )
735 sal_uInt16
nCount = sal::static_int_cast<sal_uInt16>( pPageData->
GetCount() );
740 bool bLHit = ( bHori && nHitX == aRange.
aStart.
Col() );
741 bool bRHit = ( bHori && nHitX == aRange.
aEnd.
Col() + 1 );
742 bool bTHit = ( bVert && nHitY == aRange.
aStart.
Row() );
743 bool bBHit = ( bVert && nHitY == aRange.
aEnd.
Row() + 1 );
744 bool bInsideH = ( nPosX >= aRange.
aStart.
Col() && nPosX <= aRange.
aEnd.
Col() );
745 bool bInsideV = ( nPosY >= aRange.
aStart.
Row() && nPosY <= aRange.
aEnd.
Row() );
765 else if ( bTHit && bInsideH )
767 else if ( bBHit && bInsideH )
774 if ( bVert && bInsideH && !nFound )
778 for (
size_t nRowPos=0; nRowPos+1<nRowCount; nRowPos++)
779 if ( pRowEnd[nRowPos]+1 == nHitY )
785 nPrev = pRowEnd[nRowPos-1]+1;
790 if ( bHori && bInsideV && !nFound )
794 for (
size_t nColPos=0; nColPos+1<nColCount; nColPos++)
795 if ( pColEnd[nColPos]+1 == nHitX )
801 nPrev = pColEnd[nColPos-1]+1;
830 if ( aPos.X() < 0 ) nDx = -1;
831 if ( aPos.Y() < 0 ) nDy = -1;
833 if ( aPos.X() >= aSize.
Width() )
835 if ( aPos.Y() >= aSize.
Height() )
837 if ( nDx != 0 || nDy != 0 )
881 if ( !bLeft ) ++nPosX;
882 if ( !bTop ) ++nPosY;
950 if ( !bUp && !bHide )
976 OUString aUndo =
ScResId( STR_UNDO_DRAG_BREAK );
988 if ( !bHide && !bToEnd )
1015 if ( !bHide && !bToEnd )
1017 ScAddress aNewAddr( nPosX, nNew, nTab );
1052 OUString aNewRanges;
1066 if (!aTemp.isEmpty())
1068 if ( !aNewRanges.isEmpty() )
1070 aNewRanges += aTemp;
const Point & GetPosPixel() const
virtual VclPtr< AbstractScPivotFilterDlg > CreateScPivotFilterDlg(weld::Window *pParent, const SfxItemSet &rArgSet, sal_uInt16 nSourceTab)=0
static SC_DLLPUBLIC ScAbstractDialogFactory * Create()
void IncCol(SCCOL nDelta=1)
bool UpdatePivotTable(ScDPObject &rDPObj, bool bRecord, bool bApi)
bool DataPilotUpdate(ScDPObject *pOldObj, const ScDPObject *pNewObj, bool bRecord, bool bApi, bool bAllowMove=false)
void SetSaveData(const ScDPSaveData &rData)
static bool IsOrientationAllowed(css::sheet::DataPilotFieldOrientation nOrient, sal_Int32 nDimFlags)
css::uno::Reference< css::sheet::XDimensionsSupplier > const & GetSource()
bool GetHeaderDrag(const ScAddress &rPos, bool bMouseLeft, bool bMouseTop, tools::Long nDragDim, tools::Rectangle &rPosRect, css::sheet::DataPilotFieldOrientation &rOrient, tools::Long &rDimPos)
tools::Long GetHeaderDim(const ScAddress &rPos, css::sheet::DataPilotFieldOrientation &rOrient)
void BuildAllDimensionMembers()
bool IsFilterButton(const ScAddress &rPos)
void SetSheetDesc(const ScSheetSourceDesc &rDesc)
const ScSheetSourceDesc * GetSheetDesc() const
ScDPSaveData * GetSaveData() const
OUString GetDimName(tools::Long nDim, bool &rIsDataLayout, sal_Int32 *pFlags=nullptr)
void FillLabelData(sal_Int32 nDim, ScDPLabelData &Labels)
SC_DLLPUBLIC ScDPSaveDimension * GetExistingDimensionByName(std::u16string_view rName) const
void SetPosition(ScDPSaveDimension *pDim, tools::Long nNew)
SC_DLLPUBLIC ScDPSaveDimension * GetDataLayoutDimension()
SC_DLLPUBLIC ScDPSaveDimension * GetDimensionByName(const OUString &rName)
Get a dimension object by its name.
void UpdateMemberVisibility(const std::unordered_map< OUString, bool > &rData)
void SetOrientation(css::sheet::DataPilotFieldOrientation nNew)
css::sheet::DataPilotFieldOrientation GetOrientation() const
bool AdjustPrintZoom(const ScRange &rRange)
void SetDocumentModified()
const ScDocument & GetDocument() const
virtual SfxUndoManager * GetUndoManager() override
SC_DLLPUBLIC sal_uInt16 GetRowHeight(SCROW nRow, SCTAB nTab, bool bHiddenAsZero=true) const
SC_DLLPUBLIC SCCOL MaxCol() const
SC_DLLPUBLIC SCROW MaxRow() const
SC_DLLPUBLIC const ScRange * GetPrintRange(SCTAB nTab, sal_uInt16 nPos)
SC_DLLPUBLIC ScBreakType HasRowBreak(SCROW nRow, SCTAB nTab) const
SC_DLLPUBLIC ScBreakType HasColBreak(SCCOL nCol, SCTAB nTab) const
SC_DLLPUBLIC ScDPObject * GetDPAtCursor(SCCOL nCol, SCROW nRow, SCTAB nTab) const
SC_DLLPUBLIC bool IsLayoutRTL(SCTAB nTab) const
bool IsUndoEnabled() const
SC_DLLPUBLIC sal_uInt16 GetPrintRangeCount(SCTAB nTab)
bool IsPrintEntireSheet(SCTAB nTab) const
Returns true, if the specified sheet is always printed.
static SC_DLLPUBLIC ScUserList * GetUserList()
void DPMouseButtonUp(const MouseEvent &rMEvt)
bool DoPageFieldSelection(SCCOL nCol, SCROW nRow)
css::sheet::DataPilotFieldOrientation GetDPFieldOrientation(SCCOL nCol, SCROW nRow) const
void DPLaunchFieldPopupMenu(const Point &rScrPos, const Size &rScrSize, const ScAddress &rPos, ScDPObject *pDPObj)
std::unique_ptr< ScDPFieldButton > mpFilterButton
bool DPTestFieldPopupArrow(const MouseEvent &rMEvt, const ScAddress &rPos, const ScAddress &rDimPos, ScDPObject *pDPObj)
Check if the mouse click is on a field popup button.
void UpdateDragRect(bool bShowRange, const tools::Rectangle &rPosRect)
void UpdateDPFromFieldPopupMenu()
void UpdateDragRectOverlay()
void LaunchAutoFilterMenu(SCCOL nCol, SCROW nRow)
void PagebreakMove(const MouseEvent &rMEvt, bool bUp)
void DPMouseMove(const MouseEvent &rMEvt)
std::unique_ptr< ScCheckListMenuControl > mpDPFieldPopup
void LaunchPageFieldMenu(SCCOL nCol, SCROW nRow)
void DoPushPivotButton(SCCOL nCol, SCROW nRow, const MouseEvent &rMEvt, bool bButton, bool bPopup)
bool IsAutoFilterActive(SCCOL nCol, SCROW nRow, SCTAB nTab)
sal_uInt16 HitPageBreak(const Point &rMouse, ScRange *pSource, SCCOLROW *pBreak, SCCOLROW *pPrev)
sal_uInt16 nPagebreakMouse
void DPTestMouse(const MouseEvent &rMEvt, bool bMove)
bool DoAutoFilterButton(SCCOL nCol, SCROW nRow, const MouseEvent &rMEvt)
bool UpdateVisibleRange()
VisibleRange maVisibleRange
ScPrintRangeData & GetData(size_t i)
const SCCOL * GetPageEndX() const
const SCROW * GetPageEndY() const
const ScRange & GetPrintRange() const
const ScQueryParam & GetQueryData() const
OUString Format(const ScDocument &rDocument, ScRefFlags nFlags=ScRefFlags::ZERO, const ScAddress::Details &rDetails=ScAddress::detailsOOOa1, bool bFullAddressNotation=false) const
Returns string with formatted cell range from aStart to aEnd, according to provided address conventio...
This class contains authoritative information on the internal reference used as the data source for d...
const ScQueryParam & GetQueryParam() const
SC_DLLPUBLIC const ScRange & GetSourceRange() const
Get the range that contains the source data.
void SetQueryParam(const ScQueryParam &rParam)
void UpdatePageBreakData(bool bForcePaint=false)
SCROW GetLOKStartHeaderRow() const
SCROW GetLOKEndHeaderRow() const
void ErrorMessage(TranslateId pGlobStrId)
SCCOL GetLOKStartHeaderCol() const
void ScrollX(tools::Long nDeltaX, ScHSplitPos eWhich, bool bUpdBars=true)
void SetTimer(ScGridWindow *pWin, const MouseEvent &rMEvt)
void ActivatePart(ScSplitPos eWhich)
void ScrollY(tools::Long nDeltaY, ScVSplitPos eWhich, bool bUpdBars=true)
SCCOL GetLOKEndHeaderCol() const
ScPageBreakData * GetPageBreakData()
Stores individual user-defined sort list.
const OUString & GetString() const
Collection of user-defined sort lists.
bool GetMergeSizePixel(SCCOL nX, SCROW nY, tools::Long &rSizeXPix, tools::Long &rSizeYPix) const
void GetMouseQuadrant(const Point &rClickPos, ScSplitPos eWhich, SCCOL nPosX, SCROW nPosY, bool &rLeft, bool &rTop)
const Fraction & GetZoomY() const
ScDocument & GetDocument() const
SCROW GetPosY(ScVSplitPos eWhich, SCTAB nForTab=-1) const
ScSplitMode GetHSplitMode() const
ScDocShell * GetDocShell() const
void GetPosFromPixel(tools::Long nClickX, tools::Long nClickY, ScSplitPos eWhich, SCCOL &rPosX, SCROW &rPosY, bool bTestMerge=true, bool bRepair=false, SCTAB nForTab=-1)
ScTabViewShell * GetViewShell() const
static tools::Long ToPixel(sal_uInt16 nTwips, double nFactor)
ScDBFunc * GetView() const
SCROW VisibleCellsY(ScVSplitPos eWhichY) const
ScSplitPos GetActivePart() const
Point GetScrPos(SCCOL nWhereX, SCROW nWhereY, ScSplitPos eWhich, bool bAllowNeg=false, SCTAB nForTab=-1) const
SCCOL VisibleCellsX(ScHSplitPos eWhichX) const
ScSplitMode GetVSplitMode() const
SCCOL GetPosX(ScHSplitPos eWhich, SCTAB nForTab=-1) const
SC_DLLPUBLIC void DeletePageBreak(bool bColumn, bool bRecord=true, const ScAddress *pPos=nullptr, bool bSetModified=true)
void SetPrintRanges(bool bEntireSheet, const OUString *pPrint, const OUString *pRepCol, const OUString *pRepRow, bool bAddPrint)
SC_DLLPUBLIC void InsertPageBreak(bool bColumn, bool bRecord=true, const ScAddress *pPos=nullptr, bool bSetModified=true)
const SfxPoolItem * Put(const SfxPoolItem &rItem, sal_uInt16 nWhich)
SfxItemPool & GetPool() const
virtual void EnterListAction(const OUString &rComment, const OUString &rRepeatComment, sal_uInt16 nId, ViewShellId nViewShellId)
weld::Window * GetFrameWeld() const
ViewShellId GetViewShellId() const override
constexpr tools::Long Height() const
constexpr tools::Long Width() const
virtual void SetPointer(PointerStyle) override
Point OutputToScreenPixel(const Point &rPos) const
void StartTracking(StartTrackingFlags nFlags=StartTrackingFlags::NONE)
bool IsMouseCaptured() const
const AllSettings & GetSettings() const
const MapMode & GetMapMode() const
::OutputDevice const * GetOutDev() const
Size GetOutputSizePixel() const
weld::Window * GetFrameWeld() const
uint8_t maLabels[mnMaxStaticSize]
OUString ScResId(TranslateId aId)
SC_DLLPUBLIC OUString const & getDisplayName() const
std::vector< Member > maMembers
bool set(SCCOL nCol1, SCROW nRow1, SCCOL nCol2, SCROW nRow2)
sal_Int32 SCCOLROW
a type capable of holding either SCCOL or SCROW
ScHSplitPos WhichH(ScSplitPos ePos)
ScVSplitPos WhichV(ScSplitPos ePos)