Resolves: tdf#145959 menu pos should be relative to SmCmdBoxWindow
Change-Id: Ie8da9bbb4385b3315fd62e6f2dc8ab394ea3709f
Reviewed-on: https://gerrit.libreoffice.org/c/core/+/126263
Tested-by: Jenkins
Reviewed-by: Caolán McNamara <caolanm@redhat.com>
diff --git a/starmath/inc/view.hxx b/starmath/inc/view.hxx
index 8d54cac..a8e02ad 100644
--- a/starmath/inc/view.hxx
+++ b/starmath/inc/view.hxx
@@ -210,6 +210,10 @@ public:
virtual void StateChanged( StateChangedType nStateChange ) override;
virtual void Command(const CommandEvent& rCEvt) override;
Point WidgetToWindowPos(const weld::Widget& rWidget, const Point& rPos);
void ShowContextMenu(const Point& rPos);
void AdjustPosition();
SmEditWindow& GetEditWindow()
diff --git a/starmath/source/edit.cxx b/starmath/source/edit.cxx
index 2588e9f6..e8e79a2 100644
--- a/starmath/source/edit.cxx
+++ b/starmath/source/edit.cxx
@@ -266,10 +266,9 @@ bool SmEditTextWindow::Command(const CommandEvent& rCEvt)
if (rCEvt.GetCommand() == CommandEventId::ContextMenu)
{
// purely for "ExecutePopup" taking a vcl::Window and
// we assume SmEditTextWindow 0,0 is at SmEditWindow 0,0
ReleaseMouse();
mrEditWindow.GetCmdBox().Command(rCEvt);
SmCmdBoxWindow& rCmdBox = mrEditWindow.GetCmdBox();
rCmdBox.ShowContextMenu(rCmdBox.WidgetToWindowPos(*GetDrawingArea(), rCEvt.GetMousePosPixel()));
GrabFocus();
return true;
}
diff --git a/starmath/source/view.cxx b/starmath/source/view.cxx
index 6eb1213..5bc143a 100644
--- a/starmath/source/view.cxx
+++ b/starmath/source/view.cxx
@@ -831,15 +831,29 @@ SmCmdBoxWindow::SmCmdBoxWindow(SfxBindings *pBindings_, SfxChildWindow *pChildWi
aInitialFocusTimer.SetTimeout(100);
}
Point SmCmdBoxWindow::WidgetToWindowPos(const weld::Widget& rWidget, const Point& rPos)
{
Point aRet(rPos);
int x(0), y(0), width(0), height(0);
rWidget.get_extents_relative_to(*m_xContainer, x, y, width, height);
aRet.Move(x, y);
aRet.Move(m_xBox->GetPosPixel().X(), m_xBox->GetPosPixel().Y());
return aRet;
}
void SmCmdBoxWindow::ShowContextMenu(const Point& rPos)
{
ToTop();
SmViewShell *pViewSh = GetView();
if (pViewSh)
pViewSh->GetViewFrame()->GetDispatcher()->ExecutePopup("edit", this, &rPos);
}
void SmCmdBoxWindow::Command(const CommandEvent& rCEvt)
{
if (rCEvt.GetCommand() == CommandEventId::ContextMenu)
{
ToTop();
Point aPoint = rCEvt.GetMousePosPixel();
SmViewShell *pViewSh = GetView();
if (pViewSh)
pViewSh->GetViewFrame()->GetDispatcher()->ExecutePopup("edit", this, &aPoint);
ShowContextMenu(rCEvt.GetMousePosPixel());
return;
}