xref: /aoo41x/main/xmloff/source/draw/layerimp.cxx (revision 63bba73c)
1*63bba73cSAndrew Rist /**************************************************************
2cdf0e10cSrcweir  *
3*63bba73cSAndrew Rist  * Licensed to the Apache Software Foundation (ASF) under one
4*63bba73cSAndrew Rist  * or more contributor license agreements.  See the NOTICE file
5*63bba73cSAndrew Rist  * distributed with this work for additional information
6*63bba73cSAndrew Rist  * regarding copyright ownership.  The ASF licenses this file
7*63bba73cSAndrew Rist  * to you under the Apache License, Version 2.0 (the
8*63bba73cSAndrew Rist  * "License"); you may not use this file except in compliance
9*63bba73cSAndrew Rist  * with the License.  You may obtain a copy of the License at
10*63bba73cSAndrew Rist  *
11*63bba73cSAndrew Rist  *   http://www.apache.org/licenses/LICENSE-2.0
12*63bba73cSAndrew Rist  *
13*63bba73cSAndrew Rist  * Unless required by applicable law or agreed to in writing,
14*63bba73cSAndrew Rist  * software distributed under the License is distributed on an
15*63bba73cSAndrew Rist  * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
16*63bba73cSAndrew Rist  * KIND, either express or implied.  See the License for the
17*63bba73cSAndrew Rist  * specific language governing permissions and limitations
18*63bba73cSAndrew Rist  * under the License.
19*63bba73cSAndrew Rist  *
20*63bba73cSAndrew Rist  *************************************************************/
21*63bba73cSAndrew Rist 
22*63bba73cSAndrew Rist 
23cdf0e10cSrcweir 
24cdf0e10cSrcweir // MARKER(update_precomp.py): autogen include statement, do not remove
25cdf0e10cSrcweir #include "precompiled_xmloff.hxx"
26cdf0e10cSrcweir 
27cdf0e10cSrcweir #include <tools/debug.hxx>
28cdf0e10cSrcweir #include <com/sun/star/drawing/XLayerManager.hpp>
29cdf0e10cSrcweir #include <com/sun/star/beans/XPropertySet.hpp>
30cdf0e10cSrcweir #include <com/sun/star/xml/sax/XAttributeList.hpp>
31cdf0e10cSrcweir #include <com/sun/star/drawing/XLayerSupplier.hpp>
32cdf0e10cSrcweir #include <comphelper/extract.hxx>
33cdf0e10cSrcweir #include <xmloff/xmltoken.hxx>
34cdf0e10cSrcweir #include <xmloff/xmlimp.hxx>
35cdf0e10cSrcweir #include "xmloff/xmlnmspe.hxx"
36cdf0e10cSrcweir #include <xmloff/xmluconv.hxx>
37cdf0e10cSrcweir #include <xmloff/nmspmap.hxx>
38cdf0e10cSrcweir #include "layerimp.hxx"
39cdf0e10cSrcweir 
40cdf0e10cSrcweir using ::rtl::OUString;
41cdf0e10cSrcweir using ::rtl::OUStringBuffer;
42cdf0e10cSrcweir 
43cdf0e10cSrcweir #include "XMLStringBufferImportContext.hxx"
44cdf0e10cSrcweir 
45cdf0e10cSrcweir using namespace ::std;
46cdf0e10cSrcweir using namespace ::cppu;
47cdf0e10cSrcweir using namespace ::xmloff::token;
48cdf0e10cSrcweir using namespace ::com::sun::star;
49cdf0e10cSrcweir using namespace ::com::sun::star::xml;
50cdf0e10cSrcweir using namespace ::com::sun::star::xml::sax;
51cdf0e10cSrcweir using namespace ::com::sun::star::uno;
52cdf0e10cSrcweir using namespace ::com::sun::star::drawing;
53cdf0e10cSrcweir using namespace ::com::sun::star::beans;
54cdf0e10cSrcweir using namespace ::com::sun::star::lang;
55cdf0e10cSrcweir using namespace ::com::sun::star::container;
56cdf0e10cSrcweir using ::xmloff::token::IsXMLToken;
57cdf0e10cSrcweir 
58cdf0e10cSrcweir class SdXMLLayerContext : public SvXMLImportContext
59cdf0e10cSrcweir {
60cdf0e10cSrcweir public:
61cdf0e10cSrcweir 	SdXMLLayerContext( SvXMLImport& rImport, sal_uInt16 nPrefix, const OUString& rLocalName, const Reference< XAttributeList >& xAttrList, const Reference< XNameAccess >& xLayerManager );
62cdf0e10cSrcweir 	virtual ~SdXMLLayerContext();
63cdf0e10cSrcweir 
64cdf0e10cSrcweir 	virtual SvXMLImportContext *CreateChildContext( sal_uInt16 nPrefix, const ::rtl::OUString& rLocalName, const Reference< XAttributeList >& xAttrList );
65cdf0e10cSrcweir 	virtual void EndElement();
66cdf0e10cSrcweir 
67cdf0e10cSrcweir private:
68cdf0e10cSrcweir 	::com::sun::star::uno::Reference< ::com::sun::star::container::XNameAccess > mxLayerManager;
69cdf0e10cSrcweir 	::rtl::OUString msName;
70cdf0e10cSrcweir 	::rtl::OUStringBuffer sDescriptionBuffer;
71cdf0e10cSrcweir 	::rtl::OUStringBuffer sTitleBuffer;
72cdf0e10cSrcweir };
73cdf0e10cSrcweir 
SdXMLLayerContext(SvXMLImport & rImport,sal_uInt16 nPrefix,const OUString & rLocalName,const Reference<XAttributeList> & xAttrList,const Reference<XNameAccess> & xLayerManager)74cdf0e10cSrcweir SdXMLLayerContext::SdXMLLayerContext( SvXMLImport& rImport, sal_uInt16 nPrefix, const OUString& rLocalName, const Reference< XAttributeList >& xAttrList, const Reference< XNameAccess >& xLayerManager )
75cdf0e10cSrcweir : SvXMLImportContext(rImport, nPrefix, rLocalName)
76cdf0e10cSrcweir , mxLayerManager( xLayerManager )
77cdf0e10cSrcweir {
78cdf0e10cSrcweir 	const OUString strName( RTL_CONSTASCII_USTRINGPARAM( "Name" ) );
79cdf0e10cSrcweir 
80cdf0e10cSrcweir 	OUString aName;
81cdf0e10cSrcweir 
82cdf0e10cSrcweir 	const sal_Int16 nAttrCount = xAttrList.is() ? xAttrList->getLength() : 0;
83cdf0e10cSrcweir 	for(sal_Int16 i=0; i < nAttrCount; i++)
84cdf0e10cSrcweir 	{
85cdf0e10cSrcweir 		OUString aLocalName;
86cdf0e10cSrcweir 		if( GetImport().GetNamespaceMap().GetKeyByAttrName( xAttrList->getNameByIndex( i ), &aLocalName ) == XML_NAMESPACE_DRAW )
87cdf0e10cSrcweir 		{
88cdf0e10cSrcweir 			const OUString sValue( xAttrList->getValueByIndex( i ) );
89cdf0e10cSrcweir 
90cdf0e10cSrcweir 			if( IsXMLToken( aLocalName, XML_NAME ) )
91cdf0e10cSrcweir 			{
92cdf0e10cSrcweir 				msName = sValue;
93cdf0e10cSrcweir 				break; // no more attributes needed
94cdf0e10cSrcweir 			}
95cdf0e10cSrcweir 		}
96cdf0e10cSrcweir 	}
97cdf0e10cSrcweir 
98cdf0e10cSrcweir }
99cdf0e10cSrcweir 
~SdXMLLayerContext()100cdf0e10cSrcweir SdXMLLayerContext::~SdXMLLayerContext()
101cdf0e10cSrcweir {
102cdf0e10cSrcweir }
103cdf0e10cSrcweir 
CreateChildContext(sal_uInt16 nPrefix,const::rtl::OUString & rLocalName,const Reference<XAttributeList> &)104cdf0e10cSrcweir SvXMLImportContext * SdXMLLayerContext::CreateChildContext( sal_uInt16 nPrefix, const ::rtl::OUString& rLocalName, const Reference< XAttributeList >& )
105cdf0e10cSrcweir {
106cdf0e10cSrcweir 	if( (XML_NAMESPACE_SVG == nPrefix) && IsXMLToken(rLocalName, XML_TITLE) )
107cdf0e10cSrcweir 	{
108cdf0e10cSrcweir 		return new XMLStringBufferImportContext( GetImport(), nPrefix, rLocalName, sTitleBuffer);
109cdf0e10cSrcweir 	}
110cdf0e10cSrcweir 	else if( (XML_NAMESPACE_SVG == nPrefix) && IsXMLToken(rLocalName, XML_DESC) )
111cdf0e10cSrcweir 	{
112cdf0e10cSrcweir 		return new XMLStringBufferImportContext( GetImport(), nPrefix, rLocalName, sDescriptionBuffer);
113cdf0e10cSrcweir 	}
114cdf0e10cSrcweir 	else
115cdf0e10cSrcweir 	{
116cdf0e10cSrcweir 		return new SvXMLImportContext( GetImport(), nPrefix, rLocalName );
117cdf0e10cSrcweir 	}
118cdf0e10cSrcweir }
119cdf0e10cSrcweir 
EndElement()120cdf0e10cSrcweir void SdXMLLayerContext::EndElement()
121cdf0e10cSrcweir {
122cdf0e10cSrcweir 	DBG_ASSERT( msName.getLength(), "xmloff::SdXMLLayerContext::EndElement(), draw:layer element without draw:name!" );
123cdf0e10cSrcweir 	if( msName.getLength() ) try
124cdf0e10cSrcweir 	{
125cdf0e10cSrcweir 		Reference< XPropertySet > xLayer;
126cdf0e10cSrcweir 
127cdf0e10cSrcweir 		if( mxLayerManager->hasByName( msName ) )
128cdf0e10cSrcweir 		{
129cdf0e10cSrcweir 			mxLayerManager->getByName( msName ) >>= xLayer;
130cdf0e10cSrcweir 			DBG_ASSERT( xLayer.is(), "xmloff::SdXMLLayerContext::EndElement(), failed to get existing XLayer!" );
131cdf0e10cSrcweir 		}
132cdf0e10cSrcweir 		else
133cdf0e10cSrcweir 		{
134cdf0e10cSrcweir 			Reference< XLayerManager > xLayerManager( mxLayerManager, UNO_QUERY );
135cdf0e10cSrcweir 			if( xLayerManager.is() )
136cdf0e10cSrcweir 				xLayer = Reference< XPropertySet >::query( xLayerManager->insertNewByIndex( xLayerManager->getCount() ) );
137cdf0e10cSrcweir 			DBG_ASSERT( xLayer.is(), "xmloff::SdXMLLayerContext::EndElement(), failed to create new XLayer!" );
138cdf0e10cSrcweir 
139cdf0e10cSrcweir 			if( xLayer.is() )
140cdf0e10cSrcweir 				xLayer->setPropertyValue( OUString( RTL_CONSTASCII_USTRINGPARAM( "Name" ) ), Any( msName ) );
141cdf0e10cSrcweir 		}
142cdf0e10cSrcweir 
143cdf0e10cSrcweir 		if( xLayer.is() )
144cdf0e10cSrcweir 		{
145cdf0e10cSrcweir 			xLayer->setPropertyValue( OUString( RTL_CONSTASCII_USTRINGPARAM("Title") ), Any( sTitleBuffer.makeStringAndClear() ) );
146cdf0e10cSrcweir 			xLayer->setPropertyValue( OUString( RTL_CONSTASCII_USTRINGPARAM("Description") ), Any( sDescriptionBuffer.makeStringAndClear() ) );
147cdf0e10cSrcweir 		}
148cdf0e10cSrcweir 	}
149cdf0e10cSrcweir 	catch( Exception& )
150cdf0e10cSrcweir 	{
151cdf0e10cSrcweir 		DBG_ERROR("SdXMLLayerContext::EndElement(), exception caught!");
152cdf0e10cSrcweir 	}
153cdf0e10cSrcweir }
154cdf0e10cSrcweir 
155cdf0e10cSrcweir 
156cdf0e10cSrcweir TYPEINIT1( SdXMLLayerSetContext, SvXMLImportContext );
157cdf0e10cSrcweir 
SdXMLLayerSetContext(SvXMLImport & rImport,sal_uInt16 nPrfx,const rtl::OUString & rLocalName,const com::sun::star::uno::Reference<com::sun::star::xml::sax::XAttributeList> &)158cdf0e10cSrcweir SdXMLLayerSetContext::SdXMLLayerSetContext( SvXMLImport& rImport, sal_uInt16 nPrfx,	const rtl::OUString& rLocalName,
159cdf0e10cSrcweir 		const com::sun::star::uno::Reference< com::sun::star::xml::sax::XAttributeList>&)
160cdf0e10cSrcweir : SvXMLImportContext(rImport, nPrfx, rLocalName)
161cdf0e10cSrcweir {
162cdf0e10cSrcweir 	Reference< XLayerSupplier > xLayerSupplier( rImport.GetModel(), UNO_QUERY );
163cdf0e10cSrcweir 	DBG_ASSERT( xLayerSupplier.is(), "xmloff::SdXMLLayerSetContext::SdXMLLayerSetContext(), XModel is not supporting XLayerSupplier!" );
164cdf0e10cSrcweir 	if( xLayerSupplier.is() )
165cdf0e10cSrcweir 		mxLayerManager = xLayerSupplier->getLayerManager();
166cdf0e10cSrcweir }
167cdf0e10cSrcweir 
~SdXMLLayerSetContext()168cdf0e10cSrcweir SdXMLLayerSetContext::~SdXMLLayerSetContext()
169cdf0e10cSrcweir {
170cdf0e10cSrcweir }
171cdf0e10cSrcweir 
CreateChildContext(sal_uInt16 nPrefix,const::rtl::OUString & rLocalName,const com::sun::star::uno::Reference<com::sun::star::xml::sax::XAttributeList> & xAttrList)172cdf0e10cSrcweir SvXMLImportContext * SdXMLLayerSetContext::CreateChildContext( sal_uInt16 nPrefix, const ::rtl::OUString& rLocalName,
173cdf0e10cSrcweir 		const com::sun::star::uno::Reference< com::sun::star::xml::sax::XAttributeList>& xAttrList )
174cdf0e10cSrcweir {
175cdf0e10cSrcweir 	return new SdXMLLayerContext( GetImport(), nPrefix, rLocalName, xAttrList, mxLayerManager );
176cdf0e10cSrcweir }
177