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