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 <fontcfg.hxx>
21 #include <i18nlangtag/mslangid.hxx>
22 #include <osl/diagnose.h>
23 #include <tools/UnitConversion.hxx>
24 #include <vcl/outdev.hxx>
25 #include <unotools/configmgr.hxx>
26 #include <unotools/lingucfg.hxx>
27 #include <com/sun/star/uno/Sequence.hxx>
28 #include <com/sun/star/i18n/ScriptType.hpp>
31 using namespace com::sun::star::uno
;
33 static LanguageType
lcl_LanguageOfType(sal_Int16 nType
, LanguageType eWestern
, LanguageType eCJK
, LanguageType eCTL
)
35 return nType
< FONT_STANDARD_CJK
37 : nType
>= FONT_STANDARD_CTL
? eCTL
: eCJK
;
40 Sequence
<OUString
> const & SwStdFontConfig::GetPropertyNames()
42 static Sequence
<OUString
> aNames
{
43 "DefaultFont/Standard", // 0
44 "DefaultFont/Heading", // 1
45 "DefaultFont/List", // 2
46 "DefaultFont/Caption", // 3
47 "DefaultFont/Index", // 4
48 "DefaultFontCJK/Standard", // 5
49 "DefaultFontCJK/Heading", // 6
50 "DefaultFontCJK/List", // 7
51 "DefaultFontCJK/Caption", // 8
52 "DefaultFontCJK/Index", // 9
53 "DefaultFontCTL/Standard", // 10
54 "DefaultFontCTL/Heading", // 11
55 "DefaultFontCTL/List", // 12
56 "DefaultFontCTL/Caption", // 13
57 "DefaultFontCTL/Index", // 14
58 "DefaultFont/StandardHeight", // 15
59 "DefaultFont/HeadingHeight", // 16
60 "DefaultFont/ListHeight", // 17
61 "DefaultFont/CaptionHeight", // 18
62 "DefaultFont/IndexHeight", // 19
63 "DefaultFontCJK/StandardHeight", // 20
64 "DefaultFontCJK/HeadingHeight", // 21
65 "DefaultFontCJK/ListHeight", // 22
66 "DefaultFontCJK/CaptionHeight", // 23
67 "DefaultFontCJK/IndexHeight", // 24
68 "DefaultFontCTL/StandardHeight", // 25
69 "DefaultFontCTL/HeadingHeight", // 26
70 "DefaultFontCTL/ListHeight", // 27
71 "DefaultFontCTL/CaptionHeight", // 28
72 "DefaultFontCTL/IndexHeight" // 29
77 SwStdFontConfig::SwStdFontConfig() :
78 utl::ConfigItem("Office.Writer")
80 SvtLinguOptions aLinguOpt
;
82 if (!utl::ConfigManager::IsFuzzing())
83 SvtLinguConfig().GetOptions( aLinguOpt
);
85 LanguageType eWestern
= MsLangId::resolveSystemLanguageByScriptType(aLinguOpt
.nDefaultLanguage
, css::i18n::ScriptType::LATIN
),
86 eCJK
= MsLangId::resolveSystemLanguageByScriptType(aLinguOpt
.nDefaultLanguage_CJK
, css::i18n::ScriptType::ASIAN
),
87 eCTL
= MsLangId::resolveSystemLanguageByScriptType(aLinguOpt
.nDefaultLanguage_CTL
, css::i18n::ScriptType::COMPLEX
);
89 for(sal_Int16 i
= 0; i
< DEF_FONT_COUNT
; i
++)
91 m_sDefaultFonts
[i
] = GetDefaultFor(i
,
92 lcl_LanguageOfType(i
, eWestern
, eCJK
, eCTL
));
93 m_nDefaultFontHeight
[i
] = -1;
96 Sequence
<OUString
> aNames
= GetPropertyNames();
97 Sequence
<Any
> aValues
= GetProperties(aNames
);
98 const Any
* pValues
= aValues
.getConstArray();
99 OSL_ENSURE(aValues
.getLength() == aNames
.getLength(), "GetProperties failed");
100 if(aValues
.getLength() != aNames
.getLength())
103 for(int nProp
= 0; nProp
< aNames
.getLength(); nProp
++)
105 if(pValues
[nProp
].hasValue())
107 if( nProp
< DEF_FONT_COUNT
)
110 pValues
[nProp
] >>= sVal
;
111 m_sDefaultFonts
[nProp
] = sVal
;
115 pValues
[nProp
] >>= m_nDefaultFontHeight
[nProp
- DEF_FONT_COUNT
];
116 m_nDefaultFontHeight
[nProp
- DEF_FONT_COUNT
] = o3tl::toTwips(m_nDefaultFontHeight
[nProp
- DEF_FONT_COUNT
], o3tl::Length::mm100
);
122 void SwStdFontConfig::ImplCommit()
124 Sequence
<OUString
> aNames
= GetPropertyNames();
125 Sequence
<Any
> aValues(aNames
.getLength());
126 Any
* pValues
= aValues
.getArray();
127 SvtLinguOptions aLinguOpt
;
129 SvtLinguConfig().GetOptions( aLinguOpt
);
131 LanguageType eWestern
= MsLangId::resolveSystemLanguageByScriptType(aLinguOpt
.nDefaultLanguage
, css::i18n::ScriptType::LATIN
),
132 eCJK
= MsLangId::resolveSystemLanguageByScriptType(aLinguOpt
.nDefaultLanguage_CJK
, css::i18n::ScriptType::ASIAN
),
133 eCTL
= MsLangId::resolveSystemLanguageByScriptType(aLinguOpt
.nDefaultLanguage_CTL
, css::i18n::ScriptType::COMPLEX
);
135 for(sal_uInt16 nProp
= 0;
136 nProp
< sal::static_int_cast
< sal_uInt16
, sal_Int32
>( aNames
.getLength() );
139 if( nProp
< DEF_FONT_COUNT
)
141 if(GetDefaultFor(nProp
, lcl_LanguageOfType(nProp
, eWestern
, eCJK
, eCTL
)) != m_sDefaultFonts
[nProp
])
142 pValues
[nProp
] <<= m_sDefaultFonts
[nProp
];
146 if(m_nDefaultFontHeight
[nProp
- DEF_FONT_COUNT
] > 0)
147 pValues
[nProp
] <<= static_cast<sal_Int32
>(convertTwipToMm100(m_nDefaultFontHeight
[nProp
- DEF_FONT_COUNT
]));
150 PutProperties(aNames
, aValues
);
153 SwStdFontConfig::~SwStdFontConfig()
157 bool SwStdFontConfig::IsFontDefault(sal_uInt16 nFontType
) const
160 SvtLinguOptions aLinguOpt
;
162 if (!utl::ConfigManager::IsFuzzing())
163 SvtLinguConfig().GetOptions(aLinguOpt
);
165 LanguageType eWestern
= MsLangId::resolveSystemLanguageByScriptType(aLinguOpt
.nDefaultLanguage
, css::i18n::ScriptType::LATIN
),
166 eCJK
= MsLangId::resolveSystemLanguageByScriptType(aLinguOpt
.nDefaultLanguage_CJK
, css::i18n::ScriptType::ASIAN
),
167 eCTL
= MsLangId::resolveSystemLanguageByScriptType(aLinguOpt
.nDefaultLanguage_CTL
, css::i18n::ScriptType::COMPLEX
);
169 OUString
sDefFont(GetDefaultFor(FONT_STANDARD
, eWestern
));
170 OUString
sDefFontCJK(GetDefaultFor(FONT_STANDARD_CJK
, eCJK
));
171 OUString
sDefFontCTL(GetDefaultFor(FONT_STANDARD_CTL
, eCTL
));
172 LanguageType eLang
= lcl_LanguageOfType(nFontType
, eWestern
, eCJK
, eCTL
);
176 bSame
= m_sDefaultFonts
[nFontType
] == sDefFont
;
178 case FONT_STANDARD_CJK
:
179 bSame
= m_sDefaultFonts
[nFontType
] == sDefFontCJK
;
181 case FONT_STANDARD_CTL
:
182 bSame
= m_sDefaultFonts
[nFontType
] == sDefFontCTL
;
185 case FONT_OUTLINE_CJK
:
186 case FONT_OUTLINE_CTL
:
187 bSame
= m_sDefaultFonts
[nFontType
] ==
188 GetDefaultFor(nFontType
, eLang
);
193 bSame
= m_sDefaultFonts
[nFontType
] == sDefFont
&&
194 m_sDefaultFonts
[FONT_STANDARD
] == sDefFont
;
197 case FONT_CAPTION_CJK
:
198 case FONT_INDEX_CJK
:
200 bool b1
= m_sDefaultFonts
[FONT_STANDARD_CJK
] == sDefFontCJK
;
201 bSame
= b1
&& m_sDefaultFonts
[nFontType
] == sDefFontCJK
;
205 case FONT_CAPTION_CTL
:
206 case FONT_INDEX_CTL
:
208 bool b1
= m_sDefaultFonts
[FONT_STANDARD_CJK
] == sDefFontCTL
;
209 bSame
= b1
&& m_sDefaultFonts
[nFontType
] == sDefFontCTL
;
216 OUString
SwStdFontConfig::GetDefaultFor(sal_uInt16 nFontType
, LanguageType eLang
)
218 DefaultFontType nFontId
;
222 nFontId
= DefaultFontType::LATIN_HEADING
;
224 case FONT_OUTLINE_CJK
:
225 nFontId
= DefaultFontType::CJK_HEADING
;
227 case FONT_OUTLINE_CTL
:
228 nFontId
= DefaultFontType::CTL_HEADING
;
230 case FONT_STANDARD_CJK
:
232 case FONT_CAPTION_CJK
:
233 case FONT_INDEX_CJK
:
234 nFontId
= DefaultFontType::CJK_TEXT
;
236 case FONT_STANDARD_CTL
:
238 case FONT_CAPTION_CTL
:
239 case FONT_INDEX_CTL
:
240 nFontId
= DefaultFontType::CTL_TEXT
;
243 nFontId
= DefaultFontType::LATIN_TEXT
;
245 vcl::Font aFont
= OutputDevice::GetDefaultFont(nFontId
, eLang
, GetDefaultFontFlags::OnlyOne
);
246 return aFont
.GetFamilyName();
249 sal_Int32
SwStdFontConfig::GetDefaultHeightFor(sal_uInt16 nFontType
, LanguageType eLang
)
251 sal_Int32 nRet
= FONTSIZE_DEFAULT
;
255 case FONT_OUTLINE_CJK
:
256 case FONT_OUTLINE_CTL
:
257 nRet
= FONTSIZE_OUTLINE
;
259 case FONT_STANDARD_CJK
:
260 nRet
= FONTSIZE_CJK_DEFAULT
;
263 if( eLang
== LANGUAGE_THAI
&& nFontType
>= FONT_STANDARD_CTL
)
270 void SwStdFontConfig::ChangeInt( sal_uInt16 nFontType
, sal_Int32 nHeight
)
272 OSL_ENSURE( nFontType
< DEF_FONT_COUNT
, "invalid index in SwStdFontConfig::ChangeInt()");
273 if( nFontType
>= DEF_FONT_COUNT
|| m_nDefaultFontHeight
[nFontType
] == nHeight
)
276 SvtLinguOptions aLinguOpt
;
277 if (!utl::ConfigManager::IsFuzzing())
278 SvtLinguConfig().GetOptions( aLinguOpt
);
280 LanguageType eWestern
= MsLangId::resolveSystemLanguageByScriptType(aLinguOpt
.nDefaultLanguage
, css::i18n::ScriptType::LATIN
),
281 eCJK
= MsLangId::resolveSystemLanguageByScriptType(aLinguOpt
.nDefaultLanguage_CJK
, css::i18n::ScriptType::ASIAN
),
282 eCTL
= MsLangId::resolveSystemLanguageByScriptType(aLinguOpt
.nDefaultLanguage_CTL
, css::i18n::ScriptType::COMPLEX
);
284 // #i92090# default height value sets back to -1
285 const sal_Int32 nDefaultHeight
= GetDefaultHeightFor(nFontType
, lcl_LanguageOfType(nFontType
, eWestern
, eCJK
, eCTL
));
286 const bool bIsDefaultHeight
= nHeight
== nDefaultHeight
;
287 if( bIsDefaultHeight
&& m_nDefaultFontHeight
[nFontType
] > 0 )
290 m_nDefaultFontHeight
[nFontType
] = -1;
292 else if( !bIsDefaultHeight
&& nHeight
!= m_nDefaultFontHeight
[nFontType
] )
295 m_nDefaultFontHeight
[nFontType
] = nHeight
;
299 sal_Int32
SwStdFontConfig::GetFontHeight( sal_uInt8 nFont
, sal_uInt8 nScriptType
, LanguageType eLang
)
301 OSL_ENSURE(nFont
+ FONT_PER_GROUP
* nScriptType
< DEF_FONT_COUNT
, "wrong index in SwStdFontConfig::GetFontHeight()");
302 sal_Int32 nRet
= m_nDefaultFontHeight
[nFont
+ FONT_PER_GROUP
* nScriptType
];
304 return GetDefaultHeightFor(nFont
+ FONT_PER_GROUP
* nScriptType
, eLang
);
308 void SwStdFontConfig::Notify( const css::uno::Sequence
< OUString
>& ) {}
310 /* vim:set shiftwidth=4 softtabstop=4 expandtab: */