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