diff options
Diffstat (limited to 'sw/source/filter/xml/xmlexpit.cxx')
-rw-r--r-- | sw/source/filter/xml/xmlexpit.cxx | 706 |
1 files changed, 703 insertions, 3 deletions
diff --git a/sw/source/filter/xml/xmlexpit.cxx b/sw/source/filter/xml/xmlexpit.cxx index 77460ba87c31..c28cd6787e9b 100644 --- a/sw/source/filter/xml/xmlexpit.cxx +++ b/sw/source/filter/xml/xmlexpit.cxx @@ -2,9 +2,9 @@ * * $RCSfile: xmlexpit.cxx,v $ * - * $Revision: 1.1 $ + * $Revision: 1.2 $ * - * last change: $Author: mib $ $Date: 2001-07-04 14:14:26 $ + * last change: $Author: dvo $ $Date: 2001-07-09 20:10:42 $ * * The Contents of this file are made available subject to the terms of * either of the following licenses @@ -104,6 +104,73 @@ #include <svtools/svstdarr.hxx> #endif + + +#ifndef _HINTIDS_HXX +#include "hintids.hxx" +#endif + +#ifndef SW_UNOMID_HXX +#include "unomid.h" +#endif + +#ifndef _SVX_UNOMID_HXX +#include <svx/unomid.hxx> +#endif + +#ifndef _SVX_LRSPITEM_HXX +#include <svx/lrspitem.hxx> +#endif + +#ifndef _SVX_ULSPITEM_HXX +#include <svx/ulspitem.hxx> +#endif + +#ifndef _SVX_SHADITEM_HXX +#include <svx/shaditem.hxx> +#endif + +#ifndef _SVX_BOXITEM_HXX +#include <svx/boxitem.hxx> +#endif + +#ifndef _SVX_BRKITEM_HXX +#include <svx/brkitem.hxx> +#endif + +#ifndef _SVX_KEEPITEM_HXX +#include <svx/keepitem.hxx> +#endif + +#ifndef _SVX_BRSHITEM_HXX +#include <svx/brshitem.hxx> +#endif + +#ifndef _FMTPDSC_HXX +#include "fmtpdsc.hxx" +#endif + +#ifndef _FMTORNT_HXX +#include "fmtornt.hxx" +#endif + +#ifndef _FMTFSIZE_HXX +#include "fmtfsize.hxx" +#endif + +#ifndef _FMTLSPLT_HXX +#include "fmtlsplt.hxx" +#endif + +#ifndef _XMLOFF_XMLTOKEN_HXX +#include <xmloff/xmltoken.hxx> +#endif + +#ifndef _SW_XMLITHLP_HXX +#include "xmlithlp.hxx" +#endif + + using namespace ::rtl; using namespace ::com::sun::star; using namespace ::xmloff::token; @@ -225,7 +292,7 @@ void SvXMLExportItemMapper::exportXML( SvXMLAttributeList& rAttrList, else if( 0 == (rEntry.nMemberId & MID_FLAG_ELEMENT_ITEM_EXPORT) ) { OUString aValue; - if( rItem.exportXML( aValue, rEntry.nMemberId & MID_FLAG_MASK, + if( QueryXMLValue(rItem, aValue, rEntry.nMemberId & MID_FLAG_MASK, rUnitConverter ) ) { OUString sName( @@ -419,3 +486,636 @@ void SvXMLExportItemMapper::handleElementItem( DBG_ERROR( "element item not handled in xml export" ); } + +sal_Bool SvXMLExportItemMapper::QueryXMLValue( + const SfxPoolItem& rItem, + OUString& rValue, + sal_uInt16 nMemberId, + const SvXMLUnitConverter& rUnitConverter ) +{ + sal_Bool bOk = sal_False; + OUStringBuffer aOut; + + switch ( rItem.Which() ) + { + + case ITEMID_LRSPACE: + { + const SvxLRSpaceItem* pLRSpace = PTR_CAST(SvxLRSpaceItem, &rItem); + DBG_ASSERT( pLRSpace != NULL, "Wrong Which-ID!" ); + + sal_Bool bOk = sal_True; + switch( nMemberId ) + { + case MID_L_MARGIN: + if(pLRSpace->GetPropLeft() != 100) + rUnitConverter.convertPercent( aOut, pLRSpace->GetPropLeft() ); + else + rUnitConverter.convertMeasure( aOut, pLRSpace->GetTxtLeft() ); + break; + + case MID_R_MARGIN: + if(pLRSpace->GetPropRight() != 100) + rUnitConverter.convertPercent( aOut, pLRSpace->GetPropRight() ); + else + rUnitConverter.convertMeasure( aOut, pLRSpace->GetRight() ); + break; + + case MID_FIRST_AUTO: + if( pLRSpace->IsAutoFirst() ) + rUnitConverter.convertBool( aOut, pLRSpace->IsAutoFirst() ); + else + bOk = sal_False; + break; + + case MID_FIRST_LINE_INDENT: + if( !pLRSpace->IsAutoFirst() ) + { + if(pLRSpace->GetPropTxtFirstLineOfst() != 100) + rUnitConverter.convertPercent( + aOut, pLRSpace->GetPropTxtFirstLineOfst() ); + else + rUnitConverter.convertMeasure( aOut, pLRSpace->GetTxtFirstLineOfst() ); + } + else + bOk = sal_False; + break; + + default: + DBG_ERROR( "unknown member id!"); + bOk = sal_False; + break; + } + } + break; + + case ITEMID_ULSPACE: + { + const SvxULSpaceItem* pULSpace = PTR_CAST(SvxULSpaceItem, &rItem); + DBG_ASSERT( pULSpace != NULL, "Wrong Which-ID!" ); + + switch( nMemberId ) + { + case MID_UP_MARGIN: + if( pULSpace->GetPropUpper() != 100 ) + rUnitConverter.convertPercent( aOut, pULSpace->GetPropUpper() ); + else + rUnitConverter.convertMeasure( aOut, pULSpace->GetUpper() ); + break; + + case MID_LO_MARGIN: + if( pULSpace->GetPropLower() != 100 ) + rUnitConverter.convertPercent( aOut, pULSpace->GetPropLower() ); + else + rUnitConverter.convertMeasure( aOut, pULSpace->GetLower() ); + break; + + default: + DBG_ERROR("unknown MemberId"); + }; + + bOk = sal_True; + } + break; + + case ITEMID_SHADOW: + { + const SvxShadowItem* pShadow = PTR_CAST(SvxShadowItem, &rItem); + DBG_ASSERT( pShadow != NULL, "Wrong Which-ID" ); + + sal_Int32 nX = 1, nY = 1; + switch( pShadow->GetLocation() ) + { + case SVX_SHADOW_TOPLEFT: + nX = -1; + nY = -1; + break; + case SVX_SHADOW_TOPRIGHT: + nY = -1; + break; + case SVX_SHADOW_BOTTOMLEFT: + nX = -1; + break; + case SVX_SHADOW_BOTTOMRIGHT: + break; + case SVX_SHADOW_NONE: + default: + rValue = GetXMLToken(XML_NONE); + return sal_True; + } + + nX *= pShadow->GetWidth(); + nY *= pShadow->GetWidth(); + + rUnitConverter.convertColor( aOut, pShadow->GetColor() ); + aOut.append( sal_Unicode(' ') ); + rUnitConverter.convertMeasure( aOut, nX ); + aOut.append( sal_Unicode(' ') ); + rUnitConverter.convertMeasure( aOut, nY ); + + bOk = sal_True; + } + break; + + case ITEMID_BOX: + { + SvxBoxItem* pBox = PTR_CAST(SvxBoxItem, &rItem); + DBG_ASSERT( pBox != NULL, "Wrong WHich-ID" ); + + /** + xml -> MemberId + + border-padding ALL_BORDER_PADDING + border-padding-before LEFT_BORDER_PADDING + border-padding-after RIGHT_BORDER_PADDING + border-padding-start TOP_BORDER_PADDING + border-padding-end BOTTOM_BORDER_PADDING + + border ALL_BORDER + border-before LEFT_BORDER + border-after RIGHT_BORDER + border-start TOP_BORDER + border-end BOTTOM_BORDER + + border-line-width ALL_BORDER_LINE_WIDTH + border-line-width-before LEFT_BORDER_LINE_WIDTH + border-line-width-after RIGHT_BORDER_LINE_WIDTH + border-line-width-start TOP_BORDER_LINE_WIDTH + border-line-width-end BOTTOM_BORDER_LINE_WIDTH + */ + + const SvxBorderLine* pLeft = pBox->GetLeft(); + const SvxBorderLine* pRight = pBox->GetRight(); + const SvxBorderLine* pTop = pBox->GetTop(); + const SvxBorderLine* pBottom = pBox->GetBottom(); + sal_uInt16 nTopDist = pBox->GetDistance( BOX_LINE_TOP ); + sal_uInt16 nBottomDist = pBox->GetDistance( BOX_LINE_BOTTOM ); + sal_uInt16 nLeftDist = pBox->GetDistance( BOX_LINE_LEFT ); + sal_uInt16 nRightDist = pBox->GetDistance( BOX_LINE_RIGHT ); + + + // check if we need to export it + switch( nMemberId ) + { + case ALL_BORDER_PADDING: + case LEFT_BORDER_PADDING: + case RIGHT_BORDER_PADDING: + case TOP_BORDER_PADDING: + case BOTTOM_BORDER_PADDING: + { + sal_Bool bEqual = nLeftDist == nRightDist && + nLeftDist == nTopDist && + nLeftDist == nBottomDist; + // don't export individual paddings if all paddings are equal and + // don't export all padding if some paddings are not equal + if( (bEqual && ALL_BORDER_PADDING != nMemberId) || + (!bEqual && ALL_BORDER_PADDING == nMemberId) ) + return sal_False; + } + break; + case ALL_BORDER: + case LEFT_BORDER: + case RIGHT_BORDER: + case TOP_BORDER: + case BOTTOM_BORDER: + { + sal_Bool bEqual = ( NULL == pTop && NULL == pBottom && + NULL == pLeft && NULL == pRight ) || + ( pTop && pBottom && pLeft && pRight && + *pTop == *pBottom && *pTop == *pLeft && + *pTop == *pRight ); + + // don't export individual borders if all are the same and + // don't export all borders if some are not equal + if( (bEqual && ALL_BORDER != nMemberId) || + (!bEqual && ALL_BORDER == nMemberId) ) + return sal_False; + } + break; + case ALL_BORDER_LINE_WIDTH: + case LEFT_BORDER_LINE_WIDTH: + case RIGHT_BORDER_LINE_WIDTH: + case TOP_BORDER_LINE_WIDTH: + case BOTTOM_BORDER_LINE_WIDTH: + { + // if no line is set, there is nothing to export + if( !pTop && !pBottom && !pLeft && !pRight ) + return sal_False; + + sal_Bool bEqual = NULL != pTop && + NULL != pBottom && + NULL != pLeft && + NULL != pRight; + + if( bEqual ) + { + const sal_uInt16 nDistance = pTop->GetDistance(); + const sal_uInt16 nInWidth = pTop->GetInWidth(); + const sal_uInt16 nOutWidth = pTop->GetOutWidth(); + + bEqual = nDistance == pLeft->GetDistance() && + nInWidth == pLeft->GetInWidth() && + nOutWidth == pLeft->GetOutWidth() && + nDistance == pRight->GetDistance() && + nInWidth == pRight->GetInWidth() && + nOutWidth == pRight->GetOutWidth() && + nDistance == pBottom->GetDistance() && + nInWidth == pBottom->GetInWidth() && + nOutWidth == pBottom->GetOutWidth(); + } + + switch( nMemberId ) + { + case ALL_BORDER_LINE_WIDTH: + if( !bEqual || pTop->GetDistance() == 0 ) + return sal_False; + break; + case LEFT_BORDER_LINE_WIDTH: + if( bEqual || NULL == pLeft || + 0 == pLeft->GetDistance() ) + return sal_False; + break; + case RIGHT_BORDER_LINE_WIDTH: + if( bEqual || NULL == pRight || + 0 == pRight->GetDistance() ) + return sal_False; + break; + case TOP_BORDER_LINE_WIDTH: + if( bEqual || NULL == pTop || + 0 == pTop->GetDistance() ) + return sal_False; + break; + case BOTTOM_BORDER_LINE_WIDTH: + if( bEqual || NULL == pBottom || + 0 == pBottom->GetDistance() ) + return sal_False; + break; + } + } + break; + } + + // now export it export + switch( nMemberId ) + { + // padding + case ALL_BORDER_PADDING: + case LEFT_BORDER_PADDING: + rUnitConverter.convertMeasure( aOut, nLeftDist ); + break; + case RIGHT_BORDER_PADDING: + rUnitConverter.convertMeasure( aOut, nRightDist ); + break; + case TOP_BORDER_PADDING: + rUnitConverter.convertMeasure( aOut, nTopDist ); + break; + case BOTTOM_BORDER_PADDING: + rUnitConverter.convertMeasure( aOut, nBottomDist ); + break; + + // border + case ALL_BORDER: + case LEFT_BORDER: + case RIGHT_BORDER: + case TOP_BORDER: + case BOTTOM_BORDER: + { + const SvxBorderLine* pLine; + switch( nMemberId ) + { + case ALL_BORDER: + case LEFT_BORDER: + pLine = pLeft; + break; + case RIGHT_BORDER: + pLine = pRight; + break; + case TOP_BORDER: + pLine = pTop; + break; + case BOTTOM_BORDER: + pLine = pBottom; + break; + default: + pLine = NULL; + break; + } + + if( NULL != pLine ) + { + sal_Int32 nWidth = pLine->GetOutWidth(); + const sal_uInt16 nDistance = pLine->GetDistance(); + if( 0 != nDistance ) + { + nWidth += nDistance; + nWidth += pLine->GetInWidth(); + } + + enum XMLTokenEnum eStyle = + (0 == nDistance) ? XML_SOLID : XML_DOUBLE; + + rUnitConverter.convertMeasure( aOut, nWidth ); + aOut.append( sal_Unicode( ' ' ) ); + aOut.append( GetXMLToken( eStyle ) ); + aOut.append( sal_Unicode( ' ' ) ); + rUnitConverter.convertColor( aOut, pLine->GetColor() ); + + } + else + { + aOut.append( GetXMLToken(XML_NONE) ); + } + } + break; + + // width + case ALL_BORDER_LINE_WIDTH: + case LEFT_BORDER_LINE_WIDTH: + case RIGHT_BORDER_LINE_WIDTH: + case TOP_BORDER_LINE_WIDTH: + case BOTTOM_BORDER_LINE_WIDTH: + const SvxBorderLine* pLine; + switch( nMemberId ) + { + case ALL_BORDER_LINE_WIDTH: + case LEFT_BORDER_LINE_WIDTH: + pLine = pLeft; + break; + case RIGHT_BORDER_LINE_WIDTH: + pLine = pRight; + break; + case TOP_BORDER_LINE_WIDTH: + pLine = pTop; + break; + case BOTTOM_BORDER_LINE_WIDTH: + pLine = pBottom; + break; + default: + return sal_False; + } + rUnitConverter.convertMeasure( aOut, pLine->GetInWidth() ); + aOut.append( sal_Unicode( ' ' ) ); + rUnitConverter.convertMeasure( aOut, pLine->GetDistance() ); + aOut.append( sal_Unicode( ' ' ) ); + rUnitConverter.convertMeasure( aOut, pLine->GetOutWidth() ); + break; + } + + bOk = sal_True; + } + break; + + case ITEMID_FMTBREAK: + { + const SvxFmtBreakItem* pFmtBreak = PTR_CAST(SvxFmtBreakItem, &rItem); + DBG_ASSERT( pFmtBreak != NULL, "Wrong Which-ID" ); + + sal_uInt16 eEnum = 0; + + switch( nMemberId ) + { + case MID_BREAK_BEFORE: + switch( pFmtBreak->GetValue() ) + { + case SVX_BREAK_COLUMN_BEFORE: + eEnum = 1; + break; + case SVX_BREAK_PAGE_BEFORE: + eEnum = 2; + break; + case SVX_BREAK_NONE: + eEnum = 0; + break; + default: + return sal_False; + } + break; + case MID_BREAK_AFTER: + switch( pFmtBreak->GetValue() ) + { + case SVX_BREAK_COLUMN_AFTER: + eEnum = 1; + break; + case SVX_BREAK_PAGE_AFTER: + eEnum = 2; + break; + case SVX_BREAK_NONE: + eEnum = 0; + break; + default: + return sal_False; + } + break; + } + + bOk = rUnitConverter.convertEnum( aOut, eEnum, psXML_BreakType ); + } + break; + + case ITEMID_FMTKEEP: + { + SvxFmtKeepItem* pFmtKeep = PTR_CAST(SvxFmtKeepItem, &rItem); + DBG_ASSERT( pFmtKeep != NULL, "Wrong Which-ID" ); + + rUnitConverter.convertBool( aOut, pFmtKeep->GetValue() ); + bOk = sal_True; + } + break; + + case ITEMID_BRUSH: + { + SvxBrushItem* pBrush = PTR_CAST(SvxBrushItem, &rItem); + DBG_ASSERT( pBrush != NULL, "Wrong Which-ID" ); + + // note: the graphic is only exported if nMemberId equals + // MID_GRAPHIC.. + // If not, only the color or transparency is exported + + switch( nMemberId ) + { + case MID_BACK_COLOR: + if ( pBrush->GetColor().GetTransparency() ) + aOut.append( GetXMLToken(XML_TRANSPARENT) ); + else + rUnitConverter.convertColor( aOut, pBrush->GetColor()); + bOk = sal_True; + break; + + case MID_GRAPHIC_LINK: + if( pBrush->GetGraphicPos() != GPOS_NONE ) + { + uno::Any aAny; + pBrush->QueryValue( aAny, MID_GRAPHIC_URL ); + OUString sTmp; + aAny >>= sTmp; + aOut.append( sTmp ); + bOk = sal_True; + } + break; + + case MID_GRAPHIC_POSITION: + switch( pBrush->GetGraphicPos() ) + { + case GPOS_LT: + case GPOS_MT: + case GPOS_RT: + aOut.append( GetXMLToken(XML_TOP) ); + bOk = sal_True; + break; + case GPOS_LM: + case GPOS_MM: + case GPOS_RM: + aOut.append( GetXMLToken(XML_CENTER) ); + bOk = sal_True; + break; + case GPOS_LB: + case GPOS_MB: + case GPOS_RB: + aOut.append( GetXMLToken(XML_BOTTOM) ); + bOk = sal_True; + break; + } + + if( bOk ) + { + aOut.append( sal_Unicode( ' ' ) ); + + switch( pBrush->GetGraphicPos() ) + { + case GPOS_LT: + case GPOS_LB: + case GPOS_LM: + aOut.append( GetXMLToken(XML_LEFT) ); + break; + case GPOS_MT: + case GPOS_MM: + case GPOS_MB: + aOut.append( GetXMLToken(XML_CENTER) ); + break; + case GPOS_RM: + case GPOS_RT: + case GPOS_RB: + aOut.append( GetXMLToken(XML_RIGHT) ); + break; + } + } + break; + + case MID_GRAPHIC_REPEAT: + { + SvxGraphicPosition eGraphicPos = pBrush->GetGraphicPos(); + if( GPOS_AREA == eGraphicPos ) + { + aOut.append( GetXMLToken(XML_BACKGROUND_STRETCH) ); + bOk = sal_True; + } + else if( GPOS_NONE != eGraphicPos && GPOS_TILED != eGraphicPos ) + { + aOut.append( GetXMLToken(XML_BACKGROUND_NO_REPEAT) ); + bOk = sal_True; + } + } + break; + + case MID_GRAPHIC_FILTER: + if( pBrush->GetGraphicPos() != GPOS_NONE && + pBrush->GetGraphicFilter() ) + { + aOut.append( pBrush->GetGraphicFilter()->GetBuffer() ); + bOk = sal_True; + } + break; + } + } + break; + + case RES_PAGEDESC: + { + const SwFmtPageDesc* pPageDesc = PTR_CAST(SwFmtPageDesc, &rItem); + DBG_ASSERT( pPageDesc != NULL, "Wrong Which-ID" ); + + if( MID_PAGEDESC_PAGENUMOFFSET==nMemberId ) + { + + rUnitConverter.convertNumber( + aOut, (sal_Int32)pPageDesc->GetNumOffset() ); + bOk = sal_True; + } + } + break; + + case RES_LAYOUT_SPLIT: + { + const SwFmtLayoutSplit* pLayoutSplit = PTR_CAST(SwFmtLayoutSplit, &rItem); + DBG_ASSERT( pLayoutSplit != NULL, "Wrong Which-ID" ); + + rUnitConverter.convertBool( aOut, pLayoutSplit->GetValue() ); + bOk = sal_True; + } + break; + + case RES_HORI_ORIENT: + { + SwFmtHoriOrient* pHoriOrient = PTR_CAST(SwFmtHoriOrient, &rItem); + DBG_ASSERT( pHoriOrient != NULL, "Wrong Which-ID" ); + + rUnitConverter.convertEnum( aOut, pHoriOrient->GetHoriOrient(), + aXMLTableAlignMap ); + bOk = sal_True; + } + break; + + case RES_VERT_ORIENT: + { + SwFmtVertOrient* pVertOrient = PTR_CAST(SwFmtVertOrient, &rItem); + DBG_ASSERT( pVertOrient != NULL, "Wrong Which-ID" ); + + rUnitConverter.convertEnum( aOut, pVertOrient->GetVertOrient(), + aXMLTableVAlignMap ); + bOk = sal_True; + } + break; + + case RES_FRM_SIZE: + { + SwFmtFrmSize* pFrmSize = PTR_CAST(SwFmtFrmSize, &rItem); + DBG_ASSERT( pFrmSize != NULL, "Wrong Which-ID" ); + + sal_Bool bOutHeight = sal_False; + switch( nMemberId ) + { + case MID_FRMSIZE_REL_WIDTH: + if( pFrmSize->GetWidthPercent() ) + { + rUnitConverter.convertPercent( aOut, pFrmSize->GetWidthPercent() ); + bOk = sal_True; + } + break; + case MID_FRMSIZE_MIN_HEIGHT: + if( ATT_MIN_SIZE == pFrmSize->GetSizeType() ) + bOutHeight = sal_True; + break; + case MID_FRMSIZE_FIX_HEIGHT: + if( ATT_FIX_SIZE == pFrmSize->GetSizeType() ) + bOutHeight = sal_True; + break; + } + + if( bOutHeight ) + { + rUnitConverter.convertMeasure( aOut, pFrmSize->GetHeight() ); + bOk = sal_True; + } + } + break; + + default: + DBG_ERROR("GetXMLValue not implemented for this item."); + break; + } + + if ( bOk ) + rValue = aOut.makeStringAndClear(); + + return bOk; +} |