|  | /************************************************************** | 
|  | * | 
|  | * Licensed to the Apache Software Foundation (ASF) under one | 
|  | * or more contributor license agreements.  See the NOTICE file | 
|  | * distributed with this work for additional information | 
|  | * regarding copyright ownership.  The ASF licenses this file | 
|  | * to you under the Apache License, Version 2.0 (the | 
|  | * "License"); you may not use this file except in compliance | 
|  | * with the License.  You may obtain a copy of the License at | 
|  | * | 
|  | *   http://www.apache.org/licenses/LICENSE-2.0 | 
|  | * | 
|  | * Unless required by applicable law or agreed to in writing, | 
|  | * software distributed under the License is distributed on an | 
|  | * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY | 
|  | * KIND, either express or implied.  See the License for the | 
|  | * specific language governing permissions and limitations | 
|  | * under the License. | 
|  | * | 
|  | *************************************************************/ | 
|  |  | 
|  |  | 
|  |  | 
|  | // MARKER(update_precomp.py): autogen include statement, do not remove | 
|  | #include "precompiled_xmloff.hxx" | 
|  |  | 
|  |  | 
|  | #include "XMLFootnoteImportContext.hxx" | 
|  |  | 
|  | #include <rtl/ustring.hxx> | 
|  | #include <tools/debug.hxx> | 
|  | #include <xmloff/xmlimp.hxx> | 
|  | #include <xmloff/txtimp.hxx> | 
|  | #include <xmloff/nmspmap.hxx> | 
|  | #include "xmloff/xmlnmspe.hxx" | 
|  | #include <xmloff/xmltoken.hxx> | 
|  |  | 
|  | #include "XMLFootnoteBodyImportContext.hxx" | 
|  | #include "XMLTextListBlockContext.hxx" | 
|  | #include "XMLTextListItemContext.hxx" | 
|  |  | 
|  | #include <com/sun/star/xml/sax/XAttributeList.hpp> | 
|  | #include <com/sun/star/text/XTextContent.hpp> | 
|  | #include <com/sun/star/beans/XPropertySet.hpp> | 
|  | #include <com/sun/star/lang/XMultiServiceFactory.hpp> | 
|  | #include <com/sun/star/text/XFootnote.hpp> | 
|  |  | 
|  |  | 
|  | using ::rtl::OUString; | 
|  | using ::rtl::OUStringBuffer; | 
|  |  | 
|  | using namespace ::com::sun::star::uno; | 
|  | using namespace ::com::sun::star::text; | 
|  | using namespace ::com::sun::star::lang; | 
|  | using namespace ::com::sun::star::beans; | 
|  | using namespace ::com::sun::star::xml::sax; | 
|  | using namespace ::xmloff::token; | 
|  |  | 
|  | TYPEINIT1(XMLFootnoteImportContext, SvXMLImportContext); | 
|  |  | 
|  | const sal_Char sAPI_service_footnote[] = "com.sun.star.text.Footnote"; | 
|  | const sal_Char sAPI_service_endnote[] = "com.sun.star.text.Endnote"; | 
|  |  | 
|  | enum XMLFootnoteChildToken { | 
|  | XML_TOK_FTN_NOTE_CITATION, | 
|  | XML_TOK_FTN_NOTE_BODY | 
|  | }; | 
|  |  | 
|  | static __FAR_DATA SvXMLTokenMapEntry aFootnoteChildTokenMap[] = | 
|  | { | 
|  | { XML_NAMESPACE_TEXT, XML_NOTE_CITATION, | 
|  | XML_TOK_FTN_NOTE_CITATION }, | 
|  | { XML_NAMESPACE_TEXT, XML_NOTE_BODY, XML_TOK_FTN_NOTE_BODY }, | 
|  | XML_TOKEN_MAP_END | 
|  | }; | 
|  |  | 
|  |  | 
|  | XMLFootnoteImportContext::XMLFootnoteImportContext( | 
|  | SvXMLImport& rImport, | 
|  | XMLTextImportHelper& rHlp, | 
|  | sal_uInt16 nPrfx, | 
|  | const OUString& rLocalName ) | 
|  | :	SvXMLImportContext(rImport, nPrfx, rLocalName) | 
|  | ,	sPropertyReferenceId(RTL_CONSTASCII_USTRINGPARAM("ReferenceId")) | 
|  | ,   mbListContextPushed(false) | 
|  | ,	rHelper(rHlp) | 
|  | { | 
|  | } | 
|  |  | 
|  | void XMLFootnoteImportContext::StartElement( | 
|  | const Reference<XAttributeList> & xAttrList) | 
|  | { | 
|  | // create footnote | 
|  | Reference<XMultiServiceFactory> xFactory(GetImport().GetModel(), | 
|  | UNO_QUERY); | 
|  | if( xFactory.is() ) | 
|  | { | 
|  | // create endnote or footnote | 
|  | sal_Bool bIsEndnote = sal_False; | 
|  | sal_Int16 nLength = xAttrList->getLength(); | 
|  | for(sal_Int16 nAttr1 = 0; nAttr1 < nLength; nAttr1++) | 
|  | { | 
|  | OUString sLocalName; | 
|  | sal_uInt16 nPrefix = GetImport().GetNamespaceMap(). | 
|  | GetKeyByAttrName( xAttrList->getNameByIndex(nAttr1), | 
|  | &sLocalName ); | 
|  | if( XML_NAMESPACE_TEXT == nPrefix && IsXMLToken( sLocalName, | 
|  | XML_NOTE_CLASS ) ) | 
|  | { | 
|  | const OUString& rValue = xAttrList->getValueByIndex( nAttr1 ); | 
|  | if( IsXMLToken( rValue, XML_ENDNOTE ) ) | 
|  | bIsEndnote = sal_True; | 
|  | break; | 
|  | } | 
|  | } | 
|  |  | 
|  | Reference<XInterface> xIfc = xFactory->createInstance( | 
|  | bIsEndnote ? | 
|  | OUString(RTL_CONSTASCII_USTRINGPARAM(sAPI_service_endnote)) : | 
|  | OUString(RTL_CONSTASCII_USTRINGPARAM(sAPI_service_footnote)) ); | 
|  |  | 
|  | // attach footnote to document | 
|  | Reference<XTextContent> xTextContent(xIfc, UNO_QUERY); | 
|  | rHelper.InsertTextContent(xTextContent); | 
|  |  | 
|  | // process id attribute | 
|  | for(sal_Int16 nAttr2 = 0; nAttr2 < nLength; nAttr2++) | 
|  | { | 
|  | OUString sLocalName; | 
|  | sal_uInt16 nPrefix = GetImport().GetNamespaceMap(). | 
|  | GetKeyByAttrName( xAttrList->getNameByIndex(nAttr2), | 
|  | &sLocalName ); | 
|  |  | 
|  | if ( (XML_NAMESPACE_TEXT == nPrefix) && | 
|  | IsXMLToken( sLocalName, XML_ID )   ) | 
|  | { | 
|  | // get ID ... | 
|  | Reference<XPropertySet> xPropertySet(xTextContent, UNO_QUERY); | 
|  | Any aAny =xPropertySet->getPropertyValue(sPropertyReferenceId); | 
|  | sal_Int16 nID = 0; | 
|  | aAny >>= nID; | 
|  |  | 
|  | // ... and insert into map | 
|  | rHelper.InsertFootnoteID( | 
|  | xAttrList->getValueByIndex(nAttr2), | 
|  | nID); | 
|  | } | 
|  | } | 
|  |  | 
|  | // save old cursor and install new one | 
|  | xOldCursor = rHelper.GetCursor(); | 
|  | Reference<XText> xText(xTextContent, UNO_QUERY); | 
|  | rHelper.SetCursor(xText->createTextCursor()); | 
|  |  | 
|  | // remember old list item and block (#89891#) and reset them | 
|  | // for the footnote | 
|  | rHelper.PushListContext(); | 
|  | mbListContextPushed = true; | 
|  |  | 
|  | // remember footnote (for CreateChildContext) | 
|  | Reference<XFootnote> xNote(xTextContent, UNO_QUERY); | 
|  | xFootnote = xNote; | 
|  | } | 
|  | // else: ignore footnote! Content will be merged into document. | 
|  | } | 
|  |  | 
|  | void XMLFootnoteImportContext::Characters(const OUString&) | 
|  | { | 
|  | // ignore characters! Text must be contained in paragraphs! | 
|  | // rHelper.InsertString(rString); | 
|  | } | 
|  |  | 
|  | void XMLFootnoteImportContext::EndElement() | 
|  | { | 
|  | // get rid of last dummy paragraph | 
|  | rHelper.DeleteParagraph(); | 
|  |  | 
|  | // reinstall old cursor | 
|  | rHelper.SetCursor(xOldCursor); | 
|  |  | 
|  | // reinstall old list item | 
|  | if (mbListContextPushed) { | 
|  | rHelper.PopListContext(); | 
|  | } | 
|  | } | 
|  |  | 
|  |  | 
|  | SvXMLImportContext *XMLFootnoteImportContext::CreateChildContext( | 
|  | sal_uInt16 p_nPrefix, | 
|  | const OUString& rLocalName, | 
|  | const Reference<XAttributeList> & xAttrList ) | 
|  | { | 
|  | SvXMLImportContext* pContext = NULL; | 
|  |  | 
|  | SvXMLTokenMap aTokenMap(aFootnoteChildTokenMap); | 
|  |  | 
|  | switch(aTokenMap.Get(p_nPrefix, rLocalName)) | 
|  | { | 
|  | case XML_TOK_FTN_NOTE_CITATION: | 
|  | { | 
|  | // little hack: we only care for one attribute of the citation | 
|  | //			  	element. We handle that here, and then return a | 
|  | // 				default context. | 
|  | sal_Int16 nLength = xAttrList->getLength(); | 
|  | for(sal_Int16 nAttr = 0; nAttr < nLength; nAttr++) | 
|  | { | 
|  | OUString sLocalName; | 
|  | sal_uInt16 nPrefix = GetImport().GetNamespaceMap(). | 
|  | GetKeyByAttrName( xAttrList->getNameByIndex(nAttr), | 
|  | &sLocalName ); | 
|  |  | 
|  | if ( (nPrefix == XML_NAMESPACE_TEXT) && | 
|  | IsXMLToken( sLocalName, XML_LABEL ) ) | 
|  | { | 
|  | xFootnote->setLabel(xAttrList->getValueByIndex(nAttr)); | 
|  | } | 
|  | } | 
|  |  | 
|  | // ignore content: return default context | 
|  | pContext = new SvXMLImportContext(GetImport(), | 
|  | p_nPrefix, rLocalName); | 
|  | break; | 
|  | } | 
|  |  | 
|  | case XML_TOK_FTN_NOTE_BODY: | 
|  | // return footnote body | 
|  | pContext = new XMLFootnoteBodyImportContext(GetImport(), | 
|  | p_nPrefix, rLocalName); | 
|  | break; | 
|  | default: | 
|  | // default: | 
|  | pContext = SvXMLImportContext::CreateChildContext(p_nPrefix, | 
|  | rLocalName, | 
|  | xAttrList); | 
|  | break; | 
|  | } | 
|  |  | 
|  | return pContext; | 
|  | } |