diff options
Diffstat (limited to 'sc/source/ui/view')
-rw-r--r-- | sc/source/ui/view/dbfunc3.cxx | 22 | ||||
-rw-r--r-- | sc/source/ui/view/gridwin2.cxx | 42 | ||||
-rw-r--r-- | sc/source/ui/view/tabview3.cxx | 23 | ||||
-rw-r--r-- | sc/source/ui/view/tabvwshb.cxx | 33 |
4 files changed, 101 insertions, 19 deletions
diff --git a/sc/source/ui/view/dbfunc3.cxx b/sc/source/ui/view/dbfunc3.cxx index 1a3563674e62..d298d390ee8b 100644 --- a/sc/source/ui/view/dbfunc3.cxx +++ b/sc/source/ui/view/dbfunc3.cxx @@ -1610,10 +1610,8 @@ struct ScOUStringCollate } }; -void ScDBFunc::DataPilotSort( const ScAddress& rPos, bool bAscending, sal_uInt16* pUserListId ) +void ScDBFunc::DataPilotSort(ScDPObject* pDPObj, long nDimIndex, bool bAscending, sal_uInt16* pUserListId) { - ScDocument* pDoc = GetViewData().GetDocument(); - ScDPObject* pDPObj = pDoc->GetDPAtCursor(rPos.Col(), rPos.Row(), rPos.Tab()); if (!pDPObj) return; @@ -1621,8 +1619,6 @@ void ScDBFunc::DataPilotSort( const ScAddress& rPos, bool bAscending, sal_uInt16 if ( pUserListId ) pDPObj->BuildAllDimensionMembers(); - sal_uInt16 nOrientation; - long nDimIndex = pDPObj->GetHeaderDim(rPos, nOrientation); if (nDimIndex < 0) // Invalid dimension index. Bail out. return; @@ -1750,6 +1746,22 @@ void ScDBFunc::DataPilotSort( const ScAddress& rPos, bool bAscending, sal_uInt16 aFunc.DataPilotUpdate(pDPObj, pNewObj.get(), true, false); } +void ScDBFunc::DataPilotSort( const ScAddress& rPos, bool bAscending, sal_uInt16* pUserListId ) +{ + ScDocument* pDoc = GetViewData().GetDocument(); + ScDPObject* pDPObj = pDoc->GetDPAtCursor(rPos.Col(), rPos.Row(), rPos.Tab()); + if (!pDPObj) + return; + + sal_uInt16 nOrientation; + long nDimIndex = pDPObj->GetHeaderDim(rPos, nOrientation); + if (nDimIndex < 0) + // Invalid dimension index. Bail out. + return; + + DataPilotSort(pDPObj, nDimIndex, bAscending, pUserListId); +} + bool ScDBFunc::DataPilotMove( const ScRange& rSource, const ScAddress& rDest ) { bool bRet = false; diff --git a/sc/source/ui/view/gridwin2.cxx b/sc/source/ui/view/gridwin2.cxx index 270a568e9f90..66e9dcfed8b5 100644 --- a/sc/source/ui/view/gridwin2.cxx +++ b/sc/source/ui/view/gridwin2.cxx @@ -400,21 +400,27 @@ class PopupSortAction : public ScMenuFloatingWindow::Action public: enum SortType { ASCENDING, DESCENDING, CUSTOM }; - explicit PopupSortAction(const ScAddress& rPos, SortType eType, sal_uInt16 nUserListIndex, ScTabViewShell* pViewShell) : - maPos(rPos), meType(eType), mnUserListIndex(nUserListIndex), mpViewShell(pViewShell) {} + explicit PopupSortAction(ScDPObject* pDPObject, long nDimIndex, SortType eType, + sal_uInt16 nUserListIndex, ScTabViewShell* pViewShell) + : mpDPObject(pDPObject) + , mnDimIndex(nDimIndex) + , meType(eType) + , mnUserListIndex(nUserListIndex) + , mpViewShell(pViewShell) + {} virtual void execute() override { switch (meType) { case ASCENDING: - mpViewShell->DataPilotSort(maPos, true); + mpViewShell->DataPilotSort(mpDPObject, mnDimIndex, true); break; case DESCENDING: - mpViewShell->DataPilotSort(maPos, false); + mpViewShell->DataPilotSort(mpDPObject, mnDimIndex, false); break; case CUSTOM: - mpViewShell->DataPilotSort(maPos, true, &mnUserListIndex); + mpViewShell->DataPilotSort(mpDPObject, mnDimIndex, true, &mnUserListIndex); break; default: ; @@ -422,7 +428,8 @@ public: } private: - ScAddress maPos; + ScDPObject* mpDPObject; + long mnDimIndex; SortType meType; sal_uInt16 mnUserListIndex; ScTabViewShell* mpViewShell; @@ -430,12 +437,21 @@ private: } -void ScGridWindow::DPLaunchFieldPopupMenu( - const Point& rScrPos, const Size& rScrSize, const ScAddress& rPos, ScDPObject* pDPObj) +void ScGridWindow::DPLaunchFieldPopupMenu(const Point& rScreenPosition, const Size& rScreenSize, + const ScAddress& rAddress, ScDPObject* pDPObject) { - std::unique_ptr<DPFieldPopupData> pDPData(new DPFieldPopupData); sal_uInt16 nOrient; - pDPData->mnDim = pDPObj->GetHeaderDim(rPos, nOrient); + long nDimIndex = pDPObject->GetHeaderDim(rAddress, nOrient); + + DPLaunchFieldPopupMenu(rScreenPosition, rScreenSize, nDimIndex, pDPObject); +} + +void ScGridWindow::DPLaunchFieldPopupMenu(const Point& rScrPos, const Size& rScrSize, + long nDimIndex, ScDPObject* pDPObj) +{ + std::unique_ptr<DPFieldPopupData> pDPData(new DPFieldPopupData); + pDPData->mnDim = nDimIndex; + pDPObj->GetSource(); bool bIsDataLayout; OUString aDimName = pDPObj->GetDimName(pDPData->mnDim, bIsDataLayout); @@ -493,10 +509,10 @@ void ScGridWindow::DPLaunchFieldPopupMenu( ScTabViewShell* pViewShell = pViewData->GetViewShell(); mpDPFieldPopup->addMenuItem( SC_RESSTR(STR_MENU_SORT_ASC), - new PopupSortAction(rPos, PopupSortAction::ASCENDING, 0, pViewShell)); + new PopupSortAction(pDPObj, nDimIndex, PopupSortAction::ASCENDING, 0, pViewShell)); mpDPFieldPopup->addMenuItem( SC_RESSTR(STR_MENU_SORT_DESC), - new PopupSortAction(rPos, PopupSortAction::DESCENDING, 0, pViewShell)); + new PopupSortAction(pDPObj, nDimIndex, PopupSortAction::DESCENDING, 0, pViewShell)); ScMenuFloatingWindow* pSubMenu = mpDPFieldPopup->addSubMenuItem( SC_RESSTR(STR_MENU_SORT_CUSTOM), !aUserSortNames.empty()); @@ -507,7 +523,7 @@ void ScGridWindow::DPLaunchFieldPopupMenu( { pSubMenu->addMenuItem( aUserSortNames[i], - new PopupSortAction(rPos, PopupSortAction::CUSTOM, static_cast<sal_uInt16>(i), pViewShell)); + new PopupSortAction(pDPObj, nDimIndex, PopupSortAction::CUSTOM, sal_uInt16(i), pViewShell)); } } } diff --git a/sc/source/ui/view/tabview3.cxx b/sc/source/ui/view/tabview3.cxx index 653e47578539..7690d4b90eea 100644 --- a/sc/source/ui/view/tabview3.cxx +++ b/sc/source/ui/view/tabview3.cxx @@ -2465,6 +2465,29 @@ void ScTabView::DoChartSelection( } } +void ScTabView::DoDPFieldPopup(Point aPoint, Size /*aSize*/) +{ + ScDocument& rDocument = aViewData.GetDocShell()->GetDocument(); + ScGridWindow* pWin = pGridWin[aViewData.GetActivePart()].get(); + if (!pWin) + return; + + ScDPCollection* pDPs = rDocument.GetDPCollection(); + // TODO - DP name should be a parameter + ScDPObject* pDPObj = pDPs->GetByName("DataPilot1"); + + pDPObj->BuildAllDimensionMembers(); + + //const ScDPSaveData* pSaveData = pDPObj->GetSaveData(); + //bool bIsDataLayout; + //OUString aDimName = pDPObj->GetDimName(0, bIsDataLayout); + + Point aScreenPoint = pWin->OutputToScreenPixel(pWin->LogicToPixel(aPoint)); + //Size aScreenSize = pWin->LogicToPixel(aSize); + + pWin->DPLaunchFieldPopupMenu(aScreenPoint, Size(1, 1), 1, pDPObj); +} + // PaintGrid - repaint data range void ScTabView::PaintGrid() diff --git a/sc/source/ui/view/tabvwshb.cxx b/sc/source/ui/view/tabvwshb.cxx index 76877a890ac1..bdf391fe9436 100644 --- a/sc/source/ui/view/tabvwshb.cxx +++ b/sc/source/ui/view/tabvwshb.cxx @@ -98,6 +98,30 @@ void ScTabViewShell::ConnectObject( SdrOle2Obj* pObj ) } } +class PopupCallback : public cppu::WeakImplHelper<css::awt::XCallback> +{ + ScTabViewShell* m_pViewShell; + SdrOle2Obj* m_pObject; + +public: + explicit PopupCallback(ScTabViewShell* pViewShell, SdrOle2Obj* pObject) + : m_pViewShell(pViewShell) + , m_pObject(pObject) + {} + + // XCallback + virtual void SAL_CALL notify(const css::uno::Any& /*aData*/) override + { + Rectangle aRect = m_pObject->GetLogicRect(); + m_pViewShell->DoDPFieldPopup(aRect.TopLeft(), aRect.GetSize()); + } + + virtual void SAL_CALL disposing() + { + m_pViewShell = nullptr; + } +}; + void ScTabViewShell::ActivateObject( SdrOle2Obj* pObj, long nVerb ) { // Do not leave the hint message box on top of the object @@ -183,12 +207,19 @@ void ScTabViewShell::ActivateObject( SdrOle2Obj* pObj, long nVerb ) xSup->getComponent(), uno::UNO_QUERY_THROW ); uno::Reference< chart2::data::XRangeHighlighter > xRangeHightlighter( xDataReceiver->getRangeHighlighter()); - if( xRangeHightlighter.is()) + if (xRangeHightlighter.is()) { uno::Reference< view::XSelectionChangeListener > xListener( new ScChartRangeSelectionListener( this )); xRangeHightlighter->addSelectionChangeListener( xListener ); } + uno::Reference<chart2::data::XPopupRequest> xPopupRequest(xDataReceiver->getPopupRequest()); + if (xPopupRequest.is()) + { + uno::Reference<awt::XCallback> xCallback(new PopupCallback(this, pObj)); + uno::Any aAny; + xPopupRequest->addCallback(xCallback, aAny); + } } catch( const uno::Exception & ) { |