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 #include "XMLLineNumberingImportContext.hxx"
27 #include "XMLLineNumberingSeparatorImportContext.hxx"
28 #include "com/sun/star/beans/XPropertySet.hpp"
29 #include "com/sun/star/text/XLineNumberingProperties.hpp"
30 #include <com/sun/star/style/LineNumberPosition.hpp>
31 #include <com/sun/star/style/NumberingType.hpp>
32 #include <xmloff/xmlimp.hxx>
33 #include <xmloff/xmluconv.hxx>
34 #include "xmloff/xmlnmspe.hxx"
35 #include <xmloff/nmspmap.hxx>
36 #include <xmloff/xmltoken.hxx>
37 #include <xmloff/xmlnumi.hxx>
38
39
40 using namespace ::com::sun::star;
41 using namespace ::com::sun::star::uno;
42 using namespace ::com::sun::star::style;
43 using namespace ::xmloff::token;
44
45 using ::com::sun::star::beans::XPropertySet;
46 using ::com::sun::star::xml::sax::XAttributeList;
47 using ::com::sun::star::text::XLineNumberingProperties;
48 using ::rtl::OUString;
49
50 TYPEINIT1( XMLLineNumberingImportContext, SvXMLStyleContext );
51
52
XMLLineNumberingImportContext(SvXMLImport & rImport,sal_uInt16 nPrfx,const OUString & rLocalName,const Reference<XAttributeList> & xAttrList)53 XMLLineNumberingImportContext::XMLLineNumberingImportContext(
54 SvXMLImport& rImport,
55 sal_uInt16 nPrfx,
56 const OUString& rLocalName,
57 const Reference<XAttributeList> & xAttrList)
58 : SvXMLStyleContext(rImport, nPrfx, rLocalName, xAttrList, XML_STYLE_FAMILY_TEXT_LINENUMBERINGCONFIG)
59 , sCharStyleName(RTL_CONSTASCII_USTRINGPARAM("CharStyleName"))
60 , sCountEmptyLines(RTL_CONSTASCII_USTRINGPARAM("CountEmptyLines"))
61 , sCountLinesInFrames(RTL_CONSTASCII_USTRINGPARAM("CountLinesInFrames"))
62 , sDistance(RTL_CONSTASCII_USTRINGPARAM("Distance"))
63 , sInterval(RTL_CONSTASCII_USTRINGPARAM("Interval"))
64 , sSeparatorText(RTL_CONSTASCII_USTRINGPARAM("SeparatorText"))
65 , sNumberPosition(RTL_CONSTASCII_USTRINGPARAM("NumberPosition"))
66 , sNumberingType(RTL_CONSTASCII_USTRINGPARAM("NumberingType"))
67 , sIsOn(RTL_CONSTASCII_USTRINGPARAM("IsOn"))
68 , sRestartAtEachPage(RTL_CONSTASCII_USTRINGPARAM("RestartAtEachPage"))
69 , sSeparatorInterval(RTL_CONSTASCII_USTRINGPARAM("SeparatorInterval"))
70 , sNumFormat(GetXMLToken(XML_1))
71 , sNumLetterSync(GetXMLToken(XML_FALSE))
72 , nOffset(-1)
73 , nNumberPosition(style::LineNumberPosition::LEFT)
74 , nIncrement(-1)
75 , nSeparatorIncrement(-1)
76 , bNumberLines(sal_True)
77 , bCountEmptyLines(sal_True)
78 , bCountInFloatingFrames(sal_False)
79 , bRestartNumbering(sal_False)
80 {
81 }
82
~XMLLineNumberingImportContext()83 XMLLineNumberingImportContext::~XMLLineNumberingImportContext()
84 {
85 }
86
StartElement(const Reference<XAttributeList> & xAttrList)87 void XMLLineNumberingImportContext::StartElement(
88 const Reference<XAttributeList> & xAttrList)
89 {
90 static SvXMLTokenMapEntry aLineNumberingTokenMap[] =
91 {
92 { XML_NAMESPACE_TEXT, XML_STYLE_NAME, XML_TOK_LINENUMBERING_STYLE_NAME },
93 { XML_NAMESPACE_TEXT, XML_NUMBER_LINES,
94 XML_TOK_LINENUMBERING_NUMBER_LINES },
95 { XML_NAMESPACE_TEXT, XML_COUNT_EMPTY_LINES,
96 XML_TOK_LINENUMBERING_COUNT_EMPTY_LINES },
97 { XML_NAMESPACE_TEXT, XML_COUNT_IN_TEXT_BOXES,
98 XML_TOK_LINENUMBERING_COUNT_IN_TEXT_BOXES },
99 { XML_NAMESPACE_TEXT, XML_RESTART_ON_PAGE,
100 XML_TOK_LINENUMBERING_RESTART_NUMBERING },
101 { XML_NAMESPACE_TEXT, XML_OFFSET, XML_TOK_LINENUMBERING_OFFSET },
102 { XML_NAMESPACE_STYLE, XML_NUM_FORMAT, XML_TOK_LINENUMBERING_NUM_FORMAT },
103 { XML_NAMESPACE_STYLE, XML_NUM_LETTER_SYNC,
104 XML_TOK_LINENUMBERING_NUM_LETTER_SYNC },
105 { XML_NAMESPACE_TEXT, XML_NUMBER_POSITION,
106 XML_TOK_LINENUMBERING_NUMBER_POSITION },
107 { XML_NAMESPACE_TEXT, XML_INCREMENT, XML_TOK_LINENUMBERING_INCREMENT },
108 // { XML_NAMESPACE_TEXT, XML_LINENUMBERING_CONFIGURATION,
109 // XML_TOK_LINENUMBERING_LINENUMBERING_CONFIGURATION },
110 // { XML_NAMESPACE_TEXT, XML_INCREMENT, XML_TOK_LINENUMBERING_INCREMENT },
111 // { XML_NAMESPACE_TEXT, XML_LINENUMBERING_SEPARATOR,
112 // XML_TOK_LINENUMBERING_LINENUMBERING_SEPARATOR },
113
114 XML_TOKEN_MAP_END
115 };
116
117 SvXMLTokenMap aTokenMap(aLineNumberingTokenMap);
118
119 // process attributes
120 sal_Int16 nLength = xAttrList->getLength();
121 for(sal_Int16 i=0; i<nLength; i++)
122 {
123 OUString sLocalName;
124 sal_uInt16 nPrefix = GetImport().GetNamespaceMap().
125 GetKeyByAttrName( xAttrList->getNameByIndex(i), &sLocalName );
126
127 ProcessAttribute(
128 (enum LineNumberingToken)aTokenMap.Get(nPrefix, sLocalName),
129 xAttrList->getValueByIndex(i));
130 }
131 }
132
ProcessAttribute(enum LineNumberingToken eToken,OUString sValue)133 void XMLLineNumberingImportContext::ProcessAttribute(
134 enum LineNumberingToken eToken,
135 OUString sValue)
136 {
137 sal_Bool bTmp;
138 sal_Int32 nTmp;
139
140 switch (eToken)
141 {
142 case XML_TOK_LINENUMBERING_STYLE_NAME:
143 sStyleName = sValue;
144 break;
145
146 case XML_TOK_LINENUMBERING_NUMBER_LINES:
147 if (SvXMLUnitConverter::convertBool(bTmp, sValue))
148 {
149 bNumberLines = bTmp;
150 }
151 break;
152
153 case XML_TOK_LINENUMBERING_COUNT_EMPTY_LINES:
154 if (SvXMLUnitConverter::convertBool(bTmp, sValue))
155 {
156 bCountEmptyLines = bTmp;
157 }
158 break;
159
160 case XML_TOK_LINENUMBERING_COUNT_IN_TEXT_BOXES:
161 if (SvXMLUnitConverter::convertBool(bTmp, sValue))
162 {
163 bCountInFloatingFrames = bTmp;
164 }
165 break;
166
167 case XML_TOK_LINENUMBERING_RESTART_NUMBERING:
168 if (SvXMLUnitConverter::convertBool(bTmp, sValue))
169 {
170 bRestartNumbering = bTmp;
171 }
172 break;
173
174 case XML_TOK_LINENUMBERING_OFFSET:
175 if (GetImport().GetMM100UnitConverter().
176 convertMeasure(nTmp, sValue))
177 {
178 nOffset = nTmp;
179 }
180 break;
181
182 case XML_TOK_LINENUMBERING_NUM_FORMAT:
183 sNumFormat = sValue;
184 break;
185
186 case XML_TOK_LINENUMBERING_NUM_LETTER_SYNC:
187 sNumLetterSync = sValue;
188 break;
189
190 case XML_TOK_LINENUMBERING_NUMBER_POSITION:
191 {
192 static const SvXMLEnumMapEntry aLineNumberPositionMap[] =
193 {
194 { XML_LEFT, style::LineNumberPosition::LEFT },
195 { XML_RIGHT, style::LineNumberPosition::RIGHT },
196 { XML_INSIDE, style::LineNumberPosition::INSIDE },
197 { XML_OUTSIDE, style::LineNumberPosition::OUTSIDE },
198 { XML_TOKEN_INVALID, 0 }
199 };
200
201 sal_uInt16 nTmp16;
202 if (SvXMLUnitConverter::convertEnum(nTmp16, sValue,
203 aLineNumberPositionMap))
204 {
205 nNumberPosition = nTmp16;
206 }
207 break;
208 }
209
210 case XML_TOK_LINENUMBERING_INCREMENT:
211 if (SvXMLUnitConverter::convertNumber(nTmp, sValue, 0))
212 {
213 nIncrement = (sal_Int16)nTmp;
214 }
215 break;
216 }
217 }
218
CreateAndInsert(sal_Bool)219 void XMLLineNumberingImportContext::CreateAndInsert(sal_Bool)
220 {
221 // insert and block mode is handled in insertStyleFamily
222
223 // we'll try to get the LineNumberingProperties
224 Reference<XLineNumberingProperties> xSupplier(GetImport().GetModel(),
225 UNO_QUERY);
226 if (xSupplier.is())
227 {
228 Reference<XPropertySet> xLineNumbering =
229 xSupplier->getLineNumberingProperties();
230
231 if (xLineNumbering.is())
232 {
233 Any aAny;
234
235 // set style name (if it exists)
236 if ( GetImport().GetStyles()->FindStyleChildContext(
237 XML_STYLE_FAMILY_TEXT_TEXT, sStyleName ) != NULL )
238 {
239 aAny <<= GetImport().GetStyleDisplayName(
240 XML_STYLE_FAMILY_TEXT_TEXT, sStyleName );
241 xLineNumbering->setPropertyValue(sCharStyleName, aAny);
242 }
243
244 aAny <<= sSeparator;
245 xLineNumbering->setPropertyValue(sSeparatorText, aAny);
246
247 aAny <<= nOffset;
248 xLineNumbering->setPropertyValue(sDistance, aAny);
249
250 aAny <<= nNumberPosition;
251 xLineNumbering->setPropertyValue(sNumberPosition, aAny);
252
253 if (nIncrement >= 0)
254 {
255 aAny <<= nIncrement;
256 xLineNumbering->setPropertyValue(sInterval, aAny);
257 }
258
259 if (nSeparatorIncrement >= 0)
260 {
261 aAny <<= nSeparatorIncrement;
262 xLineNumbering->setPropertyValue(sSeparatorInterval, aAny);
263 }
264
265 aAny.setValue(&bNumberLines, ::getBooleanCppuType());
266 xLineNumbering->setPropertyValue(sIsOn, aAny);
267
268 aAny.setValue(&bCountEmptyLines, ::getBooleanCppuType());
269 xLineNumbering->setPropertyValue(sCountEmptyLines, aAny);
270
271 aAny.setValue(&bCountInFloatingFrames, ::getBooleanCppuType());
272 xLineNumbering->setPropertyValue(sCountLinesInFrames, aAny);
273
274 aAny.setValue(&bRestartNumbering, ::getBooleanCppuType());
275 xLineNumbering->setPropertyValue(sRestartAtEachPage, aAny);
276
277 sal_Int16 nNumType = NumberingType::ARABIC;
278 GetImport().GetMM100UnitConverter().convertNumFormat( nNumType,
279 sNumFormat,
280 sNumLetterSync );
281 aAny <<= nNumType;
282 xLineNumbering->setPropertyValue(sNumberingType, aAny);
283 }
284 }
285 }
286
CreateChildContext(sal_uInt16 nPrefix,const OUString & rLocalName,const Reference<XAttributeList> & xAttrList)287 SvXMLImportContext* XMLLineNumberingImportContext::CreateChildContext(
288 sal_uInt16 nPrefix,
289 const OUString& rLocalName,
290 const Reference<XAttributeList> & xAttrList )
291 {
292 if ( (nPrefix == XML_NAMESPACE_TEXT) &&
293 IsXMLToken(rLocalName, XML_LINENUMBERING_SEPARATOR) )
294 {
295 return new XMLLineNumberingSeparatorImportContext(GetImport(),
296 nPrefix, rLocalName,
297 *this);
298 }
299 else
300 {
301 // unknown element: default context
302 return SvXMLImportContext::CreateChildContext(nPrefix, rLocalName,
303 xAttrList);
304 }
305 }
306
SetSeparatorText(const OUString & sText)307 void XMLLineNumberingImportContext::SetSeparatorText(
308 const OUString& sText)
309 {
310 sSeparator = sText;
311 }
312
SetSeparatorIncrement(sal_Int16 nIncr)313 void XMLLineNumberingImportContext::SetSeparatorIncrement(
314 sal_Int16 nIncr)
315 {
316 nSeparatorIncrement = nIncr;
317 }
318
319