oox/source/export/preset-definitions-to-shape-types.pl | 2 - sw/qa/extras/rtfimport/data/tdf92481.rtf | 6 ++++ sw/qa/extras/rtfimport/rtfimport.cxx | 6 ++++ sw/source/filter/ww8/docxsdrexport.cxx | 24 ++++++++-------- writerfilter/source/dmapper/SettingsTable.cxx | 25 +++++++++++++++-- writerfilter/source/ooxml/model.xml | 4 ++ writerfilter/source/rtftok/rtfdocumentimpl.cxx | 3 ++ 7 files changed, 55 insertions(+), 15 deletions(-)
New commits: commit 0afd9dbc08ee2e55e0845dd33ece10ff9375bfa7 Author: Miklos Vajna <vmik...@collabora.co.uk> Date: Mon Jul 6 09:15:22 2015 +0200 sw: fix newly introduced style inconsistencies in docxsdrexport Change-Id: I9b9f198aa6da2f6734194207b4c4bdec3ee1d4c0 diff --git a/sw/source/filter/ww8/docxsdrexport.cxx b/sw/source/filter/ww8/docxsdrexport.cxx index b59de52..8244171 100644 --- a/sw/source/filter/ww8/docxsdrexport.cxx +++ b/sw/source/filter/ww8/docxsdrexport.cxx @@ -1473,14 +1473,14 @@ void DocxSdrExport::writeDMLTextFrame(sw::Frame* pParentFrame, int nAnchorId, bo //first, loop through ALL of the chained textboxes to identify a unique ID for each chain, and sequence number for each textbox in that chain. std::map<OUString, MSWordExportBase::LinkedTextboxInfo>::iterator linkedTextboxesIter; - if( !m_pImpl->m_rExport.m_bLinkedTextboxesHelperInitialized ) + if (!m_pImpl->m_rExport.m_bLinkedTextboxesHelperInitialized) { sal_Int32 nSeq=0; linkedTextboxesIter = m_pImpl->m_rExport.m_aLinkedTextboxesHelper.begin(); - while ( linkedTextboxesIter != m_pImpl->m_rExport.m_aLinkedTextboxesHelper.end() ) + while (linkedTextboxesIter != m_pImpl->m_rExport.m_aLinkedTextboxesHelper.end()) { //find the start of a textbox chain: has no PREVIOUS link, but does have NEXT link - if ( linkedTextboxesIter->second.sPrevChain.isEmpty() && !linkedTextboxesIter->second.sNextChain.isEmpty() ) + if (linkedTextboxesIter->second.sPrevChain.isEmpty() && !linkedTextboxesIter->second.sNextChain.isEmpty()) { //assign this chain a unique ID and start a new sequence nSeq = 0; @@ -1492,18 +1492,18 @@ void DocxSdrExport::writeDMLTextFrame(sw::Frame* pParentFrame, int nAnchorId, bo //follow the chain and assign the same id, and incremental sequence numbers. std::map<OUString, MSWordExportBase::LinkedTextboxInfo>::iterator followChainIter; followChainIter = m_pImpl->m_rExport.m_aLinkedTextboxesHelper.find(linkedTextboxesIter->second.sNextChain); - while ( followChainIter != m_pImpl->m_rExport.m_aLinkedTextboxesHelper.end() ) + while (followChainIter != m_pImpl->m_rExport.m_aLinkedTextboxesHelper.end()) { //verify that the NEXT textbox also points to me as the PREVIOUS. // A broken link indicates a leftover remnant that can be ignored. - if( followChainIter->second.sPrevChain != sCheckForBrokenChains ) + if (followChainIter->second.sPrevChain != sCheckForBrokenChains) break; followChainIter->second.nId = m_pImpl->m_rExport.m_nLinkedTextboxesChainId; followChainIter->second.nSeq = ++nSeq; //empty next chain indicates the end of the linked chain. - if ( followChainIter->second.sNextChain.isEmpty() ) + if (followChainIter->second.sNextChain.isEmpty()) break; sCheckForBrokenChains = followChainIter->first; @@ -1520,19 +1520,19 @@ void DocxSdrExport::writeDMLTextFrame(sw::Frame* pParentFrame, int nAnchorId, bo bool isTxbxLinked = false ; OUString sLinkChainName; - if ( xPropSetInfo.is() ) + if (xPropSetInfo.is()) { - if ( xPropSetInfo->hasPropertyByName("LinkDisplayName") ) + if (xPropSetInfo->hasPropertyByName("LinkDisplayName")) xPropertySet->getPropertyValue("LinkDisplayName") >>= sLinkChainName; - else if ( xPropSetInfo->hasPropertyByName("ChainName") ) + else if (xPropSetInfo->hasPropertyByName("ChainName")) xPropertySet->getPropertyValue("ChainName") >>= sLinkChainName; } // second, check if THIS textbox is linked and then decide whether to write the tag txbx or linkedTxbx linkedTextboxesIter = m_pImpl->m_rExport.m_aLinkedTextboxesHelper.find(sLinkChainName); - if ( linkedTextboxesIter != m_pImpl->m_rExport.m_aLinkedTextboxesHelper.end() ) + if (linkedTextboxesIter != m_pImpl->m_rExport.m_aLinkedTextboxesHelper.end()) { - if( (linkedTextboxesIter->second.nId !=0) && (linkedTextboxesIter->second.nSeq != 0) ) + if ((linkedTextboxesIter->second.nId !=0) && (linkedTextboxesIter->second.nSeq != 0)) { //not the first in the chain, so write the tag as linkedTxbx pFS->singleElementNS(XML_wps, XML_linkedTxbx, @@ -1545,7 +1545,7 @@ void DocxSdrExport::writeDMLTextFrame(sw::Frame* pParentFrame, int nAnchorId, bo */ skipTxBxContent = true ; } - else if( (linkedTextboxesIter->second.nId != 0) && (linkedTextboxesIter->second.nSeq == 0) ) + else if ((linkedTextboxesIter->second.nId != 0) && (linkedTextboxesIter->second.nSeq == 0)) { /* this is the first textbox in the chaining, we add the text content to this block*/ commit f2904c5cad7756268a5671eedd6a86286dfeed98 Author: Miklos Vajna <vmik...@collabora.co.uk> Date: Mon Jul 6 09:12:13 2015 +0200 oox: sort output in generated oox-drawingml-adj-names So generated data don't unnecessarily differ after each build. Change-Id: I143fa189a653266fadf9dd34ce2ed42b9b9b1548 diff --git a/oox/source/export/preset-definitions-to-shape-types.pl b/oox/source/export/preset-definitions-to-shape-types.pl index cd324d1..907ae05 100644 --- a/oox/source/export/preset-definitions-to-shape-types.pl +++ b/oox/source/export/preset-definitions-to-shape-types.pl @@ -1197,7 +1197,7 @@ if ( !defined( $result_shapes{'textBox'} ) ) { # Generate the data if ($drawingml_adj_names_data eq 1) { - foreach my $adj_name (keys %adj_names) + foreach my $adj_name (sort(keys %adj_names)) { foreach my $adj (@{$adj_names{$adj_name}}) { commit ffc7b671e213d366e59d39ddbbef66544ebf01e5 Author: Miklos Vajna <vmik...@collabora.co.uk> Date: Mon Jul 6 09:09:41 2015 +0200 tdf#92481 RTF import: handle \widowctrl Change-Id: I1af1d6bc150c16a2c6b0fe788a41c8c18caee6c6 diff --git a/sw/qa/extras/rtfimport/data/tdf92481.rtf b/sw/qa/extras/rtfimport/data/tdf92481.rtf new file mode 100644 index 0000000..09a6c5e --- /dev/null +++ b/sw/qa/extras/rtfimport/data/tdf92481.rtf @@ -0,0 +1,6 @@ +{\rtf1 +\widowctrl +\pard\plain +Hello. +\par +} diff --git a/sw/qa/extras/rtfimport/rtfimport.cxx b/sw/qa/extras/rtfimport/rtfimport.cxx index 24116ef..7ec1931 100644 --- a/sw/qa/extras/rtfimport/rtfimport.cxx +++ b/sw/qa/extras/rtfimport/rtfimport.cxx @@ -2313,6 +2313,12 @@ DECLARE_RTFIMPORT_TEST(testTdf92061, "tdf92061.rtf") CPPUNIT_ASSERT_EQUAL(OUString("body-after"), getRun(getParagraph(1), 3)->getString()); } +DECLARE_RTFIMPORT_TEST(testTdf92481, "tdf92481.rtf") +{ + // This was 0, RTF_WIDOWCTRL was not imported. + CPPUNIT_ASSERT_EQUAL(static_cast<sal_Int8>(2), getProperty<sal_Int8>(getParagraph(1), "ParaWidows")); +} + CPPUNIT_PLUGIN_IMPLEMENT(); /* vim:set shiftwidth=4 softtabstop=4 expandtab: */ diff --git a/writerfilter/source/dmapper/SettingsTable.cxx b/writerfilter/source/dmapper/SettingsTable.cxx index ef4ed92..dbb2da1 100644 --- a/writerfilter/source/dmapper/SettingsTable.cxx +++ b/writerfilter/source/dmapper/SettingsTable.cxx @@ -79,6 +79,7 @@ struct SettingsTable_Impl bool m_bDoNotUseHTMLParagraphAutoSpacing; bool m_bNoColumnBalance; bool m_bAutoHyphenation; + bool m_bWidowControl; bool m_bSplitPgBreakAndParaMark; bool m_bMirrorMargin; uno::Sequence<beans::PropertyValue> m_pThemeFontLangProps; @@ -111,6 +112,7 @@ struct SettingsTable_Impl , m_bDoNotUseHTMLParagraphAutoSpacing(false) , m_bNoColumnBalance(false) , m_bAutoHyphenation(false) + , m_bWidowControl(false) , m_bSplitPgBreakAndParaMark(false) , m_bMirrorMargin(false) , m_pThemeFontLangProps(3) @@ -288,6 +290,9 @@ void SettingsTable::lcl_sprm(Sprm& rSprm) case NS_ooxml::LN_CT_Settings_autoHyphenation: m_pImpl->m_bAutoHyphenation = nIntValue; break; + case NS_ooxml::LN_CT_Settings_widowControl: + m_pImpl->m_bWidowControl = nIntValue; + break; default: { #ifdef DEBUG_WRITERFILTER @@ -373,6 +378,11 @@ uno::Sequence<beans::PropertyValue> SettingsTable::GetCompatSettings() const return comphelper::containerToSequence(m_pImpl->m_aCompatSettings); } +static bool lcl_isDefault(const uno::Reference<beans::XPropertyState>& xPropertyState, const OUString& rPropertyName) +{ + return xPropertyState->getPropertyState(rPropertyName) == beans::PropertyState_DEFAULT_VALUE; +} + void SettingsTable::ApplyProperties(uno::Reference<text::XTextDocument> const& xDoc) { uno::Reference< beans::XPropertySet> xDocProps( xDoc, uno::UNO_QUERY ); @@ -382,18 +392,29 @@ void SettingsTable::ApplyProperties(uno::Reference<text::XTextDocument> const& x xDocProps->setPropertyValue("RecordChanges", uno::makeAny( m_pImpl->m_bRecordChanges ) ); // Auto hyphenation: turns on hyphenation by default, <w:suppressAutoHyphens/> may still disable it at a paragraph level. - if (m_pImpl->m_bAutoHyphenation) + // Situation is similar for RTF_WIDOWCTRL, which turns on widow / orphan control by default. + if (m_pImpl->m_bAutoHyphenation || m_pImpl->m_bWidowControl) { uno::Reference<style::XStyleFamiliesSupplier> xStyleFamiliesSupplier(xDoc, uno::UNO_QUERY); + if (!xStyleFamiliesSupplier.is()) + return; + uno::Reference<container::XNameAccess> xStyleFamilies = xStyleFamiliesSupplier->getStyleFamilies(); uno::Reference<container::XNameContainer> xParagraphStyles = xStyleFamilies->getByName("ParagraphStyles").get< uno::Reference<container::XNameContainer> >(); uno::Reference<style::XStyle> xDefault = xParagraphStyles->getByName("Standard").get< uno::Reference<style::XStyle> >(); uno::Reference<beans::XPropertyState> xPropertyState(xDefault, uno::UNO_QUERY); - if (xPropertyState->getPropertyState("ParaIsHyphenation") == beans::PropertyState_DEFAULT_VALUE) + if (m_pImpl->m_bAutoHyphenation && lcl_isDefault(xPropertyState, "ParaIsHyphenation")) { uno::Reference<beans::XPropertySet> xPropertySet(xDefault, uno::UNO_QUERY); xPropertySet->setPropertyValue("ParaIsHyphenation", uno::makeAny(true)); } + if (m_pImpl->m_bWidowControl && lcl_isDefault(xPropertyState, "ParaWidows") && lcl_isDefault(xPropertyState, "ParaOrphans")) + { + uno::Reference<beans::XPropertySet> xPropertySet(xDefault, uno::UNO_QUERY); + uno::Any aAny = uno::makeAny(static_cast<sal_Int8>(2)); + xPropertySet->setPropertyValue("ParaWidows", aAny); + xPropertySet->setPropertyValue("ParaOrphans", aAny); + } } } diff --git a/writerfilter/source/ooxml/model.xml b/writerfilter/source/ooxml/model.xml index df0ae0e..9a8c4d0 100644 --- a/writerfilter/source/ooxml/model.xml +++ b/writerfilter/source/ooxml/model.xml @@ -60,6 +60,10 @@ <token tokenid="ooxml:footerl"/> <token tokenid="ooxml:footerr"/> <token tokenid="ooxml:footerf"/> + + <!-- Present in RTF, but not in OOXML. --> + <token tokenid="ooxml:CT_Settings_widowControl"/> + <namespace name="dml-stylesheet"> <start name="theme"/> <start name="themeOverride"/> diff --git a/writerfilter/source/rtftok/rtfdocumentimpl.cxx b/writerfilter/source/rtftok/rtfdocumentimpl.cxx index 7fe58a7..43c73c2 100644 --- a/writerfilter/source/rtftok/rtfdocumentimpl.cxx +++ b/writerfilter/source/rtftok/rtfdocumentimpl.cxx @@ -3514,6 +3514,9 @@ RTFError RTFDocumentImpl::dispatchFlag(RTFKeyword nKeyword) case RTF_SAUTOUPD: m_aStates.top().aTableSprms.set(NS_ooxml::LN_CT_Style_autoRedefine, std::make_shared<RTFValue>(1)); break; + case RTF_WIDOWCTRL: + m_aSettingsTableSprms.set(NS_ooxml::LN_CT_Settings_widowControl, std::make_shared<RTFValue>(1)); + break; default: { SAL_INFO("writerfilter", "TODO handle flag '" << lcl_RtfToString(nKeyword) << "'"); _______________________________________________ Libreoffice-commits mailing list libreoffice-comm...@lists.freedesktop.org http://lists.freedesktop.org/mailman/listinfo/libreoffice-commits