editeng/source/items/frmitems.cxx | 133 ++++++++---- include/editeng/brushitem.hxx | 3 include/editeng/memberids.hrc | 1 offapi/UnoApi_offapi.mk | 1 offapi/com/sun/star/drawing/ShadingPattern.idl | 225 +++++++++++++++++++++ offapi/com/sun/star/style/CharacterProperties.idl | 5 sw/inc/unoprnms.hxx | 4 sw/qa/extras/ooxmlexport/data/fdo65400.docx |binary sw/qa/extras/ooxmlexport/ooxmlexport.cxx | 13 + sw/source/core/unocore/unomap.cxx | 3 sw/source/core/unocore/unoprnms.cxx | 3 sw/source/filter/ww8/docxattributeoutput.cxx | 21 +- sw/source/filter/ww8/ww8par6.cxx | 135 ++++++------ writerfilter/source/dmapper/CellColorHandler.cxx | 230 ++++++++++++++-------- writerfilter/source/dmapper/CellColorHandler.hxx | 2 writerfilter/source/dmapper/PropertyIds.cxx | 1 writerfilter/source/dmapper/PropertyIds.hxx | 1 writerfilter/source/ooxml/model.xml | 32 +-- 18 files changed, 601 insertions(+), 212 deletions(-)
New commits: commit 26d40686128e70916a636e20f5ccc5763bbb6cc8 Author: Adam Co <rattles2...@gmail.com> Date: Sun Jun 23 10:49:28 2013 +0300 fdo65400: fix for Character Shading being lost This bug fixes the DOCX import and export filters, adds a new property to the document model and updates the UNO API. There is no need to add layout \ UI updates, because in Word the only way to turn this on\off is using a simple button, and there is no way to control the shading color itself. However, ODF import \ export filters should be updated in a future commit. Conflicts: sw/qa/extras/ooxmlexport/ooxmlexport.cxx Change-Id: I1d34cec79289e38c08e42a4c6265d998e1edfdef Reviewed-on: https://gerrit.libreoffice.org/4452 Reviewed-by: Miklos Vajna <vmik...@suse.cz> diff --git a/editeng/source/items/frmitems.cxx b/editeng/source/items/frmitems.cxx index 566a375..8dedafd 100644 --- a/editeng/source/items/frmitems.cxx +++ b/editeng/source/items/frmitems.cxx @@ -41,6 +41,7 @@ #include <com/sun/star/awt/Size.hpp> #include <com/sun/star/text/WritingMode2.hpp> #include <com/sun/star/frame/status/UpperLowerMarginScale.hpp> +#include <com/sun/star/drawing/ShadingPattern.hpp> #include <unotools/ucbstreamhelper.hxx> #include <limits.h> @@ -79,6 +80,7 @@ using namespace ::editeng; using namespace ::rtl; using namespace ::com::sun::star; +using namespace ::com::sun::star::drawing; using namespace ::com::sun::star::table::BorderLineStyle; @@ -3322,12 +3324,13 @@ SvxBrushItem::SvxBrushItem( sal_uInt16 _nWhich ) : SfxPoolItem( _nWhich ), - aColor ( COL_TRANSPARENT ), - pImpl ( new SvxBrushItem_Impl( 0 ) ), - pStrLink ( NULL ), - pStrFilter ( NULL ), - eGraphicPos ( GPOS_NONE ), - bLoadAgain ( sal_True ) + aColor ( COL_TRANSPARENT ), + nShadingValue ( ShadingPattern::CLEAR ), + pImpl ( new SvxBrushItem_Impl( 0 ) ), + pStrLink ( NULL ), + pStrFilter ( NULL ), + eGraphicPos ( GPOS_NONE ), + bLoadAgain ( sal_True ) { } @@ -3338,12 +3341,13 @@ SvxBrushItem::SvxBrushItem( const Color& rColor, sal_uInt16 _nWhich) : SfxPoolItem( _nWhich ), - aColor ( rColor ), - pImpl ( new SvxBrushItem_Impl( 0 ) ), - pStrLink ( NULL ), - pStrFilter ( NULL ), - eGraphicPos ( GPOS_NONE ), - bLoadAgain ( sal_True ) + aColor ( rColor ), + nShadingValue ( ShadingPattern::CLEAR ), + pImpl ( new SvxBrushItem_Impl( 0 ) ), + pStrLink ( NULL ), + pStrFilter ( NULL ), + eGraphicPos ( GPOS_NONE ), + bLoadAgain ( sal_True ) { } @@ -3355,12 +3359,13 @@ SvxBrushItem::SvxBrushItem( const Graphic& rGraphic, SvxGraphicPosition ePos, SfxPoolItem( _nWhich ), - aColor ( COL_TRANSPARENT ), - pImpl ( new SvxBrushItem_Impl( new GraphicObject( rGraphic ) ) ), - pStrLink ( NULL ), - pStrFilter ( NULL ), - eGraphicPos ( ( GPOS_NONE != ePos ) ? ePos : GPOS_MM ), - bLoadAgain ( sal_True ) + aColor ( COL_TRANSPARENT ), + nShadingValue ( ShadingPattern::CLEAR ), + pImpl ( new SvxBrushItem_Impl( new GraphicObject( rGraphic ) ) ), + pStrLink ( NULL ), + pStrFilter ( NULL ), + eGraphicPos ( ( GPOS_NONE != ePos ) ? ePos : GPOS_MM ), + bLoadAgain ( sal_True ) { DBG_ASSERT( GPOS_NONE != ePos, "SvxBrushItem-Ctor with GPOS_NONE == ePos" ); @@ -3373,12 +3378,13 @@ SvxBrushItem::SvxBrushItem( const GraphicObject& rGraphicObj, SfxPoolItem( _nWhich ), - aColor ( COL_TRANSPARENT ), - pImpl ( new SvxBrushItem_Impl( new GraphicObject( rGraphicObj ) ) ), - pStrLink ( NULL ), - pStrFilter ( NULL ), - eGraphicPos ( ( GPOS_NONE != ePos ) ? ePos : GPOS_MM ), - bLoadAgain ( sal_True ) + aColor ( COL_TRANSPARENT ), + nShadingValue ( ShadingPattern::CLEAR ), + pImpl ( new SvxBrushItem_Impl( new GraphicObject( rGraphicObj ) ) ), + pStrLink ( NULL ), + pStrFilter ( NULL ), + eGraphicPos ( ( GPOS_NONE != ePos ) ? ePos : GPOS_MM ), + bLoadAgain ( sal_True ) { DBG_ASSERT( GPOS_NONE != ePos, "SvxBrushItem-Ctor with GPOS_NONE == ePos" ); @@ -3392,12 +3398,13 @@ SvxBrushItem::SvxBrushItem( SfxPoolItem( _nWhich ), - aColor ( COL_TRANSPARENT ), - pImpl ( new SvxBrushItem_Impl( NULL ) ), - pStrLink ( new String( rLink ) ), - pStrFilter ( new String( rFilter ) ), - eGraphicPos ( ( GPOS_NONE != ePos ) ? ePos : GPOS_MM ), - bLoadAgain ( sal_True ) + aColor ( COL_TRANSPARENT ), + nShadingValue ( ShadingPattern::CLEAR ), + pImpl ( new SvxBrushItem_Impl( NULL ) ), + pStrLink ( new String( rLink ) ), + pStrFilter ( new String( rFilter ) ), + eGraphicPos ( ( GPOS_NONE != ePos ) ? ePos : GPOS_MM ), + bLoadAgain ( sal_True ) { DBG_ASSERT( GPOS_NONE != ePos, "SvxBrushItem-Ctor with GPOS_NONE == ePos" ); @@ -3410,11 +3417,12 @@ SvxBrushItem::SvxBrushItem( SvStream& rStream, sal_uInt16 nVersion, SfxPoolItem( _nWhich ), - aColor ( COL_TRANSPARENT ), - pImpl ( new SvxBrushItem_Impl( NULL ) ), - pStrLink ( NULL ), - pStrFilter ( NULL ), - eGraphicPos ( GPOS_NONE ) + aColor ( COL_TRANSPARENT ), + nShadingValue ( ShadingPattern::CLEAR ), + pImpl ( new SvxBrushItem_Impl( NULL ) ), + pStrLink ( NULL ), + pStrFilter ( NULL ), + eGraphicPos ( GPOS_NONE ) { sal_Bool bTrans; @@ -3525,12 +3533,12 @@ SvxBrushItem::SvxBrushItem( SvStream& rStream, sal_uInt16 nVersion, SvxBrushItem::SvxBrushItem( const SvxBrushItem& rItem ) : SfxPoolItem( rItem.Which() ), - - pImpl ( new SvxBrushItem_Impl( NULL ) ), - pStrLink ( NULL ), - pStrFilter ( NULL ), - eGraphicPos ( GPOS_NONE ), - bLoadAgain ( sal_True ) + nShadingValue ( ShadingPattern::CLEAR ), + pImpl ( new SvxBrushItem_Impl( NULL ) ), + pStrLink ( NULL ), + pStrFilter ( NULL ), + eGraphicPos ( GPOS_NONE ), + bLoadAgain ( sal_True ) { *this = rItem; @@ -3616,9 +3624,16 @@ bool SvxBrushItem::QueryValue( uno::Any& rVal, sal_uInt8 nMemberId ) const rVal <<= sFilter; } break; - case MID_GRAPHIC_TRANSPARENCY : + + case MID_GRAPHIC_TRANSPARENCY: rVal <<= pImpl->nGraphicTransparency; break; + + case MID_SHADING_VALUE: + { + rVal <<= (sal_Int32)(nShadingValue); + } + break; } return true; @@ -3732,6 +3747,16 @@ bool SvxBrushItem::PutValue( const uno::Any& rVal, sal_uInt8 nMemberId ) } } break; + + case MID_SHADING_VALUE: + { + sal_uInt32 nVal = 0; + if (!(rVal >>= nVal)) + return false; + + SetShadingValue( nVal ); + } + break; } return true; @@ -3800,6 +3825,9 @@ SvxBrushItem& SvxBrushItem::operator=( const SvxBrushItem& rItem ) pImpl->pGraphicObject = new GraphicObject( *rItem.pImpl->pGraphicObject ); } } + + nShadingValue = rItem.nShadingValue; + pImpl->nGraphicTransparency = rItem.pImpl->nGraphicTransparency; return *this; } @@ -3840,6 +3868,11 @@ int SvxBrushItem::operator==( const SfxPoolItem& rAttr ) const ( *pImpl->pGraphicObject == *rCmp.pImpl->pGraphicObject ); } } + + if (bEqual) + { + bEqual = nShadingValue == rCmp.nShadingValue; + } } return bEqual; @@ -4049,6 +4082,11 @@ void SvxBrushItem::SetGraphicFilter( const String& rNew ) } } +void SvxBrushItem::SetShadingValue( const sal_uInt32 nNew ) +{ + nShadingValue = nNew; +} + //static SvxGraphicPosition SvxBrushItem::WallpaperStyle2GraphicPos( WallpaperStyle eStyle ) { @@ -4097,11 +4135,12 @@ WallpaperStyle SvxBrushItem::GraphicPos2WallpaperStyle( SvxGraphicPosition ePos } SvxBrushItem::SvxBrushItem( const CntWallpaperItem& rItem, sal_uInt16 _nWhich ) : - SfxPoolItem( _nWhich ), - pImpl( new SvxBrushItem_Impl( 0 ) ), - pStrLink(0), - pStrFilter(0), - bLoadAgain( sal_True ) + SfxPoolItem ( _nWhich ), + nShadingValue ( ShadingPattern::CLEAR ), + pImpl ( new SvxBrushItem_Impl( 0 ) ), + pStrLink ( 0), + pStrFilter ( 0), + bLoadAgain ( sal_True ) { aColor = rItem.GetColor(); diff --git a/include/editeng/brushitem.hxx b/include/editeng/brushitem.hxx index c7130bd..d18882a 100644 --- a/include/editeng/brushitem.hxx +++ b/include/editeng/brushitem.hxx @@ -49,6 +49,7 @@ class SvxBrushItem_Impl; class EDITENG_DLLPUBLIC SvxBrushItem : public SfxPoolItem { Color aColor; + sal_Int32 nShadingValue; SvxBrushItem_Impl* pImpl; String* pStrLink; String* pStrFilter; @@ -104,11 +105,13 @@ public: void PurgeMedium() const; + sal_uInt32 GetShadingValue() const { return nShadingValue; } const Graphic* GetGraphic() const; const GraphicObject* GetGraphicObject() const; const String* GetGraphicLink() const { return pStrLink; } const String* GetGraphicFilter() const { return pStrFilter; } + void SetShadingValue( const sal_uInt32 nNew ); void SetGraphicPos( SvxGraphicPosition eNew ); void SetGraphic( const Graphic& rNew ); void SetGraphicObject( const GraphicObject& rNewObj ); diff --git a/include/editeng/memberids.hrc b/include/editeng/memberids.hrc index 1dbe7ba..9152c36 100644 --- a/include/editeng/memberids.hrc +++ b/include/editeng/memberids.hrc @@ -171,6 +171,7 @@ #define MID_GRAPHIC_TRANSPARENCY 8 #define MID_BACK_COLOR_R_G_B 9 #define MID_BACK_COLOR_TRANSPARENCY 10 +#define MID_SHADING_VALUE 11 //SvxFmtBreakItem #define MID_BREAK_BEFORE 0 diff --git a/offapi/UnoApi_offapi.mk b/offapi/UnoApi_offapi.mk index a96bcd4..e6e19a9 100644 --- a/offapi/UnoApi_offapi.mk +++ b/offapi/UnoApi_offapi.mk @@ -2305,6 +2305,7 @@ $(eval $(call gb_UnoApi_add_idlfiles,offapi,offapi/com/sun/star/drawing,\ ProjectionMode \ RectanglePoint \ ShadeMode \ + ShadingPattern \ SnapObjectType \ TextAdjust \ TextAnimationDirection \ diff --git a/offapi/com/sun/star/drawing/ShadingPattern.idl b/offapi/com/sun/star/drawing/ShadingPattern.idl new file mode 100644 index 0000000..abc3190 --- /dev/null +++ b/offapi/com/sun/star/drawing/ShadingPattern.idl @@ -0,0 +1,225 @@ +/* -*- 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/. + */ + +#ifndef __com_sun_star_drawing_ShadingPattern_idl__ +#define __com_sun_star_drawing_ShadingPattern_idl__ + + + +module com { module sun { module star { module drawing { + +/** The ShadingPattern determines the background color pattern against + which characters and graphics are displayed, typically in tables. + The color can be no color or it can be a specific color with + a transparency or pattern value. + */ +constants ShadingPattern +{ + /* Clear */ + const long CLEAR = 0x0000; + + /* Solid */ + const long SOLID = 0x0001; + + /* 5% - pct5 */ + const long PCT5 = 0x0002; + + /* 10% - pct10 */ + const long PCT10 = 0x0003; + + /* 20% - pct20 */ + const long PCT20 = 0x0004; + + /* 25% - pct25 */ + const long PCT25 = 0x0005; + + /* 30% - pct30 */ + const long PCT30 = 0x0006; + + /* 40% - pct40 */ + const long PCT40 = 0x0007; + + /* 50% - pct50 */ + const long PCT50 = 0x0008; + + /* 60% - pct60 */ + const long PCT60 = 0x0009; + + /* 70% - pct70 */ + const long PCT70 = 0x000A; + + /* 75% - pct75 */ + const long PCT75 = 0x000B; + + /* 80% - pct80 */ + const long PCT80 = 0x000C; + + /* 90% - pct90 */ + const long PCT90 = 0x000D; + + + + /* Horizontal Stripe */ + const long HORZ_STRIPE = 0x000E; + + /* Vertical Stripe */ + const long VERT_STRIPE = 0x000F; + + /* Reverse Diagonal Stripe */ + const long REVERSE_DIAG_STRIPE = 0x0010; + + /* Diagonal Stripe */ + const long DIAG_STRIPE = 0x0011; + + /* Horizontal Cross */ + const long HORZ_CROSS = 0x0012; + + /* Diagonal Cross */ + const long DIAG_CROSS = 0x0013; + + /* Thin Horizontal Stripe */ + const long THIN_HORZ_STRIPE = 0x0014; + + /* Thin Vertical Stripe */ + const long THIN_VERT_STRIPE = 0x0015; + + /* Thin Reverse Diagonal Stripe */ + const long THIN_REVERSE_DIAG_STRIPE = 0x0016; + + /* Thin Diagonal Stripe */ + const long THIN_DIAG_STRIPE = 0x0017; + + /* Thin Horizontal Cross */ + const long THIN_HORZ_CROSS = 0x0018; + + /* Thin Diagonal Cross */ + const long THIN_DIAG_CROSS = 0x0019; + + + + /* Unused 1 */ + const long UNUSED_1 = 0x001A; + + /* Unused 2 */ + const long UNUSED_2 = 0x001B; + + /* Unused 3 */ + const long UNUSED_3 = 0x001C; + + /* Unused 4 */ + const long UNUSED_4 = 0x001D; + + /* Unused 5 */ + const long UNUSED_5 = 0x001E; + + /* Unused 6 */ + const long UNUSED_6 = 0x001F; + + /* Unused 7 */ + const long UNUSED_7 = 0x0020; + + /* Unused 8 */ + const long UNUSED_8 = 0x0021; + + /* Unused 9 */ + const long UNUSED_9 = 0x0022; + + + + /* 2.5% */ + const long PCT2 = 0x0023; + + /* 7.5% */ + const long PCT7 = 0x0024; + + /* 12.5% - pct12 */ + const long PCT12 = 0x0025; + + /* 15% - pct15 */ + const long PCT15 = 0x0026; + + /* 17.5% */ + const long PCT17 = 0x0027; + + /* 22.5% */ + const long PCT22 = 0x0028; + + /* 27.5% */ + const long PCT27 = 0x0029; + + /* 32.5% */ + const long PCT32 = 0x002A; + + /* 35% - pct35 */ + const long PCT35 = 0x002B; + + /* 37.5% - pct37 */ + const long PCT37 = 0x002C; + + /* 42.5% */ + const long PCT42 = 0x002D; + + /* 45% - pct45 */ + const long PCT45 = 0x002E; + + /* 47.5% */ + const long PCT47 = 0x002F; + + /* 52.5% */ + const long PCT52 = 0x0030; + + /* 55% - pct55 */ + const long PCT55 = 0x0031; + + /* 57.5% */ + const long PCT57 = 0x0032; + + /* 62.5% - pct62 */ + const long PCT62 = 0x0033; + + /* 65% - pct65 */ + const long PCT65 = 0x0034; + + /* 67.5% */ + const long PCT67 = 0x0035; + + /* 72.5% */ + const long PCT72 = 0x0036; + + /* 77.5% */ + const long PCT77 = 0x0037; + + /* 82.5% */ + const long PCT82 = 0x0038; + + /* 85% - pct85 */ + const long PCT85 = 0x0039; + + /* 87.5% - pct87 */ + const long PCT87 = 0x003A; + + /* 92.5% */ + const long PCT92 = 0x003B; + + /* 95% - pct95 */ + const long PCT95 = 0x003C; + + /* 97.5% */ + const long PCT97 = 0x003D; + + /* Nil */ + const long NIL = 0xFFFF; +}; + + +}; }; }; }; + +#endif + +/* vim:set shiftwidth=4 softtabstop=4 expandtab: */ diff --git a/offapi/com/sun/star/style/CharacterProperties.idl b/offapi/com/sun/star/style/CharacterProperties.idl index 067a42c..8ba1a61 100644 --- a/offapi/com/sun/star/style/CharacterProperties.idl +++ b/offapi/com/sun/star/style/CharacterProperties.idl @@ -118,6 +118,11 @@ published service CharacterProperties [optional, property] com::sun::star::util::Color CharBackColor; + /** This optional property contains the text shading value. + */ + [optional, property] long CharShadingValue; + + /** This property determines if the text background color is set to transparent. */ diff --git a/sw/inc/unoprnms.hxx b/sw/inc/unoprnms.hxx index fb6e9d3..68a1f4b 100644 --- a/sw/inc/unoprnms.hxx +++ b/sw/inc/unoprnms.hxx @@ -822,7 +822,9 @@ enum SwPropNameIds /* 0760 */ UNO_NAME_DEFAULT_PAGE_MODE, -/* 0761 */ SW_PROPNAME_END +/* 0761 */ UNO_NAME_CHAR_SHADING_VALUE, + +/* 0762 */ SW_PROPNAME_END // new items in this array must match SwPropNameTab aPropNameTab }; diff --git a/sw/qa/extras/ooxmlexport/data/fdo65400.docx b/sw/qa/extras/ooxmlexport/data/fdo65400.docx new file mode 100644 index 0000000..c247e9f Binary files /dev/null and b/sw/qa/extras/ooxmlexport/data/fdo65400.docx differ diff --git a/sw/qa/extras/ooxmlexport/ooxmlexport.cxx b/sw/qa/extras/ooxmlexport/ooxmlexport.cxx index b4d855a..db12382 100644 --- a/sw/qa/extras/ooxmlexport/ooxmlexport.cxx +++ b/sw/qa/extras/ooxmlexport/ooxmlexport.cxx @@ -84,6 +84,7 @@ public: void testFdo64238_a(); void testFdo64238_b(); void testFdo56679(); + void testFdo65400(); CPPUNIT_TEST_SUITE(Test); #if !defined(MACOSX) && !defined(WNT) @@ -142,6 +143,7 @@ void Test::run() {"fdo64238_a.docx", &Test::testFdo64238_a}, {"fdo64238_b.docx", &Test::testFdo64238_b}, {"fdo56679.docx", &Test::testFdo56679}, + {"fdo65400.docx", &Test::testFdo65400}, }; // Don't test the first import of these, for some reason those tests fail const char* aBlacklist[] = { @@ -865,6 +867,17 @@ void Test::testFdo56679() CPPUNIT_ASSERT_EQUAL(sal_Int32(0xFF0000), getProperty<sal_Int32>(xText, "CharUnderlineColor")); } +void Test::testFdo65400() +{ + // The problem was that if in Word you choose 'Character Shading' - then the text portion + // is marked with 'w:shd val=pct15'. LO did not store this value and so when importing and exporting + // this value was lost (and so Word did not show 'Character Shading' was on) + uno::Reference< text::XTextRange > paragraph1 = getParagraph( 1 ); + uno::Reference< text::XTextRange > shaded = getRun( paragraph1, 2, "normal" ); + CPPUNIT_ASSERT_EQUAL( sal_Int32( 0x0026 ), getProperty< sal_Int32 >( shaded, "CharShadingValue" )); + CPPUNIT_ASSERT_EQUAL( sal_Int32( 0xd8d8d8 ), getProperty< sal_Int32 >( shaded, "CharBackColor" )); +} + CPPUNIT_TEST_SUITE_REGISTRATION(Test); CPPUNIT_PLUGIN_IMPLEMENT(); diff --git a/sw/source/core/unocore/unomap.cxx b/sw/source/core/unocore/unomap.cxx index 8a0bc61..da8857c 100644 --- a/sw/source/core/unocore/unomap.cxx +++ b/sw/source/core/unocore/unomap.cxx @@ -234,7 +234,8 @@ SwUnoPropertyMapProvider::~SwUnoPropertyMapProvider() { SW_PROP_NMID(UNO_NAME_CHAR_RELIEF), RES_CHRATR_RELIEF, CPPU_E2T(CPPUTYPE_INT16), PropertyAttribute::MAYBEVOID, MID_RELIEF }, \ { SW_PROP_NMID(UNO_NAME_SNAP_TO_GRID), RES_PARATR_SNAPTOGRID, CPPU_E2T(CPPUTYPE_BOOLEAN), PropertyAttribute::MAYBEVOID, 0 }, \ { SW_PROP_NMID(UNO_NAME_PARA_IS_CONNECT_BORDER), RES_PARATR_CONNECT_BORDER, CPPU_E2T(CPPUTYPE_BOOLEAN), PropertyAttribute::MAYBEVOID, 0}, \ - { SW_PROP_NMID(UNO_NAME_WRITING_MODE), RES_FRAMEDIR, CPPU_E2T(CPPUTYPE_INT16), PROPERTY_NONE, 0 }, + { SW_PROP_NMID(UNO_NAME_WRITING_MODE), RES_FRAMEDIR, CPPU_E2T(CPPUTYPE_INT16), PROPERTY_NONE, 0 }, \ + { SW_PROP_NMID(UNO_NAME_CHAR_SHADING_VALUE), RES_CHRATR_BACKGROUND, CPPU_E2T(CPPUTYPE_INT32), PROPERTY_NONE, MID_SHADING_VALUE }, #define COMMON_CRSR_PARA_PROPERTIES_WITHOUT_FN \ COMMON_CRSR_PARA_PROPERTIES_WITHOUT_FN_01 \ diff --git a/sw/source/core/unocore/unoprnms.cxx b/sw/source/core/unocore/unoprnms.cxx index f28e927..8e1c7ce 100644 --- a/sw/source/core/unocore/unoprnms.cxx +++ b/sw/source/core/unocore/unoprnms.cxx @@ -789,7 +789,8 @@ const SwPropNameTab aPropNameTab = { /* 0757 UNO_NAME_FILL_STYLE */ {MAP_CHAR_LEN("FillStyle")}, /* 0758 UNO_NAME_FILL_GRADIENT */ {MAP_CHAR_LEN("FillGradient")}, /* 0759 UNO_NAME_FILL_GRADIENT_NAME */ {MAP_CHAR_LEN("FillGradientName")}, -/* 0760 UNO_NAME_DEFAULT_PAGE_MODE */ {MAP_CHAR_LEN("DefaultPageMode")} +/* 0760 UNO_NAME_DEFAULT_PAGE_MODE */ {MAP_CHAR_LEN("DefaultPageMode")}, +/* 0761 UNO_NAME_CHAR_SHADING_VALUE */ {MAP_CHAR_LEN("CharShadingValue")}, // new items in this array must match enum SwPropNameIds }; diff --git a/sw/source/filter/ww8/docxattributeoutput.cxx b/sw/source/filter/ww8/docxattributeoutput.cxx index ddda9dd..03e717b 100644 --- a/sw/source/filter/ww8/docxattributeoutput.cxx +++ b/sw/source/filter/ww8/docxattributeoutput.cxx @@ -103,6 +103,7 @@ #include <com/sun/star/i18n/ScriptType.hpp> #include <com/sun/star/chart2/XChartDocument.hpp> +#include <com/sun/star/drawing/ShadingPattern.hpp> #if OSL_DEBUG_LEVEL > 1 #include <stdio.h> @@ -117,6 +118,7 @@ using namespace nsSwDocInfoSubType; using namespace nsFieldFlags; using namespace sw::util; using namespace ::com::sun::star; +using namespace ::com::sun::star::drawing; class FFDataWriterHelper { @@ -3713,12 +3715,29 @@ void DocxAttributeOutput::CharAnimatedText( const SvxBlinkItem& rBlink ) m_pSerializer->singleElementNS(XML_w, XML_effect, FSNS( XML_w, XML_val ), "none", FSEND ); } +#define MSWORD_CH_SHADING_CLR 0xD8D8D8 // This color is the same color as the ms-word's character shading color. +#define MSWORD_CH_SHADING_FILL "FFFFFF" // The attribute w:fill of w:shd, for MS-Word's character shading, +#define MSWORD_CH_SHADING_COLOR "auto" // The attribute w:color of w:shd, for MS-Word's character shading, +#define MSWORD_CH_SHADING_VAL "pct15" // The attribute w:value of w:shd, for MS-Word's character shading, + void DocxAttributeOutput::CharBackground( const SvxBrushItem& rBrush ) { - m_pSerializer->singleElementNS( XML_w, XML_shd, + // Check if the brush shading pattern is 'PCT15'. If so - write it back to the DOCX + if (rBrush.GetShadingValue() == ShadingPattern::PCT15) + { + m_pSerializer->singleElementNS( XML_w, XML_shd, + FSNS( XML_w, XML_val ), MSWORD_CH_SHADING_VAL, + FSNS( XML_w, XML_color ), MSWORD_CH_SHADING_COLOR, + FSNS( XML_w, XML_fill ), MSWORD_CH_SHADING_FILL, + FSEND ); + } + else + { + m_pSerializer->singleElementNS( XML_w, XML_shd, FSNS( XML_w, XML_fill ), msfilter::util::ConvertColor( rBrush.GetColor() ).getStr(), FSNS( XML_w, XML_val ), "clear", FSEND ); + } } void DocxAttributeOutput::CharFontCJK( const SvxFontItem& rFont ) diff --git a/sw/source/filter/ww8/ww8par6.cxx b/sw/source/filter/ww8/ww8par6.cxx index 0d9a638..6435e3c 100644 --- a/sw/source/filter/ww8/ww8par6.cxx +++ b/sw/source/filter/ww8/ww8par6.cxx @@ -4449,75 +4449,74 @@ void SwWW8Shade::SetShade(ColorData nFore, ColorData nBack, sal_uInt16 nIndex) { static const sal_uLong eMSGrayScale[] = { - // Nul-Brush - 0, // 0 + // Clear-Brush + 0, // 0 clear // Solid-Brush - 1000, // 1 - // promillemaessig abgestufte Schattierungen - 50, // 2 - 100, // 3 - 200, // 4 - 250, // 5 - 300, // 6 - 400, // 7 - 500, // 8 - 600, // 9 - 700, // 10 - 750, // 11 - 800, // 12 - 900, // 13 - 333, // 14 Dark Horizontal - 333, // 15 Dark Vertical - 333, // 16 Dark Forward Diagonal - 333, // 17 Dark Backward Diagonal - 333, // 18 Dark Cross - 333, // 19 Dark Diagonal Cross - 333, // 20 Horizontal - 333, // 21 Vertical - 333, // 22 Forward Diagonal - 333, // 23 Backward Diagonal - 333, // 24 Cross - 333, // 25 Diagonal Cross - // neun Nummern ohne Bedeutung in Ver8 - 500, // 26 - 500, // 27 - 500, // 28 - 500, // 29 - 500, // 30 - 500, // 31 - 500, // 32 - 500, // 33 - 500, // 34 - // und weiter gehts mit tollen Schattierungen ;-) - 25, // 35 - 75, // 36 - 125, // 37 - 150, // 38 - 175, // 39 - 225, // 40 - 275, // 41 - 325, // 42 - 350, // 43 - 375, // 44 - 425, // 45 - 450, // 46 - 475, // 47 - 525, // 48 - 550, // 49 - 575, // 50 - 625, // 51 - 650, // 52 - 675, // 53 - 725, // 54 - 775, // 55 - 825, // 56 - 850, // 57 - 875, // 58 - 925, // 59 - 950, // 60 - 975, // 61 - // und zu guter Letzt: - 970 + 1000, // 1 solid + // Percent values + 50, // 2 pct5 + 100, // 3 pct10 + 200, // 4 pct20 + 250, // 5 pct25 + 300, // 6 pct30 + 400, // 7 pct40 + 500, // 8 pct50 + 600, // 9 pct60 + 700, // 10 pct70 + 750, // 11 pct75 + 800, // 12 pct80 + 900, // 13 pct90 + // Special cases + 333, // 14 Dark Horizontal + 333, // 15 Dark Vertical + 333, // 16 Dark Forward Diagonal + 333, // 17 Dark Backward Diagonal + 333, // 18 Dark Cross + 333, // 19 Dark Diagonal Cross + 333, // 20 Horizontal + 333, // 21 Vertical + 333, // 22 Forward Diagonal + 333, // 23 Backward Diagonal + 333, // 24 Cross + 333, // 25 Diagonal Cross + // Undefined values in DOC spec-sheet + 500, // 26 + 500, // 27 + 500, // 28 + 500, // 29 + 500, // 30 + 500, // 31 + 500, // 32 + 500, // 33 + 500, // 34 + // Different shading types + 25, // 35 [available in DOC, not available in DOCX] + 75, // 36 [available in DOC, not available in DOCX] + 125, // 37 pct12 + 150, // 38 pct15 + 175, // 39 [available in DOC, not available in DOCX] + 225, // 40 [available in DOC, not available in DOCX] + 275, // 41 [available in DOC, not available in DOCX] + 325, // 42 [available in DOC, not available in DOCX] + 350, // 43 pct35 + 375, // 44 pct37 + 425, // 45 [available in DOC, not available in DOCX] + 450, // 46 pct45 + 475, // 47 [available in DOC, not available in DOCX] + 525, // 48 [available in DOC, not available in DOCX] + 550, // 49 pct55 + 575, // 50 [available in DOC, not available in DOCX] + 625, // 51 pct62 + 650, // 52 pct65 + 675, // 53 [available in DOC, not available in DOCX] + 725, // 54 [available in DOC, not available in DOCX] + 775, // 55 [available in DOC, not available in DOCX] + 825, // 56 [available in DOC, not available in DOCX] + 850, // 57 pct85 + 875, // 58 pct87 + 925, // 59 [available in DOC, not available in DOCX] + 950, // 60 pct95 + 975 // 61 [available in DOC, not available in DOCX] };// 62 diff --git a/writerfilter/source/dmapper/CellColorHandler.cxx b/writerfilter/source/dmapper/CellColorHandler.cxx index d509723..58069d8 100644 --- a/writerfilter/source/dmapper/CellColorHandler.cxx +++ b/writerfilter/source/dmapper/CellColorHandler.cxx @@ -21,6 +21,7 @@ #include <doctok/resourceids.hxx> #include <ConversionHelper.hxx> #include <ooxml/resourceids.hxx> +#include <com/sun/star/drawing/ShadingPattern.hpp> #include <sal/macros.h> #include "dmapperLoggers.hxx" @@ -29,13 +30,13 @@ namespace writerfilter { namespace dmapper { -using namespace ::com::sun::star; +using namespace ::com::sun::star::drawing; using namespace ::writerfilter; CellColorHandler::CellColorHandler() : LoggedProperties(dmapper_logger, "CellColorHandler"), -m_nShadowType( 0 ), +m_nShadingPattern( ShadingPattern::CLEAR ), m_nColor( 0xffffffff ), m_nFillColor( 0xffffffff ), m_OutputFormat( Form ) @@ -48,6 +49,7 @@ CellColorHandler::~CellColorHandler() void CellColorHandler::lcl_attribute(Id rName, Value & rVal) { + OUString stringValue = rVal.getString(); sal_Int32 nIntValue = rVal.getInt(); switch( rName ) { @@ -61,7 +63,7 @@ void CellColorHandler::lcl_attribute(Id rName, Value & rVal) { //might be clear, pct5...90, some hatch types //TODO: The values need symbolic names! - m_nShadowType = nIntValue; //clear == 0, solid: 1, pct5: 2, pct50:8, pct95: x3c, horzStripe:0x0e, thinVertStripe: 0x15 + m_nShadingPattern = nIntValue; //clear == 0, solid: 1, pct5: 2, pct50:8, pct95: x3c, horzStripe:0x0e, thinVertStripe: 0x15 } break; case NS_ooxml::LN_CT_Shd_fill: @@ -93,88 +95,89 @@ void CellColorHandler::lcl_sprm(Sprm & rSprm) TablePropertyMapPtr CellColorHandler::getProperties() { TablePropertyMapPtr pPropertyMap(new TablePropertyMap); -//code from binary word filter + + // Code from binary word filter (the values are out of 1000) static const sal_Int32 eMSGrayScale[] = { - // Nul-Brush - 0, // 0 + // Clear-Brush + 0, // 0 clear // Solid-Brush - 1000, // 1 - // percent values - 50, // 2 - 100, // 3 - 200, // 4 - 250, // 5 - 300, // 6 - 400, // 7 - 500, // 8 - 600, // 9 - 700, // 10 - 750, // 11 - 800, // 12 - 900, // 13 - 333, // 14 Dark Horizontal - 333, // 15 Dark Vertical - 333, // 16 Dark Forward Diagonal - 333, // 17 Dark Backward Diagonal - 333, // 18 Dark Cross - 333, // 19 Dark Diagonal Cross - 333, // 20 Horizontal - 333, // 21 Vertical - 333, // 22 Forward Diagonal - 333, // 23 Backward Diagonal - 333, // 24 Cross - 333, // 25 Diagonal Cross - // some undefined values - 500, // 26 - 500, // 27 - 500, // 28 - 500, // 29 - 500, // 30 - 500, // 31 - 500, // 32 - 500, // 33 - 500, // 34 - // different shading types - 25, // 35 - 75, // 36 - 125, // 37 - 150, // 38 - 175, // 39 - 225, // 40 - 275, // 41 - 325, // 42 - 350, // 43 - 375, // 44 - 425, // 45 - 450, // 46 - 475, // 47 - 525, // 48 - 550, // 49 - 575, // 50 - 625, // 51 - 650, // 52 - 675, // 53 - 725, // 54 - 775, // 55 - 825, // 56 - 850, // 57 - 875, // 58 - 925, // 59 - 950, // 60 - 975, // 61 - // und zu guter Letzt: - 970 + 1000, // 1 solid + // Percent values + 50, // 2 pct5 + 100, // 3 pct10 + 200, // 4 pct20 + 250, // 5 pct25 + 300, // 6 pct30 + 400, // 7 pct40 + 500, // 8 pct50 + 600, // 9 pct60 + 700, // 10 pct70 + 750, // 11 pct75 + 800, // 12 pct80 + 900, // 13 pct90 + // Special cases + 333, // 14 Dark Horizontal + 333, // 15 Dark Vertical + 333, // 16 Dark Forward Diagonal + 333, // 17 Dark Backward Diagonal + 333, // 18 Dark Cross + 333, // 19 Dark Diagonal Cross + 333, // 20 Horizontal + 333, // 21 Vertical + 333, // 22 Forward Diagonal + 333, // 23 Backward Diagonal + 333, // 24 Cross + 333, // 25 Diagonal Cross + // Undefined values in DOC spec-sheet + 500, // 26 + 500, // 27 + 500, // 28 + 500, // 29 + 500, // 30 + 500, // 31 + 500, // 32 + 500, // 33 + 500, // 34 + // Different shading types + 25, // 35 [available in DOC, not available in DOCX] + 75, // 36 [available in DOC, not available in DOCX] + 125, // 37 pct12 + 150, // 38 pct15 + 175, // 39 [available in DOC, not available in DOCX] + 225, // 40 [available in DOC, not available in DOCX] + 275, // 41 [available in DOC, not available in DOCX] + 325, // 42 [available in DOC, not available in DOCX] + 350, // 43 pct35 + 375, // 44 pct37 + 425, // 45 [available in DOC, not available in DOCX] + 450, // 46 pct45 + 475, // 47 [available in DOC, not available in DOCX] + 525, // 48 [available in DOC, not available in DOCX] + 550, // 49 pct55 + 575, // 50 [available in DOC, not available in DOCX] + 625, // 51 pct62 + 650, // 52 pct65 + 675, // 53 [available in DOC, not available in DOCX] + 725, // 54 [available in DOC, not available in DOCX] + 775, // 55 [available in DOC, not available in DOCX] + 825, // 56 [available in DOC, not available in DOCX] + 850, // 57 pct85 + 875, // 58 pct87 + 925, // 59 [available in DOC, not available in DOCX] + 950, // 60 pct95 + 975 // 61 [available in DOC, not available in DOCX] };// 62 - if( m_nShadowType >= (sal_Int32)SAL_N_ELEMENTS( eMSGrayScale ) ) - m_nShadowType = 0; - sal_Int32 nWW8BrushStyle = eMSGrayScale[m_nShadowType]; + if( m_nShadingPattern >= (sal_Int32)SAL_N_ELEMENTS( eMSGrayScale ) ) + m_nShadingPattern = 0; + + sal_Int32 nWW8BrushStyle = eMSGrayScale[m_nShadingPattern]; sal_Int32 nApplyColor = 0; if( !nWW8BrushStyle ) { - // Null-Brush - nApplyColor = m_nFillColor; + // Clear-Brush + nApplyColor = m_nFillColor; } else { @@ -191,6 +194,79 @@ TablePropertyMapPtr CellColorHandler::getProperties() nApplyColor = ( (nRed/1000) << 0x10 ) + ((nGreen/1000) << 8) + nBlue/1000; } + // Check if it is a 'Character' + if (m_OutputFormat == Character) + { + static sal_Int32 aWWShadingPatterns[ ] = + { + ShadingPattern::CLEAR, + ShadingPattern::SOLID, + ShadingPattern::PCT5, + ShadingPattern::PCT10, + ShadingPattern::PCT20, + ShadingPattern::PCT25, + ShadingPattern::PCT30, + ShadingPattern::PCT40, + ShadingPattern::PCT50, + ShadingPattern::PCT60, + ShadingPattern::PCT70, + ShadingPattern::PCT75, + ShadingPattern::PCT80, + ShadingPattern::PCT90, + ShadingPattern::HORZ_STRIPE, + ShadingPattern::VERT_STRIPE, + ShadingPattern::REVERSE_DIAG_STRIPE, + ShadingPattern::DIAG_STRIPE, + ShadingPattern::HORZ_CROSS, + ShadingPattern::DIAG_CROSS, + ShadingPattern::THIN_HORZ_STRIPE, + ShadingPattern::THIN_VERT_STRIPE, + ShadingPattern::THIN_REVERSE_DIAG_STRIPE, + ShadingPattern::THIN_DIAG_STRIPE, + ShadingPattern::THIN_HORZ_CROSS, + ShadingPattern::THIN_DIAG_CROSS, + ShadingPattern::UNUSED_1, + ShadingPattern::UNUSED_2, + ShadingPattern::UNUSED_3, + ShadingPattern::UNUSED_4, + ShadingPattern::UNUSED_5, + ShadingPattern::UNUSED_6, + ShadingPattern::UNUSED_7, + ShadingPattern::UNUSED_8, + ShadingPattern::UNUSED_9, + ShadingPattern::PCT2, + ShadingPattern::PCT7, + ShadingPattern::PCT12, + ShadingPattern::PCT15, + ShadingPattern::PCT17, + ShadingPattern::PCT22, + ShadingPattern::PCT27, + ShadingPattern::PCT32, + ShadingPattern::PCT35, + ShadingPattern::PCT37, + ShadingPattern::PCT42, + ShadingPattern::PCT45, + ShadingPattern::PCT47, + ShadingPattern::PCT52, + ShadingPattern::PCT55, + ShadingPattern::PCT57, + ShadingPattern::PCT62, + ShadingPattern::PCT65, + ShadingPattern::PCT67, + ShadingPattern::PCT72, + ShadingPattern::PCT77, + ShadingPattern::PCT82, + ShadingPattern::PCT85, + ShadingPattern::PCT87, + ShadingPattern::PCT92, + ShadingPattern::PCT95, + ShadingPattern::PCT97 + }; + + // Write the shading pattern property + pPropertyMap->Insert(PROP_CHAR_SHADING_VALUE, false, uno::makeAny( aWWShadingPatterns[m_nShadingPattern] )); + } + pPropertyMap->Insert( m_OutputFormat == Form ? PROP_BACK_COLOR : m_OutputFormat == Paragraph ? PROP_PARA_BACK_COLOR : PROP_CHAR_BACK_COLOR, false, uno::makeAny( nApplyColor )); diff --git a/writerfilter/source/dmapper/CellColorHandler.hxx b/writerfilter/source/dmapper/CellColorHandler.hxx index 05881ee..27f18fd 100644 --- a/writerfilter/source/dmapper/CellColorHandler.hxx +++ b/writerfilter/source/dmapper/CellColorHandler.hxx @@ -32,7 +32,7 @@ class WRITERFILTER_DLLPRIVATE CellColorHandler : public LoggedProperties public: enum OutputFormat { Form, Paragraph, Character }; // for what part of the document private: - sal_Int32 m_nShadowType; + sal_Int32 m_nShadingPattern; sal_Int32 m_nColor; sal_Int32 m_nFillColor; OutputFormat m_OutputFormat; diff --git a/writerfilter/source/dmapper/PropertyIds.cxx b/writerfilter/source/dmapper/PropertyIds.cxx index e506ee8..dd57a84 100644 --- a/writerfilter/source/dmapper/PropertyIds.cxx +++ b/writerfilter/source/dmapper/PropertyIds.cxx @@ -325,6 +325,7 @@ const OUString& PropertyNameSupplier::GetName( PropertyIds eId ) const case PROP_IS_WIDTH_RELATIVE: sName = "IsWidthRelative"; break; case PROP_GRAPHIC_URL: sName = "GraphicURL"; break; case PROP_GRAPHIC_BITMAP: sName = "GraphicBitmap"; break; + case PROP_CHAR_SHADING_VALUE: sName = "CharShadingValue"; break; } ::std::pair<PropertyNameMap_t::iterator,bool> aInsertIt = m_pImpl->aNameMap.insert( PropertyNameMap_t::value_type( eId, sName )); diff --git a/writerfilter/source/dmapper/PropertyIds.hxx b/writerfilter/source/dmapper/PropertyIds.hxx index 1c6b83e..1357c1d 100644 --- a/writerfilter/source/dmapper/PropertyIds.hxx +++ b/writerfilter/source/dmapper/PropertyIds.hxx @@ -296,6 +296,7 @@ enum PropertyIds ,PROP_IS_WIDTH_RELATIVE ,PROP_GRAPHIC_URL ,PROP_GRAPHIC_BITMAP + ,PROP_CHAR_SHADING_VALUE }; struct PropertyNameSupplier_Impl; class PropertyNameSupplier diff --git a/writerfilter/source/ooxml/model.xml b/writerfilter/source/ooxml/model.xml index e9b2d6a..e0d35a9 100644 --- a/writerfilter/source/ooxml/model.xml +++ b/writerfilter/source/ooxml/model.xml @@ -21582,10 +21582,23 @@ <attribute name="shadow" tokenid="rtf:FSHADOW"/> <attribute name="frame" tokenid="rtf:FFRAME"/> </resource> + <!-- This DOCX values will be mapped to match the 'DOC' values that are defined here: --> + <!-- http://msdn.microsoft.com/en-us/library/dd945712(v=office.12).aspx --> <resource name="ST_Shd" resource="List"> - <value tokenid="0">nil</value> <value tokenid="0">clear</value> <value tokenid="1">solid</value> + <value tokenid="2">pct5</value> + <value tokenid="3">pct10</value> + <value tokenid="4">pct20</value> + <value tokenid="5">pct25</value> + <value tokenid="6">pct30</value> + <value tokenid="7">pct40</value> + <value tokenid="8">pct50</value> + <value tokenid="9">pct60</value> + <value tokenid="10">pct70</value> + <value tokenid="11">pct75</value> + <value tokenid="12">pct80</value> + <value tokenid="13">pct90</value> <value tokenid="14">horzStripe</value> <value tokenid="15">vertStripe</value> <value tokenid="17">reverseDiagStripe</value> @@ -21598,29 +21611,18 @@ <value tokenid="22">thinDiagStripe</value> <value tokenid="24">thinHorzCross</value> <value tokenid="25">thinDiagCross</value> - <value tokenid="2">pct5</value> - <value tokenid="3">pct10</value> - <value tokenid="27">pct12</value> - <value tokenid="28">pct15</value> - <value tokenid="4">pct20</value> - <value tokenid="5">pct25</value> - <value tokenid="6">pct30</value> + <value tokenid="37">pct12</value> + <value tokenid="38">pct15</value> <value tokenid="43">pct35</value> <value tokenid="44">pct37</value> - <value tokenid="7">pct40</value> <value tokenid="46">pct45</value> - <value tokenid="8">pct50</value> <value tokenid="49">pct55</value> - <value tokenid="9">pct60</value> <value tokenid="51">pct62</value> <value tokenid="52">pct65</value> - <value tokenid="10">pct70</value> - <value tokenid="11">pct75</value> - <value tokenid="12">pct80</value> <value tokenid="57">pct85</value> <value tokenid="58">pct87</value> - <value tokenid="13">pct90</value> <value tokenid="60">pct95</value> + <value tokenid="65535">nil</value> </resource> <resource name="CT_Shd" resource="Properties" tag="attribute"> <attribute name="val" tokenid="ooxml:CT_Shd_val"/> _______________________________________________ Libreoffice-commits mailing list libreoffice-comm...@lists.freedesktop.org http://lists.freedesktop.org/mailman/listinfo/libreoffice-commits