office-gobmx/vcl/source/window/settings.cxx
Noel Grandin 8c00536d87 Convert WindowType to scoped enum
Change-Id: I85cfe02f28729e13f2c0dd3d91cd89e6f3e3b6a9
Reviewed-on: https://gerrit.libreoffice.org/34219
Tested-by: Jenkins <ci@libreoffice.org>
Reviewed-by: Noel Grandin <noel.grandin@collabora.co.uk>
2017-02-14 10:44:08 +00:00

277 lines
10 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 <i18nlangtag/mslangid.hxx>
#include <vcl/event.hxx>
#include <vcl/svapp.hxx>
#include <vcl/window.hxx>
#include <vcl/virdev.hxx>
#include <vcl/settings.hxx>
#include <unotools/fontcfg.hxx>
#include <unotools/confignode.hxx>
#include <comphelper/processfactory.hxx>
#include <salframe.hxx>
#include <svdata.hxx>
#include <brdwin.hxx>
#include <PhysicalFontCollection.hxx>
#include <window.h>
namespace vcl {
void Window::SetSettings( const AllSettings& rSettings )
{
SetSettings( rSettings, false );
}
void Window::SetSettings( const AllSettings& rSettings, bool bChild )
{
if ( mpWindowImpl->mpBorderWindow )
{
mpWindowImpl->mpBorderWindow->SetSettings( rSettings, false );
if ( (mpWindowImpl->mpBorderWindow->GetType() == WindowType::BORDERWINDOW) &&
static_cast<ImplBorderWindow*>(mpWindowImpl->mpBorderWindow.get())->mpMenuBarWindow )
static_cast<ImplBorderWindow*>(mpWindowImpl->mpBorderWindow.get())->mpMenuBarWindow->SetSettings( rSettings, true );
}
AllSettings aOldSettings(*mxSettings);
OutputDevice::SetSettings( rSettings );
AllSettingsFlags nChangeFlags = aOldSettings.GetChangeFlags( rSettings );
// recalculate AppFont-resolution and DPI-resolution
ImplInitResolutionSettings();
if ( bool(nChangeFlags) )
{
DataChangedEvent aDCEvt( DataChangedEventType::SETTINGS, &aOldSettings, nChangeFlags );
DataChanged( aDCEvt );
}
if ( bChild )
{
vcl::Window* pChild = mpWindowImpl->mpFirstChild;
while ( pChild )
{
pChild->SetSettings( rSettings, bChild );
pChild = pChild->mpWindowImpl->mpNext;
}
}
}
void Window::UpdateSettings( const AllSettings& rSettings, bool bChild )
{
if ( mpWindowImpl->mpBorderWindow )
{
mpWindowImpl->mpBorderWindow->UpdateSettings( rSettings );
if ( (mpWindowImpl->mpBorderWindow->GetType() == WindowType::BORDERWINDOW) &&
static_cast<ImplBorderWindow*>(mpWindowImpl->mpBorderWindow.get())->mpMenuBarWindow )
static_cast<ImplBorderWindow*>(mpWindowImpl->mpBorderWindow.get())->mpMenuBarWindow->UpdateSettings( rSettings, true );
}
AllSettings aOldSettings(*mxSettings);
AllSettingsFlags nChangeFlags = mxSettings->Update( mxSettings->GetWindowUpdate(), rSettings );
// recalculate AppFont-resolution and DPI-resolution
ImplInitResolutionSettings();
/* #i73785#
* do not overwrite a WheelBehavior with false
* this looks kind of a hack, but WheelBehavior
* is always a local change, not a system property,
* so we can spare all our users the hassle of reacting on
* this in their respective DataChanged.
*/
MouseSettings aSet( mxSettings->GetMouseSettings() );
aSet.SetWheelBehavior( aOldSettings.GetMouseSettings().GetWheelBehavior() );
mxSettings->SetMouseSettings( aSet );
if( (nChangeFlags & AllSettingsFlags::STYLE) && IsBackground() )
{
Wallpaper aWallpaper = GetBackground();
if( !aWallpaper.IsBitmap() && !aWallpaper.IsGradient() )
{
if ( mpWindowImpl->mnStyle & WB_3DLOOK )
{
if (aOldSettings.GetStyleSettings().GetFaceColor() != rSettings.GetStyleSettings().GetFaceColor())
SetBackground( Wallpaper( rSettings.GetStyleSettings().GetFaceColor() ) );
}
else
{
if (aOldSettings.GetStyleSettings().GetWindowColor() != rSettings.GetStyleSettings().GetWindowColor())
SetBackground( Wallpaper( rSettings.GetStyleSettings().GetWindowColor() ) );
}
}
}
if ( bool(nChangeFlags) )
{
DataChangedEvent aDCEvt( DataChangedEventType::SETTINGS, &aOldSettings, nChangeFlags );
DataChanged( aDCEvt );
// notify data change handler
CallEventListeners( VclEventId::WindowDataChanged, &aDCEvt);
}
if ( bChild )
{
vcl::Window* pChild = mpWindowImpl->mpFirstChild;
while ( pChild )
{
pChild->UpdateSettings( rSettings, bChild );
pChild = pChild->mpWindowImpl->mpNext;
}
}
}
void Window::ImplUpdateGlobalSettings( AllSettings& rSettings, bool bCallHdl )
{
StyleSettings aTmpSt( rSettings.GetStyleSettings() );
aTmpSt.SetHighContrastMode( false );
rSettings.SetStyleSettings( aTmpSt );
ImplGetFrame()->UpdateSettings( rSettings );
StyleSettings aStyleSettings = rSettings.GetStyleSettings();
// #97047: Force all fonts except Menu and Help to a fixed height
// to avoid UI scaling due to large fonts
// - but allow bigger fonts on bigger screens (i16682, i21238)
// dialogs were designed to fit 800x600 with an 8pt font, so scale accordingly
int maxFontheight = 9; // #107886#: 9 is default for some asian systems, so always allow if requested
if( GetDesktopRectPixel().getHeight() > 600 )
maxFontheight = (int) ((( 8.0 * (double) GetDesktopRectPixel().getHeight()) / 600.0) + 1.5);
vcl::Font aFont = aStyleSettings.GetMenuFont();
int defFontheight = aFont.GetFontHeight();
if( defFontheight > maxFontheight )
defFontheight = maxFontheight;
// if the UI is korean, chinese or another locale
// where the system font size is known to be often too small to
// generate readable fonts enforce a minimum font size of 9 points
bool bBrokenLangFontHeight = MsLangId::isCJK(Application::GetSettings().GetUILanguageTag().getLanguageType());
if (bBrokenLangFontHeight)
defFontheight = std::max(9, defFontheight);
// i22098, toolfont will be scaled differently to avoid bloated rulers and status bars for big fonts
int toolfontheight = defFontheight;
if( toolfontheight > 9 )
toolfontheight = (defFontheight+8) / 2;
aFont = aStyleSettings.GetAppFont();
aFont.SetFontHeight( defFontheight );
aStyleSettings.SetAppFont( aFont );
aFont = aStyleSettings.GetTitleFont();
aFont.SetFontHeight( defFontheight );
aStyleSettings.SetTitleFont( aFont );
aFont = aStyleSettings.GetFloatTitleFont();
aFont.SetFontHeight( defFontheight );
aStyleSettings.SetFloatTitleFont( aFont );
// keep menu and help font size from system unless in broken locale size
if( bBrokenLangFontHeight )
{
aFont = aStyleSettings.GetMenuFont();
if( aFont.GetFontHeight() < defFontheight )
{
aFont.SetFontHeight( defFontheight );
aStyleSettings.SetMenuFont( aFont );
}
aFont = aStyleSettings.GetHelpFont();
if( aFont.GetFontHeight() < defFontheight )
{
aFont.SetFontHeight( defFontheight );
aStyleSettings.SetHelpFont( aFont );
}
}
// use different height for toolfont
aFont = aStyleSettings.GetToolFont();
aFont.SetFontHeight( toolfontheight );
aStyleSettings.SetToolFont( aFont );
aFont = aStyleSettings.GetLabelFont();
aFont.SetFontHeight( defFontheight );
aStyleSettings.SetLabelFont( aFont );
aFont = aStyleSettings.GetRadioCheckFont();
aFont.SetFontHeight( defFontheight );
aStyleSettings.SetRadioCheckFont( aFont );
aFont = aStyleSettings.GetPushButtonFont();
aFont.SetFontHeight( defFontheight );
aStyleSettings.SetPushButtonFont( aFont );
aFont = aStyleSettings.GetFieldFont();
aFont.SetFontHeight( defFontheight );
aStyleSettings.SetFieldFont( aFont );
aFont = aStyleSettings.GetIconFont();
aFont.SetFontHeight( defFontheight );
aStyleSettings.SetIconFont( aFont );
aFont = aStyleSettings.GetTabFont();
aFont.SetFontHeight( defFontheight );
aStyleSettings.SetTabFont( aFont );
aFont = aStyleSettings.GetGroupFont();
aFont.SetFontHeight( defFontheight );
aStyleSettings.SetGroupFont( aFont );
rSettings.SetStyleSettings( aStyleSettings );
bool bForceHCMode = false;
// auto detect HC mode; if the system already set it to "yes"
// (see above) then accept that
if( !rSettings.GetStyleSettings().GetHighContrastMode() )
{
bool bAutoHCMode = true;
utl::OConfigurationNode aNode = utl::OConfigurationTreeRoot::tryCreateWithComponentContext(
comphelper::getProcessComponentContext(),
"org.openoffice.Office.Common/Accessibility" ); // note: case sensitive !
if ( aNode.isValid() )
{
css::uno::Any aValue = aNode.getNodeValue( OUString("AutoDetectSystemHC") );
bool bTmp = false;
if( aValue >>= bTmp )
bAutoHCMode = bTmp;
}
if( bAutoHCMode )
{
if( rSettings.GetStyleSettings().GetFaceColor().IsDark() ||
rSettings.GetStyleSettings().GetWindowColor().IsDark() )
bForceHCMode = true;
}
}
static const char* pEnvHC = getenv( "SAL_FORCE_HC" );
if( pEnvHC && *pEnvHC )
bForceHCMode = true;
if( bForceHCMode )
{
aStyleSettings = rSettings.GetStyleSettings();
aStyleSettings.SetHighContrastMode( true );
rSettings.SetStyleSettings( aStyleSettings );
}
if ( bCallHdl )
GetpApp()->OverrideSystemSettings( rSettings );
}
} /*namespace vcl*/
/* vim:set shiftwidth=4 softtabstop=4 expandtab: */