1 /* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
2 /*
3 * This file is part of the LibreOffice project.
4 *
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/.
8 *
9 * This file incorporates work covered by the following license notice:
10 *
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 .
18 */
19
20 #include <sal/config.h>
21
22 #include <o3tl/any.hxx>
23 #include <osl/thread.h>
24 #include <svtools/htmlcfg.hxx>
25 #include <svtools/parhtml.hxx>
26 #include <unotools/syslocale.hxx>
27 #include <tools/debug.hxx>
28 #include <rtl/instance.hxx>
29 #include <o3tl/typed_flags_set.hxx>
30 #include <com/sun/star/uno/Sequence.hxx>
31
32 namespace {
33
34 enum class HtmlCfgFlags {
35 NONE = 0x000,
36 UnknownTags = 0x001,
37 StarBasic = 0x008,
38 LocalGrf = 0x010,
39 PrintLayoutExtension = 0x020,
40 IgnoreFontFamily = 0x040,
41 IsBasicWarning = 0x080,
42 NumbersEnglishUS = 0x100,
43 };
44
45 }
46
47 namespace o3tl {
48 template<> struct typed_flags<HtmlCfgFlags> : is_typed_flags<HtmlCfgFlags, 0x1f9> {};
49 }
50
51 using namespace utl;
52 using namespace com::sun::star::uno;
53
54
55 struct HtmlOptions_Impl
56 {
57 HtmlCfgFlags nFlags;
58 sal_Int32 nExportMode;
59 sal_Int32 aFontSizeArr[HTML_FONT_COUNT];
60 sal_Int32 eEncoding;
61 bool bIsEncodingDefault;
62
HtmlOptions_ImplHtmlOptions_Impl63 HtmlOptions_Impl() :
64 nFlags(HtmlCfgFlags::LocalGrf|HtmlCfgFlags::IsBasicWarning),
65 nExportMode(HTML_CFG_NS40),
66 eEncoding( osl_getThreadTextEncoding() ),
67 bIsEncodingDefault(true)
68 {
69 aFontSizeArr[0] = HTMLFONTSZ1_DFLT;
70 aFontSizeArr[1] = HTMLFONTSZ2_DFLT;
71 aFontSizeArr[2] = HTMLFONTSZ3_DFLT;
72 aFontSizeArr[3] = HTMLFONTSZ4_DFLT;
73 aFontSizeArr[4] = HTMLFONTSZ5_DFLT;
74 aFontSizeArr[5] = HTMLFONTSZ6_DFLT;
75 aFontSizeArr[6] = HTMLFONTSZ7_DFLT;
76 }
77 };
78
GetPropertyNames()79 const Sequence<OUString>& SvxHtmlOptions::GetPropertyNames()
80 {
81 static Sequence<OUString> const aNames
82 {
83 "Import/UnknownTag", // 0
84 "Import/FontSetting", // 1
85 "Import/FontSize/Size_1", // 2
86 "Import/FontSize/Size_2", // 3
87 "Import/FontSize/Size_3", // 4
88 "Import/FontSize/Size_4", // 5
89 "Import/FontSize/Size_5", // 6
90 "Import/FontSize/Size_6", // 7
91 "Import/FontSize/Size_7", // 8
92 "Export/Browser", // 9
93 "Export/Basic", // 0
94 "Export/PrintLayout", // 11
95 "Export/LocalGraphic", // 12
96 "Export/Warning", // 13
97 "Export/Encoding", // 14
98 "Import/NumbersEnglishUS" // 15
99 };
100 return aNames;
101 }
102
SvxHtmlOptions()103 SvxHtmlOptions::SvxHtmlOptions() :
104 ConfigItem("Office.Common/Filter/HTML"),
105 pImpl( new HtmlOptions_Impl )
106 {
107 Load( GetPropertyNames() );
108 }
109
110
~SvxHtmlOptions()111 SvxHtmlOptions::~SvxHtmlOptions()
112 {
113 }
114
Load(const Sequence<OUString> & aNames)115 void SvxHtmlOptions::Load( const Sequence< OUString >& aNames )
116 {
117 Sequence<Any> aValues = GetProperties(aNames);
118 const Any* pValues = aValues.getConstArray();
119 DBG_ASSERT(aValues.getLength() == aNames.getLength(), "GetProperties failed");
120 if(aValues.getLength() != aNames.getLength())
121 return;
122
123 pImpl->nFlags = HtmlCfgFlags::NONE;
124 for(int nProp = 0; nProp < aNames.getLength(); nProp++)
125 {
126 if(pValues[nProp].hasValue())
127 {
128 switch(nProp)
129 {
130 case 0:
131 if(*o3tl::doAccess<bool>(pValues[nProp]))
132 pImpl->nFlags |= HtmlCfgFlags::UnknownTags;
133 break;//"Import/UnknownTag",
134 case 1:
135 if(*o3tl::doAccess<bool>(pValues[nProp]))
136 pImpl->nFlags |= HtmlCfgFlags::IgnoreFontFamily;
137 break;//"Import/FontSetting",
138 case 2: pValues[nProp] >>= pImpl->aFontSizeArr[0]; break;//"Import/FontSize/Size_1",
139 case 3: pValues[nProp] >>= pImpl->aFontSizeArr[1]; break;//"Import/FontSize/Size_2",
140 case 4: pValues[nProp] >>= pImpl->aFontSizeArr[2]; break;//"Import/FontSize/Size_3",
141 case 5: pValues[nProp] >>= pImpl->aFontSizeArr[3]; break;//"Import/FontSize/Size_4",
142 case 6: pValues[nProp] >>= pImpl->aFontSizeArr[4]; break;//"Import/FontSize/Size_5",
143 case 7: pValues[nProp] >>= pImpl->aFontSizeArr[5]; break;//"Import/FontSize/Size_6",
144 case 8: pValues[nProp] >>= pImpl->aFontSizeArr[6]; break;//"Import/FontSize/Size_7",
145 case 9://"Export/Browser",
146 {
147 sal_Int32 nExpMode = 0;
148 pValues[nProp] >>= nExpMode;
149 switch( nExpMode )
150 {
151 case 1: nExpMode = HTML_CFG_MSIE; break;
152 case 3: nExpMode = HTML_CFG_WRITER; break;
153 case 4: nExpMode = HTML_CFG_NS40; break;
154 default: nExpMode = HTML_CFG_NS40; break;
155 }
156
157 pImpl->nExportMode = nExpMode;
158 }
159 break;
160 case 10:
161 if(*o3tl::doAccess<bool>(pValues[nProp]))
162 pImpl->nFlags |= HtmlCfgFlags::StarBasic;
163 break;//"Export/Basic",
164 case 11:
165 if(*o3tl::doAccess<bool>(pValues[nProp]))
166 pImpl->nFlags |= HtmlCfgFlags::PrintLayoutExtension;
167 break;//"Export/PrintLayout",
168 case 12:
169 if(*o3tl::doAccess<bool>(pValues[nProp]))
170 pImpl->nFlags |= HtmlCfgFlags::LocalGrf;
171 break;//"Export/LocalGraphic",
172 case 13:
173 if(*o3tl::doAccess<bool>(pValues[nProp]))
174 pImpl->nFlags |= HtmlCfgFlags::IsBasicWarning;
175 break;//"Export/Warning"
176
177 case 14: pValues[nProp] >>= pImpl->eEncoding;
178 pImpl->bIsEncodingDefault = false;
179 break;//"Export/Encoding"
180
181 case 15:
182 if(*o3tl::doAccess<bool>(pValues[nProp]))
183 pImpl->nFlags |= HtmlCfgFlags::NumbersEnglishUS;
184 break;//"Import/NumbersEnglishUS"
185 }
186 }
187 }
188 }
189
190
ImplCommit()191 void SvxHtmlOptions::ImplCommit()
192 {
193 const Sequence<OUString>& aNames = GetPropertyNames();
194
195 Sequence<Any> aValues(aNames.getLength());
196 Any* pValues = aValues.getArray();
197
198 for(int nProp = 0; nProp < aNames.getLength(); nProp++)
199 {
200 bool bSet = false;
201 switch(nProp)
202 {
203 case 0: bSet = bool(pImpl->nFlags & HtmlCfgFlags::UnknownTags);break;//"Import/UnknownTag",
204 case 1: bSet = bool(pImpl->nFlags & HtmlCfgFlags::IgnoreFontFamily);break;//"Import/FontSetting",
205 case 2: pValues[nProp] <<= pImpl->aFontSizeArr[0];break;//"Import/FontSize/Size_1",
206 case 3: pValues[nProp] <<= pImpl->aFontSizeArr[1];break;//"Import/FontSize/Size_2",
207 case 4: pValues[nProp] <<= pImpl->aFontSizeArr[2];break;//"Import/FontSize/Size_3",
208 case 5: pValues[nProp] <<= pImpl->aFontSizeArr[3];break;//"Import/FontSize/Size_4",
209 case 6: pValues[nProp] <<= pImpl->aFontSizeArr[4];break;//"Import/FontSize/Size_5",
210 case 7: pValues[nProp] <<= pImpl->aFontSizeArr[5];break;//"Import/FontSize/Size_6",
211 case 8: pValues[nProp] <<= pImpl->aFontSizeArr[6];break;//"Import/FontSize/Size_7",
212 case 9: //"Export/Browser",
213 {
214 sal_Int32 nExpMode = pImpl->nExportMode;
215
216 switch( nExpMode )
217 {
218 case HTML_CFG_MSIE: nExpMode = 1; break;
219 case HTML_CFG_WRITER: nExpMode = 3; break;
220 case HTML_CFG_NS40: nExpMode = 4; break;
221 default: nExpMode = 4; break; // NS40
222 }
223
224 pValues[nProp] <<= nExpMode;
225 break;
226 }
227 case 10: bSet = bool(pImpl->nFlags & HtmlCfgFlags::StarBasic);break;//"Export/Basic",
228 case 11: bSet = bool(pImpl->nFlags & HtmlCfgFlags::PrintLayoutExtension);break;//"Export/PrintLayout",
229 case 12: bSet = bool(pImpl->nFlags & HtmlCfgFlags::LocalGrf);break;//"Export/LocalGraphic",
230 case 13: bSet = bool(pImpl->nFlags & HtmlCfgFlags::IsBasicWarning);break;//"Export/Warning"
231 case 14:
232 if(!pImpl->bIsEncodingDefault)
233 pValues[nProp] <<= pImpl->eEncoding;
234 break;//"Export/Encoding",
235 case 15: bSet = bool(pImpl->nFlags & HtmlCfgFlags::NumbersEnglishUS);break;//"Import/NumbersEnglishUS"
236 }
237 if(nProp < 2 || ( nProp > 9 && nProp < 14 ) || nProp == 15)
238 pValues[nProp] <<= bSet;
239 }
240 PutProperties(aNames, aValues);
241 }
242
Notify(const css::uno::Sequence<OUString> &)243 void SvxHtmlOptions::Notify( const css::uno::Sequence< OUString >& )
244 {
245 Load( GetPropertyNames() );
246 }
247
248
GetFontSize(sal_uInt16 nPos) const249 sal_uInt16 SvxHtmlOptions::GetFontSize(sal_uInt16 nPos) const
250 {
251 if(nPos < HTML_FONT_COUNT)
252 return static_cast<sal_uInt16>(pImpl->aFontSizeArr[nPos]);
253 return 0;
254 }
255
SetFontSize(sal_uInt16 nPos,sal_uInt16 nSize)256 void SvxHtmlOptions::SetFontSize(sal_uInt16 nPos, sal_uInt16 nSize)
257 {
258 if(nPos < HTML_FONT_COUNT)
259 {
260 pImpl->aFontSizeArr[nPos] = nSize;
261 SetModified();
262 }
263 }
264
265
IsImportUnknown() const266 bool SvxHtmlOptions::IsImportUnknown() const
267 {
268 return bool(pImpl->nFlags & HtmlCfgFlags::UnknownTags) ;
269 }
270
271
SetImportUnknown(bool bSet)272 void SvxHtmlOptions::SetImportUnknown(bool bSet)
273 {
274 if(bSet)
275 pImpl->nFlags |= HtmlCfgFlags::UnknownTags;
276 else
277 pImpl->nFlags &= ~HtmlCfgFlags::UnknownTags;
278 SetModified();
279 }
280
281
GetExportMode() const282 sal_uInt16 SvxHtmlOptions::GetExportMode() const
283 {
284 return static_cast<sal_uInt16>(pImpl->nExportMode);
285 }
286
287
IsStarBasic() const288 bool SvxHtmlOptions::IsStarBasic() const
289 {
290 return bool(pImpl->nFlags & HtmlCfgFlags::StarBasic) ;
291 }
292
293
SetStarBasic(bool bSet)294 void SvxHtmlOptions::SetStarBasic(bool bSet)
295 {
296 if(bSet)
297 pImpl->nFlags |= HtmlCfgFlags::StarBasic;
298 else
299 pImpl->nFlags &= ~HtmlCfgFlags::StarBasic;
300 SetModified();
301 }
302
IsSaveGraphicsLocal() const303 bool SvxHtmlOptions::IsSaveGraphicsLocal() const
304 {
305 return bool(pImpl->nFlags & HtmlCfgFlags::LocalGrf) ;
306 }
307
SetSaveGraphicsLocal(bool bSet)308 void SvxHtmlOptions::SetSaveGraphicsLocal(bool bSet)
309 {
310 if(bSet)
311 pImpl->nFlags |= HtmlCfgFlags::LocalGrf;
312 else
313 pImpl->nFlags &= ~HtmlCfgFlags::LocalGrf;
314 SetModified();
315 }
316
IsPrintLayoutExtension() const317 bool SvxHtmlOptions::IsPrintLayoutExtension() const
318 {
319 bool bRet(pImpl->nFlags & HtmlCfgFlags::PrintLayoutExtension);
320 switch( pImpl->nExportMode )
321 {
322 case HTML_CFG_MSIE:
323 case HTML_CFG_NS40 :
324 case HTML_CFG_WRITER :
325 break;
326 default:
327 bRet = false;
328 }
329 return bRet;
330 }
331
SetPrintLayoutExtension(bool bSet)332 void SvxHtmlOptions::SetPrintLayoutExtension(bool bSet)
333 {
334 if(bSet)
335 pImpl->nFlags |= HtmlCfgFlags::PrintLayoutExtension;
336 else
337 pImpl->nFlags &= ~HtmlCfgFlags::PrintLayoutExtension;
338 SetModified();
339 }
340
IsIgnoreFontFamily() const341 bool SvxHtmlOptions::IsIgnoreFontFamily() const
342 {
343 return bool(pImpl->nFlags & HtmlCfgFlags::IgnoreFontFamily) ;
344 }
345
SetIgnoreFontFamily(bool bSet)346 void SvxHtmlOptions::SetIgnoreFontFamily(bool bSet)
347 {
348 if(bSet)
349 pImpl->nFlags |= HtmlCfgFlags::IgnoreFontFamily;
350 else
351 pImpl->nFlags &= ~HtmlCfgFlags::IgnoreFontFamily;
352 SetModified();
353 }
354
IsStarBasicWarning() const355 bool SvxHtmlOptions::IsStarBasicWarning() const
356 {
357 return bool(pImpl->nFlags & HtmlCfgFlags::IsBasicWarning) ;
358 }
359
SetStarBasicWarning(bool bSet)360 void SvxHtmlOptions::SetStarBasicWarning(bool bSet)
361 {
362 if(bSet)
363 pImpl->nFlags |= HtmlCfgFlags::IsBasicWarning;
364 else
365 pImpl->nFlags &= ~HtmlCfgFlags::IsBasicWarning;
366 SetModified();
367 }
368
GetTextEncoding() const369 rtl_TextEncoding SvxHtmlOptions::GetTextEncoding() const
370 {
371 rtl_TextEncoding eRet;
372 if(pImpl->bIsEncodingDefault)
373 eRet = SvtSysLocale::GetBestMimeEncoding();
374 else
375 eRet = static_cast<rtl_TextEncoding>(pImpl->eEncoding);
376 return eRet;
377 }
378
SetTextEncoding(rtl_TextEncoding eEnc)379 void SvxHtmlOptions::SetTextEncoding( rtl_TextEncoding eEnc )
380 {
381 pImpl->eEncoding = eEnc;
382 pImpl->bIsEncodingDefault = false;
383 SetModified();
384 }
385
IsDefaultTextEncoding() const386 bool SvxHtmlOptions::IsDefaultTextEncoding() const
387 {
388 return pImpl->bIsEncodingDefault;
389 }
390
391 namespace
392 {
393 class theSvxHtmlOptions : public rtl::Static<SvxHtmlOptions, theSvxHtmlOptions> {};
394 }
395
Get()396 SvxHtmlOptions& SvxHtmlOptions::Get()
397 {
398 return theSvxHtmlOptions::get();
399 }
400
IsNumbersEnglishUS() const401 bool SvxHtmlOptions::IsNumbersEnglishUS() const
402 {
403 return bool(pImpl->nFlags & HtmlCfgFlags::NumbersEnglishUS) ;
404 }
405
SetNumbersEnglishUS(bool bSet)406 void SvxHtmlOptions::SetNumbersEnglishUS(bool bSet)
407 {
408 if(bSet)
409 pImpl->nFlags |= HtmlCfgFlags::NumbersEnglishUS;
410 else
411 pImpl->nFlags &= ~HtmlCfgFlags::NumbersEnglishUS;
412 SetModified();
413 }
414
415 /* vim:set shiftwidth=4 softtabstop=4 expandtab: */
416