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 <xmloff/GradientStyle.hxx>
21 :
22 : #include <com/sun/star/awt/Gradient.hpp>
23 :
24 : #include <sax/tools/converter.hxx>
25 :
26 : #include <xmloff/attrlist.hxx>
27 : #include <xmloff/nmspmap.hxx>
28 : #include <xmloff/xmluconv.hxx>
29 : #include <xmloff/xmlnmspe.hxx>
30 : #include <xmloff/xmltoken.hxx>
31 : #include <rtl/ustrbuf.hxx>
32 : #include <rtl/ustring.hxx>
33 : #include <tools/debug.hxx>
34 : #include <xmloff/xmltkmap.hxx>
35 : #include <xmloff/xmlexp.hxx>
36 : #include <xmloff/xmlimp.hxx>
37 :
38 : using namespace ::com::sun::star;
39 :
40 : using namespace ::xmloff::token;
41 :
42 : enum SvXMLTokenMapAttrs
43 : {
44 : XML_TOK_GRADIENT_NAME,
45 : XML_TOK_GRADIENT_DISPLAY_NAME,
46 : XML_TOK_GRADIENT_STYLE,
47 : XML_TOK_GRADIENT_CX,
48 : XML_TOK_GRADIENT_CY,
49 : XML_TOK_GRADIENT_STARTCOLOR,
50 : XML_TOK_GRADIENT_ENDCOLOR,
51 : XML_TOK_GRADIENT_STARTINT,
52 : XML_TOK_GRADIENT_ENDINT,
53 : XML_TOK_GRADIENT_ANGLE,
54 : XML_TOK_GRADIENT_BORDER,
55 : XML_TOK_TABSTOP_END=XML_TOK_UNKNOWN
56 : };
57 :
58 : SvXMLEnumMapEntry const pXML_GradientStyle_Enum[] =
59 : {
60 : { XML_GRADIENTSTYLE_LINEAR, awt::GradientStyle_LINEAR },
61 : { XML_GRADIENTSTYLE_AXIAL, awt::GradientStyle_AXIAL },
62 : { XML_GRADIENTSTYLE_RADIAL, awt::GradientStyle_RADIAL },
63 : { XML_GRADIENTSTYLE_ELLIPSOID, awt::GradientStyle_ELLIPTICAL },
64 : { XML_GRADIENTSTYLE_SQUARE, awt::GradientStyle_SQUARE },
65 : { XML_GRADIENTSTYLE_RECTANGULAR, awt::GradientStyle_RECT },
66 : { XML_TOKEN_INVALID, 0 }
67 : };
68 :
69 : // Import
70 1100 : XMLGradientStyleImport::XMLGradientStyleImport(
71 : SvXMLImport& rImp )
72 1100 : : rImport(rImp)
73 : {
74 1100 : }
75 :
76 1100 : XMLGradientStyleImport::~XMLGradientStyleImport()
77 : {
78 1100 : }
79 :
80 1100 : bool XMLGradientStyleImport::importXML(
81 : const uno::Reference< xml::sax::XAttributeList >& xAttrList,
82 : uno::Any& rValue,
83 : OUString& rStrName )
84 : {
85 : static const SvXMLTokenMapEntry aGradientAttrTokenMap[] =
86 : {
87 : { XML_NAMESPACE_DRAW, XML_NAME, XML_TOK_GRADIENT_NAME },
88 : { XML_NAMESPACE_DRAW, XML_DISPLAY_NAME, XML_TOK_GRADIENT_DISPLAY_NAME },
89 : { XML_NAMESPACE_DRAW, XML_STYLE, XML_TOK_GRADIENT_STYLE },
90 : { XML_NAMESPACE_DRAW, XML_CX, XML_TOK_GRADIENT_CX },
91 : { XML_NAMESPACE_DRAW, XML_CY, XML_TOK_GRADIENT_CY },
92 : { XML_NAMESPACE_DRAW, XML_START_COLOR, XML_TOK_GRADIENT_STARTCOLOR },
93 : { XML_NAMESPACE_DRAW, XML_END_COLOR, XML_TOK_GRADIENT_ENDCOLOR },
94 : { XML_NAMESPACE_DRAW, XML_START_INTENSITY, XML_TOK_GRADIENT_STARTINT },
95 : { XML_NAMESPACE_DRAW, XML_END_INTENSITY, XML_TOK_GRADIENT_ENDINT },
96 : { XML_NAMESPACE_DRAW, XML_GRADIENT_ANGLE, XML_TOK_GRADIENT_ANGLE },
97 : { XML_NAMESPACE_DRAW, XML_GRADIENT_BORDER, XML_TOK_GRADIENT_BORDER },
98 : XML_TOKEN_MAP_END
99 : };
100 :
101 1100 : bool bHasName = false;
102 1100 : bool bHasStyle = false;
103 1100 : bool bHasStartColor = false;
104 1100 : bool bHasEndColor = false;
105 1100 : OUString aDisplayName;
106 :
107 1100 : awt::Gradient aGradient;
108 1100 : aGradient.XOffset = 0;
109 1100 : aGradient.YOffset = 0;
110 1100 : aGradient.StartIntensity = 100;
111 1100 : aGradient.EndIntensity = 100;
112 1100 : aGradient.Angle = 0;
113 1100 : aGradient.Border = 0;
114 :
115 2200 : SvXMLTokenMap aTokenMap( aGradientAttrTokenMap );
116 1100 : SvXMLNamespaceMap& rNamespaceMap = rImport.GetNamespaceMap();
117 :
118 1100 : sal_Int16 nAttrCount = xAttrList.is() ? xAttrList->getLength() : 0;
119 11147 : for( sal_Int16 i=0; i < nAttrCount; i++ )
120 : {
121 10047 : const OUString& rFullAttrName = xAttrList->getNameByIndex( i );
122 20094 : OUString aStrAttrName;
123 10047 : sal_uInt16 nPrefix = rNamespaceMap.GetKeyByAttrName( rFullAttrName, &aStrAttrName );
124 20094 : const OUString& rStrValue = xAttrList->getValueByIndex( i );
125 :
126 : sal_Int32 nTmpValue;
127 :
128 10047 : switch( aTokenMap.Get( nPrefix, aStrAttrName ) )
129 : {
130 : case XML_TOK_GRADIENT_NAME:
131 : {
132 1100 : rStrName = rStrValue;
133 1100 : bHasName = true;
134 : }
135 1100 : break;
136 : case XML_TOK_GRADIENT_DISPLAY_NAME:
137 : {
138 1073 : aDisplayName = rStrValue;
139 : }
140 1073 : break;
141 : case XML_TOK_GRADIENT_STYLE:
142 : {
143 : sal_uInt16 eValue;
144 1100 : if( SvXMLUnitConverter::convertEnum( eValue, rStrValue, pXML_GradientStyle_Enum ) )
145 : {
146 1100 : aGradient.Style = (awt::GradientStyle) eValue;
147 1100 : bHasStyle = true;
148 : }
149 : }
150 1100 : break;
151 : case XML_TOK_GRADIENT_CX:
152 167 : ::sax::Converter::convertPercent( nTmpValue, rStrValue );
153 167 : aGradient.XOffset = static_cast< sal_Int16 >( nTmpValue );
154 167 : break;
155 : case XML_TOK_GRADIENT_CY:
156 167 : ::sax::Converter::convertPercent( nTmpValue, rStrValue );
157 167 : aGradient.YOffset = static_cast< sal_Int16 >( nTmpValue );
158 167 : break;
159 : case XML_TOK_GRADIENT_STARTCOLOR:
160 : {
161 : bHasStartColor = ::sax::Converter::convertColor(
162 1100 : aGradient.StartColor, rStrValue);
163 : }
164 1100 : break;
165 : case XML_TOK_GRADIENT_ENDCOLOR:
166 : {
167 : bHasStartColor = ::sax::Converter::convertColor(
168 1100 : aGradient.EndColor, rStrValue);
169 : }
170 1100 : break;
171 : case XML_TOK_GRADIENT_STARTINT:
172 1099 : ::sax::Converter::convertPercent( nTmpValue, rStrValue );
173 1099 : aGradient.StartIntensity = static_cast< sal_Int16 >( nTmpValue );
174 1099 : break;
175 : case XML_TOK_GRADIENT_ENDINT:
176 1099 : ::sax::Converter::convertPercent( nTmpValue, rStrValue );
177 1099 : aGradient.EndIntensity = static_cast< sal_Int16 >( nTmpValue );
178 1099 : break;
179 : case XML_TOK_GRADIENT_ANGLE:
180 : {
181 : sal_Int32 nValue;
182 942 : ::sax::Converter::convertNumber( nValue, rStrValue, 0, 3600 );
183 942 : aGradient.Angle = sal_Int16( nValue );
184 : }
185 942 : break;
186 : case XML_TOK_GRADIENT_BORDER:
187 1100 : ::sax::Converter::convertPercent( nTmpValue, rStrValue );
188 1100 : aGradient.Border = static_cast< sal_Int16 >( nTmpValue );
189 1100 : break;
190 :
191 : default:
192 : SAL_INFO("xmloff.style", "Unknown token at import gradient style");
193 : }
194 10047 : }
195 :
196 1100 : rValue <<= aGradient;
197 :
198 1100 : if( !aDisplayName.isEmpty() )
199 : {
200 : rImport.AddStyleDisplayName( XML_STYLE_FAMILY_SD_GRADIENT_ID, rStrName,
201 1073 : aDisplayName );
202 1073 : rStrName = aDisplayName;
203 : }
204 :
205 1100 : bool bRet = bHasName && bHasStyle && bHasStartColor && bHasEndColor;
206 :
207 2200 : return bRet;
208 : }
209 :
210 : // Export
211 :
212 386 : XMLGradientStyleExport::XMLGradientStyleExport(
213 : SvXMLExport& rExp )
214 386 : : rExport(rExp)
215 : {
216 386 : }
217 :
218 386 : XMLGradientStyleExport::~XMLGradientStyleExport()
219 : {
220 386 : }
221 :
222 6 : bool XMLGradientStyleExport::exportXML(
223 : const OUString& rStrName,
224 : const uno::Any& rValue )
225 : {
226 6 : bool bRet = false;
227 6 : awt::Gradient aGradient;
228 :
229 6 : if( !rStrName.isEmpty() )
230 : {
231 6 : if( rValue >>= aGradient )
232 : {
233 6 : OUString aStrValue;
234 12 : OUStringBuffer aOut;
235 :
236 : // Style
237 6 : if( !SvXMLUnitConverter::convertEnum( aOut, aGradient.Style, pXML_GradientStyle_Enum ) )
238 : {
239 0 : bRet = false;
240 : }
241 : else
242 : {
243 : // Name
244 6 : bool bEncoded = false;
245 6 : OUString aStrName( rStrName );
246 : rExport.AddAttribute( XML_NAMESPACE_DRAW, XML_NAME,
247 : rExport.EncodeStyleName( aStrName,
248 6 : &bEncoded ) );
249 6 : if( bEncoded )
250 : rExport.AddAttribute( XML_NAMESPACE_DRAW, XML_DISPLAY_NAME,
251 6 : aStrName );
252 :
253 6 : aStrValue = aOut.makeStringAndClear();
254 6 : rExport.AddAttribute( XML_NAMESPACE_DRAW, XML_STYLE, aStrValue );
255 :
256 : // Center x/y
257 8 : if( aGradient.Style != awt::GradientStyle_LINEAR &&
258 2 : aGradient.Style != awt::GradientStyle_AXIAL )
259 : {
260 0 : ::sax::Converter::convertPercent(aOut, aGradient.XOffset);
261 0 : aStrValue = aOut.makeStringAndClear();
262 0 : rExport.AddAttribute( XML_NAMESPACE_DRAW, XML_CX, aStrValue );
263 0 : ::sax::Converter::convertPercent(aOut, aGradient.YOffset);
264 0 : aStrValue = aOut.makeStringAndClear();
265 0 : rExport.AddAttribute( XML_NAMESPACE_DRAW, XML_CY, aStrValue );
266 : }
267 :
268 : // Color start
269 6 : ::sax::Converter::convertColor(aOut, aGradient.StartColor);
270 6 : aStrValue = aOut.makeStringAndClear();
271 6 : rExport.AddAttribute( XML_NAMESPACE_DRAW, XML_START_COLOR, aStrValue );
272 :
273 : // Color end
274 6 : ::sax::Converter::convertColor(aOut, aGradient.EndColor);
275 6 : aStrValue = aOut.makeStringAndClear();
276 6 : rExport.AddAttribute( XML_NAMESPACE_DRAW, XML_END_COLOR, aStrValue );
277 :
278 : // Intensity start
279 6 : ::sax::Converter::convertPercent(aOut, aGradient.StartIntensity);
280 6 : aStrValue = aOut.makeStringAndClear();
281 6 : rExport.AddAttribute( XML_NAMESPACE_DRAW, XML_START_INTENSITY, aStrValue );
282 :
283 : // Intensity end
284 6 : ::sax::Converter::convertPercent(aOut, aGradient.EndIntensity);
285 6 : aStrValue = aOut.makeStringAndClear();
286 6 : rExport.AddAttribute( XML_NAMESPACE_DRAW, XML_END_INTENSITY, aStrValue );
287 :
288 : // Angle
289 6 : if( aGradient.Style != awt::GradientStyle_RADIAL )
290 : {
291 6 : ::sax::Converter::convertNumber(aOut, sal_Int32(aGradient.Angle));
292 6 : aStrValue = aOut.makeStringAndClear();
293 6 : rExport.AddAttribute( XML_NAMESPACE_DRAW, XML_GRADIENT_ANGLE, aStrValue );
294 : }
295 :
296 : // Border
297 6 : ::sax::Converter::convertPercent( aOut, aGradient.Border );
298 6 : aStrValue = aOut.makeStringAndClear();
299 6 : rExport.AddAttribute( XML_NAMESPACE_DRAW, XML_GRADIENT_BORDER, aStrValue );
300 :
301 : // Do Write
302 : SvXMLElementExport aElem( rExport, XML_NAMESPACE_DRAW, XML_GRADIENT,
303 6 : true, false );
304 6 : }
305 : }
306 : }
307 :
308 6 : return bRet;
309 : }
310 :
311 : /* vim:set shiftwidth=4 softtabstop=4 expandtab: */
|