Kaydet (Commit) 5f2b67e7 authored tarafından Miklos Vajna's avatar Miklos Vajna

tdf#119947 vcl opengl win: fix fontwork popup menu

Regression from commit b160db92
(tdf#96947 vcl opengl win: fix background of menu items w/ check/radio
marks, 2018-05-14), the problem was that GetMenuPopupMarkRegion() did an
unconditional downcast from ImplControlValue to MenupopupValue.  This
looked safe, but when the extracted function was used in
WinSalGraphics::drawNativeControl(), then that argument was not safe to
downcast.

Fix the problem by switching to safe downcast, and returning an empty
rectangle (instead of a bogus one) on error.

This way the old bug stays fixed but fontwork popup menu works again as
well.

Change-Id: I2b69b9f2e6823850892ac73df78dac5c2f04ec03
Reviewed-on: https://gerrit.libreoffice.org/68883Reviewed-by: 's avatarMiklos Vajna <vmiklos@collabora.com>
Tested-by: Jenkins
üst c8919fcb
......@@ -496,18 +496,21 @@ static tools::Rectangle GetMenuPopupMarkRegion(const ImplControlValue& rValue)
{
tools::Rectangle aRet;
const MenupopupValue& rMVal(static_cast<const MenupopupValue&>(rValue));
aRet.SetTop(rMVal.maItemRect.Top());
aRet.SetBottom(rMVal.maItemRect.Bottom() + 1); // see below in drawNativeControl
auto pMVal = dynamic_cast<const MenupopupValue*>(&rValue);
if (!pMVal)
return aRet;
aRet.SetTop(pMVal->maItemRect.Top());
aRet.SetBottom(pMVal->maItemRect.Bottom() + 1); // see below in drawNativeControl
if (AllSettings::GetLayoutRTL())
{
aRet.SetRight(rMVal.maItemRect.Right() + 1);
aRet.SetLeft(aRet.Right() - (rMVal.getNumericVal() - rMVal.maItemRect.Left()));
aRet.SetRight(pMVal->maItemRect.Right() + 1);
aRet.SetLeft(aRet.Right() - (pMVal->getNumericVal() - pMVal->maItemRect.Left()));
}
else
{
aRet.SetRight(rMVal.getNumericVal());
aRet.SetLeft(rMVal.maItemRect.Left());
aRet.SetRight(pMVal->getNumericVal());
aRet.SetLeft(pMVal->maItemRect.Left());
}
return aRet;
......@@ -1173,9 +1176,13 @@ bool WinSalGraphics::drawNativeControl( ControlType nType,
if (pImpl && nType == ControlType::MenuPopup && (nPart == ControlPart::MenuItemCheckMark || nPart == ControlPart::MenuItemRadioMark))
{
cacheRect = GetMenuPopupMarkRegion(aValue);
buttonRect = cacheRect;
keySize = cacheRect.GetSize();
tools::Rectangle aRectangle = GetMenuPopupMarkRegion(aValue);
if (!aRectangle.IsEmpty())
{
cacheRect = GetMenuPopupMarkRegion(aValue);
buttonRect = cacheRect;
keySize = cacheRect.GetSize();
}
}
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment