xref: /trunk/main/xmloff/source/style/undlihdl.cxx (revision 63bba73c)
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