Kaydet (Commit) f880962f authored tarafından Zolnai Tamás's avatar Zolnai Tamás

Char highlight: ODT filters

Export merges the two background attribute.

Change-Id: I882321fbd5a7d24991fb01b8dc9d2cc0bd294051
üst dba637ad
...@@ -196,6 +196,8 @@ ...@@ -196,6 +196,8 @@
#define CTF_CHARBOTTOMBORDER (XML_TEXT_CTF_START + 167) #define CTF_CHARBOTTOMBORDER (XML_TEXT_CTF_START + 167)
#define CTF_RELWIDTHREL (XML_TEXT_CTF_START + 168) #define CTF_RELWIDTHREL (XML_TEXT_CTF_START + 168)
#define CTF_RELHEIGHTREL (XML_TEXT_CTF_START + 169) #define CTF_RELHEIGHTREL (XML_TEXT_CTF_START + 169)
#define CTF_CHAR_BACKGROUND (XML_TEXT_CTF_START + 170)
#define CTF_CHAR_HIGHLIGHT (XML_TEXT_CTF_START + 171)
enum class TextPropMap { enum class TextPropMap {
......
...@@ -355,10 +355,10 @@ void Test::testGraphicShape() ...@@ -355,10 +355,10 @@ void Test::testGraphicShape()
void Test::testCharHighlight() void Test::testCharHighlight()
{ {
// MS Word has two kind of character backgrounds called character shading and highlighting // MS Word has two kind of character backgrounds called character shading and highlighting
// Now we support these two background attributes colors both in import and export code // MS filters handle these attributes separately, but ODF export merges them into one background attribute
const char* aFilterNames[] = { const char* aFilterNames[] = {
// "writer8", "writer8",
"Rich Text Format", "Rich Text Format",
"MS Word 97", "MS Word 97",
"Office Open XML Text", "Office Open XML Text",
...@@ -412,20 +412,37 @@ void Test::testCharHighlight() ...@@ -412,20 +412,37 @@ void Test::testCharHighlight()
case 15: nHighlightColor = 0x808080; break; //dark gray case 15: nHighlightColor = 0x808080; break; //dark gray
case 16: nHighlightColor = 0xC0C0C0; break; //light gray case 16: nHighlightColor = 0xC0C0C0; break; //light gray
} }
CPPUNIT_ASSERT_EQUAL_MESSAGE(sFailedMessage.getStr(), nHighlightColor, getProperty<sal_Int32>(xRun,"CharHighlight"));
CPPUNIT_ASSERT_EQUAL_MESSAGE(sFailedMessage.getStr(), nBackColor, getProperty<sal_Int32>(xRun,"CharBackColor")); if( strcmp(aFilterNames[nFilter], "writer8") == 0 )
{
CPPUNIT_ASSERT_EQUAL_MESSAGE(sFailedMessage.getStr(), sal_Int32(COL_TRANSPARENT), getProperty<sal_Int32>(xRun,"CharHighlight"));
CPPUNIT_ASSERT_EQUAL_MESSAGE(sFailedMessage.getStr(), nHighlightColor, getProperty<sal_Int32>(xRun,"CharBackColor"));
}
else // MS filters
{
CPPUNIT_ASSERT_EQUAL_MESSAGE(sFailedMessage.getStr(), nHighlightColor, getProperty<sal_Int32>(xRun,"CharHighlight"));
CPPUNIT_ASSERT_EQUAL_MESSAGE(sFailedMessage.getStr(), nBackColor, getProperty<sal_Int32>(xRun,"CharBackColor"));
}
} }
// Only highlight // Only highlight
{ {
const uno::Reference<beans::XPropertySet> xRun(getRun(xPara,17), uno::UNO_QUERY); const uno::Reference<beans::XPropertySet> xRun(getRun(xPara,18), uno::UNO_QUERY);
CPPUNIT_ASSERT_EQUAL_MESSAGE(sFailedMessage.getStr(), sal_Int32(0xC0C0C0), getProperty<sal_Int32>(xRun,"CharHighlight")); if( strcmp(aFilterNames[nFilter], "writer8") == 0 )
CPPUNIT_ASSERT_EQUAL_MESSAGE(sFailedMessage.getStr(), sal_Int32(COL_TRANSPARENT), getProperty<sal_Int32>(xRun,"CharBackColor")); {
CPPUNIT_ASSERT_EQUAL_MESSAGE(sFailedMessage.getStr(), sal_Int32(COL_TRANSPARENT), getProperty<sal_Int32>(xRun,"CharHighlight"));
CPPUNIT_ASSERT_EQUAL_MESSAGE(sFailedMessage.getStr(), sal_Int32(0xff0000), getProperty<sal_Int32>(xRun,"CharBackColor"));
}
else
{
CPPUNIT_ASSERT_EQUAL_MESSAGE(sFailedMessage.getStr(), sal_Int32(0xff0000), getProperty<sal_Int32>(xRun,"CharHighlight"));
CPPUNIT_ASSERT_EQUAL_MESSAGE(sFailedMessage.getStr(), sal_Int32(COL_TRANSPARENT), getProperty<sal_Int32>(xRun,"CharBackColor"));
}
} }
// Only background // Only background
{ {
const uno::Reference<beans::XPropertySet> xRun(getRun(xPara,18), uno::UNO_QUERY); const uno::Reference<beans::XPropertySet> xRun(getRun(xPara,19), uno::UNO_QUERY);
CPPUNIT_ASSERT_EQUAL_MESSAGE(sFailedMessage.getStr(), sal_Int32(COL_TRANSPARENT), getProperty<sal_Int32>(xRun,"CharHighlight")); CPPUNIT_ASSERT_EQUAL_MESSAGE(sFailedMessage.getStr(), sal_Int32(COL_TRANSPARENT), getProperty<sal_Int32>(xRun,"CharHighlight"));
CPPUNIT_ASSERT_EQUAL_MESSAGE(sFailedMessage.getStr(), sal_Int32(0x0000ff), getProperty<sal_Int32>(xRun,"CharBackColor")); CPPUNIT_ASSERT_EQUAL_MESSAGE(sFailedMessage.getStr(), sal_Int32(0x0000ff), getProperty<sal_Int32>(xRun,"CharBackColor"));
} }
......
...@@ -27,6 +27,7 @@ ...@@ -27,6 +27,7 @@
#include <com/sun/star/awt/FontUnderline.hpp> #include <com/sun/star/awt/FontUnderline.hpp>
#include <com/sun/star/text/XChapterNumberingSupplier.hpp> #include <com/sun/star/text/XChapterNumberingSupplier.hpp>
#include <tools/debug.hxx> #include <tools/debug.hxx>
#include <tools/color.hxx>
#include <xmloff/txtprmap.hxx> #include <xmloff/txtprmap.hxx>
#include <xmloff/xmlexp.hxx> #include <xmloff/xmlexp.hxx>
#include <xmloff/maptype.hxx> #include <xmloff/maptype.hxx>
...@@ -658,6 +659,10 @@ void XMLTextExportPropertySetMapper::ContextFilter( ...@@ -658,6 +659,10 @@ void XMLTextExportPropertySetMapper::ContextFilter(
XMLPropertyState* pRepeatOffsetX = NULL; XMLPropertyState* pRepeatOffsetX = NULL;
XMLPropertyState* pRepeatOffsetY = NULL; XMLPropertyState* pRepeatOffsetY = NULL;
// character background and highlight
XMLPropertyState* pCharBackground = NULL;
XMLPropertyState* pCharHighlight = NULL;
bool bNeedsAnchor = false; bool bNeedsAnchor = false;
for( ::std::vector< XMLPropertyState >::iterator aIter = rProperties.begin(); for( ::std::vector< XMLPropertyState >::iterator aIter = rProperties.begin();
...@@ -816,6 +821,9 @@ void XMLTextExportPropertySetMapper::ContextFilter( ...@@ -816,6 +821,9 @@ void XMLTextExportPropertySetMapper::ContextFilter(
propertyState->mnIndex = -1; propertyState->mnIndex = -1;
} }
break; break;
case CTF_CHAR_BACKGROUND: pCharBackground = propertyState; break;
case CTF_CHAR_HIGHLIGHT: pCharHighlight = propertyState; break;
} }
} }
...@@ -1118,6 +1126,17 @@ void XMLTextExportPropertySetMapper::ContextFilter( ...@@ -1118,6 +1126,17 @@ void XMLTextExportPropertySetMapper::ContextFilter(
if( pClipState != NULL && pClip11State != NULL ) if( pClipState != NULL && pClip11State != NULL )
pClip11State->mnIndex = -1; pClip11State->mnIndex = -1;
// When both background attributes are available export the visible one
if( pCharHighlight && pCharBackground )
{
sal_uInt32 nColor = COL_TRANSPARENT;
pCharHighlight->maValue >>= nColor;
if( nColor == COL_TRANSPARENT )
pCharHighlight->mnIndex = -1;
else
pCharBackground->mnIndex = -1;
}
SvXMLExportPropertyMapper::ContextFilter(bEnableFoFontFamily, rProperties, rPropSet); SvXMLExportPropertyMapper::ContextFilter(bEnableFoFontFamily, rProperties, rPropSet);
} }
......
...@@ -191,7 +191,7 @@ XMLPropertyMapEntry aXMLParaPropMap[] = ...@@ -191,7 +191,7 @@ XMLPropertyMapEntry aXMLParaPropMap[] =
// RES_CHRATR_NOLINEBREAK // RES_CHRATR_NOLINEBREAK
// TODO: not used? // TODO: not used?
// RES_CHRATR_BACKGROUND // RES_CHRATR_BACKGROUND
MT_E( "CharBackColor", FO, BACKGROUND_COLOR, XML_TYPE_COLORTRANSPARENT|MID_FLAG_MULTI_PROPERTY, 0 ), MT_E( "CharBackColor", FO, BACKGROUND_COLOR, XML_TYPE_COLORTRANSPARENT|MID_FLAG_MULTI_PROPERTY, CTF_CHAR_BACKGROUND ),
MT_E( "CharBackTransparent", FO, BACKGROUND_COLOR, XML_TYPE_ISTRANSPARENT|MID_FLAG_MERGE_ATTRIBUTE, 0 ), MT_E( "CharBackTransparent", FO, BACKGROUND_COLOR, XML_TYPE_ISTRANSPARENT|MID_FLAG_MERGE_ATTRIBUTE, 0 ),
MT_E( "CharBackColor", FO, TEXT_BACKGROUND_COLOR, XML_TYPE_COLOR|MID_FLAG_SPECIAL_ITEM_EXPORT, CTF_OLDTEXTBACKGROUND ), MT_E( "CharBackColor", FO, TEXT_BACKGROUND_COLOR, XML_TYPE_COLOR|MID_FLAG_SPECIAL_ITEM_EXPORT, CTF_OLDTEXTBACKGROUND ),
// RES_CHRATR_CJK_FONT // RES_CHRATR_CJK_FONT
...@@ -291,6 +291,8 @@ XMLPropertyMapEntry aXMLParaPropMap[] = ...@@ -291,6 +291,8 @@ XMLPropertyMapEntry aXMLParaPropMap[] =
// RES_CHRATR_SHADOW // RES_CHRATR_SHADOW
MAP_EXT( "CharShadowFormat", XML_NAMESPACE_LO_EXT, XML_SHADOW, XML_TYPE_TEXT_SHADOW|XML_TYPE_PROP_TEXT, 0 ), MAP_EXT( "CharShadowFormat", XML_NAMESPACE_LO_EXT, XML_SHADOW, XML_TYPE_TEXT_SHADOW|XML_TYPE_PROP_TEXT, 0 ),
MAP_EXT_I( "CharShadowFormat", XML_NAMESPACE_STYLE, XML_SHADOW, XML_TYPE_TEXT_SHADOW|XML_TYPE_PROP_TEXT, 0 ), MAP_EXT_I( "CharShadowFormat", XML_NAMESPACE_STYLE, XML_SHADOW, XML_TYPE_TEXT_SHADOW|XML_TYPE_PROP_TEXT, 0 ),
// RES_CHRATR_HIGHLIGHT
MT_E( "CharHighlight", FO, BACKGROUND_COLOR, XML_TYPE_COLORTRANSPARENT|MID_FLAG_MULTI_PROPERTY| MID_FLAG_NO_PROPERTY_IMPORT, CTF_CHAR_HIGHLIGHT ),
// RES_TXTATR_INETFMT // RES_TXTATR_INETFMT
// TODO // TODO
// RES_TXTATR_REFMARK // RES_TXTATR_REFMARK
...@@ -531,7 +533,7 @@ XMLPropertyMapEntry aXMLTextPropMap[] = ...@@ -531,7 +533,7 @@ XMLPropertyMapEntry aXMLTextPropMap[] =
// RES_CHRATR_NOLINEBREAK // RES_CHRATR_NOLINEBREAK
// TODO: not used? // TODO: not used?
// RES_CHRATR_BACKGROUND // RES_CHRATR_BACKGROUND
MT_E( "CharBackColor", FO, BACKGROUND_COLOR, XML_TYPE_COLORTRANSPARENT|MID_FLAG_MULTI_PROPERTY, 0 ), MT_E( "CharBackColor", FO, BACKGROUND_COLOR, XML_TYPE_COLORTRANSPARENT|MID_FLAG_MULTI_PROPERTY, CTF_CHAR_BACKGROUND ),
MT_E( "CharBackTransparent", FO, BACKGROUND_COLOR, XML_TYPE_ISTRANSPARENT|MID_FLAG_MERGE_ATTRIBUTE, 0 ), MT_E( "CharBackTransparent", FO, BACKGROUND_COLOR, XML_TYPE_ISTRANSPARENT|MID_FLAG_MERGE_ATTRIBUTE, 0 ),
{ "CharShadingValue", sizeof("CharShadingValue")-1, XML_NAMESPACE_LO_EXT, XML_CHAR_SHADING_VALUE, XML_TYPE_NUMBER|XML_TYPE_PROP_TEXT, 0, SvtSaveOptions::ODFVER_012_EXT_COMPAT, false }, { "CharShadingValue", sizeof("CharShadingValue")-1, XML_NAMESPACE_LO_EXT, XML_CHAR_SHADING_VALUE, XML_TYPE_NUMBER|XML_TYPE_PROP_TEXT, 0, SvtSaveOptions::ODFVER_012_EXT_COMPAT, false },
MT_E( "CharBackColor", FO, TEXT_BACKGROUND_COLOR, XML_TYPE_COLOR|MID_FLAG_SPECIAL_ITEM_EXPORT, CTF_OLDTEXTBACKGROUND ), MT_E( "CharBackColor", FO, TEXT_BACKGROUND_COLOR, XML_TYPE_COLOR|MID_FLAG_SPECIAL_ITEM_EXPORT, CTF_OLDTEXTBACKGROUND ),
...@@ -634,6 +636,8 @@ XMLPropertyMapEntry aXMLTextPropMap[] = ...@@ -634,6 +636,8 @@ XMLPropertyMapEntry aXMLTextPropMap[] =
// RES_CHRATR_SHADOW // RES_CHRATR_SHADOW
MAP_EXT( "CharShadowFormat", XML_NAMESPACE_LO_EXT, XML_SHADOW, XML_TYPE_TEXT_SHADOW|XML_TYPE_PROP_TEXT, 0 ), MAP_EXT( "CharShadowFormat", XML_NAMESPACE_LO_EXT, XML_SHADOW, XML_TYPE_TEXT_SHADOW|XML_TYPE_PROP_TEXT, 0 ),
MAP_EXT_I( "CharShadowFormat", XML_NAMESPACE_STYLE, XML_SHADOW, XML_TYPE_TEXT_SHADOW|XML_TYPE_PROP_TEXT, 0 ), MAP_EXT_I( "CharShadowFormat", XML_NAMESPACE_STYLE, XML_SHADOW, XML_TYPE_TEXT_SHADOW|XML_TYPE_PROP_TEXT, 0 ),
// RES_CHRATR_HIGHLIGHT
MT_E( "CharHighlight", FO, BACKGROUND_COLOR, XML_TYPE_COLORTRANSPARENT|MID_FLAG_MULTI_PROPERTY|MID_FLAG_NO_PROPERTY_IMPORT, CTF_CHAR_HIGHLIGHT ),
// RES_TXTATR_INETFMT // RES_TXTATR_INETFMT
MT_E( "HyperLinkURL", TEXT, XMLNS, XML_TYPE_STRING|MID_FLAG_NO_PROPERTY_IMPORT, CTF_HYPERLINK_URL ), MT_E( "HyperLinkURL", TEXT, XMLNS, XML_TYPE_STRING|MID_FLAG_NO_PROPERTY_IMPORT, CTF_HYPERLINK_URL ),
// RES_TXTATR_REFMARK // RES_TXTATR_REFMARK
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment