Line data Source code
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 <cdouthdl.hxx>
21 : #include <xmloff/xmltoken.hxx>
22 : #include <xmloff/xmluconv.hxx>
23 : #include <rtl/ustrbuf.hxx>
24 :
25 : #include <com/sun/star/awt/FontStrikeout.hpp>
26 : #include <com/sun/star/uno/Any.hxx>
27 :
28 : using ::rtl::OUString;
29 : using ::rtl::OUStringBuffer;
30 :
31 : using namespace ::com::sun::star;
32 : using namespace ::com::sun::star::awt;
33 : using namespace ::xmloff::token;
34 :
35 : SvXMLEnumMapEntry pXML_CrossedoutType_Enum[] =
36 : {
37 : { XML_NONE, awt::FontStrikeout::NONE },
38 : { XML_SINGLE, awt::FontStrikeout::SINGLE },
39 : { XML_DOUBLE, awt::FontStrikeout::DOUBLE },
40 : { XML_SINGLE, awt::FontStrikeout::BOLD },
41 : { XML_SINGLE, awt::FontStrikeout::SLASH },
42 : { XML_SINGLE, awt::FontStrikeout::X },
43 : { XML_TOKEN_INVALID, 0 }
44 : };
45 :
46 : SvXMLEnumMapEntry pXML_CrossedoutStyle_Enum[] =
47 : {
48 : { XML_NONE, awt::FontStrikeout::NONE },
49 : { XML_SOLID, awt::FontStrikeout::SINGLE },
50 : { XML_SOLID, awt::FontStrikeout::DOUBLE },
51 : { XML_SOLID, awt::FontStrikeout::BOLD },
52 : { XML_SOLID, awt::FontStrikeout::SLASH },
53 : { XML_SOLID, awt::FontStrikeout::X },
54 : { XML_DOTTED, awt::FontStrikeout::SINGLE },
55 : { XML_DASH, awt::FontStrikeout::SINGLE },
56 : { XML_LONG_DASH, awt::FontStrikeout::SINGLE },
57 : { XML_DOT_DASH, awt::FontStrikeout::SINGLE },
58 : { XML_DOT_DOT_DASH, awt::FontStrikeout::SINGLE },
59 : { XML_WAVE, awt::FontStrikeout::SINGLE },
60 : { XML_TOKEN_INVALID, 0 }
61 : };
62 :
63 : SvXMLEnumMapEntry pXML_CrossedoutWidth_Enum[] =
64 : {
65 : { XML_AUTO, awt::FontStrikeout::NONE },
66 : { XML_AUTO, awt::FontStrikeout::SINGLE },
67 : { XML_AUTO, awt::FontStrikeout::DOUBLE },
68 : { XML_BOLD, awt::FontStrikeout::BOLD },
69 : { XML_AUTO, awt::FontStrikeout::SLASH },
70 : { XML_AUTO, awt::FontStrikeout::X },
71 : { XML_THIN, awt::FontStrikeout::NONE },
72 : { XML_MEDIUM, awt::FontStrikeout::NONE },
73 : { XML_THICK, awt::FontStrikeout::NONE },
74 : { XML_TOKEN_INVALID, 0 }
75 : };
76 :
77 : ///////////////////////////////////////////////////////////////////////////////
78 : //
79 : // class XMLCrossedOutTypePropHdl
80 : //
81 :
82 970 : XMLCrossedOutTypePropHdl::~XMLCrossedOutTypePropHdl()
83 : {
84 : // nothing to do
85 970 : }
86 :
87 1 : sal_Bool XMLCrossedOutTypePropHdl::importXML( const OUString& rStrImpValue, uno::Any& rValue, const SvXMLUnitConverter& ) const
88 : {
89 : sal_uInt16 eNewStrikeout;
90 : sal_Bool bRet = SvXMLUnitConverter::convertEnum(
91 1 : eNewStrikeout, rStrImpValue, pXML_CrossedoutType_Enum );
92 1 : if( bRet )
93 : {
94 : // multi property: style and width might be set already.
95 : // If the old value is NONE, the new is used unchanged.
96 1 : sal_Int16 eStrikeout = sal_Int16();
97 1 : if( (rValue >>= eStrikeout) && awt::FontStrikeout::NONE!=eStrikeout )
98 : {
99 1 : switch( eNewStrikeout )
100 : {
101 : case awt::FontStrikeout::NONE:
102 : case awt::FontStrikeout::SINGLE:
103 : // keep existing line style
104 0 : eNewStrikeout = eStrikeout;
105 0 : break;
106 : case awt::FontStrikeout::DOUBLE:
107 : // A double line style has priority over a solid or a bold
108 : // line style,
109 : // but not about any other line style
110 1 : switch( eStrikeout )
111 : {
112 : case awt::FontStrikeout::SINGLE:
113 : case awt::FontStrikeout::BOLD:
114 1 : break;
115 : default:
116 : // If a double line style is not supported for the existing
117 : // value, keep the new one
118 0 : eNewStrikeout = eStrikeout;
119 0 : break;
120 : }
121 1 : break;
122 : default:
123 : OSL_ENSURE( bRet, "unexpected line type value" );
124 0 : break;
125 : }
126 1 : if( eNewStrikeout != eStrikeout )
127 1 : rValue <<= (sal_Int16)eNewStrikeout;
128 : }
129 : else
130 : {
131 0 : rValue <<= (sal_Int16)eNewStrikeout;
132 : }
133 : }
134 :
135 1 : return bRet;
136 : }
137 :
138 0 : sal_Bool XMLCrossedOutTypePropHdl::exportXML( OUString& rStrExpValue, const uno::Any& rValue, const SvXMLUnitConverter& ) const
139 : {
140 0 : sal_Bool bRet = sal_False;
141 0 : sal_Int16 nValue = sal_Int16();
142 0 : OUStringBuffer aOut;
143 :
144 0 : if( (rValue >>= nValue) && awt::FontStrikeout::DOUBLE==nValue )
145 : {
146 : bRet = SvXMLUnitConverter::convertEnum(
147 0 : aOut, (sal_uInt16)nValue, pXML_CrossedoutType_Enum );
148 0 : if( bRet )
149 0 : rStrExpValue = aOut.makeStringAndClear();
150 : }
151 :
152 0 : return bRet;
153 : }
154 :
155 : ///////////////////////////////////////////////////////////////////////////////
156 : //
157 : // class XMLCrossedOutStylePropHdl
158 : //
159 :
160 970 : XMLCrossedOutStylePropHdl::~XMLCrossedOutStylePropHdl()
161 : {
162 : // nothing to do
163 970 : }
164 :
165 9 : sal_Bool XMLCrossedOutStylePropHdl::importXML( const OUString& rStrImpValue, uno::Any& rValue, const SvXMLUnitConverter& ) const
166 : {
167 : sal_uInt16 eNewStrikeout;
168 : sal_Bool bRet = SvXMLUnitConverter::convertEnum(
169 9 : eNewStrikeout, rStrImpValue, pXML_CrossedoutStyle_Enum );
170 9 : if( bRet )
171 : {
172 : // multi property: style and width might be set already.
173 : // If the old value is NONE, the new is used unchanged.
174 9 : sal_Int16 eStrikeout = sal_Int16();
175 9 : if( (rValue >>= eStrikeout) && awt::FontStrikeout::NONE!=eStrikeout )
176 : {
177 : // one NONE a SINGLE are possible new values. For both, the
178 : // existing value is kept.
179 : }
180 : else
181 : {
182 9 : rValue <<= (sal_Int16)eNewStrikeout;
183 : }
184 : }
185 :
186 9 : return bRet;
187 : }
188 :
189 0 : sal_Bool XMLCrossedOutStylePropHdl::exportXML( OUString& rStrExpValue, const uno::Any& rValue, const SvXMLUnitConverter& ) const
190 : {
191 0 : sal_Bool bRet = sal_False;
192 0 : sal_Int16 nValue = sal_Int16();
193 0 : OUStringBuffer aOut;
194 :
195 0 : if( rValue >>= nValue )
196 : {
197 : bRet = SvXMLUnitConverter::convertEnum(
198 0 : aOut, (sal_uInt16)nValue, pXML_CrossedoutStyle_Enum );
199 0 : if( bRet )
200 0 : rStrExpValue = aOut.makeStringAndClear();
201 : }
202 :
203 0 : return bRet;
204 : }
205 :
206 : ///////////////////////////////////////////////////////////////////////////////
207 : //
208 : // class XMLCrossedOutWidthPropHdl
209 : //
210 :
211 970 : XMLCrossedOutWidthPropHdl::~XMLCrossedOutWidthPropHdl()
212 : {
213 : // nothing to do
214 970 : }
215 :
216 0 : sal_Bool XMLCrossedOutWidthPropHdl::importXML( const OUString& rStrImpValue, uno::Any& rValue, const SvXMLUnitConverter& ) const
217 : {
218 : sal_uInt16 eNewStrikeout;
219 : sal_Bool bRet = SvXMLUnitConverter::convertEnum(
220 0 : eNewStrikeout, rStrImpValue, pXML_CrossedoutWidth_Enum );
221 0 : if( bRet )
222 : {
223 : // multi property: style and width might be set already.
224 : // If the old value is NONE, the new is used unchanged.
225 0 : sal_Int16 eStrikeout = sal_Int16();
226 0 : if( (rValue >>= eStrikeout) && awt::FontStrikeout::NONE!=eStrikeout )
227 : {
228 0 : switch( eNewStrikeout )
229 : {
230 : case awt::FontStrikeout::NONE:
231 : // keep existing line style
232 0 : eNewStrikeout = eStrikeout;
233 0 : break;
234 : case awt::FontStrikeout::BOLD:
235 0 : switch( eStrikeout )
236 : {
237 : case awt::FontStrikeout::SINGLE:
238 0 : break;
239 : default:
240 : // If a double line style is not supported for the existing
241 : // value, keep the new one
242 0 : eNewStrikeout = eStrikeout;
243 0 : break;
244 : }
245 : default:
246 : OSL_ENSURE( bRet, "unexpected line type value" );
247 0 : break;
248 : }
249 0 : if( eNewStrikeout != eStrikeout )
250 0 : rValue <<= (sal_Int16)eNewStrikeout;
251 : }
252 : else
253 : {
254 0 : rValue <<= (sal_Int16)eNewStrikeout;
255 : }
256 : }
257 :
258 0 : return bRet;
259 : }
260 :
261 0 : sal_Bool XMLCrossedOutWidthPropHdl::exportXML( OUString& rStrExpValue, const uno::Any& rValue, const SvXMLUnitConverter& ) const
262 : {
263 0 : sal_Bool bRet = sal_False;
264 0 : sal_Int16 nValue = sal_Int16();
265 0 : OUStringBuffer aOut;
266 :
267 0 : if( (rValue >>= nValue) && (awt::FontStrikeout::BOLD == nValue) )
268 : {
269 : bRet = SvXMLUnitConverter::convertEnum(
270 0 : aOut, (sal_uInt16)nValue, pXML_CrossedoutWidth_Enum );
271 0 : if( bRet )
272 0 : rStrExpValue = aOut.makeStringAndClear();
273 : }
274 :
275 0 : return bRet;
276 : }
277 :
278 : ///////////////////////////////////////////////////////////////////////////////
279 : //
280 : // class XMLCrossedOutTextPropHdl
281 : //
282 :
283 970 : XMLCrossedOutTextPropHdl::~XMLCrossedOutTextPropHdl()
284 : {
285 : // nothing to do
286 970 : }
287 :
288 0 : sal_Bool XMLCrossedOutTextPropHdl::importXML( const OUString& rStrImpValue, uno::Any& rValue, const SvXMLUnitConverter& ) const
289 : {
290 0 : sal_Bool bRet = sal_False;
291 :
292 0 : if( !rStrImpValue.isEmpty() )
293 : {
294 0 : sal_Int16 eStrikeout = ('/' == rStrImpValue[0]
295 : ? awt::FontStrikeout::SLASH
296 0 : : awt::FontStrikeout::X);
297 0 : rValue <<= (sal_Int16)eStrikeout;
298 0 : bRet = sal_True;
299 : }
300 :
301 0 : return bRet;
302 : }
303 :
304 0 : sal_Bool XMLCrossedOutTextPropHdl::exportXML( OUString& rStrExpValue, const uno::Any& rValue, const SvXMLUnitConverter& ) const
305 : {
306 0 : sal_Bool bRet = sal_False;
307 0 : sal_Int16 nValue = sal_Int16();
308 :
309 0 : if( (rValue >>= nValue) &&
310 : (awt::FontStrikeout::SLASH == nValue || awt::FontStrikeout::X == nValue) )
311 : {
312 : rStrExpValue = OUString::valueOf(
313 : static_cast< sal_Unicode>( awt::FontStrikeout::SLASH == nValue ? '/'
314 0 : : 'X' ) );
315 0 : bRet = sal_True;
316 : }
317 :
318 0 : return bRet;
319 : }
320 :
321 : /* vim:set shiftwidth=4 softtabstop=4 expandtab: */
|