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 #include "oox/drawingml/shapepropertymap.hxx"
25
26 #include <com/sun/star/awt/Gradient.hpp>
27 #include <com/sun/star/beans/NamedValue.hpp>
28 #include <com/sun/star/drawing/LineDash.hpp>
29 #include <com/sun/star/drawing/PolyPolygonBezierCoords.hpp>
30 #include "oox/helper/modelobjecthelper.hxx"
31
32 namespace oox {
33 namespace drawingml {
34
35 // ============================================================================
36
37 using namespace ::com::sun::star::awt;
38 using namespace ::com::sun::star::beans;
39 using namespace ::com::sun::star::drawing;
40 using namespace ::com::sun::star::uno;
41
42 using ::rtl::OUString;
43
44 // ============================================================================
45
46 namespace {
47
48 static const sal_Int32 spnDefaultShapeIds[ SHAPEPROP_END ] =
49 {
50 PROP_LineStyle, PROP_LineWidth, PROP_LineColor, PROP_LineTransparence, PROP_LineDash, PROP_LineJoint,
51 PROP_LineStartName, PROP_LineStartWidth, PROP_LineStartCenter, PROP_LineEndName, PROP_LineEndWidth, PROP_LineEndCenter,
52 PROP_FillStyle, PROP_FillColor, PROP_FillTransparence, PROP_FillGradient,
53 PROP_FillBitmapURL, PROP_FillBitmapMode, PROP_FillBitmapSizeX, PROP_FillBitmapSizeY,
54 PROP_FillBitmapPositionOffsetX, PROP_FillBitmapPositionOffsetY, PROP_FillBitmapRectanglePoint
55 };
56
57 } // namespace
58
59 ShapePropertyInfo ShapePropertyInfo::DEFAULT( spnDefaultShapeIds, true, false, false, false );
60
ShapePropertyInfo(const sal_Int32 * pnPropertyIds,bool bNamedLineMarker,bool bNamedLineDash,bool bNamedFillGradient,bool bNamedFillBitmapUrl)61 ShapePropertyInfo::ShapePropertyInfo( const sal_Int32* pnPropertyIds,
62 bool bNamedLineMarker, bool bNamedLineDash, bool bNamedFillGradient, bool bNamedFillBitmapUrl ) :
63 mpnPropertyIds( pnPropertyIds ),
64 mbNamedLineMarker( bNamedLineMarker ),
65 mbNamedLineDash( bNamedLineDash ),
66 mbNamedFillGradient( bNamedFillGradient ),
67 mbNamedFillBitmapUrl( bNamedFillBitmapUrl )
68 {
69 OSL_ENSURE( mpnPropertyIds != 0, "ShapePropertyInfo::ShapePropertyInfo - missing property identifiers" );
70 }
71
72 // ============================================================================
73
ShapePropertyMap(ModelObjectHelper & rModelObjHelper,const ShapePropertyInfo & rShapePropInfo)74 ShapePropertyMap::ShapePropertyMap( ModelObjectHelper& rModelObjHelper, const ShapePropertyInfo& rShapePropInfo ) :
75 mrModelObjHelper( rModelObjHelper ),
76 maShapePropInfo( rShapePropInfo )
77 {
78 }
79
supportsProperty(ShapePropertyId ePropId) const80 bool ShapePropertyMap::supportsProperty( ShapePropertyId ePropId ) const
81 {
82 return maShapePropInfo.has( ePropId );
83 }
84
hasNamedLineMarkerInTable(const OUString & rMarkerName) const85 bool ShapePropertyMap::hasNamedLineMarkerInTable( const OUString& rMarkerName ) const
86 {
87 return maShapePropInfo.mbNamedLineMarker && mrModelObjHelper.hasLineMarker( rMarkerName );
88 }
89
setAnyProperty(ShapePropertyId ePropId,const Any & rValue)90 bool ShapePropertyMap::setAnyProperty( ShapePropertyId ePropId, const Any& rValue )
91 {
92 // get current property identifier for the specified property
93 sal_Int32 nPropId = maShapePropInfo[ ePropId ];
94 if( nPropId < 0 ) return false;
95
96 // special handling for properties supporting named objects in tables
97 switch( ePropId )
98 {
99 case SHAPEPROP_LineStart:
100 case SHAPEPROP_LineEnd:
101 return setLineMarker( nPropId, rValue );
102
103 case SHAPEPROP_LineDash:
104 return setLineDash( nPropId, rValue );
105
106 case SHAPEPROP_FillGradient:
107 return setFillGradient( nPropId, rValue );
108
109 case SHAPEPROP_FillBitmapUrl:
110 return setFillBitmapUrl( nPropId, rValue );
111
112 default:; // suppress compiler warnings
113 }
114
115 // set plain property value
116 operator[]( nPropId ) = rValue;
117 return true;
118 }
119
120 // private --------------------------------------------------------------------
121
setLineMarker(sal_Int32 nPropId,const Any & rValue)122 bool ShapePropertyMap::setLineMarker( sal_Int32 nPropId, const Any& rValue )
123 {
124 NamedValue aNamedMarker;
125 if( (rValue >>= aNamedMarker) && (aNamedMarker.Name.getLength() > 0) )
126 {
127 // push line marker explicitly
128 if( !maShapePropInfo.mbNamedLineMarker )
129 return setAnyProperty( nPropId, aNamedMarker.Value );
130
131 // create named line marker (if coordinates have been passed) and push its name
132 bool bInserted = !aNamedMarker.Value.has< PolyPolygonBezierCoords >() ||
133 mrModelObjHelper.insertLineMarker( aNamedMarker.Name, aNamedMarker.Value.get< PolyPolygonBezierCoords >() );
134 return bInserted && setProperty( nPropId, aNamedMarker.Name );
135 }
136 return false;
137 }
138
setLineDash(sal_Int32 nPropId,const Any & rValue)139 bool ShapePropertyMap::setLineDash( sal_Int32 nPropId, const Any& rValue )
140 {
141 // push line dash explicitly
142 if( !maShapePropInfo.mbNamedLineDash )
143 return setAnyProperty( nPropId, rValue );
144
145 // create named line dash and push its name
146 if( rValue.has< LineDash >() )
147 {
148 OUString aDashName = mrModelObjHelper.insertLineDash( rValue.get< LineDash >() );
149 return (aDashName.getLength() > 0) && setProperty( nPropId, aDashName );
150 }
151
152 return false;
153 }
154
setFillGradient(sal_Int32 nPropId,const Any & rValue)155 bool ShapePropertyMap::setFillGradient( sal_Int32 nPropId, const Any& rValue )
156 {
157 // push gradient explicitly
158 if( !maShapePropInfo.mbNamedFillGradient )
159 return setAnyProperty( nPropId, rValue );
160
161 // create named gradient and push its name
162 if( rValue.has< Gradient >() )
163 {
164 OUString aGradientName = mrModelObjHelper.insertFillGradient( rValue.get< Gradient >() );
165 return (aGradientName.getLength() > 0) && setProperty( nPropId, aGradientName );
166 }
167
168 return false;
169 }
170
setFillBitmapUrl(sal_Int32 nPropId,const Any & rValue)171 bool ShapePropertyMap::setFillBitmapUrl( sal_Int32 nPropId, const Any& rValue )
172 {
173 // push bitmap URL explicitly
174 if( !maShapePropInfo.mbNamedFillBitmapUrl )
175 return setAnyProperty( nPropId, rValue );
176
177 // create named bitmap URL and push its name
178 if( rValue.has< OUString >() )
179 {
180 OUString aBitmapUrlName = mrModelObjHelper.insertFillBitmapUrl( rValue.get< OUString >() );
181 return (aBitmapUrlName.getLength() > 0) && setProperty( nPropId, aBitmapUrlName );
182 }
183
184 return false;
185 }
186
187 // ============================================================================
188
189 } // namespace drawingml
190 } // namespace oox
191