[Libreoffice-commits] core.git: sw/qa writerfilter/source
Libreoffice Gerrit user
logerrit at kemper.freedesktop.org
Sat Jul 21 19:37:38 UTC 2018
sw/qa/extras/ooxmlexport/data/defaultStyle.docx |binary
sw/qa/extras/ooxmlexport/ooxmlexport11.cxx | 6 ++++++
writerfilter/source/dmapper/DomainMapper.cxx | 5 +++--
writerfilter/source/dmapper/DomainMapper_Impl.cxx | 20 ++++++++++++++++++++
writerfilter/source/dmapper/DomainMapper_Impl.hxx | 2 ++
writerfilter/source/dmapper/StyleSheetTable.cxx | 17 +++++++----------
6 files changed, 38 insertions(+), 12 deletions(-)
New commits:
commit 6b7f12f6108f136d60bd77e3787ef6a2632038cd
Author: Justin Luth <justin_luth at sil.org>
AuthorDate: Mon Jul 16 20:55:33 2018 +0300
Commit: Justin Luth <justin_luth at sil.org>
CommitDate: Sat Jul 21 21:37:18 2018 +0200
writerfilter: default style is the last one
Documentation states, and the examples confirm that
"If this attribute (w:default) is specified by multiple styles, then
the last instance of a style with this property shall be used."
Change-Id: I17f06ab8944a39341a00c479117e978a01d6af7a
Reviewed-on: https://gerrit.libreoffice.org/57510
Tested-by: Jenkins
Reviewed-by: Justin Luth <justin_luth at sil.org>
diff --git a/sw/qa/extras/ooxmlexport/data/defaultStyle.docx b/sw/qa/extras/ooxmlexport/data/defaultStyle.docx
new file mode 100644
index 000000000000..8e3faa70da8c
Binary files /dev/null and b/sw/qa/extras/ooxmlexport/data/defaultStyle.docx differ
diff --git a/sw/qa/extras/ooxmlexport/ooxmlexport11.cxx b/sw/qa/extras/ooxmlexport/ooxmlexport11.cxx
index 3246fe5eec4d..b4d6dad88132 100644
--- a/sw/qa/extras/ooxmlexport/ooxmlexport11.cxx
+++ b/sw/qa/extras/ooxmlexport/ooxmlexport11.cxx
@@ -150,6 +150,12 @@ DECLARE_OOXMLEXPORT_TEST(testTdf116410, "tdf116410.docx")
CPPUNIT_ASSERT_EQUAL(1, getPages());
}
+DECLARE_OOXMLEXPORT_TEST(testDefaultStyle, "defaultStyle.docx")
+{
+ CPPUNIT_ASSERT_EQUAL_MESSAGE( "Default Style", OUString("Title"), getProperty<OUString>(getParagraph(1), "ParaStyleName") );
+ CPPUNIT_ASSERT_EQUAL(2, getPages());
+}
+
DECLARE_OOXMLEXPORT_TEST(testParagraphSplitOnSectionBorder, "parasplit-on-section-border.odt")
{
xmlDocPtr pXmlDoc = parseExport("word/document.xml");
diff --git a/writerfilter/source/dmapper/DomainMapper.cxx b/writerfilter/source/dmapper/DomainMapper.cxx
index b5f3d504fb77..5e6f2b0c0a1a 100644
--- a/writerfilter/source/dmapper/DomainMapper.cxx
+++ b/writerfilter/source/dmapper/DomainMapper.cxx
@@ -2936,8 +2936,9 @@ void DomainMapper::lcl_startParagraphGroup()
{
if (!m_pImpl->IsInShape())
{
- m_pImpl->GetTopContext()->Insert( PROP_PARA_STYLE_NAME, uno::makeAny( OUString("Standard") ) ); //ConvertedStyleName
- m_pImpl->SetCurrentParaStyleName("Standard");
+ const OUString& sDefaultParaStyle = m_pImpl->GetDefaultParaStyleName();
+ m_pImpl->GetTopContext()->Insert( PROP_PARA_STYLE_NAME, uno::makeAny( sDefaultParaStyle ) );
+ m_pImpl->SetCurrentParaStyleName( sDefaultParaStyle );
}
if (m_pImpl->isBreakDeferred(PAGE_BREAK))
m_pImpl->GetTopContext()->Insert(PROP_BREAK_TYPE, uno::makeAny(style::BreakType_PAGE_BEFORE));
diff --git a/writerfilter/source/dmapper/DomainMapper_Impl.cxx b/writerfilter/source/dmapper/DomainMapper_Impl.cxx
index 2939902f03ca..8c3c59243aa0 100644
--- a/writerfilter/source/dmapper/DomainMapper_Impl.cxx
+++ b/writerfilter/source/dmapper/DomainMapper_Impl.cxx
@@ -209,6 +209,7 @@ DomainMapper_Impl::DomainMapper_Impl(
m_pLastSectionContext( ),
m_pLastCharacterContext(),
m_sCurrentParaStyleName(),
+ m_sDefaultParaStyleName(),
m_bInStyleSheetImport( false ),
m_bInAnyTableImport( false ),
m_bInHeaderFooterImport( false ),
@@ -664,6 +665,25 @@ const OUString DomainMapper_Impl::GetCurrentParaStyleName()
return sName;
}
+const OUString DomainMapper_Impl::GetDefaultParaStyleName()
+{
+ // After import the default style won't change and is frequently requested: cache the LO style name.
+ // TODO assert !InStyleSheetImport? This function really only makes sense once import is finished anyway.
+ if ( m_sDefaultParaStyleName.isEmpty() )
+ {
+ const StyleSheetEntryPtr pEntry = GetStyleSheetTable()->FindDefaultParaStyle();
+ if ( pEntry && !pEntry->sConvertedStyleName.isEmpty() )
+ {
+ if ( !m_bInStyleSheetImport )
+ m_sDefaultParaStyleName = pEntry->sConvertedStyleName;
+ return pEntry->sConvertedStyleName;
+ }
+ else
+ return OUString( "Standard");
+ }
+ return m_sDefaultParaStyleName;
+}
+
/*-------------------------------------------------------------------------
returns the value from the current paragraph style - if available
-----------------------------------------------------------------------*/
diff --git a/writerfilter/source/dmapper/DomainMapper_Impl.hxx b/writerfilter/source/dmapper/DomainMapper_Impl.hxx
index 555c2dd35bb9..013f8aaa5799 100644
--- a/writerfilter/source/dmapper/DomainMapper_Impl.hxx
+++ b/writerfilter/source/dmapper/DomainMapper_Impl.hxx
@@ -475,6 +475,7 @@ private:
::std::vector<DeletableTabStop> m_aCurrentTabStops;
OUString m_sCurrentParaStyleName; //highly inaccurate. Overwritten by "overlapping" paragraphs like comments, flys.
+ OUString m_sDefaultParaStyleName; //caches the ConvertedStyleName of the default paragraph style
bool m_bInStyleSheetImport; //in import of fonts, styles, lists or lfos
bool m_bInAnyTableImport; //in import of fonts, styles, lists or lfos
bool m_bInHeaderFooterImport;
@@ -694,6 +695,7 @@ public:
void SetCurrentParaStyleName(const OUString& sStringValue) {m_sCurrentParaStyleName = sStringValue;}
const OUString GetCurrentParaStyleName();
+ const OUString GetDefaultParaStyleName();
css::uno::Any GetPropertyFromStyleSheet(PropertyIds eId);
void SetStyleSheetImport( bool bSet ) { m_bInStyleSheetImport = bSet;}
diff --git a/writerfilter/source/dmapper/StyleSheetTable.cxx b/writerfilter/source/dmapper/StyleSheetTable.cxx
index 4780ceefb829..2c7307a68d5c 100644
--- a/writerfilter/source/dmapper/StyleSheetTable.cxx
+++ b/writerfilter/source/dmapper/StyleSheetTable.cxx
@@ -258,6 +258,7 @@ struct StyleSheetTable_Impl
StringPairMap_t m_aStyleNameMap;
/// Style names which should not be used without a " (user)" suffix.
std::set<OUString> m_aReservedStyleNames;
+ OUString m_sDefaultParaStyleName; //WW8 name
ListCharStylePropertyVector_t m_aListCharStylePropertyVector;
bool m_bHasImportedDefaultParaProps;
bool m_bIsNewDoc;
@@ -282,6 +283,7 @@ StyleSheetTable_Impl::StyleSheetTable_Impl(DomainMapper& rDMapper,
m_pCurrentEntry(),
m_pDefaultParaProps(new PropertyMap),
m_pDefaultCharProps(new PropertyMap),
+ m_sDefaultParaStyleName("Normal"),
m_bHasImportedDefaultParaProps(false),
m_bIsNewDoc(bIsNewDoc)
{
@@ -456,6 +458,10 @@ void StyleSheetTable::lcl_attribute(Id Name, Value & val)
if (m_pImpl->m_pCurrentEntry->nStyleTypeCode != STYLE_TYPE_UNKNOWN)
{
+ // "If this attribute is specified by multiple styles, then the last instance shall be used."
+ if ( m_pImpl->m_pCurrentEntry->nStyleTypeCode == STYLE_TYPE_PARA && !m_pImpl->m_pCurrentEntry->sStyleIdentifierD.isEmpty() )
+ m_pImpl->m_sDefaultParaStyleName = m_pImpl->m_pCurrentEntry->sStyleIdentifierD;
+
beans::PropertyValue aValue;
aValue.Name = "default";
aValue.Value <<= m_pImpl->m_pCurrentEntry->bIsDefaultStyle;
@@ -1272,16 +1278,7 @@ const StyleSheetEntryPtr StyleSheetTable::FindStyleSheetByConvertedStyleName(con
const StyleSheetEntryPtr StyleSheetTable::FindDefaultParaStyle()
{
- StyleSheetEntryPtr pRet;
- for (StyleSheetEntryPtr & pEntry : m_pImpl->m_aStyleSheetEntries)
- {
- if (pEntry->bIsDefaultStyle && pEntry->nStyleTypeCode == STYLE_TYPE_PARA)
- {
- pRet = pEntry;
- break;
- }
- }
- return pRet;
+ return FindStyleSheetByISTD( m_pImpl->m_sDefaultParaStyleName );
}
const StyleSheetEntryPtr StyleSheetTable::GetCurrentEntry()
More information about the Libreoffice-commits
mailing list