office-gobmx/vcl/source/window/tabpage.cxx
Caolán McNamara c3d7933d0f Resolves: tdf#122059 don't crash with no parent for tabpage
Change-Id: Id27609a86558094e6b53c763aebe77c97cc11672
Reviewed-on: https://gerrit.libreoffice.org/65148
Tested-by: Jenkins
Reviewed-by: Caolán McNamara <caolanm@redhat.com>
Tested-by: Caolán McNamara <caolanm@redhat.com>
2018-12-14 12:04:25 +01:00

215 lines
6.7 KiB
C++

/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
/*
* This file is part of the LibreOffice project.
*
* This Source Code Form is subject to the terms of the Mozilla Public
* License, v. 2.0. If a copy of the MPL was not distributed with this
* file, You can obtain one at http://mozilla.org/MPL/2.0/.
*
* This file incorporates work covered by the following license notice:
*
* Licensed to the Apache Software Foundation (ASF) under one or more
* contributor license agreements. See the NOTICE file distributed
* with this work for additional information regarding copyright
* ownership. The ASF licenses this file to you under the Apache
* License, Version 2.0 (the "License"); you may not use this file
* except in compliance with the License. You may obtain a copy of
* the License at http://www.apache.org/licenses/LICENSE-2.0 .
*/
#include <vcl/event.hxx>
#include <vcl/layout.hxx>
#include <vcl/svapp.hxx>
#include <vcl/tabpage.hxx>
#include <vcl/tabctrl.hxx>
#include <vcl/bitmapex.hxx>
#include <vcl/settings.hxx>
#include <svdata.hxx>
#include <com/sun/star/accessibility/XAccessible.hpp>
void TabPage::ImplInit( vcl::Window* pParent, WinBits nStyle )
{
if ( !(nStyle & WB_NODIALOGCONTROL) )
nStyle |= WB_DIALOGCONTROL;
Window::ImplInit( pParent, nStyle, nullptr );
ImplInitSettings();
// if the tabpage is drawn (ie filled) by a native widget, make sure all controls will have transparent background
// otherwise they will paint with a wrong background
if( IsNativeControlSupported(ControlType::TabBody, ControlPart::Entire) && GetParent() && (GetParent()->GetType() == WindowType::TABCONTROL) )
EnableChildTransparentMode();
}
void TabPage::ImplInitSettings()
{
vcl::Window* pParent = GetParent();
if (pParent && pParent->IsChildTransparentModeEnabled() && !IsControlBackground())
{
EnableChildTransparentMode();
SetParentClipMode( ParentClipMode::NoClip );
SetPaintTransparent( true );
SetBackground();
}
else
{
EnableChildTransparentMode( false );
SetParentClipMode();
SetPaintTransparent( false );
if (IsControlBackground() || !pParent)
SetBackground( GetControlBackground() );
else
SetBackground( pParent->GetBackground() );
}
}
TabPage::TabPage( vcl::Window* pParent, WinBits nStyle ) :
Window( WindowType::TABPAGE )
, IContext()
{
ImplInit( pParent, nStyle );
}
TabPage::TabPage(vcl::Window *pParent, const OString& rID, const OUString& rUIXMLDescription)
: Window(WindowType::TABPAGE)
, IContext()
{
ImplInit(pParent, 0);
m_pUIBuilder.reset( new VclBuilder(this, getUIRootDir(), rUIXMLDescription, rID) );
set_hexpand(true);
set_vexpand(true);
set_expand(true);
}
TabPage::~TabPage()
{
disposeOnce();
}
void TabPage::dispose()
{
disposeBuilder();
vcl::Window::dispose();
}
void TabPage::StateChanged( StateChangedType nType )
{
Window::StateChanged( nType );
if ( nType == StateChangedType::InitShow )
{
if (GetSettings().GetStyleSettings().GetAutoMnemonic())
Accelerator::GenerateAutoMnemonicsOnHierarchy(this);
// FIXME: no layouting, workaround some clipping issues
ImplAdjustNWFSizes();
}
else if ( nType == StateChangedType::ControlBackground )
{
ImplInitSettings();
Invalidate();
}
}
void TabPage::DataChanged( const DataChangedEvent& rDCEvt )
{
Window::DataChanged( rDCEvt );
if ( (rDCEvt.GetType() == DataChangedEventType::SETTINGS) &&
(rDCEvt.GetFlags() & AllSettingsFlags::STYLE) )
{
ImplInitSettings();
Invalidate();
}
}
void TabPage::Paint( vcl::RenderContext& rRenderContext, const tools::Rectangle& )
{
// draw native tabpage only inside tabcontrols, standalone tabpages look ugly (due to bad dialog design)
if( IsNativeControlSupported(ControlType::TabBody, ControlPart::Entire) && GetParent() && (GetParent()->GetType() == WindowType::TABCONTROL) )
{
const ImplControlValue aControlValue;
ControlState nState = ControlState::ENABLED;
if ( !IsEnabled() )
nState &= ~ControlState::ENABLED;
if ( HasFocus() )
nState |= ControlState::FOCUSED;
// pass the whole window region to NWF as the tab body might be a gradient or bitmap
// that has to be scaled properly, clipping makes sure that we do not paint too much
tools::Rectangle aCtrlRegion( Point(), GetOutputSizePixel() );
rRenderContext.DrawNativeControl( ControlType::TabBody, ControlPart::Entire, aCtrlRegion, nState,
aControlValue, OUString() );
}
}
void TabPage::Draw( OutputDevice* pDev, const Point& rPos, const Size& rSize, DrawFlags )
{
Point aPos = pDev->LogicToPixel( rPos );
Size aSize = pDev->LogicToPixel( rSize );
Wallpaper aWallpaper = GetBackground();
if ( !aWallpaper.IsBitmap() )
ImplInitSettings();
pDev->Push();
pDev->SetMapMode();
pDev->SetLineColor();
if ( aWallpaper.IsBitmap() )
pDev->DrawBitmapEx( aPos, aSize, aWallpaper.GetBitmap() );
else
{
if( aWallpaper.GetColor() == COL_AUTO )
pDev->SetFillColor( GetSettings().GetStyleSettings().GetDialogColor() );
else
pDev->SetFillColor( aWallpaper.GetColor() );
pDev->DrawRect( tools::Rectangle( aPos, aSize ) );
}
pDev->Pop();
}
void TabPage::ActivatePage()
{
}
void TabPage::DeactivatePage()
{
}
Size TabPage::GetOptimalSize() const
{
if (isLayoutEnabled(this))
return VclContainer::getLayoutRequisition(*GetWindow(GetWindowType::FirstChild));
return getLegacyBestSizeForChildren(*this);
}
void TabPage::SetPosSizePixel(const Point& rAllocPos, const Size& rAllocation)
{
Window::SetPosSizePixel(rAllocPos, rAllocation);
if (isLayoutEnabled(this) && rAllocation.Width() && rAllocation.Height())
VclContainer::setLayoutAllocation(*GetWindow(GetWindowType::FirstChild), Point(0, 0), rAllocation);
}
void TabPage::SetSizePixel(const Size& rAllocation)
{
Window::SetSizePixel(rAllocation);
if (isLayoutEnabled(this) && rAllocation.Width() && rAllocation.Height())
VclContainer::setLayoutAllocation(*GetWindow(GetWindowType::FirstChild), Point(0, 0), rAllocation);
}
void TabPage::SetPosPixel(const Point& rAllocPos)
{
Window::SetPosPixel(rAllocPos);
Size aAllocation(GetOutputSizePixel());
if (isLayoutEnabled(this) && aAllocation.Width() && aAllocation.Height())
{
VclContainer::setLayoutAllocation(*GetWindow(GetWindowType::FirstChild), Point(0, 0), aAllocation);
}
}
/* vim:set shiftwidth=4 softtabstop=4 expandtab: */