Line data Source code
1 : /* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
2 : /*
3 : * This file is part of the LibreOffice project.
4 : *
5 : * This Source Code Form is subject to the terms of the Mozilla Public
6 : * License, v. 2.0. If a copy of the MPL was not distributed with this
7 : * file, You can obtain one at http://mozilla.org/MPL/2.0/.
8 : *
9 : * This file incorporates work covered by the following license notice:
10 : *
11 : * Licensed to the Apache Software Foundation (ASF) under one or more
12 : * contributor license agreements. See the NOTICE file distributed
13 : * with this work for additional information regarding copyright
14 : * ownership. The ASF licenses this file to you under the Apache
15 : * License, Version 2.0 (the "License"); you may not use this file
16 : * except in compliance with the License. You may obtain a copy of
17 : * the License at http://www.apache.org/licenses/LICENSE-2.0 .
18 : */
19 :
20 : #include <fonthdl.hxx>
21 :
22 : #include <sax/tools/converter.hxx>
23 :
24 : #include <xmloff/xmltoken.hxx>
25 : #include <xmloff/xmluconv.hxx>
26 : #include <rtl/ustrbuf.hxx>
27 : #include <com/sun/star/uno/Any.hxx>
28 : #include <tools/fontenum.hxx>
29 :
30 : using namespace ::com::sun::star;
31 : using namespace ::xmloff::token;
32 :
33 9349 : static const SvXMLEnumMapEntry* lcl_getFontFamilyGenericMapping()
34 : {
35 : static SvXMLEnumMapEntry const aFontFamilyGenericMapping[] =
36 : {
37 : { XML_DECORATIVE, FAMILY_DECORATIVE },
38 :
39 : { XML_MODERN, FAMILY_MODERN },
40 : { XML_ROMAN, FAMILY_ROMAN },
41 : { XML_SCRIPT, FAMILY_SCRIPT },
42 : { XML_SWISS, FAMILY_SWISS },
43 : { XML_SYSTEM, FAMILY_SYSTEM },
44 : { XML_TOKEN_INVALID, 0 }
45 : };
46 9349 : return aFontFamilyGenericMapping;
47 : }
48 :
49 : static SvXMLEnumMapEntry const aFontPitchMapping[] =
50 : {
51 : { XML_FIXED, PITCH_FIXED },
52 : { XML_VARIABLE, PITCH_VARIABLE },
53 : { XML_TOKEN_INVALID, 0 }
54 : };
55 :
56 : // class XMLFontFamilyNamePropHdl
57 :
58 27020 : XMLFontFamilyNamePropHdl::~XMLFontFamilyNamePropHdl()
59 : {
60 : // Nothing to do
61 27020 : }
62 :
63 11645 : bool XMLFontFamilyNamePropHdl::importXML( const OUString& rStrImpValue, uno::Any& rValue, const SvXMLUnitConverter& ) const
64 : {
65 11645 : bool bRet = false;
66 11645 : OUStringBuffer sValue;
67 11645 : sal_Int32 nPos = 0;
68 :
69 11798 : do
70 : {
71 11798 : sal_Int32 nFirst = nPos;
72 11798 : nPos = ::sax::Converter::indexOfComma( rStrImpValue, nPos );
73 11798 : sal_Int32 nLast = (-1 == nPos ? rStrImpValue.getLength() - 1 : nPos - 1);
74 :
75 : // skip trailing blanks
76 23596 : while( nLast > nFirst && ' ' == rStrImpValue[nLast] )
77 0 : nLast--;
78 :
79 : // skip leading blanks
80 23749 : while(nFirst <= nLast && ' ' == rStrImpValue[nFirst])
81 153 : nFirst++;
82 :
83 : // remove quotes
84 11798 : sal_Unicode c = nFirst > nLast ? 0 : rStrImpValue[nFirst];
85 11798 : if( nFirst < nLast && ('\'' == c || '\"' == c) && rStrImpValue[nLast] == c )
86 : {
87 6061 : nFirst++;
88 6061 : nLast--;
89 : }
90 :
91 11798 : if( nFirst <= nLast )
92 : {
93 11768 : if( !sValue.isEmpty() )
94 153 : sValue.append(';');
95 :
96 11768 : sValue.append(rStrImpValue.copy( nFirst, nLast-nFirst+1));
97 : }
98 :
99 11798 : if( -1 != nPos )
100 153 : nPos++;
101 : }
102 : while( -1 != nPos );
103 :
104 11645 : if (!sValue.isEmpty())
105 : {
106 11615 : rValue <<= sValue.makeStringAndClear();
107 11615 : bRet = true;
108 : }
109 :
110 11645 : return bRet;
111 : }
112 :
113 4309 : bool XMLFontFamilyNamePropHdl::exportXML( OUString& rStrExpValue, const uno::Any& rValue, const SvXMLUnitConverter& ) const
114 : {
115 4309 : bool bRet = false;
116 4309 : OUString aStrFamilyName;
117 :
118 4309 : if( rValue >>= aStrFamilyName )
119 : {
120 4309 : OUStringBuffer sValue( aStrFamilyName.getLength() + 2 );
121 4309 : sal_Int32 nPos = 0;
122 4309 : do
123 : {
124 4309 : sal_Int32 nFirst = nPos;
125 4309 : nPos = aStrFamilyName.indexOf( ';', nPos );
126 4309 : sal_Int32 nLast = (-1 == nPos ? aStrFamilyName.getLength() : nPos);
127 :
128 : // Set position to the character behind the ';', so we won't
129 : // forget this.
130 4309 : if( -1L != nPos )
131 0 : nPos++;
132 :
133 : // If the property value was empty, we stop now.
134 : // If there is a ';' at the first position, the empty name
135 : // at the start will be removed.
136 4309 : if( 0L == nLast )
137 8 : continue;
138 :
139 : // nFirst and nLast now denote the first and last character of
140 : // one font name.
141 4301 : nLast--;
142 :
143 : // skip trailing blanks
144 8602 : while( nLast > nFirst && ' ' == aStrFamilyName[nLast] )
145 0 : nLast--;
146 :
147 : // skip leading blanks
148 8602 : while( nFirst <= nLast && ' ' == aStrFamilyName[nFirst] )
149 0 : nFirst++;
150 :
151 4301 : if( nFirst <= nLast )
152 : {
153 4301 : if( !sValue.isEmpty() )
154 : {
155 0 : sValue.append( ',' );
156 0 : sValue.append( ' ' );
157 : }
158 4301 : sal_Int32 nLen = nLast-nFirst+1;
159 4301 : OUString sFamily( aStrFamilyName.copy( nFirst, nLen ) );
160 4301 : bool bQuote = false;
161 35463 : for( sal_Int32 i=0; i < nLen; i++ )
162 : {
163 32914 : sal_Unicode c = sFamily[i];
164 32914 : if( ' ' == c || ',' == c )
165 : {
166 1752 : bQuote = true;
167 1752 : break;
168 : }
169 : }
170 4301 : if( bQuote )
171 1752 : sValue.append( '\'' );
172 4301 : sValue.append( sFamily );
173 4301 : if( bQuote )
174 1752 : sValue.append( '\'' );
175 : }
176 : }
177 : while( -1L != nPos );
178 :
179 4309 : rStrExpValue = sValue.makeStringAndClear();
180 :
181 4309 : bRet = true;
182 : }
183 :
184 4309 : return bRet;
185 : }
186 :
187 : // class XMLFontFamilyPropHdl
188 :
189 27674 : XMLFontFamilyPropHdl::~XMLFontFamilyPropHdl()
190 : {
191 : // Nothing to do
192 27674 : }
193 :
194 7242 : bool XMLFontFamilyPropHdl::importXML( const OUString& rStrImpValue, uno::Any& rValue, const SvXMLUnitConverter& ) const
195 : {
196 : sal_uInt16 eNewFamily;
197 7242 : bool bRet = SvXMLUnitConverter::convertEnum( eNewFamily, rStrImpValue, lcl_getFontFamilyGenericMapping() );
198 7242 : if( bRet )
199 7242 : rValue <<= (sal_Int16)eNewFamily;
200 :
201 7242 : return bRet;
202 : }
203 :
204 4313 : bool XMLFontFamilyPropHdl::exportXML( OUString& rStrExpValue, const uno::Any& rValue, const SvXMLUnitConverter& ) const
205 : {
206 4313 : bool bRet = false;
207 4313 : OUStringBuffer aOut;
208 :
209 4313 : sal_Int16 nFamily = sal_Int16();
210 4313 : if( rValue >>= nFamily )
211 : {
212 4313 : FontFamily eFamily = (FontFamily)nFamily;
213 4313 : if( eFamily != FAMILY_DONTKNOW )
214 2107 : bRet = SvXMLUnitConverter::convertEnum( aOut, eFamily, lcl_getFontFamilyGenericMapping() );
215 : }
216 :
217 4313 : rStrExpValue = aOut.makeStringAndClear();
218 :
219 4313 : return bRet;
220 : }
221 :
222 : // class XMLFontEncodingPropHdl
223 :
224 27674 : XMLFontEncodingPropHdl::~XMLFontEncodingPropHdl()
225 : {
226 : // Nothing to do
227 27674 : }
228 :
229 488 : bool XMLFontEncodingPropHdl::importXML( const OUString& rStrImpValue, uno::Any& rValue, const SvXMLUnitConverter& ) const
230 : {
231 488 : bool bRet = true;
232 :
233 488 : if( IsXMLToken( rStrImpValue, XML_X_SYMBOL ) )
234 488 : rValue <<= (sal_Int16) RTL_TEXTENCODING_SYMBOL;
235 :
236 488 : return bRet;
237 : }
238 :
239 2846 : bool XMLFontEncodingPropHdl::exportXML( OUString& rStrExpValue, const uno::Any& rValue, const SvXMLUnitConverter& ) const
240 : {
241 2846 : bool bRet = false;
242 2846 : OUStringBuffer aOut;
243 2846 : sal_Int16 nSet = sal_Int16();
244 :
245 2846 : if( rValue >>= nSet )
246 : {
247 2846 : if( (rtl_TextEncoding)nSet == RTL_TEXTENCODING_SYMBOL )
248 : {
249 47 : aOut.append( GetXMLToken(XML_X_SYMBOL) );
250 47 : rStrExpValue = aOut.makeStringAndClear();
251 47 : bRet = true;
252 : }
253 : }
254 :
255 2846 : return bRet;
256 : }
257 :
258 : // class XMLFontPitchPropHdl
259 :
260 27674 : XMLFontPitchPropHdl::~XMLFontPitchPropHdl()
261 : {
262 : // Nothing to do
263 27674 : }
264 :
265 6856 : bool XMLFontPitchPropHdl::importXML( const OUString& rStrImpValue, uno::Any& rValue, const SvXMLUnitConverter& ) const
266 : {
267 : sal_uInt16 eNewPitch;
268 6856 : bool bRet = SvXMLUnitConverter::convertEnum( eNewPitch, rStrImpValue, aFontPitchMapping );
269 6856 : if( bRet )
270 6856 : rValue <<= (sal_Int16)eNewPitch;
271 :
272 6856 : return bRet;
273 : }
274 :
275 4313 : bool XMLFontPitchPropHdl::exportXML( OUString& rStrExpValue, const uno::Any& rValue, const SvXMLUnitConverter& ) const
276 : {
277 4313 : bool bRet = false;
278 4313 : sal_Int16 nPitch = sal_Int16();
279 4313 : OUStringBuffer aOut;
280 :
281 4313 : FontPitch ePitch = PITCH_DONTKNOW;
282 4313 : if( rValue >>= nPitch )
283 4313 : ePitch = (FontPitch)nPitch;
284 :
285 4313 : if( PITCH_DONTKNOW != ePitch )
286 : {
287 1829 : bRet = SvXMLUnitConverter::convertEnum( aOut, ePitch, aFontPitchMapping, XML_FIXED );
288 1829 : rStrExpValue = aOut.makeStringAndClear();
289 : }
290 :
291 4313 : return bRet;
292 : }
293 :
294 : /* vim:set shiftwidth=4 softtabstop=4 expandtab: */
|