1 /*************************************************************************
3 * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
5 * Copyright 2008 by Sun Microsystems, Inc.
7 * OpenOffice.org - a multi-platform office productivity suite
9 * $RCSfile: xmlaustp.cxx,v $
12 * This file is part of OpenOffice.org.
14 * OpenOffice.org is free software: you can redistribute it and/or modify
15 * it under the terms of the GNU Lesser General Public License version 3
16 * only, as published by the Free Software Foundation.
18 * OpenOffice.org is distributed in the hope that it will be useful,
19 * but WITHOUT ANY WARRANTY; without even the implied warranty of
20 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
21 * GNU Lesser General Public License version 3 for more details
22 * (a copy is included in the LICENSE file that accompanied this code).
24 * You should have received a copy of the GNU Lesser General Public License
25 * version 3 along with OpenOffice.org. If not, see
26 * <http://www.openoffice.org/license.html>
27 * for a copy of the LGPLv3 License.
29 ************************************************************************/
31 // MARKER(update_precomp.py): autogen include statement, do not remove
32 #include "precompiled_xmloff.hxx"
35 #include <com/sun/star/container/XIndexReplace.hpp>
36 #include <tools/debug.hxx>
37 #include "impastpl.hxx"
38 #include <xmloff/xmlaustp.hxx>
39 #include <xmloff/families.hxx>
40 #include "xmlnmspe.hxx"
41 #include <xmloff/xmltoken.hxx>
42 #include <xmloff/xmlexp.hxx>
43 #include "XMLTextListAutoStylePool.hxx"
45 #ifndef _XMLOFF_PAGEMASTERSTYLEMAP_HXX
46 #include <xmloff/PageMasterStyleMap.hxx>
48 #include "PageMasterExportPropMapper.hxx"
49 #include "XMLBackgroundImageExport.hxx"
52 using namespace ::std
;
53 using ::rtl::OUString
;
54 using ::rtl::OUStringBuffer
;
56 using namespace ::com::sun::star
;
57 using namespace ::xmloff::token
;
62 static void lcl_exportDataStyle( SvXMLExport
& _rExport
, const UniReference
< XMLPropertySetMapper
>& _rxMapper
,
63 const XMLPropertyState
& _rProperty
)
65 DBG_ASSERT( _rxMapper
.is(), "xmloff::lcl_exportDataStyle: invalid property mapper!" );
66 // obtain the data style name
67 ::rtl::OUString sDataStyleName
;
68 _rProperty
.maValue
>>= sDataStyleName
;
69 DBG_ASSERT( sDataStyleName
.getLength(), "xmloff::lcl_exportDataStyle: invalid property value for the data style name!" );
72 _rExport
.AddAttribute(
73 _rxMapper
->GetEntryNameSpace( _rProperty
.mnIndex
),
74 _rxMapper
->GetEntryXMLName( _rProperty
.mnIndex
),
79 void SvXMLAutoStylePoolP::exportStyleAttributes(
82 const vector
< XMLPropertyState
>& rProperties
,
83 const SvXMLExportPropertyMapper
& rPropExp
,
84 const SvXMLUnitConverter
&,
85 const SvXMLNamespaceMap
&
88 if ( XML_STYLE_FAMILY_CONTROL_ID
== nFamily
)
89 { // it's a control-related style
90 UniReference
< XMLPropertySetMapper
> aPropertyMapper
= rPropExp
.getPropertySetMapper();
92 for ( vector
< XMLPropertyState
>::const_iterator pProp
= rProperties
.begin();
93 pProp
!= rProperties
.end();
97 if ( ( pProp
->mnIndex
> -1 )
98 && ( CTF_FORMS_DATA_STYLE
== aPropertyMapper
->GetEntryContextId( pProp
->mnIndex
) )
100 { // it's the data-style for a grid column
101 lcl_exportDataStyle( GetExport(), aPropertyMapper
, *pProp
);
106 if( (XML_STYLE_FAMILY_SD_GRAPHICS_ID
== nFamily
) || (XML_STYLE_FAMILY_SD_PRESENTATION_ID
== nFamily
) )
107 { // it's a graphics style
108 UniReference
< XMLPropertySetMapper
> aPropertyMapper
= rPropExp
.getPropertySetMapper();
109 DBG_ASSERT(aPropertyMapper
.is(), "SvXMLAutoStylePoolP::exportStyleAttributes: invalid property set mapper!");
111 sal_Bool bFoundControlShapeDataStyle
= sal_False
;
112 sal_Bool bFoundNumberingRulesName
= sal_False
;
114 for ( vector
< XMLPropertyState
>::const_iterator pProp
= rProperties
.begin();
115 pProp
!= rProperties
.end();
119 if (pProp
->mnIndex
> -1)
120 { // it's a valid property
121 switch( aPropertyMapper
->GetEntryContextId(pProp
->mnIndex
) )
123 case CTF_SD_CONTROL_SHAPE_DATA_STYLE
:
124 { // it's the control shape data style property
126 if (bFoundControlShapeDataStyle
)
128 DBG_ERROR("SvXMLAutoStylePoolP::exportStyleAttributes: found two properties with the ControlShapeDataStyle context id!");
129 // already added the attribute for the first occurence
133 lcl_exportDataStyle( GetExport(), aPropertyMapper
, *pProp
);
135 // check if there is another property with the special context id we're handling here
136 bFoundControlShapeDataStyle
= sal_True
;
139 case CTF_SD_NUMBERINGRULES_NAME
:
141 if (bFoundNumberingRulesName
)
143 DBG_ERROR("SvXMLAutoStylePoolP::exportStyleAttributes: found two properties with the numbering rules name context id!");
144 // already added the attribute for the first occurence
148 uno::Reference
< container::XIndexReplace
> xNumRule
;
149 pProp
->maValue
>>= xNumRule
;
150 if( xNumRule
.is() && (xNumRule
->getCount() > 0 ) )
152 const OUString
sName(((XMLTextListAutoStylePool
*)&GetExport().GetTextParagraphExport()->GetListAutoStylePool())->Add( xNumRule
));
154 GetExport().AddAttribute( XML_NAMESPACE_STYLE
, XML_LIST_STYLE_NAME
, GetExport().EncodeStyleName( sName
) );
157 bFoundNumberingRulesName
= sal_True
;
165 if( nFamily
== XML_STYLE_FAMILY_PAGE_MASTER
)
167 for( vector
< XMLPropertyState
>::const_iterator pProp
= rProperties
.begin(); pProp
!= rProperties
.end(); pProp
++ )
169 if (pProp
->mnIndex
> -1)
171 UniReference
< XMLPropertySetMapper
> aPropMapper
= rPropExp
.getPropertySetMapper();
172 sal_Int32 nIndex
= pProp
->mnIndex
;
173 sal_Int16 nContextID
= aPropMapper
->GetEntryContextId( nIndex
);
176 case CTF_PM_PAGEUSAGE
:
179 const XMLPropertyHandler
* pPropHdl
= aPropMapper
->GetPropertyHandler( nIndex
);
181 pPropHdl
->exportXML( sValue
, pProp
->maValue
,
182 GetExport().GetMM100UnitConverter() ) &&
183 ( ! IsXMLToken( sValue
, XML_ALL
) ) )
185 GetExport().AddAttribute( aPropMapper
->GetEntryNameSpace( nIndex
), aPropMapper
->GetEntryXMLName( nIndex
), sValue
);
195 void SvXMLAutoStylePoolP::exportStyleContent(
196 const ::com::sun::star::uno::Reference
< ::com::sun::star::xml::sax::XDocumentHandler
> &,
198 const vector
< XMLPropertyState
>& rProperties
,
199 const SvXMLExportPropertyMapper
& rPropExp
,
200 const SvXMLUnitConverter
&,
201 const SvXMLNamespaceMap
&
204 if( nFamily
== XML_STYLE_FAMILY_PAGE_MASTER
)
206 OUString
sWS( GetXMLToken(XML_WS
) );
208 sal_Int32
nHeaderStartIndex(-1);
209 sal_Int32
nHeaderEndIndex(-1);
210 sal_Int32
nFooterStartIndex(-1);
211 sal_Int32
nFooterEndIndex(-1);
212 sal_Bool
bHeaderStartIndex(sal_False
);
213 sal_Bool
bHeaderEndIndex(sal_False
);
214 sal_Bool
bFooterStartIndex(sal_False
);
215 sal_Bool
bFooterEndIndex(sal_False
);
217 UniReference
< XMLPropertySetMapper
> aPropMapper
= rPropExp
.getPropertySetMapper();
220 while(nIndex
< aPropMapper
->GetEntryCount())
222 switch( aPropMapper
->GetEntryContextId( nIndex
) & CTF_PM_FLAGMASK
)
224 case CTF_PM_HEADERFLAG
:
226 if (!bHeaderStartIndex
)
228 nHeaderStartIndex
= nIndex
;
229 bHeaderStartIndex
= sal_True
;
231 if (bFooterStartIndex
&& !bFooterEndIndex
)
233 nFooterEndIndex
= nIndex
;
234 bFooterEndIndex
= sal_True
;
238 case CTF_PM_FOOTERFLAG
:
240 if (!bFooterStartIndex
)
242 nFooterStartIndex
= nIndex
;
243 bFooterStartIndex
= sal_True
;
245 if (bHeaderStartIndex
&& !bHeaderEndIndex
)
247 nHeaderEndIndex
= nIndex
;
248 bHeaderEndIndex
= sal_True
;
255 if (!bHeaderEndIndex
)
256 nHeaderEndIndex
= nIndex
;
257 if (!bFooterEndIndex
)
258 nFooterEndIndex
= nIndex
;
260 // export header style element
262 SvXMLElementExport
aElem(
263 GetExport(), XML_NAMESPACE_STYLE
, XML_HEADER_STYLE
,
264 sal_True
, sal_True
);
267 GetExport(), rProperties
,
268 nHeaderStartIndex
, nHeaderEndIndex
, XML_EXPORT_FLAG_IGN_WS
);
271 // export footer style
273 SvXMLElementExport
aElem(
274 GetExport(), XML_NAMESPACE_STYLE
, XML_FOOTER_STYLE
,
275 sal_True
, sal_True
);
278 GetExport(), rProperties
,
279 nFooterStartIndex
, nFooterEndIndex
, XML_EXPORT_FLAG_IGN_WS
);
284 SvXMLAutoStylePoolP::SvXMLAutoStylePoolP()
286 DBG_ERROR("This constuctor is obsoleted and should not be used!");
290 SvXMLAutoStylePoolP::SvXMLAutoStylePoolP( SvXMLExport
& rExport
)
292 pImpl
= new SvXMLAutoStylePoolP_Impl( rExport
);
295 SvXMLAutoStylePoolP::~SvXMLAutoStylePoolP()
300 SvXMLExport
& SvXMLAutoStylePoolP::GetExport() const
302 return pImpl
->GetExport();
306 void SvXMLAutoStylePoolP::AddFamily(
308 const OUString
& rStrName
,
309 SvXMLExportPropertyMapper
* pMapper
,
313 UniReference
<SvXMLExportPropertyMapper
> xTmp
= pMapper
;
314 AddFamily( nFamily
, rStrName
, xTmp
, aStrPrefix
, bAsFamily
);
317 void SvXMLAutoStylePoolP::AddFamily(
319 const OUString
& rStrName
,
320 const UniReference
< SvXMLExportPropertyMapper
> & rMapper
,
321 const OUString
& rStrPrefix
,
324 pImpl
->AddFamily( nFamily
, rStrName
, rMapper
, rStrPrefix
, bAsFamily
);
327 void SvXMLAutoStylePoolP::RegisterName( sal_Int32 nFamily
,
328 const OUString
& rName
)
330 pImpl
->RegisterName( nFamily
, rName
);
333 void SvXMLAutoStylePoolP::GetRegisteredNames(
334 uno::Sequence
<sal_Int32
>& rFamilies
,
335 uno::Sequence
<OUString
>& rNames
)
337 pImpl
->GetRegisteredNames( rFamilies
, rNames
);
340 void SvXMLAutoStylePoolP::RegisterNames(
341 uno::Sequence
<sal_Int32
>& aFamilies
,
342 uno::Sequence
<OUString
>& aNames
)
344 DBG_ASSERT( aFamilies
.getLength() == aNames
.getLength(),
345 "aFamilies != aNames" );
347 // iterate over sequence(s) and call RegisterName(..) for each pair
348 const sal_Int32
* pFamilies
= aFamilies
.getConstArray();
349 const OUString
* pNames
= aNames
.getConstArray();
350 sal_Int32 nCount
= min( aFamilies
.getLength(), aNames
.getLength() );
351 for( sal_Int32 n
= 0; n
< nCount
; n
++ )
352 RegisterName( pFamilies
[n
], pNames
[n
] );
355 OUString
SvXMLAutoStylePoolP::Add( sal_Int32 nFamily
,
356 const vector
< XMLPropertyState
>& rProperties
)
360 pImpl
->Add(sName
, nFamily
, sEmpty
, rProperties
);
364 OUString
SvXMLAutoStylePoolP::Add( sal_Int32 nFamily
,
365 const OUString
& rParent
,
366 const vector
< XMLPropertyState
>& rProperties
, bool bDontSeek
)
369 pImpl
->Add(sName
, nFamily
, rParent
, rProperties
, sal_False
, bDontSeek
);
373 sal_Bool
SvXMLAutoStylePoolP::Add(OUString
& rName
, sal_Int32 nFamily
, const ::std::vector
< XMLPropertyState
>& rProperties
)
376 return pImpl
->Add(rName
, nFamily
, sEmpty
, rProperties
);
379 sal_Bool
SvXMLAutoStylePoolP::Add(OUString
& rName
, sal_Int32 nFamily
, const OUString
& rParent
, const ::std::vector
< XMLPropertyState
>& rProperties
)
381 return pImpl
->Add(rName
, nFamily
, rParent
, rProperties
);
384 sal_Bool
SvXMLAutoStylePoolP::AddNamed( const OUString
& rName
, sal_Int32 nFamily
, const OUString
& rParent
,
385 const ::std::vector
< XMLPropertyState
>& rProperties
)
388 return pImpl
->AddNamed(rName
, nFamily
, rParent
, rProperties
);
391 OUString
SvXMLAutoStylePoolP::AddAndCache( sal_Int32 nFamily
,
392 const vector
< XMLPropertyState
>& rProperties
)
396 pImpl
->Add(sName
, nFamily
, sEmpty
, rProperties
, sal_True
);
400 OUString
SvXMLAutoStylePoolP::AddAndCache( sal_Int32 nFamily
,
401 const OUString
& rParent
,
402 const vector
< XMLPropertyState
>& rProperties
)
405 pImpl
->Add(sName
, nFamily
, rParent
, rProperties
, sal_True
);
409 OUString
SvXMLAutoStylePoolP::AddAndCache( sal_Int32 nFamily
,
410 const OUString
& rParent
)
412 return pImpl
->AddToCache( nFamily
, rParent
);
415 OUString
SvXMLAutoStylePoolP::Find( sal_Int32 nFamily
,
416 const vector
< XMLPropertyState
>& rProperties
) const
419 return pImpl
->Find( nFamily
, sEmpty
, rProperties
);
422 OUString
SvXMLAutoStylePoolP::Find( sal_Int32 nFamily
,
423 const OUString
& rParent
,
424 const vector
< XMLPropertyState
>& rProperties
) const
426 return pImpl
->Find( nFamily
, rParent
, rProperties
);
429 OUString
SvXMLAutoStylePoolP::FindAndRemoveCached( sal_Int32 nFamily
) const
431 return pImpl
->FindAndRemoveCached( nFamily
);
435 void SvXMLAutoStylePoolP::exportXML( sal_Int32 nFamily
,
436 const uno::Reference
< ::com::sun::star::xml::sax::XDocumentHandler
> &,
437 const SvXMLUnitConverter
&,
438 const SvXMLNamespaceMap
&
441 pImpl
->exportXML( nFamily
,
442 GetExport().GetDocHandler(),
443 GetExport().GetMM100UnitConverter(),
444 GetExport().GetNamespaceMap(),
448 void SvXMLAutoStylePoolP::ClearEntries()
450 pImpl
->ClearEntries();