xref: /trunk/main/xmloff/source/transform/NotesTContext.cxx (revision cdf0e10c4e3984b49a9502b011690b615761d4a3)
1 /*************************************************************************
2  *
3  * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
4  *
5  * Copyright 2000, 2010 Oracle and/or its affiliates.
6  *
7  * OpenOffice.org - a multi-platform office productivity suite
8  *
9  * This file is part of OpenOffice.org.
10  *
11  * OpenOffice.org is free software: you can redistribute it and/or modify
12  * it under the terms of the GNU Lesser General Public License version 3
13  * only, as published by the Free Software Foundation.
14  *
15  * OpenOffice.org is distributed in the hope that it will be useful,
16  * but WITHOUT ANY WARRANTY; without even the implied warranty of
17  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
18  * GNU Lesser General Public License version 3 for more details
19  * (a copy is included in the LICENSE file that accompanied this code).
20  *
21  * You should have received a copy of the GNU Lesser General Public License
22  * version 3 along with OpenOffice.org.  If not, see
23  * <http://www.openoffice.org/license.html>
24  * for a copy of the LGPLv3 License.
25  *
26  ************************************************************************/
27 
28 // MARKER(update_precomp.py): autogen include statement, do not remove
29 #include "precompiled_xmloff.hxx"
30 #include <com/sun/star/xml/sax/SAXParseException.hpp>
31 #include <com/sun/star/xml/sax/SAXException.hpp>
32 #include <com/sun/star/xml/sax/XDocumentHandler.hpp>
33 #include <com/sun/star/xml/sax/XAttributeList.hpp>
34 #include <xmloff/nmspmap.hxx>
35 #include <xmloff/xmltoken.hxx>
36 #include "xmloff/xmlnmspe.hxx"
37 
38 #ifndef _XMLOFF_TRANSFOERMERBASE_HXX
39 #include "TransformerBase.hxx"
40 #endif
41 #include "TransformerActions.hxx"
42 #include "AttrTransformerAction.hxx"
43 #include "ActionMapTypesOASIS.hxx"
44 #include "MutableAttrList.hxx"
45 #include "RenameElemTContext.hxx"
46 #include "FlatTContext.hxx"
47 
48 #ifndef _XMLOFF_NOTESCONTEXT_HXX
49 #include "NotesTContext.hxx"
50 #endif
51 
52 using ::rtl::OUString;
53 using namespace ::xmloff::token;
54 using namespace ::com::sun::star::uno;
55 using namespace ::com::sun::star::xml::sax;
56 
57 TYPEINIT1( XMLNotesTransformerContext, XMLPersElemContentTContext );
58 
59 XMLNotesTransformerContext::XMLNotesTransformerContext(
60         XMLTransformerBase& rImp,
61         const OUString& rQName,
62         XMLTokenEnum eToken, sal_Bool bPersistent ) :
63     XMLPersElemContentTContext( rImp, rQName ),
64     m_bEndNote( sal_False ),
65     m_bPersistent( bPersistent ),
66     m_eTypeToken( eToken )
67 {
68 }
69 
70 XMLNotesTransformerContext::~XMLNotesTransformerContext()
71 {
72 }
73 
74 void XMLNotesTransformerContext::StartElement(
75         const Reference< XAttributeList >& rAttrList )
76 {
77     XMLTransformerActions *pActions =
78         GetTransformer().GetUserDefinedActions( OASIS_NOTES_ACTIONS );
79     OSL_ENSURE( pActions, "go no actions" );
80 
81     Reference< XAttributeList > xAttrList( rAttrList );
82     XMLMutableAttributeList *pMutableAttrList = 0;
83     sal_Int16 nAttrCount = xAttrList.is() ? xAttrList->getLength() : 0;
84     for( sal_Int16 i=0; i < nAttrCount; i++ )
85     {
86         const OUString& rAttrName = xAttrList->getNameByIndex( i );
87         OUString aLocalName;
88         sal_uInt16 nPrefix =
89             GetTransformer().GetNamespaceMap().GetKeyByAttrName( rAttrName,
90                                                                  &aLocalName );
91         XMLTransformerActions::key_type aKey( nPrefix, aLocalName );
92         XMLTransformerActions::const_iterator aIter =
93             pActions->find( aKey );
94         if( !(aIter == pActions->end() ) )
95         {
96             const OUString& rAttrValue = xAttrList->getValueByIndex( i );
97 
98             if( !pMutableAttrList )
99             {
100                 pMutableAttrList =
101                     new XMLMutableAttributeList( xAttrList );
102                 xAttrList = pMutableAttrList;
103             }
104             switch( (*aIter).second.m_nActionType )
105             {
106             case XML_ATACTION_STYLE_FAMILY:
107                 {
108                     if( IsXMLToken( rAttrValue, XML_FOOTNOTE ) )
109                     {
110                     }
111                     else if( IsXMLToken( rAttrValue, XML_ENDNOTE ) )
112                     {
113                         m_bEndNote = sal_True;
114                     }
115                     pMutableAttrList->RemoveAttributeByIndex( i );
116                     --i;
117                     --nAttrCount;
118                 }
119                 break;
120             case XML_ATACTION_DECODE_STYLE_NAME:
121             case XML_ATACTION_DECODE_STYLE_NAME_REF:
122                 {
123                     OUString aAttrValue( rAttrValue );
124                     if( GetTransformer().DecodeStyleName(aAttrValue) )
125                         pMutableAttrList->SetValueByIndex( i, aAttrValue );
126                 }
127                 break;
128             }
129         }
130     }
131 
132     XMLTokenEnum eToken = XML_FOOTNOTE;
133     switch( m_eTypeToken )
134     {
135     case XML_NOTE:
136         eToken = (m_bEndNote ? XML_ENDNOTE : XML_FOOTNOTE);
137         break;
138     case XML_NOTES_CONFIGURATION:
139         eToken = (m_bEndNote ? XML_ENDNOTES_CONFIGURATION
140                              : XML_FOOTNOTES_CONFIGURATION);
141         break;
142     case XML_NOTE_REF:
143         eToken = (m_bEndNote ? XML_ENDNOTE_REF : XML_FOOTNOTE_REF);
144         break;
145     default:
146         OSL_ENSURE( XML_NOTE==m_eTypeToken, "invalid note type" );
147         break;
148     }
149 
150     SetExportQName( GetTransformer().GetNamespaceMap().GetQNameByKey(
151                             XML_NAMESPACE_TEXT,
152                             ::xmloff::token::GetXMLToken( eToken ) ) );
153     if( m_bPersistent )
154         XMLPersElemContentTContext::StartElement( xAttrList );
155     else
156         GetTransformer().GetDocHandler()->startElement( GetExportQName(),
157                                                         xAttrList );
158 }
159 
160 void XMLNotesTransformerContext::EndElement()
161 {
162     if( m_bPersistent )
163     {
164         XMLPersElemContentTContext::EndElement();
165     }
166     else
167     {
168         GetTransformer().GetDocHandler()->endElement( GetExportQName() );
169     }
170 }
171 
172 XMLTransformerContext *XMLNotesTransformerContext::CreateChildContext(
173         sal_uInt16 nPrefix,
174         const OUString& rLocalName,
175         const OUString& rQName,
176         const Reference< XAttributeList >& rAttrList )
177 {
178     XMLTransformerContext *pContext = 0;
179     if( XML_NOTE == m_eTypeToken )
180     {
181         if( XML_NAMESPACE_TEXT == nPrefix )
182         {
183             XMLTokenEnum eToken ( XML_TOKEN_INVALID );
184             if( IsXMLToken( rLocalName, XML_NOTE_CITATION ) )
185             {
186                 eToken = m_bEndNote ? XML_ENDNOTE_CITATION
187                                   : XML_FOOTNOTE_CITATION;
188             }
189             else if( IsXMLToken( rLocalName, XML_NOTE_BODY ) )
190             {
191                 eToken = m_bEndNote ? XML_ENDNOTE_BODY
192                                   : XML_FOOTNOTE_BODY;
193             }
194 
195             if( XML_TOKEN_INVALID != eToken )
196             {
197                 if( m_bPersistent  )
198                 {
199                     pContext = new XMLPersTextContentTContext(
200                                     GetTransformer(), rQName,
201                                     XML_NAMESPACE_TEXT,
202                                     eToken );
203                     AddContent( pContext );
204 
205                 }
206                 else
207                 {
208                     pContext = new XMLRenameElemTransformerContext(
209                                     GetTransformer(), rQName,
210                                     XML_NAMESPACE_TEXT,
211                                     eToken );
212                 }
213             }
214         }
215     }
216 
217     if( !pContext )
218     {
219         pContext = m_bPersistent
220                         ? XMLPersElemContentTContext::CreateChildContext(
221                                 nPrefix, rLocalName, rQName, rAttrList )
222                         : XMLTransformerContext::CreateChildContext(
223                                 nPrefix, rLocalName, rQName, rAttrList );
224     }
225 
226     return pContext;
227 }
228 
229 sal_Bool XMLNotesTransformerContext::IsPersistent() const
230 {
231     return m_bPersistent;
232 }
233