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/themeelementscontext.hxx"
25 #include "oox/drawingml/clrschemecontext.hxx"
26 #include "oox/drawingml/lineproperties.hxx"
27 #include "oox/drawingml/linepropertiescontext.hxx"
28 #include "oox/drawingml/fillproperties.hxx"
29 #include "oox/drawingml/fillpropertiesgroupcontext.hxx"
30 #include "oox/drawingml/theme.hxx"
31 #include "oox/helper/attributelist.hxx"
32
33 using ::rtl::OUString;
34 using namespace ::oox::core;
35 using namespace ::com::sun::star::uno;
36 using namespace ::com::sun::star::xml::sax;
37
38 namespace oox {
39 namespace drawingml {
40
41 // ============================================================================
42
43 class FillStyleListContext : public ContextHandler
44 {
45 public:
46 FillStyleListContext( ContextHandler& rParent, FillStyleList& rFillStyleList );
47 virtual Reference< XFastContextHandler > SAL_CALL createFastChildContext( sal_Int32 nElement, const Reference< XFastAttributeList >& Attribs ) throw (SAXException, RuntimeException);
48
49 private:
50 FillStyleList& mrFillStyleList;
51 };
52
FillStyleListContext(ContextHandler & rParent,FillStyleList & rFillStyleList)53 FillStyleListContext::FillStyleListContext( ContextHandler& rParent, FillStyleList& rFillStyleList ) :
54 ContextHandler( rParent ),
55 mrFillStyleList( rFillStyleList )
56 {
57 }
58
createFastChildContext(sal_Int32 nElement,const Reference<XFastAttributeList> & xAttribs)59 Reference< XFastContextHandler > FillStyleListContext::createFastChildContext( sal_Int32 nElement, const Reference< XFastAttributeList >& xAttribs )
60 throw (SAXException, RuntimeException)
61 {
62 switch( nElement )
63 {
64 case A_TOKEN( noFill ):
65 case A_TOKEN( solidFill ):
66 case A_TOKEN( gradFill ):
67 case A_TOKEN( blipFill ):
68 case A_TOKEN( pattFill ):
69 case A_TOKEN( grpFill ):
70 mrFillStyleList.push_back( FillPropertiesPtr( new FillProperties ) );
71 return FillPropertiesContext::createFillContext( *this, nElement, xAttribs, *mrFillStyleList.back() );
72 }
73 return 0;
74 }
75
76 // ============================================================================
77
78 class LineStyleListContext : public ContextHandler
79 {
80 public:
81 LineStyleListContext( ContextHandler& rParent, LineStyleList& rLineStyleList );
82 virtual Reference< XFastContextHandler > SAL_CALL createFastChildContext( sal_Int32 nElement, const Reference< XFastAttributeList >& Attribs ) throw (SAXException, RuntimeException);
83
84 private:
85 LineStyleList& mrLineStyleList;
86 };
87
LineStyleListContext(ContextHandler & rParent,LineStyleList & rLineStyleList)88 LineStyleListContext::LineStyleListContext( ContextHandler& rParent, LineStyleList& rLineStyleList ) :
89 ContextHandler( rParent ),
90 mrLineStyleList( rLineStyleList )
91 {
92 }
93
createFastChildContext(sal_Int32 nElement,const Reference<XFastAttributeList> & xAttribs)94 Reference< XFastContextHandler > LineStyleListContext::createFastChildContext( sal_Int32 nElement, const Reference< XFastAttributeList >& xAttribs )
95 throw (SAXException, RuntimeException)
96 {
97 switch( nElement )
98 {
99 case A_TOKEN( ln ):
100 mrLineStyleList.push_back( LinePropertiesPtr( new LineProperties ) );
101 return new LinePropertiesContext( *this, xAttribs, *mrLineStyleList.back() );
102 }
103 return 0;
104 }
105
106 // ============================================================================
107
108 class EffectStyleListContext : public ContextHandler
109 {
110 public:
111 EffectStyleListContext( ContextHandler& rParent, EffectStyleList& rEffectStyleList );
112 virtual Reference< XFastContextHandler > SAL_CALL createFastChildContext( sal_Int32 nElement, const Reference< XFastAttributeList >& Attribs ) throw (SAXException, RuntimeException);
113
114 private:
115 EffectStyleList& mrEffectStyleList;
116 };
117
EffectStyleListContext(ContextHandler & rParent,EffectStyleList & rEffectStyleList)118 EffectStyleListContext::EffectStyleListContext( ContextHandler& rParent, EffectStyleList& rEffectStyleList ) :
119 ContextHandler( rParent ),
120 mrEffectStyleList( rEffectStyleList )
121 {
122 }
123
createFastChildContext(sal_Int32 nElement,const Reference<XFastAttributeList> &)124 Reference< XFastContextHandler > EffectStyleListContext::createFastChildContext( sal_Int32 nElement, const Reference< XFastAttributeList >& /*xAttribs*/ ) throw (SAXException, RuntimeException)
125 {
126 switch( nElement )
127 {
128 case A_TOKEN( effectStyle ):
129 mrEffectStyleList.push_back( EffectStyleList::value_type( new PropertyMap ) );
130 // TODO: import effect styles
131 return 0;
132 }
133 return 0;
134 }
135
136 // ============================================================================
137
138 class FontSchemeContext : public ContextHandler
139 {
140 public:
141 FontSchemeContext( ContextHandler& rParent, FontScheme& rFontScheme );
142 virtual Reference< XFastContextHandler > SAL_CALL createFastChildContext( sal_Int32 nElement, const Reference< XFastAttributeList >& Attribs ) throw (SAXException, RuntimeException);
143 virtual void SAL_CALL endFastElement( sal_Int32 nElement ) throw (SAXException, RuntimeException);
144
145 private:
146 FontScheme& mrFontScheme;
147 TextCharacterPropertiesPtr mxCharProps;
148 };
149
FontSchemeContext(ContextHandler & rParent,FontScheme & rFontScheme)150 FontSchemeContext::FontSchemeContext( ContextHandler& rParent, FontScheme& rFontScheme ) :
151 ContextHandler( rParent ),
152 mrFontScheme( rFontScheme )
153 {
154 }
155
createFastChildContext(sal_Int32 nElement,const Reference<XFastAttributeList> & rxAttribs)156 Reference< XFastContextHandler > FontSchemeContext::createFastChildContext( sal_Int32 nElement, const Reference< XFastAttributeList >& rxAttribs )
157 throw (SAXException, RuntimeException)
158 {
159 AttributeList aAttribs( rxAttribs );
160 switch( nElement )
161 {
162 case A_TOKEN( majorFont ):
163 mxCharProps.reset( new TextCharacterProperties );
164 mrFontScheme[ XML_major ] = mxCharProps;
165 return this;
166 case A_TOKEN( minorFont ):
167 mxCharProps.reset( new TextCharacterProperties );
168 mrFontScheme[ XML_minor ] = mxCharProps;
169 return this;
170
171 case A_TOKEN( latin ):
172 if( mxCharProps.get() )
173 mxCharProps->maLatinFont.setAttributes( aAttribs );
174 break;
175 case A_TOKEN( ea ):
176 if( mxCharProps.get() )
177 mxCharProps->maAsianFont.setAttributes( aAttribs );
178 break;
179 case A_TOKEN( cs ):
180 if( mxCharProps.get() )
181 mxCharProps->maComplexFont.setAttributes( aAttribs );
182 break;
183 }
184 return 0;
185 }
186
endFastElement(sal_Int32 nElement)187 void FontSchemeContext::endFastElement( sal_Int32 nElement ) throw (SAXException, RuntimeException)
188 {
189 switch( nElement )
190 {
191 case A_TOKEN( majorFont ):
192 case A_TOKEN( minorFont ):
193 mxCharProps.reset();
194 break;
195 }
196 }
197
198 // ============================================================================
199
ThemeElementsContext(ContextHandler & rParent,Theme & rTheme)200 ThemeElementsContext::ThemeElementsContext( ContextHandler& rParent, Theme& rTheme ) :
201 ContextHandler( rParent ),
202 mrTheme( rTheme )
203 {
204 }
205
createFastChildContext(sal_Int32 nElement,const Reference<XFastAttributeList> & xAttribs)206 Reference< XFastContextHandler > ThemeElementsContext::createFastChildContext( sal_Int32 nElement, const Reference< XFastAttributeList >& xAttribs ) throw (SAXException, RuntimeException)
207 {
208 // CT_BaseStyles
209 Reference< XFastContextHandler > xRet;
210 switch( nElement )
211 {
212 case A_TOKEN( clrScheme ): // CT_ColorScheme
213 return new clrSchemeContext( *this, mrTheme.getClrScheme() );
214 case A_TOKEN( fontScheme ): // CT_FontScheme
215 return new FontSchemeContext( *this, mrTheme.getFontScheme() );
216
217 case A_TOKEN( fmtScheme ): // CT_StyleMatrix
218 mrTheme.setStyleName( xAttribs->getOptionalValue( XML_name ) );
219 return this;
220
221 case A_TOKEN( fillStyleLst ): // CT_FillStyleList
222 return new FillStyleListContext( *this, mrTheme.getFillStyleList() );
223 case A_TOKEN( lnStyleLst ): // CT_LineStyleList
224 return new LineStyleListContext( *this, mrTheme.getLineStyleList() );
225 case A_TOKEN( effectStyleLst ): // CT_EffectStyleList
226 return new EffectStyleListContext( *this, mrTheme.getEffectStyleList() );
227 case A_TOKEN( bgFillStyleLst ): // CT_BackgroundFillStyleList
228 return new FillStyleListContext( *this, mrTheme.getBgFillStyleList() );
229 }
230 return 0;
231 }
232
233 // ============================================================================
234
235 } // namespace drawingml
236 } // namespace oox
237
238