xref: /AOO41X/main/xmloff/source/style/XMLFontStylesContext.cxx (revision ff0525f24f03981d56b7579b645949f111420994)
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 
27 #include <com/sun/star/awt/FontFamily.hpp>
28 #include <com/sun/star/awt/FontPitch.hpp>
29 
30 #include <rtl/logfile.hxx>
31 
32 #include <xmloff/nmspmap.hxx>
33 #include "xmloff/xmlnmspe.hxx"
34 #include <xmloff/xmltoken.hxx>
35 #include "fonthdl.hxx"
36 #include <xmloff/xmlimp.hxx>
37 #include <xmloff/maptype.hxx>
38 #include <xmloff/XMLFontStylesContext.hxx>
39 
40 
41 using ::rtl::OUString;
42 using ::rtl::OUStringBuffer;
43 
44 using namespace ::com::sun::star;
45 using namespace ::com::sun::star::uno;
46 using namespace ::com::sun::star::xml::sax;
47 using namespace ::com::sun::star::container;
48 using namespace ::com::sun::star::beans;
49 using namespace ::com::sun::star::lang;
50 using namespace ::com::sun::star::awt;
51 using namespace ::xmloff::token;
52 
53 
54 #define XML_STYLE_FAMILY_FONT 1
55 
56 enum XMLFontStyleAttrTokens
57 {
58     XML_TOK_FONT_STYLE_ATTR_FAMILY,
59     XML_TOK_FONT_STYLE_ATTR_FAMILY_GENERIC,
60     XML_TOK_FONT_STYLE_ATTR_STYLENAME,
61     XML_TOK_FONT_STYLE_ATTR_PITCH,
62     XML_TOK_FONT_STYLE_ATTR_CHARSET,
63 
64     XML_TOK_FONT_STYLE_ATTR_END=XML_TOK_UNKNOWN
65 };
66 
67 const SvXMLTokenMapEntry* lcl_getFontStyleAttrTokenMap()
68 {
69     static __FAR_DATA SvXMLTokenMapEntry aFontStyleAttrTokenMap[] =
70     {
71         { XML_NAMESPACE_SVG, XML_FONT_FAMILY,
72                 XML_TOK_FONT_STYLE_ATTR_FAMILY },
73         { XML_NAMESPACE_STYLE, XML_FONT_FAMILY_GENERIC,
74                 XML_TOK_FONT_STYLE_ATTR_FAMILY_GENERIC },
75         { XML_NAMESPACE_STYLE, XML_FONT_ADORNMENTS,
76                 XML_TOK_FONT_STYLE_ATTR_STYLENAME },
77         { XML_NAMESPACE_STYLE, XML_FONT_PITCH,
78                 XML_TOK_FONT_STYLE_ATTR_PITCH },
79         { XML_NAMESPACE_STYLE, XML_FONT_CHARSET,
80                 XML_TOK_FONT_STYLE_ATTR_CHARSET },
81 
82         XML_TOKEN_MAP_END
83     };
84     return aFontStyleAttrTokenMap;
85 }
86 
87 class XMLFontStyleContext_Impl : public SvXMLStyleContext
88 {
89     Any aFamilyName;
90     Any aStyleName;
91     Any aFamily;
92     Any aPitch;
93     Any aEnc;
94 
95     SvXMLImportContextRef xStyles;
96 
97     XMLFontStylesContext *GetStyles()
98     {
99         return ((XMLFontStylesContext *)&xStyles);
100     }
101 
102 public:
103 
104     TYPEINFO();
105 
106     XMLFontStyleContext_Impl( SvXMLImport& rImport, sal_uInt16 nPrfx,
107             const ::rtl::OUString& rLName,
108             const ::com::sun::star::uno::Reference<
109                 ::com::sun::star::xml::sax::XAttributeList > & xAttrList,
110             XMLFontStylesContext& rStyles );
111     virtual ~XMLFontStyleContext_Impl();
112 
113     void SetAttribute( sal_uInt16 nPrefixKey, const OUString& rLocalName,
114                        const OUString& rValue );
115 
116     void FillProperties( ::std::vector< XMLPropertyState > &rProps,
117                          sal_Int32 nFamilyNameIdx,
118                          sal_Int32 nStyleNameIdx,
119                          sal_Int32 nFamilyIdx,
120                          sal_Int32 nPitchIdx,
121                          sal_Int32 nCharsetIdx ) const;
122 
123 };
124 
125 TYPEINIT1( XMLFontStyleContext_Impl, SvXMLStyleContext );
126 
127 XMLFontStyleContext_Impl::XMLFontStyleContext_Impl( SvXMLImport& rImport,
128         sal_uInt16 nPrfx, const OUString& rLName,
129         const Reference< XAttributeList > & xAttrList,
130         XMLFontStylesContext& rStyles ) :
131     SvXMLStyleContext( rImport, nPrfx, rLName, xAttrList, XML_STYLE_FAMILY_FONT ),
132     xStyles( &rStyles )
133 {
134     OUString sEmpty;
135     aFamilyName <<= sEmpty;
136     aStyleName <<= sEmpty;
137     aFamily <<= (sal_Int16)FontFamily::DONTKNOW;
138     aPitch <<= (sal_Int16)FontPitch::DONTKNOW;
139     aEnc <<= (sal_Int16)rStyles.GetDfltCharset();
140 }
141 
142 void XMLFontStyleContext_Impl::SetAttribute( sal_uInt16 nPrefixKey,
143                                         const OUString& rLocalName,
144                                         const OUString& rValue )
145 {
146     SvXMLUnitConverter& rUnitConv = GetImport().GetMM100UnitConverter();
147     const SvXMLTokenMap& rTokenMap = GetStyles()->GetFontStyleAttrTokenMap();
148     Any aAny;
149 
150     switch( rTokenMap.Get( nPrefixKey, rLocalName ) )
151     {
152     case XML_TOK_FONT_STYLE_ATTR_FAMILY:
153         if( GetStyles()->GetFamilyNameHdl().importXML( rValue, aAny,
154                                                           rUnitConv ) )
155             aFamilyName = aAny;
156         break;
157     case XML_TOK_FONT_STYLE_ATTR_STYLENAME:
158         aStyleName <<= rValue;
159         break;
160     case XML_TOK_FONT_STYLE_ATTR_FAMILY_GENERIC:
161         if( GetStyles()->GetFamilyHdl().importXML( rValue, aAny,
162                                                       rUnitConv ) )
163             aFamily = aAny;
164         break;
165     case XML_TOK_FONT_STYLE_ATTR_PITCH:
166         if( GetStyles()->GetPitchHdl().importXML( rValue, aAny,
167                                                       rUnitConv ) )
168             aPitch = aAny;
169         break;
170     case XML_TOK_FONT_STYLE_ATTR_CHARSET:
171         if( GetStyles()->GetEncodingHdl().importXML( rValue, aAny,
172                                                       rUnitConv ) )
173             aEnc = aAny;
174         break;
175     default:
176         SvXMLStyleContext::SetAttribute( nPrefixKey, rLocalName, rValue );
177         break;
178     }
179 }
180 
181 XMLFontStyleContext_Impl::~XMLFontStyleContext_Impl()
182 {
183 }
184 
185 void XMLFontStyleContext_Impl::FillProperties(
186         ::std::vector< XMLPropertyState > &rProps,
187         sal_Int32 nFamilyNameIdx,
188         sal_Int32 nStyleNameIdx,
189         sal_Int32 nFamilyIdx,
190         sal_Int32 nPitchIdx,
191         sal_Int32 nCharsetIdx ) const
192 {
193     if( nFamilyNameIdx != -1 )
194     {
195         XMLPropertyState aPropState( nFamilyNameIdx, aFamilyName );
196         rProps.push_back( aPropState );
197     }
198     if( nStyleNameIdx != -1 )
199     {
200         XMLPropertyState aPropState( nStyleNameIdx, aStyleName );
201         rProps.push_back( aPropState );
202     }
203     if( nFamilyIdx != -1 )
204     {
205         XMLPropertyState aPropState( nFamilyIdx, aFamily );
206         rProps.push_back( aPropState );
207     }
208     if( nPitchIdx != -1 )
209     {
210         XMLPropertyState aPropState( nPitchIdx, aPitch );
211         rProps.push_back( aPropState );
212     }
213     if( nCharsetIdx != -1 )
214     {
215         XMLPropertyState aPropState( nCharsetIdx, aEnc );
216         rProps.push_back( aPropState );
217     }
218 }
219 
220 SvXMLStyleContext *XMLFontStylesContext::CreateStyleChildContext(
221         sal_uInt16 nPrefix,
222         const ::rtl::OUString& rLocalName,
223         const ::com::sun::star::uno::Reference<
224             ::com::sun::star::xml::sax::XAttributeList > & xAttrList )
225 {
226     SvXMLStyleContext *pStyle;
227     if( XML_NAMESPACE_STYLE == nPrefix &&
228         IsXMLToken( rLocalName, XML_FONT_FACE ) )
229     {
230         pStyle = new XMLFontStyleContext_Impl( GetImport(), nPrefix,
231                                                rLocalName, xAttrList, *this );
232     }
233     else
234     {
235         pStyle = SvXMLStylesContext::CreateStyleChildContext( nPrefix,
236                                                rLocalName, xAttrList );
237     }
238 
239     return pStyle;
240 }
241 
242 TYPEINIT1( XMLFontStylesContext, SvXMLStylesContext );
243 
244 XMLFontStylesContext::XMLFontStylesContext( SvXMLImport& rImport,
245         sal_uInt16 nPrfx, const OUString& rLName,
246         const Reference< XAttributeList > & xAttrList,
247         rtl_TextEncoding eDfltEnc ) :
248     SvXMLStylesContext( rImport, nPrfx, rLName, xAttrList ),
249     pFamilyNameHdl( new XMLFontFamilyNamePropHdl ),
250     pFamilyHdl( new XMLFontFamilyPropHdl ),
251     pPitchHdl( new XMLFontPitchPropHdl ),
252     pEncHdl( new XMLFontEncodingPropHdl ),
253     pFontStyleAttrTokenMap( new SvXMLTokenMap(lcl_getFontStyleAttrTokenMap()) ),
254     eDfltEncoding( eDfltEnc )
255 {
256 }
257 
258 XMLFontStylesContext::~XMLFontStylesContext()
259 {
260     delete pFamilyNameHdl;
261     delete pFamilyHdl;
262     delete pPitchHdl;
263     delete pEncHdl;
264     delete pFontStyleAttrTokenMap;
265 }
266 
267 sal_Bool XMLFontStylesContext::FillProperties( const OUString& rName,
268                          ::std::vector< XMLPropertyState > &rProps,
269                          sal_Int32 nFamilyNameIdx,
270                          sal_Int32 nStyleNameIdx,
271                          sal_Int32 nFamilyIdx,
272                          sal_Int32 nPitchIdx,
273                          sal_Int32 nCharsetIdx ) const
274 {
275     const SvXMLStyleContext* pStyle = FindStyleChildContext( XML_STYLE_FAMILY_FONT, rName, sal_True );
276     const XMLFontStyleContext_Impl *pFontStyle = PTR_CAST( XMLFontStyleContext_Impl,pStyle);// use temp var, PTR_CAST is a bad macro, FindStyleChildContext will be called twice
277     if( pFontStyle )
278         pFontStyle->FillProperties( rProps, nFamilyNameIdx, nStyleNameIdx,
279                                     nFamilyIdx, nPitchIdx, nCharsetIdx );
280     return 0 != pFontStyle;
281 }
282