Branch data Line data Source code
1 : : /* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
2 : : /*************************************************************************
3 : : *
4 : : * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
5 : : *
6 : : * Copyright 2000, 2010 Oracle and/or its affiliates.
7 : : *
8 : : * OpenOffice.org - a multi-platform office productivity suite
9 : : *
10 : : * This file is part of OpenOffice.org.
11 : : *
12 : : * OpenOffice.org is free software: you can redistribute it and/or modify
13 : : * it under the terms of the GNU Lesser General Public License version 3
14 : : * only, as published by the Free Software Foundation.
15 : : *
16 : : * OpenOffice.org is distributed in the hope that it will be useful,
17 : : * but WITHOUT ANY WARRANTY; without even the implied warranty of
18 : : * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
19 : : * GNU Lesser General Public License version 3 for more details
20 : : * (a copy is included in the LICENSE file that accompanied this code).
21 : : *
22 : : * You should have received a copy of the GNU Lesser General Public License
23 : : * version 3 along with OpenOffice.org. If not, see
24 : : * <http://www.openoffice.org/license.html>
25 : : * for a copy of the LGPLv3 License.
26 : : *
27 : : ************************************************************************/
28 : :
29 : :
30 : : #include "xmloff/GradientStyle.hxx"
31 : :
32 : : #include <com/sun/star/awt/Gradient.hpp>
33 : :
34 : : #include <sax/tools/converter.hxx>
35 : :
36 : : #include <xmloff/attrlist.hxx>
37 : : #include <xmloff/nmspmap.hxx>
38 : : #include <xmloff/xmluconv.hxx>
39 : : #include "xmloff/xmlnmspe.hxx"
40 : : #include <xmloff/xmltoken.hxx>
41 : : #include <rtl/ustrbuf.hxx>
42 : : #include <rtl/ustring.hxx>
43 : : #include <tools/debug.hxx>
44 : : #include <xmloff/xmltkmap.hxx>
45 : : #include <xmloff/xmlexp.hxx>
46 : : #include <xmloff/xmlimp.hxx>
47 : :
48 : :
49 : :
50 : : using namespace ::com::sun::star;
51 : : using ::rtl::OUString;
52 : : using ::rtl::OUStringBuffer;
53 : :
54 : : using namespace ::xmloff::token;
55 : :
56 : : enum SvXMLTokenMapAttrs
57 : : {
58 : : XML_TOK_GRADIENT_NAME,
59 : : XML_TOK_GRADIENT_DISPLAY_NAME,
60 : : XML_TOK_GRADIENT_STYLE,
61 : : XML_TOK_GRADIENT_CX,
62 : : XML_TOK_GRADIENT_CY,
63 : : XML_TOK_GRADIENT_STARTCOLOR,
64 : : XML_TOK_GRADIENT_ENDCOLOR,
65 : : XML_TOK_GRADIENT_STARTINT,
66 : : XML_TOK_GRADIENT_ENDINT,
67 : : XML_TOK_GRADIENT_ANGLE,
68 : : XML_TOK_GRADIENT_BORDER,
69 : : XML_TOK_TABSTOP_END=XML_TOK_UNKNOWN
70 : : };
71 : :
72 : :
73 : : SvXMLEnumMapEntry const pXML_GradientStyle_Enum[] =
74 : : {
75 : : { XML_GRADIENTSTYLE_LINEAR, awt::GradientStyle_LINEAR },
76 : : { XML_GRADIENTSTYLE_AXIAL, awt::GradientStyle_AXIAL },
77 : : { XML_GRADIENTSTYLE_RADIAL, awt::GradientStyle_RADIAL },
78 : : { XML_GRADIENTSTYLE_ELLIPSOID, awt::GradientStyle_ELLIPTICAL },
79 : : { XML_GRADIENTSTYLE_SQUARE, awt::GradientStyle_SQUARE },
80 : : { XML_GRADIENTSTYLE_RECTANGULAR, awt::GradientStyle_RECT },
81 : : { XML_TOKEN_INVALID, 0 }
82 : : };
83 : :
84 : : //-------------------------------------------------------------
85 : : // Import
86 : : //-------------------------------------------------------------
87 : 153 : XMLGradientStyleImport::XMLGradientStyleImport(
88 : : SvXMLImport& rImp )
89 : 153 : : rImport(rImp)
90 : : {
91 : 153 : }
92 : :
93 : 153 : XMLGradientStyleImport::~XMLGradientStyleImport()
94 : : {
95 : 153 : }
96 : :
97 : 153 : sal_Bool XMLGradientStyleImport::importXML(
98 : : const uno::Reference< xml::sax::XAttributeList >& xAttrList,
99 : : uno::Any& rValue,
100 : : OUString& rStrName )
101 : : {
102 : 153 : sal_Bool bRet = sal_False;
103 : 153 : sal_Bool bHasName = sal_False;
104 : 153 : sal_Bool bHasStyle = sal_False;
105 : 153 : sal_Bool bHasStartColor = sal_False;
106 : 153 : sal_Bool bHasEndColor = sal_False;
107 : 153 : OUString aDisplayName;
108 : :
109 : 153 : awt::Gradient aGradient;
110 : 153 : aGradient.XOffset = 0;
111 : 153 : aGradient.YOffset = 0;
112 : 153 : aGradient.StartIntensity = 100;
113 : 153 : aGradient.EndIntensity = 100;
114 : 153 : aGradient.Angle = 0;
115 : 153 : aGradient.Border = 0;
116 : :
117 : : {
118 : : static SvXMLTokenMapEntry aGradientAttrTokenMap[] =
119 : : {
120 : : { XML_NAMESPACE_DRAW, XML_NAME, XML_TOK_GRADIENT_NAME },
121 : : { XML_NAMESPACE_DRAW, XML_DISPLAY_NAME, XML_TOK_GRADIENT_DISPLAY_NAME },
122 : : { XML_NAMESPACE_DRAW, XML_STYLE, XML_TOK_GRADIENT_STYLE },
123 : : { XML_NAMESPACE_DRAW, XML_CX, XML_TOK_GRADIENT_CX },
124 : : { XML_NAMESPACE_DRAW, XML_CY, XML_TOK_GRADIENT_CY },
125 : : { XML_NAMESPACE_DRAW, XML_START_COLOR, XML_TOK_GRADIENT_STARTCOLOR },
126 : : { XML_NAMESPACE_DRAW, XML_END_COLOR, XML_TOK_GRADIENT_ENDCOLOR },
127 : : { XML_NAMESPACE_DRAW, XML_START_INTENSITY, XML_TOK_GRADIENT_STARTINT },
128 : : { XML_NAMESPACE_DRAW, XML_END_INTENSITY, XML_TOK_GRADIENT_ENDINT },
129 : : { XML_NAMESPACE_DRAW, XML_GRADIENT_ANGLE, XML_TOK_GRADIENT_ANGLE },
130 : : { XML_NAMESPACE_DRAW, XML_GRADIENT_BORDER, XML_TOK_GRADIENT_BORDER },
131 : : XML_TOKEN_MAP_END
132 : : };
133 : :
134 [ + - ]: 153 : SvXMLTokenMap aTokenMap( aGradientAttrTokenMap );
135 : 153 : SvXMLNamespaceMap& rNamespaceMap = rImport.GetNamespaceMap();
136 : :
137 [ + - ][ + - ]: 153 : sal_Int16 nAttrCount = xAttrList.is() ? xAttrList->getLength() : 0;
[ + - ]
138 [ + + ]: 1545 : for( sal_Int16 i=0; i < nAttrCount; i++ )
139 : : {
140 [ + - ][ + - ]: 1392 : const OUString& rFullAttrName = xAttrList->getNameByIndex( i );
141 : 1392 : OUString aStrAttrName;
142 [ + - ]: 1392 : sal_uInt16 nPrefix = rNamespaceMap.GetKeyByAttrName( rFullAttrName, &aStrAttrName );
143 [ + - ][ + - ]: 1392 : const OUString& rStrValue = xAttrList->getValueByIndex( i );
144 : :
145 : : sal_Int32 nTmpValue;
146 : :
147 [ + - ][ + + : 1392 : switch( aTokenMap.Get( nPrefix, aStrAttrName ) )
+ + + + +
+ + + +
- ]
148 : : {
149 : : case XML_TOK_GRADIENT_NAME:
150 : : {
151 : 153 : rStrName = rStrValue;
152 : 153 : bHasName = sal_True;
153 : : }
154 : 153 : break;
155 : : case XML_TOK_GRADIENT_DISPLAY_NAME:
156 : : {
157 : 33 : aDisplayName = rStrValue;
158 : : }
159 : 33 : break;
160 : : case XML_TOK_GRADIENT_STYLE:
161 : : {
162 : : sal_uInt16 eValue;
163 [ + - ][ + - ]: 153 : if( SvXMLUnitConverter::convertEnum( eValue, rStrValue, pXML_GradientStyle_Enum ) )
164 : : {
165 : 153 : aGradient.Style = (awt::GradientStyle) eValue;
166 : 153 : bHasStyle = sal_True;
167 : : }
168 : : }
169 : 153 : break;
170 : : case XML_TOK_GRADIENT_CX:
171 [ + - ]: 84 : ::sax::Converter::convertPercent( nTmpValue, rStrValue );
172 : 84 : aGradient.XOffset = static_cast< sal_Int16 >( nTmpValue );
173 : 84 : break;
174 : : case XML_TOK_GRADIENT_CY:
175 [ + - ]: 84 : ::sax::Converter::convertPercent( nTmpValue, rStrValue );
176 : 84 : aGradient.YOffset = static_cast< sal_Int16 >( nTmpValue );
177 : 84 : break;
178 : : case XML_TOK_GRADIENT_STARTCOLOR:
179 : : {
180 : : bHasStartColor = ::sax::Converter::convertColor(
181 [ + - ]: 153 : aGradient.StartColor, rStrValue);
182 : : }
183 : 153 : break;
184 : : case XML_TOK_GRADIENT_ENDCOLOR:
185 : : {
186 : : bHasStartColor = ::sax::Converter::convertColor(
187 [ + - ]: 153 : aGradient.EndColor, rStrValue);
188 : : }
189 : 153 : break;
190 : : case XML_TOK_GRADIENT_STARTINT:
191 [ + - ]: 153 : ::sax::Converter::convertPercent( nTmpValue, rStrValue );
192 : 153 : aGradient.StartIntensity = static_cast< sal_Int16 >( nTmpValue );
193 : 153 : break;
194 : : case XML_TOK_GRADIENT_ENDINT:
195 [ + - ]: 153 : ::sax::Converter::convertPercent( nTmpValue, rStrValue );
196 : 153 : aGradient.EndIntensity = static_cast< sal_Int16 >( nTmpValue );
197 : 153 : break;
198 : : case XML_TOK_GRADIENT_ANGLE:
199 : : {
200 : : sal_Int32 nValue;
201 [ + - ]: 120 : ::sax::Converter::convertNumber( nValue, rStrValue, 0, 3600 );
202 : 120 : aGradient.Angle = sal_Int16( nValue );
203 : : }
204 : 120 : break;
205 : : case XML_TOK_GRADIENT_BORDER:
206 [ + - ]: 153 : ::sax::Converter::convertPercent( nTmpValue, rStrValue );
207 : 153 : aGradient.Border = static_cast< sal_Int16 >( nTmpValue );
208 : 153 : break;
209 : :
210 : : default:
211 : : DBG_WARNING( "Unknown token at import gradient style" )
212 : : ;
213 : : }
214 : 1392 : }
215 : :
216 [ + - ]: 153 : rValue <<= aGradient;
217 : :
218 [ + + ]: 153 : if( !aDisplayName.isEmpty() )
219 : : {
220 : : rImport.AddStyleDisplayName( XML_STYLE_FAMILY_SD_GRADIENT_ID, rStrName,
221 [ + - ]: 33 : aDisplayName );
222 : 33 : rStrName = aDisplayName;
223 : : }
224 : :
225 [ + - ][ + - ]: 153 : bRet = bHasName && bHasStyle && bHasStartColor && bHasEndColor;
[ + - ][ - + ]
[ + - ]
226 : :
227 : : }
228 : :
229 : 153 : return bRet;
230 : : }
231 : :
232 : :
233 : : //-------------------------------------------------------------
234 : : // Export
235 : : //-------------------------------------------------------------
236 : :
237 : 46 : XMLGradientStyleExport::XMLGradientStyleExport(
238 : : SvXMLExport& rExp )
239 : 46 : : rExport(rExp)
240 : : {
241 : 46 : }
242 : :
243 : 46 : XMLGradientStyleExport::~XMLGradientStyleExport()
244 : : {
245 : 46 : }
246 : :
247 : 0 : sal_Bool XMLGradientStyleExport::exportXML(
248 : : const OUString& rStrName,
249 : : const uno::Any& rValue )
250 : : {
251 : 0 : sal_Bool bRet = sal_False;
252 : 0 : awt::Gradient aGradient;
253 : :
254 [ # # ]: 0 : if( !rStrName.isEmpty() )
255 : : {
256 [ # # ][ # # ]: 0 : if( rValue >>= aGradient )
257 : : {
258 : 0 : OUString aStrValue;
259 : 0 : OUStringBuffer aOut;
260 : :
261 : : // Style
262 [ # # ][ # # ]: 0 : if( !SvXMLUnitConverter::convertEnum( aOut, aGradient.Style, pXML_GradientStyle_Enum ) )
263 : : {
264 : 0 : bRet = sal_False;
265 : : }
266 : : else
267 : : {
268 : : // Name
269 : 0 : sal_Bool bEncoded = sal_False;
270 : 0 : OUString aStrName( rStrName );
271 : : rExport.AddAttribute( XML_NAMESPACE_DRAW, XML_NAME,
272 : : rExport.EncodeStyleName( aStrName,
273 [ # # ][ # # ]: 0 : &bEncoded ) );
274 [ # # ]: 0 : if( bEncoded )
275 : : rExport.AddAttribute( XML_NAMESPACE_DRAW, XML_DISPLAY_NAME,
276 [ # # ]: 0 : aStrName );
277 : :
278 : :
279 [ # # ]: 0 : aStrValue = aOut.makeStringAndClear();
280 [ # # ]: 0 : rExport.AddAttribute( XML_NAMESPACE_DRAW, XML_STYLE, aStrValue );
281 : :
282 : : // Center x/y
283 [ # # ][ # # ]: 0 : if( aGradient.Style != awt::GradientStyle_LINEAR &&
284 : : aGradient.Style != awt::GradientStyle_AXIAL )
285 : : {
286 [ # # ]: 0 : ::sax::Converter::convertPercent(aOut, aGradient.XOffset);
287 [ # # ]: 0 : aStrValue = aOut.makeStringAndClear();
288 [ # # ]: 0 : rExport.AddAttribute( XML_NAMESPACE_DRAW, XML_CX, aStrValue );
289 [ # # ]: 0 : ::sax::Converter::convertPercent(aOut, aGradient.YOffset);
290 [ # # ]: 0 : aStrValue = aOut.makeStringAndClear();
291 [ # # ]: 0 : rExport.AddAttribute( XML_NAMESPACE_DRAW, XML_CY, aStrValue );
292 : : }
293 : :
294 : : // Color start
295 [ # # ]: 0 : ::sax::Converter::convertColor(aOut, aGradient.StartColor);
296 [ # # ]: 0 : aStrValue = aOut.makeStringAndClear();
297 [ # # ]: 0 : rExport.AddAttribute( XML_NAMESPACE_DRAW, XML_START_COLOR, aStrValue );
298 : :
299 : : // Color end
300 [ # # ]: 0 : ::sax::Converter::convertColor(aOut, aGradient.EndColor);
301 [ # # ]: 0 : aStrValue = aOut.makeStringAndClear();
302 [ # # ]: 0 : rExport.AddAttribute( XML_NAMESPACE_DRAW, XML_END_COLOR, aStrValue );
303 : :
304 : : // Intensity start
305 [ # # ]: 0 : ::sax::Converter::convertPercent(aOut, aGradient.StartIntensity);
306 [ # # ]: 0 : aStrValue = aOut.makeStringAndClear();
307 [ # # ]: 0 : rExport.AddAttribute( XML_NAMESPACE_DRAW, XML_START_INTENSITY, aStrValue );
308 : :
309 : : // Intensity end
310 [ # # ]: 0 : ::sax::Converter::convertPercent(aOut, aGradient.EndIntensity);
311 [ # # ]: 0 : aStrValue = aOut.makeStringAndClear();
312 [ # # ]: 0 : rExport.AddAttribute( XML_NAMESPACE_DRAW, XML_END_INTENSITY, aStrValue );
313 : :
314 : : // Angle
315 [ # # ]: 0 : if( aGradient.Style != awt::GradientStyle_RADIAL )
316 : : {
317 [ # # ]: 0 : ::sax::Converter::convertNumber(aOut, sal_Int32(aGradient.Angle));
318 [ # # ]: 0 : aStrValue = aOut.makeStringAndClear();
319 [ # # ]: 0 : rExport.AddAttribute( XML_NAMESPACE_DRAW, XML_GRADIENT_ANGLE, aStrValue );
320 : : }
321 : :
322 : : // Border
323 [ # # ]: 0 : ::sax::Converter::convertPercent( aOut, aGradient.Border );
324 [ # # ]: 0 : aStrValue = aOut.makeStringAndClear();
325 [ # # ]: 0 : rExport.AddAttribute( XML_NAMESPACE_DRAW, XML_GRADIENT_BORDER, aStrValue );
326 : :
327 : : // Do Write
328 : : SvXMLElementExport aElem( rExport, XML_NAMESPACE_DRAW, XML_GRADIENT,
329 [ # # ][ # # ]: 0 : sal_True, sal_False );
330 : 0 : }
331 : : }
332 : : }
333 : :
334 : 0 : return bRet;
335 : : }
336 : :
337 : : /* vim:set shiftwidth=4 softtabstop=4 expandtab: */
|