tdf#155636 tdf#155637 tdf#156962 Consistently use non-native controls

Since

    commit ea36e0502c
    Date:   Tue Oct 4 12:42:33 2022 +0100

        tdf#150786 use a 'standard' theme for form controls

        i.e. ignore system theme so we get the same results on export to pdf
        regardless of the theme (esp dark) and don't follow the system theme
        when hosted with a writer/calc/impress document (do continue to use
        system theme for StarBasic dialogs as seen in BasicIDE)

        Didn't reuse 'NativeWidgetLook' for this because is currently defaults
        off, while we currently do use the colors derived from the system theme
        even when this is off, its really the NWF flag to render using the
        platform theming engine

, form controls in Writer/Calc/Impress documents are
supposed to no longer make use of the system theme,
but use style settings independent of the platform
and system style/theme set.

However, `ImplSmallBorderWindowView::Init` could still
decide to enable native drawing of borders, in which case
it would enable transparency for the control and the control
background color would no longer be seen with at least the Qt-based
VCL plugins after

    commit 0e14dbc9ecdf6abae3ae3089e3b4e22f27dd4cb1
    Date:   Thu May 4 10:24:53 2023 +0100

        Resolves: tdf#155029 set StandardStyles before updateFromModel

e.g. for the multiline edit control in attachment 195659
from tdf#155637, where `mbNWFBorder = true;` would be set like this:

    #0  ImplSmallBorderWindowView::Init(OutputDevice*, long, long) (this=0x55af6388e700, pDev=0x55af62d49770, nWidth=214, nHeight=365) at vcl/source/window/brdwin.cxx:458
    #1  0x00007fed4de9f168 in ImplBorderWindow::InitView() (this=0x55af638bdb50) at vcl/source/window/brdwin.cxx:1793
    #2  0x00007fed4dea08f4 in ImplBorderWindow::UpdateView(bool, Size const&) (this=0x55af638bdb50, bNewView=true, rNewOutSize=Size = {...}) at vcl/source/window/brdwin.cxx:1808
    #3  0x00007fed4dea0847 in ImplBorderWindow::DataChanged(DataChangedEvent const&) (this=0x55af638bdb50, rDCEvt=...) at vcl/source/window/brdwin.cxx:1771
    #4  0x00007fed4de6fc32 in vcl::WindowOutputDevice::SetSettings(AllSettings const&, bool) (this=0x55af62d49770, rSettings=..., bChild=false) at vcl/source/window/settings.cxx:68
    #5  0x00007fed4de6fb19 in vcl::WindowOutputDevice::SetSettings(AllSettings const&, bool) (this=0x55af62d49420, rSettings=..., bChild=false) at vcl/source/window/settings.cxx:52
    #6  0x00007fed4de6fa8f in vcl::WindowOutputDevice::SetSettings(AllSettings const&) (this=0x55af62d49420, rSettings=...) at vcl/source/window/settings.cxx:44
    #7  0x00007fed4e12d376 in vcl::Window::SetSettings(AllSettings const&) (this=0x55af62fbb530, rSettings=...) at vcl/source/window/window3.cxx:209
    #8  0x00007fed501e3374 in UnoControl::createPeer(com::sun::uno::Reference<com::sun::awt::XToolkit> const&, com::sun::uno::Reference<com::sun::awt::XWindowPeer> const&)
        (this=0x55af62c79380, rxToolkit=empty uno::Reference, rParentPeer=uno::Reference to (VCLXContainer *) 0x55af61cbc178) at toolkit/source/controls/unocontrol.cxx:1299
    #9  0x00007fed5023dc39 in UnoEditControl::createPeer(com::sun::uno::Reference<com::sun::awt::XToolkit> const&, com::sun::uno::Reference<com::sun::awt::XWindowPeer> const&)
        (this=0x55af62c79380, rxToolkit=empty uno::Reference, rParentPeer=uno::Reference to (VCLXContainer *) 0x55af61cbc178) at toolkit/source/controls/unocontrols.cxx:241
    #10 0x00007fed05f6009f in frm::ORichTextControl::createPeer(com::sun::uno::Reference<com::sun::awt::XToolkit> const&, com::sun::uno::Reference<com::sun::awt::XWindowPeer> const&)
        (this=0x55af62c79380, _rToolkit=empty uno::Reference, _rParentPeer=uno::Reference to (VCLXContainer *) 0x55af61cbc178) at forms/source/richtext/richtextcontrol.cxx:163
    #11 0x00007fed05e34126 in frm::OControl::createPeer(com::sun::uno::Reference<com::sun::awt::XToolkit> const&, com::sun::uno::Reference<com::sun::awt::XWindowPeer> const&)
        (this=0x55af61e17c60, _rxToolkit=empty uno::Reference, _rxParent=uno::Reference to (VCLXContainer *) 0x55af61cbc178) at forms/source/component/FormComponent.cxx:272
    #12 0x00007fed50201095 in UnoControlContainer::impl_createControlPeerIfNecessary(com::sun::uno::Reference<com::sun::awt::XControl> const&)
        (this=0x55af5eb108c0, _rxControl=uno::Reference to (frm::OEditControl *) 0x55af61e17cc8) at toolkit/source/controls/unocontrolcontainer.cxx:595
    #13 0x00007fed501ff973 in UnoControlContainer::impl_addControl(com::sun::uno::Reference<com::sun::awt::XControl> const&, rtl::OUString const*)
        (this=0x55af5eb108c0, _rxControl=uno::Reference to (frm::OEditControl *) 0x55af61e17cc8, _pName=0x55af5f0d2670) at toolkit/source/controls/unocontrolcontainer.cxx:608
    #14 0x00007fed50201183 in UnoControlContainer::addControl(rtl::OUString const&, com::sun::uno::Reference<com::sun::awt::XControl> const&)
        (this=0x55af5eb108c0, rName="com.sun.star.form.control.TextField", rControl=uno::Reference to (frm::OEditControl *) 0x55af61e17cc8) at toolkit/source/controls/unocontrolcontainer.cxx:628
    #15 0x00007fed517f1aff in sdr::contact::ViewObjectContactOfUnoControl_Impl::createControlForDevice(sdr::contact::(anonymous namespace)::IPageViewAccess const&, OutputDevice const&, SdrUnoObj const&, basegfx::B2DHomMatrix const&, basegfx::B2DHomMatrix const&, sdr::contact::(anonymous namespace)::ControlHolder&) (_rPageView=..., _rDevice=..., _rUnoObject=..., _rInitialViewTransformation=..., _rInitialZoomNormalization=..., _out_rControl=...)
        at svx/source/sdr/contact/viewobjectcontactofunocontrol.cxx:1126
    #16 0x00007fed517ee55b in sdr::contact::ViewObjectContactOfUnoControl_Impl::impl_ensureControl_nothrow(sdr::contact::(anonymous namespace)::IPageViewAccess const&, OutputDevice const&, basegfx::B2DHomMatrix const&)
        (this=0x55af6389c6b0, _rPageView=..., _rDevice=..., _rInitialViewTransformation=...) at svx/source/sdr/contact/viewobjectcontactofunocontrol.cxx:1044
    #17 0x00007fed517ee1d2 in sdr::contact::ViewObjectContactOfUnoControl_Impl::ensureControl(basegfx::B2DHomMatrix const*) (this=0x55af6389c6b0, _pInitialViewTransformationOrNULL=0x55af6380a1f0)
        at svx/source/sdr/contact/viewobjectcontactofunocontrol.cxx:960
    #18 0x00007fed517f36a1 in sdr::contact::(anonymous namespace)::LazyControlCreationPrimitive2D::create2DDecomposition(drawinglayer::geometry::ViewInformation2D const&) const (this=0x55af61d38c40, _rViewInformation=...)
        at svx/source/sdr/contact/viewobjectcontactofunocontrol.cxx:1545
    #19 0x00007fed5467691a in drawinglayer::primitive2d::BufferedDecompositionPrimitive2D::get2DDecomposition(drawinglayer::primitive2d::Primitive2DDecompositionVisitor&, drawinglayer::geometry::ViewInformation2D const&) const
        (this=0x55af61d38c40, rVisitor=..., rViewInformation=...) at drawinglayer/source/primitive2d/BufferedDecompositionPrimitive2D.cxx:133
    #20 0x00007fed517f358c in sdr::contact::(anonymous namespace)::LazyControlCreationPrimitive2D::get2DDecomposition(drawinglayer::primitive2d::Primitive2DDecompositionVisitor&, drawinglayer::geometry::ViewInformation2D const&) const
        (this=0x55af61d38c40, rVisitor=..., _rViewInformation=...) at svx/source/sdr/contact/viewobjectcontactofunocontrol.cxx:1530
    [...]

