xref: /AOO41X/main/xmloff/source/text/XMLFootnoteConfigurationImportContext.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 #include "XMLFootnoteConfigurationImportContext.hxx"
27 
28 #ifndef _RTL_USTRING
29 #include <rtl/ustring.hxx>
30 #endif
31 #include <rtl/ustrbuf.hxx>
32 #include <tools/debug.hxx>
33 #include <xmloff/nmspmap.hxx>
34 #include "xmloff/xmlnmspe.hxx"
35 #include <xmloff/xmltoken.hxx>
36 
37 #ifndef _XMLOFF_FAMILIES_HXX
38 #include <xmloff/families.hxx>
39 #endif
40 #include <xmloff/xmluconv.hxx>
41 #include <xmloff/xmlimp.hxx>
42 #include <xmloff/xmlnumi.hxx>
43 #include <com/sun/star/xml/sax/XAttributeList.hpp>
44 #include <com/sun/star/beans/XPropertySet.hpp>
45 #include <com/sun/star/text/XFootnote.hpp>
46 #include <com/sun/star/text/XFootnotesSupplier.hpp>
47 #include <com/sun/star/text/XEndnotesSupplier.hpp>
48 #include <com/sun/star/text/FootnoteNumbering.hpp>
49 #include <com/sun/star/style/NumberingType.hpp>
50 
51 
52 using ::rtl::OUString;
53 using ::rtl::OUStringBuffer;
54 
55 using namespace ::com::sun::star::text;
56 using namespace ::com::sun::star::beans;
57 using namespace ::com::sun::star::uno;
58 using namespace ::com::sun::star::style;
59 using namespace ::com::sun::star::xml::sax;
60 using namespace ::xmloff::token;
61 
62 //
63 //  XMLFootnoteConfigHelper
64 //
65 
66 /// local helper class for import of quo-vadis and ergo-sum elements
67 class XMLFootnoteConfigHelper : public SvXMLImportContext
68 {
69     OUStringBuffer sBuffer;
70     XMLFootnoteConfigurationImportContext& rConfig;
71     sal_Bool bIsBegin;
72 
73 public:
74     TYPEINFO();
75 
76     XMLFootnoteConfigHelper(
77         SvXMLImport& rImport,
78         sal_uInt16 nPrfx,
79         const OUString& rLName,
80         XMLFootnoteConfigurationImportContext& rConfigImport,
81         sal_Bool bBegin);
82 
83     virtual void EndElement();
84 
85     virtual void Characters( const OUString& rChars );
86 };
87 
88 TYPEINIT1( XMLFootnoteConfigHelper, SvXMLImportContext );
89 
XMLFootnoteConfigHelper(SvXMLImport & rImport,sal_uInt16 nPrfx,const OUString & rLName,XMLFootnoteConfigurationImportContext & rConfigImport,sal_Bool bBegin)90 XMLFootnoteConfigHelper::XMLFootnoteConfigHelper(
91     SvXMLImport& rImport,
92     sal_uInt16 nPrfx,
93     const OUString& rLName,
94     XMLFootnoteConfigurationImportContext& rConfigImport,
95     sal_Bool bBegin)
96 :   SvXMLImportContext(rImport, nPrfx, rLName)
97 ,   sBuffer()
98 ,   rConfig(rConfigImport)
99 ,   bIsBegin(bBegin)
100 {
101 }
102 
EndElement()103 void XMLFootnoteConfigHelper::EndElement()
104 {
105     if (bIsBegin)
106     {
107         rConfig.SetBeginNotice(sBuffer.makeStringAndClear());
108     }
109     else
110     {
111         rConfig.SetEndNotice(sBuffer.makeStringAndClear());
112     }
113 //  rConfig = NULL; // import contexts are ref-counted
114 }
115 
Characters(const OUString & rChars)116 void XMLFootnoteConfigHelper::Characters( const OUString& rChars )
117 {
118     sBuffer.append(rChars);
119 }
120 
121 
122 //
123 // XMLFootnoteConfigurationImportContext
124 //
125 
126 
127 TYPEINIT1( XMLFootnoteConfigurationImportContext, SvXMLStyleContext );
128 
XMLFootnoteConfigurationImportContext(SvXMLImport & rImport,sal_uInt16 nPrfx,const OUString & rLocalName,const Reference<XAttributeList> & xAttrList)129 XMLFootnoteConfigurationImportContext::XMLFootnoteConfigurationImportContext(
130     SvXMLImport& rImport,
131     sal_uInt16 nPrfx,
132     const OUString& rLocalName,
133     const Reference<XAttributeList> & xAttrList)
134 :   SvXMLStyleContext(rImport, nPrfx, rLocalName, xAttrList, XML_STYLE_FAMILY_TEXT_FOOTNOTECONFIG)
135 ,   sPropertyAnchorCharStyleName(RTL_CONSTASCII_USTRINGPARAM("AnchorCharStyleName"))
136 ,   sPropertyCharStyleName(RTL_CONSTASCII_USTRINGPARAM("CharStyleName"))
137 ,   sPropertyNumberingType(RTL_CONSTASCII_USTRINGPARAM("NumberingType"))
138 ,   sPropertyPageStyleName(RTL_CONSTASCII_USTRINGPARAM("PageStyleName"))
139 ,   sPropertyParagraphStyleName(RTL_CONSTASCII_USTRINGPARAM("ParaStyleName"))
140 ,   sPropertyPrefix(RTL_CONSTASCII_USTRINGPARAM("Prefix"))
141 ,   sPropertyStartAt(RTL_CONSTASCII_USTRINGPARAM("StartAt"))
142 ,   sPropertySuffix(RTL_CONSTASCII_USTRINGPARAM("Suffix"))
143 ,   sPropertyPositionEndOfDoc(RTL_CONSTASCII_USTRINGPARAM("PositionEndOfDoc"))
144 ,   sPropertyFootnoteCounting(RTL_CONSTASCII_USTRINGPARAM("FootnoteCounting"))
145 ,   sPropertyEndNotice(RTL_CONSTASCII_USTRINGPARAM("EndNotice"))
146 ,   sPropertyBeginNotice(RTL_CONSTASCII_USTRINGPARAM("BeginNotice"))
147 ,   sNumFormat(RTL_CONSTASCII_USTRINGPARAM("1"))
148 ,   sNumSync(RTL_CONSTASCII_USTRINGPARAM("false"))
149 ,   pAttrTokenMap(NULL)
150 ,   nOffset(0)
151 ,   nNumbering(FootnoteNumbering::PER_PAGE)
152 ,   bPosition(sal_False)
153 ,   bIsEndnote(sal_False)
154 {
155     sal_Int16 nLength = xAttrList->getLength();
156     for(sal_Int16 nAttr = 0; nAttr < nLength; nAttr++)
157     {
158         OUString sLocalName;
159         sal_uInt16 nPrefix = GetImport().GetNamespaceMap().
160             GetKeyByAttrName( xAttrList->getNameByIndex(nAttr),
161                               &sLocalName );
162         if( XML_NAMESPACE_TEXT == nPrefix && IsXMLToken( sLocalName,
163                                                         XML_NOTE_CLASS ) )
164         {
165             const OUString& rValue = xAttrList->getValueByIndex( nAttr );
166             if( IsXMLToken( rValue, XML_ENDNOTE ) )
167             {
168                 bIsEndnote = sal_True;
169                 SetFamily( XML_STYLE_FAMILY_TEXT_FOOTNOTECONFIG );
170             }
171             break;
172         }
173     }
174 
175 }
~XMLFootnoteConfigurationImportContext()176 XMLFootnoteConfigurationImportContext::~XMLFootnoteConfigurationImportContext()
177 {
178     delete pAttrTokenMap;
179 }
180 
181 enum XMLFtnConfigToken
182 {
183     XML_TOK_FTNCONFIG_CITATION_STYLENAME,
184     XML_TOK_FTNCONFIG_ANCHOR_STYLENAME,
185     XML_TOK_FTNCONFIG_DEFAULT_STYLENAME,
186     XML_TOK_FTNCONFIG_PAGE_STYLENAME,
187     XML_TOK_FTNCONFIG_OFFSET,
188     XML_TOK_FTNCONFIG_NUM_PREFIX,
189     XML_TOK_FTNCONFIG_NUM_SUFFIX,
190     XML_TOK_FTNCONFIG_NUM_FORMAT,
191     XML_TOK_FTNCONFIG_NUM_SYNC,
192     XML_TOK_FTNCONFIG_START_AT,
193     XML_TOK_FTNCONFIG_POSITION
194 };
195 
196 static __FAR_DATA SvXMLTokenMapEntry aTextFieldAttrTokenMap[] =
197 {
198     { XML_NAMESPACE_TEXT, XML_CITATION_STYLE_NAME,      XML_TOK_FTNCONFIG_CITATION_STYLENAME },
199     { XML_NAMESPACE_TEXT, XML_CITATION_BODY_STYLE_NAME, XML_TOK_FTNCONFIG_ANCHOR_STYLENAME },
200     { XML_NAMESPACE_TEXT, XML_DEFAULT_STYLE_NAME,       XML_TOK_FTNCONFIG_DEFAULT_STYLENAME },
201     { XML_NAMESPACE_TEXT, XML_MASTER_PAGE_NAME,         XML_TOK_FTNCONFIG_PAGE_STYLENAME },
202     { XML_NAMESPACE_TEXT, XML_START_VALUE, XML_TOK_FTNCONFIG_OFFSET },
203     { XML_NAMESPACE_STYLE, XML_NUM_PREFIX, XML_TOK_FTNCONFIG_NUM_PREFIX },
204     { XML_NAMESPACE_STYLE, XML_NUM_SUFFIX, XML_TOK_FTNCONFIG_NUM_SUFFIX },
205     { XML_NAMESPACE_STYLE, XML_NUM_FORMAT, XML_TOK_FTNCONFIG_NUM_FORMAT },
206     { XML_NAMESPACE_STYLE, XML_NUM_LETTER_SYNC, XML_TOK_FTNCONFIG_NUM_SYNC },
207     { XML_NAMESPACE_TEXT, XML_START_NUMBERING_AT, XML_TOK_FTNCONFIG_START_AT},
208     { XML_NAMESPACE_TEXT, XML_FOOTNOTES_POSITION, XML_TOK_FTNCONFIG_POSITION},
209 
210     // for backwards compatibility with SRC630 & earlier
211     { XML_NAMESPACE_TEXT, XML_NUM_PREFIX, XML_TOK_FTNCONFIG_NUM_PREFIX },
212     { XML_NAMESPACE_TEXT, XML_NUM_SUFFIX, XML_TOK_FTNCONFIG_NUM_SUFFIX },
213     { XML_NAMESPACE_TEXT, XML_OFFSET, XML_TOK_FTNCONFIG_OFFSET },
214     XML_TOKEN_MAP_END
215 };
216 
217 const SvXMLTokenMap&
GetFtnConfigAttrTokenMap()218     XMLFootnoteConfigurationImportContext::GetFtnConfigAttrTokenMap()
219 {
220     if (NULL == pAttrTokenMap)
221     {
222         pAttrTokenMap = new SvXMLTokenMap(aTextFieldAttrTokenMap);
223     }
224 
225     return *pAttrTokenMap;
226 }
227 
228 static SvXMLEnumMapEntry __READONLY_DATA aFootnoteNumberingMap[] =
229 {
230     { XML_PAGE,             FootnoteNumbering::PER_PAGE },
231     { XML_CHAPTER,          FootnoteNumbering::PER_CHAPTER },
232     { XML_DOCUMENT,         FootnoteNumbering::PER_DOCUMENT },
233     { XML_TOKEN_INVALID,    0 },
234 };
235 
StartElement(const Reference<XAttributeList> & xAttrList)236 void XMLFootnoteConfigurationImportContext::StartElement(
237     const Reference<XAttributeList> & xAttrList )
238 {
239     sal_Int16 nLength = xAttrList->getLength();
240     for(sal_Int16 nAttr = 0; nAttr < nLength; nAttr++)
241     {
242         OUString sLocalName;
243         sal_uInt16 nPrefix = GetImport().GetNamespaceMap().
244             GetKeyByAttrName( xAttrList->getNameByIndex(nAttr),
245                               &sLocalName );
246         OUString sValue = xAttrList->getValueByIndex(nAttr);
247         switch (GetFtnConfigAttrTokenMap().Get(nPrefix, sLocalName))
248         {
249             case XML_TOK_FTNCONFIG_CITATION_STYLENAME:
250                 sCitationStyle = sValue;
251                 break;
252             case XML_TOK_FTNCONFIG_ANCHOR_STYLENAME:
253                 sAnchorStyle = sValue;
254                 break;
255             case XML_TOK_FTNCONFIG_DEFAULT_STYLENAME:
256                 sDefaultStyle = sValue;
257                 break;
258             case XML_TOK_FTNCONFIG_PAGE_STYLENAME:
259                 sPageStyle = sValue;
260                 break;
261             case XML_TOK_FTNCONFIG_OFFSET:
262             {
263                 sal_Int32 nTmp;
264                 if (SvXMLUnitConverter::convertNumber(nTmp, sValue))
265                 {
266                     nOffset = (sal_uInt16)nTmp;
267                 }
268                 break;
269             }
270             case XML_TOK_FTNCONFIG_NUM_PREFIX:
271                 sPrefix = sValue;
272                 break;
273             case XML_TOK_FTNCONFIG_NUM_SUFFIX:
274                 sSuffix = sValue;
275                 break;
276             case XML_TOK_FTNCONFIG_NUM_FORMAT:
277                 sNumFormat = sValue;
278                 break;
279             case XML_TOK_FTNCONFIG_NUM_SYNC:
280                 sNumSync = sValue;
281                 break;
282             case XML_TOK_FTNCONFIG_START_AT:
283             {
284                 sal_uInt16 nTmp;
285                 if (SvXMLUnitConverter::convertEnum(nTmp, sValue,
286                                                     aFootnoteNumberingMap))
287                 {
288                     nNumbering = nTmp;
289                 }
290                 break;
291             }
292             case XML_TOK_FTNCONFIG_POSITION:
293                 bPosition = IsXMLToken( sValue, XML_DOCUMENT );
294                 break;
295             default:
296                 ; // ignore
297         }
298     }
299 }
300 
CreateChildContext(sal_uInt16 nPrefix,const OUString & rLocalName,const Reference<XAttributeList> & xAttrList)301 SvXMLImportContext *XMLFootnoteConfigurationImportContext::CreateChildContext(
302     sal_uInt16 nPrefix,
303     const OUString& rLocalName,
304     const Reference<XAttributeList> & xAttrList )
305 {
306     SvXMLImportContext* pContext = NULL;
307 
308     if (!bIsEndnote)
309     {
310         if (XML_NAMESPACE_TEXT == nPrefix)
311         {
312             if ( IsXMLToken( rLocalName,
313                              XML_FOOTNOTE_CONTINUATION_NOTICE_FORWARD ) )
314             {
315                 pContext = new XMLFootnoteConfigHelper(GetImport(),
316                                                        nPrefix, rLocalName,
317                                                        *this, sal_False);
318             }
319             else if ( IsXMLToken( rLocalName,
320                                   XML_FOOTNOTE_CONTINUATION_NOTICE_BACKWARD ) )
321             {
322                 pContext = new XMLFootnoteConfigHelper(GetImport(),
323                                                        nPrefix, rLocalName,
324                                                        *this, sal_True);
325             }
326             // else: default context
327         }
328         // else: unknown namespace -> default context
329     }
330     // else: endnote -> default context
331 
332     if (pContext == NULL)
333     {
334         // default: delegate to super class
335         pContext = SvXMLStyleContext::CreateChildContext(nPrefix,
336                                                          rLocalName,
337                                                          xAttrList);
338     }
339 
340     return pContext;
341 }
342 
343 
344 // --> OD 2005-01-31 #i40597# - rename method <CreateAndInsertLate(..)> to
345 // <Finish(..)>
Finish(sal_Bool bOverwrite)346 void XMLFootnoteConfigurationImportContext::Finish( sal_Bool bOverwrite )
347 // <--
348 {
349 
350     if (bOverwrite)
351     {
352         if (bIsEndnote)
353         {
354             Reference<XEndnotesSupplier> xSupplier(
355                 GetImport().GetModel(), UNO_QUERY);
356             if (xSupplier.is())
357             {
358                 ProcessSettings(xSupplier->getEndnoteSettings());
359             }
360         }
361         else
362         {
363             Reference<XFootnotesSupplier> xSupplier(
364                 GetImport().GetModel(), UNO_QUERY);
365             if (xSupplier.is())
366             {
367                 ProcessSettings(xSupplier->getFootnoteSettings());
368             }
369         }
370     }
371     // else: ignore (there's only one configuration, so we can only overwrite)
372 }
373 
ProcessSettings(const Reference<XPropertySet> & rConfig)374 void XMLFootnoteConfigurationImportContext::ProcessSettings(
375     const Reference<XPropertySet> & rConfig)
376 {
377     Any aAny;
378 
379     if (sCitationStyle.getLength() > 0)
380     {
381         aAny <<= GetImport().GetStyleDisplayName(
382                         XML_STYLE_FAMILY_TEXT_TEXT, sCitationStyle );
383         rConfig->setPropertyValue(sPropertyCharStyleName, aAny);
384     }
385 
386     if (sAnchorStyle.getLength() > 0)
387     {
388         aAny <<= GetImport().GetStyleDisplayName(
389                         XML_STYLE_FAMILY_TEXT_TEXT, sAnchorStyle );
390         rConfig->setPropertyValue(sPropertyAnchorCharStyleName, aAny);
391     }
392 
393     if (sPageStyle.getLength() > 0)
394     {
395         aAny <<= GetImport().GetStyleDisplayName(
396                         XML_STYLE_FAMILY_MASTER_PAGE, sPageStyle );
397         rConfig->setPropertyValue(sPropertyPageStyleName, aAny);
398     }
399 
400     if (sDefaultStyle.getLength() > 0)
401     {
402         aAny <<= GetImport().GetStyleDisplayName(
403                         XML_STYLE_FAMILY_TEXT_PARAGRAPH, sDefaultStyle );
404         rConfig->setPropertyValue(sPropertyParagraphStyleName, aAny);
405     }
406 
407     aAny <<= sPrefix;
408     rConfig->setPropertyValue(sPropertyPrefix, aAny);
409 
410     aAny <<= sSuffix;
411     rConfig->setPropertyValue(sPropertySuffix, aAny);
412 
413     sal_Int16 nNumType = NumberingType::ARABIC;
414     GetImport().GetMM100UnitConverter().convertNumFormat( nNumType, sNumFormat,
415                                                      sNumSync );
416     // #i61399: Corrupt file? It contains "Bullet" as numbering style for footnotes.
417     // Okay, even it seems to be corrupt, we will oversee this and set the style to ARABIC
418     if( NumberingType::CHAR_SPECIAL == nNumType )
419         nNumType = NumberingType::ARABIC;
420 
421     aAny <<=  nNumType;
422     rConfig->setPropertyValue(sPropertyNumberingType, aAny);
423 
424     aAny <<= nOffset;
425     rConfig->setPropertyValue(sPropertyStartAt, aAny);
426 
427     if (!bIsEndnote)
428     {
429         aAny.setValue(&bPosition, ::getBooleanCppuType());
430         rConfig->setPropertyValue(sPropertyPositionEndOfDoc, aAny);
431 
432         aAny <<= nNumbering;
433         rConfig->setPropertyValue(sPropertyFootnoteCounting, aAny);
434 
435         aAny <<= sEndNotice;
436         rConfig->setPropertyValue(sPropertyEndNotice, aAny);
437 
438         aAny <<= sBeginNotice;
439         rConfig->setPropertyValue(sPropertyBeginNotice, aAny);
440     }
441 }
442 
SetBeginNotice(OUString sText)443 void XMLFootnoteConfigurationImportContext::SetBeginNotice(
444     OUString sText)
445 {
446     sBeginNotice = sText;
447 }
448 
SetEndNotice(OUString sText)449 void XMLFootnoteConfigurationImportContext::SetEndNotice(
450     OUString sText)
451 {
452     sEndNotice = sText;
453 }
454