xref: /AOO41X/main/xmloff/source/style/undlihdl.cxx (revision 63bba73cc51e0afb45f8a8d578158724bb5afee8)
1 /**************************************************************
2  *
3  * Licensed to the Apache Software Foundation (ASF) under one
4  * or more contributor license agreements.  See the NOTICE file
5  * distributed with this work for additional information
6  * regarding copyright ownership.  The ASF licenses this file
7  * to you under the Apache License, Version 2.0 (the
8  * "License"); you may not use this file except in compliance
9  * with the License.  You may obtain a copy of the License at
10  *
11  *   http://www.apache.org/licenses/LICENSE-2.0
12  *
13  * Unless required by applicable law or agreed to in writing,
14  * software distributed under the License is distributed on an
15  * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
16  * KIND, either express or implied.  See the License for the
17  * specific language governing permissions and limitations
18  * under the License.
19  *
20  *************************************************************/
21 
22 
23 
24 // MARKER(update_precomp.py): autogen include statement, do not remove
25 #include "precompiled_xmloff.hxx"
26 #include <undlihdl.hxx>
27 #include <xmloff/xmltoken.hxx>
28 #include <xmloff/xmluconv.hxx>
29 #include <rtl/ustrbuf.hxx>
30 
31 
32 #include <com/sun/star/uno/Any.hxx>
33 #include <com/sun/star/awt/FontUnderline.hpp>
34 
35 using ::rtl::OUString;
36 using ::rtl::OUStringBuffer;
37 
38 using namespace ::com::sun::star;
39 using namespace ::com::sun::star::awt;
40 using namespace ::xmloff::token;
41 
42 SvXMLEnumMapEntry __READONLY_DATA pXML_UnderlineType_Enum[] =
43 {
44     { XML_NONE,                         FontUnderline::NONE },
45     { XML_SINGLE,               FontUnderline::SINGLE },
46     { XML_DOUBLE,                       FontUnderline::DOUBLE },
47     { XML_SINGLE,               FontUnderline::DOTTED },
48     { XML_SINGLE,               FontUnderline::DASH },
49     { XML_SINGLE,               FontUnderline::LONGDASH },
50     { XML_SINGLE,               FontUnderline::DASHDOT },
51     { XML_SINGLE,               FontUnderline::DASHDOTDOT },
52     { XML_SINGLE,               FontUnderline::WAVE },
53     { XML_SINGLE,               FontUnderline::BOLD },
54     { XML_SINGLE,               FontUnderline::BOLDDOTTED },
55     { XML_SINGLE,               FontUnderline::BOLDDASH },
56     { XML_SINGLE,               FontUnderline::BOLDLONGDASH },
57     { XML_SINGLE,               FontUnderline::BOLDDASHDOT },
58     { XML_SINGLE,           FontUnderline::BOLDDASHDOTDOT },
59     { XML_SINGLE,               FontUnderline::BOLDWAVE },
60     { XML_DOUBLE,                       FontUnderline::DOUBLEWAVE },
61     { XML_SINGLE,               FontUnderline::SMALLWAVE },
62     { XML_TOKEN_INVALID,                0 }
63 };
64 
65 SvXMLEnumMapEntry __READONLY_DATA pXML_UnderlineStyle_Enum[] =
66 {
67     { XML_NONE,                         FontUnderline::NONE },
68     { XML_SOLID,                        FontUnderline::SINGLE },
69     { XML_SOLID,                        FontUnderline::DOUBLE },
70     { XML_DOTTED,               FontUnderline::DOTTED },
71     { XML_DASH,             FontUnderline::DASH },
72     { XML_LONG_DASH,            FontUnderline::LONGDASH },
73     { XML_DOT_DASH,         FontUnderline::DASHDOT },
74     { XML_DOT_DOT_DASH,     FontUnderline::DASHDOTDOT },
75     { XML_WAVE,             FontUnderline::WAVE },
76     { XML_SOLID,                        FontUnderline::BOLD },
77     { XML_DOTTED,               FontUnderline::BOLDDOTTED },
78     { XML_DASH,             FontUnderline::BOLDDASH },
79     { XML_LONG_DASH,            FontUnderline::BOLDLONGDASH },
80     { XML_DOT_DASH,         FontUnderline::BOLDDASHDOT },
81     { XML_DOT_DOT_DASH,         FontUnderline::BOLDDASHDOTDOT },
82     { XML_WAVE,             FontUnderline::BOLDWAVE },
83     { XML_WAVE,                 FontUnderline::DOUBLEWAVE },
84     { XML_SMALL_WAVE,           FontUnderline::SMALLWAVE },
85     { XML_TOKEN_INVALID,                0 }
86 };
87 
88 SvXMLEnumMapEntry __READONLY_DATA pXML_UnderlineWidth_Enum[] =
89 {
90     { XML_AUTO,                         FontUnderline::NONE },
91     { XML_AUTO,                         FontUnderline::SINGLE },
92     { XML_AUTO,                         FontUnderline::DOUBLE },
93     { XML_AUTO,                         FontUnderline::DOTTED },
94     { XML_AUTO,                         FontUnderline::DASH },
95     { XML_AUTO,                         FontUnderline::LONGDASH },
96     { XML_AUTO,                         FontUnderline::DASHDOT },
97     { XML_AUTO,                         FontUnderline::DASHDOTDOT },
98     { XML_AUTO,                         FontUnderline::WAVE },
99     { XML_BOLD,             FontUnderline::BOLD },
100     { XML_BOLD,             FontUnderline::BOLDDOTTED },
101     { XML_BOLD,             FontUnderline::BOLDDASH },
102     { XML_BOLD,             FontUnderline::BOLDLONGDASH },
103     { XML_BOLD,             FontUnderline::BOLDDASHDOT },
104     { XML_BOLD,                 FontUnderline::BOLDDASHDOTDOT },
105     { XML_BOLD,             FontUnderline::BOLDWAVE },
106     { XML_AUTO,                         FontUnderline::DOUBLEWAVE },
107     { XML_THIN,                         FontUnderline::NONE },
108     { XML_MEDIUM,                       FontUnderline::NONE },
109     { XML_THICK,                        FontUnderline::BOLD},
110     { XML_TOKEN_INVALID,                0 }
111 };
112 
113 
114 
115 ///////////////////////////////////////////////////////////////////////////////
116 //
117 // class XMLUnderlineTypePropHdl
118 //
119 
~XMLUnderlineTypePropHdl()120 XMLUnderlineTypePropHdl::~XMLUnderlineTypePropHdl()
121 {
122     // nothing to do
123 }
124 
importXML(const OUString & rStrImpValue,uno::Any & rValue,const SvXMLUnitConverter &) const125 sal_Bool XMLUnderlineTypePropHdl::importXML( const OUString& rStrImpValue, uno::Any& rValue, const SvXMLUnitConverter& ) const
126 {
127     sal_uInt16 eNewUnderline;
128     sal_Bool bRet = SvXMLUnitConverter::convertEnum(
129         eNewUnderline, rStrImpValue, pXML_UnderlineType_Enum );
130     if( bRet )
131     {
132         // multi property: style and width might be set already.
133         // If the old value is NONE, the new is used unchanged.
134         sal_Int16 eUnderline = sal_Int16();
135         if( (rValue >>= eUnderline) && FontUnderline::NONE!=eUnderline )
136         {
137             switch( eNewUnderline )
138             {
139             case FontUnderline::NONE:
140             case FontUnderline::SINGLE:
141                 // keep existing line style
142                 eNewUnderline = eUnderline;
143                 break;
144             case FontUnderline::DOUBLE:
145                 // A double line style has priority over a bold line style,
146                 // but not over the line style itself.
147                 switch( eUnderline )
148                 {
149                 case FontUnderline::SINGLE:
150                 case FontUnderline::BOLD:
151                     break;
152                 case FontUnderline::WAVE:
153                 case FontUnderline::BOLDWAVE:
154                     eNewUnderline = FontUnderline::DOUBLEWAVE;
155                     break;
156                 default:
157                     // If a double line style is not supported for the existing
158                     // value, keep the new one
159                     eNewUnderline = eUnderline;
160                     break;
161                 }
162                 break;
163             default:
164                 OSL_ENSURE( bRet, "unexpected line type value" );
165                 break;
166             }
167             if( eNewUnderline != eUnderline )
168                 rValue <<= (sal_Int16)eNewUnderline;
169         }
170         else
171         {
172             rValue <<= (sal_Int16)eNewUnderline;
173         }
174     }
175 
176     return bRet;
177 }
178 
exportXML(OUString & rStrExpValue,const uno::Any & rValue,const SvXMLUnitConverter &) const179 sal_Bool XMLUnderlineTypePropHdl::exportXML( OUString& rStrExpValue, const uno::Any& rValue, const SvXMLUnitConverter& ) const
180 {
181     sal_Bool bRet = sal_False;
182     sal_Int16 nValue = sal_Int16();
183     OUStringBuffer aOut;
184 
185     if( (rValue >>= nValue) &&
186         (FontUnderline::DOUBLE == nValue ||
187          FontUnderline::DOUBLEWAVE == nValue) )
188     {
189         bRet = SvXMLUnitConverter::convertEnum(
190             aOut, (sal_uInt16)nValue, pXML_UnderlineType_Enum );
191         if( bRet )
192             rStrExpValue = aOut.makeStringAndClear();
193     }
194 
195     return bRet;
196 }
197 
198 ///////////////////////////////////////////////////////////////////////////////
199 //
200 // class XMLUnderlineStylePropHdl
201 //
202 
~XMLUnderlineStylePropHdl()203 XMLUnderlineStylePropHdl::~XMLUnderlineStylePropHdl()
204 {
205     // nothing to do
206 }
207 
importXML(const OUString & rStrImpValue,uno::Any & rValue,const SvXMLUnitConverter &) const208 sal_Bool XMLUnderlineStylePropHdl::importXML( const OUString& rStrImpValue, uno::Any& rValue, const SvXMLUnitConverter& ) const
209 {
210     sal_uInt16 eNewUnderline;
211     sal_Bool bRet = SvXMLUnitConverter::convertEnum(
212         eNewUnderline, rStrImpValue, pXML_UnderlineStyle_Enum );
213     if( bRet )
214     {
215         // multi property: style and width might be set already.
216         // If the old value is NONE, the new is used unchanged.
217         sal_Int16 eUnderline = sal_Int16();
218         if( (rValue >>= eUnderline) && FontUnderline::NONE!=eUnderline )
219         {
220             switch( eNewUnderline )
221             {
222             case FontUnderline::NONE:
223             case FontUnderline::SINGLE:
224                 // keep double or bold line style
225                 eNewUnderline = eUnderline;
226             case FontUnderline::DOTTED:
227                 // The line style has priority over a double type.
228                 if( FontUnderline::BOLD == eUnderline )
229                     eNewUnderline = FontUnderline::BOLDDOTTED;
230                 break;
231             case FontUnderline::DASH:
232                 if( FontUnderline::BOLD == eUnderline )
233                     eNewUnderline = FontUnderline::BOLDDASH;
234                 break;
235             case FontUnderline::LONGDASH:
236                 if( FontUnderline::BOLD == eUnderline )
237                     eNewUnderline = FontUnderline::BOLDLONGDASH;
238                 break;
239             case FontUnderline::DASHDOT:
240                 if( FontUnderline::BOLD == eUnderline )
241                     eNewUnderline = FontUnderline::BOLDDASHDOT;
242                 break;
243             case FontUnderline::DASHDOTDOT:
244                 if( FontUnderline::BOLD == eUnderline )
245                     eNewUnderline = FontUnderline::BOLDDASHDOTDOT;
246                 break;
247             case FontUnderline::WAVE:
248                 if( FontUnderline::BOLD == eUnderline )
249                     eNewUnderline = FontUnderline::BOLDWAVE;
250                 break;
251             case FontUnderline::SMALLWAVE:
252                 // SMALLWAVE is not used
253             default:
254                 OSL_ENSURE( bRet, "unexpected line style value" );
255                 break;
256             }
257             if( eNewUnderline != eUnderline )
258                 rValue <<= (sal_Int16)eNewUnderline;
259         }
260         else
261         {
262             rValue <<= (sal_Int16)eNewUnderline;
263         }
264     }
265 
266     return bRet;
267 }
268 
exportXML(OUString & rStrExpValue,const uno::Any & rValue,const SvXMLUnitConverter &) const269 sal_Bool XMLUnderlineStylePropHdl::exportXML( OUString& rStrExpValue, const uno::Any& rValue, const SvXMLUnitConverter& ) const
270 {
271     sal_Bool bRet = sal_False;
272     sal_Int16 nValue = sal_Int16();
273     OUStringBuffer aOut;
274 
275     if( rValue >>= nValue )
276     {
277         bRet = SvXMLUnitConverter::convertEnum(
278             aOut, (sal_uInt16)nValue, pXML_UnderlineStyle_Enum );
279         if( bRet )
280             rStrExpValue = aOut.makeStringAndClear();
281     }
282 
283     return bRet;
284 }
285 
286 ///////////////////////////////////////////////////////////////////////////////
287 //
288 // class XMLUnderlineWidthPropHdl
289 //
290 
~XMLUnderlineWidthPropHdl()291 XMLUnderlineWidthPropHdl::~XMLUnderlineWidthPropHdl()
292 {
293     // nothing to do
294 }
295 
importXML(const OUString & rStrImpValue,uno::Any & rValue,const SvXMLUnitConverter &) const296 sal_Bool XMLUnderlineWidthPropHdl::importXML( const OUString& rStrImpValue, uno::Any& rValue, const SvXMLUnitConverter& ) const
297 {
298     sal_uInt16 eNewUnderline;
299     sal_Bool bRet = SvXMLUnitConverter::convertEnum(
300         eNewUnderline, rStrImpValue, pXML_UnderlineWidth_Enum );
301     if( bRet )
302     {
303         // multi property: style and width might be set already.
304         // If the old value is NONE, the new is used unchanged.
305         sal_Int16 eUnderline = sal_Int16();
306         if( (rValue >>= eUnderline) && FontUnderline::NONE!=eUnderline )
307         {
308             switch( eNewUnderline )
309             {
310             case FontUnderline::NONE:
311                 // keep existing line style
312                 eNewUnderline = eUnderline;
313                 break;
314             case FontUnderline::BOLD:
315                 // A double line style has priority over a bold line style,
316                 // but not over the line style itself.
317                 switch( eUnderline )
318                 {
319                 case FontUnderline::SINGLE:
320                     break;
321                 case FontUnderline::DOTTED:
322                     eNewUnderline = FontUnderline::BOLDDOTTED;
323                     break;
324                 case FontUnderline::DASH:
325                     eNewUnderline = FontUnderline::BOLDDASH;
326                     break;
327                 case FontUnderline::LONGDASH:
328                     eNewUnderline = FontUnderline::BOLDLONGDASH;
329                     break;
330                 case FontUnderline::DASHDOT:
331                     eNewUnderline = FontUnderline::BOLDDASHDOT;
332                     break;
333                 case FontUnderline::DASHDOTDOT:
334                     eNewUnderline = FontUnderline::BOLDDASHDOTDOT;
335                     break;
336                 case FontUnderline::WAVE:
337                     eNewUnderline = FontUnderline::BOLDWAVE;
338                     break;
339                 default:
340                     // a doube line style overwrites a bold one
341                     eNewUnderline = eUnderline;
342                     break;
343                 }
344                 break;
345             default:
346                 OSL_ENSURE( bRet, "unexpected line width value" );
347                 break;
348             }
349             if( eNewUnderline != eUnderline )
350                 rValue <<= (sal_Int16)eNewUnderline;
351         }
352         else
353         {
354             rValue <<= (sal_Int16)eNewUnderline;
355         }
356     }
357 
358     return bRet;
359 }
360 
exportXML(OUString & rStrExpValue,const uno::Any & rValue,const SvXMLUnitConverter &) const361 sal_Bool XMLUnderlineWidthPropHdl::exportXML( OUString& rStrExpValue, const uno::Any& rValue, const SvXMLUnitConverter& ) const
362 {
363     sal_Bool bRet = sal_False;
364     sal_Int16 nValue = sal_Int16();
365     OUStringBuffer aOut;
366 
367     if( (rValue >>= nValue) && (FontUnderline::NONE != nValue) )
368     {
369         bRet = SvXMLUnitConverter::convertEnum(
370             aOut, (sal_uInt16)nValue, pXML_UnderlineWidth_Enum );
371         if( bRet )
372             rStrExpValue = aOut.makeStringAndClear();
373     }
374 
375     return bRet;
376 }
377 
378