xref: /AOO41X/main/editeng/source/items/xmlcnitm.cxx (revision 190118d08a3be86671f4129b3e9a490e144719cd)
1*190118d0SAndrew Rist /**************************************************************
2cdf0e10cSrcweir  *
3*190118d0SAndrew Rist  * Licensed to the Apache Software Foundation (ASF) under one
4*190118d0SAndrew Rist  * or more contributor license agreements.  See the NOTICE file
5*190118d0SAndrew Rist  * distributed with this work for additional information
6*190118d0SAndrew Rist  * regarding copyright ownership.  The ASF licenses this file
7*190118d0SAndrew Rist  * to you under the Apache License, Version 2.0 (the
8*190118d0SAndrew Rist  * "License"); you may not use this file except in compliance
9*190118d0SAndrew Rist  * with the License.  You may obtain a copy of the License at
10cdf0e10cSrcweir  *
11*190118d0SAndrew Rist  *   http://www.apache.org/licenses/LICENSE-2.0
12cdf0e10cSrcweir  *
13*190118d0SAndrew Rist  * Unless required by applicable law or agreed to in writing,
14*190118d0SAndrew Rist  * software distributed under the License is distributed on an
15*190118d0SAndrew Rist  * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
16*190118d0SAndrew Rist  * KIND, either express or implied.  See the License for the
17*190118d0SAndrew Rist  * specific language governing permissions and limitations
18*190118d0SAndrew Rist  * under the License.
19cdf0e10cSrcweir  *
20*190118d0SAndrew Rist  *************************************************************/
21*190118d0SAndrew Rist 
22*190118d0SAndrew Rist 
23cdf0e10cSrcweir 
24cdf0e10cSrcweir // MARKER(update_precomp.py): autogen include statement, do not remove
25cdf0e10cSrcweir #include "precompiled_editeng.hxx"
26cdf0e10cSrcweir #include <com/sun/star/xml/AttributeData.hpp>
27cdf0e10cSrcweir #include <com/sun/star/lang/XUnoTunnel.hpp>
28cdf0e10cSrcweir #include <xmloff/xmlcnimp.hxx>
29cdf0e10cSrcweir #include <xmloff/unoatrcn.hxx>
30cdf0e10cSrcweir #include <editeng/xmlcnitm.hxx>
31cdf0e10cSrcweir 
32cdf0e10cSrcweir using namespace ::com::sun::star::uno;
33cdf0e10cSrcweir using namespace ::com::sun::star::container;
34cdf0e10cSrcweir using namespace ::com::sun::star::lang;
35cdf0e10cSrcweir using namespace ::com::sun::star::xml;
36cdf0e10cSrcweir 
37cdf0e10cSrcweir // ------------------------------------------------------------------------
38cdf0e10cSrcweir 
39cdf0e10cSrcweir TYPEINIT1(SvXMLAttrContainerItem, SfxPoolItem);
40cdf0e10cSrcweir 
41cdf0e10cSrcweir SvXMLAttrContainerItem::SvXMLAttrContainerItem( sal_uInt16 _nWhich ) :
42cdf0e10cSrcweir     SfxPoolItem( _nWhich )
43cdf0e10cSrcweir {
44cdf0e10cSrcweir 	pImpl = new SvXMLAttrContainerData;
45cdf0e10cSrcweir }
46cdf0e10cSrcweir 
47cdf0e10cSrcweir SvXMLAttrContainerItem::SvXMLAttrContainerItem(
48cdf0e10cSrcweir 										const SvXMLAttrContainerItem& rItem ) :
49cdf0e10cSrcweir 	SfxPoolItem( rItem )
50cdf0e10cSrcweir {
51cdf0e10cSrcweir 	pImpl = new SvXMLAttrContainerData( *rItem.pImpl );
52cdf0e10cSrcweir }
53cdf0e10cSrcweir 
54cdf0e10cSrcweir SvXMLAttrContainerItem::~SvXMLAttrContainerItem()
55cdf0e10cSrcweir {
56cdf0e10cSrcweir 	delete pImpl;
57cdf0e10cSrcweir }
58cdf0e10cSrcweir 
59cdf0e10cSrcweir int SvXMLAttrContainerItem::operator==( const SfxPoolItem& rItem ) const
60cdf0e10cSrcweir {
61cdf0e10cSrcweir 	DBG_ASSERT( rItem.ISA(SvXMLAttrContainerItem),
62cdf0e10cSrcweir 			   "SvXMLAttrContainerItem::operator ==(): Bad type");
63cdf0e10cSrcweir 	return *pImpl == *((const SvXMLAttrContainerItem&)rItem).pImpl;
64cdf0e10cSrcweir }
65cdf0e10cSrcweir 
66cdf0e10cSrcweir int SvXMLAttrContainerItem::Compare( const SfxPoolItem &/*rWith*/ ) const
67cdf0e10cSrcweir {
68cdf0e10cSrcweir 	DBG_ASSERT( !this, "not yet implemented" );
69cdf0e10cSrcweir 
70cdf0e10cSrcweir 	return 0;
71cdf0e10cSrcweir }
72cdf0e10cSrcweir 
73cdf0e10cSrcweir SfxItemPresentation SvXMLAttrContainerItem::GetPresentation(
74cdf0e10cSrcweir                     SfxItemPresentation /*ePresentation*/,
75cdf0e10cSrcweir                     SfxMapUnit /*eCoreMetric*/,
76cdf0e10cSrcweir                     SfxMapUnit /*ePresentationMetric*/,
77cdf0e10cSrcweir                     XubString &/*rText*/,
78cdf0e10cSrcweir                     const IntlWrapper * /*pIntlWrapper*/ ) const
79cdf0e10cSrcweir {
80cdf0e10cSrcweir 	return SFX_ITEM_PRESENTATION_NONE;
81cdf0e10cSrcweir }
82cdf0e10cSrcweir 
83cdf0e10cSrcweir sal_uInt16 SvXMLAttrContainerItem::GetVersion( sal_uInt16 /*nFileFormatVersion*/ ) const
84cdf0e10cSrcweir {
85cdf0e10cSrcweir 	// This item should never be stored
86cdf0e10cSrcweir 	return USHRT_MAX;
87cdf0e10cSrcweir }
88cdf0e10cSrcweir 
89cdf0e10cSrcweir sal_Bool  SvXMLAttrContainerItem::QueryValue( com::sun::star::uno::Any& rVal, sal_uInt8 /*nMemberId*/ ) const
90cdf0e10cSrcweir {
91cdf0e10cSrcweir 	Reference<XNameContainer> xContainer =
92cdf0e10cSrcweir 		new SvUnoAttributeContainer( new SvXMLAttrContainerData( *pImpl ) );
93cdf0e10cSrcweir 
94cdf0e10cSrcweir 	rVal.setValue( &xContainer, ::getCppuType((Reference<XNameContainer>*)0) );
95cdf0e10cSrcweir 	return sal_True;
96cdf0e10cSrcweir }
97cdf0e10cSrcweir sal_Bool SvXMLAttrContainerItem::PutValue( const com::sun::star::uno::Any& rVal, sal_uInt8 /*nMemberId*/ )
98cdf0e10cSrcweir {
99cdf0e10cSrcweir 	Reference<XInterface> xRef;
100cdf0e10cSrcweir 	SvUnoAttributeContainer* pContainer = NULL;
101cdf0e10cSrcweir 
102cdf0e10cSrcweir 	if( rVal.getValue() != NULL && rVal.getValueType().getTypeClass() == TypeClass_INTERFACE )
103cdf0e10cSrcweir 	{
104cdf0e10cSrcweir 		xRef = *(Reference<XInterface>*)rVal.getValue();
105cdf0e10cSrcweir 		Reference<XUnoTunnel> xTunnel(xRef, UNO_QUERY);
106cdf0e10cSrcweir 		if( xTunnel.is() )
107cdf0e10cSrcweir             pContainer = (SvUnoAttributeContainer*)(sal_uLong)xTunnel->getSomething(SvUnoAttributeContainer::getUnoTunnelId());
108cdf0e10cSrcweir 	}
109cdf0e10cSrcweir 
110cdf0e10cSrcweir 	if( pContainer )
111cdf0e10cSrcweir 	{
112cdf0e10cSrcweir 		delete pImpl;
113cdf0e10cSrcweir 		pImpl = new SvXMLAttrContainerData( * pContainer->GetContainerImpl() );
114cdf0e10cSrcweir 	}
115cdf0e10cSrcweir 	else
116cdf0e10cSrcweir 	{
117cdf0e10cSrcweir 		SvXMLAttrContainerData* pNewImpl = new SvXMLAttrContainerData;
118cdf0e10cSrcweir 
119cdf0e10cSrcweir 		try
120cdf0e10cSrcweir 		{
121cdf0e10cSrcweir 			Reference<XNameContainer> xContainer( xRef, UNO_QUERY );
122cdf0e10cSrcweir 			if( !xContainer.is() )
123cdf0e10cSrcweir 				return sal_False;
124cdf0e10cSrcweir 
125cdf0e10cSrcweir 			const Sequence< ::rtl::OUString > aNameSequence( xContainer->getElementNames() );
126cdf0e10cSrcweir 			const ::rtl::OUString* pNames = aNameSequence.getConstArray();
127cdf0e10cSrcweir 			const sal_Int32 nCount = aNameSequence.getLength();
128cdf0e10cSrcweir 			Any aAny;
129cdf0e10cSrcweir 			AttributeData* pData;
130cdf0e10cSrcweir 			sal_Int32 nAttr;
131cdf0e10cSrcweir 
132cdf0e10cSrcweir 			for( nAttr = 0; nAttr < nCount; nAttr++ )
133cdf0e10cSrcweir 			{
134cdf0e10cSrcweir 				const ::rtl::OUString aName( *pNames++ );
135cdf0e10cSrcweir 
136cdf0e10cSrcweir 				aAny = xContainer->getByName( aName );
137cdf0e10cSrcweir 				if( aAny.getValue() == NULL || aAny.getValueType() != ::getCppuType((AttributeData*)0) )
138cdf0e10cSrcweir 					return sal_False;
139cdf0e10cSrcweir 
140cdf0e10cSrcweir 				pData = (AttributeData*)aAny.getValue();
141cdf0e10cSrcweir 				sal_Int32 pos = aName.indexOf( sal_Unicode(':') );
142cdf0e10cSrcweir                 if( pos != -1 )
143cdf0e10cSrcweir 				{
144cdf0e10cSrcweir 					const ::rtl::OUString aPrefix( aName.copy( 0, pos ));
145cdf0e10cSrcweir 					const ::rtl::OUString aLName( aName.copy( pos+1 ));
146cdf0e10cSrcweir 
147cdf0e10cSrcweir 					if( pData->Namespace.getLength() == 0 )
148cdf0e10cSrcweir 					{
149cdf0e10cSrcweir 						if( !pNewImpl->AddAttr( aPrefix, aLName, pData->Value ) )
150cdf0e10cSrcweir 							break;
151cdf0e10cSrcweir 					}
152cdf0e10cSrcweir 					else
153cdf0e10cSrcweir 					{
154cdf0e10cSrcweir 						if( !pNewImpl->AddAttr( aPrefix, pData->Namespace, aLName, pData->Value ) )
155cdf0e10cSrcweir 							break;
156cdf0e10cSrcweir 					}
157cdf0e10cSrcweir 				}
158cdf0e10cSrcweir 				else
159cdf0e10cSrcweir 				{
160cdf0e10cSrcweir 					if( !pNewImpl->AddAttr( aName, pData->Value ) )
161cdf0e10cSrcweir 						break;
162cdf0e10cSrcweir 				}
163cdf0e10cSrcweir 			}
164cdf0e10cSrcweir 
165cdf0e10cSrcweir 			if( nAttr == nCount )
166cdf0e10cSrcweir 			{
167cdf0e10cSrcweir 				delete pImpl;
168cdf0e10cSrcweir                 pImpl = pNewImpl;
169cdf0e10cSrcweir 			}
170cdf0e10cSrcweir 			else
171cdf0e10cSrcweir 			{
172cdf0e10cSrcweir 				delete pNewImpl;
173cdf0e10cSrcweir 				return sal_False;
174cdf0e10cSrcweir 			}
175cdf0e10cSrcweir 		}
176cdf0e10cSrcweir 		catch(...)
177cdf0e10cSrcweir 		{
178cdf0e10cSrcweir 			delete pNewImpl;
179cdf0e10cSrcweir 			return sal_False;
180cdf0e10cSrcweir 		}
181cdf0e10cSrcweir 	}
182cdf0e10cSrcweir 	return sal_True;
183cdf0e10cSrcweir }
184cdf0e10cSrcweir 
185cdf0e10cSrcweir 
186cdf0e10cSrcweir sal_Bool SvXMLAttrContainerItem::AddAttr( const ::rtl::OUString& rLName,
187cdf0e10cSrcweir 								  	  const ::rtl::OUString& rValue )
188cdf0e10cSrcweir {
189cdf0e10cSrcweir 	return pImpl->AddAttr( rLName, rValue );
190cdf0e10cSrcweir }
191cdf0e10cSrcweir 
192cdf0e10cSrcweir sal_Bool SvXMLAttrContainerItem::AddAttr( const ::rtl::OUString& rPrefix,
193cdf0e10cSrcweir 		  const ::rtl::OUString& rNamespace, const ::rtl::OUString& rLName,
194cdf0e10cSrcweir 		  const ::rtl::OUString& rValue )
195cdf0e10cSrcweir {
196cdf0e10cSrcweir 	return pImpl->AddAttr( rPrefix, rNamespace, rLName, rValue );
197cdf0e10cSrcweir }
198cdf0e10cSrcweir 
199cdf0e10cSrcweir sal_uInt16 SvXMLAttrContainerItem::GetAttrCount() const
200cdf0e10cSrcweir {
201cdf0e10cSrcweir 	return (sal_uInt16)pImpl->GetAttrCount();
202cdf0e10cSrcweir }
203cdf0e10cSrcweir 
204cdf0e10cSrcweir ::rtl::OUString SvXMLAttrContainerItem::GetAttrNamespace( sal_uInt16 i ) const
205cdf0e10cSrcweir {
206cdf0e10cSrcweir 	return pImpl->GetAttrNamespace( i );
207cdf0e10cSrcweir }
208cdf0e10cSrcweir 
209cdf0e10cSrcweir ::rtl::OUString SvXMLAttrContainerItem::GetAttrPrefix( sal_uInt16 i ) const
210cdf0e10cSrcweir {
211cdf0e10cSrcweir 	return pImpl->GetAttrPrefix( i );
212cdf0e10cSrcweir }
213cdf0e10cSrcweir 
214cdf0e10cSrcweir const ::rtl::OUString& SvXMLAttrContainerItem::GetAttrLName( sal_uInt16 i ) const
215cdf0e10cSrcweir {
216cdf0e10cSrcweir 	return pImpl->GetAttrLName( i );
217cdf0e10cSrcweir }
218cdf0e10cSrcweir 
219cdf0e10cSrcweir const ::rtl::OUString& SvXMLAttrContainerItem::GetAttrValue( sal_uInt16 i ) const
220cdf0e10cSrcweir {
221cdf0e10cSrcweir 	return pImpl->GetAttrValue( i );
222cdf0e10cSrcweir }
223cdf0e10cSrcweir 
224cdf0e10cSrcweir 
225cdf0e10cSrcweir sal_uInt16 SvXMLAttrContainerItem::GetFirstNamespaceIndex() const
226cdf0e10cSrcweir {
227cdf0e10cSrcweir 	return pImpl->GetFirstNamespaceIndex();
228cdf0e10cSrcweir }
229cdf0e10cSrcweir 
230cdf0e10cSrcweir sal_uInt16 SvXMLAttrContainerItem::GetNextNamespaceIndex( sal_uInt16 nIdx ) const
231cdf0e10cSrcweir {
232cdf0e10cSrcweir 	return pImpl->GetNextNamespaceIndex( nIdx );
233cdf0e10cSrcweir }
234cdf0e10cSrcweir 
235cdf0e10cSrcweir const ::rtl::OUString& SvXMLAttrContainerItem::GetNamespace( sal_uInt16 i ) const
236cdf0e10cSrcweir {
237cdf0e10cSrcweir 	return pImpl->GetNamespace( i );
238cdf0e10cSrcweir }
239cdf0e10cSrcweir 
240cdf0e10cSrcweir const ::rtl::OUString& SvXMLAttrContainerItem::GetPrefix( sal_uInt16 i ) const
241cdf0e10cSrcweir {
242cdf0e10cSrcweir 	return pImpl->GetPrefix( i );
243cdf0e10cSrcweir }
244cdf0e10cSrcweir 
245