xref: /AOO41X/main/xmloff/source/style/XMLFontStylesContext.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 
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 
lcl_getFontStyleAttrTokenMap()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 
GetStyles()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 
XMLFontStyleContext_Impl(SvXMLImport & rImport,sal_uInt16 nPrfx,const OUString & rLName,const Reference<XAttributeList> & xAttrList,XMLFontStylesContext & rStyles)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 
SetAttribute(sal_uInt16 nPrefixKey,const OUString & rLocalName,const OUString & rValue)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 
~XMLFontStyleContext_Impl()181 XMLFontStyleContext_Impl::~XMLFontStyleContext_Impl()
182 {
183 }
184 
FillProperties(::std::vector<XMLPropertyState> & rProps,sal_Int32 nFamilyNameIdx,sal_Int32 nStyleNameIdx,sal_Int32 nFamilyIdx,sal_Int32 nPitchIdx,sal_Int32 nCharsetIdx) const185 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 
CreateStyleChildContext(sal_uInt16 nPrefix,const::rtl::OUString & rLocalName,const::com::sun::star::uno::Reference<::com::sun::star::xml::sax::XAttributeList> & xAttrList)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 
XMLFontStylesContext(SvXMLImport & rImport,sal_uInt16 nPrfx,const OUString & rLName,const Reference<XAttributeList> & xAttrList,rtl_TextEncoding eDfltEnc)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 
~XMLFontStylesContext()258 XMLFontStylesContext::~XMLFontStylesContext()
259 {
260     delete pFamilyNameHdl;
261     delete pFamilyHdl;
262     delete pPitchHdl;
263     delete pEncHdl;
264     delete pFontStyleAttrTokenMap;
265 }
266 
FillProperties(const OUString & rName,::std::vector<XMLPropertyState> & rProps,sal_Int32 nFamilyNameIdx,sal_Int32 nStyleNameIdx,sal_Int32 nFamilyIdx,sal_Int32 nPitchIdx,sal_Int32 nCharsetIdx) const267 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