diff options
Diffstat (limited to 'bf_sw/source/filter/xml/sw_xmlfmte.cxx')
-rw-r--r-- | bf_sw/source/filter/xml/sw_xmlfmte.cxx | 353 |
1 files changed, 353 insertions, 0 deletions
diff --git a/bf_sw/source/filter/xml/sw_xmlfmte.cxx b/bf_sw/source/filter/xml/sw_xmlfmte.cxx new file mode 100644 index 000000000..39879c34c --- /dev/null +++ b/bf_sw/source/filter/xml/sw_xmlfmte.cxx @@ -0,0 +1,353 @@ +/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */ +/* + * This file is part of the LibreOffice project. + * + * This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. + * + * This file incorporates work covered by the following license notice: + * + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed + * with this work for additional information regarding copyright + * ownership. The ASF licenses this file to you under the Apache + * License, Version 2.0 (the "License"); you may not use this file + * except in compliance with the License. You may obtain a copy of + * the License at http://www.apache.org/licenses/LICENSE-2.0 . + */ + + +#ifdef _MSC_VER +#pragma hdrstop +#endif + +#include <com/sun/star/text/XTextDocument.hpp> + +#include <bf_xmloff/xmlnmspe.hxx> +#include <bf_xmloff/attrlist.hxx> +#include "xmlexpit.hxx" +#include <bf_xmloff/nmspmap.hxx> +#include <bf_xmloff/XMLTextListAutoStylePool.hxx> +#ifndef _XMLOFF_XMLTEXTMASTERPAGEEXPORT +#include <bf_xmloff/XMLTextMasterPageExport.hxx> +#endif + +#include <bf_xmloff/txtprmap.hxx> +#include <bf_xmloff/xmlaustp.hxx> +#include <bf_xmloff/families.hxx> +#include <bf_xmloff/ProgressBarHelper.hxx> + +#include <format.hxx> +#include <fmtpdsc.hxx> +#include <pagedesc.hxx> + +#include <cppuhelper/implbase4.hxx> + +#include <unostyle.hxx> +#include <cellatr.hxx> + +#include <com/sun/star/drawing/XDrawPageSupplier.hpp> +#include <com/sun/star/drawing/XDrawPage.hpp> +#include <com/sun/star/beans/XPropertySet.hpp> +#include <com/sun/star/lang/XMultiServiceFactory.hpp> + +#include "xmlexp.hxx" +#include <SwStyleNameMapper.hxx> +namespace binfilter { + +using namespace ::com::sun::star::beans; +using namespace ::com::sun::star::uno; +using namespace ::com::sun::star::text; +using namespace ::com::sun::star::drawing; +using namespace ::com::sun::star::lang; +using namespace ::binfilter::xmloff::token; + +using rtl::OUString; + +void SwXMLExport::ExportFmt( const SwFmt& rFmt, enum XMLTokenEnum eFamily ) +{ + // <style:style ...> + CheckAttrList(); + + // style:family="..." + DBG_ASSERT( RES_FRMFMT==rFmt.Which(), "frame format expected" ); + if( RES_FRMFMT != rFmt.Which() ) + return; + DBG_ASSERT( eFamily != XML_TOKEN_INVALID, "family must be specified" ); + // style:name="..." + AddAttribute( XML_NAMESPACE_STYLE, XML_NAME, rFmt.GetName() ); + + if( eFamily != XML_TOKEN_INVALID ) + AddAttribute( XML_NAMESPACE_STYLE, XML_FAMILY, eFamily ); + + // style:parent-style-name="..." (if its not the default only) + const SwFmt* pParent = rFmt.DerivedFrom(); + // Parent-Namen nur uebernehmen, wenn kein Default + OSL_ENSURE( !pParent || pParent->IsDefault(), "unexpected parent" ); + (void)pParent; + + OSL_ENSURE( USHRT_MAX == rFmt.GetPoolFmtId(), "pool ids arent'supported" ); + OSL_ENSURE( USHRT_MAX == rFmt.GetPoolHelpId(), "help ids arent'supported" ); + OSL_ENSURE( USHRT_MAX == rFmt.GetPoolHelpId() || + UCHAR_MAX == rFmt.GetPoolHlpFileId(), "help file ids aren't supported" ); + + // style:master-page-name + if( RES_FRMFMT == rFmt.Which() && XML_TABLE == eFamily ) + { + const SfxPoolItem *pItem; + if( SFX_ITEM_SET == rFmt.GetAttrSet().GetItemState( RES_PAGEDESC, + sal_False, &pItem ) ) + { + String sName; + const SwPageDesc *pPageDesc = + ((const SwFmtPageDesc *)pItem)->GetPageDesc(); + if( pPageDesc ) + SwStyleNameMapper::FillProgName( + pPageDesc->GetName(), + sName, + GET_POOLID_PAGEDESC, + sal_True); + AddAttribute( XML_NAMESPACE_STYLE, XML_MASTER_PAGE_NAME, sName ); + } + } + + if( XML_TABLE_CELL == eFamily ) + { + DBG_ASSERT(RES_FRMFMT == rFmt.Which(), "only frame format"); + + const SfxPoolItem *pItem; + if( SFX_ITEM_SET == + rFmt.GetAttrSet().GetItemState( RES_BOXATR_FORMAT, + sal_False, &pItem ) ) + { + sal_Int32 nFormat = (sal_Int32) + ((const SwTblBoxNumFormat *)pItem)->GetValue(); + + if ( (nFormat != -1) && (nFormat != NUMBERFORMAT_TEXT) ) + { + // if we have a format, register and then export + // (Careful: here we assume that data styles will be + // written after cell styles) + addDataStyle(nFormat); + OUString sDataStyleName = getDataStyleName(nFormat); + if( sDataStyleName.getLength() > 0 ) + AddAttribute( XML_NAMESPACE_STYLE, XML_DATA_STYLE_NAME, + sDataStyleName ); + } + } + } + + { + SvXMLElementExport aElem( *this, XML_NAMESPACE_STYLE, XML_STYLE, + sal_True, sal_True ); + + SvXMLItemMapEntriesRef xItemMap; + if( XML_TABLE == eFamily ) + xItemMap = xTableItemMap; + else if( XML_TABLE_ROW == eFamily ) + xItemMap = xTableRowItemMap; + else if( XML_TABLE_CELL == eFamily ) + xItemMap = xTableCellItemMap; + + if( xItemMap.Is() ) + { + SvXMLExportItemMapper& rItemMapper = GetTableItemMapper(); + rItemMapper.setMapEntries( xItemMap ); + + GetTableItemMapper().exportXML( *this, + rFmt.GetAttrSet(), + GetTwipUnitConverter(), + XML_EXPORT_FLAG_IGN_WS ); + } + } +} + + +void SwXMLExport::_ExportStyles( sal_Bool bUsed ) +{ + SvXMLExport::_ExportStyles( bUsed ); + + // drawing defaults + GetShapeExport()->ExportGraphicDefaults(); + + GetTextParagraphExport()->exportTextStyles( bUsed + ,IsShowProgress() + ); +} + +void SwXMLExport::_ExportAutoStyles() +{ + // The order in which styles are collected *MUST* be the same as + // the order in which they are exported. Otherwise, caching will + // fail. + + if( (getExportFlags() & (EXPORT_MASTERSTYLES|EXPORT_CONTENT)) != 0 ) + { + if( (getExportFlags() & EXPORT_CONTENT) == 0 ) + { + // only master pages are exported => styles for frames bound + // to frames (but none for frames bound to pages) need to be + // collected. + GetTextParagraphExport()->collectFramesBoundToFrameAutoStyles(); + } + else + { + // content (and optional master pages) are exported => styles + // for frames bound to frame or to pages need to be + // collected. + GetTextParagraphExport()->collectFramesBoundToPageOrFrameAutoStyles( + bShowProgress ); + } + + } + + // exported in _ExportMasterStyles + if( (getExportFlags() & EXPORT_MASTERSTYLES) != 0 ) + GetPageExport()->collectAutoStyles( sal_False ); + + // if we don't export styles (i.e. in content stream only, but not + // in single-stream case), then we can save ourselves a bit of + // work and memory by not collecting field masters + if( (getExportFlags() & EXPORT_STYLES ) == 0 ) + GetTextParagraphExport()->exportUsedDeclarations( sal_False ); + + // exported in _ExportContent + if( (getExportFlags() & EXPORT_CONTENT) != 0 ) + { + GetTextParagraphExport()->exportTrackedChanges( sal_True ); + Reference < XTextDocument > xTextDoc( GetModel(), UNO_QUERY ); + Reference < XText > xText = xTextDoc->getText(); + + // collect form autostyle + // (do this before collectTextAutoStyles, 'cause the shapes need the results of the work + // done by examineForms) + Reference<XDrawPageSupplier> xDrawPageSupplier( GetModel(), UNO_QUERY ); + if (xDrawPageSupplier.is() && GetFormExport().is()) + { + Reference<XDrawPage> xPage = xDrawPageSupplier->getDrawPage(); + if (xPage.is()) + GetFormExport()->examineForms(xPage); + } + + GetTextParagraphExport()->collectTextAutoStyles( xText, bShowProgress ); + } + + GetTextParagraphExport()->exportTextAutoStyles(); + GetShapeExport()->exportAutoStyles(); + if( (getExportFlags() & EXPORT_MASTERSTYLES) != 0 ) + GetPageExport()->exportAutoStyles(); + + // we rely on data styles being written after cell styles in the + // ExportFmt() method; so be careful when changing order. + exportAutoDataStyles(); + + sal_uInt16 nContentAutostyles = EXPORT_CONTENT | EXPORT_AUTOSTYLES; + if ( ( getExportFlags() & nContentAutostyles ) == nContentAutostyles ) + GetFormExport()->exportAutoStyles(); +} + +XMLPageExport* SwXMLExport::CreatePageExport() +{ + return new XMLTextMasterPageExport( *this ); +} + +void SwXMLExport::_ExportMasterStyles() +{ + // export master styles + GetPageExport()->exportMasterStyles( sal_False ); +} + +// --------------------------------------------------------------------- +class SwXMLAutoStylePoolP : public SvXMLAutoStylePoolP +{ + SvXMLExport& rExport; + const OUString sListStyleName; + const OUString sMasterPageName; + const OUString sCDATA; + +protected: + + virtual void exportStyleAttributes( + SvXMLAttributeList& rAttrList, + sal_Int32 nFamily, + const ::std::vector< XMLPropertyState >& rProperties, + const SvXMLExportPropertyMapper& rPropExp + , const SvXMLUnitConverter& rUnitConverter, + const SvXMLNamespaceMap& rNamespaceMap + ) const; +public: + + SwXMLAutoStylePoolP( SvXMLExport& rExport ); + virtual ~SwXMLAutoStylePoolP(); +}; + +void SwXMLAutoStylePoolP::exportStyleAttributes( + SvXMLAttributeList& rAttrList, + sal_Int32 nFamily, + const ::std::vector< XMLPropertyState >& rProperties, + const SvXMLExportPropertyMapper& rPropExp + , const SvXMLUnitConverter& rUnitConverter, + const SvXMLNamespaceMap& rNamespaceMap + ) const +{ + SvXMLAutoStylePoolP::exportStyleAttributes( rAttrList, nFamily, rProperties, rPropExp, rUnitConverter, rNamespaceMap); + + if( XML_STYLE_FAMILY_TEXT_PARAGRAPH == nFamily ) + { + for( ::std::vector< XMLPropertyState >::const_iterator + aProperty = rProperties.begin(); + aProperty != rProperties.end(); + ++aProperty ) + { + switch( rPropExp.getPropertySetMapper()-> + GetEntryContextId( aProperty->mnIndex ) ) + { + case CTF_NUMBERINGSTYLENAME: + { + OUString sStyleName; + aProperty->maValue >>= sStyleName; + if( sStyleName.getLength() ) + { + OUString sTmp = rExport.GetTextParagraphExport()->GetListAutoStylePool().Find( sStyleName ); + if( sTmp.getLength() ) + sStyleName = sTmp; + GetExport().AddAttribute( XML_NAMESPACE_STYLE, + sListStyleName, sStyleName ); + } + } + break; + case CTF_PAGEDESCNAME: + { + OUString sStyleName; + aProperty->maValue >>= sStyleName; + GetExport().AddAttribute( XML_NAMESPACE_STYLE, + sMasterPageName, sStyleName ); + } + break; + } + } + } +} + +SwXMLAutoStylePoolP::SwXMLAutoStylePoolP(SvXMLExport& rExp ) : + SvXMLAutoStylePoolP( rExp ), + rExport( rExp ), + sListStyleName( GetXMLToken( XML_LIST_STYLE_NAME ) ), + sMasterPageName( GetXMLToken( XML_MASTER_PAGE_NAME ) ), + sCDATA( GetXMLToken( XML_CDATA ) ) +{ +} + + +SwXMLAutoStylePoolP::~SwXMLAutoStylePoolP() +{ +} + +SvXMLAutoStylePoolP* SwXMLExport::CreateAutoStylePool() +{ + return new SwXMLAutoStylePoolP( *this ); +} +} + +/* vim:set shiftwidth=4 softtabstop=4 expandtab: */ |