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