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 "FrameOOoTContext.hxx"
27 #include "IgnoreTContext.hxx"
28 #include "MutableAttrList.hxx"
29 #include "xmloff/xmlnmspe.hxx"
30 #include <xmloff/nmspmap.hxx>
31 #include "ActionMapTypesOOo.hxx"
32 #include "AttrTransformerAction.hxx"
33 #include "ElemTransformerAction.hxx"
34 #include "TransformerActions.hxx"
35 #ifndef _XMLOFF_TRANSFORMERBASE_HXX
36 #include "TransformerBase.hxx"
37 #endif
38 
39 using ::rtl::OUString;
40 using namespace ::com::sun::star::uno;
41 using namespace ::com::sun::star::xml::sax;
42 using namespace ::xmloff::token;
43 
44 TYPEINIT1( XMLFrameOOoTransformerContext, XMLPersElemContentTContext );
45 
XMLFrameOOoTransformerContext(XMLTransformerBase & rImp,const OUString & rQName)46 XMLFrameOOoTransformerContext::XMLFrameOOoTransformerContext(
47 		XMLTransformerBase& rImp,
48 		const OUString& rQName ) :
49 	XMLPersElemContentTContext( rImp, rQName ),
50 	m_aElemQName( rImp.GetNamespaceMap().GetQNameByKey( XML_NAMESPACE_DRAW,
51 							::xmloff::token::GetXMLToken( XML_FRAME ) ) )
52 {
53 }
54 
~XMLFrameOOoTransformerContext()55 XMLFrameOOoTransformerContext::~XMLFrameOOoTransformerContext()
56 {
57 }
58 
StartElement(const Reference<XAttributeList> & rAttrList)59 void XMLFrameOOoTransformerContext::StartElement(
60 	const Reference< XAttributeList >& rAttrList )
61 {
62 
63 	XMLTransformerActions *pActions =
64 		GetTransformer().GetUserDefinedActions( OOO_FRAME_ATTR_ACTIONS );
65 	OSL_ENSURE( pActions, "go no actions" );
66 
67 	Reference< XAttributeList > xAttrList( rAttrList );
68 	XMLMutableAttributeList *pMutableAttrList =
69 		GetTransformer().ProcessAttrList( xAttrList, OOO_SHAPE_ACTIONS,
70 										  sal_True );
71 	if( !pMutableAttrList )
72 		pMutableAttrList = new XMLMutableAttributeList( rAttrList );
73 	xAttrList = pMutableAttrList;
74 
75 	XMLMutableAttributeList *pFrameMutableAttrList =
76 		new XMLMutableAttributeList;
77 	Reference< XAttributeList > xFrameAttrList( pFrameMutableAttrList );
78 
79 	sal_Int16 nAttrCount = xAttrList.is() ? xAttrList->getLength() : 0;
80 	for( sal_Int16 i=0; i < nAttrCount; i++ )
81 	{
82 		const OUString& rAttrName = xAttrList->getNameByIndex( i );
83 		OUString aLocalName;
84 		sal_uInt16 nPrefix =
85 			GetTransformer().GetNamespaceMap().GetKeyByAttrName( rAttrName,
86 																 &aLocalName );
87 		XMLTransformerActions::key_type aKey( nPrefix, aLocalName );
88 		XMLTransformerActions::const_iterator aIter =
89 			pActions->find( aKey );
90 		if( !(aIter == pActions->end() ) )
91 		{
92 			const OUString& rAttrValue = xAttrList->getValueByIndex( i );
93 			switch( (*aIter).second.m_nActionType )
94 			{
95 			case XML_ATACTION_MOVE_TO_ELEM:
96 				pFrameMutableAttrList->AddAttribute( rAttrName, rAttrValue );
97 				pMutableAttrList->RemoveAttributeByIndex( i );
98 				--i;
99 				--nAttrCount;
100 				break;
101 			default:
102 				OSL_ENSURE( sal_False, "unknown action" );
103 				break;
104 			}
105 		}
106 	}
107 
108 	GetTransformer().GetDocHandler()->startElement( m_aElemQName,
109 													xFrameAttrList );
110 	XMLTransformerContext::StartElement( xAttrList );
111 }
112 
CreateChildContext(sal_uInt16 nPrefix,const OUString & rLocalName,const OUString & rQName,const Reference<XAttributeList> & rAttrList)113 XMLTransformerContext *XMLFrameOOoTransformerContext::CreateChildContext(
114 		sal_uInt16 nPrefix,
115 		const OUString& rLocalName,
116 		const OUString& rQName,
117 		const Reference< XAttributeList >& rAttrList )
118 {
119 	XMLTransformerContext *pContext = 0;
120 
121 	XMLTransformerActions *pActions =
122 		GetTransformer().GetUserDefinedActions( OOO_FRAME_ELEM_ACTIONS );
123 	OSL_ENSURE( pActions, "go no actions" );
124 	XMLTransformerActions::key_type aKey( nPrefix, rLocalName );
125 	XMLTransformerActions::const_iterator aIter = pActions->find( aKey );
126 
127 	if( !(aIter == pActions->end()) )
128 	{
129 		switch( (*aIter).second.m_nActionType )
130 		{
131 		case XML_ETACTION_COPY:
132 		case XML_ETACTION_COPY_TEXT:
133 		case XML_ETACTION_RENAME_ELEM:
134 			// the ones in the list have to be persistent
135 
136 			pContext = XMLPersElemContentTContext::CreateChildContext(
137 				   		nPrefix, rLocalName, rQName, rAttrList );
138 			break;
139 		default:
140 			OSL_ENSURE( sal_False, "unknown action" );
141 			break;
142 		}
143 	}
144 
145 	// default is copying
146 	if( !pContext )
147 		pContext = XMLTransformerContext::CreateChildContext(
148 					nPrefix, rLocalName, rQName, rAttrList );
149 
150 	return pContext;
151 }
152 
EndElement()153 void XMLFrameOOoTransformerContext::EndElement()
154 {
155 	XMLTransformerContext::EndElement();
156 	ExportContent();
157 	GetTransformer().GetDocHandler()->endElement( m_aElemQName );
158 }
159 
Characters(const OUString & rChars)160 void XMLFrameOOoTransformerContext::Characters( const OUString& rChars )
161 {
162 	XMLTransformerContext::Characters( rChars );
163 }
164 
IsPersistent() const165 sal_Bool XMLFrameOOoTransformerContext::IsPersistent() const
166 {
167 	// this context stores some of its child elements, but is not persistent
168 	// itself.
169 	return sal_False;
170 }
171