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