blob: ec7a08cf8b413e5a87aca6920bc7c19fce569d59 [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_xmloff.hxx"
#include <tools/debug.hxx>
#include <com/sun/star/awt/FontFamily.hpp>
#include <com/sun/star/awt/FontPitch.hpp>
#include <com/sun/star/table/BorderLine.hpp>
#include <com/sun/star/text/VertOrientation.hpp>
#include <com/sun/star/text/SizeType.hpp>
#include <tools/string.hxx>
#include <xmloff/XMLFontStylesContext.hxx>
#include <xmloff/txtprmap.hxx>
#include <xmloff/xmlimp.hxx>
#include "xmloff/txtimppr.hxx"
#define XML_LINE_LEFT 0
#define XML_LINE_RIGHT 1
#define XML_LINE_TOP 2
#define XML_LINE_BOTTOM 3
#define MIN_BORDER_DIST 49
using ::rtl::OUString;
using namespace ::com::sun::star;
using namespace ::com::sun::star::uno;
using namespace ::com::sun::star::table;
using namespace ::com::sun::star::text;
sal_Bool XMLTextImportPropertyMapper::handleSpecialItem(
XMLPropertyState& rProperty,
::std::vector< XMLPropertyState >& rProperties,
const ::rtl::OUString& rValue,
const SvXMLUnitConverter& rUnitConverter,
const SvXMLNamespaceMap& rNamespaceMap ) const
{
sal_Bool bRet = sal_False;
sal_Int32 nIndex = rProperty.mnIndex;
switch( getPropertySetMapper()->GetEntryContextId( nIndex ) )
{
case CTF_FONTNAME:
case CTF_FONTNAME_CJK:
case CTF_FONTNAME_CTL:
if( xFontDecls.Is() )
{
DBG_ASSERT(
( CTF_FONTFAMILYNAME ==
getPropertySetMapper()->GetEntryContextId(nIndex+1) &&
CTF_FONTSTYLENAME ==
getPropertySetMapper()->GetEntryContextId(nIndex+2) &&
CTF_FONTFAMILY ==
getPropertySetMapper()->GetEntryContextId(nIndex+3) &&
CTF_FONTPITCH ==
getPropertySetMapper()->GetEntryContextId(nIndex+4) &&
CTF_FONTCHARSET ==
getPropertySetMapper()->GetEntryContextId(nIndex+5) ) ||
( CTF_FONTFAMILYNAME_CJK ==
getPropertySetMapper()->GetEntryContextId(nIndex+1) &&
CTF_FONTSTYLENAME_CJK ==
getPropertySetMapper()->GetEntryContextId(nIndex+2) &&
CTF_FONTFAMILY_CJK ==
getPropertySetMapper()->GetEntryContextId(nIndex+3) &&
CTF_FONTPITCH_CJK ==
getPropertySetMapper()->GetEntryContextId(nIndex+4) &&
CTF_FONTCHARSET_CJK ==
getPropertySetMapper()->GetEntryContextId(nIndex+5) ) ||
( CTF_FONTFAMILYNAME_CTL ==
getPropertySetMapper()->GetEntryContextId(nIndex+1) &&
CTF_FONTSTYLENAME_CTL ==
getPropertySetMapper()->GetEntryContextId(nIndex+2) &&
CTF_FONTFAMILY_CTL ==
getPropertySetMapper()->GetEntryContextId(nIndex+3) &&
CTF_FONTPITCH_CTL ==
getPropertySetMapper()->GetEntryContextId(nIndex+4) &&
CTF_FONTCHARSET_CTL ==
getPropertySetMapper()->GetEntryContextId(nIndex+5) ),
"illegal property map" );
((XMLFontStylesContext *)&xFontDecls)->FillProperties(
rValue, rProperties,
rProperty.mnIndex+1, rProperty.mnIndex+2,
rProperty.mnIndex+3, rProperty.mnIndex+4,
rProperty.mnIndex+5 );
bRet = sal_False; // the property hasn't been filled
}
break;
// If we want to do StarMath/StarSymbol font conversion, then we'll
// want these special items to be treated just like regular ones...
// For the Writer, we'll catch and convert them in _FillPropertySet;
// the other apps probably don't care. For the other apps, we just
// imitate the default non-special-item mechanism.
case CTF_FONTFAMILYNAME:
case CTF_FONTFAMILYNAME_CJK:
case CTF_FONTFAMILYNAME_CTL:
bRet = getPropertySetMapper()->importXML( rValue, rProperty,
rUnitConverter );
break;
case CTF_TEXT_DISPLAY:
bRet = getPropertySetMapper()->importXML( rValue, rProperty,
rUnitConverter );
if( SvXMLImport::OOo_2x == GetImport().getGeneratorVersion() )
{
sal_Bool bHidden;
rProperty.maValue >>= bHidden;
bHidden = !bHidden;
rProperty.maValue <<= bHidden;
}
break;
default:
bRet = SvXMLImportPropertyMapper::handleSpecialItem( rProperty,
rProperties, rValue, rUnitConverter, rNamespaceMap );
break;
}
return bRet;
}
XMLTextImportPropertyMapper::XMLTextImportPropertyMapper(
const UniReference< XMLPropertySetMapper >& rMapper,
SvXMLImport& rImp,
XMLFontStylesContext *pFontDecls ) :
SvXMLImportPropertyMapper( rMapper, rImp ),
nSizeTypeIndex( -2 ),
nWidthTypeIndex( -2 ),
xFontDecls( pFontDecls )
{
}
XMLTextImportPropertyMapper::~XMLTextImportPropertyMapper()
{
}
void XMLTextImportPropertyMapper::SetFontDecls(
XMLFontStylesContext *pFontDecls )
{
xFontDecls = pFontDecls;
}
void XMLTextImportPropertyMapper::FontFinished(
XMLPropertyState *pFontFamilyNameState,
XMLPropertyState *pFontStyleNameState,
XMLPropertyState *pFontFamilyState,
XMLPropertyState *pFontPitchState,
XMLPropertyState *pFontCharsetState ) const
{
if( pFontFamilyNameState && pFontFamilyNameState->mnIndex != -1 )
{
OUString sName;
pFontFamilyNameState->maValue >>= sName;
if( !sName.getLength() )
pFontFamilyNameState->mnIndex = -1;
}
if( !pFontFamilyNameState || pFontFamilyNameState->mnIndex == -1 )
{
if( pFontStyleNameState )
pFontStyleNameState->mnIndex = -1;
if( pFontFamilyState )
pFontFamilyState->mnIndex = -1;
if( pFontPitchState )
pFontPitchState->mnIndex = -1;
if( pFontCharsetState )
pFontCharsetState->mnIndex = -1;
}
}
/** since the properties "CharFontFamilyName", "CharFontStyleName", "CharFontFamily",
"CharFontPitch" and "CharFontSet" and theire CJK and CTL counterparts are only
usable as a union, we add defaults to all values that are not set as long as we
have an "CharFontFamilyName"
#99928# CL */
void XMLTextImportPropertyMapper::FontDefaultsCheck(
XMLPropertyState* pFontFamilyName,
XMLPropertyState* pFontStyleName,
XMLPropertyState* pFontFamily,
XMLPropertyState* pFontPitch,
XMLPropertyState* pFontCharSet,
XMLPropertyState** ppNewFontStyleName,
XMLPropertyState** ppNewFontFamily,
XMLPropertyState** ppNewFontPitch,
XMLPropertyState** ppNewFontCharSet ) const
{
if( pFontFamilyName )
{
OUString sEmpty;
Any aAny;
if( !pFontStyleName )
{
aAny <<= sEmpty;
#ifdef DBG_UTIL
sal_Int16 nTmp = getPropertySetMapper()->GetEntryContextId(
pFontFamilyName->mnIndex + 1 );
DBG_ASSERT( nTmp == CTF_FONTSTYLENAME || nTmp == CTF_FONTSTYLENAME_CJK || nTmp == CTF_FONTSTYLENAME_CTL,
"wrong property context id" );
#endif
*ppNewFontStyleName = new XMLPropertyState( pFontFamilyName->mnIndex + 1,
aAny );
}
if( !pFontFamily )
{
aAny <<= (sal_Int16)com::sun::star::awt::FontFamily::DONTKNOW;
#ifdef DBG_UTIL
sal_Int16 nTmp = getPropertySetMapper()->GetEntryContextId(
pFontFamilyName->mnIndex + 2 );
DBG_ASSERT( nTmp == CTF_FONTFAMILY || nTmp == CTF_FONTFAMILY_CJK || nTmp == CTF_FONTFAMILY_CTL,
"wrong property context id" );
#endif
*ppNewFontFamily = new XMLPropertyState( pFontFamilyName->mnIndex + 2,
aAny );
}
if( !pFontPitch )
{
aAny <<= (sal_Int16)com::sun::star::awt::FontPitch::DONTKNOW;
#ifdef DBG_UTIL
sal_Int16 nTmp = getPropertySetMapper()->GetEntryContextId(
pFontFamilyName->mnIndex + 3 );
DBG_ASSERT( nTmp == CTF_FONTPITCH || nTmp == CTF_FONTPITCH_CJK || nTmp == CTF_FONTPITCH_CTL,
"wrong property context id" );
#endif
*ppNewFontPitch = new XMLPropertyState( pFontFamilyName->mnIndex + 3,
aAny );
}
if( !pFontCharSet )
{
aAny <<= (sal_Int16)gsl_getSystemTextEncoding();
#ifdef DBG_UTIL
sal_Int16 nTmp = getPropertySetMapper()->GetEntryContextId(
pFontFamilyName->mnIndex + 4 );
DBG_ASSERT( nTmp == CTF_FONTCHARSET || nTmp == CTF_FONTCHARSET_CJK || nTmp == CTF_FONTCHARSET_CTL,
"wrong property context id" );
#endif
*ppNewFontCharSet = new XMLPropertyState( pFontFamilyName->mnIndex + 4,
aAny );
}
}
}
void XMLTextImportPropertyMapper::finished(
::std::vector< XMLPropertyState >& rProperties,
sal_Int32 /*nStartIndex*/, sal_Int32 /*nEndIndex*/ ) const
{
sal_Bool bHasAnyHeight = sal_False;
sal_Bool bHasAnyMinHeight = sal_False;
sal_Bool bHasAnyWidth = sal_False;
sal_Bool bHasAnyMinWidth = sal_False;
XMLPropertyState* pFontFamilyName = 0;
XMLPropertyState* pFontStyleName = 0;
XMLPropertyState* pFontFamily = 0;
XMLPropertyState* pFontPitch = 0;
XMLPropertyState* pFontCharSet = 0;
XMLPropertyState* pNewFontStyleName = 0;
XMLPropertyState* pNewFontFamily = 0;
XMLPropertyState* pNewFontPitch = 0;
XMLPropertyState* pNewFontCharSet = 0;
XMLPropertyState* pFontFamilyNameCJK = 0;
XMLPropertyState* pFontStyleNameCJK = 0;
XMLPropertyState* pFontFamilyCJK = 0;
XMLPropertyState* pFontPitchCJK = 0;
XMLPropertyState* pFontCharSetCJK = 0;
XMLPropertyState* pNewFontStyleNameCJK = 0;
XMLPropertyState* pNewFontFamilyCJK = 0;
XMLPropertyState* pNewFontPitchCJK = 0;
XMLPropertyState* pNewFontCharSetCJK = 0;
XMLPropertyState* pFontFamilyNameCTL = 0;
XMLPropertyState* pFontStyleNameCTL = 0;
XMLPropertyState* pFontFamilyCTL = 0;
XMLPropertyState* pFontPitchCTL = 0;
XMLPropertyState* pFontCharSetCTL = 0;
XMLPropertyState* pNewFontStyleNameCTL = 0;
XMLPropertyState* pNewFontFamilyCTL = 0;
XMLPropertyState* pNewFontPitchCTL = 0;
XMLPropertyState* pNewFontCharSetCTL = 0;
XMLPropertyState* pAllBorderDistance = 0;
XMLPropertyState* pBorderDistances[4] = { 0, 0, 0, 0 };
XMLPropertyState* pNewBorderDistances[4] = { 0, 0, 0, 0 };
XMLPropertyState* pAllBorder = 0;
XMLPropertyState* pBorders[4] = { 0, 0, 0, 0 };
XMLPropertyState* pNewBorders[4] = { 0, 0, 0, 0 };
XMLPropertyState* pAllBorderWidth = 0;
XMLPropertyState* pBorderWidths[4] = { 0, 0, 0, 0 };
XMLPropertyState* pAnchorType = 0;
XMLPropertyState* pVertOrient = 0;
XMLPropertyState* pVertOrientRelAsChar = 0;
XMLPropertyState* pBackTransparency = NULL; // transparency in %
XMLPropertyState* pBackTransparent = NULL; // transparency as boolean
XMLPropertyState* pAllParaMargin = 0;
XMLPropertyState* pParaMargins[4] = { 0, 0, 0, 0 };
::std::auto_ptr<XMLPropertyState> pNewParaMargins[4];
XMLPropertyState* pAllMargin = 0;
XMLPropertyState* pMargins[4] = { 0, 0, 0, 0 };
::std::auto_ptr<XMLPropertyState> pNewMargins[4];
for( ::std::vector< XMLPropertyState >::iterator aIter = rProperties.begin();
aIter != rProperties.end();
++aIter )
{
XMLPropertyState* property = &(*aIter);
if( -1 == property->mnIndex )
continue;
switch( getPropertySetMapper()->GetEntryContextId( property->mnIndex ) )
{
case CTF_FONTFAMILYNAME: pFontFamilyName = property; break;
case CTF_FONTSTYLENAME: pFontStyleName = property; break;
case CTF_FONTFAMILY: pFontFamily = property; break;
case CTF_FONTPITCH: pFontPitch = property; break;
case CTF_FONTCHARSET: pFontCharSet = property; break;
case CTF_FONTFAMILYNAME_CJK: pFontFamilyNameCJK = property; break;
case CTF_FONTSTYLENAME_CJK: pFontStyleNameCJK = property; break;
case CTF_FONTFAMILY_CJK: pFontFamilyCJK = property; break;
case CTF_FONTPITCH_CJK: pFontPitchCJK = property; break;
case CTF_FONTCHARSET_CJK: pFontCharSetCJK = property; break;
case CTF_FONTFAMILYNAME_CTL: pFontFamilyNameCTL = property; break;
case CTF_FONTSTYLENAME_CTL: pFontStyleNameCTL = property; break;
case CTF_FONTFAMILY_CTL: pFontFamilyCTL = property; break;
case CTF_FONTPITCH_CTL: pFontPitchCTL = property; break;
case CTF_FONTCHARSET_CTL: pFontCharSetCTL = property; break;
case CTF_ALLBORDERDISTANCE: pAllBorderDistance = property; break;
case CTF_LEFTBORDERDISTANCE: pBorderDistances[XML_LINE_LEFT] = property; break;
case CTF_RIGHTBORDERDISTANCE: pBorderDistances[XML_LINE_RIGHT] = property; break;
case CTF_TOPBORDERDISTANCE: pBorderDistances[XML_LINE_TOP] = property; break;
case CTF_BOTTOMBORDERDISTANCE: pBorderDistances[XML_LINE_BOTTOM] = property; break;
case CTF_ALLBORDER: pAllBorder = property; break;
case CTF_LEFTBORDER: pBorders[XML_LINE_LEFT] = property; break;
case CTF_RIGHTBORDER: pBorders[XML_LINE_RIGHT] = property; break;
case CTF_TOPBORDER: pBorders[XML_LINE_TOP] = property; break;
case CTF_BOTTOMBORDER: pBorders[XML_LINE_BOTTOM] = property; break;
case CTF_ALLBORDERWIDTH: pAllBorderWidth = property; break;
case CTF_LEFTBORDERWIDTH: pBorderWidths[XML_LINE_LEFT] = property; break;
case CTF_RIGHTBORDERWIDTH: pBorderWidths[XML_LINE_RIGHT] = property; break;
case CTF_TOPBORDERWIDTH: pBorderWidths[XML_LINE_TOP] = property; break;
case CTF_BOTTOMBORDERWIDTH: pBorderWidths[XML_LINE_BOTTOM] = property; break;
case CTF_ANCHORTYPE: pAnchorType = property; break;
case CTF_VERTICALPOS: pVertOrient = property; break;
case CTF_VERTICALREL_ASCHAR: pVertOrientRelAsChar = property; break;
case CTF_FRAMEHEIGHT_MIN_ABS:
case CTF_FRAMEHEIGHT_MIN_REL:
// case CTF_SYNCHEIGHT_MIN:
bHasAnyMinHeight = sal_True;
// no break here!
case CTF_FRAMEHEIGHT_ABS:
case CTF_FRAMEHEIGHT_REL:
// case CTF_SYNCHEIGHT:
bHasAnyHeight = sal_True; break;
case CTF_FRAMEWIDTH_MIN_ABS:
case CTF_FRAMEWIDTH_MIN_REL:
bHasAnyMinWidth = sal_True;
// no break here!
case CTF_FRAMEWIDTH_ABS:
case CTF_FRAMEWIDTH_REL:
bHasAnyWidth = sal_True; break;
case CTF_BACKGROUND_TRANSPARENCY: pBackTransparency = property; break;
case CTF_BACKGROUND_TRANSPARENT: pBackTransparent = property; break;
case CTF_PARAMARGINALL:
pAllParaMargin = property;
break;
case CTF_PARAMARGINALL_REL:
{
sal_uInt32 nValue;
property->maValue >>= nValue;
// treat fo:margin="100%" as it is not exisiting as the
// corresponding core attribute classes - <SvxULSpaceItem> and
// <SvxLRSpaceItem> - are not able to treat such a value correctly.
// The result will be the same as the values will be inherited
// from parent, when the no margin attribute is given.
if ( nValue != 100 )
{
pAllParaMargin = property;
}
}
break;
case CTF_PARALEFTMARGIN:
case CTF_PARALEFTMARGIN_REL:
pParaMargins[XML_LINE_LEFT] = property; break;
case CTF_PARARIGHTMARGIN:
case CTF_PARARIGHTMARGIN_REL:
pParaMargins[XML_LINE_RIGHT] = property; break;
case CTF_PARATOPMARGIN:
case CTF_PARATOPMARGIN_REL:
pParaMargins[XML_LINE_TOP] = property; break;
case CTF_PARABOTTOMMARGIN:
case CTF_PARABOTTOMMARGIN_REL:
pParaMargins[XML_LINE_BOTTOM] = property; break;
case CTF_MARGINALL:
pAllMargin = property; break;
case CTF_MARGINLEFT:
pMargins[XML_LINE_LEFT] = property; break;
case CTF_MARGINRIGHT:
pMargins[XML_LINE_RIGHT] = property; break;
case CTF_MARGINTOP:
pMargins[XML_LINE_TOP] = property; break;
case CTF_MARGINBOTTOM:
pMargins[XML_LINE_BOTTOM] = property; break;
}
}
if( pFontFamilyName || pFontStyleName || pFontFamily ||
pFontPitch || pFontCharSet )
FontFinished( pFontFamilyName, pFontStyleName, pFontFamily,
pFontPitch, pFontCharSet );
if( pFontFamilyNameCJK || pFontStyleNameCJK || pFontFamilyCJK ||
pFontPitchCJK || pFontCharSetCJK )
FontFinished( pFontFamilyNameCJK, pFontStyleNameCJK, pFontFamilyCJK,
pFontPitchCJK, pFontCharSetCJK );
if( pFontFamilyNameCTL || pFontStyleNameCTL || pFontFamilyCTL ||
pFontPitchCTL || pFontCharSetCTL )
FontFinished( pFontFamilyNameCTL, pFontStyleNameCTL, pFontFamilyCTL,
pFontPitchCTL, pFontCharSetCTL );
for (sal_uInt16 i = 0; i < 4; i++)
{
if ( pAllParaMargin != NULL
&& pParaMargins[i] == NULL )
{
#ifdef DBG_UTIL
sal_Int16 nTmp = getPropertySetMapper()->GetEntryContextId(
pAllParaMargin->mnIndex + (2*i) + 2 );
OSL_ENSURE( nTmp >= CTF_PARALEFTMARGIN &&
nTmp <= CTF_PARABOTTOMMARGIN_REL,
"wrong property context id" );
#endif
// IMPORTANT NOTE: the index calculation depends on the right order in the property map
pNewParaMargins[i].reset(
new XMLPropertyState( pAllParaMargin->mnIndex + (2*i) + 2,
pAllParaMargin->maValue ) );
}
if (pAllMargin && !pMargins[i])
{
#ifdef DBG_UTIL
sal_Int16 nTmp = getPropertySetMapper()->GetEntryContextId(
pAllMargin->mnIndex + i + 1 );
OSL_ENSURE( nTmp >= CTF_MARGINLEFT && nTmp <= CTF_MARGINBOTTOM,
"wrong property context id" );
#endif
// IMPORTANT NOTE: the index calculation depends on the right order in the property map
pNewMargins[i].reset(
new XMLPropertyState( pAllMargin->mnIndex + i + 1,
pAllMargin->maValue ) );
}
if( pAllBorderDistance && !pBorderDistances[i] )
{
#ifdef DBG_UTIL
sal_Int16 nTmp = getPropertySetMapper()->GetEntryContextId(
pAllBorderDistance->mnIndex + i + 1 );
DBG_ASSERT( nTmp >= CTF_LEFTBORDERDISTANCE &&
nTmp <= CTF_BOTTOMBORDERDISTANCE,
"wrong property context id" );
#endif
pNewBorderDistances[i] =
new XMLPropertyState( pAllBorderDistance->mnIndex + i + 1,
pAllBorderDistance->maValue );
pBorderDistances[i] = pNewBorderDistances[i];
}
if( pAllBorder && !pBorders[i] )
{
#ifdef DBG_UTIL
sal_Int16 nTmp = getPropertySetMapper()->GetEntryContextId(
pAllBorder->mnIndex + i + 1 );
DBG_ASSERT( nTmp >= CTF_LEFTBORDER && nTmp <= CTF_BOTTOMBORDER,
"wrong property context id" );
#endif
pNewBorders[i] = new XMLPropertyState( pAllBorder->mnIndex + i + 1,
pAllBorder->maValue );
pBorders[i] = pNewBorders[i];
}
if( !pBorderWidths[i] )
pBorderWidths[i] = pAllBorderWidth;
else
pBorderWidths[i]->mnIndex = -1;
#ifdef XML_CHECK_UI_CONSTRAINS
sal_Bool bHasBorder = sal_False;
if( pBorders[i] )
{
table::BorderLine aBorderLine;
pBorders[i]->maValue >>= aBorderLine;
if( pBorderWidths[i] )
{
table::BorderLine aBorderLineWidth;
pBorderWidths[i]->maValue >>= aBorderLineWidth;
aBorderLine.OuterLineWidth = aBorderLineWidth.OuterLineWidth;
aBorderLine.InnerLineWidth = aBorderLineWidth.InnerLineWidth;
aBorderLine.LineDistance = aBorderLineWidth.LineDistance;
pBorders[i]->maValue <<= aBorderLine;
}
bHasBorder = (aBorderLine.OuterLineWidth +
aBorderLine.InnerLineWidth) > 0;
}
if( bHasBorder )
{
if( !pBorderDistances[i] )
{
#ifdef DBG_UTIL
sal_Int16 nTmp = getPropertySetMapper()->GetEntryContextId(
pBorders[i]->mnIndex + 5 );
DBG_ASSERT( nTmp >= CTF_LEFTBORDERDISTANCE &&
nTmp <= CTF_BOTTOMBORDERDISTANCE,
"wrong property context id" );
#endif
pNewBorderDistances[i] =
new XMLPropertyState( pBorders[i]->mnIndex + 5 );
pNewBorderDistances[i]->maValue <<= (sal_Int32)MIN_BORDER_DIST;
pBorderDistances[i] = pNewBorderDistances[i];
}
else
{
sal_Int32 nDist;
pBorderDistances[i]->maValue >>= nDist;
if( nDist < MIN_BORDER_DIST )
pBorderDistances[i]->maValue <<= (sal_Int32)MIN_BORDER_DIST;
}
}
else
{
if( pBorderDistances[i] )
{
sal_Int32 nDist;
pBorderDistances[i]->maValue >>= nDist;
if( nDist > 0 )
pBorderDistances[i]->maValue <<= (sal_Int32)0;
}
}
#else
if( pBorders[i] && pBorderWidths[i] )
{
table::BorderLine aBorderLine;
pBorders[i]->maValue >>= aBorderLine;
table::BorderLine aBorderLineWidth;
pBorderWidths[i]->maValue >>= aBorderLineWidth;
aBorderLine.OuterLineWidth = aBorderLineWidth.OuterLineWidth;
aBorderLine.InnerLineWidth = aBorderLineWidth.InnerLineWidth;
aBorderLine.LineDistance = aBorderLineWidth.LineDistance;
pBorders[i]->maValue <<= aBorderLine;
}
#endif
}
if (pAllParaMargin)
{
pAllParaMargin->mnIndex = -1;
}
if (pAllMargin)
{
pAllMargin->mnIndex = -1;
}
if( pAllBorderDistance )
pAllBorderDistance->mnIndex = -1;
if( pAllBorder )
pAllBorder->mnIndex = -1;
if( pAllBorderWidth )
pAllBorderWidth->mnIndex = -1;
if( pVertOrient && pVertOrientRelAsChar )
{
sal_Int16 nVertOrient;
pVertOrient->maValue >>= nVertOrient;
sal_Int16 nVertOrientRel = 0;
pVertOrientRelAsChar->maValue >>= nVertOrientRel;
switch( nVertOrient )
{
case VertOrientation::TOP:
nVertOrient = nVertOrientRel;
break;
case VertOrientation::CENTER:
switch( nVertOrientRel )
{
case VertOrientation::CHAR_TOP:
nVertOrient = VertOrientation::CHAR_CENTER;
break;
case VertOrientation::LINE_TOP:
nVertOrient = VertOrientation::LINE_CENTER;
break;
}
break;
case VertOrientation::BOTTOM:
switch( nVertOrientRel )
{
case VertOrientation::CHAR_TOP:
nVertOrient = VertOrientation::CHAR_BOTTOM;
break;
case VertOrientation::LINE_TOP:
nVertOrient = VertOrientation::LINE_BOTTOM;
break;
}
break;
}
pVertOrient->maValue <<= nVertOrient;
pVertOrientRelAsChar->mnIndex = -1;
}
FontDefaultsCheck( pFontFamilyName,
pFontStyleName, pFontFamily, pFontPitch, pFontCharSet,
&pNewFontStyleName, &pNewFontFamily, &pNewFontPitch, &pNewFontCharSet );
FontDefaultsCheck( pFontFamilyNameCJK,
pFontStyleNameCJK, pFontFamilyCJK, pFontPitchCJK, pFontCharSetCJK,
&pNewFontStyleNameCJK, &pNewFontFamilyCJK, &pNewFontPitchCJK, &pNewFontCharSetCJK );
FontDefaultsCheck( pFontFamilyNameCTL,
pFontStyleNameCTL, pFontFamilyCTL, pFontPitchCTL, pFontCharSetCTL,
&pNewFontStyleNameCTL, &pNewFontFamilyCTL, &pNewFontPitchCTL, &pNewFontCharSetCTL );
// #i5775# don't overwrite %transparency with binary transparency
if( ( pBackTransparency != NULL ) && ( pBackTransparent != NULL ) )
{
if( ! *(sal_Bool*)(pBackTransparent->maValue.getValue()) )
pBackTransparent->mnIndex = -1;
}
// insert newly created properties. This inavlidates all iterators!
// Most of the pXXX variables in this method are iterators and will be
// invalidated!!!
if( pNewFontStyleName )
{
rProperties.push_back( *pNewFontStyleName );
delete pNewFontStyleName;
}
if( pNewFontFamily )
{
rProperties.push_back( *pNewFontFamily );
delete pNewFontFamily;
}
if( pNewFontPitch )
{
rProperties.push_back( *pNewFontPitch );
delete pNewFontPitch;
}
if( pNewFontCharSet )
{
rProperties.push_back( *pNewFontCharSet );
delete pNewFontCharSet;
}
if( pNewFontStyleNameCJK )
{
rProperties.push_back( *pNewFontStyleNameCJK );
delete pNewFontStyleNameCJK;
}
if( pNewFontFamilyCJK )
{
rProperties.push_back( *pNewFontFamilyCJK );
delete pNewFontFamilyCJK;
}
if( pNewFontPitchCJK )
{
rProperties.push_back( *pNewFontPitchCJK );
delete pNewFontPitchCJK;
}
if( pNewFontCharSetCJK )
{
rProperties.push_back( *pNewFontCharSetCJK );
delete pNewFontCharSetCJK;
}
if( pNewFontStyleNameCTL)
{
rProperties.push_back( *pNewFontStyleNameCTL );
delete pNewFontStyleNameCTL;
}
if( pNewFontFamilyCTL )
{
rProperties.push_back( *pNewFontFamilyCTL );
delete pNewFontFamilyCTL;
}
if( pNewFontPitchCTL )
{
rProperties.push_back( *pNewFontPitchCTL );
delete pNewFontPitchCTL;
}
if( pNewFontCharSetCTL )
{
rProperties.push_back( *pNewFontCharSetCTL );
delete pNewFontCharSetCTL;
}
for (sal_uInt16 i=0; i<4; i++)
{
if (pNewParaMargins[i].get())
{
rProperties.push_back(*pNewParaMargins[i]);
}
if (pNewMargins[i].get())
{
rProperties.push_back(*pNewMargins[i]);
}
if( pNewBorderDistances[i] )
{
rProperties.push_back( *pNewBorderDistances[i] );
delete pNewBorderDistances[i];
}
if( pNewBorders[i] )
{
rProperties.push_back( *pNewBorders[i] );
delete pNewBorders[i];
}
}
if( bHasAnyHeight )
{
if( nSizeTypeIndex == -2 )
{
const_cast < XMLTextImportPropertyMapper * > ( this )
->nSizeTypeIndex = -1;
sal_Int32 nPropCount = getPropertySetMapper()->GetEntryCount();
for( sal_Int32 j=0; j < nPropCount; j++ )
{
if( CTF_SIZETYPE == getPropertySetMapper()
->GetEntryContextId( j ) )
{
const_cast < XMLTextImportPropertyMapper * > ( this )
->nSizeTypeIndex = j;
break;
}
}
}
if( nSizeTypeIndex != -1 )
{
XMLPropertyState aSizeTypeState( nSizeTypeIndex );
aSizeTypeState.maValue <<= (sal_Int16)( bHasAnyMinHeight
? SizeType::MIN
: SizeType::FIX);
rProperties.push_back( aSizeTypeState );
}
}
if( bHasAnyWidth )
{
if( nWidthTypeIndex == -2 )
{
const_cast < XMLTextImportPropertyMapper * > ( this )
->nWidthTypeIndex = -1;
sal_Int32 nCount = getPropertySetMapper()->GetEntryCount();
for( sal_Int32 j=0; j < nCount; j++ )
{
if( CTF_FRAMEWIDTH_TYPE == getPropertySetMapper()
->GetEntryContextId( j ) )
{
const_cast < XMLTextImportPropertyMapper * > ( this )
->nWidthTypeIndex = j;
break;
}
}
}
if( nWidthTypeIndex != -1 )
{
XMLPropertyState aSizeTypeState( nWidthTypeIndex );
aSizeTypeState.maValue <<= (sal_Int16)( bHasAnyMinWidth
? SizeType::MIN
: SizeType::FIX);
rProperties.push_back( aSizeTypeState );
}
}
// DO NOT USE ITERATORS/POINTERS INTO THE rProperties-VECTOR AFTER
// THIS LINE. All iterators into the rProperties-vector, especially all
// pXXX-type variables set in the first switch statement of this method,
// may have been invalidated by the above push_back() calls!
}