lok: charts context menu was misplaced + wrong LogicToLogic conversion

Chart context menu was misplaced since the context menu expects a
position related to the document window not to the chart window.
Moreover map mode is not enabled for chart window, that leads to use
the LogicToLogic routine which unfortunately provides a wrong pixel to
twips conversion. In fact we gets a 20 twips per pixel conversion
since LogicToLogic uses a fixed 72 dpi value, instead of a correctly
computed output device real dpi or at least the most commonly used 96
dpi value.

Change-Id: Idb4220d03fddd4b6d643c1c0fb52754bafed7e36
Reviewed-on: https://gerrit.libreoffice.org/53118
Reviewed-by: Jan Holesovsky <kendy@collabora.com>
Tested-by: Jan Holesovsky <kendy@collabora.com>
Reviewed-on: https://gerrit.libreoffice.org/54649
Reviewed-on: https://gerrit.libreoffice.org/54655
Tested-by: Jenkins <ci@libreoffice.org>
Reviewed-by: Marco Cecchetti <mrcekets@gmail.com>
This commit is contained in:
Marco Cecchetti
2018-04-18 18:31:00 +02:00
committed by Marco Cecchetti
parent 494f1a98bf
commit 1f2d389c3d
2 changed files with 27 additions and 1 deletions

View File

@@ -66,6 +66,7 @@
#include <toolkit/awt/vclxmenu.hxx>
#include <sfx2/viewsh.hxx>
#include <sfx2/ipclient.hxx>
#include <svx/svxids.hrc>
#include <svx/ActionDescriptionProvider.hxx>
#include <svx/obj3d.hxx>
@@ -1259,6 +1260,19 @@ void ChartController::execute_Command( const CommandEvent& rCEvt )
{
PopupMenu* pPopupMenu = static_cast<PopupMenu*>(VCLXMenu::GetImplementation(xPopupMenu)->GetMenu());
pPopupMenu->SetLOKNotifier(SfxViewShell::Current());
// the context menu expects a position related to the document window,
// not to the chart window
SfxInPlaceClient* pIPClient = SfxViewShell::Current()->GetIPClient();
if (pIPClient)
{
vcl::Window* pRootWin = pIPClient->GetEditWin();
if (pRootWin)
{
Point aOffset = pChartWindow->GetOffsetPixelFrom(*pRootWin);
aPos += aOffset;
}
}
}
xPopupController->setPopupMenu( xPopupMenu );

View File

@@ -441,10 +441,22 @@ Point FloatingWindow::ImplCalcPos(vcl::Window* pWindow,
if (bLOKActive && pLOKTwipsPos)
{
if (pW->IsMapModeEnabled())
if (pW->IsMapModeEnabled() || pW->GetMapMode().GetMapUnit() == MapUnit::MapPixel)
{
// if we use pW->LogicToLogic(aPos, pW->GetMapMode(), MapMode(MapUnit::MapTwip)),
// for pixel conversions when map mode is not enabled, we gets
// a 20 twips per pixel conversion since LogicToLogic uses
// a fixed 72 dpi value, instead of a correctly computed output
// device dpi or at least the most commonly used 96 dpi value;
// and anyway the following is what we already do in
// ScGridWindow::LogicInvalidate when map mode is not enabled.
*pLOKTwipsPos = pW->PixelToLogic(aPos, MapMode(MapUnit::MapTwip));
}
else
{
*pLOKTwipsPos = OutputDevice::LogicToLogic(aPos, pW->GetMapMode(), MapMode(MapUnit::MapTwip));
}
}
// caller expects coordinates relative to top-level win