/* -*- 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 #include "toolkit/awt/scrollabledialog.hxx" #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include "helper/accessibilityclient.hxx" #include "helper/imagealign.hxx" #include "helper/tkresmgr.hxx" #include "vclxwindows_internal.hxx" using ::com::sun::star::uno::Any; using ::com::sun::star::uno::Reference; using ::com::sun::star::uno::makeAny; using ::com::sun::star::uno::RuntimeException; using ::com::sun::star::lang::EventObject; using ::com::sun::star::awt::ItemListEvent; using ::com::sun::star::awt::XItemList; using ::com::sun::star::graphic::XGraphic; using ::com::sun::star::graphic::XGraphicProvider; using namespace ::com::sun::star; using namespace ::com::sun::star::awt::VisualEffect; namespace ImageScaleMode = ::com::sun::star::awt::ImageScaleMode; static double ImplCalcLongValue( double nValue, sal_uInt16 nDigits ) { double n = nValue; for ( sal_uInt16 d = 0; d < nDigits; d++ ) n *= 10; return n; } static double ImplCalcDoubleValue( double nValue, sal_uInt16 nDigits ) { double n = nValue; for ( sal_uInt16 d = 0; d < nDigits; d++ ) n /= 10; return n; } namespace toolkit { /** sets the "face color" for button like controls (scroll bar, spin button) */ void setButtonLikeFaceColor( vcl::Window* _pWindow, const ::com::sun::star::uno::Any& _rColorValue ) { AllSettings aSettings = _pWindow->GetSettings(); StyleSettings aStyleSettings = aSettings.GetStyleSettings(); if ( !_rColorValue.hasValue() ) { const StyleSettings& aAppStyle = Application::GetSettings().GetStyleSettings(); aStyleSettings.SetFaceColor( aAppStyle.GetFaceColor( ) ); aStyleSettings.SetCheckedColor( aAppStyle.GetCheckedColor( ) ); aStyleSettings.SetLightBorderColor( aAppStyle.GetLightBorderColor() ); aStyleSettings.SetLightColor( aAppStyle.GetLightColor() ); aStyleSettings.SetShadowColor( aAppStyle.GetShadowColor() ); aStyleSettings.SetDarkShadowColor( aAppStyle.GetDarkShadowColor() ); } else { sal_Int32 nBackgroundColor = 0; _rColorValue >>= nBackgroundColor; aStyleSettings.SetFaceColor( nBackgroundColor ); // for the real background (everything except the buttons and the thumb), // use an average between the desired color and "white" Color aWhite( COL_WHITE ); Color aBackground( nBackgroundColor ); aBackground.SetRed( ( aBackground.GetRed() + aWhite.GetRed() ) / 2 ); aBackground.SetGreen( ( aBackground.GetGreen() + aWhite.GetGreen() ) / 2 ); aBackground.SetBlue( ( aBackground.GetBlue() + aWhite.GetBlue() ) / 2 ); aStyleSettings.SetCheckedColor( aBackground ); sal_Int32 nBackgroundLuminance = Color( nBackgroundColor ).GetLuminance(); sal_Int32 nWhiteLuminance = Color( COL_WHITE ).GetLuminance(); Color aLightShadow( nBackgroundColor ); aLightShadow.IncreaseLuminance( (sal_uInt8)( ( nWhiteLuminance - nBackgroundLuminance ) * 2 / 3 ) ); aStyleSettings.SetLightBorderColor( aLightShadow ); Color aLight( nBackgroundColor ); aLight.IncreaseLuminance( (sal_uInt8)( ( nWhiteLuminance - nBackgroundLuminance ) * 1 / 3 ) ); aStyleSettings.SetLightColor( aLight ); Color aShadow( nBackgroundColor ); aShadow.DecreaseLuminance( (sal_uInt8)( nBackgroundLuminance * 1 / 3 ) ); aStyleSettings.SetShadowColor( aShadow ); Color aDarkShadow( nBackgroundColor ); aDarkShadow.DecreaseLuminance( (sal_uInt8)( nBackgroundLuminance * 2 / 3 ) ); aStyleSettings.SetDarkShadowColor( aDarkShadow ); } aSettings.SetStyleSettings( aStyleSettings ); _pWindow->SetSettings( aSettings, true ); } Any getButtonLikeFaceColor( const vcl::Window* _pWindow ) { sal_Int32 nBackgroundColor = _pWindow->GetSettings().GetStyleSettings().GetFaceColor().GetColor(); return makeAny( nBackgroundColor ); } static void adjustBooleanWindowStyle( const Any& _rValue, vcl::Window* _pWindow, WinBits _nBits, bool _bInverseSemantics ) { WinBits nStyle = _pWindow->GetStyle(); bool bValue( false ); OSL_VERIFY( _rValue >>= bValue ); if ( bValue != _bInverseSemantics ) nStyle |= _nBits; else nStyle &= ~_nBits; _pWindow->SetStyle( nStyle ); } static void setVisualEffect( const Any& _rValue, vcl::Window* _pWindow ) { AllSettings aSettings = _pWindow->GetSettings(); StyleSettings aStyleSettings = aSettings.GetStyleSettings(); sal_Int16 nStyle = LOOK3D; OSL_VERIFY( _rValue >>= nStyle ); switch ( nStyle ) { case FLAT: aStyleSettings.SetOptions( aStyleSettings.GetOptions() | STYLE_OPTION_MONO ); break; case LOOK3D: default: aStyleSettings.SetOptions( aStyleSettings.GetOptions() & ~STYLE_OPTION_MONO ); } aSettings.SetStyleSettings( aStyleSettings ); _pWindow->SetSettings( aSettings ); } static Any getVisualEffect( vcl::Window* _pWindow ) { Any aEffect; StyleSettings aStyleSettings = _pWindow->GetSettings().GetStyleSettings(); if ( (aStyleSettings.GetOptions() & STYLE_OPTION_MONO) ) aEffect <<= (sal_Int16)FLAT; else aEffect <<= (sal_Int16)LOOK3D; return aEffect; } } // class VCLXGraphicControl void VCLXGraphicControl::ImplGetPropertyIds( std::list< sal_uInt16 > &rIds ) { VCLXWindow::ImplGetPropertyIds( rIds ); } void VCLXGraphicControl::ImplSetNewImage() { OSL_PRECOND( GetWindow(), "VCLXGraphicControl::ImplSetNewImage: window is required to be not-NULL!" ); VclPtr< Button > pButton = GetAsDynamic< Button >(); pButton->SetModeImage( GetImage() ); } void VCLXGraphicControl::setPosSize( sal_Int32 X, sal_Int32 Y, sal_Int32 Width, sal_Int32 Height, short Flags ) throw(::com::sun::star::uno::RuntimeException, std::exception) { SolarMutexGuard aGuard; if ( GetWindow() ) { Size aOldSize = GetWindow()->GetSizePixel(); VCLXWindow::setPosSize( X, Y, Width, Height, Flags ); if ( ( aOldSize.Width() != Width ) || ( aOldSize.Height() != Height ) ) ImplSetNewImage(); } } void VCLXGraphicControl::setProperty( const OUString& PropertyName, const ::com::sun::star::uno::Any& Value) throw(::com::sun::star::uno::RuntimeException, std::exception) { SolarMutexGuard aGuard; VclPtr< Button > pButton = GetAs< Button >(); if ( !pButton ) return; sal_uInt16 nPropType = GetPropertyId( PropertyName ); switch ( nPropType ) { case BASEPROPERTY_GRAPHIC: { Reference< XGraphic > xGraphic; OSL_VERIFY( Value >>= xGraphic ); maImage = Image( xGraphic ); ImplSetNewImage(); } break; case BASEPROPERTY_IMAGEALIGN: { WindowType eType = GetWindow()->GetType(); if ( ( eType == WINDOW_PUSHBUTTON ) || ( eType == WINDOW_RADIOBUTTON ) || ( eType == WINDOW_CHECKBOX ) ) { sal_Int16 nAlignment = sal_Int16(); if ( Value >>= nAlignment ) { Button* pButton = static_cast< Button* >( GetWindow() ); pButton->SetImageAlign( static_cast< ImageAlign >( nAlignment ) ); } } } break; case BASEPROPERTY_IMAGEPOSITION: { WindowType eType = GetWindow()->GetType(); if ( ( eType == WINDOW_PUSHBUTTON ) || ( eType == WINDOW_RADIOBUTTON ) || ( eType == WINDOW_CHECKBOX ) ) { sal_Int16 nImagePosition = 2; OSL_VERIFY( Value >>= nImagePosition ); Button* pButton = static_cast< Button* >( GetWindow() ); pButton->SetImageAlign( ::toolkit::translateImagePosition( nImagePosition ) ); } } break; default: VCLXWindow::setProperty( PropertyName, Value ); break; } } ::com::sun::star::uno::Any VCLXGraphicControl::getProperty( const OUString& PropertyName ) throw(::com::sun::star::uno::RuntimeException, std::exception) { SolarMutexGuard aGuard; ::com::sun::star::uno::Any aProp; if ( !GetWindow() ) return aProp; sal_uInt16 nPropType = GetPropertyId( PropertyName ); switch ( nPropType ) { case BASEPROPERTY_GRAPHIC: aProp <<= maImage.GetXGraphic(); break; case BASEPROPERTY_IMAGEALIGN: { WindowType eType = GetWindow()->GetType(); if ( ( eType == WINDOW_PUSHBUTTON ) || ( eType == WINDOW_RADIOBUTTON ) || ( eType == WINDOW_CHECKBOX ) ) { aProp <<= ::toolkit::getCompatibleImageAlign( GetAs