Version 7.6.3.2-android, tag libreoffice-7.6.3.2-android
[LibreOffice.git] / sw / source / uibase / config / fontcfg.cxx
blobbd57d81e97924172ff36ff0decabf56a1a58df01
1 /* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
2 /*
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>
30 using namespace utl;
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
36 ? eWestern
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
74 return aNames;
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())
101 return;
103 for(int nProp = 0; nProp < aNames.getLength(); nProp++)
105 if(pValues[nProp].hasValue())
107 if( nProp < DEF_FONT_COUNT)
109 OUString sVal;
110 pValues[nProp] >>= sVal;
111 m_sDefaultFonts[nProp] = sVal;
113 else
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() );
137 nProp++)
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];
144 else
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
159 bool bSame = false;
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);
173 switch( nFontType )
175 case FONT_STANDARD:
176 bSame = m_sDefaultFonts[nFontType] == sDefFont;
177 break;
178 case FONT_STANDARD_CJK:
179 bSame = m_sDefaultFonts[nFontType] == sDefFontCJK;
180 break;
181 case FONT_STANDARD_CTL:
182 bSame = m_sDefaultFonts[nFontType] == sDefFontCTL;
183 break;
184 case FONT_OUTLINE :
185 case FONT_OUTLINE_CJK :
186 case FONT_OUTLINE_CTL :
187 bSame = m_sDefaultFonts[nFontType] ==
188 GetDefaultFor(nFontType, eLang);
189 break;
190 case FONT_LIST :
191 case FONT_CAPTION :
192 case FONT_INDEX :
193 bSame = m_sDefaultFonts[nFontType] == sDefFont &&
194 m_sDefaultFonts[FONT_STANDARD] == sDefFont;
195 break;
196 case FONT_LIST_CJK :
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;
203 break;
204 case FONT_LIST_CTL :
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;
211 break;
213 return bSame;
216 OUString SwStdFontConfig::GetDefaultFor(sal_uInt16 nFontType, LanguageType eLang)
218 DefaultFontType nFontId;
219 switch( nFontType )
221 case FONT_OUTLINE :
222 nFontId = DefaultFontType::LATIN_HEADING;
223 break;
224 case FONT_OUTLINE_CJK :
225 nFontId = DefaultFontType::CJK_HEADING;
226 break;
227 case FONT_OUTLINE_CTL :
228 nFontId = DefaultFontType::CTL_HEADING;
229 break;
230 case FONT_STANDARD_CJK:
231 case FONT_LIST_CJK :
232 case FONT_CAPTION_CJK :
233 case FONT_INDEX_CJK :
234 nFontId = DefaultFontType::CJK_TEXT;
235 break;
236 case FONT_STANDARD_CTL:
237 case FONT_LIST_CTL :
238 case FONT_CAPTION_CTL :
239 case FONT_INDEX_CTL :
240 nFontId = DefaultFontType::CTL_TEXT;
241 break;
242 default:
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;
252 switch( nFontType )
254 case FONT_OUTLINE:
255 case FONT_OUTLINE_CJK:
256 case FONT_OUTLINE_CTL:
257 nRet = FONTSIZE_OUTLINE;
258 break;
259 case FONT_STANDARD_CJK:
260 nRet = FONTSIZE_CJK_DEFAULT;
261 break;
263 if( eLang == LANGUAGE_THAI && nFontType >= FONT_STANDARD_CTL )
265 nRet = nRet * 4 / 3;
267 return nRet;
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)
274 return;
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 )
289 SetModified();
290 m_nDefaultFontHeight[nFontType] = -1;
292 else if( !bIsDefaultHeight && nHeight != m_nDefaultFontHeight[nFontType] )
294 SetModified();
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];
303 if(nRet <= 0)
304 return GetDefaultHeightFor(nFont + FONT_PER_GROUP * nScriptType, eLang);
305 return nRet;
308 void SwStdFontConfig::Notify( const css::uno::Sequence< OUString >& ) {}
310 /* vim:set shiftwidth=4 softtabstop=4 expandtab: */