1 /* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
3 * This file is part of the LibreOffice project.
5 * This Source Code Form is subject to the terms of the Mozilla Public
6 * License, v. 2.0. If a copy of the MPL was not distributed with this
7 * file, You can obtain one at http://mozilla.org/MPL/2.0/.
9 * This file incorporates work covered by the following license notice:
11 * Licensed to the Apache Software Foundation (ASF) under one or more
12 * contributor license agreements. See the NOTICE file distributed
13 * with this work for additional information regarding copyright
14 * ownership. The ASF licenses this file to you under the Apache
15 * License, Version 2.0 (the "License"); you may not use this file
16 * except in compliance with the License. You may obtain a copy of
17 * the License at http://www.apache.org/licenses/LICENSE-2.0 .
20 #include <CharacterPropertyItemConverter.hxx>
21 #include "SchWhichPairs.hxx"
22 #include <ItemPropertyMap.hxx>
23 #include <RelativeSizeHelper.hxx>
24 #include <editeng/memberids.h>
25 #include <editeng/eeitem.hxx>
26 #include <editeng/udlnitem.hxx>
27 #include <editeng/fontitem.hxx>
28 #include <editeng/postitem.hxx>
29 #include <editeng/wghtitem.hxx>
30 #include <editeng/fhgtitem.hxx>
31 #include <o3tl/any.hxx>
32 #include <svl/stritem.hxx>
34 #include <com/sun/star/beans/XPropertySet.hpp>
35 #include <com/sun/star/chart2/XFormattedString.hpp>
37 #include <comphelper/diagnose_ex.hxx>
39 using namespace ::com::sun::star
;
41 namespace chart::wrapper
{
45 ItemPropertyMapType
& lcl_GetCharacterPropertyPropertyMap()
47 static ItemPropertyMapType aCharacterPropertyMap
{
48 {EE_CHAR_COLOR
, {"CharColor", 0}},
49 {EE_CHAR_LANGUAGE
, {"CharLocale", MID_LANG_LOCALE
}},
50 {EE_CHAR_LANGUAGE_CJK
, {"CharLocaleAsian", MID_LANG_LOCALE
}},
51 {EE_CHAR_LANGUAGE_CTL
, {"CharLocaleComplex", MID_LANG_LOCALE
}},
53 {EE_CHAR_STRIKEOUT
, {"CharStrikeout", MID_CROSS_OUT
}},
54 {EE_CHAR_WLM
, {"CharWordMode", 0}},
55 {EE_CHAR_SHADOW
, {"CharShadowed", 0}},
56 {EE_CHAR_RELIEF
, {"CharRelief", 0}},
57 {EE_CHAR_OUTLINE
, {"CharContoured", 0}},
58 {EE_CHAR_EMPHASISMARK
, {"CharEmphasis", 0}},
60 {EE_PARA_WRITINGDIR
, {"WritingMode", 0}},
62 {EE_PARA_ASIANCJKSPACING
, {"ParaIsCharacterDistance", 0}}};
64 return aCharacterPropertyMap
;
66 } // anonymous namespace
68 CharacterPropertyItemConverter::CharacterPropertyItemConverter(
69 const uno::Reference
< beans::XPropertySet
> & rPropertySet
,
70 SfxItemPool
& rItemPool
) :
71 ItemConverter( rPropertySet
, rItemPool
)
74 CharacterPropertyItemConverter::CharacterPropertyItemConverter(
75 const uno::Reference
< beans::XPropertySet
> & rPropertySet
,
76 SfxItemPool
& rItemPool
,
77 const awt::Size
* pRefSize
,
78 OUString aRefSizePropertyName
,
79 const uno::Reference
< beans::XPropertySet
> & rRefSizePropSet
) :
80 ItemConverter( rPropertySet
, rItemPool
),
81 m_aRefSizePropertyName(std::move( aRefSizePropertyName
)),
82 m_xRefSizePropSet( rRefSizePropSet
.is() ? rRefSizePropSet
: rPropertySet
)
85 m_pRefSize
= *pRefSize
;
88 CharacterPropertyItemConverter::~CharacterPropertyItemConverter()
91 const WhichRangesContainer
& CharacterPropertyItemConverter::GetWhichPairs() const
93 return nCharacterPropertyWhichPairs
;
96 bool CharacterPropertyItemConverter::GetItemProperty( tWhichIdType nWhichId
, tPropertyNameWithMemberId
& rOutProperty
) const
98 ItemPropertyMapType
& rMap( lcl_GetCharacterPropertyPropertyMap());
99 ItemPropertyMapType::const_iterator
aIt( rMap
.find( nWhichId
));
101 if( aIt
== rMap
.end())
104 rOutProperty
=(*aIt
).second
;
108 void CharacterPropertyItemConverter::FillSpecialItem(
109 sal_uInt16 nWhichId
, SfxItemSet
& rOutItemSet
) const
113 case EE_CHAR_FONTINFO
:
114 case EE_CHAR_FONTINFO_CJK
:
115 case EE_CHAR_FONTINFO_CTL
:
118 if( nWhichId
== EE_CHAR_FONTINFO_CJK
)
120 else if( nWhichId
== EE_CHAR_FONTINFO_CTL
)
121 aPostfix
= "Complex";
123 SvxFontItem
aItem( nWhichId
);
125 aItem
.PutValue( GetPropertySet()->getPropertyValue( "CharFontName" + aPostfix
),
126 MID_FONT_FAMILY_NAME
);
127 aItem
.PutValue( GetPropertySet()->getPropertyValue( "CharFontFamily" + aPostfix
),
129 aItem
.PutValue( GetPropertySet()->getPropertyValue( "CharFontStyleName" + aPostfix
),
130 MID_FONT_STYLE_NAME
);
131 aItem
.PutValue( GetPropertySet()->getPropertyValue( "CharFontCharSet" + aPostfix
),
133 aItem
.PutValue( GetPropertySet()->getPropertyValue( "CharFontPitch" + aPostfix
),
136 rOutItemSet
.Put( aItem
);
140 case EE_CHAR_UNDERLINE
:
142 SvxUnderlineItem
aItem(LINESTYLE_NONE
, EE_CHAR_UNDERLINE
);
143 bool bModified
= false;
145 uno::Any
aValue( GetPropertySet()->getPropertyValue( "CharUnderline" ));
146 if( aValue
.hasValue())
148 aItem
.PutValue( aValue
, MID_TL_STYLE
);
152 aValue
= GetPropertySet()->getPropertyValue( "CharUnderlineHasColor" );
153 if( aValue
.hasValue() && *o3tl::doAccess
<bool>(aValue
) )
155 aItem
.PutValue( aValue
, MID_TL_HASCOLOR
);
159 aValue
= GetPropertySet()->getPropertyValue( "CharUnderlineColor" );
160 if( aValue
.hasValue())
162 aItem
.PutValue( aValue
, MID_TL_COLOR
);
167 rOutItemSet
.Put( aItem
);
171 case EE_CHAR_OVERLINE
:
173 SvxOverlineItem
aItem( LINESTYLE_NONE
, EE_CHAR_OVERLINE
);
174 bool bModified
= false;
176 uno::Any
aValue( GetPropertySet()->getPropertyValue( "CharOverline" ) );
177 if ( aValue
.hasValue() )
179 aItem
.PutValue( aValue
, MID_TL_STYLE
);
183 aValue
= GetPropertySet()->getPropertyValue( "CharOverlineHasColor" );
184 if ( aValue
.hasValue() && *o3tl::doAccess
<bool>(aValue
) )
186 aItem
.PutValue( aValue
, MID_TL_HASCOLOR
);
190 aValue
= GetPropertySet()->getPropertyValue( "CharOverlineColor" );
191 if ( aValue
.hasValue() )
193 aItem
.PutValue( aValue
, MID_TL_COLOR
);
199 rOutItemSet
.Put( aItem
);
205 case EE_CHAR_ITALIC_CJK
:
206 case EE_CHAR_ITALIC_CTL
:
209 if( nWhichId
== EE_CHAR_ITALIC_CJK
)
211 else if( nWhichId
== EE_CHAR_ITALIC_CTL
)
212 aPostfix
= "Complex";
214 SvxPostureItem
aItem( ITALIC_NONE
, nWhichId
);
216 uno::Any
aValue( GetPropertySet()->getPropertyValue( "CharPosture" + aPostfix
));
217 if( aValue
.hasValue())
219 aItem
.PutValue( aValue
, MID_POSTURE
);
220 rOutItemSet
.Put( aItem
);
226 case EE_CHAR_WEIGHT_CJK
:
227 case EE_CHAR_WEIGHT_CTL
:
230 if( nWhichId
== EE_CHAR_WEIGHT_CJK
)
232 else if( nWhichId
== EE_CHAR_WEIGHT_CTL
)
233 aPostfix
= "Complex";
235 SvxWeightItem
aItem( WEIGHT_NORMAL
, nWhichId
);
237 uno::Any
aValue( GetPropertySet()->getPropertyValue( "CharWeight" + aPostfix
));
238 if( aValue
.hasValue())
240 aItem
.PutValue( aValue
, MID_WEIGHT
);
241 rOutItemSet
.Put( aItem
);
246 case EE_CHAR_FONTHEIGHT
:
247 case EE_CHAR_FONTHEIGHT_CJK
:
248 case EE_CHAR_FONTHEIGHT_CTL
:
251 if( nWhichId
== EE_CHAR_FONTHEIGHT_CJK
)
253 else if( nWhichId
== EE_CHAR_FONTHEIGHT_CTL
)
254 aPostfix
= "Complex";
256 SvxFontHeightItem
aItem( 240, 100, nWhichId
);
260 uno::Any
aValue( GetPropertySet()->getPropertyValue( "CharHeight" + aPostfix
));
262 if( aValue
>>= fHeight
)
266 awt::Size aOldRefSize
;
267 if( GetRefSizePropertySet()->getPropertyValue( m_aRefSizePropertyName
) >>= aOldRefSize
)
269 // calculate font height in view
270 fHeight
= static_cast< float >(
271 RelativeSizeHelper::calculate( fHeight
, aOldRefSize
, *m_pRefSize
));
276 aItem
.PutValue( aValue
, MID_FONTHEIGHT
);
277 rOutItemSet
.Put( aItem
);
280 catch( const uno::Exception
& )
282 DBG_UNHANDLED_EXCEPTION("chart2");
287 case SID_CHAR_DLG_PREVIEW_STRING
:
289 uno::Reference
< chart2::XFormattedString
> xFormattedString( GetPropertySet(), uno::UNO_QUERY
);
290 if( xFormattedString
.is() )
292 OUString aString
= xFormattedString
->getString();
293 rOutItemSet
.Put( SfxStringItem( nWhichId
, aString
) );
296 rOutItemSet
.Put( SfxStringItem( nWhichId
, OUString() ) );
300 case EE_PARA_FORBIDDENRULES
:
301 case EE_PARA_HANGINGPUNCTUATION
:
302 rOutItemSet
.DisableItem( nWhichId
);
307 bool CharacterPropertyItemConverter::ApplySpecialItem(
308 sal_uInt16 nWhichId
, const SfxItemSet
& rItemSet
)
310 bool bChanged
= false;
315 case EE_CHAR_FONTINFO
:
316 case EE_CHAR_FONTINFO_CJK
:
317 case EE_CHAR_FONTINFO_CTL
:
320 if( nWhichId
== EE_CHAR_FONTINFO_CJK
)
322 else if( nWhichId
== EE_CHAR_FONTINFO_CTL
)
323 aPostfix
= "Complex";
325 const SvxFontItem
& rItem
=
326 static_cast< const SvxFontItem
& >(
327 rItemSet
.Get( nWhichId
));
329 if( rItem
.QueryValue( aValue
, MID_FONT_FAMILY_NAME
))
331 if( aValue
!= GetPropertySet()->getPropertyValue( "CharFontName" + aPostfix
))
333 GetPropertySet()->setPropertyValue( "CharFontName" + aPostfix
, aValue
);
337 if( rItem
.QueryValue( aValue
, MID_FONT_FAMILY
))
339 if( aValue
!= GetPropertySet()->getPropertyValue( "CharFontFamily" + aPostfix
))
341 GetPropertySet()->setPropertyValue( "CharFontFamily" + aPostfix
, aValue
);
345 if( rItem
.QueryValue( aValue
, MID_FONT_STYLE_NAME
))
347 if( aValue
!= GetPropertySet()->getPropertyValue( "CharFontStyleName" + aPostfix
))
349 GetPropertySet()->setPropertyValue( "CharFontStyleName" + aPostfix
, aValue
);
353 if( rItem
.QueryValue( aValue
, MID_FONT_CHAR_SET
))
355 if( aValue
!= GetPropertySet()->getPropertyValue( "CharFontCharSet" + aPostfix
))
357 GetPropertySet()->setPropertyValue( "CharFontCharSet" + aPostfix
, aValue
);
361 if( rItem
.QueryValue( aValue
, MID_FONT_PITCH
))
363 if( aValue
!= GetPropertySet()->getPropertyValue( "CharFontPitch" + aPostfix
))
365 GetPropertySet()->setPropertyValue( "CharFontPitch" + aPostfix
, aValue
);
372 case EE_CHAR_UNDERLINE
:
374 const SvxUnderlineItem
& rItem
=
375 static_cast< const SvxUnderlineItem
& >(
376 rItemSet
.Get( nWhichId
));
378 if( rItem
.QueryValue( aValue
, MID_TL_STYLE
))
380 if( aValue
!= GetPropertySet()->getPropertyValue( "CharUnderline" ))
382 GetPropertySet()->setPropertyValue( "CharUnderline" , aValue
);
387 if( rItem
.QueryValue( aValue
, MID_TL_COLOR
))
389 if( aValue
!= GetPropertySet()->getPropertyValue( "CharUnderlineColor" ))
391 GetPropertySet()->setPropertyValue( "CharUnderlineColor" , aValue
);
396 if( rItem
.QueryValue( aValue
, MID_TL_HASCOLOR
))
398 if( aValue
!= GetPropertySet()->getPropertyValue( "CharUnderlineHasColor" ))
400 GetPropertySet()->setPropertyValue( "CharUnderlineHasColor" , aValue
);
407 case EE_CHAR_OVERLINE
:
409 const SvxOverlineItem
& rItem
= static_cast< const SvxOverlineItem
& >( rItemSet
.Get( nWhichId
) );
411 if ( rItem
.QueryValue( aValue
, MID_TL_STYLE
) )
413 if ( aValue
!= GetPropertySet()->getPropertyValue( "CharOverline" ) )
415 GetPropertySet()->setPropertyValue( "CharOverline" , aValue
);
420 if ( rItem
.QueryValue( aValue
, MID_TL_COLOR
) )
422 if ( aValue
!= GetPropertySet()->getPropertyValue( "CharOverlineColor" ) )
424 GetPropertySet()->setPropertyValue( "CharOverlineColor" , aValue
);
429 if ( rItem
.QueryValue( aValue
, MID_TL_HASCOLOR
) )
431 if ( aValue
!= GetPropertySet()->getPropertyValue( "CharOverlineHasColor" ) )
433 GetPropertySet()->setPropertyValue( "CharOverlineHasColor" , aValue
);
441 case EE_CHAR_ITALIC_CJK
:
442 case EE_CHAR_ITALIC_CTL
:
445 if( nWhichId
== EE_CHAR_ITALIC_CJK
)
447 else if( nWhichId
== EE_CHAR_ITALIC_CTL
)
448 aPostfix
= "Complex";
450 const SvxPostureItem
& rItem
=
451 static_cast< const SvxPostureItem
& >(
452 rItemSet
.Get( nWhichId
));
454 if( rItem
.QueryValue( aValue
, MID_POSTURE
))
456 if( aValue
!= GetPropertySet()->getPropertyValue( "CharPosture" + aPostfix
))
458 GetPropertySet()->setPropertyValue( "CharPosture" + aPostfix
, aValue
);
466 case EE_CHAR_WEIGHT_CJK
:
467 case EE_CHAR_WEIGHT_CTL
:
470 if( nWhichId
== EE_CHAR_WEIGHT_CJK
)
472 else if( nWhichId
== EE_CHAR_WEIGHT_CTL
)
473 aPostfix
= "Complex";
475 const SvxWeightItem
& rItem
=
476 static_cast< const SvxWeightItem
& >(
477 rItemSet
.Get( nWhichId
));
479 if( rItem
.QueryValue( aValue
, MID_WEIGHT
))
481 if( aValue
!= GetPropertySet()->getPropertyValue( "CharWeight" + aPostfix
))
483 GetPropertySet()->setPropertyValue( "CharWeight" + aPostfix
, aValue
);
490 case EE_CHAR_FONTHEIGHT
:
491 case EE_CHAR_FONTHEIGHT_CJK
:
492 case EE_CHAR_FONTHEIGHT_CTL
:
495 if( nWhichId
== EE_CHAR_FONTHEIGHT_CJK
)
497 else if( nWhichId
== EE_CHAR_FONTHEIGHT_CTL
)
498 aPostfix
= "Complex";
500 const SvxFontHeightItem
& rItem
=
501 static_cast< const SvxFontHeightItem
& >(
502 rItemSet
.Get( nWhichId
));
506 if( rItem
.QueryValue( aValue
, MID_FONTHEIGHT
) )
508 bool bSetValue
= false;
509 if( aValue
!= GetPropertySet()->getPropertyValue( "CharHeight" + aPostfix
))
515 awt::Size aNewRefSize
= *m_pRefSize
;
516 awt::Size aOldRefSize
;
517 if( GetRefSizePropertySet()->getPropertyValue( m_aRefSizePropertyName
) >>= aOldRefSize
)
519 if( aNewRefSize
.Width
!= aOldRefSize
.Width
520 || aNewRefSize
.Height
!= aOldRefSize
.Height
)
527 // set new reference size only if there was a reference size before (auto-scaling on)
528 if (m_pRefSize
&& GetRefSizePropertySet()->getPropertyValue( m_aRefSizePropertyName
).hasValue())
530 GetRefSizePropertySet()->setPropertyValue(
531 m_aRefSizePropertyName
, uno::Any(*m_pRefSize
));
534 GetPropertySet()->setPropertyValue( "CharHeight" + aPostfix
, aValue
);
539 catch( const uno::Exception
& )
541 DBG_UNHANDLED_EXCEPTION("chart2");
550 const uno::Reference
<beans::XPropertySet
>& CharacterPropertyItemConverter::GetRefSizePropertySet() const
552 return m_xRefSizePropSet
;
557 /* vim:set shiftwidth=4 softtabstop=4 expandtab: */