blob: d3cf7cb84a477d9e96188a9316913698197ce80f [file] [log] [blame]
/**************************************************************
*
* 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
*
* Unless required by applicable law or agreed to in writing,
* software distributed under the License is distributed on an
* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
* KIND, either express or implied. See the License for the
* specific language governing permissions and limitations
* under the License.
*
*************************************************************/
// MARKER(update_precomp.py): autogen include statement, do not remove
#include "precompiled_sw.hxx"
#include <hintids.hxx>
#include <rtl/ustring.hxx>
#include <rtl/ustrbuf.hxx>
#include <tools/shl.hxx>
#include <xmloff/xmluconv.hxx>
#include "xmlexpit.hxx"
#include <xmloff/nmspmap.hxx>
#include <xmloff/xmlnmspe.hxx>
#include <xmloff/xmltabe.hxx>
#include "xmlbrshe.hxx"
#include <editeng/tstpitem.hxx>
#include <editeng/brshitem.hxx>
#include <tools/fldunit.hxx>
#include <swmodule.hxx>
#include <doc.hxx>
#include "fmtornt.hxx"
#include <unomid.h>
#include "frmfmt.hxx"
#include "fmtfsize.hxx"
#include "swrect.hxx"
#include "xmlexp.hxx"
#include <editeng/memberids.hrc>
using ::rtl::OUString;
using ::rtl::OUStringBuffer;
using namespace ::com::sun::star;
using namespace ::com::sun::star::uno;
using namespace ::xmloff::token;
extern SvXMLItemMapEntry aXMLTableItemMap[];
extern SvXMLItemMapEntry aXMLTableRowItemMap[];
extern SvXMLItemMapEntry aXMLTableCellItemMap[];
class SwXMLTableItemMapper_Impl: public SvXMLExportItemMapper
{
SwXMLBrushItemExport aBrushItemExport;
protected:
sal_uInt32 nAbsWidth;
void AddAttribute( sal_uInt16 nPrefix, enum XMLTokenEnum eLName,
const OUString& rValue,
const SvXMLNamespaceMap& rNamespaceMap,
SvXMLAttributeList& rAttrList ) const;
public:
SwXMLTableItemMapper_Impl(
SvXMLItemMapEntriesRef rMapEntries,
SwXMLExport& rExp );
virtual ~SwXMLTableItemMapper_Impl();
virtual void handleSpecialItem( SvXMLAttributeList& rAttrList,
const SvXMLItemMapEntry& rEntry,
const SfxPoolItem& rItem,
const SvXMLUnitConverter& rUnitConverter,
const SvXMLNamespaceMap& rNamespaceMap,
const SfxItemSet *pSet = NULL ) const;
virtual void handleElementItem(
SvXMLExport& rExport,
const SvXMLItemMapEntry& rEntry,
const SfxPoolItem& rItem,
const SvXMLUnitConverter& rUnitConverter,
const SfxItemSet& rSet,
sal_uInt16 nFlags ) const;
inline void SetAbsWidth( sal_uInt32 nAbs );
};
SwXMLTableItemMapper_Impl::SwXMLTableItemMapper_Impl(
SvXMLItemMapEntriesRef rMapEntries,
SwXMLExport& rExp ) :
SvXMLExportItemMapper( rMapEntries ),
aBrushItemExport( rExp ),
nAbsWidth( USHRT_MAX )
{
}
SwXMLTableItemMapper_Impl::~SwXMLTableItemMapper_Impl()
{
}
void SwXMLTableItemMapper_Impl::AddAttribute( sal_uInt16 nPrefix,
enum XMLTokenEnum eLName,
const OUString& rValue,
const SvXMLNamespaceMap& rNamespaceMap,
SvXMLAttributeList& rAttrList ) const
{
OUString sName( rNamespaceMap.GetQNameByKey( nPrefix,
GetXMLToken(eLName) ) );
rAttrList.AddAttribute( sName, rValue );
}
void SwXMLTableItemMapper_Impl::handleSpecialItem(
SvXMLAttributeList& rAttrList,
const SvXMLItemMapEntry& rEntry,
const SfxPoolItem& rItem,
const SvXMLUnitConverter& rUnitConverter,
const SvXMLNamespaceMap& rNamespaceMap,
const SfxItemSet *pSet ) const
{
switch( rEntry.nWhichId )
{
case RES_LR_SPACE:
{
const SfxPoolItem *pItem;
if( pSet &&
SFX_ITEM_SET == pSet->GetItemState( RES_HORI_ORIENT, sal_True,
&pItem ) )
{
sal_Int16 eHoriOrient =
((const SwFmtHoriOrient *)pItem)->GetHoriOrient();
sal_Bool bExport = sal_False;
sal_uInt16 nMemberId =
static_cast<sal_uInt16>( rEntry.nMemberId & MID_SW_FLAG_MASK );
switch( nMemberId )
{
case MID_L_MARGIN:
bExport = text::HoriOrientation::NONE == eHoriOrient ||
text::HoriOrientation::LEFT_AND_WIDTH == eHoriOrient;
break;
case MID_R_MARGIN:
bExport = text::HoriOrientation::NONE == eHoriOrient;
break;
}
OUString sValue;
if( bExport && SvXMLExportItemMapper::QueryXMLValue(
rItem, sValue, nMemberId, rUnitConverter ) )
{
AddAttribute( rEntry.nNameSpace, rEntry.eLocalName, sValue,
rNamespaceMap, rAttrList );
}
}
}
break;
case RES_FRM_SIZE:
{
sal_uInt16 nMemberId =
static_cast<sal_uInt16>( rEntry.nMemberId & MID_SW_FLAG_MASK );
switch( nMemberId )
{
case MID_FRMSIZE_WIDTH:
if( nAbsWidth )
{
OUStringBuffer sBuffer;
rUnitConverter.convertMeasure( sBuffer, nAbsWidth );
AddAttribute( rEntry.nNameSpace, rEntry.eLocalName,
sBuffer.makeStringAndClear(),
rNamespaceMap, rAttrList );
}
break;
case MID_FRMSIZE_REL_WIDTH:
{
OUString sValue;
if( SvXMLExportItemMapper::QueryXMLValue(
rItem, sValue, nMemberId, rUnitConverter ) )
{
AddAttribute( rEntry.nNameSpace, rEntry.eLocalName,
sValue, rNamespaceMap, rAttrList );
}
}
break;
}
}
break;
}
}
/** this method is called for every item that has the
MID_SW_FLAG_ELEMENT_EXPORT flag set */
void SwXMLTableItemMapper_Impl::handleElementItem(
SvXMLExport& /*rExport*/,
const SvXMLItemMapEntry& rEntry,
const SfxPoolItem& rItem,
const SvXMLUnitConverter& /*rUnitConverter*/,
const SfxItemSet&,
sal_uInt16 ) const
{
switch( rEntry.nWhichId )
{
case RES_BACKGROUND:
{
((SwXMLTableItemMapper_Impl *)this)->aBrushItemExport.exportXML(
(const SvxBrushItem&)rItem );
}
break;
}
}
inline void SwXMLTableItemMapper_Impl::SetAbsWidth( sal_uInt32 nAbs )
{
nAbsWidth = nAbs;
}
// ----------------------------------------------------------------------------
void SwXMLExport::_InitItemExport()
{
// #110680#
pTwipUnitConv = new SvXMLUnitConverter( MAP_TWIP,
GetMM100UnitConverter().getXMLMeasureUnit(), getServiceFactory() );
xTableItemMap = new SvXMLItemMapEntries( aXMLTableItemMap );
xTableRowItemMap = new SvXMLItemMapEntries( aXMLTableRowItemMap );
xTableCellItemMap = new SvXMLItemMapEntries( aXMLTableCellItemMap );
pTableItemMapper = new SwXMLTableItemMapper_Impl( xTableItemMap, *this );
if( getDefaultVersion() > SvtSaveOptions::ODFVER_012 )
{
_GetNamespaceMap().Add(
GetXMLToken(XML_NP_TEXT_EXT),
GetXMLToken(XML_N_TEXT_EXT),
XML_NAMESPACE_TEXT_EXT);
}
}
void SwXMLExport::_FinitItemExport()
{
delete pTableItemMapper;
delete pTwipUnitConv;
}
void SwXMLExport::ExportTableFmt( const SwFrmFmt& rFmt, sal_uInt32 nAbsWidth )
{
((SwXMLTableItemMapper_Impl *)pTableItemMapper)
->SetAbsWidth( nAbsWidth );
ExportFmt( rFmt, XML_TABLE );
}