Introduce a new flag `WindowBorderStyle::NONATIVEBORDER`
and set it for the newly created control in `UnoControl::createPeer`
if the use of the "standard theme" instead of the system style
is enabled.

Evaluate the flag in `ImplSmallBorderWindowView::Init`
to never enable native drawing if it is set to consistently
not apply system styling for such controls.

Change-Id: Ib12685a3cf98acba035899221feb536f40cda84c
Reviewed-on: https://gerrit.libreoffice.org/c/core/+/171396
Reviewed-by: Michael Weghorn <m.weghorn@posteo.de>
Tested-by: Jenkins
This commit is contained in:
Michael Weghorn
2024-08-01 15:58:21 +02:00
parent 7f9f32aa11
commit 001c0934aa
3 changed files with 11 additions and 3 deletions

View File

@@ -111,11 +111,14 @@ enum class WindowBorderStyle : sal_Int16
MENU = 0x0010,
NWF = 0x0020,
NOBORDER = 0x1000,
REMOVEBORDER = 0x2000
REMOVEBORDER = 0x2000,
// Never use native border, used to ensure consistency of form controls
// inside documents across platforms and in pdf/print output
NONATIVEBORDER = 0x4000,
};
namespace o3tl
{
template<> struct typed_flags<WindowBorderStyle> : is_typed_flags<WindowBorderStyle, 0x3033> {};
template<> struct typed_flags<WindowBorderStyle> : is_typed_flags<WindowBorderStyle, 0x7033> {};
}
enum class TimeFormat

View File

@@ -1292,6 +1292,11 @@ void UnoControl::createPeer( const Reference< XToolkit >& rxToolkit, const Refer
if (bUseStandardTheme)
{
VclPtr<vcl::Window> pVclPeer = VCLUnoHelper::GetWindow(getPeer());
WindowBorderStyle nStyle = pVclPeer->GetBorderStyle();
nStyle |= WindowBorderStyle::NONATIVEBORDER;
pVclPeer->SetBorderStyle(nStyle);
AllSettings aAllSettings = pVclPeer->GetSettings();
StyleSettings aStyleSettings = aAllSettings.GetStyleSettings();
aStyleSettings.SetStandardStyles();

View File

@@ -428,7 +428,7 @@ void ImplSmallBorderWindowView::Init( OutputDevice* pDev, tools::Long nWidth, to
// control this border belongs to
ControlType aCtrlType = ControlType::Generic;
ControlPart aCtrlPart = ControlPart::Entire;
if (pCtrl)
if (pCtrl && !(pCtrl->GetBorderStyle() & WindowBorderStyle::NONATIVEBORDER))
{
switch( pCtrl->GetType() )
{