LibreOffice Module xmloff (master)  1
fonthdl.cxx
Go to the documentation of this file.
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 <sal/config.h>
21 
22 #include <string_view>
23 
24 #include "fonthdl.hxx"
25 
26 #include <sax/tools/converter.hxx>
27 
28 #include <xmloff/xmltoken.hxx>
29 #include <xmloff/xmluconv.hxx>
30 #include <xmloff/xmlement.hxx>
31 #include <rtl/ustrbuf.hxx>
32 #include <com/sun/star/uno/Any.hxx>
33 #include <tools/fontenum.hxx>
34 
35 using namespace ::com::sun::star;
36 using namespace ::xmloff::token;
37 
39 {
40  static SvXMLEnumMapEntry<FontFamily> const aFontFamilyGenericMapping[] =
41  {
43 
50  };
51  return aFontFamilyGenericMapping;
52 }
53 
55 {
59 };
60 
61 
63 {
64  // Nothing to do
65 }
66 
67 bool XMLFontFamilyNamePropHdl::importXML( const OUString& rStrImpValue, uno::Any& rValue, const SvXMLUnitConverter& ) const
68 {
69  bool bRet = false;
70  OUStringBuffer sValue;
71  sal_Int32 nPos = 0;
72 
73  do
74  {
75  sal_Int32 nFirst = nPos;
76  nPos = ::sax::Converter::indexOfComma( rStrImpValue, nPos );
77  sal_Int32 nLast = (-1 == nPos ? rStrImpValue.getLength() - 1 : nPos - 1);
78 
79  // skip trailing blanks
80  while( nLast > nFirst && ' ' == rStrImpValue[nLast] )
81  nLast--;
82 
83  // skip leading blanks
84  while(nFirst <= nLast && ' ' == rStrImpValue[nFirst])
85  nFirst++;
86 
87  // remove quotes
88  sal_Unicode c = nFirst > nLast ? 0 : rStrImpValue[nFirst];
89  if( nFirst < nLast && ('\'' == c || '\"' == c) && rStrImpValue[nLast] == c )
90  {
91  nFirst++;
92  nLast--;
93  }
94 
95  if( nFirst <= nLast )
96  {
97  if( !sValue.isEmpty() )
98  sValue.append(';');
99 
100  sValue.append(std::u16string_view(rStrImpValue).substr(nFirst, nLast-nFirst+1));
101  }
102 
103  if( -1 != nPos )
104  nPos++;
105  }
106  while( -1 != nPos );
107 
108  if (!sValue.isEmpty())
109  {
110  rValue <<= sValue.makeStringAndClear();
111  bRet = true;
112  }
113 
114  return bRet;
115 }
116 
117 bool XMLFontFamilyNamePropHdl::exportXML( OUString& rStrExpValue, const uno::Any& rValue, const SvXMLUnitConverter& ) const
118 {
119  bool bRet = false;
120  OUString aStrFamilyName;
121 
122  if( rValue >>= aStrFamilyName )
123  {
124  OUStringBuffer sValue( aStrFamilyName.getLength() + 2 );
125  sal_Int32 nPos = 0;
126  do
127  {
128  sal_Int32 nFirst = nPos;
129  nPos = aStrFamilyName.indexOf( ';', nPos );
130  sal_Int32 nLast = (-1 == nPos ? aStrFamilyName.getLength() : nPos);
131 
132  // Set position to the character behind the ';', so we won't
133  // forget this.
134  if( -1 != nPos )
135  nPos++;
136 
137  // If the property value was empty, we stop now.
138  // If there is a ';' at the first position, the empty name
139  // at the start will be removed.
140  if( 0 == nLast )
141  continue;
142 
143  // nFirst and nLast now denote the first and last character of
144  // one font name.
145  nLast--;
146 
147  // skip trailing blanks
148  while( nLast > nFirst && ' ' == aStrFamilyName[nLast] )
149  nLast--;
150 
151  // skip leading blanks
152  while( nFirst <= nLast && ' ' == aStrFamilyName[nFirst] )
153  nFirst++;
154 
155  if( nFirst <= nLast )
156  {
157  if( !sValue.isEmpty() )
158  {
159  sValue.append( ',' );
160  sValue.append( ' ' );
161  }
162  sal_Int32 nLen = nLast-nFirst+1;
163  OUString sFamily( aStrFamilyName.copy( nFirst, nLen ) );
164  bool bQuote = false;
165  for( sal_Int32 i=0; i < nLen; i++ )
166  {
167  sal_Unicode c = sFamily[i];
168  if( ' ' == c || ',' == c )
169  {
170  bQuote = true;
171  break;
172  }
173  }
174  if( bQuote )
175  sValue.append( '\'' );
176  sValue.append( sFamily );
177  if( bQuote )
178  sValue.append( '\'' );
179  }
180  }
181  while( -1 != nPos );
182 
183  rStrExpValue = sValue.makeStringAndClear();
184 
185  bRet = true;
186  }
187 
188  return bRet;
189 }
190 
191 
193 {
194  // Nothing to do
195 }
196 
197 bool XMLFontFamilyPropHdl::importXML( const OUString& rStrImpValue, uno::Any& rValue, const SvXMLUnitConverter& ) const
198 {
199  FontFamily eNewFamily;
200  bool bRet = SvXMLUnitConverter::convertEnum( eNewFamily, rStrImpValue, lcl_getFontFamilyGenericMapping() );
201  if( bRet )
202  rValue <<= static_cast<sal_Int16>(eNewFamily);
203 
204  return bRet;
205 }
206 
207 bool XMLFontFamilyPropHdl::exportXML( OUString& rStrExpValue, const uno::Any& rValue, const SvXMLUnitConverter& ) const
208 {
209  bool bRet = false;
210  OUStringBuffer aOut;
211 
212  sal_Int16 nFamily = sal_Int16();
213  if( rValue >>= nFamily )
214  {
215  FontFamily eFamily = static_cast<FontFamily>(nFamily);
216  if( eFamily != FAMILY_DONTKNOW )
218  }
219 
220  rStrExpValue = aOut.makeStringAndClear();
221 
222  return bRet;
223 }
224 
225 
227 {
228  // Nothing to do
229 }
230 
231 bool XMLFontEncodingPropHdl::importXML( const OUString& rStrImpValue, uno::Any& rValue, const SvXMLUnitConverter& ) const
232 {
233  if( IsXMLToken( rStrImpValue, XML_X_SYMBOL ) )
234  rValue <<= sal_Int16(RTL_TEXTENCODING_SYMBOL);
235 
236  return true;
237 }
238 
239 bool XMLFontEncodingPropHdl::exportXML( OUString& rStrExpValue, const uno::Any& rValue, const SvXMLUnitConverter& ) const
240 {
241  bool bRet = false;
242  sal_Int16 nSet = sal_Int16();
243 
244  if( rValue >>= nSet )
245  {
246  if( static_cast<rtl_TextEncoding>(nSet) == RTL_TEXTENCODING_SYMBOL )
247  {
248  rStrExpValue = GetXMLToken(XML_X_SYMBOL);
249  bRet = true;
250  }
251  }
252 
253  return bRet;
254 }
255 
256 
258 {
259  // Nothing to do
260 }
261 
262 bool XMLFontPitchPropHdl::importXML( const OUString& rStrImpValue, uno::Any& rValue, const SvXMLUnitConverter& ) const
263 {
264  FontPitch eNewPitch;
265  bool bRet = SvXMLUnitConverter::convertEnum( eNewPitch, rStrImpValue, aFontPitchMapping );
266  if( bRet )
267  rValue <<= static_cast<sal_Int16>(eNewPitch);
268 
269  return bRet;
270 }
271 
272 bool XMLFontPitchPropHdl::exportXML( OUString& rStrExpValue, const uno::Any& rValue, const SvXMLUnitConverter& ) const
273 {
274  bool bRet = false;
275  sal_Int16 nPitch = sal_Int16();
276 
277  FontPitch ePitch = PITCH_DONTKNOW;
278  if( rValue >>= nPitch )
279  ePitch = static_cast<FontPitch>(nPitch);
280 
281  if( PITCH_DONTKNOW != ePitch )
282  {
283  OUStringBuffer aOut;
284  bRet = SvXMLUnitConverter::convertEnum( aOut, ePitch, aFontPitchMapping, XML_FIXED );
285  rStrExpValue = aOut.makeStringAndClear();
286  }
287 
288  return bRet;
289 }
290 
291 /* vim:set shiftwidth=4 softtabstop=4 expandtab: */
bool IsXMLToken(const OUString &rString, enum XMLTokenEnum eToken)
compare eToken to the string
Definition: xmltoken.cxx:3434
static bool convertEnum(EnumT &rEnum, const OUString &rValue, const SvXMLEnumMapEntry< EnumT > *pMap)
convert string to enum using given enum map, if the enum is not found in the map, this method will re...
Definition: xmluconv.hxx:128
FAMILY_SCRIPT
virtual bool importXML(const OUString &rStrImpValue, css::uno::Any &rValue, const SvXMLUnitConverter &rUnitConverter) const override
Imports the given value according to the XML-data-type corresponding to the derived class...
Definition: fonthdl.cxx:197
FAMILY_MODERN
the SvXMLTypeConverter converts values of various types from their internal representation to the tex...
Definition: xmluconv.hxx:77
SvXMLEnumMapEntry< FontPitch > const aFontPitchMapping[]
Definition: fonthdl.cxx:54
FAMILY_DONTKNOW
virtual ~XMLFontFamilyNamePropHdl() override
Definition: fonthdl.cxx:62
virtual ~XMLFontFamilyPropHdl() override
Definition: fonthdl.cxx:192
FAMILY_ROMAN
virtual ~XMLFontEncodingPropHdl() override
Definition: fonthdl.cxx:226
static sal_Int32 indexOfComma(const OUString &rStr, sal_Int32 nPos)
virtual bool exportXML(OUString &rStrExpValue, const css::uno::Any &rValue, const SvXMLUnitConverter &rUnitConverter) const override
Exports the given value according to the XML-data-type corresponding to the derived class...
Definition: fonthdl.cxx:272
virtual bool importXML(const OUString &rStrImpValue, css::uno::Any &rValue, const SvXMLUnitConverter &rUnitConverter) const override
Imports the given value according to the XML-data-type corresponding to the derived class...
Definition: fonthdl.cxx:262
css::uno::Any const & rValue
Definition: ImageStyle.hxx:38
sal_uInt16 sal_Unicode
virtual bool importXML(const OUString &rStrImpValue, css::uno::Any &rValue, const SvXMLUnitConverter &rUnitConverter) const override
Imports the given value according to the XML-data-type corresponding to the derived class...
Definition: fonthdl.cxx:231
PITCH_VARIABLE
FAMILY_DECORATIVE
int i
virtual bool importXML(const OUString &rStrImpValue, css::uno::Any &rValue, const SvXMLUnitConverter &rUnitConverter) const override
Imports the given value according to the XML-data-type corresponding to the derived class...
Definition: fonthdl.cxx:67
PITCH_FIXED
virtual bool exportXML(OUString &rStrExpValue, const css::uno::Any &rValue, const SvXMLUnitConverter &rUnitConverter) const override
Exports the given value according to the XML-data-type corresponding to the derived class...
Definition: fonthdl.cxx:239
virtual bool exportXML(OUString &rStrExpValue, const css::uno::Any &rValue, const SvXMLUnitConverter &rUnitConverter) const override
Exports the given value according to the XML-data-type corresponding to the derived class...
Definition: fonthdl.cxx:207
PITCH_DONTKNOW
FontPitch
FAMILY_SYSTEM
FontFamily
Map an XMLTokenEnum to an enum value.
Definition: ximpshap.hxx:40
const OUString & GetXMLToken(enum XMLTokenEnum eToken)
return the OUString representation for eToken
Definition: xmltoken.cxx:3378
Handling of tokens in XML:
FAMILY_SWISS
virtual bool exportXML(OUString &rStrExpValue, const css::uno::Any &rValue, const SvXMLUnitConverter &rUnitConverter) const override
Exports the given value according to the XML-data-type corresponding to the derived class...
Definition: fonthdl.cxx:117
static const SvXMLEnumMapEntry< FontFamily > * lcl_getFontFamilyGenericMapping()
Definition: fonthdl.cxx:38
virtual ~XMLFontPitchPropHdl() override
Definition: fonthdl.cxx:257
sal_uInt16 nPos