diff options
Diffstat (limited to '')
-rw-r--r-- | forms/source/component/formcontrolfont.cxx | 575 |
1 files changed, 575 insertions, 0 deletions
diff --git a/forms/source/component/formcontrolfont.cxx b/forms/source/component/formcontrolfont.cxx new file mode 100644 index 000000000..1399e2b94 --- /dev/null +++ b/forms/source/component/formcontrolfont.cxx @@ -0,0 +1,575 @@ +/* -*- 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 <formcontrolfont.hxx> +#include <frm_strings.hxx> +#include <property.hxx> +#include <cppuhelper/propshlp.hxx> +#include <comphelper/property.hxx> +#include <comphelper/types.hxx> +#include <tools/color.hxx> +#include <sal/log.hxx> +#include <toolkit/helper/emptyfontdescriptor.hxx> +#include <com/sun/star/awt/FontRelief.hpp> +#include <com/sun/star/awt/FontEmphasisMark.hpp> + + +namespace frm +{ + + + using namespace ::comphelper; + using namespace ::com::sun::star::uno; + using namespace ::com::sun::star::awt; + using namespace ::com::sun::star::lang; + using namespace ::com::sun::star::beans; + + + namespace + { + Any lcl_extractFontDescriptorAggregate( sal_Int32 _nHandle, const FontDescriptor& _rFont ) + { + Any aValue; + switch ( _nHandle ) + { + case PROPERTY_ID_FONT_NAME: + aValue <<= _rFont.Name; + break; + + case PROPERTY_ID_FONT_STYLENAME: + aValue <<= _rFont.StyleName; + break; + + case PROPERTY_ID_FONT_FAMILY: + aValue <<= _rFont.Family; + break; + + case PROPERTY_ID_FONT_CHARSET: + aValue <<= _rFont.CharSet; + break; + + case PROPERTY_ID_FONT_CHARWIDTH: + aValue <<= _rFont.CharacterWidth; + break; + + case PROPERTY_ID_FONT_KERNING: + aValue <<= _rFont.Kerning; + break; + + case PROPERTY_ID_FONT_ORIENTATION: + aValue <<= _rFont.Orientation; + break; + + case PROPERTY_ID_FONT_PITCH: + aValue <<= _rFont.Pitch; + break; + + case PROPERTY_ID_FONT_TYPE: + aValue <<= _rFont.Type; + break; + + case PROPERTY_ID_FONT_WIDTH: + aValue <<= _rFont.Width; + break; + + case PROPERTY_ID_FONT_HEIGHT: + aValue <<= static_cast<float>( _rFont.Height ); + break; + + case PROPERTY_ID_FONT_WEIGHT: + aValue <<= _rFont.Weight; + break; + + case PROPERTY_ID_FONT_SLANT: + aValue <<= _rFont.Slant; + break; + + case PROPERTY_ID_FONT_UNDERLINE: + aValue <<= _rFont.Underline; + break; + + case PROPERTY_ID_FONT_STRIKEOUT: + aValue <<= _rFont.Strikeout; + break; + + case PROPERTY_ID_FONT_WORDLINEMODE: + aValue <<= _rFont.WordLineMode; + break; + + default: + OSL_FAIL( "lcl_extractFontDescriptorAggregate: invalid handle!" ); + break; + } + return aValue; + } + } + + FontControlModel::FontControlModel( bool _bToolkitCompatibleDefaults ) + :m_nFontRelief( css::awt::FontRelief::NONE ) + ,m_nFontEmphasis( css::awt::FontEmphasisMark::NONE ) + ,m_bToolkitCompatibleDefaults( _bToolkitCompatibleDefaults ) + { + } + + + FontControlModel::FontControlModel( const FontControlModel* _pOriginal ) + { + m_aFont = _pOriginal->m_aFont; + m_nFontRelief = _pOriginal->m_nFontRelief; + m_nFontEmphasis = _pOriginal->m_nFontEmphasis; + m_aTextLineColor = _pOriginal->m_aTextLineColor; + m_aTextColor = _pOriginal->m_aTextColor; + m_bToolkitCompatibleDefaults = _pOriginal->m_bToolkitCompatibleDefaults; + } + + + bool FontControlModel::isFontRelatedProperty( sal_Int32 _nPropertyHandle ) + { + return isFontAggregateProperty( _nPropertyHandle ) + || ( _nPropertyHandle == PROPERTY_ID_FONT ) + || ( _nPropertyHandle == PROPERTY_ID_FONTEMPHASISMARK ) + || ( _nPropertyHandle == PROPERTY_ID_FONTRELIEF ) + || ( _nPropertyHandle == PROPERTY_ID_TEXTLINECOLOR ) + || ( _nPropertyHandle == PROPERTY_ID_TEXTCOLOR ); + } + + + bool FontControlModel::isFontAggregateProperty( sal_Int32 _nPropertyHandle ) + { + return ( _nPropertyHandle == PROPERTY_ID_FONT_CHARWIDTH ) + || ( _nPropertyHandle == PROPERTY_ID_FONT_ORIENTATION ) + || ( _nPropertyHandle == PROPERTY_ID_FONT_WIDTH ) + || ( _nPropertyHandle == PROPERTY_ID_FONT_NAME ) + || ( _nPropertyHandle == PROPERTY_ID_FONT_STYLENAME ) + || ( _nPropertyHandle == PROPERTY_ID_FONT_FAMILY ) + || ( _nPropertyHandle == PROPERTY_ID_FONT_CHARSET ) + || ( _nPropertyHandle == PROPERTY_ID_FONT_HEIGHT ) + || ( _nPropertyHandle == PROPERTY_ID_FONT_WEIGHT ) + || ( _nPropertyHandle == PROPERTY_ID_FONT_SLANT ) + || ( _nPropertyHandle == PROPERTY_ID_FONT_UNDERLINE ) + || ( _nPropertyHandle == PROPERTY_ID_FONT_STRIKEOUT ) + || ( _nPropertyHandle == PROPERTY_ID_FONT_WORDLINEMODE ) + || ( _nPropertyHandle == PROPERTY_ID_FONT_PITCH ) + || ( _nPropertyHandle == PROPERTY_ID_FONT_KERNING ) + || ( _nPropertyHandle == PROPERTY_ID_FONT_TYPE ); + } + + + Color FontControlModel::getTextColor( ) const + { + Color nColor = COL_TRANSPARENT; + m_aTextColor >>= nColor; + return nColor; + } + + + Color FontControlModel::getTextLineColor( ) const + { + Color nColor = COL_TRANSPARENT; + m_aTextLineColor >>= nColor; + return nColor; + } + + + void FontControlModel::describeFontRelatedProperties( Sequence< Property >& /* [out] */ _rProps) + { + sal_Int32 nPos = _rProps.getLength(); + _rProps.realloc( nPos + 21 ); + Property* pProperties = _rProps.getArray(); + + DECL_PROP2 ( FONT, FontDescriptor, BOUND, MAYBEDEFAULT ); + DECL_PROP2 ( FONTEMPHASISMARK, sal_Int16, BOUND, MAYBEDEFAULT ); + DECL_PROP2 ( FONTRELIEF, sal_Int16, BOUND, MAYBEDEFAULT ); + DECL_PROP3 ( TEXTCOLOR, sal_Int32, BOUND, MAYBEDEFAULT, MAYBEVOID ); + DECL_PROP3 ( TEXTLINECOLOR, sal_Int32, BOUND, MAYBEDEFAULT, MAYBEVOID ); + + DECL_PROP1 ( FONT_CHARWIDTH, float, MAYBEDEFAULT ); + DECL_BOOL_PROP1 ( FONT_KERNING, MAYBEDEFAULT ); + DECL_PROP1 ( FONT_ORIENTATION, float, MAYBEDEFAULT ); + DECL_PROP1 ( FONT_PITCH, sal_Int16, MAYBEDEFAULT ); + DECL_PROP1 ( FONT_TYPE, sal_Int16, MAYBEDEFAULT ); + DECL_PROP1 ( FONT_WIDTH, sal_Int16, MAYBEDEFAULT ); + DECL_PROP1 ( FONT_NAME, OUString, MAYBEDEFAULT ); + DECL_PROP1 ( FONT_STYLENAME, OUString, MAYBEDEFAULT ); + DECL_PROP1 ( FONT_FAMILY, sal_Int16, MAYBEDEFAULT ); + DECL_PROP1 ( FONT_CHARSET, sal_Int16, MAYBEDEFAULT ); + DECL_PROP1 ( FONT_HEIGHT, float, MAYBEDEFAULT ); + DECL_PROP1 ( FONT_WEIGHT, float, MAYBEDEFAULT ); + DECL_PROP1 ( FONT_SLANT, sal_Int16, MAYBEDEFAULT ); + DECL_PROP1 ( FONT_UNDERLINE, sal_Int16, MAYBEDEFAULT ); + DECL_PROP1 ( FONT_STRIKEOUT, sal_Int16, MAYBEDEFAULT ); + DECL_BOOL_PROP1 ( FONT_WORDLINEMODE, MAYBEDEFAULT ); + } + + + void FontControlModel::getFastPropertyValue( Any& _rValue, sal_Int32 _nHandle ) const + { + switch( _nHandle ) + { + case PROPERTY_ID_TEXTCOLOR: + _rValue = m_aTextColor; + break; + + case PROPERTY_ID_FONTEMPHASISMARK: + _rValue <<= m_nFontEmphasis; + break; + + case PROPERTY_ID_FONTRELIEF: + _rValue <<= m_nFontRelief; + break; + + case PROPERTY_ID_TEXTLINECOLOR: + _rValue = m_aTextLineColor; + break; + + case PROPERTY_ID_FONT: + _rValue <<= m_aFont; + break; + + default: + _rValue = lcl_extractFontDescriptorAggregate( _nHandle, m_aFont ); + break; + } + } + + + bool FontControlModel::convertFastPropertyValue( Any& _rConvertedValue, Any& _rOldValue, + sal_Int32 _nHandle, const Any& _rValue ) + { + bool bModified = false; + switch( _nHandle ) + { + case PROPERTY_ID_TEXTCOLOR: + bModified = tryPropertyValue( _rConvertedValue, _rOldValue, _rValue, m_aTextColor, cppu::UnoType<sal_Int32>::get() ); + break; + + case PROPERTY_ID_TEXTLINECOLOR: + bModified = tryPropertyValue( _rConvertedValue, _rOldValue, _rValue, m_aTextLineColor, cppu::UnoType<sal_Int32>::get() ); + break; + + case PROPERTY_ID_FONTEMPHASISMARK: + bModified = tryPropertyValue( _rConvertedValue, _rOldValue, _rValue, m_nFontEmphasis ); + break; + + case PROPERTY_ID_FONTRELIEF: + bModified = tryPropertyValue( _rConvertedValue, _rOldValue, _rValue, m_nFontRelief ); + break; + + case PROPERTY_ID_FONT: + { + Any aWorkAroundGccLimitation = makeAny( m_aFont ); + bModified = tryPropertyValue( _rConvertedValue, _rOldValue, _rValue, aWorkAroundGccLimitation, cppu::UnoType<decltype(m_aFont)>::get() ); + } + break; + + case PROPERTY_ID_FONT_NAME: + bModified = tryPropertyValue( _rConvertedValue, _rOldValue, _rValue, m_aFont.Name ); + break; + + case PROPERTY_ID_FONT_STYLENAME: + bModified = tryPropertyValue( _rConvertedValue, _rOldValue, _rValue, m_aFont.StyleName ); + break; + + case PROPERTY_ID_FONT_FAMILY: + bModified = tryPropertyValue( _rConvertedValue, _rOldValue, _rValue, m_aFont.Family ); + break; + + case PROPERTY_ID_FONT_CHARSET: + bModified = tryPropertyValue( _rConvertedValue, _rOldValue, _rValue, m_aFont.CharSet ); + break; + + case PROPERTY_ID_FONT_CHARWIDTH: + bModified = tryPropertyValue( _rConvertedValue, _rOldValue, _rValue, m_aFont.CharacterWidth ); + break; + + case PROPERTY_ID_FONT_KERNING: + bModified = tryPropertyValue( _rConvertedValue, _rOldValue, _rValue, m_aFont.Kerning ); + break; + + case PROPERTY_ID_FONT_ORIENTATION: + bModified = tryPropertyValue( _rConvertedValue, _rOldValue, _rValue, m_aFont.Orientation ); + break; + + case PROPERTY_ID_FONT_PITCH: + bModified = tryPropertyValue( _rConvertedValue, _rOldValue, _rValue, m_aFont.Pitch ); + break; + + case PROPERTY_ID_FONT_TYPE: + bModified = tryPropertyValue( _rConvertedValue, _rOldValue, _rValue, m_aFont.Type ); + break; + + case PROPERTY_ID_FONT_WIDTH: + bModified = tryPropertyValue( _rConvertedValue, _rOldValue, _rValue, m_aFont.Width ); + break; + + case PROPERTY_ID_FONT_HEIGHT: + bModified = tryPropertyValue( _rConvertedValue, _rOldValue, _rValue, float( m_aFont.Height ) ); + break; + + case PROPERTY_ID_FONT_WEIGHT: + bModified = tryPropertyValue( _rConvertedValue, _rOldValue, _rValue, m_aFont.Weight ); + break; + + case PROPERTY_ID_FONT_SLANT: + bModified = tryPropertyValueEnum( _rConvertedValue, _rOldValue, _rValue, m_aFont.Slant ); + break; + + case PROPERTY_ID_FONT_UNDERLINE: + bModified = tryPropertyValue( _rConvertedValue, _rOldValue, _rValue, m_aFont.Underline ); + break; + + case PROPERTY_ID_FONT_STRIKEOUT: + bModified = tryPropertyValue( _rConvertedValue, _rOldValue, _rValue, m_aFont.Strikeout ); + break; + + case PROPERTY_ID_FONT_WORDLINEMODE: + bModified = tryPropertyValue( _rConvertedValue, _rOldValue, _rValue, m_aFont.WordLineMode ); + break; + + default: + OSL_FAIL( "FontControlModel::convertFastPropertyValue: no font aggregate!" ); + } + return bModified; + } + + /// @throws Exception + static void setFastPropertyValue_NoBroadcast_implimpl( + FontDescriptor & rFont, + sal_Int32 nHandle, const Any& rValue) + { + switch (nHandle) + { + case PROPERTY_ID_FONT_NAME: + rValue >>= rFont.Name; + break; + + case PROPERTY_ID_FONT_STYLENAME: + rValue >>= rFont.StyleName; + break; + + case PROPERTY_ID_FONT_FAMILY: + rValue >>= rFont.Family; + break; + + case PROPERTY_ID_FONT_CHARSET: + rValue >>= rFont.CharSet; + break; + + case PROPERTY_ID_FONT_CHARWIDTH: + rValue >>= rFont.CharacterWidth; + break; + + case PROPERTY_ID_FONT_KERNING: + rValue >>= rFont.Kerning; + break; + + case PROPERTY_ID_FONT_ORIENTATION: + rValue >>= rFont.Orientation; + break; + + case PROPERTY_ID_FONT_PITCH: + rValue >>= rFont.Pitch; + break; + + case PROPERTY_ID_FONT_TYPE: + rValue >>= rFont.Type; + break; + + case PROPERTY_ID_FONT_WIDTH: + rValue >>= rFont.Width; + break; + + case PROPERTY_ID_FONT_HEIGHT: + { + float nHeight = 0; + rValue >>= nHeight; + rFont.Height = static_cast<sal_Int16>(nHeight); + } + break; + + case PROPERTY_ID_FONT_WEIGHT: + rValue >>= rFont.Weight; + break; + + case PROPERTY_ID_FONT_SLANT: + rValue >>= rFont.Slant; + break; + + case PROPERTY_ID_FONT_UNDERLINE: + rValue >>= rFont.Underline; + break; + + case PROPERTY_ID_FONT_STRIKEOUT: + rValue >>= rFont.Strikeout; + break; + + case PROPERTY_ID_FONT_WORDLINEMODE: + { + bool bWordLineMode = false; + rValue >>= bWordLineMode; + rFont.WordLineMode = bWordLineMode; + } + break; + + default: + assert(false); // isFontAggregateProperty + } + } + + void FontControlModel::setFastPropertyValue_NoBroadcast_impl( + ::cppu::OPropertySetHelper & rBase, + void (::cppu::OPropertySetHelper::*pSet)(sal_Int32, Any const&), + sal_Int32 nHandle, const Any& rValue) + { + if (isFontAggregateProperty(nHandle)) + { + // need to fire an event for PROPERTY_ID_FONT too apparently, so: + FontDescriptor font(getFont()); + + // first set new value on backup copy + setFastPropertyValue_NoBroadcast_implimpl(font, nHandle, rValue); + + // then set that as the actual property - will eventually call + // this method recursively again... + (rBase.*pSet)(PROPERTY_ID_FONT, makeAny(font)); +#ifndef NDEBUG + // verify that the nHandle property has the new value + Any tmp; + getFastPropertyValue(tmp, nHandle); + assert(tmp == rValue || PROPERTY_ID_FONT_HEIGHT == nHandle /*rounded*/); +#endif + } + else + { + switch (nHandle) + { + case PROPERTY_ID_TEXTCOLOR: + m_aTextColor = rValue; + break; + + case PROPERTY_ID_TEXTLINECOLOR: + m_aTextLineColor = rValue; + break; + + case PROPERTY_ID_FONTEMPHASISMARK: + rValue >>= m_nFontEmphasis; + break; + + case PROPERTY_ID_FONTRELIEF: + rValue >>= m_nFontRelief; + break; + + case PROPERTY_ID_FONT: + rValue >>= m_aFont; + break; + + default: + SAL_WARN("forms.component", "invalid property: " << nHandle); + } + } + } + + + Any FontControlModel::getPropertyDefaultByHandle( sal_Int32 _nHandle ) const + { + Any aReturn; + // some defaults which are the same, not matter if we have toolkit-compatible + // defaults or not + bool bHandled = false; + switch( _nHandle ) + { + case PROPERTY_ID_TEXTCOLOR: + case PROPERTY_ID_TEXTLINECOLOR: + // void + bHandled = true; + break; + + case PROPERTY_ID_FONTEMPHASISMARK: + aReturn <<= css::awt::FontEmphasisMark::NONE; + bHandled = true; + break; + + case PROPERTY_ID_FONTRELIEF: + aReturn <<= css::awt::FontRelief::NONE; + bHandled = true; + break; + } + if ( bHandled ) + return aReturn; + + if ( m_bToolkitCompatibleDefaults ) + { + EmptyFontDescriptor aEmpty; + if ( PROPERTY_ID_FONT == _nHandle ) + return makeAny( FontDescriptor(aEmpty) ); + return lcl_extractFontDescriptorAggregate( _nHandle, aEmpty ); + } + + switch( _nHandle ) + { + case PROPERTY_ID_FONT: + aReturn <<= ::comphelper::getDefaultFont(); + break; + + case PROPERTY_ID_FONT_WORDLINEMODE: + aReturn <<= false; + break; + + case PROPERTY_ID_FONT_NAME: + case PROPERTY_ID_FONT_STYLENAME: + aReturn <<= OUString(); + break; + + case PROPERTY_ID_FONT_FAMILY: + case PROPERTY_ID_FONT_CHARSET: + case PROPERTY_ID_FONT_SLANT: + case PROPERTY_ID_FONT_UNDERLINE: + case PROPERTY_ID_FONT_STRIKEOUT: + aReturn <<= sal_Int16(1); + break; + + case PROPERTY_ID_FONT_KERNING: + aReturn <<= false; + break; + + case PROPERTY_ID_FONT_PITCH: + case PROPERTY_ID_FONT_TYPE: + case PROPERTY_ID_FONT_WIDTH: + aReturn <<= sal_Int16(0); + break; + + case PROPERTY_ID_FONT_HEIGHT: + case PROPERTY_ID_FONT_WEIGHT: + case PROPERTY_ID_FONT_CHARWIDTH: + case PROPERTY_ID_FONT_ORIENTATION: + aReturn <<= float(0); + break; + + default: + OSL_FAIL( "FontControlModel::getPropertyDefaultByHandle: invalid property!" ); + } + + return aReturn; + } + + +} // namespace frm + + +/* vim:set shiftwidth=4 softtabstop=4 expandtab: */ |